diff --git a/elements/pl-snap/Docker setup/Dockerfile b/elements/pl-snap/Docker setup/Dockerfile new file mode 100644 index 00000000..81fdfef8 --- /dev/null +++ b/elements/pl-snap/Docker setup/Dockerfile @@ -0,0 +1,26 @@ +# Set the base image. +# Version: 1.1 +FROM node:slim + +RUN mkdir /usr/src/cache +WORKDIR /usr/src/cache + +# We don't need the standalone Chromium +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true + +# Install Google Chrome Stable and fonts +# Note: this installs the necessary libs to make the browser work with Puppeteer. +RUN apt-get update && apt-get install curl gnupg -y \ + && curl --location --silent https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ + && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ + && apt-get update \ + && apt-get install google-chrome-stable -y --no-install-recommends \ + && rm -rf /var/lib/apt/lists/* + +# Install the application's dependencies into the node_modules's cache directory. +COPY package.json ./ +COPY package-lock.json ./ +COPY autograder/autograder.js ./ +COPY autograder/run_autograder ./ +RUN npm install + diff --git a/elements/pl-snap/Docker setup/SETUP.md b/elements/pl-snap/Docker setup/SETUP.md new file mode 100644 index 00000000..8d9ded46 --- /dev/null +++ b/elements/pl-snap/Docker setup/SETUP.md @@ -0,0 +1,12 @@ +Locally run: +docker run -it --rm -p 3000:3000 -v $PWD:/course -v "$PWD/pl_ag_jobs:/jobs" -e HOST_JOBS_DIR="$PWD/pl_ag_jobs" -v /var/run/docker.sock:/var/run/docker.sock --add-host=host.docker.internal:172.17.0.1 prairielearn/prairielearn:latest + +https://stackoverflow.com/questions/72228079/docker-pull-from-local-repository-fails +docker run -d -p 5000:5000 --name registry registry:2 +docker pull jryl/grader-snap +docker image tag jryl/grader-snap localhost:5000/snap-test-new +docker push localhost:5000/snap-test-new + +docker build -t snap-test-new . + +docker run -it --rm -p 3000:3000 -v %cd%:/course -v "%cd%/pl_ag_jobs:/jobs" -e HOST_JOBS_DIR="%cd%/pl_ag_jobs" -v /var/run/docker.sock:/var/run/docker.sock --add-host=host.docker.internal:172.17.0.1 prairielearn/prairielearn:latest \ No newline at end of file diff --git a/elements/pl-snap/Docker setup/autograder/autograder.js b/elements/pl-snap/Docker setup/autograder/autograder.js new file mode 100644 index 00000000..559205f6 --- /dev/null +++ b/elements/pl-snap/Docker setup/autograder/autograder.js @@ -0,0 +1,128 @@ +const path = require("path"); +const fs = require("fs"); +const puppeteer = require("puppeteer"); + +// Puppeteer PageFunctions. +function loadProject(projectXML) { + const ide = world.children[0]; + ide.onNextStep = null; + ide.world().animations = []; + ide.rawOpenProjectString(projectXML); +} + +function loadSprite(spriteXML) { + world.children[0].rawOpenSpritesString(spriteXML); +} + +function setTurboMode(turnOn) { + const ide = world.children[0]; + if (turnOn) { + ide.startFastTracking(); + } else { + ide.stopFastTracking(); + } +} + +function setEnableJSFunctions(boolean) { + Process.prototype.enableJS = boolean; + const ide = world.children[0]; + ide.flushBlocksCache('operators'); + ide.refreshPalette(); + ide.categories.refreshEmpty(); +} + +function grade(secretNumber) { + const ide = world.children[0]; + const sprite = ide.sprites.asArray().at(-1); + + sprite.variables.setVar("secret number", 0); + + return new Promise((resolve) => { + ide.broadcast("run autograder", () => { + resolve(sprite.variables.getVar("results")); + }); + }); +} + +// Utility function. +function readXML(filePath) { + return fs.readFileSync(filePath).toString(); +} + +async function main() { + console.time("Grading Time"); + console.log("Grading submission..."); + const url = "https://snap.berkeley.edu/snap/snap.html", + submissionPath = "/usr/src/cache/submission.xml", + resultsPath = "/grade/results/results.json", + autograderPath = "/grade/tests/autograder.xml", + secretNumber = 0; + + let results; + + const browser = await puppeteer.launch({ + executablePath: "/usr/bin/google-chrome", + args: ["--no-sandbox", "--disable-setuid-sandbox"], + }); + const page = await browser.newPage(); + + try { + // Block unnecessary requests + await page.setRequestInterception(true); + page.on('request', (req) => { + if (req.resourceType() === 'font' || req.resourceType() === 'image' || req.resourceType() === 'stylesheet') { + req.abort(); + } + else { + req.continue(); + } + }); + + // page.on('console', msg => console.log('PAGE LOG:', msg.text())); + + console.time("Page Load Time") + Promise.all([ + await page.goto(url, { waitUntil: "domcontentloaded" }), + submission = readXML(submissionPath), + autograder = readXML(autograderPath), + ]); + console.timeLog("Page Load Time", "Page loaded"); + await Promise.all([ + page.evaluate(loadProject, submission), + page.evaluate(loadSprite, autograder), + page.evaluate(setTurboMode, true), + page.evaluate(setEnableJSFunctions, true), + ]); + console.timeLog("Page Load Time", "Project and Autograder loaded"); + results = await page.evaluate(grade, secretNumber); + console.timeEnd("Page Load Time"); + } catch (e) { + results = JSON.stringify({ + "score": 0, + "output": ( + "Failed to grade submission. Make sure:\n" + + "1) Your filename follows the specified format.\n" + + "2) Your code doesn't cause any Snap! error.\n" + + "3) Your code runs in a reasonable amount of time." + + e + ) + }); + } finally { + // Define the directory path + const dir = '/grade/results'; + + // Create the directory if it doesn't exist + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir, { recursive: true }); + } + fs.writeFileSync(resultsPath, results); + await browser.close(); + + console.log("Grading completed."); + console.timeEnd("Grading Time"); + } +} + +if (typeof require !== "undefined" && require.main === module) { + main(); +} \ No newline at end of file diff --git a/elements/pl-snap/Docker setup/autograder/run_autograder b/elements/pl-snap/Docker setup/autograder/run_autograder new file mode 100644 index 00000000..41507bbd --- /dev/null +++ b/elements/pl-snap/Docker setup/autograder/run_autograder @@ -0,0 +1,9 @@ +#!/bin/sh +start=`date +%s` # Get the current time in seconds +SUBMISSION=`find /grade/student -regex ".*\.xml"` +cp "$SUBMISSION" /usr/src/cache/submission.xml +cd /usr/src/cache +node autograder.js +end=`date +%s` # Get the current time in seconds +runtime=$((end-start)) # Calculate the difference +echo "Script runtime: $runtime seconds" diff --git a/elements/pl-snap/Docker setup/package-lock.json b/elements/pl-snap/Docker setup/package-lock.json new file mode 100644 index 00000000..032d78eb --- /dev/null +++ b/elements/pl-snap/Docker setup/package-lock.json @@ -0,0 +1,1209 @@ +{ + "name": "pl-snap-ag", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pl-snap-ag", + "version": "1.0.0", + "dependencies": { + "puppeteer": "^22.3.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.1.0.tgz", + "integrity": "sha512-xloWvocjvryHdUjDam/ZuGMh7zn4Sn3ZAaV4Ah2e2EwEt90N3XphZlSsU3n0VDc1F7kggCjMuH0UuxfPQ5mD9w==", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + }, + "node_modules/@types/node": { + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + }, + "node_modules/bare-events": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", + "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.0.tgz", + "integrity": "sha512-+VhW202E9eTVGkX7p+TNXtZC4RTzj9JfJW7PtfIbZ7mIQ/QT9uOafQTx7lx2n9ERmWsXvLHF4hStAFn4gl2mQw==", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "node_modules/bare-os": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.0.tgz", + "integrity": "sha512-hD0rOPfYWOMpVirTACt4/nK8mC55La12K5fY1ij8HAdfQakD62M+H4o4tpfKzVGLgRDTuk3vjA4GqGXXCeFbag==", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", + "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", + "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chromium-bidi": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.10.tgz", + "integrity": "sha512-4hsPE1VaLLM/sgNK/SlLbI24Ra7ZOuWAjA3rhw1lVCZ8ZiUgccS6cL5L/iqo4hjRcl5vwgYJ8xTtbXdulA9b6Q==", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1249869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1249869.tgz", + "integrity": "sha512-Ctp4hInA0BEavlUoRy9mhGq0i+JSo/AwVyX2EFgZmV1kYB+Zq+EMBAn52QWu6FbRr10hRb6pBl420upbp4++vg==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "22.3.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.3.0.tgz", + "integrity": "sha512-GC+tyjzYKjaNjhlDAuqRgDM+IOsqOG75Da4L28G4eULNLLxKDt+79x2OOSQ47HheJBgGq7ATSExNE6gayxP6cg==", + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "2.1.0", + "cosmiconfig": "9.0.0", + "puppeteer-core": "22.3.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.3.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.3.0.tgz", + "integrity": "sha512-Ho5Vdpdro05ZyCx/l5Hkc5vHiibKTaY37fIAD9NF9Gi/vDxkVTeX40U/mFnEmeoxyuYALvWCJfi7JTT82R6Tuw==", + "dependencies": { + "@puppeteer/browsers": "2.1.0", + "chromium-bidi": "0.5.10", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1249869", + "ws": "8.16.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/elements/pl-snap/Docker setup/package.json b/elements/pl-snap/Docker setup/package.json new file mode 100644 index 00000000..f7c315a7 --- /dev/null +++ b/elements/pl-snap/Docker setup/package.json @@ -0,0 +1,8 @@ +{ + "name": "pl-snap-ag", + "version": "1.0.0", + "description": "", + "dependencies": { + "puppeteer": "^22.3.0" + } +} diff --git a/elements/pl-snap/README.md b/elements/pl-snap/README.md new file mode 100644 index 00000000..04a48805 --- /dev/null +++ b/elements/pl-snap/README.md @@ -0,0 +1,48 @@ +Question authoring: +1. Example info.json: +```json + { + "uuid": "8b4891d6-64d1-4e89-b72d-ad2133f25b2f", + "title": "Snap! AG test", + "topic": "Algebra", + "tags": ["mwest", "fa17", "tpl101", "v3"], + "type": "v3", + "singleVariant": true, + "gradingMethod": "External", + "externalGradingOptions": { + "enabled": true, + "image": "localhost:5000/snap-test-new", + "entrypoint": "/usr/src/cache/run_autograder", + "timeout": 60, + "enableNetworking": true + } + } + + Key points: + a. gradingMethod needs to be External + b. externalGradingOptions: + - enabled must be true + - image points to the autograder docker image + - entrypoint runs the “run_autograder” script + +2. question.html: + - pl-snap has two attributes: + a. source-file-name: name of the base snap file to load, if not provided Snap! will load a blank/new project + b. directory: where the source file is located, defaults to clientFilesQuestion. + + ![example Snap! in PrairieLearn](screenshot0.png) + + - Use the pl-submission panel and pl-external-grader-results to show the graded results: + + + + + ![example grader-results panel after pressing Save & Grade](screenshot1.png) + +3. tests/autograder.xml: the Snap! autograder file written in Snap!. + +example question can be found in the questions folder titled "snapAGTest" + +slide deck: https://docs.google.com/presentation/d/1BwPL89MBC4caneVTdlYTDNYEt6iKgTiVnVo13djyIS8/edit#slide=id.g28ecd103568_0_273 + +code author: James Rakanatha Yosharry Litanto \ No newline at end of file diff --git a/elements/pl-snap/Snap/.gitignore b/elements/pl-snap/Snap/.gitignore new file mode 100644 index 00000000..cfe1a910 --- /dev/null +++ b/elements/pl-snap/Snap/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +*.swp +.tern-port diff --git a/elements/pl-snap/Snap/Backgrounds/BACKGROUNDS b/elements/pl-snap/Snap/Backgrounds/BACKGROUNDS new file mode 100644 index 00000000..668eb4eb --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/BACKGROUNDS @@ -0,0 +1,12 @@ +atom_playground.jpg Atom Playground +bedroom1.gif Bedroom 1 +bedroom2.gif Bedroom 2 +berkeley_mural.jpg Berkeley Mural +brick-wall-and-stairs.jpg Brick Wall and Stairs +brick-wall1.jpg Brick Wall 1 +brick-wall2.jpg Brick Wall 2 +desert.gif Desert +night_city_with_street.gif Night City with Street +party_room.jpg Party Room +pathway.jpg Pathway +xy-grid.gif XY Grid diff --git a/elements/pl-snap/Snap/Backgrounds/atom_playground.jpg b/elements/pl-snap/Snap/Backgrounds/atom_playground.jpg new file mode 100644 index 00000000..94b953ea Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/atom_playground.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/baseball-field.png b/elements/pl-snap/Snap/Backgrounds/baseball-field.png new file mode 100644 index 00000000..033be3aa Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/baseball-field.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/basketball-court1-a.png b/elements/pl-snap/Snap/Backgrounds/basketball-court1-a.png new file mode 100644 index 00000000..d6fe917e Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/basketball-court1-a.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/basketball-court1-b.png b/elements/pl-snap/Snap/Backgrounds/basketball-court1-b.png new file mode 100644 index 00000000..cbc10fee Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/basketball-court1-b.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/beach_malibu.jpg b/elements/pl-snap/Snap/Backgrounds/beach_malibu.jpg new file mode 100644 index 00000000..c94c0392 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/beach_malibu.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/beach_rio.png b/elements/pl-snap/Snap/Backgrounds/beach_rio.png new file mode 100644 index 00000000..ff1b2ab4 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/beach_rio.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/bedroom1.gif b/elements/pl-snap/Snap/Backgrounds/bedroom1.gif new file mode 100644 index 00000000..17b23a3b Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/bedroom1.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/bedroom2.gif b/elements/pl-snap/Snap/Backgrounds/bedroom2.gif new file mode 100644 index 00000000..9e14babd Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/bedroom2.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/bench_with_view.jpg b/elements/pl-snap/Snap/Backgrounds/bench_with_view.jpg new file mode 100644 index 00000000..b1bed16a Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/bench_with_view.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/berkeley_mural.jpg b/elements/pl-snap/Snap/Backgrounds/berkeley_mural.jpg new file mode 100644 index 00000000..2df7a430 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/berkeley_mural.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/blue_sky.svg b/elements/pl-snap/Snap/Backgrounds/blue_sky.svg new file mode 100644 index 00000000..4da020ae --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/blue_sky.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/blue_sky2.svg b/elements/pl-snap/Snap/Backgrounds/blue_sky2.svg new file mode 100644 index 00000000..b0a612ee --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/blue_sky2.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/blue_sky3.svg b/elements/pl-snap/Snap/Backgrounds/blue_sky3.svg new file mode 100644 index 00000000..d744e107 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/blue_sky3.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/boardwalk.jpg b/elements/pl-snap/Snap/Backgrounds/boardwalk.jpg new file mode 100644 index 00000000..550c77ef Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/boardwalk.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/brick-wall-and-stairs.jpg b/elements/pl-snap/Snap/Backgrounds/brick-wall-and-stairs.jpg new file mode 100644 index 00000000..78e412d4 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/brick-wall-and-stairs.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/brick-wall1.jpg b/elements/pl-snap/Snap/Backgrounds/brick-wall1.jpg new file mode 100644 index 00000000..e3e76ef7 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/brick-wall1.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/brick-wall2.jpg b/elements/pl-snap/Snap/Backgrounds/brick-wall2.jpg new file mode 100644 index 00000000..da4d56b2 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/brick-wall2.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/brick_wall1.jpg b/elements/pl-snap/Snap/Backgrounds/brick_wall1.jpg new file mode 100644 index 00000000..e3e76ef7 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/brick_wall1.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/brick_wall2.jpg b/elements/pl-snap/Snap/Backgrounds/brick_wall2.jpg new file mode 100644 index 00000000..da4d56b2 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/brick_wall2.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/building_at_mit.jpg b/elements/pl-snap/Snap/Backgrounds/building_at_mit.jpg new file mode 100644 index 00000000..bdaf847d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/building_at_mit.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/canyon.jpg b/elements/pl-snap/Snap/Backgrounds/canyon.jpg new file mode 100644 index 00000000..3fa09b8c Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/canyon.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/castle1.png b/elements/pl-snap/Snap/Backgrounds/castle1.png new file mode 100644 index 00000000..e80da516 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/castle1.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/castle2.png b/elements/pl-snap/Snap/Backgrounds/castle2.png new file mode 100644 index 00000000..251c0445 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/castle2.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/castle3.png b/elements/pl-snap/Snap/Backgrounds/castle3.png new file mode 100644 index 00000000..2ea0bfa0 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/castle3.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/castle4.png b/elements/pl-snap/Snap/Backgrounds/castle4.png new file mode 100644 index 00000000..d10ffe40 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/castle4.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/castle5.jpg b/elements/pl-snap/Snap/Backgrounds/castle5.jpg new file mode 100644 index 00000000..4f8c7f25 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/castle5.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/chalkboard.jpg b/elements/pl-snap/Snap/Backgrounds/chalkboard.jpg new file mode 100644 index 00000000..2d7fb6af Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/chalkboard.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/circles.svg b/elements/pl-snap/Snap/Backgrounds/circles.svg new file mode 100644 index 00000000..8f85587d --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/circles.svg @@ -0,0 +1,1750 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/city_with_water.jpg b/elements/pl-snap/Snap/Backgrounds/city_with_water.jpg new file mode 100644 index 00000000..1d68caae Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/city_with_water.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/city_with_water2.jpg b/elements/pl-snap/Snap/Backgrounds/city_with_water2.jpg new file mode 100644 index 00000000..bd5ef694 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/city_with_water2.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/clothing_store.jpg b/elements/pl-snap/Snap/Backgrounds/clothing_store.jpg new file mode 100644 index 00000000..e07181dc Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/clothing_store.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/desert.gif b/elements/pl-snap/Snap/Backgrounds/desert.gif new file mode 100644 index 00000000..16769b30 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/desert.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/doily.svg b/elements/pl-snap/Snap/Backgrounds/doily.svg new file mode 100644 index 00000000..1ec3a30a --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/doily.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/driveway.jpg b/elements/pl-snap/Snap/Backgrounds/driveway.jpg new file mode 100644 index 00000000..9c3f08d6 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/driveway.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/flower_bed.jpg b/elements/pl-snap/Snap/Backgrounds/flower_bed.jpg new file mode 100644 index 00000000..372b011b Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/flower_bed.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/flowers.gif b/elements/pl-snap/Snap/Backgrounds/flowers.gif new file mode 100644 index 00000000..efe07552 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/flowers.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/forest.jpg b/elements/pl-snap/Snap/Backgrounds/forest.jpg new file mode 100644 index 00000000..068816c3 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/forest.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/garden_rock.jpg b/elements/pl-snap/Snap/Backgrounds/garden_rock.jpg new file mode 100644 index 00000000..d29d66f4 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/garden_rock.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/gingerbread.png b/elements/pl-snap/Snap/Backgrounds/gingerbread.png new file mode 100644 index 00000000..50baaaaa Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/gingerbread.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/goal1.png b/elements/pl-snap/Snap/Backgrounds/goal1.png new file mode 100644 index 00000000..e395ba8d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/goal1.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/goal2.png b/elements/pl-snap/Snap/Backgrounds/goal2.png new file mode 100644 index 00000000..26e49b3d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/goal2.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/graffiti.jpg b/elements/pl-snap/Snap/Backgrounds/graffiti.jpg new file mode 100644 index 00000000..7b387b2f Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/graffiti.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/grand_canyon.jpg b/elements/pl-snap/Snap/Backgrounds/grand_canyon.jpg new file mode 100644 index 00000000..f1f6ae09 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/grand_canyon.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/gravel_desert.jpg b/elements/pl-snap/Snap/Backgrounds/gravel_desert.jpg new file mode 100644 index 00000000..e9c76b71 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/gravel_desert.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/greek_theater.png b/elements/pl-snap/Snap/Backgrounds/greek_theater.png new file mode 100644 index 00000000..269d78b1 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/greek_theater.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/hall.jpg b/elements/pl-snap/Snap/Backgrounds/hall.jpg new file mode 100644 index 00000000..76671c96 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/hall.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/hallway_outdoors.jpg b/elements/pl-snap/Snap/Backgrounds/hallway_outdoors.jpg new file mode 100644 index 00000000..18abd1c0 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/hallway_outdoors.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/hay_field.jpg b/elements/pl-snap/Snap/Backgrounds/hay_field.jpg new file mode 100644 index 00000000..b1a8417f Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/hay_field.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/hearts1.svg b/elements/pl-snap/Snap/Backgrounds/hearts1.svg new file mode 100644 index 00000000..c50b4a0c --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/hearts1.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/hearts2.svg b/elements/pl-snap/Snap/Backgrounds/hearts2.svg new file mode 100644 index 00000000..f6e56093 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/hearts2.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/hill.jpg b/elements/pl-snap/Snap/Backgrounds/hill.jpg new file mode 100644 index 00000000..2d88408e Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/hill.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/houses.jpg b/elements/pl-snap/Snap/Backgrounds/houses.jpg new file mode 100644 index 00000000..746f5dac Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/houses.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/kitchen.jpg b/elements/pl-snap/Snap/Backgrounds/kitchen.jpg new file mode 100644 index 00000000..7f61cbc2 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/kitchen.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/lake.jpg b/elements/pl-snap/Snap/Backgrounds/lake.jpg new file mode 100644 index 00000000..2e7193ad Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/lake.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/light.svg b/elements/pl-snap/Snap/Backgrounds/light.svg new file mode 100644 index 00000000..8d5859dd --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/light.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/metro1.png b/elements/pl-snap/Snap/Backgrounds/metro1.png new file mode 100644 index 00000000..e1b58084 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/metro1.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/moon.jpg b/elements/pl-snap/Snap/Backgrounds/moon.jpg new file mode 100644 index 00000000..8a43870d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/moon.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/neon_tunnel.svg b/elements/pl-snap/Snap/Backgrounds/neon_tunnel.svg new file mode 100644 index 00000000..013060db --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/neon_tunnel.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/night_city.gif b/elements/pl-snap/Snap/Backgrounds/night_city.gif new file mode 100644 index 00000000..388dcaa2 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/night_city.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/night_city_with_street.gif b/elements/pl-snap/Snap/Backgrounds/night_city_with_street.gif new file mode 100644 index 00000000..91e61851 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/night_city_with_street.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/parking-ramp.jpg b/elements/pl-snap/Snap/Backgrounds/parking-ramp.jpg new file mode 100644 index 00000000..c448d863 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/parking-ramp.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/party.svg b/elements/pl-snap/Snap/Backgrounds/party.svg new file mode 100644 index 00000000..d4362401 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/party.svg @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/party_room.jpg b/elements/pl-snap/Snap/Backgrounds/party_room.jpg new file mode 100644 index 00000000..f253c9f3 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/party_room.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/pathway.jpg b/elements/pl-snap/Snap/Backgrounds/pathway.jpg new file mode 100644 index 00000000..03d5235f Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/pathway.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/playing-field.png b/elements/pl-snap/Snap/Backgrounds/playing-field.png new file mode 100644 index 00000000..da556efd Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/playing-field.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/pool.jpg b/elements/pl-snap/Snap/Backgrounds/pool.jpg new file mode 100644 index 00000000..609b8c92 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/pool.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/purple.svg b/elements/pl-snap/Snap/Backgrounds/purple.svg new file mode 100644 index 00000000..633e8c3a --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/purple.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/rays.svg b/elements/pl-snap/Snap/Backgrounds/rays.svg new file mode 100644 index 00000000..dd1a4a12 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/rays.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Backgrounds/room1.jpg b/elements/pl-snap/Snap/Backgrounds/room1.jpg new file mode 100644 index 00000000..74ce8637 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/room1.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/room2.jpg b/elements/pl-snap/Snap/Backgrounds/room2.jpg new file mode 100644 index 00000000..7a89cb64 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/room2.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/room3.jpg b/elements/pl-snap/Snap/Backgrounds/room3.jpg new file mode 100644 index 00000000..ef1e3d98 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/room3.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/route66.jpg b/elements/pl-snap/Snap/Backgrounds/route66.jpg new file mode 100644 index 00000000..5193be5d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/route66.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/school1.gif b/elements/pl-snap/Snap/Backgrounds/school1.gif new file mode 100644 index 00000000..97a6d574 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/school1.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/school2.jpg b/elements/pl-snap/Snap/Backgrounds/school2.jpg new file mode 100644 index 00000000..c80b4b4b Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/school2.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/slopes.svg b/elements/pl-snap/Snap/Backgrounds/slopes.svg new file mode 100644 index 00000000..5f5e109b --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/slopes.svg @@ -0,0 +1,2564 @@ + + + + + + + diff --git a/elements/pl-snap/Snap/Backgrounds/space.svg b/elements/pl-snap/Snap/Backgrounds/space.svg new file mode 100644 index 00000000..776698cb --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/space.svg @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/sparkling.svg b/elements/pl-snap/Snap/Backgrounds/sparkling.svg new file mode 100644 index 00000000..429b4b67 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/sparkling.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/spotlight-stage.jpg b/elements/pl-snap/Snap/Backgrounds/spotlight-stage.jpg new file mode 100644 index 00000000..7dff2ba8 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/spotlight-stage.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/spotlight-stage2.svg b/elements/pl-snap/Snap/Backgrounds/spotlight-stage2.svg new file mode 100644 index 00000000..557cf2a9 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/spotlight-stage2.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/stage1.png b/elements/pl-snap/Snap/Backgrounds/stage1.png new file mode 100644 index 00000000..c1145442 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/stage1.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/stage2.png b/elements/pl-snap/Snap/Backgrounds/stage2.png new file mode 100644 index 00000000..c291b2d7 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/stage2.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/stars.gif b/elements/pl-snap/Snap/Backgrounds/stars.gif new file mode 100644 index 00000000..ffdc3f83 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/stars.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/stripes.svg b/elements/pl-snap/Snap/Backgrounds/stripes.svg new file mode 100644 index 00000000..8fd04849 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/stripes.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/the_movies_inside.jpg b/elements/pl-snap/Snap/Backgrounds/the_movies_inside.jpg new file mode 100644 index 00000000..181c68de Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/the_movies_inside.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/the_movies_outside.jpg b/elements/pl-snap/Snap/Backgrounds/the_movies_outside.jpg new file mode 100644 index 00000000..6ba1e20b Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/the_movies_outside.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/track.svg b/elements/pl-snap/Snap/Backgrounds/track.svg new file mode 100644 index 00000000..c8fd993e --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/track.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/train_tracks1.jpg b/elements/pl-snap/Snap/Backgrounds/train_tracks1.jpg new file mode 100644 index 00000000..f2c04b43 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/train_tracks1.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/train_tracks2.gif b/elements/pl-snap/Snap/Backgrounds/train_tracks2.gif new file mode 100644 index 00000000..27bfcb78 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/train_tracks2.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/tree-gifts.png b/elements/pl-snap/Snap/Backgrounds/tree-gifts.png new file mode 100644 index 00000000..8c7570ad Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/tree-gifts.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/tree.jpg b/elements/pl-snap/Snap/Backgrounds/tree.jpg new file mode 100644 index 00000000..c80c9bb0 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/tree.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/underwater1.png b/elements/pl-snap/Snap/Backgrounds/underwater1.png new file mode 100644 index 00000000..612b0ca0 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/underwater1.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/underwater2.png b/elements/pl-snap/Snap/Backgrounds/underwater2.png new file mode 100644 index 00000000..501e6dfc Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/underwater2.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/underwater3.gif b/elements/pl-snap/Snap/Backgrounds/underwater3.gif new file mode 100644 index 00000000..e7f7a6e9 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/underwater3.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/urban1.png b/elements/pl-snap/Snap/Backgrounds/urban1.png new file mode 100644 index 00000000..a55ca433 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/urban1.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/urban2.png b/elements/pl-snap/Snap/Backgrounds/urban2.png new file mode 100644 index 00000000..c6000df6 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/urban2.png differ diff --git a/elements/pl-snap/Snap/Backgrounds/village.jpg b/elements/pl-snap/Snap/Backgrounds/village.jpg new file mode 100644 index 00000000..f72fcc9b Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/village.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/water_and_rocks.jpg b/elements/pl-snap/Snap/Backgrounds/water_and_rocks.jpg new file mode 100644 index 00000000..3590de0d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/water_and_rocks.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/wave.jpg b/elements/pl-snap/Snap/Backgrounds/wave.jpg new file mode 100644 index 00000000..5cc043ed Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/wave.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/winter-lights.svg b/elements/pl-snap/Snap/Backgrounds/winter-lights.svg new file mode 100644 index 00000000..772a587c --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/winter-lights.svg @@ -0,0 +1,208 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/winter.svg b/elements/pl-snap/Snap/Backgrounds/winter.svg new file mode 100644 index 00000000..51bb2f01 --- /dev/null +++ b/elements/pl-snap/Snap/Backgrounds/winter.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Backgrounds/woods.gif b/elements/pl-snap/Snap/Backgrounds/woods.gif new file mode 100644 index 00000000..1d70948d Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/woods.gif differ diff --git a/elements/pl-snap/Snap/Backgrounds/woods_and_bench.jpg b/elements/pl-snap/Snap/Backgrounds/woods_and_bench.jpg new file mode 100644 index 00000000..0af61099 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/woods_and_bench.jpg differ diff --git a/elements/pl-snap/Snap/Backgrounds/xy-grid.gif b/elements/pl-snap/Snap/Backgrounds/xy-grid.gif new file mode 100644 index 00000000..9e462168 Binary files /dev/null and b/elements/pl-snap/Snap/Backgrounds/xy-grid.gif differ diff --git a/elements/pl-snap/Snap/Costumes/0-pixel.svg b/elements/pl-snap/Snap/Costumes/0-pixel.svg new file mode 100644 index 00000000..ac7d9451 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/0-pixel.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/1-glow.svg b/elements/pl-snap/Snap/Costumes/1-glow.svg new file mode 100644 index 00000000..e27308eb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/1-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/1-pixel.svg b/elements/pl-snap/Snap/Costumes/1-pixel.svg new file mode 100644 index 00000000..72fa1853 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/1-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/2-glow.svg b/elements/pl-snap/Snap/Costumes/2-glow.svg new file mode 100644 index 00000000..6b63def1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/2-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/2-pixel.svg b/elements/pl-snap/Snap/Costumes/2-pixel.svg new file mode 100644 index 00000000..f2c4ad1c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/2-pixel.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/3-glow.svg b/elements/pl-snap/Snap/Costumes/3-glow.svg new file mode 100644 index 00000000..0d556fda --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/3-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/3-pixel.svg b/elements/pl-snap/Snap/Costumes/3-pixel.svg new file mode 100644 index 00000000..c6561c35 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/3-pixel.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/4-glow.svg b/elements/pl-snap/Snap/Costumes/4-glow.svg new file mode 100644 index 00000000..237e0ec5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/4-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/4-pixel.svg b/elements/pl-snap/Snap/Costumes/4-pixel.svg new file mode 100644 index 00000000..1bb809fd --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/4-pixel.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/5-glow.svg b/elements/pl-snap/Snap/Costumes/5-glow.svg new file mode 100644 index 00000000..aea65f4d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/5-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/5-pixel.svg b/elements/pl-snap/Snap/Costumes/5-pixel.svg new file mode 100644 index 00000000..b827a87a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/5-pixel.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/6-glow.svg b/elements/pl-snap/Snap/Costumes/6-glow.svg new file mode 100644 index 00000000..8e526202 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/6-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/6-pixel.svg b/elements/pl-snap/Snap/Costumes/6-pixel.svg new file mode 100644 index 00000000..d9756a3a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/6-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/7-glow.svg b/elements/pl-snap/Snap/Costumes/7-glow.svg new file mode 100644 index 00000000..bc6bc1cb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/7-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/7-pixel.svg b/elements/pl-snap/Snap/Costumes/7-pixel.svg new file mode 100644 index 00000000..9656b0d1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/7-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/8-glow.svg b/elements/pl-snap/Snap/Costumes/8-glow.svg new file mode 100644 index 00000000..301cb230 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/8-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/8-pixel.svg b/elements/pl-snap/Snap/Costumes/8-pixel.svg new file mode 100644 index 00000000..b1fe9b9b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/8-pixel.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/9-glow.svg b/elements/pl-snap/Snap/Costumes/9-glow.svg new file mode 100644 index 00000000..44e5b66d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/9-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/9-pixel.svg b/elements/pl-snap/Snap/Costumes/9-pixel.svg new file mode 100644 index 00000000..9ddb5210 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/9-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/A-glow.svg b/elements/pl-snap/Snap/Costumes/A-glow.svg new file mode 100644 index 00000000..8e2df1cd --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/A-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/A-pixel.svg b/elements/pl-snap/Snap/Costumes/A-pixel.svg new file mode 100644 index 00000000..b60cc0f2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/A-pixel.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/A-story-1.svg b/elements/pl-snap/Snap/Costumes/A-story-1.svg new file mode 100644 index 00000000..89399dbb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/A-story-1.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/A-story-2.svg b/elements/pl-snap/Snap/Costumes/A-story-2.svg new file mode 100644 index 00000000..05f3f76d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/A-story-2.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/A-story-3.svg b/elements/pl-snap/Snap/Costumes/A-story-3.svg new file mode 100644 index 00000000..d8892d1a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/A-story-3.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/AZ_pop_L_arm.png new file mode 100644 index 00000000..e6e8e7a1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/AZ_pop_R_arm.png new file mode 100644 index 00000000..b5fc6624 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_down.png b/elements/pl-snap/Snap/Costumes/AZ_pop_down.png new file mode 100644 index 00000000..4b1eab58 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_down.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_front.png b/elements/pl-snap/Snap/Costumes/AZ_pop_front.png new file mode 100644 index 00000000..de538273 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_front.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_left.png b/elements/pl-snap/Snap/Costumes/AZ_pop_left.png new file mode 100644 index 00000000..57f1d6a5 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_left.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_right.png b/elements/pl-snap/Snap/Costumes/AZ_pop_right.png new file mode 100644 index 00000000..fda6d3e9 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_right.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_pop_stand.png b/elements/pl-snap/Snap/Costumes/AZ_pop_stand.png new file mode 100644 index 00000000..bbccc040 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_pop_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_stance.png b/elements/pl-snap/Snap/Costumes/AZ_stance.png new file mode 100644 index 00000000..63323072 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_stance.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_top_L_step.png b/elements/pl-snap/Snap/Costumes/AZ_top_L_step.png new file mode 100644 index 00000000..e1e5e409 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_top_L_step.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_top_R_cross.png b/elements/pl-snap/Snap/Costumes/AZ_top_R_cross.png new file mode 100644 index 00000000..cfc3d76a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_top_R_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_top_R_step.png b/elements/pl-snap/Snap/Costumes/AZ_top_R_step.png new file mode 100644 index 00000000..43475ebb Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_top_R_step.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_top_freeze.png b/elements/pl-snap/Snap/Costumes/AZ_top_freeze.png new file mode 100644 index 00000000..428b4b17 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_top_freeze.png differ diff --git a/elements/pl-snap/Snap/Costumes/AZ_top_stand.png b/elements/pl-snap/Snap/Costumes/AZ_top_stand.png new file mode 100644 index 00000000..e9dbb78e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/AZ_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/Alonzo3D.png b/elements/pl-snap/Snap/Costumes/Alonzo3D.png new file mode 100644 index 00000000..09b95410 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/Alonzo3D.png differ diff --git a/elements/pl-snap/Snap/Costumes/B-glow.svg b/elements/pl-snap/Snap/Costumes/B-glow.svg new file mode 100644 index 00000000..5cf70ddf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/B-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/B-pixel.svg b/elements/pl-snap/Snap/Costumes/B-pixel.svg new file mode 100644 index 00000000..888be1ef --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/B-pixel.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/B-story-1.svg b/elements/pl-snap/Snap/Costumes/B-story-1.svg new file mode 100644 index 00000000..008ceadb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/B-story-1.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/B-story-2.svg b/elements/pl-snap/Snap/Costumes/B-story-2.svg new file mode 100644 index 00000000..05f7ac77 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/B-story-2.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/B-story-3.svg b/elements/pl-snap/Snap/Costumes/B-story-3.svg new file mode 100644 index 00000000..8ffd457e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/B-story-3.svg @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/C-glow.svg b/elements/pl-snap/Snap/Costumes/C-glow.svg new file mode 100644 index 00000000..c8a55bcf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/C-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/C-pixel.svg b/elements/pl-snap/Snap/Costumes/C-pixel.svg new file mode 100644 index 00000000..608c4da1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/C-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/C-story-1.svg b/elements/pl-snap/Snap/Costumes/C-story-1.svg new file mode 100644 index 00000000..db6d5900 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/C-story-1.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/C-story-2.svg b/elements/pl-snap/Snap/Costumes/C-story-2.svg new file mode 100644 index 00000000..9937d4ed --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/C-story-2.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/C-story-3.svg b/elements/pl-snap/Snap/Costumes/C-story-3.svg new file mode 100644 index 00000000..043e4b8b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/C-story-3.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/COSTUMES b/elements/pl-snap/Snap/Costumes/COSTUMES new file mode 100644 index 00000000..10b38d18 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/COSTUMES @@ -0,0 +1,545 @@ +abby-a.svg abby a +abby-b.svg abby b +abby-c.svg abby c +abby-d.svg abby d +airplane2.png airplane2 +aleassa01.png aleassa a +aleassa02.png aleassa b +aleassa03.png aleassa c +aleassa04.png aleassa d +aleassa05.png aleassa e +aleassa06.png aleassa f +alonzo.png alonzo +Alonzo3D.png alonzo (3D) +alonzo.svg alonzo (vector) +amon.gif amon +anina_pop_down.png anina pop down +anina_pop_front.png anina pop front +anina_pop_L_arm.png anina pop L arm +anina_pop_left.png anina pop left +anina_pop_R_arm.png anina pop R arm +anina_pop_right.png anina pop right +anina_pop_stand.png anina pop stand +anina_R_cross.png anina R cross +anina_stance.png anina stance +anina_top_freeze.png anina top freeze +anina_top_L_step.png anina top L step +anina_top_R_step.png anina top R step +anina_top_stand.png anina top stand +anna01.png anna01 +anna02.png anna02 +anna03.png anna03 +anna04.png anna04 +anna05.png anna05 +anna06.png anna06 +anna07b.png anna07b +anna07c.png anna07c +anna07.png anna07 +anna08.png anna08 +anna09.png anna09 +anna10.png anna10 +anna11.png anna11 +anna12.png anna12 +anna-a.png anna a +anna-b.png anna b +apple.svg apple +arrow1-a.svg arrow1 a +arrow1-b.svg arrow1 b +arrow1-c.svg arrow1 c +arrow1-d.svg arrow1 d +avery-a.svg avery a +avery-b.svg avery b +avery_walking-a.svg avery walking a +avery_walking-b.svg avery walking b +avery_walking-c.svg avery walking c +avery_walking-d.svg avery walking d +AZ_pop_down.png AZ pop down +AZ_pop_front.png AZ pop front +AZ_pop_L_arm.png AZ pop L arm +AZ_pop_left.png AZ pop left +AZ_pop_R_arm.png AZ pop R arm +AZ_pop_right.png AZ pop right +AZ_pop_stand.png AZ pop stand +AZ_stance.png AZ stance +AZ_top_freeze.png AZ top freeze +AZ_top_L_step.png AZ top L step +AZ_top_R_cross.png AZ top R cross +AZ_top_R_step.png AZ top R step +AZ_top_stand.png AZ top stand +ball-a.svg ball a +ball-b.svg ball b +ball-c.svg ball c +ball-d.svg ball d +ballerina-a.svg ballerina a +ballerina-b.svg ballerina b +ballerina-c.svg ballerina c +ballerina-d.svg ballerina d +ball-e.svg ball e +balloon1-a.svg balloon1 a +balloon1-b.svg balloon1 b +balloon1-c.svg balloon1 c +ball-soccer.svg ball soccer +bananas.svg bananas +baseball.svg baseball +basketball.svg basketball +bass.svg bass +bat1-a_.svg bat1 a +bat1-b_.svg bat1 b +bat2-a_.svg bat2 a +bat2-b_.svg bat2 b +beachball.svg beachball +bear2-a.svg bear2 a +bear2-b.svg bear2 b +beetle.svg beetle +bell1.svg bell1 +bells-a.svg bells a +bells-b.svg bells b +bowl-a.svg bowl a +bowtie-a.svg bowtie a +bowtie-b.svg bowtie b +boy1-standing.gif boy1 standing +boy1-walking.gif boy1 walking +boy2.gif boy2 +boy3.gif boy3 +building-a.svg building a +building-b.svg building b +building-c.svg building c +building-d.svg building d +building-e.svg building e +building-f.svg building f +building-g.svg building g +building-h.svg building h +building-i.svg building i +building-j.svg building j +bus.png bus +butterfly1-a.svg butterfly1 a +butterfly1-b_.svg butterfly1 b +butterfly2_.svg butterfly2 +butterfly3_.svg butterfly3 +button1.svg button1 +button2-a.svg button2 a +button2-b.svg button2 b +button3-a.svg button3 a +button3-b.svg button3 b +button4-a.svg button4 a +button4-b.svg button4 b +button5-a.svg button5 a +button5-b.svg button5 b +cake-a.svg cake a +cake-b.svg cake b +calvrett_jumping.png calvrett jumping +calvrett_thinking.png calvrett thinking +candle1-a.svg candle1 a +candle1-b.svg candle1 b +candles1.svg candles1 +candles2.svg candles2 +car-bug.png car bug +cassy-a.png cassy a +cassy-b.png cassy b +cassy-c.png cassy c +cassy_dance-a.png cassy dance a +cassy_dance-b.png cassy dance b +cassy_dance-c.png cassy dance c +cassy_dance-d.png cassy dance d +cassy-d.png cassy d +cat2.gif cat2 +cat2.svg cat2 +cat3.png cat3 +cat4.png cat4 +cat5.gif cat5 +catherine-a.png catherine a +catherine-b.png catherine b +catherine-c.png catherine c +catherine-d.png catherine d +champ99-a.png champ99 a +champ99-b.png champ99 b +champ99-c.png champ99 c +champ99-d.png champ99 d +champ99-e.png champ99 e +champ99-f.png champ99 f +champ99-g.png champ99 g +cheesy-puffs.png cheesy puffs +cloud-a.svg cloud a +cloud-b.svg cloud b +cloud-c.svg cloud c +cloud-d.svg cloud d +cloud.svg cloud +cm_pop_L_arm.png cm pop L arm +cm_pop_R_arm.png cm pop R arm +cm_top_L_cross.png cm top L cross +cm_top_L_leg.png cm top L leg +cm_top_R_cross.png cm top R cross +cm_top_ready.png cm top ready +cm_top_R_leg.png cm top R leg +cm_top_stand.png cm top stand +convertible1.png convertible1 +convertible2.png convertible2 +convertible3.svg convertible3 +cowbell.svg cowbell +crab-a.svg crab a +crab-b.svg crab b +creature1-a.svg creature1 a +creature1-b.svg creature1 b +creature1-c.svg creature1 c +cymbal-a.svg cymbal a +cymbal-b.svg cymbal b +dan-a.png dan a +dan-b.png dan b +dani-a.svg dani a +dani-b.svg dani b +dani-c.svg dani c +dee-a.svg dee a +dee-b.svg dee b +dee-c.svg dee c +dee-d.svg dee d +dee-e.svg dee e +derec01.png derec a +derec02.png derec b +derec03.png derec c +derec04.png derec d +derec05.png derec e +derec06.png derec f +devin-a.svg devin a +devin-b.svg devin b +devin-c.svg devin c +devin-d.svg devin d +dinosaur1-a.svg dinosaur1 a +dinosaur1-b.svg dinosaur1 b +dinosaur1-c.svg dinosaur1 c +dinosaur1-d.svg dinosaur1 d +dinosaur1-e.svg dinosaur1 e +dinosaur1-f.svg dinosaur1 f +dinosaur1-g.svg dinosaur1 g +dinosaur2-a.svg dinosaur2 a +dinosaur2-b.svg dinosaur2 b +dinosaur3.svg dinosaur3 +diver1.svg diver1 +diver2.svg diver2 +dm_freeze.png dm freeze +dm_pop_down.png dm pop down +dm_pop_front.png dm pop front +dm_pop_L_arm.png dm pop L arm +dm_pop_left.png dm pop left +dm_pop_R_arm.png dm pop R arm +dm_pop_right.png dm pop right +dm_pop_stand.png dm pop stand +dm_stance.svg dm stance +dm_top_L_leg.png dm top L leg +dm_top_R_leg.png dm top R leg +dm_top_stand.png dm top stand +dog1-a.svg dog1 a +dog1-b.svg dog1 b +dog2-a.svg dog2 a +dog2-b.svg dog2 b +dog2-c.svg dog2 c +dog_puppy_back.png dog puppy back +dog_puppy_right.png dog puppy right +dog_puppy_side.png dog puppy side +dog_puppy_sit.png dog puppy sit +donut.svg donut +dove1-a.svg dove1 a +dove1-b.svg dove1 b +dove2-a.svg dove2 a +dove2-b.svg dove2 b +dragon1-a.svg dragon1 a +dragon1-b.png dragon1 b +dragon1-b.svg dragon1 b +dragon2.gif dragon2 +drum1-a.svg drum1 a +drum1-b.svg drum1 b +drum2-a.svg drum2 a +drum2-b.svg drum2 b +drum_bass-a.svg drum bass a +drum_bass-b.svg drum bass b +drums_conga-a.svg drums conga a +drums_conga-b.svg drums conga b +drum_snare-a.svg drum snare a +drum_snare-b.svg drum snare b +duck.svg duck +earth.svg earth +elephant-a_.svg elephant a +elephant-b_.svg elephant b +fire_hydrant.png fire hydrant +fish1.svg fish1 +fish2.svg fish2 +fish3.svg fish3 +flower_shape.svg flower shape +football_running.png football running +football_standing.png football standing +fortunecookie.png fortunecookie +fox.svg fox +frog.svg frog +fruit_platter.png fruit platter +fruitsalad.svg fruitsalad +ghost1_.svg ghost1 +ghost2-a.svg ghost2 a +ghost2-b.svg ghost2 b +ghoul-a.svg ghoul a +ghoul-b.svg ghoul b +gift-a.svg gift a +gift-b.svg gift b +girl1-standing.gif girl1 standing +girl1-walking.gif girl1 walking +girl2-shouting.gif girl2 shouting +girl2-standing.gif girl2 standing +girl3-basketball.gif girl3 basketball +girl3-running.gif girl3 running +girl3-standing.gif girl3 standing +glasses.svg glasses +glass_water-a.svg glass water a +glass_water-b.svg glass water b +green_flag.svg green flag +guitar_bass.svg guitar bass +guitar_electric.svg guitar electric +guitar.svg guitar +hannah-a.png hannah a +hannah-b.png hannah b +hannah-c.png hannah c +hat_beanie.svg hat beanie +hat_party2-a.svg hat party2 a +Hat.svg Hat +hat_winter.svg hat winter +hat_wizard.svg hat wizard +headband.svg headband +heart_code.svg heart code +heart_face.svg heart face +heart_love_it.svg heart love it +heart_purple.svg heart purple +heart_red.svg heart red +heart_smile.svg heart smile +heart_sweet.svg heart sweet +helicopter.png helicopter +hippo1-a.svg hippo1 a +hippo1-b.svg hippo1 b +holly1.svg holly1 +holly2.svg holly2 +home_button.svg home button +horse1-a.svg horse1 a +horse1-b.svg horse1 b +jahrd01.png jahrd a +jahrd02.png jahrd b +jahrd03.png jahrd c +jahrd04.png jahrd d +jahrd05.png jahrd e +jahrd06.png jahrd f +jaime-a.png jaime a +jaime-b.png jaime b +jaime_walking-a.png jaime walking a +jaime_walking-b.png jaime walking b +jaime_walking-c.png jaime walking c +jaime_walking-d.png jaime walking d +jaime_walking-e.png jaime walking e +jamet01.png jamet a +jamet02.png jamet b +jamet03.png jamet c +jamet04.png jamet d +jamet05.png jamet e +jamet06.png jamet f +jamet06-wall.png jamet f's wall +jay.gif jay +jeans-a.svg jeans a +jeans-b.svg jeans b +jodi.gif jodi +jo_pop_down.png jo pop down +jo_pop_front.png jo pop front +jo_pop_L_arm.png jo pop L arm +jo_pop_left.png jo pop left +jo_pop_R_arm.png jo pop R arm +jo_pop_right.png jo pop right +jo_pop_stand.png jo pop stand +jo_stance.png jo stance +jo_top_L_cross.png jo top L cross +jo_top_L_leg.png jo top L leg +jo_top_R_cross.png jo top R cross +jo_top_R_leg.png jo top R leg +jo_top_stand.png jo top stand +keyboard-a.svg keyboard a +keyboard-b.svg keyboard b +keyboard-c.svg keyboard c +keyboard-d.svg keyboard d +key.svg key +khalid-a.png khalid a +Khalid-b.png Khalid b +khalid-c.png khalid c +khalid-d.png khalid d +knight.svg knight +ladybug2-a.svg ladybug2 a +ladybug2-b.svg ladybug2 b +ladybug2.svg ladybug2 +lamp.png lamp +laptop.svg laptop +lb_pop_down.png lb pop down +lb_pop_front.png lb pop front +lb_pop_L_arm.png lb pop L arm +lb_pop_left.png lb pop left +lb_pop_R_arm.png lb pop R arm +lb_pop_right.png lb pop right +lb_pop_stand.png lb pop stand +lb_stance.png lb stance +lb_top_L_cross.png lb top L cross +lb_top_L_leg.png lb top L leg +lb_top_R_cross.png lb top R cross +lb_top_R_leg.png lb top R leg +lb_top_stand.png lb top stand +lightning.svg lightning +lion-a.svg lion a +lion-b.svg lion b +lioness.svg lioness +lirin01.png lirin a +lirin02.png lirin b +lirin03.png lirin c +lirin04.png lirin d +lirin05.png lirin e +lirin06.png lirin f +lorenz01.png lorenz01 +lorenz02.png lorenz02 +lorenz03.png lorenz03 +lorenz04.png lorenz04 +lorenz05.png lorenz05 +lorenz06.png lorenz06 +lorenz07b.png lorenz07b +lorenz07.png lorenz07 +magiccarpet.png magiccarpet +magicwand.svg magicwand +marble-building.png marble building +marissa-crouching.gif marissa crouching +marissa.gif marissa +marissa-sitting.gif marissa sitting +maya.png maya +microphonestand.svg microphonestand +microphone.svg microphone +monkey1-a.svg monkey1 a +monkey1-b.svg monkey1 b +monkey2-a.svg monkey2 a +monkey2-b.svg monkey2 b +monkey2-c.svg monkey2 c +mori.png mori +mouse1-a.svg mouse1 a +mouse1-b.svg mouse1 b +muffin-a.svg muffin a +muffin-b.svg muffin b +octopus-a.svg octopus a +octopus-b.svg octopus b +orange2-a.svg orange2 a +orange2-b.svg orange2 b +orange2-c.svg orange2 c +orange.svg orange +paddle.svg paddle +palmtree.gif palmtree +parrot2-a.svg parrot2 a +parrot2-b.svg parrot2 b +parrot-a.svg parrot a +parrot-b.svg parrot b +partyhat1.svg partyhat1 +paul.gif paul +pencil-a.svg pencil a +pencil-b.svg pencil b +penguin1.svg penguin1 +penguin1_talk-a.svg penguin1 talk a +penguin1_talk-b.svg penguin1 talk b +penguin2.svg penguin2 +penguin2_talk-a.svg penguin2 talk a +penguin2_talk-b.svg penguin2 talk b +penguin3-a.svg penguin3 a +penguin3-b.svg penguin3 b +penguin3-c.svg penguin3 c +piano.svg piano +planet2.svg planet2 +princess.svg princess +prince.svg prince +rainbow.svg rainbow +referee.gif referee +reindeer.svg reindeer +robot1.svg robot1 +rocks.svg rocks +rory.png rory +ruby-a.png ruby a +ruby-b.png ruby b +sail-boat.png sail boat +sam.gif sam +sarron01.png sarron a +sarron02.png sarron b +sarron03.png sarron c +sarron04.png sarron d +sarron05.png sarron e +sarron06.png sarron f +saxophone-a.svg saxophone a +saxophone-b.svg saxophone b +scarf1.svg scarf1 +scarf2.svg scarf2 +shark-a_.svg shark a +shark-b_.svg shark b +shark-c_.svg shark c +shirt2-a2.svg shirt2 a2 +shirt2-a.svg shirt2 a +shirt-a.svg shirt a +shirt_blouse.svg shirt blouse +shirt-b.svg shirt b +shirt_collar-a.svg shirt collar a +shirt_collar-b.svg shirt collar b +shirt_collar-c.svg shirt collar c +shoes1.svg shoes1 +shoes2.svg shoes2 +Singer1.svg Singer1 +skates.svg skates +sl_pop_L_arm.png sl pop L arm +sl_pop_R_arm.png sl pop R arm +sl_top_L_cross.png sl top L cross +sl_top_L_leg.png sl top L leg +sl_top_R_cross.png sl top R cross +sl_top_ready.png sl top ready +sl_top_R_leg.png sl top R leg +sl_top_stand.png sl top stand +snowflake.svg snowflake +snowman.svg snowman +spaceship-a.svg spaceship a +spaceship-b.svg spaceship b +speaker.svg speaker +squirrel1.png squirrel1 +star1.svg star1 +star2.svg star2 +star3-a.svg star3 a +star3-b.svg star3 b +starfish-a.svg starfish a +starfish-b_.svg starfish b +stop.svg stop +street-cleaner-mit.png street cleaner mit +sunglasses1.svg sunglasses1 +sunglasses2.svg sunglasses2 +sun.svg sun +tabla-a.svg tabla a +tabla-b.svg tabla b +taco-a.svg taco a +taco-b.svg taco b +tennisball.png tennisball +trampoline.png trampoline +tree1.svg tree1 +tree2.svg tree2 +tree-lights-a.svg tree lights a +tree-lights-b.svg tree lights b +trees-a.svg trees a +trees-b.svg trees b +trombone-a.svg trombone a +trombone-b.svg trombone b +trumpet-a2.svg trumpet a2 +trumpet-a.svg trumpet a +turtle01_colour.png Tad 1 +turtle02_colour_resized.png Tad 2 +turtle03.png Tad 3 +turtle04.png Tad 4 +turtle05.png Tad 5 +turtle06.png Tad 6 +ukulele.svg ukulele +umbrella.png umbrella +unicorn1.png unicorn1 +unicorn.svg unicorn +vest-a.svg vest a +vest-b.svg vest b +wanda.svg wanda +watermelon-a.svg watermelon a +watermelon-b.svg watermelon b +watermelon-c.svg watermelon c +witch.svg witch +wizard1.svg wizard1 +wizard2.svg wizard2 +wizard.svg wizard diff --git a/elements/pl-snap/Snap/Costumes/COSTUMES-full b/elements/pl-snap/Snap/Costumes/COSTUMES-full new file mode 100644 index 00000000..00b0dad7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/COSTUMES-full @@ -0,0 +1,683 @@ +0-pixel.svg 0 pixel +1-glow.svg 1 glow +1-pixel.svg 1 pixel +2-glow.svg 2 glow +2-pixel.svg 2 pixel +3-glow.svg 3 glow +3-pixel.svg 3 pixel +4-glow.svg 4 glow +4-pixel.svg 4 pixel +5-glow.svg 5 glow +5-pixel.svg 5 pixel +6-glow.svg 6 glow +6-pixel.svg 6 pixel +7-glow.svg 7 glow +7-pixel.svg 7 pixel +8-glow.svg 8 glow +8-pixel.svg 8 pixel +9-glow.svg 9 glow +9-pixel.svg 9 pixel +abby-a.svg abby a +abby-b.svg abby b +abby-c.svg abby c +abby-d.svg abby d +a-block.svg a block +A-glow.svg A glow +airplane2.png airplane2 +alonzo.gif alonzo +alonzo.png alonzo +amon.gif amon +anina_pop_down.png anina pop down +anina_pop_front.png anina pop front +anina_pop_L_arm.png anina pop L arm +anina_pop_left.png anina pop left +anina_pop_R_arm.png anina pop R arm +anina_pop_right.png anina pop right +anina_pop_stand.png anina pop stand +anina_R_cross.png anina R cross +anina_stance.png anina stance +anina_top_freeze.png anina top freeze +anina_top_L_step.png anina top L step +anina_top_R_step.png anina top R step +anina_top_stand.png anina top stand +anna01.png anna01 +anna02.png anna02 +anna03.png anna03 +anna04.png anna04 +anna05.png anna05 +anna06.png anna06 +anna07b.png anna07b +anna07c.png anna07c +anna07.png anna07 +anna08.png anna08 +anna09.png anna09 +anna10.png anna10 +anna11.png anna11 +anna12.png anna12 +anna-a.png anna a +anna-b.png anna b +A-pixel.svg A pixel +apple.svg apple +arrow1-a.svg arrow1 a +arrow1-b.svg arrow1 b +arrow1-c.svg arrow1 c +arrow1-d.svg arrow1 d +A-story-1.svg A story 1 +A-story-2.svg A story 2 +A-story-3.svg A story 3 +avery-a.svg avery a +avery-b.svg avery b +avery_walking-a.svg avery walking a +avery_walking-b.svg avery walking b +avery_walking-c.svg avery walking c +avery_walking-d.svg avery walking d +AZ_pop_down.png AZ pop down +AZ_pop_front.png AZ pop front +AZ_pop_L_arm.png AZ pop L arm +AZ_pop_left.png AZ pop left +AZ_pop_R_arm.png AZ pop R arm +AZ_pop_right.png AZ pop right +AZ_pop_stand.png AZ pop stand +AZ_stance.png AZ stance +AZ_top_freeze.png AZ top freeze +AZ_top_L_step.png AZ top L step +AZ_top_R_cross.png AZ top R cross +AZ_top_R_step.png AZ top R step +AZ_top_stand.png AZ top stand +ball-a.svg ball a +ball-b.svg ball b +ball-c.svg ball c +ball-d.svg ball d +ballerina-a.svg ballerina a +ballerina-b.svg ballerina b +ballerina-c.svg ballerina c +ballerina-d.svg ballerina d +ball-e.svg ball e +balloon1-a.svg balloon1 a +balloon1-b.svg balloon1 b +balloon1-c.svg balloon1 c +ball-soccer.svg ball soccer +bananas.svg bananas +baseball.svg baseball +basketball.svg basketball +bass.svg bass +bat1-a.png bat1 a +bat1-a_.svg bat1 a +bat1-b.png bat1 b +bat1-b_.svg bat1 b +bat2-a.png bat2 a +bat2-a_.svg bat2 a +bat2-b.png bat2 b +bat2-b_.svg bat2 b +b-block.svg b block +beachball.svg beachball +bear1-a.svg bear1 a +bear1-b.svg bear1 b +bear2-a.svg bear2 a +bear2-b.svg bear2 b +beetle.svg beetle +bell1.svg bell1 +bells-a.svg bells a +bells-b.svg bells b +B-glow.svg B glow +bowl-a.svg bowl a +bowtie-a.svg bowtie a +bowtie-b.svg bowtie b +boy1-standing.gif boy1 standing +boy1-walking.gif boy1 walking +boy2.gif boy2 +boy3.gif boy3 +B-pixel.svg B pixel +breakdancer1-a.png breakdancer1 a +breakdancer1-b.png breakdancer1 b +breakdancer1-c.png breakdancer1 c +B-story-1.svg B story 1 +B-story-2.svg B story 2 +B-story-3.svg B story 3 +building-a.svg building a +building-b.svg building b +building-c.svg building c +building-d.svg building d +building-e.svg building e +building-f.svg building f +building-g.svg building g +building-h.svg building h +building-i.svg building i +building-j.svg building j +bus.png bus +butterfly1-a.svg butterfly1 a +butterfly1-b_.svg butterfly1 b +butterfly2_.svg butterfly2 +butterfly3_.svg butterfly3 +button1.svg button1 +button2-a.svg button2 a +button2-b.svg button2 b +button3-a.svg button3 a +button3-b.svg button3 b +button4-a.svg button4 a +button4-b.svg button4 b +button5-a.svg button5 a +button5-b.svg button5 b +cake-a.svg cake a +cake-b.svg cake b +calvrett_jumping.png calvrett jumping +calvrett_thinking.png calvrett thinking +candle1-a.svg candle1 a +candle1-b.svg candle1 b +candles1.svg candles1 +candles2.svg candles2 +car-bug.png car bug +cassy-a.png cassy a +cassy-b.png cassy b +cassy-c.png cassy c +cassy_dance-a.png cassy dance a +cassy_dance-b.png cassy dance b +cassy_dance-c.png cassy dance c +cassy_dance-d.png cassy dance d +cassy-d.png cassy d +cat2.gif cat2 +cat2.svg cat2 +cat3.png cat3 +cat4.png cat4 +cat5.gif cat5 +catherine-a.png catherine a +catherine-b.png catherine b +catherine-c.png catherine c +catherine-d.png catherine d +c-block.svg c block +C-glow.svg C glow +champ99-a.png champ99 a +champ99-b.png champ99 b +champ99-c.png champ99 c +champ99-d.png champ99 d +champ99-e.png champ99 e +champ99-f.png champ99 f +champ99-g.png champ99 g +cheesy-puffs.png cheesy puffs +cloud-a.svg cloud a +cloud-b.svg cloud b +cloud-c.svg cloud c +cloud-d.svg cloud d +cloud.svg cloud +cm_pop_L_arm.png cm pop L arm +cm_pop_R_arm.png cm pop R arm +cm_top_L_cross.png cm top L cross +cm_top_L_leg.png cm top L leg +cm_top_R_cross.png cm top R cross +cm_top_ready.png cm top ready +cm_top_R_leg.png cm top R leg +cm_top_stand.png cm top stand +convertible1.png convertible1 +convertible2.png convertible2 +convertible3.svg convertible3 +cowbell.svg cowbell +C-pixel.svg C pixel +crab-a.svg crab a +crab-b.svg crab b +creature1-a.svg creature1 a +creature1-b.svg creature1 b +creature1-c.svg creature1 c +C-story-1.svg C story 1 +C-story-2.svg C story 2 +C-story-3.svg C story 3 +cymbal-a.svg cymbal a +cymbal-b.svg cymbal b +dan-a.png dan a +dan-b.png dan b +dani-a.svg dani a +dani-b.svg dani b +dani-c.svg dani c +d-block.svg d block +dee-a.svg dee a +dee-b.svg dee b +dee-c.svg dee c +dee-d.svg dee d +dee-e.svg dee e +devin-a.svg devin a +devin-b.svg devin b +devin-c.svg devin c +devin-d.svg devin d +D-glow.svg D glow +dinosaur1-a.svg dinosaur1 a +dinosaur1-b.svg dinosaur1 b +dinosaur1-c.svg dinosaur1 c +dinosaur1-d.svg dinosaur1 d +dinosaur1-e.svg dinosaur1 e +dinosaur1-f.svg dinosaur1 f +dinosaur1-g.svg dinosaur1 g +dinosaur2-a.svg dinosaur2 a +dinosaur2-b.svg dinosaur2 b +dinosaur3.svg dinosaur3 +diver1.svg diver1 +diver2.svg diver2 +dm_freeze.png dm freeze +dm_pop_down.png dm pop down +dm_pop_front.png dm pop front +dm_pop_L_arm.png dm pop L arm +dm_pop_left.png dm pop left +dm_pop_R_arm.png dm pop R arm +dm_pop_right.png dm pop right +dm_pop_stand.png dm pop stand +dm_stance.svg dm stance +dm_top_L_leg.png dm top L leg +dm_top_R_leg.png dm top R leg +dm_top_stand.png dm top stand +dog1-a.png dog1 a +dog1-a.svg dog1 a +dog1-b.png dog1 b +dog1-b.svg dog1 b +dog2-a.png dog2 a +dog2-a.svg dog2 a +dog2-b.png dog2 b +dog2-b.svg dog2 b +dog2-c.png dog2 c +dog2-c.svg dog2 c +dog_puppy_back.png dog puppy back +dog_puppy_right.png dog puppy right +dog_puppy_side.png dog puppy side +dog_puppy_sit.png dog puppy sit +donut.svg donut +dove1-a.svg dove1 a +dove1-b.svg dove1 b +dove2-a.svg dove2 a +dove2-b.svg dove2 b +D-pixel.svg D pixel +dragon1-a.png dragon1 a +dragon1-a.svg dragon1 a +dragon1-b.png dragon1 b +dragon1-b.svg dragon1 b +dragon2.gif dragon2 +drum1-a.svg drum1 a +drum1-b.svg drum1 b +drum2-a.svg drum2 a +drum2-b.svg drum2 b +drum_bass-a.svg drum bass a +drum_bass-b.svg drum bass b +drums_conga-a.svg drums conga a +drums_conga-b.svg drums conga b +drum_snare-a.svg drum snare a +drum_snare-b.svg drum snare b +D-story-1.svg D story 1 +D-story-2.svg D story 2 +D-story-3.svg D story 3 +duck.svg duck +earth.svg earth +e-block.svg e block +E-glow.svg E glow +elephant-a_.svg elephant a +elephant-b_.svg elephant b +E-pixel.svg E pixel +E-story-1.svg E story 1 +E-story-2.svg E story 2 +E-story-3.svg E story 3 +f-block.svg f block +F-glow.svg F glow +fire_hydrant.png fire hydrant +fish1.svg fish1 +fish2.svg fish2 +fish3.svg fish3 +flower_shape.svg flower shape +football_running.png football running +football_standing.png football standing +fortunecookie.png fortunecookie +fox.svg fox +F-pixel.svg F pixel +frog.svg frog +fruit_platter.png fruit platter +fruitsalad.svg fruitsalad +F-story-1.svg F story 1 +F-story-2.svg F story 2 +F-story-3.svg F story 3 +g-block.svg g block +G-glow.svg G glow +ghost1_.svg ghost1 +ghost2-a.svg ghost2 a +ghost2-b.svg ghost2 b +ghoul-a.svg ghoul a +ghoul-b.svg ghoul b +gift-a.svg gift a +gift-b.svg gift b +girl1-standing.gif girl1 standing +girl1-walking.gif girl1 walking +girl2-shouting.gif girl2 shouting +girl2-standing.gif girl2 standing +girl3-basketball.gif girl3 basketball +girl3-running.gif girl3 running +girl3-standing.gif girl3 standing +glasses.svg glasses +glass_water-a.svg glass water a +glass_water-b.svg glass water b +G-pixel.svg G pixel +green_flag.svg green flag +G-story-1.svg G story 1 +G-story-2.svg G story 2 +G-story-3.svg G story 3 +guitar_bass.svg guitar bass +guitar_electric.svg guitar electric +guitar.svg guitar +hannah-a.png hannah a +hannah-b.png hannah b +hannah-c.png hannah c +hat_beanie.svg hat beanie +hat_party2-a.svg hat party2 a +Hat.svg Hat +hat_winter.svg hat winter +hat_wizard.svg hat wizard +h-block.svg h block +headband.svg headband +heart_code.svg heart code +heart_face.svg heart face +heart_love_it.svg heart love it +heart_purple.svg heart purple +heart_red.svg heart red +heart_smile.svg heart smile +heart_sweet.svg heart sweet +helicopter.png helicopter +H-glow.svg H glow +hippo1-a.svg hippo1 a +hippo1-b.svg hippo1 b +holly1.svg holly1 +holly2.svg holly2 +home_button.svg home button +horse1-a.svg horse1 a +horse1-b.svg horse1 b +H-pixel.svg H pixel +H-story-1.svg H story 1 +H-story-2.svg H story 2 +H-story-3.svg H story 3 +i-block.svg i block +I-glow.svg I glow +I-pixel.svg I pixel +I-story-1.svg I story 1 +I-story-2.svg I story 2 +I-story-3.svg I story 3 +jaime-a.png jaime a +jaime-b.png jaime b +jaime_walking-a.png jaime walking a +jaime_walking-b.png jaime walking b +jaime_walking-c.png jaime walking c +jaime_walking-d.png jaime walking d +jaime_walking-e.png jaime walking e +jay.gif jay +j-block.svg j block +jeans-a.svg jeans a +jeans-b.svg jeans b +J-glow.svg J glow +jodi.gif jodi +jo_pop_down.png jo pop down +jo_pop_front.png jo pop front +jo_pop_L_arm.png jo pop L arm +jo_pop_left.png jo pop left +jo_pop_R_arm.png jo pop R arm +jo_pop_right.png jo pop right +jo_pop_stand.png jo pop stand +jo_stance.png jo stance +jo_top_L_cross.png jo top L cross +jo_top_L_leg.png jo top L leg +jo_top_R_cross.png jo top R cross +jo_top_R_leg.png jo top R leg +jo_top_stand.png jo top stand +J-pixel.svg J pixel +J-story-1.svg J story 1 +J-story-2.svg J story 2 +J-story-3.svg J story 3 +kai-a.png kai a +kai-b.png kai b +k-block.svg k block +keyboard-a.svg keyboard a +keyboard-b.svg keyboard b +keyboard-c.svg keyboard c +keyboard-d.svg keyboard d +key.svg key +K-glow.svg K glow +khalid-a.png khalid a +Khalid-b.png Khalid b +khalid-c.png khalid c +khalid-d.png khalid d +knight.svg knight +K-pixel.svg K pixel +K-story-1.svg K story 1 +K-story-2.svg K story 2 +K-story-3.svg K story 3 +ladybug2-a.svg ladybug2 a +ladybug2-b.svg ladybug2 b +ladybug2.svg ladybug2 +lamp.png lamp +laptop.svg laptop +l-block.svg l block +lb_pop_down.png lb pop down +lb_pop_front.png lb pop front +lb_pop_L_arm.png lb pop L arm +lb_pop_left.png lb pop left +lb_pop_R_arm.png lb pop R arm +lb_pop_right.png lb pop right +lb_pop_stand.png lb pop stand +lb_stance.png lb stance +lb_top_L_cross.png lb top L cross +lb_top_L_leg.png lb top L leg +lb_top_R_cross.png lb top R cross +lb_top_R_leg.png lb top R leg +lb_top_stand.png lb top stand +L-glow.svg L glow +lightning.svg lightning +lion-a.svg lion a +lion-b.svg lion b +lioness.svg lioness +lorenz01.png lorenz01 +lorenz02.png lorenz02 +lorenz03.png lorenz03 +lorenz04.png lorenz04 +lorenz05.png lorenz05 +lorenz06.png lorenz06 +lorenz07b.png lorenz07b +lorenz07.png lorenz07 +L-pixel.svg L pixel +L-story-1.svg L story 1 +L-story-2.svg L story 2 +L-story-3.svg L story 3 +magiccarpet.png magiccarpet +magicwand.svg magicwand +marble-building.png marble building +marissa-crouching.gif marissa crouching +marissa.gif marissa +marissa-sitting.gif marissa sitting +maya.png maya +m-block.svg m block +M-glow.svg M glow +microphonestand.svg microphonestand +microphone.svg microphone +monkey1-a.svg monkey1 a +monkey1-b.svg monkey1 b +monkey2-a.svg monkey2 a +monkey2-b.svg monkey2 b +monkey2-c.svg monkey2 c +mori.png mori +mouse1-a.svg mouse1 a +mouse1-b.svg mouse1 b +M-pixel.svg M pixel +M-story-1.svg M story 1 +M-story-2.svg M story 2 +M-story-3.svg M story 3 +muffin-a.svg muffin a +muffin-b.svg muffin b +n-block.svg n block +N-glow.svg N glow +N-pixel.svg N pixel +N-story-1.svg N story 1 +N-story-2.svg N story 2 +N-story-3.svg N story 3 +o-block.svg o block +octopus-a.svg octopus a +octopus-b.svg octopus b +O-glow.svg O glow +O-pixel.svg O pixel +orange2-a.svg orange2 a +orange2-b.svg orange2 b +orange2-c.svg orange2 c +orange.svg orange +O-story-1.svg O story 1 +O-story-2.svg O story 2 +O-story-3.svg O story 3 +paddle.svg paddle +palmtree.gif palmtree +parrot2-a.svg parrot2 a +parrot2-b.svg parrot2 b +parrot-a.svg parrot a +parrot-b.svg parrot b +partyhat1.svg partyhat1 +paul.gif paul +p-block.svg p block +pencil-a.svg pencil a +pencil-b.svg pencil b +penguin1.svg penguin1 +penguin1_talk-a.svg penguin1 talk a +penguin1_talk-b.svg penguin1 talk b +penguin2.svg penguin2 +penguin2_talk-a.svg penguin2 talk a +penguin2_talk-b.svg penguin2 talk b +penguin3-a.svg penguin3 a +penguin3-b.svg penguin3 b +penguin3-c.svg penguin3 c +P-glow.svg P glow +piano.svg piano +planet2.svg planet2 +P-pixel.svg P pixel +princess.svg princess +prince.svg prince +P-story-1.svg P story 1 +P-story-2.svg P story 2 +P-story-3.svg P story 3 +q-block.svg q block +Q-glow.svg Q glow +Q-pixel.svg Q pixel +Q-story-1.svg Q story 1 +Q-story-2.svg Q story 2 +Q-story-3.svg Q story 3 +rainbow.svg rainbow +r-block.svg r block +referee.gif referee +reindeer.svg reindeer +R-glow.svg R glow +robot1.svg robot1 +rocks.svg rocks +rory.png rory +R-pixel.svg R pixel +R-story-1.svg R story 1 +R-story-2.svg R story 2 +R-story-3.svg R story 3 +ruby-a.png ruby a +ruby-b.png ruby b +sail-boat.png sail boat +sam.gif sam +saxophone-a.svg saxophone a +saxophone-b.svg saxophone b +s-block.svg s block +scarf1.svg scarf1 +scarf2.svg scarf2 +S-glow.svg S glow +shark-a_.svg shark a +shark-b_.svg shark b +shark-c_.svg shark c +shirt2-a2.svg shirt2 a2 +shirt2-a.svg shirt2 a +shirt-a.svg shirt a +shirt_blouse.svg shirt blouse +shirt-b.svg shirt b +shirt_collar-a.svg shirt collar a +shirt_collar-b.svg shirt collar b +shirt_collar-c.svg shirt collar c +shoes1.svg shoes1 +shoes2.svg shoes2 +Singer1.svg Singer1 +skates.svg skates +sl_pop_L_arm.png sl pop L arm +sl_pop_R_arm.png sl pop R arm +sl_top_L_cross.png sl top L cross +sl_top_L_leg.png sl top L leg +sl_top_R_cross.png sl top R cross +sl_top_ready.png sl top ready +sl_top_R_leg.png sl top R leg +sl_top_stand.png sl top stand +snowflake.svg snowflake +snowman.svg snowman +spaceship-a.svg spaceship a +spaceship-b.svg spaceship b +speaker.svg speaker +S-pixel.svg S pixel +squirrel1.png squirrel1 +S-story-1.svg S story 1 +S-story-2.svg S story 2 +S-story-3.svg S story 3 +star1.svg star1 +star2.svg star2 +star3-a.svg star3 a +star3-b.svg star3 b +starfish-a.svg starfish a +starfish-b_.svg starfish b +stop.svg stop +street-cleaner-mit.png street cleaner mit +sunglasses1.svg sunglasses1 +sunglasses2.svg sunglasses2 +sun.svg sun +tabla-a.svg tabla a +tabla-b.svg tabla b +taco-a.svg taco a +taco-b.svg taco b +t-block.svg t block +tennisball.png tennisball +text_awesome.svg text awesome +text_Halloween.svg text Halloween +T-glow.svg T glow +T-pixel.svg T pixel +trampoline.png trampoline +tree1.svg tree1 +tree2.svg tree2 +tree-lights-a.svg tree lights a +tree-lights-b.svg tree lights b +trees-a.svg trees a +trees-b.svg trees b +trombone-a.svg trombone a +trombone-b.svg trombone b +trumpet-a2.svg trumpet a2 +trumpet-a.svg trumpet a +T-story-1.svg T story 1 +T-story-2.svg T story 2 +T-story-3.svg T story 3 +u-block.svg u block +U-glow.svg U glow +ukulele.svg ukulele +umbrella.png umbrella +unicorn1.png unicorn1 +unicorn.svg unicorn +U-pixel.svg U pixel +U-story-1.svg U story 1 +U-story-2.svg U story 2 +U-story-3.svg U story 3 +v-block.svg v block +vest-a.svg vest a +vest-b.svg vest b +V-glow.svg V glow +V-pixel.svg V pixel +V-story-1.svg V story 1 +V-story-2.svg V story 2 +V-story-3.svg V story 3 +wanda.svg wanda +watermelon-a.svg watermelon a +watermelon-b.svg watermelon b +watermelon-c.svg watermelon c +w-block.svg w block +W-glow.svg W glow +witch.svg witch +wizard1.svg wizard1 +wizard2.svg wizard2 +wizard.svg wizard +W-pixel.svg W pixel +W-story-1.svg W story 1 +W-story-2.svg W story 2 +W-story-3.svg W story 3 +x-block.svg x block +X-glow.svg X glow +X-pixel.svg X pixel +X-story-1.svg X story 1 +X-story-2.svg X story 2 +X-story-3.svg X story 3 diff --git a/elements/pl-snap/Snap/Costumes/D-glow.svg b/elements/pl-snap/Snap/Costumes/D-glow.svg new file mode 100644 index 00000000..b910bc55 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/D-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/D-pixel.svg b/elements/pl-snap/Snap/Costumes/D-pixel.svg new file mode 100644 index 00000000..52ca6a66 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/D-pixel.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/D-story-1.svg b/elements/pl-snap/Snap/Costumes/D-story-1.svg new file mode 100644 index 00000000..8accd699 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/D-story-1.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/D-story-2.svg b/elements/pl-snap/Snap/Costumes/D-story-2.svg new file mode 100644 index 00000000..9508ea97 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/D-story-2.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/D-story-3.svg b/elements/pl-snap/Snap/Costumes/D-story-3.svg new file mode 100644 index 00000000..ae54e795 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/D-story-3.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/E-glow.svg b/elements/pl-snap/Snap/Costumes/E-glow.svg new file mode 100644 index 00000000..f9c74406 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/E-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/E-pixel.svg b/elements/pl-snap/Snap/Costumes/E-pixel.svg new file mode 100644 index 00000000..3beb6e08 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/E-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/E-story-1.svg b/elements/pl-snap/Snap/Costumes/E-story-1.svg new file mode 100644 index 00000000..a55a5f19 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/E-story-1.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/E-story-2.svg b/elements/pl-snap/Snap/Costumes/E-story-2.svg new file mode 100644 index 00000000..dfc0b0f9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/E-story-2.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/E-story-3.svg b/elements/pl-snap/Snap/Costumes/E-story-3.svg new file mode 100644 index 00000000..03f3b843 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/E-story-3.svg @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/F-glow.svg b/elements/pl-snap/Snap/Costumes/F-glow.svg new file mode 100644 index 00000000..9b421fa7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/F-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/F-pixel.svg b/elements/pl-snap/Snap/Costumes/F-pixel.svg new file mode 100644 index 00000000..150bdf68 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/F-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/F-story-1.svg b/elements/pl-snap/Snap/Costumes/F-story-1.svg new file mode 100644 index 00000000..8a1714bb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/F-story-1.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/F-story-2.svg b/elements/pl-snap/Snap/Costumes/F-story-2.svg new file mode 100644 index 00000000..83963785 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/F-story-2.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/F-story-3.svg b/elements/pl-snap/Snap/Costumes/F-story-3.svg new file mode 100644 index 00000000..9e931553 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/F-story-3.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/G-glow.svg b/elements/pl-snap/Snap/Costumes/G-glow.svg new file mode 100644 index 00000000..8770022a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/G-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/G-pixel.svg b/elements/pl-snap/Snap/Costumes/G-pixel.svg new file mode 100644 index 00000000..59b727a3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/G-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/G-story-1.svg b/elements/pl-snap/Snap/Costumes/G-story-1.svg new file mode 100644 index 00000000..f855cb45 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/G-story-1.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/G-story-2.svg b/elements/pl-snap/Snap/Costumes/G-story-2.svg new file mode 100644 index 00000000..e0fd66bc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/G-story-2.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/G-story-3.svg b/elements/pl-snap/Snap/Costumes/G-story-3.svg new file mode 100644 index 00000000..30236175 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/G-story-3.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/H-glow.svg b/elements/pl-snap/Snap/Costumes/H-glow.svg new file mode 100644 index 00000000..3c2c50b8 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/H-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/H-pixel.svg b/elements/pl-snap/Snap/Costumes/H-pixel.svg new file mode 100644 index 00000000..95320a76 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/H-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/H-story-1.svg b/elements/pl-snap/Snap/Costumes/H-story-1.svg new file mode 100644 index 00000000..08175bb9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/H-story-1.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/H-story-2.svg b/elements/pl-snap/Snap/Costumes/H-story-2.svg new file mode 100644 index 00000000..161264c6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/H-story-2.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/H-story-3.svg b/elements/pl-snap/Snap/Costumes/H-story-3.svg new file mode 100644 index 00000000..ba1c980f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/H-story-3.svg @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Hat.svg b/elements/pl-snap/Snap/Costumes/Hat.svg new file mode 100644 index 00000000..b01e1adf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Hat.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/I-glow.svg b/elements/pl-snap/Snap/Costumes/I-glow.svg new file mode 100644 index 00000000..e2347d15 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/I-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/I-pixel.svg b/elements/pl-snap/Snap/Costumes/I-pixel.svg new file mode 100644 index 00000000..8d65c6b6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/I-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/I-story-1.svg b/elements/pl-snap/Snap/Costumes/I-story-1.svg new file mode 100644 index 00000000..4d5e898a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/I-story-1.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/I-story-2.svg b/elements/pl-snap/Snap/Costumes/I-story-2.svg new file mode 100644 index 00000000..2ab219bb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/I-story-2.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/I-story-3.svg b/elements/pl-snap/Snap/Costumes/I-story-3.svg new file mode 100644 index 00000000..ecc4a344 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/I-story-3.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/J-glow.svg b/elements/pl-snap/Snap/Costumes/J-glow.svg new file mode 100644 index 00000000..e89d55cb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/J-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/J-pixel.svg b/elements/pl-snap/Snap/Costumes/J-pixel.svg new file mode 100644 index 00000000..5dba9c48 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/J-pixel.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/J-story-1.svg b/elements/pl-snap/Snap/Costumes/J-story-1.svg new file mode 100644 index 00000000..8a5b5847 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/J-story-1.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/J-story-2.svg b/elements/pl-snap/Snap/Costumes/J-story-2.svg new file mode 100644 index 00000000..20310eb4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/J-story-2.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/J-story-3.svg b/elements/pl-snap/Snap/Costumes/J-story-3.svg new file mode 100644 index 00000000..7da541c7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/J-story-3.svg @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/K-glow.svg b/elements/pl-snap/Snap/Costumes/K-glow.svg new file mode 100644 index 00000000..6ed67844 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/K-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/K-pixel.svg b/elements/pl-snap/Snap/Costumes/K-pixel.svg new file mode 100644 index 00000000..c4118395 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/K-pixel.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/K-story-1.svg b/elements/pl-snap/Snap/Costumes/K-story-1.svg new file mode 100644 index 00000000..0f0da3dd --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/K-story-1.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/K-story-2.svg b/elements/pl-snap/Snap/Costumes/K-story-2.svg new file mode 100644 index 00000000..f0f6f98c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/K-story-2.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/K-story-3.svg b/elements/pl-snap/Snap/Costumes/K-story-3.svg new file mode 100644 index 00000000..ca794276 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/K-story-3.svg @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Khalid-b.png b/elements/pl-snap/Snap/Costumes/Khalid-b.png new file mode 100644 index 00000000..10515c9f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/Khalid-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/L-glow.svg b/elements/pl-snap/Snap/Costumes/L-glow.svg new file mode 100644 index 00000000..96798419 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/L-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/L-pixel.svg b/elements/pl-snap/Snap/Costumes/L-pixel.svg new file mode 100644 index 00000000..6d9bd4c3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/L-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/L-story-1.svg b/elements/pl-snap/Snap/Costumes/L-story-1.svg new file mode 100644 index 00000000..b89bae92 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/L-story-1.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/L-story-2.svg b/elements/pl-snap/Snap/Costumes/L-story-2.svg new file mode 100644 index 00000000..e2d1161f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/L-story-2.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/L-story-3.svg b/elements/pl-snap/Snap/Costumes/L-story-3.svg new file mode 100644 index 00000000..3195039f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/L-story-3.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/M-glow.svg b/elements/pl-snap/Snap/Costumes/M-glow.svg new file mode 100644 index 00000000..31bf6891 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/M-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/M-pixel.svg b/elements/pl-snap/Snap/Costumes/M-pixel.svg new file mode 100644 index 00000000..8082fb38 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/M-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/M-story-1.svg b/elements/pl-snap/Snap/Costumes/M-story-1.svg new file mode 100644 index 00000000..44d6ecb6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/M-story-1.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/M-story-2.svg b/elements/pl-snap/Snap/Costumes/M-story-2.svg new file mode 100644 index 00000000..320543f7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/M-story-2.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/M-story-3.svg b/elements/pl-snap/Snap/Costumes/M-story-3.svg new file mode 100644 index 00000000..688c7012 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/M-story-3.svg @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/N-glow.svg b/elements/pl-snap/Snap/Costumes/N-glow.svg new file mode 100644 index 00000000..1e33d62f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/N-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/N-pixel.svg b/elements/pl-snap/Snap/Costumes/N-pixel.svg new file mode 100644 index 00000000..4f342292 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/N-pixel.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/N-story-1.svg b/elements/pl-snap/Snap/Costumes/N-story-1.svg new file mode 100644 index 00000000..28ca0fc7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/N-story-1.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/N-story-2.svg b/elements/pl-snap/Snap/Costumes/N-story-2.svg new file mode 100644 index 00000000..a6031b4c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/N-story-2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/N-story-3.svg b/elements/pl-snap/Snap/Costumes/N-story-3.svg new file mode 100644 index 00000000..4f58b2c5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/N-story-3.svg @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/O-glow.svg b/elements/pl-snap/Snap/Costumes/O-glow.svg new file mode 100644 index 00000000..d63dae32 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/O-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/O-pixel.svg b/elements/pl-snap/Snap/Costumes/O-pixel.svg new file mode 100644 index 00000000..d6199bf3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/O-pixel.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/O-story-1.svg b/elements/pl-snap/Snap/Costumes/O-story-1.svg new file mode 100644 index 00000000..045bbe43 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/O-story-1.svg @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/O-story-2.svg b/elements/pl-snap/Snap/Costumes/O-story-2.svg new file mode 100644 index 00000000..5d05bbb4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/O-story-2.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/O-story-3.svg b/elements/pl-snap/Snap/Costumes/O-story-3.svg new file mode 100644 index 00000000..0ecc8792 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/O-story-3.svg @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/P-glow.svg b/elements/pl-snap/Snap/Costumes/P-glow.svg new file mode 100644 index 00000000..e0db87fb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/P-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/P-pixel.svg b/elements/pl-snap/Snap/Costumes/P-pixel.svg new file mode 100644 index 00000000..c4d4dda1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/P-pixel.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/P-story-1.svg b/elements/pl-snap/Snap/Costumes/P-story-1.svg new file mode 100644 index 00000000..c7b208b3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/P-story-1.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/P-story-2.svg b/elements/pl-snap/Snap/Costumes/P-story-2.svg new file mode 100644 index 00000000..4aa67c5d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/P-story-2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/P-story-3.svg b/elements/pl-snap/Snap/Costumes/P-story-3.svg new file mode 100644 index 00000000..f4db6a34 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/P-story-3.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Q-glow.svg b/elements/pl-snap/Snap/Costumes/Q-glow.svg new file mode 100644 index 00000000..2bd7c9de --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Q-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/Q-pixel.svg b/elements/pl-snap/Snap/Costumes/Q-pixel.svg new file mode 100644 index 00000000..00485e64 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Q-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/Q-story-1.svg b/elements/pl-snap/Snap/Costumes/Q-story-1.svg new file mode 100644 index 00000000..a3def0ca --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Q-story-1.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Q-story-2.svg b/elements/pl-snap/Snap/Costumes/Q-story-2.svg new file mode 100644 index 00000000..bc4221fa --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Q-story-2.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Q-story-3.svg b/elements/pl-snap/Snap/Costumes/Q-story-3.svg new file mode 100644 index 00000000..c8000087 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Q-story-3.svg @@ -0,0 +1,19 @@ + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/R-glow.svg b/elements/pl-snap/Snap/Costumes/R-glow.svg new file mode 100644 index 00000000..9110bb23 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/R-glow.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/R-pixel.svg b/elements/pl-snap/Snap/Costumes/R-pixel.svg new file mode 100644 index 00000000..8b18f64e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/R-pixel.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/R-story-1.svg b/elements/pl-snap/Snap/Costumes/R-story-1.svg new file mode 100644 index 00000000..e7e3579c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/R-story-1.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/R-story-2.svg b/elements/pl-snap/Snap/Costumes/R-story-2.svg new file mode 100644 index 00000000..5632aca7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/R-story-2.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/R-story-3.svg b/elements/pl-snap/Snap/Costumes/R-story-3.svg new file mode 100644 index 00000000..e4efb0de --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/R-story-3.svg @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/S-glow.svg b/elements/pl-snap/Snap/Costumes/S-glow.svg new file mode 100644 index 00000000..a6be4f62 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/S-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/S-pixel.svg b/elements/pl-snap/Snap/Costumes/S-pixel.svg new file mode 100644 index 00000000..e5fb12ed --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/S-pixel.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/S-story-1.svg b/elements/pl-snap/Snap/Costumes/S-story-1.svg new file mode 100644 index 00000000..4d7f2be1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/S-story-1.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/S-story-2.svg b/elements/pl-snap/Snap/Costumes/S-story-2.svg new file mode 100644 index 00000000..57a144fa --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/S-story-2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/S-story-3.svg b/elements/pl-snap/Snap/Costumes/S-story-3.svg new file mode 100644 index 00000000..44656955 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/S-story-3.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Singer1.svg b/elements/pl-snap/Snap/Costumes/Singer1.svg new file mode 100644 index 00000000..c997135e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Singer1.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/T-glow.svg b/elements/pl-snap/Snap/Costumes/T-glow.svg new file mode 100644 index 00000000..2353713e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/T-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/T-pixel.svg b/elements/pl-snap/Snap/Costumes/T-pixel.svg new file mode 100644 index 00000000..e7e9cefc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/T-pixel.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/T-story-1.svg b/elements/pl-snap/Snap/Costumes/T-story-1.svg new file mode 100644 index 00000000..c8f59537 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/T-story-1.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/T-story-2.svg b/elements/pl-snap/Snap/Costumes/T-story-2.svg new file mode 100644 index 00000000..9b64f81f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/T-story-2.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/T-story-3.svg b/elements/pl-snap/Snap/Costumes/T-story-3.svg new file mode 100644 index 00000000..768070da --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/T-story-3.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/U-glow.svg b/elements/pl-snap/Snap/Costumes/U-glow.svg new file mode 100644 index 00000000..2afb410e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/U-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/U-pixel.svg b/elements/pl-snap/Snap/Costumes/U-pixel.svg new file mode 100644 index 00000000..802b34af --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/U-pixel.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/U-story-1.svg b/elements/pl-snap/Snap/Costumes/U-story-1.svg new file mode 100644 index 00000000..a7019f90 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/U-story-1.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/U-story-2.svg b/elements/pl-snap/Snap/Costumes/U-story-2.svg new file mode 100644 index 00000000..6509c8fc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/U-story-2.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/U-story-3.svg b/elements/pl-snap/Snap/Costumes/U-story-3.svg new file mode 100644 index 00000000..e449c21b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/U-story-3.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/V-glow.svg b/elements/pl-snap/Snap/Costumes/V-glow.svg new file mode 100644 index 00000000..6e4343ed --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/V-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/V-pixel.svg b/elements/pl-snap/Snap/Costumes/V-pixel.svg new file mode 100644 index 00000000..118be941 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/V-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/V-story-1.svg b/elements/pl-snap/Snap/Costumes/V-story-1.svg new file mode 100644 index 00000000..04c82ee2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/V-story-1.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/V-story-2.svg b/elements/pl-snap/Snap/Costumes/V-story-2.svg new file mode 100644 index 00000000..a1fbe0ab --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/V-story-2.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/V-story-3.svg b/elements/pl-snap/Snap/Costumes/V-story-3.svg new file mode 100644 index 00000000..961d926c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/V-story-3.svg @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/W-glow.svg b/elements/pl-snap/Snap/Costumes/W-glow.svg new file mode 100644 index 00000000..82a79635 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/W-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/W-pixel.svg b/elements/pl-snap/Snap/Costumes/W-pixel.svg new file mode 100644 index 00000000..a6ddfec3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/W-pixel.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/W-story-1.svg b/elements/pl-snap/Snap/Costumes/W-story-1.svg new file mode 100644 index 00000000..4ee0a613 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/W-story-1.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/W-story-2.svg b/elements/pl-snap/Snap/Costumes/W-story-2.svg new file mode 100644 index 00000000..85791f61 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/W-story-2.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/W-story-3.svg b/elements/pl-snap/Snap/Costumes/W-story-3.svg new file mode 100644 index 00000000..ed7ee090 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/W-story-3.svg @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/X-glow.svg b/elements/pl-snap/Snap/Costumes/X-glow.svg new file mode 100644 index 00000000..f1d5f2e4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/X-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/X-pixel.svg b/elements/pl-snap/Snap/Costumes/X-pixel.svg new file mode 100644 index 00000000..ebf9c156 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/X-pixel.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/X-story-1.svg b/elements/pl-snap/Snap/Costumes/X-story-1.svg new file mode 100644 index 00000000..f2c9af1b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/X-story-1.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/X-story-2.svg b/elements/pl-snap/Snap/Costumes/X-story-2.svg new file mode 100644 index 00000000..fe757017 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/X-story-2.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/X-story-3.svg b/elements/pl-snap/Snap/Costumes/X-story-3.svg new file mode 100644 index 00000000..9b375e42 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/X-story-3.svg @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Y-glow.svg b/elements/pl-snap/Snap/Costumes/Y-glow.svg new file mode 100644 index 00000000..4c25fa22 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Y-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/Y-pixel.svg b/elements/pl-snap/Snap/Costumes/Y-pixel.svg new file mode 100644 index 00000000..2c2989d4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Y-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/Y-story-1.svg b/elements/pl-snap/Snap/Costumes/Y-story-1.svg new file mode 100644 index 00000000..7660e0e2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Y-story-1.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Y-story-2.svg b/elements/pl-snap/Snap/Costumes/Y-story-2.svg new file mode 100644 index 00000000..8a577659 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Y-story-2.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Y-story-3.svg b/elements/pl-snap/Snap/Costumes/Y-story-3.svg new file mode 100644 index 00000000..2d17edcb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Y-story-3.svg @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Z-glow.svg b/elements/pl-snap/Snap/Costumes/Z-glow.svg new file mode 100644 index 00000000..d87e9db7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Z-glow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/Z-pixel.svg b/elements/pl-snap/Snap/Costumes/Z-pixel.svg new file mode 100644 index 00000000..2898b17c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Z-pixel.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/Z-story-1.svg b/elements/pl-snap/Snap/Costumes/Z-story-1.svg new file mode 100644 index 00000000..eff64fee --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Z-story-1.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Z-story-2.svg b/elements/pl-snap/Snap/Costumes/Z-story-2.svg new file mode 100644 index 00000000..4ab577e4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Z-story-2.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/Z-story-3.svg b/elements/pl-snap/Snap/Costumes/Z-story-3.svg new file mode 100644 index 00000000..ccab2850 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/Z-story-3.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/a-block.svg b/elements/pl-snap/Snap/Costumes/a-block.svg new file mode 100644 index 00000000..bf473b1d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/a-block.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/abby-a.svg b/elements/pl-snap/Snap/Costumes/abby-a.svg new file mode 100644 index 00000000..615271a7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/abby-a.svg @@ -0,0 +1,153 @@ + +image/svg+xml \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/abby-b.svg b/elements/pl-snap/Snap/Costumes/abby-b.svg new file mode 100644 index 00000000..aeaca8ad --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/abby-b.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/abby-c.svg b/elements/pl-snap/Snap/Costumes/abby-c.svg new file mode 100644 index 00000000..08bd33b0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/abby-c.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/abby-d.svg b/elements/pl-snap/Snap/Costumes/abby-d.svg new file mode 100644 index 00000000..bb820619 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/abby-d.svg @@ -0,0 +1,208 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/airplane2.png b/elements/pl-snap/Snap/Costumes/airplane2.png new file mode 100644 index 00000000..6f64d04a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/airplane2.png differ diff --git a/elements/pl-snap/Snap/Costumes/aleassa01.png b/elements/pl-snap/Snap/Costumes/aleassa01.png new file mode 100644 index 00000000..c1b5d046 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/aleassa01.png differ diff --git a/elements/pl-snap/Snap/Costumes/aleassa02.png b/elements/pl-snap/Snap/Costumes/aleassa02.png new file mode 100644 index 00000000..5c9732d7 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/aleassa02.png differ diff --git a/elements/pl-snap/Snap/Costumes/aleassa03.png b/elements/pl-snap/Snap/Costumes/aleassa03.png new file mode 100644 index 00000000..eb6d48af Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/aleassa03.png differ diff --git a/elements/pl-snap/Snap/Costumes/aleassa04.png b/elements/pl-snap/Snap/Costumes/aleassa04.png new file mode 100644 index 00000000..c0ec83b8 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/aleassa04.png differ diff --git a/elements/pl-snap/Snap/Costumes/aleassa05.png b/elements/pl-snap/Snap/Costumes/aleassa05.png new file mode 100644 index 00000000..04084f70 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/aleassa05.png differ diff --git a/elements/pl-snap/Snap/Costumes/aleassa06.png b/elements/pl-snap/Snap/Costumes/aleassa06.png new file mode 100644 index 00000000..4c738a9b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/aleassa06.png differ diff --git a/elements/pl-snap/Snap/Costumes/alonzo.png b/elements/pl-snap/Snap/Costumes/alonzo.png new file mode 100644 index 00000000..04cc5337 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/alonzo.png differ diff --git a/elements/pl-snap/Snap/Costumes/alonzo.svg b/elements/pl-snap/Snap/Costumes/alonzo.svg new file mode 100644 index 00000000..eb21c4b8 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/alonzo.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/amon.gif b/elements/pl-snap/Snap/Costumes/amon.gif new file mode 100644 index 00000000..cd648b4a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/amon.gif differ diff --git a/elements/pl-snap/Snap/Costumes/anina_R_cross.png b/elements/pl-snap/Snap/Costumes/anina_R_cross.png new file mode 100644 index 00000000..ec644391 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_R_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/anina_pop_L_arm.png new file mode 100644 index 00000000..d5a6fafa Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/anina_pop_R_arm.png new file mode 100644 index 00000000..e1a40110 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_down.png b/elements/pl-snap/Snap/Costumes/anina_pop_down.png new file mode 100644 index 00000000..f9b970aa Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_down.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_front.png b/elements/pl-snap/Snap/Costumes/anina_pop_front.png new file mode 100644 index 00000000..51a83067 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_front.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_left.png b/elements/pl-snap/Snap/Costumes/anina_pop_left.png new file mode 100644 index 00000000..d1ec7a51 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_left.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_right.png b/elements/pl-snap/Snap/Costumes/anina_pop_right.png new file mode 100644 index 00000000..2b5cf62b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_right.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_pop_stand.png b/elements/pl-snap/Snap/Costumes/anina_pop_stand.png new file mode 100644 index 00000000..1294423f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_pop_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_stance.png b/elements/pl-snap/Snap/Costumes/anina_stance.png new file mode 100644 index 00000000..ccd9e165 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_stance.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_top_L_step.png b/elements/pl-snap/Snap/Costumes/anina_top_L_step.png new file mode 100644 index 00000000..4345c49d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_top_L_step.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_top_R_step.png b/elements/pl-snap/Snap/Costumes/anina_top_R_step.png new file mode 100644 index 00000000..9888377c Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_top_R_step.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_top_freeze.png b/elements/pl-snap/Snap/Costumes/anina_top_freeze.png new file mode 100644 index 00000000..508316fb Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_top_freeze.png differ diff --git a/elements/pl-snap/Snap/Costumes/anina_top_stand.png b/elements/pl-snap/Snap/Costumes/anina_top_stand.png new file mode 100644 index 00000000..a620d255 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anina_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna-a.png b/elements/pl-snap/Snap/Costumes/anna-a.png new file mode 100644 index 00000000..61207f97 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna-b.png b/elements/pl-snap/Snap/Costumes/anna-b.png new file mode 100644 index 00000000..aee5ed62 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna01.png b/elements/pl-snap/Snap/Costumes/anna01.png new file mode 100644 index 00000000..6eb89fec Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna01.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna02.png b/elements/pl-snap/Snap/Costumes/anna02.png new file mode 100644 index 00000000..15db7ca5 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna02.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna03.png b/elements/pl-snap/Snap/Costumes/anna03.png new file mode 100644 index 00000000..53e09e5f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna03.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna04.png b/elements/pl-snap/Snap/Costumes/anna04.png new file mode 100644 index 00000000..3332eb5a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna04.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna05.png b/elements/pl-snap/Snap/Costumes/anna05.png new file mode 100644 index 00000000..5cca2f53 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna05.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna06.png b/elements/pl-snap/Snap/Costumes/anna06.png new file mode 100644 index 00000000..4fba0ef6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna06.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna07.png b/elements/pl-snap/Snap/Costumes/anna07.png new file mode 100644 index 00000000..22100752 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna07.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna07b.png b/elements/pl-snap/Snap/Costumes/anna07b.png new file mode 100644 index 00000000..4b247e58 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna07b.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna07c.png b/elements/pl-snap/Snap/Costumes/anna07c.png new file mode 100644 index 00000000..b27019e1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna07c.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna08.png b/elements/pl-snap/Snap/Costumes/anna08.png new file mode 100644 index 00000000..174bd58e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna08.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna09.png b/elements/pl-snap/Snap/Costumes/anna09.png new file mode 100644 index 00000000..3490ce75 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna09.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna10.png b/elements/pl-snap/Snap/Costumes/anna10.png new file mode 100644 index 00000000..10912587 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna10.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna11.png b/elements/pl-snap/Snap/Costumes/anna11.png new file mode 100644 index 00000000..00f7978e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna11.png differ diff --git a/elements/pl-snap/Snap/Costumes/anna12.png b/elements/pl-snap/Snap/Costumes/anna12.png new file mode 100644 index 00000000..b9d6f561 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/anna12.png differ diff --git a/elements/pl-snap/Snap/Costumes/apple.svg b/elements/pl-snap/Snap/Costumes/apple.svg new file mode 100644 index 00000000..5dba6076 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/apple.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/arrow1-a.svg b/elements/pl-snap/Snap/Costumes/arrow1-a.svg new file mode 100644 index 00000000..7b5b2ce7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/arrow1-a.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/arrow1-b.svg b/elements/pl-snap/Snap/Costumes/arrow1-b.svg new file mode 100644 index 00000000..f8158685 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/arrow1-b.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/arrow1-c.svg b/elements/pl-snap/Snap/Costumes/arrow1-c.svg new file mode 100644 index 00000000..1101ec1e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/arrow1-c.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/arrow1-d.svg b/elements/pl-snap/Snap/Costumes/arrow1-d.svg new file mode 100644 index 00000000..d385b3c6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/arrow1-d.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/avery-a.svg b/elements/pl-snap/Snap/Costumes/avery-a.svg new file mode 100644 index 00000000..ef416fa0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/avery-a.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/avery-b.svg b/elements/pl-snap/Snap/Costumes/avery-b.svg new file mode 100644 index 00000000..dd27284e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/avery-b.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/avery_walking-a.svg b/elements/pl-snap/Snap/Costumes/avery_walking-a.svg new file mode 100644 index 00000000..21c3cddf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/avery_walking-a.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/avery_walking-b.svg b/elements/pl-snap/Snap/Costumes/avery_walking-b.svg new file mode 100644 index 00000000..75edfd42 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/avery_walking-b.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/avery_walking-c.svg b/elements/pl-snap/Snap/Costumes/avery_walking-c.svg new file mode 100644 index 00000000..85d972e7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/avery_walking-c.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/avery_walking-d.svg b/elements/pl-snap/Snap/Costumes/avery_walking-d.svg new file mode 100644 index 00000000..41a97f8c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/avery_walking-d.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/b-block.svg b/elements/pl-snap/Snap/Costumes/b-block.svg new file mode 100644 index 00000000..07476bed --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/b-block.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ball-a.svg b/elements/pl-snap/Snap/Costumes/ball-a.svg new file mode 100644 index 00000000..b5c9b15f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ball-a.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ball-b.svg b/elements/pl-snap/Snap/Costumes/ball-b.svg new file mode 100644 index 00000000..208608a5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ball-b.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ball-c.svg b/elements/pl-snap/Snap/Costumes/ball-c.svg new file mode 100644 index 00000000..bef4918a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ball-c.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ball-d.svg b/elements/pl-snap/Snap/Costumes/ball-d.svg new file mode 100644 index 00000000..aef8624f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ball-d.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ball-e.svg b/elements/pl-snap/Snap/Costumes/ball-e.svg new file mode 100644 index 00000000..2a2d420c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ball-e.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ball-soccer.svg b/elements/pl-snap/Snap/Costumes/ball-soccer.svg new file mode 100644 index 00000000..83ee44aa --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ball-soccer.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ballerina-a.svg b/elements/pl-snap/Snap/Costumes/ballerina-a.svg new file mode 100644 index 00000000..480f8c45 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ballerina-a.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ballerina-b.svg b/elements/pl-snap/Snap/Costumes/ballerina-b.svg new file mode 100644 index 00000000..81cfbf80 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ballerina-b.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ballerina-c.svg b/elements/pl-snap/Snap/Costumes/ballerina-c.svg new file mode 100644 index 00000000..259d018f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ballerina-c.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ballerina-d.svg b/elements/pl-snap/Snap/Costumes/ballerina-d.svg new file mode 100644 index 00000000..68200212 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ballerina-d.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/balloon1-a.svg b/elements/pl-snap/Snap/Costumes/balloon1-a.svg new file mode 100644 index 00000000..9710d171 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/balloon1-a.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/balloon1-b.svg b/elements/pl-snap/Snap/Costumes/balloon1-b.svg new file mode 100644 index 00000000..95ae5d0f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/balloon1-b.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/balloon1-c.svg b/elements/pl-snap/Snap/Costumes/balloon1-c.svg new file mode 100644 index 00000000..bf91cc4c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/balloon1-c.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bananas.svg b/elements/pl-snap/Snap/Costumes/bananas.svg new file mode 100644 index 00000000..fc23c70d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bananas.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/baseball.svg b/elements/pl-snap/Snap/Costumes/baseball.svg new file mode 100644 index 00000000..8d3d7f3d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/baseball.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/basketball.svg b/elements/pl-snap/Snap/Costumes/basketball.svg new file mode 100644 index 00000000..2110b343 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/basketball.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bass.svg b/elements/pl-snap/Snap/Costumes/bass.svg new file mode 100644 index 00000000..a30b9363 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bass.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bat1-a.png b/elements/pl-snap/Snap/Costumes/bat1-a.png new file mode 100644 index 00000000..8d3af1ee Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/bat1-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/bat1-a_.svg b/elements/pl-snap/Snap/Costumes/bat1-a_.svg new file mode 100644 index 00000000..ee98b18a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bat1-a_.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bat1-b.png b/elements/pl-snap/Snap/Costumes/bat1-b.png new file mode 100644 index 00000000..bb309dfd Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/bat1-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/bat1-b_.svg b/elements/pl-snap/Snap/Costumes/bat1-b_.svg new file mode 100644 index 00000000..313154c5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bat1-b_.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bat2-a.png b/elements/pl-snap/Snap/Costumes/bat2-a.png new file mode 100644 index 00000000..c97a6bec Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/bat2-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/bat2-a_.svg b/elements/pl-snap/Snap/Costumes/bat2-a_.svg new file mode 100644 index 00000000..ea536e58 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bat2-a_.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bat2-b.png b/elements/pl-snap/Snap/Costumes/bat2-b.png new file mode 100644 index 00000000..c5cb521f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/bat2-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/bat2-b_.svg b/elements/pl-snap/Snap/Costumes/bat2-b_.svg new file mode 100644 index 00000000..a41bce99 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bat2-b_.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/beachball.svg b/elements/pl-snap/Snap/Costumes/beachball.svg new file mode 100644 index 00000000..ebda7c78 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/beachball.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bear1-a.svg b/elements/pl-snap/Snap/Costumes/bear1-a.svg new file mode 100644 index 00000000..59d0982e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bear1-a.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bear1-b.svg b/elements/pl-snap/Snap/Costumes/bear1-b.svg new file mode 100644 index 00000000..0f3bf0ba --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bear1-b.svg @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bear2-a.svg b/elements/pl-snap/Snap/Costumes/bear2-a.svg new file mode 100644 index 00000000..27ab047a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bear2-a.svg @@ -0,0 +1,196 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/bear2-b.svg b/elements/pl-snap/Snap/Costumes/bear2-b.svg new file mode 100644 index 00000000..76e7fad1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bear2-b.svg @@ -0,0 +1,251 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/beetle.svg b/elements/pl-snap/Snap/Costumes/beetle.svg new file mode 100644 index 00000000..05c51e4d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/beetle.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bell1.svg b/elements/pl-snap/Snap/Costumes/bell1.svg new file mode 100644 index 00000000..cd32a4fd --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bell1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bells-a.svg b/elements/pl-snap/Snap/Costumes/bells-a.svg new file mode 100644 index 00000000..47e41c3b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bells-a.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bells-b.svg b/elements/pl-snap/Snap/Costumes/bells-b.svg new file mode 100644 index 00000000..a330269f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bells-b.svg @@ -0,0 +1,133 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/bowl-a.svg b/elements/pl-snap/Snap/Costumes/bowl-a.svg new file mode 100644 index 00000000..5d6004bf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bowl-a.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bowtie-a.svg b/elements/pl-snap/Snap/Costumes/bowtie-a.svg new file mode 100644 index 00000000..9c6cc933 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bowtie-a.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bowtie-b.svg b/elements/pl-snap/Snap/Costumes/bowtie-b.svg new file mode 100644 index 00000000..acdbf294 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/bowtie-b.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/boy1-standing.gif b/elements/pl-snap/Snap/Costumes/boy1-standing.gif new file mode 100644 index 00000000..bcc52cf2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/boy1-standing.gif differ diff --git a/elements/pl-snap/Snap/Costumes/boy1-walking.gif b/elements/pl-snap/Snap/Costumes/boy1-walking.gif new file mode 100644 index 00000000..bcd6edc6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/boy1-walking.gif differ diff --git a/elements/pl-snap/Snap/Costumes/boy2.gif b/elements/pl-snap/Snap/Costumes/boy2.gif new file mode 100644 index 00000000..60601257 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/boy2.gif differ diff --git a/elements/pl-snap/Snap/Costumes/boy3.gif b/elements/pl-snap/Snap/Costumes/boy3.gif new file mode 100644 index 00000000..97b56b45 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/boy3.gif differ diff --git a/elements/pl-snap/Snap/Costumes/breakdancer1-a.png b/elements/pl-snap/Snap/Costumes/breakdancer1-a.png new file mode 100644 index 00000000..5e4246b8 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/breakdancer1-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/breakdancer1-b.png b/elements/pl-snap/Snap/Costumes/breakdancer1-b.png new file mode 100644 index 00000000..848ea332 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/breakdancer1-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/breakdancer1-c.png b/elements/pl-snap/Snap/Costumes/breakdancer1-c.png new file mode 100644 index 00000000..c27db0b6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/breakdancer1-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/building-a.svg b/elements/pl-snap/Snap/Costumes/building-a.svg new file mode 100644 index 00000000..93b848b1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-a.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-b.svg b/elements/pl-snap/Snap/Costumes/building-b.svg new file mode 100644 index 00000000..083c74e4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-b.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-c.svg b/elements/pl-snap/Snap/Costumes/building-c.svg new file mode 100644 index 00000000..10c2467d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-c.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-d.svg b/elements/pl-snap/Snap/Costumes/building-d.svg new file mode 100644 index 00000000..86100fb1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-d.svg @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-e.svg b/elements/pl-snap/Snap/Costumes/building-e.svg new file mode 100644 index 00000000..ed311e8e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-e.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-f.svg b/elements/pl-snap/Snap/Costumes/building-f.svg new file mode 100644 index 00000000..74dc3733 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-f.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-g.svg b/elements/pl-snap/Snap/Costumes/building-g.svg new file mode 100644 index 00000000..ebe053fb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-g.svg @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-h.svg b/elements/pl-snap/Snap/Costumes/building-h.svg new file mode 100644 index 00000000..c65aa4a4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-h.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-i.svg b/elements/pl-snap/Snap/Costumes/building-i.svg new file mode 100644 index 00000000..5db1564f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-i.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/building-j.svg b/elements/pl-snap/Snap/Costumes/building-j.svg new file mode 100644 index 00000000..2dfca47a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/building-j.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/bus.png b/elements/pl-snap/Snap/Costumes/bus.png new file mode 100644 index 00000000..3edf8162 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/bus.png differ diff --git a/elements/pl-snap/Snap/Costumes/butterfly1-a.svg b/elements/pl-snap/Snap/Costumes/butterfly1-a.svg new file mode 100644 index 00000000..eb729c1d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/butterfly1-a.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/butterfly1-b_.svg b/elements/pl-snap/Snap/Costumes/butterfly1-b_.svg new file mode 100644 index 00000000..55f17baf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/butterfly1-b_.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/butterfly2_.svg b/elements/pl-snap/Snap/Costumes/butterfly2_.svg new file mode 100644 index 00000000..56a3322d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/butterfly2_.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/butterfly3_.svg b/elements/pl-snap/Snap/Costumes/butterfly3_.svg new file mode 100644 index 00000000..4728bd97 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/butterfly3_.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button1.svg b/elements/pl-snap/Snap/Costumes/button1.svg new file mode 100644 index 00000000..52c2ad92 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button1.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button2-a.svg b/elements/pl-snap/Snap/Costumes/button2-a.svg new file mode 100644 index 00000000..fd219238 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button2-a.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button2-b.svg b/elements/pl-snap/Snap/Costumes/button2-b.svg new file mode 100644 index 00000000..33c0e4df --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button2-b.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button3-a.svg b/elements/pl-snap/Snap/Costumes/button3-a.svg new file mode 100644 index 00000000..f94e06ee --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button3-a.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button3-b.svg b/elements/pl-snap/Snap/Costumes/button3-b.svg new file mode 100644 index 00000000..67a76f8b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button3-b.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button4-a.svg b/elements/pl-snap/Snap/Costumes/button4-a.svg new file mode 100644 index 00000000..38631efb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button4-a.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button4-b.svg b/elements/pl-snap/Snap/Costumes/button4-b.svg new file mode 100644 index 00000000..e3293135 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button4-b.svg @@ -0,0 +1,99 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/button5-a.svg b/elements/pl-snap/Snap/Costumes/button5-a.svg new file mode 100644 index 00000000..7029a5db --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button5-a.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/button5-b.svg b/elements/pl-snap/Snap/Costumes/button5-b.svg new file mode 100644 index 00000000..50c54df1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/button5-b.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/c-block.svg b/elements/pl-snap/Snap/Costumes/c-block.svg new file mode 100644 index 00000000..c1826985 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/c-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cake-a.svg b/elements/pl-snap/Snap/Costumes/cake-a.svg new file mode 100644 index 00000000..bc91ea80 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cake-a.svg @@ -0,0 +1,454 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/cake-b.svg b/elements/pl-snap/Snap/Costumes/cake-b.svg new file mode 100644 index 00000000..aaa1e4bb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cake-b.svg @@ -0,0 +1,356 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/calvrett_jumping.png b/elements/pl-snap/Snap/Costumes/calvrett_jumping.png new file mode 100644 index 00000000..6e9253a6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/calvrett_jumping.png differ diff --git a/elements/pl-snap/Snap/Costumes/calvrett_thinking.png b/elements/pl-snap/Snap/Costumes/calvrett_thinking.png new file mode 100644 index 00000000..3e374696 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/calvrett_thinking.png differ diff --git a/elements/pl-snap/Snap/Costumes/candle1-a.svg b/elements/pl-snap/Snap/Costumes/candle1-a.svg new file mode 100644 index 00000000..448238ab --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/candle1-a.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/candle1-b.svg b/elements/pl-snap/Snap/Costumes/candle1-b.svg new file mode 100644 index 00000000..da2349aa --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/candle1-b.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/candles1.svg b/elements/pl-snap/Snap/Costumes/candles1.svg new file mode 100644 index 00000000..17a575b4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/candles1.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/candles2.svg b/elements/pl-snap/Snap/Costumes/candles2.svg new file mode 100644 index 00000000..cf4a25ca --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/candles2.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/car-bug.png b/elements/pl-snap/Snap/Costumes/car-bug.png new file mode 100644 index 00000000..b67b7745 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/car-bug.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy-a.png b/elements/pl-snap/Snap/Costumes/cassy-a.png new file mode 100644 index 00000000..2df33aa4 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy-b.png b/elements/pl-snap/Snap/Costumes/cassy-b.png new file mode 100644 index 00000000..c65de507 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy-c.png b/elements/pl-snap/Snap/Costumes/cassy-c.png new file mode 100644 index 00000000..9a61deb8 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy-d.png b/elements/pl-snap/Snap/Costumes/cassy-d.png new file mode 100644 index 00000000..cbb3da3a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy-d.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy_dance-a.png b/elements/pl-snap/Snap/Costumes/cassy_dance-a.png new file mode 100644 index 00000000..ff2f509e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy_dance-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy_dance-b.png b/elements/pl-snap/Snap/Costumes/cassy_dance-b.png new file mode 100644 index 00000000..e861f427 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy_dance-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy_dance-c.png b/elements/pl-snap/Snap/Costumes/cassy_dance-c.png new file mode 100644 index 00000000..258ded10 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy_dance-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/cassy_dance-d.png b/elements/pl-snap/Snap/Costumes/cassy_dance-d.png new file mode 100644 index 00000000..35921083 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cassy_dance-d.png differ diff --git a/elements/pl-snap/Snap/Costumes/cat2.gif b/elements/pl-snap/Snap/Costumes/cat2.gif new file mode 100644 index 00000000..e9c07851 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cat2.gif differ diff --git a/elements/pl-snap/Snap/Costumes/cat2.svg b/elements/pl-snap/Snap/Costumes/cat2.svg new file mode 100644 index 00000000..c8b3d697 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cat2.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cat3.png b/elements/pl-snap/Snap/Costumes/cat3.png new file mode 100644 index 00000000..d03b3f47 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cat3.png differ diff --git a/elements/pl-snap/Snap/Costumes/cat4.png b/elements/pl-snap/Snap/Costumes/cat4.png new file mode 100644 index 00000000..02f379ae Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cat4.png differ diff --git a/elements/pl-snap/Snap/Costumes/cat5.gif b/elements/pl-snap/Snap/Costumes/cat5.gif new file mode 100644 index 00000000..6ebd3af1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cat5.gif differ diff --git a/elements/pl-snap/Snap/Costumes/catherine-a.png b/elements/pl-snap/Snap/Costumes/catherine-a.png new file mode 100644 index 00000000..bbd503b9 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/catherine-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/catherine-b.png b/elements/pl-snap/Snap/Costumes/catherine-b.png new file mode 100644 index 00000000..44f4de00 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/catherine-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/catherine-c.png b/elements/pl-snap/Snap/Costumes/catherine-c.png new file mode 100644 index 00000000..fed65351 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/catherine-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/catherine-d.png b/elements/pl-snap/Snap/Costumes/catherine-d.png new file mode 100644 index 00000000..4130be55 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/catherine-d.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-a.png b/elements/pl-snap/Snap/Costumes/champ99-a.png new file mode 100644 index 00000000..a6c9f0fe Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-b.png b/elements/pl-snap/Snap/Costumes/champ99-b.png new file mode 100644 index 00000000..d0619ccf Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-c.png b/elements/pl-snap/Snap/Costumes/champ99-c.png new file mode 100644 index 00000000..b89d82b9 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-d.png b/elements/pl-snap/Snap/Costumes/champ99-d.png new file mode 100644 index 00000000..6b827565 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-d.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-e.png b/elements/pl-snap/Snap/Costumes/champ99-e.png new file mode 100644 index 00000000..17299519 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-e.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-f.png b/elements/pl-snap/Snap/Costumes/champ99-f.png new file mode 100644 index 00000000..835509af Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-f.png differ diff --git a/elements/pl-snap/Snap/Costumes/champ99-g.png b/elements/pl-snap/Snap/Costumes/champ99-g.png new file mode 100644 index 00000000..6f4a706b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/champ99-g.png differ diff --git a/elements/pl-snap/Snap/Costumes/cheesy-puffs.png b/elements/pl-snap/Snap/Costumes/cheesy-puffs.png new file mode 100644 index 00000000..980422dc Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cheesy-puffs.png differ diff --git a/elements/pl-snap/Snap/Costumes/cloud-a.svg b/elements/pl-snap/Snap/Costumes/cloud-a.svg new file mode 100644 index 00000000..a46c8cf1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cloud-a.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cloud-b.svg b/elements/pl-snap/Snap/Costumes/cloud-b.svg new file mode 100644 index 00000000..19c91a4a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cloud-b.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cloud-c.svg b/elements/pl-snap/Snap/Costumes/cloud-c.svg new file mode 100644 index 00000000..a1283f05 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cloud-c.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cloud-d.svg b/elements/pl-snap/Snap/Costumes/cloud-d.svg new file mode 100644 index 00000000..143547d8 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cloud-d.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cloud.svg b/elements/pl-snap/Snap/Costumes/cloud.svg new file mode 100644 index 00000000..ca4dabc3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cloud.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cm_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/cm_pop_L_arm.png new file mode 100644 index 00000000..c24c1815 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/cm_pop_R_arm.png new file mode 100644 index 00000000..ea38733b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_top_L_cross.png b/elements/pl-snap/Snap/Costumes/cm_top_L_cross.png new file mode 100644 index 00000000..90e9872f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_top_L_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_top_L_leg.png b/elements/pl-snap/Snap/Costumes/cm_top_L_leg.png new file mode 100644 index 00000000..aa77acfa Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_top_L_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_top_R_cross.png b/elements/pl-snap/Snap/Costumes/cm_top_R_cross.png new file mode 100644 index 00000000..3c6dff46 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_top_R_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_top_R_leg.png b/elements/pl-snap/Snap/Costumes/cm_top_R_leg.png new file mode 100644 index 00000000..f1253269 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_top_R_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_top_ready.png b/elements/pl-snap/Snap/Costumes/cm_top_ready.png new file mode 100644 index 00000000..eb1884e7 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_top_ready.png differ diff --git a/elements/pl-snap/Snap/Costumes/cm_top_stand.png b/elements/pl-snap/Snap/Costumes/cm_top_stand.png new file mode 100644 index 00000000..1d989e0e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/cm_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/convertible1.png b/elements/pl-snap/Snap/Costumes/convertible1.png new file mode 100644 index 00000000..0e44654a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/convertible1.png differ diff --git a/elements/pl-snap/Snap/Costumes/convertible2.png b/elements/pl-snap/Snap/Costumes/convertible2.png new file mode 100644 index 00000000..b766ae62 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/convertible2.png differ diff --git a/elements/pl-snap/Snap/Costumes/convertible3.svg b/elements/pl-snap/Snap/Costumes/convertible3.svg new file mode 100644 index 00000000..580d24c2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/convertible3.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cowbell.svg b/elements/pl-snap/Snap/Costumes/cowbell.svg new file mode 100644 index 00000000..f808a61e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cowbell.svg @@ -0,0 +1,94 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/crab-a.svg b/elements/pl-snap/Snap/Costumes/crab-a.svg new file mode 100644 index 00000000..a3553bdc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/crab-a.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/crab-b.svg b/elements/pl-snap/Snap/Costumes/crab-b.svg new file mode 100644 index 00000000..f5813c70 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/crab-b.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/creature1-a.svg b/elements/pl-snap/Snap/Costumes/creature1-a.svg new file mode 100644 index 00000000..dffbea87 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/creature1-a.svg @@ -0,0 +1,392 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/creature1-b.svg b/elements/pl-snap/Snap/Costumes/creature1-b.svg new file mode 100644 index 00000000..741b9418 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/creature1-b.svg @@ -0,0 +1,404 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/creature1-c.svg b/elements/pl-snap/Snap/Costumes/creature1-c.svg new file mode 100644 index 00000000..e66a7b6f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/creature1-c.svg @@ -0,0 +1,408 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/cymbal-a.svg b/elements/pl-snap/Snap/Costumes/cymbal-a.svg new file mode 100644 index 00000000..ea7367d9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cymbal-a.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/cymbal-b.svg b/elements/pl-snap/Snap/Costumes/cymbal-b.svg new file mode 100644 index 00000000..a6ef30ed --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/cymbal-b.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/d-block.svg b/elements/pl-snap/Snap/Costumes/d-block.svg new file mode 100644 index 00000000..15dde4f2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/d-block.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dan-a.png b/elements/pl-snap/Snap/Costumes/dan-a.png new file mode 100644 index 00000000..3b8fcc7e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dan-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/dan-b.png b/elements/pl-snap/Snap/Costumes/dan-b.png new file mode 100644 index 00000000..01793121 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dan-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/dani-a.svg b/elements/pl-snap/Snap/Costumes/dani-a.svg new file mode 100644 index 00000000..9733cc93 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dani-a.svg @@ -0,0 +1,209 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/dani-b.svg b/elements/pl-snap/Snap/Costumes/dani-b.svg new file mode 100644 index 00000000..e6b5245d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dani-b.svg @@ -0,0 +1,210 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/dani-c.svg b/elements/pl-snap/Snap/Costumes/dani-c.svg new file mode 100644 index 00000000..5067f83e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dani-c.svg @@ -0,0 +1,469 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/dee-a.svg b/elements/pl-snap/Snap/Costumes/dee-a.svg new file mode 100644 index 00000000..a42b9218 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dee-a.svg @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dee-b.svg b/elements/pl-snap/Snap/Costumes/dee-b.svg new file mode 100644 index 00000000..44f3c96d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dee-b.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dee-c.svg b/elements/pl-snap/Snap/Costumes/dee-c.svg new file mode 100644 index 00000000..345c1dea --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dee-c.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dee-d.svg b/elements/pl-snap/Snap/Costumes/dee-d.svg new file mode 100644 index 00000000..f9ddabf4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dee-d.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dee-e.svg b/elements/pl-snap/Snap/Costumes/dee-e.svg new file mode 100644 index 00000000..e97228a3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dee-e.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/derec01.png b/elements/pl-snap/Snap/Costumes/derec01.png new file mode 100644 index 00000000..60c63ee4 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/derec01.png differ diff --git a/elements/pl-snap/Snap/Costumes/derec02.png b/elements/pl-snap/Snap/Costumes/derec02.png new file mode 100644 index 00000000..53ba4cd2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/derec02.png differ diff --git a/elements/pl-snap/Snap/Costumes/derec03.png b/elements/pl-snap/Snap/Costumes/derec03.png new file mode 100644 index 00000000..0b48d05e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/derec03.png differ diff --git a/elements/pl-snap/Snap/Costumes/derec04.png b/elements/pl-snap/Snap/Costumes/derec04.png new file mode 100644 index 00000000..bd585ca6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/derec04.png differ diff --git a/elements/pl-snap/Snap/Costumes/derec05.png b/elements/pl-snap/Snap/Costumes/derec05.png new file mode 100644 index 00000000..c8ed1045 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/derec05.png differ diff --git a/elements/pl-snap/Snap/Costumes/derec06.png b/elements/pl-snap/Snap/Costumes/derec06.png new file mode 100644 index 00000000..be65254a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/derec06.png differ diff --git a/elements/pl-snap/Snap/Costumes/devin-a.svg b/elements/pl-snap/Snap/Costumes/devin-a.svg new file mode 100644 index 00000000..b87f192c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/devin-a.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/devin-b.svg b/elements/pl-snap/Snap/Costumes/devin-b.svg new file mode 100644 index 00000000..440d6183 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/devin-b.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/devin-c.svg b/elements/pl-snap/Snap/Costumes/devin-c.svg new file mode 100644 index 00000000..b4fd7021 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/devin-c.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/devin-d.svg b/elements/pl-snap/Snap/Costumes/devin-d.svg new file mode 100644 index 00000000..056535e2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/devin-d.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-a.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-a.svg new file mode 100644 index 00000000..74badf7d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-a.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-b.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-b.svg new file mode 100644 index 00000000..304cf743 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-b.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-c.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-c.svg new file mode 100644 index 00000000..13fde7f8 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-c.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-d.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-d.svg new file mode 100644 index 00000000..7ed47763 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-d.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-e.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-e.svg new file mode 100644 index 00000000..7136bd34 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-e.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-f.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-f.svg new file mode 100644 index 00000000..c74a397b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-f.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur1-g.svg b/elements/pl-snap/Snap/Costumes/dinosaur1-g.svg new file mode 100644 index 00000000..64ddabe6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur1-g.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur2-a.svg b/elements/pl-snap/Snap/Costumes/dinosaur2-a.svg new file mode 100644 index 00000000..07f35bac --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur2-a.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur2-b.svg b/elements/pl-snap/Snap/Costumes/dinosaur2-b.svg new file mode 100644 index 00000000..72b08c9f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur2-b.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dinosaur3.svg b/elements/pl-snap/Snap/Costumes/dinosaur3.svg new file mode 100644 index 00000000..a3480a08 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dinosaur3.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/diver1.svg b/elements/pl-snap/Snap/Costumes/diver1.svg new file mode 100644 index 00000000..8c15179f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/diver1.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/diver2.svg b/elements/pl-snap/Snap/Costumes/diver2.svg new file mode 100644 index 00000000..9d6852e0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/diver2.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dm_freeze.png b/elements/pl-snap/Snap/Costumes/dm_freeze.png new file mode 100644 index 00000000..3c7f0cff Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_freeze.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/dm_pop_L_arm.png new file mode 100644 index 00000000..48d6273a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/dm_pop_R_arm.png new file mode 100644 index 00000000..55c90a82 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_down.png b/elements/pl-snap/Snap/Costumes/dm_pop_down.png new file mode 100644 index 00000000..cdb63041 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_down.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_front.png b/elements/pl-snap/Snap/Costumes/dm_pop_front.png new file mode 100644 index 00000000..d1434ce8 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_front.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_left.png b/elements/pl-snap/Snap/Costumes/dm_pop_left.png new file mode 100644 index 00000000..ecd53e22 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_left.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_right.png b/elements/pl-snap/Snap/Costumes/dm_pop_right.png new file mode 100644 index 00000000..deeacde3 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_right.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_pop_stand.png b/elements/pl-snap/Snap/Costumes/dm_pop_stand.png new file mode 100644 index 00000000..70bf63f7 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_pop_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_stance.svg b/elements/pl-snap/Snap/Costumes/dm_stance.svg new file mode 100644 index 00000000..477d674d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dm_stance.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dm_top_L_leg.png b/elements/pl-snap/Snap/Costumes/dm_top_L_leg.png new file mode 100644 index 00000000..2ab4e945 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_top_L_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_top_R_leg.png b/elements/pl-snap/Snap/Costumes/dm_top_R_leg.png new file mode 100644 index 00000000..e79227da Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_top_R_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/dm_top_stand.png b/elements/pl-snap/Snap/Costumes/dm_top_stand.png new file mode 100644 index 00000000..7c9e368a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dm_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog1-a.png b/elements/pl-snap/Snap/Costumes/dog1-a.png new file mode 100644 index 00000000..69f8ef3b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog1-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog1-a.svg b/elements/pl-snap/Snap/Costumes/dog1-a.svg new file mode 100644 index 00000000..5a5ddd0e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dog1-a.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dog1-b.png b/elements/pl-snap/Snap/Costumes/dog1-b.png new file mode 100644 index 00000000..fd592e3b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog1-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog1-b.svg b/elements/pl-snap/Snap/Costumes/dog1-b.svg new file mode 100644 index 00000000..f7447d60 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dog1-b.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dog2-a.png b/elements/pl-snap/Snap/Costumes/dog2-a.png new file mode 100644 index 00000000..bbb29eba Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog2-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog2-a.svg b/elements/pl-snap/Snap/Costumes/dog2-a.svg new file mode 100644 index 00000000..b638a611 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dog2-a.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dog2-b.png b/elements/pl-snap/Snap/Costumes/dog2-b.png new file mode 100644 index 00000000..9279cdc5 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog2-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog2-b.svg b/elements/pl-snap/Snap/Costumes/dog2-b.svg new file mode 100644 index 00000000..0c8484e6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dog2-b.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dog2-c.png b/elements/pl-snap/Snap/Costumes/dog2-c.png new file mode 100644 index 00000000..6b314d25 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog2-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog2-c.svg b/elements/pl-snap/Snap/Costumes/dog2-c.svg new file mode 100644 index 00000000..db3fbb2c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dog2-c.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dog_puppy_back.png b/elements/pl-snap/Snap/Costumes/dog_puppy_back.png new file mode 100644 index 00000000..3f04f52d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog_puppy_back.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog_puppy_right.png b/elements/pl-snap/Snap/Costumes/dog_puppy_right.png new file mode 100644 index 00000000..13a72f2f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog_puppy_right.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog_puppy_side.png b/elements/pl-snap/Snap/Costumes/dog_puppy_side.png new file mode 100644 index 00000000..55dcd361 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog_puppy_side.png differ diff --git a/elements/pl-snap/Snap/Costumes/dog_puppy_sit.png b/elements/pl-snap/Snap/Costumes/dog_puppy_sit.png new file mode 100644 index 00000000..ba11dedf Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dog_puppy_sit.png differ diff --git a/elements/pl-snap/Snap/Costumes/donut.svg b/elements/pl-snap/Snap/Costumes/donut.svg new file mode 100644 index 00000000..7f9631fc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/donut.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dove1-a.svg b/elements/pl-snap/Snap/Costumes/dove1-a.svg new file mode 100644 index 00000000..bfb6f48c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dove1-a.svg @@ -0,0 +1,624 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/dove1-b.svg b/elements/pl-snap/Snap/Costumes/dove1-b.svg new file mode 100644 index 00000000..7417047b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dove1-b.svg @@ -0,0 +1,624 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/dove2-a.svg b/elements/pl-snap/Snap/Costumes/dove2-a.svg new file mode 100644 index 00000000..01afecb3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dove2-a.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dove2-b.svg b/elements/pl-snap/Snap/Costumes/dove2-b.svg new file mode 100644 index 00000000..f6496325 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dove2-b.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dragon1-a.png b/elements/pl-snap/Snap/Costumes/dragon1-a.png new file mode 100644 index 00000000..c216eeaf Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dragon1-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/dragon1-a.svg b/elements/pl-snap/Snap/Costumes/dragon1-a.svg new file mode 100644 index 00000000..b97e5490 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dragon1-a.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dragon1-b.png b/elements/pl-snap/Snap/Costumes/dragon1-b.png new file mode 100644 index 00000000..83261c57 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dragon1-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/dragon1-b.svg b/elements/pl-snap/Snap/Costumes/dragon1-b.svg new file mode 100644 index 00000000..7ddcdfeb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/dragon1-b.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/dragon2.gif b/elements/pl-snap/Snap/Costumes/dragon2.gif new file mode 100644 index 00000000..d63305de Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/dragon2.gif differ diff --git a/elements/pl-snap/Snap/Costumes/drum1-a.svg b/elements/pl-snap/Snap/Costumes/drum1-a.svg new file mode 100644 index 00000000..abd5e83c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum1-a.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/drum1-b.svg b/elements/pl-snap/Snap/Costumes/drum1-b.svg new file mode 100644 index 00000000..d2132497 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum1-b.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/drum2-a.svg b/elements/pl-snap/Snap/Costumes/drum2-a.svg new file mode 100644 index 00000000..2c4ac621 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum2-a.svg @@ -0,0 +1,548 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/drum2-b.svg b/elements/pl-snap/Snap/Costumes/drum2-b.svg new file mode 100644 index 00000000..2270e25e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum2-b.svg @@ -0,0 +1,568 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/drum_bass-a.svg b/elements/pl-snap/Snap/Costumes/drum_bass-a.svg new file mode 100644 index 00000000..d605ea93 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum_bass-a.svg @@ -0,0 +1,109 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/drum_bass-b.svg b/elements/pl-snap/Snap/Costumes/drum_bass-b.svg new file mode 100644 index 00000000..9e2815e4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum_bass-b.svg @@ -0,0 +1,118 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/drum_snare-a.svg b/elements/pl-snap/Snap/Costumes/drum_snare-a.svg new file mode 100644 index 00000000..6e9c7a84 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum_snare-a.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/drum_snare-b.svg b/elements/pl-snap/Snap/Costumes/drum_snare-b.svg new file mode 100644 index 00000000..7baacdaf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drum_snare-b.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/drums_conga-a.svg b/elements/pl-snap/Snap/Costumes/drums_conga-a.svg new file mode 100644 index 00000000..dede5ce6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drums_conga-a.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/drums_conga-b.svg b/elements/pl-snap/Snap/Costumes/drums_conga-b.svg new file mode 100644 index 00000000..5e852492 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/drums_conga-b.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/duck.svg b/elements/pl-snap/Snap/Costumes/duck.svg new file mode 100644 index 00000000..1ef68e7d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/duck.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/e-block.svg b/elements/pl-snap/Snap/Costumes/e-block.svg new file mode 100644 index 00000000..514bb8a1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/e-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/earth.svg b/elements/pl-snap/Snap/Costumes/earth.svg new file mode 100644 index 00000000..47c4ebec --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/earth.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/elephant-a_.svg b/elements/pl-snap/Snap/Costumes/elephant-a_.svg new file mode 100644 index 00000000..c90caaa9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/elephant-a_.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/elephant-b_.svg b/elements/pl-snap/Snap/Costumes/elephant-b_.svg new file mode 100644 index 00000000..278eacd5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/elephant-b_.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/f-block.svg b/elements/pl-snap/Snap/Costumes/f-block.svg new file mode 100644 index 00000000..8b781aaa --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/f-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/fire_hydrant.png b/elements/pl-snap/Snap/Costumes/fire_hydrant.png new file mode 100644 index 00000000..c9faca4b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/fire_hydrant.png differ diff --git a/elements/pl-snap/Snap/Costumes/fish1.svg b/elements/pl-snap/Snap/Costumes/fish1.svg new file mode 100644 index 00000000..987e5679 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/fish1.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/fish2.svg b/elements/pl-snap/Snap/Costumes/fish2.svg new file mode 100644 index 00000000..354315df --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/fish2.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/fish3.svg b/elements/pl-snap/Snap/Costumes/fish3.svg new file mode 100644 index 00000000..0488f123 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/fish3.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/flower_shape.svg b/elements/pl-snap/Snap/Costumes/flower_shape.svg new file mode 100644 index 00000000..f2955ce3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/flower_shape.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/football_running.png b/elements/pl-snap/Snap/Costumes/football_running.png new file mode 100644 index 00000000..7fb799e0 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/football_running.png differ diff --git a/elements/pl-snap/Snap/Costumes/football_standing.png b/elements/pl-snap/Snap/Costumes/football_standing.png new file mode 100644 index 00000000..7abc1713 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/football_standing.png differ diff --git a/elements/pl-snap/Snap/Costumes/fortunecookie.png b/elements/pl-snap/Snap/Costumes/fortunecookie.png new file mode 100644 index 00000000..9e99ca06 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/fortunecookie.png differ diff --git a/elements/pl-snap/Snap/Costumes/fox.svg b/elements/pl-snap/Snap/Costumes/fox.svg new file mode 100644 index 00000000..f00a65d5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/fox.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/frog.svg b/elements/pl-snap/Snap/Costumes/frog.svg new file mode 100644 index 00000000..cc24e1f0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/frog.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/fruit_platter.png b/elements/pl-snap/Snap/Costumes/fruit_platter.png new file mode 100644 index 00000000..ac00f8b1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/fruit_platter.png differ diff --git a/elements/pl-snap/Snap/Costumes/fruitsalad.svg b/elements/pl-snap/Snap/Costumes/fruitsalad.svg new file mode 100644 index 00000000..c51298f1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/fruitsalad.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/g-block.svg b/elements/pl-snap/Snap/Costumes/g-block.svg new file mode 100644 index 00000000..ca33c2d3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/g-block.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ghost1_.svg b/elements/pl-snap/Snap/Costumes/ghost1_.svg new file mode 100644 index 00000000..1ae2ea7b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ghost1_.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ghost2-a.svg b/elements/pl-snap/Snap/Costumes/ghost2-a.svg new file mode 100644 index 00000000..1040652a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ghost2-a.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ghost2-b.svg b/elements/pl-snap/Snap/Costumes/ghost2-b.svg new file mode 100644 index 00000000..096118b2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ghost2-b.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ghoul-a.svg b/elements/pl-snap/Snap/Costumes/ghoul-a.svg new file mode 100644 index 00000000..9c487ed2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ghoul-a.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ghoul-b.svg b/elements/pl-snap/Snap/Costumes/ghoul-b.svg new file mode 100644 index 00000000..ca385429 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ghoul-b.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/gift-a.svg b/elements/pl-snap/Snap/Costumes/gift-a.svg new file mode 100644 index 00000000..5362b11d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/gift-a.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/gift-b.svg b/elements/pl-snap/Snap/Costumes/gift-b.svg new file mode 100644 index 00000000..01531dca --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/gift-b.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/girl1-standing.gif b/elements/pl-snap/Snap/Costumes/girl1-standing.gif new file mode 100644 index 00000000..60369d06 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl1-standing.gif differ diff --git a/elements/pl-snap/Snap/Costumes/girl1-walking.gif b/elements/pl-snap/Snap/Costumes/girl1-walking.gif new file mode 100644 index 00000000..e7bad2bf Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl1-walking.gif differ diff --git a/elements/pl-snap/Snap/Costumes/girl2-shouting.gif b/elements/pl-snap/Snap/Costumes/girl2-shouting.gif new file mode 100644 index 00000000..783b6361 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl2-shouting.gif differ diff --git a/elements/pl-snap/Snap/Costumes/girl2-standing.gif b/elements/pl-snap/Snap/Costumes/girl2-standing.gif new file mode 100644 index 00000000..65504062 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl2-standing.gif differ diff --git a/elements/pl-snap/Snap/Costumes/girl3-basketball.gif b/elements/pl-snap/Snap/Costumes/girl3-basketball.gif new file mode 100644 index 00000000..1a7f3300 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl3-basketball.gif differ diff --git a/elements/pl-snap/Snap/Costumes/girl3-running.gif b/elements/pl-snap/Snap/Costumes/girl3-running.gif new file mode 100644 index 00000000..abdc5106 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl3-running.gif differ diff --git a/elements/pl-snap/Snap/Costumes/girl3-standing.gif b/elements/pl-snap/Snap/Costumes/girl3-standing.gif new file mode 100644 index 00000000..fec700be Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/girl3-standing.gif differ diff --git a/elements/pl-snap/Snap/Costumes/glass_water-a.svg b/elements/pl-snap/Snap/Costumes/glass_water-a.svg new file mode 100644 index 00000000..729e1f1f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/glass_water-a.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/glass_water-b.svg b/elements/pl-snap/Snap/Costumes/glass_water-b.svg new file mode 100644 index 00000000..aeae5ac6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/glass_water-b.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/glasses.svg b/elements/pl-snap/Snap/Costumes/glasses.svg new file mode 100644 index 00000000..ab5e325b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/glasses.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/green_flag.svg b/elements/pl-snap/Snap/Costumes/green_flag.svg new file mode 100644 index 00000000..916a10a7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/green_flag.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/guitar bass.svg b/elements/pl-snap/Snap/Costumes/guitar bass.svg new file mode 100644 index 00000000..ce0aadcf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/guitar bass.svg @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/guitar.svg b/elements/pl-snap/Snap/Costumes/guitar.svg new file mode 100644 index 00000000..eb04bb34 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/guitar.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/guitar_bass.svg b/elements/pl-snap/Snap/Costumes/guitar_bass.svg new file mode 100644 index 00000000..ce0aadcf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/guitar_bass.svg @@ -0,0 +1,279 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/guitar_electric.svg b/elements/pl-snap/Snap/Costumes/guitar_electric.svg new file mode 100644 index 00000000..ac439a70 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/guitar_electric.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/h-block.svg b/elements/pl-snap/Snap/Costumes/h-block.svg new file mode 100644 index 00000000..52e6a97c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/h-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/hannah-a.png b/elements/pl-snap/Snap/Costumes/hannah-a.png new file mode 100644 index 00000000..68c34b23 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/hannah-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/hannah-b.png b/elements/pl-snap/Snap/Costumes/hannah-b.png new file mode 100644 index 00000000..0d7f65cc Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/hannah-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/hannah-c.png b/elements/pl-snap/Snap/Costumes/hannah-c.png new file mode 100644 index 00000000..8bb37c8a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/hannah-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/hat_beanie.svg b/elements/pl-snap/Snap/Costumes/hat_beanie.svg new file mode 100644 index 00000000..34568b8b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/hat_beanie.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/hat_party2-a.svg b/elements/pl-snap/Snap/Costumes/hat_party2-a.svg new file mode 100644 index 00000000..784ce620 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/hat_party2-a.svg @@ -0,0 +1,83 @@ + +image/svg+xml \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/hat_winter.svg b/elements/pl-snap/Snap/Costumes/hat_winter.svg new file mode 100644 index 00000000..327cb193 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/hat_winter.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/hat_wizard.svg b/elements/pl-snap/Snap/Costumes/hat_wizard.svg new file mode 100644 index 00000000..9ce3e575 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/hat_wizard.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/headband.svg b/elements/pl-snap/Snap/Costumes/headband.svg new file mode 100644 index 00000000..d40deef0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/headband.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/heart_code.svg b/elements/pl-snap/Snap/Costumes/heart_code.svg new file mode 100644 index 00000000..3e74d326 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_code.svg @@ -0,0 +1,23 @@ + + + + + + + + +CODE IT + diff --git a/elements/pl-snap/Snap/Costumes/heart_face.svg b/elements/pl-snap/Snap/Costumes/heart_face.svg new file mode 100644 index 00000000..ed625534 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_face.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/heart_love_it.svg b/elements/pl-snap/Snap/Costumes/heart_love_it.svg new file mode 100644 index 00000000..dfaf1844 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_love_it.svg @@ -0,0 +1,16 @@ + + + + + + + + +LOVE IT + diff --git a/elements/pl-snap/Snap/Costumes/heart_purple.svg b/elements/pl-snap/Snap/Costumes/heart_purple.svg new file mode 100644 index 00000000..0860216a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_purple.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/heart_red.svg b/elements/pl-snap/Snap/Costumes/heart_red.svg new file mode 100644 index 00000000..f53decc7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_red.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/heart_smile.svg b/elements/pl-snap/Snap/Costumes/heart_smile.svg new file mode 100644 index 00000000..b2e44541 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_smile.svg @@ -0,0 +1,23 @@ + + + + + + + + +:-) + diff --git a/elements/pl-snap/Snap/Costumes/heart_sweet.svg b/elements/pl-snap/Snap/Costumes/heart_sweet.svg new file mode 100644 index 00000000..c0ac285c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/heart_sweet.svg @@ -0,0 +1,23 @@ + + + + + + + + +#SWEET + diff --git a/elements/pl-snap/Snap/Costumes/helicopter.png b/elements/pl-snap/Snap/Costumes/helicopter.png new file mode 100644 index 00000000..ddf0c7f2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/helicopter.png differ diff --git a/elements/pl-snap/Snap/Costumes/hippo1-a.svg b/elements/pl-snap/Snap/Costumes/hippo1-a.svg new file mode 100644 index 00000000..5985f004 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/hippo1-a.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/hippo1-b.svg b/elements/pl-snap/Snap/Costumes/hippo1-b.svg new file mode 100644 index 00000000..ddff1a61 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/hippo1-b.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/holly1.svg b/elements/pl-snap/Snap/Costumes/holly1.svg new file mode 100644 index 00000000..d30529cf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/holly1.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/holly2.svg b/elements/pl-snap/Snap/Costumes/holly2.svg new file mode 100644 index 00000000..43851918 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/holly2.svg @@ -0,0 +1,92 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/home_button.svg b/elements/pl-snap/Snap/Costumes/home_button.svg new file mode 100644 index 00000000..fa0ded44 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/home_button.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/horse1-a.svg b/elements/pl-snap/Snap/Costumes/horse1-a.svg new file mode 100644 index 00000000..709791ef --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/horse1-a.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/horse1-b.svg b/elements/pl-snap/Snap/Costumes/horse1-b.svg new file mode 100644 index 00000000..7ec6ec2c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/horse1-b.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/i-block.svg b/elements/pl-snap/Snap/Costumes/i-block.svg new file mode 100644 index 00000000..41c1ddbc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/i-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/j-block.svg b/elements/pl-snap/Snap/Costumes/j-block.svg new file mode 100644 index 00000000..cac844f3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/j-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/jahrd01.png b/elements/pl-snap/Snap/Costumes/jahrd01.png new file mode 100644 index 00000000..3f29289d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jahrd01.png differ diff --git a/elements/pl-snap/Snap/Costumes/jahrd02.png b/elements/pl-snap/Snap/Costumes/jahrd02.png new file mode 100644 index 00000000..ec1dd015 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jahrd02.png differ diff --git a/elements/pl-snap/Snap/Costumes/jahrd03.png b/elements/pl-snap/Snap/Costumes/jahrd03.png new file mode 100644 index 00000000..1791f5c9 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jahrd03.png differ diff --git a/elements/pl-snap/Snap/Costumes/jahrd04.png b/elements/pl-snap/Snap/Costumes/jahrd04.png new file mode 100644 index 00000000..a357b879 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jahrd04.png differ diff --git a/elements/pl-snap/Snap/Costumes/jahrd05.png b/elements/pl-snap/Snap/Costumes/jahrd05.png new file mode 100644 index 00000000..858bccfb Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jahrd05.png differ diff --git a/elements/pl-snap/Snap/Costumes/jahrd06.png b/elements/pl-snap/Snap/Costumes/jahrd06.png new file mode 100644 index 00000000..b5b71bd0 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jahrd06.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime-a.png b/elements/pl-snap/Snap/Costumes/jaime-a.png new file mode 100644 index 00000000..aceb86df Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime-b.png b/elements/pl-snap/Snap/Costumes/jaime-b.png new file mode 100644 index 00000000..1a5cfac1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime_walking-a.png b/elements/pl-snap/Snap/Costumes/jaime_walking-a.png new file mode 100644 index 00000000..7dd8ea0a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime_walking-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime_walking-b.png b/elements/pl-snap/Snap/Costumes/jaime_walking-b.png new file mode 100644 index 00000000..69de4340 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime_walking-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime_walking-c.png b/elements/pl-snap/Snap/Costumes/jaime_walking-c.png new file mode 100644 index 00000000..50911f03 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime_walking-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime_walking-d.png b/elements/pl-snap/Snap/Costumes/jaime_walking-d.png new file mode 100644 index 00000000..cc1ae6f2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime_walking-d.png differ diff --git a/elements/pl-snap/Snap/Costumes/jaime_walking-e.png b/elements/pl-snap/Snap/Costumes/jaime_walking-e.png new file mode 100644 index 00000000..5b38f187 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jaime_walking-e.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet01.png b/elements/pl-snap/Snap/Costumes/jamet01.png new file mode 100644 index 00000000..f4aed574 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet01.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet02.png b/elements/pl-snap/Snap/Costumes/jamet02.png new file mode 100644 index 00000000..e46666fd Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet02.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet03.png b/elements/pl-snap/Snap/Costumes/jamet03.png new file mode 100644 index 00000000..50331690 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet03.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet04.png b/elements/pl-snap/Snap/Costumes/jamet04.png new file mode 100644 index 00000000..2c43ab2f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet04.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet05.png b/elements/pl-snap/Snap/Costumes/jamet05.png new file mode 100644 index 00000000..fc3b353a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet05.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet06-wall.png b/elements/pl-snap/Snap/Costumes/jamet06-wall.png new file mode 100644 index 00000000..4a9bfbce Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet06-wall.png differ diff --git a/elements/pl-snap/Snap/Costumes/jamet06.png b/elements/pl-snap/Snap/Costumes/jamet06.png new file mode 100644 index 00000000..29e818a3 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jamet06.png differ diff --git a/elements/pl-snap/Snap/Costumes/jay.gif b/elements/pl-snap/Snap/Costumes/jay.gif new file mode 100644 index 00000000..a840af03 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jay.gif differ diff --git a/elements/pl-snap/Snap/Costumes/jeans-a.svg b/elements/pl-snap/Snap/Costumes/jeans-a.svg new file mode 100644 index 00000000..8c25481a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/jeans-a.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/jeans-b.svg b/elements/pl-snap/Snap/Costumes/jeans-b.svg new file mode 100644 index 00000000..3dbd9cd4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/jeans-b.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/jo_pop_L_arm.png new file mode 100644 index 00000000..fb289506 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/jo_pop_R_arm.png new file mode 100644 index 00000000..f3f5cb4f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_down.png b/elements/pl-snap/Snap/Costumes/jo_pop_down.png new file mode 100644 index 00000000..94e2ce41 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_down.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_front.png b/elements/pl-snap/Snap/Costumes/jo_pop_front.png new file mode 100644 index 00000000..3faa289f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_front.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_left.png b/elements/pl-snap/Snap/Costumes/jo_pop_left.png new file mode 100644 index 00000000..7d285dd9 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_left.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_right.png b/elements/pl-snap/Snap/Costumes/jo_pop_right.png new file mode 100644 index 00000000..bba1c85c Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_right.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_pop_stand.png b/elements/pl-snap/Snap/Costumes/jo_pop_stand.png new file mode 100644 index 00000000..9afdffcd Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_pop_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_stance.png b/elements/pl-snap/Snap/Costumes/jo_stance.png new file mode 100644 index 00000000..cc4dc0d2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_stance.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_top_L_cross.png b/elements/pl-snap/Snap/Costumes/jo_top_L_cross.png new file mode 100644 index 00000000..57f12f4d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_top_L_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_top_L_leg.png b/elements/pl-snap/Snap/Costumes/jo_top_L_leg.png new file mode 100644 index 00000000..9d1a7f1d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_top_L_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_top_R_cross.png b/elements/pl-snap/Snap/Costumes/jo_top_R_cross.png new file mode 100644 index 00000000..87fc335d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_top_R_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_top_R_leg.png b/elements/pl-snap/Snap/Costumes/jo_top_R_leg.png new file mode 100644 index 00000000..3ecaba25 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_top_R_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/jo_top_stand.png b/elements/pl-snap/Snap/Costumes/jo_top_stand.png new file mode 100644 index 00000000..dd6724f2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jo_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/jodi.gif b/elements/pl-snap/Snap/Costumes/jodi.gif new file mode 100644 index 00000000..319906e3 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/jodi.gif differ diff --git a/elements/pl-snap/Snap/Costumes/k-block.svg b/elements/pl-snap/Snap/Costumes/k-block.svg new file mode 100644 index 00000000..5f592b48 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/k-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/kai-a.png b/elements/pl-snap/Snap/Costumes/kai-a.png new file mode 100644 index 00000000..ad0d8b9d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/kai-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/kai-b.png b/elements/pl-snap/Snap/Costumes/kai-b.png new file mode 100644 index 00000000..7074bf5a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/kai-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/key.svg b/elements/pl-snap/Snap/Costumes/key.svg new file mode 100644 index 00000000..49a47ebf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/key.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/keyboard-a.svg b/elements/pl-snap/Snap/Costumes/keyboard-a.svg new file mode 100644 index 00000000..9d53e4b7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/keyboard-a.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/keyboard-b.svg b/elements/pl-snap/Snap/Costumes/keyboard-b.svg new file mode 100644 index 00000000..59d7dafb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/keyboard-b.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/keyboard-c.svg b/elements/pl-snap/Snap/Costumes/keyboard-c.svg new file mode 100644 index 00000000..dad36104 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/keyboard-c.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/keyboard-d.svg b/elements/pl-snap/Snap/Costumes/keyboard-d.svg new file mode 100644 index 00000000..7601e39d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/keyboard-d.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/khalid-a.png b/elements/pl-snap/Snap/Costumes/khalid-a.png new file mode 100644 index 00000000..5a2da972 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/khalid-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/khalid-c.png b/elements/pl-snap/Snap/Costumes/khalid-c.png new file mode 100644 index 00000000..acc2af57 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/khalid-c.png differ diff --git a/elements/pl-snap/Snap/Costumes/khalid-d.png b/elements/pl-snap/Snap/Costumes/khalid-d.png new file mode 100644 index 00000000..46ab87a4 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/khalid-d.png differ diff --git a/elements/pl-snap/Snap/Costumes/knight.svg b/elements/pl-snap/Snap/Costumes/knight.svg new file mode 100644 index 00000000..433140f4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/knight.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/l-block.svg b/elements/pl-snap/Snap/Costumes/l-block.svg new file mode 100644 index 00000000..78f7befe --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/l-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ladybug2-a.svg b/elements/pl-snap/Snap/Costumes/ladybug2-a.svg new file mode 100644 index 00000000..5e2034bb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ladybug2-a.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ladybug2-b.svg b/elements/pl-snap/Snap/Costumes/ladybug2-b.svg new file mode 100644 index 00000000..05d51bc9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ladybug2-b.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ladybug2.svg b/elements/pl-snap/Snap/Costumes/ladybug2.svg new file mode 100644 index 00000000..eb6cf4bb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ladybug2.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/lamp.png b/elements/pl-snap/Snap/Costumes/lamp.png new file mode 100644 index 00000000..81d8fe04 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lamp.png differ diff --git a/elements/pl-snap/Snap/Costumes/laptop.svg b/elements/pl-snap/Snap/Costumes/laptop.svg new file mode 100644 index 00000000..e4dc45ce --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/laptop.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/lb_pop_L_arm.png new file mode 100644 index 00000000..5adebeac Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/lb_pop_R_arm.png new file mode 100644 index 00000000..1aac5fef Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_down.png b/elements/pl-snap/Snap/Costumes/lb_pop_down.png new file mode 100644 index 00000000..a3536e08 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_down.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_front.png b/elements/pl-snap/Snap/Costumes/lb_pop_front.png new file mode 100644 index 00000000..33536424 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_front.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_left.png b/elements/pl-snap/Snap/Costumes/lb_pop_left.png new file mode 100644 index 00000000..43368636 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_left.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_right.png b/elements/pl-snap/Snap/Costumes/lb_pop_right.png new file mode 100644 index 00000000..26f16406 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_right.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_pop_stand.png b/elements/pl-snap/Snap/Costumes/lb_pop_stand.png new file mode 100644 index 00000000..5cca5652 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_pop_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_stance.png b/elements/pl-snap/Snap/Costumes/lb_stance.png new file mode 100644 index 00000000..3e1e0331 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_stance.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_top_L_cross.png b/elements/pl-snap/Snap/Costumes/lb_top_L_cross.png new file mode 100644 index 00000000..279839a3 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_top_L_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_top_L_leg.png b/elements/pl-snap/Snap/Costumes/lb_top_L_leg.png new file mode 100644 index 00000000..9b01a622 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_top_L_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_top_R_cross.png b/elements/pl-snap/Snap/Costumes/lb_top_R_cross.png new file mode 100644 index 00000000..c31839cd Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_top_R_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_top_R_leg.png b/elements/pl-snap/Snap/Costumes/lb_top_R_leg.png new file mode 100644 index 00000000..1c7087c6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_top_R_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/lb_top_stand.png b/elements/pl-snap/Snap/Costumes/lb_top_stand.png new file mode 100644 index 00000000..b7a00a79 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lb_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/lightning.svg b/elements/pl-snap/Snap/Costumes/lightning.svg new file mode 100644 index 00000000..31749406 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/lightning.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/lion-a.svg b/elements/pl-snap/Snap/Costumes/lion-a.svg new file mode 100644 index 00000000..043b4ef8 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/lion-a.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/lion-b.svg b/elements/pl-snap/Snap/Costumes/lion-b.svg new file mode 100644 index 00000000..49fb4b88 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/lion-b.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/lioness.svg b/elements/pl-snap/Snap/Costumes/lioness.svg new file mode 100644 index 00000000..ad979621 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/lioness.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/lirin01.png b/elements/pl-snap/Snap/Costumes/lirin01.png new file mode 100644 index 00000000..6e43d31a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lirin01.png differ diff --git a/elements/pl-snap/Snap/Costumes/lirin02.png b/elements/pl-snap/Snap/Costumes/lirin02.png new file mode 100644 index 00000000..025f23a0 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lirin02.png differ diff --git a/elements/pl-snap/Snap/Costumes/lirin03.png b/elements/pl-snap/Snap/Costumes/lirin03.png new file mode 100644 index 00000000..2857da27 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lirin03.png differ diff --git a/elements/pl-snap/Snap/Costumes/lirin04.png b/elements/pl-snap/Snap/Costumes/lirin04.png new file mode 100644 index 00000000..79063530 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lirin04.png differ diff --git a/elements/pl-snap/Snap/Costumes/lirin05.png b/elements/pl-snap/Snap/Costumes/lirin05.png new file mode 100644 index 00000000..5fc03eb0 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lirin05.png differ diff --git a/elements/pl-snap/Snap/Costumes/lirin06.png b/elements/pl-snap/Snap/Costumes/lirin06.png new file mode 100644 index 00000000..d6417bbc Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lirin06.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz01.png b/elements/pl-snap/Snap/Costumes/lorenz01.png new file mode 100644 index 00000000..815e9228 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz01.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz02.png b/elements/pl-snap/Snap/Costumes/lorenz02.png new file mode 100644 index 00000000..e4273a96 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz02.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz03.png b/elements/pl-snap/Snap/Costumes/lorenz03.png new file mode 100644 index 00000000..e7d8bf28 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz03.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz04.png b/elements/pl-snap/Snap/Costumes/lorenz04.png new file mode 100644 index 00000000..d0776033 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz04.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz05.png b/elements/pl-snap/Snap/Costumes/lorenz05.png new file mode 100644 index 00000000..f4523398 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz05.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz06.png b/elements/pl-snap/Snap/Costumes/lorenz06.png new file mode 100644 index 00000000..703a1fbd Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz06.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz07.png b/elements/pl-snap/Snap/Costumes/lorenz07.png new file mode 100644 index 00000000..481ba7ce Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz07.png differ diff --git a/elements/pl-snap/Snap/Costumes/lorenz07b.png b/elements/pl-snap/Snap/Costumes/lorenz07b.png new file mode 100644 index 00000000..b9c267d2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/lorenz07b.png differ diff --git a/elements/pl-snap/Snap/Costumes/m-block.svg b/elements/pl-snap/Snap/Costumes/m-block.svg new file mode 100644 index 00000000..57036b33 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/m-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/magiccarpet.png b/elements/pl-snap/Snap/Costumes/magiccarpet.png new file mode 100644 index 00000000..14a01eeb Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/magiccarpet.png differ diff --git a/elements/pl-snap/Snap/Costumes/magicwand.svg b/elements/pl-snap/Snap/Costumes/magicwand.svg new file mode 100644 index 00000000..540ce0de --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/magicwand.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/marble-building.png b/elements/pl-snap/Snap/Costumes/marble-building.png new file mode 100644 index 00000000..40e23b2b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/marble-building.png differ diff --git a/elements/pl-snap/Snap/Costumes/marissa-crouching.gif b/elements/pl-snap/Snap/Costumes/marissa-crouching.gif new file mode 100644 index 00000000..7bbf4b0a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/marissa-crouching.gif differ diff --git a/elements/pl-snap/Snap/Costumes/marissa-sitting.gif b/elements/pl-snap/Snap/Costumes/marissa-sitting.gif new file mode 100644 index 00000000..500ce975 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/marissa-sitting.gif differ diff --git a/elements/pl-snap/Snap/Costumes/marissa.gif b/elements/pl-snap/Snap/Costumes/marissa.gif new file mode 100644 index 00000000..bdebc846 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/marissa.gif differ diff --git a/elements/pl-snap/Snap/Costumes/maya.png b/elements/pl-snap/Snap/Costumes/maya.png new file mode 100644 index 00000000..c74d0b59 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/maya.png differ diff --git a/elements/pl-snap/Snap/Costumes/microphone.svg b/elements/pl-snap/Snap/Costumes/microphone.svg new file mode 100644 index 00000000..3bef9ce0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/microphone.svg @@ -0,0 +1,115 @@ + + + + microphone-a + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/microphonestand.svg b/elements/pl-snap/Snap/Costumes/microphonestand.svg new file mode 100644 index 00000000..ce23b76b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/microphonestand.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/monkey1-a.svg b/elements/pl-snap/Snap/Costumes/monkey1-a.svg new file mode 100644 index 00000000..845a420c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/monkey1-a.svg @@ -0,0 +1,243 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/monkey1-b.svg b/elements/pl-snap/Snap/Costumes/monkey1-b.svg new file mode 100644 index 00000000..be73ee32 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/monkey1-b.svg @@ -0,0 +1,246 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/monkey2-a.svg b/elements/pl-snap/Snap/Costumes/monkey2-a.svg new file mode 100644 index 00000000..a32cc7a1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/monkey2-a.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/monkey2-b.svg b/elements/pl-snap/Snap/Costumes/monkey2-b.svg new file mode 100644 index 00000000..327c5c88 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/monkey2-b.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/monkey2-c.svg b/elements/pl-snap/Snap/Costumes/monkey2-c.svg new file mode 100644 index 00000000..558f068b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/monkey2-c.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/mori.png b/elements/pl-snap/Snap/Costumes/mori.png new file mode 100644 index 00000000..03ff858b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/mori.png differ diff --git a/elements/pl-snap/Snap/Costumes/mouse1-a.svg b/elements/pl-snap/Snap/Costumes/mouse1-a.svg new file mode 100644 index 00000000..30f8ea5e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/mouse1-a.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/mouse1-b.svg b/elements/pl-snap/Snap/Costumes/mouse1-b.svg new file mode 100644 index 00000000..51390b6a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/mouse1-b.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/muffin-a.svg b/elements/pl-snap/Snap/Costumes/muffin-a.svg new file mode 100644 index 00000000..ad7b7a78 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/muffin-a.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/muffin-b.svg b/elements/pl-snap/Snap/Costumes/muffin-b.svg new file mode 100644 index 00000000..2e189a23 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/muffin-b.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/n-block.svg b/elements/pl-snap/Snap/Costumes/n-block.svg new file mode 100644 index 00000000..771178e1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/n-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/o-block.svg b/elements/pl-snap/Snap/Costumes/o-block.svg new file mode 100644 index 00000000..924b1113 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/o-block.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/octopus-a.svg b/elements/pl-snap/Snap/Costumes/octopus-a.svg new file mode 100644 index 00000000..96b93b3c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/octopus-a.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/octopus-b.svg b/elements/pl-snap/Snap/Costumes/octopus-b.svg new file mode 100644 index 00000000..e55226cf --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/octopus-b.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/orange.svg b/elements/pl-snap/Snap/Costumes/orange.svg new file mode 100644 index 00000000..7d162d41 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/orange.svg @@ -0,0 +1,236 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/orange2-a.svg b/elements/pl-snap/Snap/Costumes/orange2-a.svg new file mode 100644 index 00000000..e288836c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/orange2-a.svg @@ -0,0 +1,113 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/orange2-b.svg b/elements/pl-snap/Snap/Costumes/orange2-b.svg new file mode 100644 index 00000000..dfa35c54 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/orange2-b.svg @@ -0,0 +1,138 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/orange2-c.svg b/elements/pl-snap/Snap/Costumes/orange2-c.svg new file mode 100644 index 00000000..78ecbc6b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/orange2-c.svg @@ -0,0 +1,185 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/p-block.svg b/elements/pl-snap/Snap/Costumes/p-block.svg new file mode 100644 index 00000000..3de8e58d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/p-block.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/paddle.svg b/elements/pl-snap/Snap/Costumes/paddle.svg new file mode 100644 index 00000000..bbd3370e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/paddle.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/palmtree.gif b/elements/pl-snap/Snap/Costumes/palmtree.gif new file mode 100644 index 00000000..0c7e2faa Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/palmtree.gif differ diff --git a/elements/pl-snap/Snap/Costumes/parrot-a.svg b/elements/pl-snap/Snap/Costumes/parrot-a.svg new file mode 100644 index 00000000..ba687b44 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/parrot-a.svg @@ -0,0 +1,127 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/parrot-b.svg b/elements/pl-snap/Snap/Costumes/parrot-b.svg new file mode 100644 index 00000000..1edd1b08 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/parrot-b.svg @@ -0,0 +1,129 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/parrot2-a.svg b/elements/pl-snap/Snap/Costumes/parrot2-a.svg new file mode 100644 index 00000000..bcd78578 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/parrot2-a.svg @@ -0,0 +1,152 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/parrot2-b.svg b/elements/pl-snap/Snap/Costumes/parrot2-b.svg new file mode 100644 index 00000000..b0e0b936 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/parrot2-b.svg @@ -0,0 +1,135 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/partyhat1.svg b/elements/pl-snap/Snap/Costumes/partyhat1.svg new file mode 100644 index 00000000..086b1d26 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/partyhat1.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/paul.gif b/elements/pl-snap/Snap/Costumes/paul.gif new file mode 100644 index 00000000..f560254d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/paul.gif differ diff --git a/elements/pl-snap/Snap/Costumes/pencil-a.svg b/elements/pl-snap/Snap/Costumes/pencil-a.svg new file mode 100644 index 00000000..0b7d70f4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/pencil-a.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/pencil-b.svg b/elements/pl-snap/Snap/Costumes/pencil-b.svg new file mode 100644 index 00000000..bb60f9f1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/pencil-b.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin1.svg b/elements/pl-snap/Snap/Costumes/penguin1.svg new file mode 100644 index 00000000..c4f38a1d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin1.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin1_talk-a.svg b/elements/pl-snap/Snap/Costumes/penguin1_talk-a.svg new file mode 100644 index 00000000..bd87ba4d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin1_talk-a.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin1_talk-b.svg b/elements/pl-snap/Snap/Costumes/penguin1_talk-b.svg new file mode 100644 index 00000000..b0160039 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin1_talk-b.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin2.svg b/elements/pl-snap/Snap/Costumes/penguin2.svg new file mode 100644 index 00000000..06a42b77 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin2.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin2_talk-a.svg b/elements/pl-snap/Snap/Costumes/penguin2_talk-a.svg new file mode 100644 index 00000000..ff8b89b7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin2_talk-a.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin2_talk-b.svg b/elements/pl-snap/Snap/Costumes/penguin2_talk-b.svg new file mode 100644 index 00000000..8a9d1417 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin2_talk-b.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin3-a.svg b/elements/pl-snap/Snap/Costumes/penguin3-a.svg new file mode 100644 index 00000000..739ad82e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin3-a.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin3-b.svg b/elements/pl-snap/Snap/Costumes/penguin3-b.svg new file mode 100644 index 00000000..76f566a0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin3-b.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/penguin3-c.svg b/elements/pl-snap/Snap/Costumes/penguin3-c.svg new file mode 100644 index 00000000..46c9f754 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/penguin3-c.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/piano.svg b/elements/pl-snap/Snap/Costumes/piano.svg new file mode 100644 index 00000000..349cb14e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/piano.svg @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/planet2.svg b/elements/pl-snap/Snap/Costumes/planet2.svg new file mode 100644 index 00000000..0b9f2f4a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/planet2.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/prince.svg b/elements/pl-snap/Snap/Costumes/prince.svg new file mode 100644 index 00000000..3d242d52 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/prince.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/princess.svg b/elements/pl-snap/Snap/Costumes/princess.svg new file mode 100644 index 00000000..528b12a2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/princess.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/q-block.svg b/elements/pl-snap/Snap/Costumes/q-block.svg new file mode 100644 index 00000000..4ea89563 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/q-block.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/r-block.svg b/elements/pl-snap/Snap/Costumes/r-block.svg new file mode 100644 index 00000000..fa3ac1b4 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/r-block.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/rainbow.svg b/elements/pl-snap/Snap/Costumes/rainbow.svg new file mode 100644 index 00000000..ed4ffb01 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/rainbow.svg @@ -0,0 +1,168 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/referee.gif b/elements/pl-snap/Snap/Costumes/referee.gif new file mode 100644 index 00000000..20cff860 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/referee.gif differ diff --git a/elements/pl-snap/Snap/Costumes/reindeer.svg b/elements/pl-snap/Snap/Costumes/reindeer.svg new file mode 100644 index 00000000..bdfc0121 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/reindeer.svg @@ -0,0 +1,167 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/robot1.svg b/elements/pl-snap/Snap/Costumes/robot1.svg new file mode 100644 index 00000000..84e7b8da --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/robot1.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/rocks.svg b/elements/pl-snap/Snap/Costumes/rocks.svg new file mode 100644 index 00000000..f85fe9f9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/rocks.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/rory.png b/elements/pl-snap/Snap/Costumes/rory.png new file mode 100644 index 00000000..a0841c0b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/rory.png differ diff --git a/elements/pl-snap/Snap/Costumes/ruby-a.png b/elements/pl-snap/Snap/Costumes/ruby-a.png new file mode 100644 index 00000000..af48ceec Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/ruby-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/ruby-b.png b/elements/pl-snap/Snap/Costumes/ruby-b.png new file mode 100644 index 00000000..609b88a1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/ruby-b.png differ diff --git a/elements/pl-snap/Snap/Costumes/s-block.svg b/elements/pl-snap/Snap/Costumes/s-block.svg new file mode 100644 index 00000000..e16c95d2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/s-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/sail-boat.png b/elements/pl-snap/Snap/Costumes/sail-boat.png new file mode 100644 index 00000000..abcbc8b6 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sail-boat.png differ diff --git a/elements/pl-snap/Snap/Costumes/sam.gif b/elements/pl-snap/Snap/Costumes/sam.gif new file mode 100644 index 00000000..6f5cfe8b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sam.gif differ diff --git a/elements/pl-snap/Snap/Costumes/sarron01.png b/elements/pl-snap/Snap/Costumes/sarron01.png new file mode 100644 index 00000000..229b2c96 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sarron01.png differ diff --git a/elements/pl-snap/Snap/Costumes/sarron02.png b/elements/pl-snap/Snap/Costumes/sarron02.png new file mode 100644 index 00000000..2d5bf383 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sarron02.png differ diff --git a/elements/pl-snap/Snap/Costumes/sarron03.png b/elements/pl-snap/Snap/Costumes/sarron03.png new file mode 100644 index 00000000..c03d4dad Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sarron03.png differ diff --git a/elements/pl-snap/Snap/Costumes/sarron04.png b/elements/pl-snap/Snap/Costumes/sarron04.png new file mode 100644 index 00000000..7f890897 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sarron04.png differ diff --git a/elements/pl-snap/Snap/Costumes/sarron05.png b/elements/pl-snap/Snap/Costumes/sarron05.png new file mode 100644 index 00000000..3fcc7aa0 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sarron05.png differ diff --git a/elements/pl-snap/Snap/Costumes/sarron06.png b/elements/pl-snap/Snap/Costumes/sarron06.png new file mode 100644 index 00000000..60b95698 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sarron06.png differ diff --git a/elements/pl-snap/Snap/Costumes/saxophone-a.svg b/elements/pl-snap/Snap/Costumes/saxophone-a.svg new file mode 100644 index 00000000..42487ae5 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/saxophone-a.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/saxophone-b.svg b/elements/pl-snap/Snap/Costumes/saxophone-b.svg new file mode 100644 index 00000000..13d65b40 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/saxophone-b.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/scarf1.svg b/elements/pl-snap/Snap/Costumes/scarf1.svg new file mode 100644 index 00000000..74277ea2 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/scarf1.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/scarf2.svg b/elements/pl-snap/Snap/Costumes/scarf2.svg new file mode 100644 index 00000000..2757756d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/scarf2.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shark-a_.svg b/elements/pl-snap/Snap/Costumes/shark-a_.svg new file mode 100644 index 00000000..b6f5c024 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shark-a_.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shark-b_.svg b/elements/pl-snap/Snap/Costumes/shark-b_.svg new file mode 100644 index 00000000..c000dac7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shark-b_.svg @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shark-c_.svg b/elements/pl-snap/Snap/Costumes/shark-c_.svg new file mode 100644 index 00000000..35170dd8 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shark-c_.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt-a.svg b/elements/pl-snap/Snap/Costumes/shirt-a.svg new file mode 100644 index 00000000..fe2e3a5d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt-a.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt-b.svg b/elements/pl-snap/Snap/Costumes/shirt-b.svg new file mode 100644 index 00000000..2029a842 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt-b.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt2-a.svg b/elements/pl-snap/Snap/Costumes/shirt2-a.svg new file mode 100644 index 00000000..0656523f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt2-a.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt2-a2.svg b/elements/pl-snap/Snap/Costumes/shirt2-a2.svg new file mode 100644 index 00000000..451ef31a --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt2-a2.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt_blouse.svg b/elements/pl-snap/Snap/Costumes/shirt_blouse.svg new file mode 100644 index 00000000..ea517b61 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt_blouse.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt_collar-a.svg b/elements/pl-snap/Snap/Costumes/shirt_collar-a.svg new file mode 100644 index 00000000..0daccc47 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt_collar-a.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt_collar-b.svg b/elements/pl-snap/Snap/Costumes/shirt_collar-b.svg new file mode 100644 index 00000000..ff98befa --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt_collar-b.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shirt_collar-c.svg b/elements/pl-snap/Snap/Costumes/shirt_collar-c.svg new file mode 100644 index 00000000..1d418a4b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shirt_collar-c.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shoes1.svg b/elements/pl-snap/Snap/Costumes/shoes1.svg new file mode 100644 index 00000000..eceb8243 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shoes1.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/shoes2.svg b/elements/pl-snap/Snap/Costumes/shoes2.svg new file mode 100644 index 00000000..ce9a483d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/shoes2.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/skates.svg b/elements/pl-snap/Snap/Costumes/skates.svg new file mode 100644 index 00000000..0a3d543d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/skates.svg @@ -0,0 +1,218 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/sl_pop_L_arm.png b/elements/pl-snap/Snap/Costumes/sl_pop_L_arm.png new file mode 100644 index 00000000..0f773b4a Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_pop_L_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_pop_R_arm.png b/elements/pl-snap/Snap/Costumes/sl_pop_R_arm.png new file mode 100644 index 00000000..4dce2bfc Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_pop_R_arm.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_top_L_cross.png b/elements/pl-snap/Snap/Costumes/sl_top_L_cross.png new file mode 100644 index 00000000..39bb244f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_top_L_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_top_L_leg.png b/elements/pl-snap/Snap/Costumes/sl_top_L_leg.png new file mode 100644 index 00000000..64c6f880 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_top_L_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_top_R_cross.png b/elements/pl-snap/Snap/Costumes/sl_top_R_cross.png new file mode 100644 index 00000000..f8e6b5ff Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_top_R_cross.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_top_R_leg.png b/elements/pl-snap/Snap/Costumes/sl_top_R_leg.png new file mode 100644 index 00000000..604c97b2 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_top_R_leg.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_top_ready.png b/elements/pl-snap/Snap/Costumes/sl_top_ready.png new file mode 100644 index 00000000..d6e03c9e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_top_ready.png differ diff --git a/elements/pl-snap/Snap/Costumes/sl_top_stand.png b/elements/pl-snap/Snap/Costumes/sl_top_stand.png new file mode 100644 index 00000000..18da8cf4 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/sl_top_stand.png differ diff --git a/elements/pl-snap/Snap/Costumes/snowflake.svg b/elements/pl-snap/Snap/Costumes/snowflake.svg new file mode 100644 index 00000000..6e95dfc3 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/snowflake.svg @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/snowman.svg b/elements/pl-snap/Snap/Costumes/snowman.svg new file mode 100644 index 00000000..9b7ccf8e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/snowman.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/spaceship-a.svg b/elements/pl-snap/Snap/Costumes/spaceship-a.svg new file mode 100644 index 00000000..34732cd0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/spaceship-a.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/spaceship-b.svg b/elements/pl-snap/Snap/Costumes/spaceship-b.svg new file mode 100644 index 00000000..31e3f22f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/spaceship-b.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/speaker.svg b/elements/pl-snap/Snap/Costumes/speaker.svg new file mode 100644 index 00000000..ec9ecffb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/speaker.svg @@ -0,0 +1,110 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/squirrel1.png b/elements/pl-snap/Snap/Costumes/squirrel1.png new file mode 100644 index 00000000..755c42a1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/squirrel1.png differ diff --git a/elements/pl-snap/Snap/Costumes/star1.svg b/elements/pl-snap/Snap/Costumes/star1.svg new file mode 100644 index 00000000..dd6b4cc7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/star1.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/star2.svg b/elements/pl-snap/Snap/Costumes/star2.svg new file mode 100644 index 00000000..0e0ee9a6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/star2.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/star3-a.svg b/elements/pl-snap/Snap/Costumes/star3-a.svg new file mode 100644 index 00000000..cbfca4d7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/star3-a.svg @@ -0,0 +1,72 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/star3-b.svg b/elements/pl-snap/Snap/Costumes/star3-b.svg new file mode 100644 index 00000000..5b863568 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/star3-b.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/starfish-a.svg b/elements/pl-snap/Snap/Costumes/starfish-a.svg new file mode 100644 index 00000000..35ac80a9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/starfish-a.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/starfish-b_.svg b/elements/pl-snap/Snap/Costumes/starfish-b_.svg new file mode 100644 index 00000000..a655a164 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/starfish-b_.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/stop.svg b/elements/pl-snap/Snap/Costumes/stop.svg new file mode 100644 index 00000000..412f12a1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/stop.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/street-cleaner-mit.png b/elements/pl-snap/Snap/Costumes/street-cleaner-mit.png new file mode 100644 index 00000000..827a92b5 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/street-cleaner-mit.png differ diff --git a/elements/pl-snap/Snap/Costumes/sun.svg b/elements/pl-snap/Snap/Costumes/sun.svg new file mode 100644 index 00000000..b582d65e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/sun.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/sunglasses1.svg b/elements/pl-snap/Snap/Costumes/sunglasses1.svg new file mode 100644 index 00000000..b54a0ee0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/sunglasses1.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/sunglasses2.svg b/elements/pl-snap/Snap/Costumes/sunglasses2.svg new file mode 100644 index 00000000..88e69d83 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/sunglasses2.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/t-block.svg b/elements/pl-snap/Snap/Costumes/t-block.svg new file mode 100644 index 00000000..ea2ca49e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/t-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/tabla-a.svg b/elements/pl-snap/Snap/Costumes/tabla-a.svg new file mode 100644 index 00000000..5f00c41c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/tabla-a.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/tabla-b.svg b/elements/pl-snap/Snap/Costumes/tabla-b.svg new file mode 100644 index 00000000..569bbbf6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/tabla-b.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/taco-a.svg b/elements/pl-snap/Snap/Costumes/taco-a.svg new file mode 100644 index 00000000..815634c9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/taco-a.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/taco-b.svg b/elements/pl-snap/Snap/Costumes/taco-b.svg new file mode 100644 index 00000000..983d5d1f --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/taco-b.svg @@ -0,0 +1,241 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/tennisball.png b/elements/pl-snap/Snap/Costumes/tennisball.png new file mode 100644 index 00000000..2672eede Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/tennisball.png differ diff --git a/elements/pl-snap/Snap/Costumes/text Halloween.svg b/elements/pl-snap/Snap/Costumes/text Halloween.svg new file mode 100644 index 00000000..af681b69 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/text Halloween.svg @@ -0,0 +1,5 @@ + + + + Happy Halloween! + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/text awesome.svg b/elements/pl-snap/Snap/Costumes/text awesome.svg new file mode 100644 index 00000000..ea2269be --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/text awesome.svg @@ -0,0 +1,5 @@ + + + + Awesome! + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/text_Halloween.svg b/elements/pl-snap/Snap/Costumes/text_Halloween.svg new file mode 100644 index 00000000..af681b69 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/text_Halloween.svg @@ -0,0 +1,5 @@ + + + + Happy Halloween! + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/text_awesome.svg b/elements/pl-snap/Snap/Costumes/text_awesome.svg new file mode 100644 index 00000000..ea2269be --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/text_awesome.svg @@ -0,0 +1,5 @@ + + + + Awesome! + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/trampoline.png b/elements/pl-snap/Snap/Costumes/trampoline.png new file mode 100644 index 00000000..e1cd076b Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/trampoline.png differ diff --git a/elements/pl-snap/Snap/Costumes/tree-lights-a.svg b/elements/pl-snap/Snap/Costumes/tree-lights-a.svg new file mode 100644 index 00000000..adc774ac --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/tree-lights-a.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/tree-lights-b.svg b/elements/pl-snap/Snap/Costumes/tree-lights-b.svg new file mode 100644 index 00000000..1621b224 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/tree-lights-b.svg @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/tree1.svg b/elements/pl-snap/Snap/Costumes/tree1.svg new file mode 100644 index 00000000..c0f560e1 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/tree1.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/tree2.svg b/elements/pl-snap/Snap/Costumes/tree2.svg new file mode 100644 index 00000000..b4363952 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/tree2.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/trees-a.svg b/elements/pl-snap/Snap/Costumes/trees-a.svg new file mode 100644 index 00000000..61343fc6 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/trees-a.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/trees-b.svg b/elements/pl-snap/Snap/Costumes/trees-b.svg new file mode 100644 index 00000000..20efff2b --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/trees-b.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/trombone-a.svg b/elements/pl-snap/Snap/Costumes/trombone-a.svg new file mode 100644 index 00000000..4849721c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/trombone-a.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/trombone-b.svg b/elements/pl-snap/Snap/Costumes/trombone-b.svg new file mode 100644 index 00000000..aae28314 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/trombone-b.svg @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/trumpet-a.svg b/elements/pl-snap/Snap/Costumes/trumpet-a.svg new file mode 100644 index 00000000..2bb175fb --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/trumpet-a.svg @@ -0,0 +1,140 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/trumpet-a2.svg b/elements/pl-snap/Snap/Costumes/trumpet-a2.svg new file mode 100644 index 00000000..54204bfc --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/trumpet-a2.svg @@ -0,0 +1,166 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/Costumes/turtle01_colour.png b/elements/pl-snap/Snap/Costumes/turtle01_colour.png new file mode 100644 index 00000000..324f4fd1 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/turtle01_colour.png differ diff --git a/elements/pl-snap/Snap/Costumes/turtle02_colour_resized.png b/elements/pl-snap/Snap/Costumes/turtle02_colour_resized.png new file mode 100644 index 00000000..3e24022f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/turtle02_colour_resized.png differ diff --git a/elements/pl-snap/Snap/Costumes/turtle03.png b/elements/pl-snap/Snap/Costumes/turtle03.png new file mode 100644 index 00000000..4118583e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/turtle03.png differ diff --git a/elements/pl-snap/Snap/Costumes/turtle04.png b/elements/pl-snap/Snap/Costumes/turtle04.png new file mode 100644 index 00000000..57485f01 Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/turtle04.png differ diff --git a/elements/pl-snap/Snap/Costumes/turtle05.png b/elements/pl-snap/Snap/Costumes/turtle05.png new file mode 100644 index 00000000..2f46370f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/turtle05.png differ diff --git a/elements/pl-snap/Snap/Costumes/turtle06.png b/elements/pl-snap/Snap/Costumes/turtle06.png new file mode 100644 index 00000000..505f186d Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/turtle06.png differ diff --git a/elements/pl-snap/Snap/Costumes/u-block.svg b/elements/pl-snap/Snap/Costumes/u-block.svg new file mode 100644 index 00000000..5d021a74 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/u-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/ukulele.svg b/elements/pl-snap/Snap/Costumes/ukulele.svg new file mode 100644 index 00000000..b9decbe0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/ukulele.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/umbrella.png b/elements/pl-snap/Snap/Costumes/umbrella.png new file mode 100644 index 00000000..fd3ca70f Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/umbrella.png differ diff --git a/elements/pl-snap/Snap/Costumes/unicorn.svg b/elements/pl-snap/Snap/Costumes/unicorn.svg new file mode 100644 index 00000000..9d919de7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/unicorn.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/unicorn1.png b/elements/pl-snap/Snap/Costumes/unicorn1.png new file mode 100644 index 00000000..eb3b870e Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/unicorn1.png differ diff --git a/elements/pl-snap/Snap/Costumes/v-block.svg b/elements/pl-snap/Snap/Costumes/v-block.svg new file mode 100644 index 00000000..e037b535 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/v-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/vest-a.svg b/elements/pl-snap/Snap/Costumes/vest-a.svg new file mode 100644 index 00000000..b45e4bb9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/vest-a.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/vest-b.svg b/elements/pl-snap/Snap/Costumes/vest-b.svg new file mode 100644 index 00000000..969a94ef --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/vest-b.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/w-block.svg b/elements/pl-snap/Snap/Costumes/w-block.svg new file mode 100644 index 00000000..c16e6c3e --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/w-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/wanda.svg b/elements/pl-snap/Snap/Costumes/wanda.svg new file mode 100644 index 00000000..8d2cdf00 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/wanda.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/watermelon-a.svg b/elements/pl-snap/Snap/Costumes/watermelon-a.svg new file mode 100644 index 00000000..78d435e9 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/watermelon-a.svg @@ -0,0 +1,20 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/watermelon-b.svg b/elements/pl-snap/Snap/Costumes/watermelon-b.svg new file mode 100644 index 00000000..2233d29c --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/watermelon-b.svg @@ -0,0 +1,36 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/watermelon-c.svg b/elements/pl-snap/Snap/Costumes/watermelon-c.svg new file mode 100644 index 00000000..f52f4df0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/watermelon-c.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/witch.svg b/elements/pl-snap/Snap/Costumes/witch.svg new file mode 100644 index 00000000..cdcf9a1d --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/witch.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/wizard.svg b/elements/pl-snap/Snap/Costumes/wizard.svg new file mode 100644 index 00000000..9ad00ae0 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/wizard.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/wizard1.svg b/elements/pl-snap/Snap/Costumes/wizard1.svg new file mode 100644 index 00000000..9d4740df --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/wizard1.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/wizard2.svg b/elements/pl-snap/Snap/Costumes/wizard2.svg new file mode 100644 index 00000000..08f1b782 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/wizard2.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/x-block.svg b/elements/pl-snap/Snap/Costumes/x-block.svg new file mode 100644 index 00000000..bcdc2de7 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/x-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/y-block.svg b/elements/pl-snap/Snap/Costumes/y-block.svg new file mode 100644 index 00000000..eb73b132 --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/y-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/z-block.svg b/elements/pl-snap/Snap/Costumes/z-block.svg new file mode 100644 index 00000000..ff3dddfe --- /dev/null +++ b/elements/pl-snap/Snap/Costumes/z-block.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/elements/pl-snap/Snap/Costumes/zara-a.png b/elements/pl-snap/Snap/Costumes/zara-a.png new file mode 100644 index 00000000..f5da335c Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/zara-a.png differ diff --git a/elements/pl-snap/Snap/Costumes/zara-b.png b/elements/pl-snap/Snap/Costumes/zara-b.png new file mode 100644 index 00000000..5ffb64cb Binary files /dev/null and b/elements/pl-snap/Snap/Costumes/zara-b.png differ diff --git a/elements/pl-snap/Snap/Examples/Codification.xml b/elements/pl-snap/Snap/Examples/Codification.xml new file mode 100644 index 00000000..3f427fe0 --- /dev/null +++ b/elements/pl-snap/Snap/Examples/Codification.xml @@ -0,0 +1 @@ +This project features a FizzBuzz script and a recursive factorial block that you can run and debug inside Snap! and also compile into various text-based programming languages: * JavaScript * Smalltalk * Python * C Enjoy! -Jensdata:image/png;base64,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This project features a FizzBuzz script and a recursive factorial block that you can run and debug inside Snap! and also compile into various text-based programming languages: * JavaScript * Smalltalk * Python * C Enjoy! -Jens forward turn turnLeft setHeading doFaceTowards gotoXY doGotoObject doGlide changeXPosition setXPosition changeYPosition setYPosition bounceOffEdge xPosition yPosition direction doSwitchToCostume doWearNextCostume getCostumeIdx doThinkFor doThink changeEffect setEffect clearEffects changeScale setScale getScale show hide goToLayer goBack playSound doPlaySoundUntilDone doStopAllSounds doRest doPlayNote doChangeTempo doSetTempo getTempo clear down up setColor changePenColorDimension setPenColorDimension changeSize setSize doStamp reportTouchingObject reportTouchingColor reportColorIsTouchingColor colorFiltered reportStackSize reportFrameCount doAsk reportLastAnswer getLastAnswer reportMouseX reportMouseY reportMouseDown reportKeyPressed reportRelationTo doResetTimer reportTimer getTimer reportAttributeOf reportURL reportGlobalFlag doSetGlobalFlag reportCONS reportCDR reportListContainsItem doDeleteFromList doInsertInList doReplaceInList reifyReporter reifyPredicate reportRound reportMonadic reportRandom reportLetter reportUnicode reportIsA reportVariadicIsIdentical receiveGo receiveKey receiveInteraction receiveMessage doBroadcast doBroadcastAndWait getLastMessage doWarp doWait doWaitUntil doForever doRepeat doUntil doStopThis fork evaluate doCallCC reportCallCC receiveOnClone createClone removeClone getPosition reportGetImageAttribute reportNewCostumeStretched reportNewCostume getEffect reportShown doPlaySoundAtRate reportGetSoundAttribute reportNewSoundFromSamples doSetInstrument changeVolume setVolume getVolume changePan setPan getPan playFreq stopFreq getPenDown getPenAttribute floodFill write reportPenTrailsAsCostume doPasteOn doCutFrom receiveCondition reportIfElse doTellTo reportAskFor newClone doPauseAll doSwitchToScene doDefineBlock doDeleteBlock doSetBlockAttribute reportBlockAttribute reportEnvironment reportMousePosition reportAspect reportDate reportGet reportObject reportAudio reportVideo doSetVideoTransparency reportVariadicSum reportVariadicProduct reportPower reportTextSplit reportUnicodeAsLetter doDeleteAttr reportNumbers reportListIndex reportListIsEmpty reportMap reportKeep reportFindFirst reportCombine doForEach reportConcatenatedLists reportReshape reportCrossproduct doRun reportPipe reifyScript reportJoinWords receiveUserEdit reportJSFunction doIf reportVariadicLessThan reportVariadicEquals reportVariadicGreaterThan reportVariadicAnd reportVariadicOr doMapCodeOrHeader doMapValueCode doMapListCode"<#1>",,print <#1>print <#1>if <#1>: <#2>if <#1>: <#2> else: <#3>(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> == <#2>)(<#1> > <#2>)(<#1> & <#2>)(<#1> | <#2>)(!<#1>)TrueFalse(<#1>, <#2>)(<#1>.length)<#1> = <#2><#1> += 1print <#1>#variables <#1>[<#1>]len(<#1>)<#2>[<#1> - 1]<#2>.append(<#1>)return <#1>(<#1> + <#2>)(<#1> * <#2>)<#1>len(<#1>)for <#1> in range(<#2>, <#3>): <#4>
while <#1>: <#2>
[]
isinstance(<#1>, (int, long, float, complex))5
<#1>
str(<#1>)5
console.log(<#1>);console.log(<#1>);<#1>if (<#1>) { <#2> }if (<#1>) { <#2> } else { <#3> }return <#1>;while (<#1>) { <#2> }for (var <#1> = <#2>; <#1> <= <#3>; <#1> += 1) { <#4> }(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> === <#2>)(<#1> > <#2>)(<#1> && <#2>)(<#1> || <#2>)(!<#1>)true<#1>helloWorld(<#1> + <#2>)world(<#1>.length)5(typeof <#1> === 'number')5(<#1>.toString())5function fact(n) { <body> }5fact(<#1>)7function fib(n) { <body> }7fib(<#1>)<#1> = <#2>;<#1> += 1;console.log(<#1>);var <#1>;[<#1>][](<#1>.length)1<#2>[<#1> - 1]<#2>.push(<#1>);
Transcript show: <#1>; cr.Transcript show: <#1>; cr.<#1><#1> ifTrue: [ <#2>].<#1> ifTrue: [ <#2>] ifFalse: [ <#3>].<#1>[<#1>] whileTrue: [ <#2>].(<#2> to: <#3>) do: [:<#1> | <#4>].(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> \\ <#2>)(<#1> < <#2>)(<#1> = <#2>)(<#1> > <#2>)(<#1> and: [<#2>])(<#1> or: [<#2>])(<#1> not)true<#1>helloWorld(<#1>, <#2>)world(<#1> size)5(<#1> isNumber)5(<#1> printString)5| fact | fact := [:n| <body>].5(fact value: <#1>)7| fib | fib := [:n | <body>].7(fib value: <#1>)<#1> := <#2>.<#1> := <#1> + 1.Transcript show: <#1>; cr.| <#1> |#(<#1>)(OrderedCollection new)(<#1> size)1(<#2> at: <#1>)<#2> add: <#1>.
print(<#1>)print<#1>)<#1>if <#1>: <#2>if <#1>: <#2> else: <#3>return <#1>while <#1>: <#2> for <#1> in range(<#2>, <#3>): <#4>(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> == <#2>)(<#1> > <#2>)(<#1> & <#2>)(<#1> | <#2>)(!<#1>)true<#1>helloWorld(<#1> + <#2>)world(<#1>.length)5isinstance(<#1>, (int, long, float, complex))5str(<#1>)5def fact(n): <body>5fact(<#1>)7def fib(n): <body>7fib(<#1>)<#1> = <#2><#1> += 1print <#1>#variables <#1>[<#1>][]len(<#1>)1<#2>[<#1> - 1]<#2>.append(<#1>)
printf(<#1>); printf("\n");printf(<#1>); printf("\n");#include <stdio.h> int main() { <#1> return(0); }if <#1> { <#2> }if <#1> { <#2> } else { <#3> }return <#1>;while <#1> { <#2> }int <#1>; for (<#1> = <#2>; <#1> <= <#3>; <#1>++) { <#4> }(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> == <#2>)(<#1> > <#2>)(<#1> && <#2>)(<#1> || <#2>)(!<#1>)5"%d", <#1>5int fact(int n) { <body> }5fact(<#1>)7int fib(int n) { <body> }7fib(<#1>)<#1> = <#2>;<#1>++;int <#1>;
(<#1> + <#2>)helloWorld
def fact(n): <body>
fact(<#1>)5
def fib(n): <body>
fib(<#1>)7
(<#1> + <#2>)
(<#1> * <#2>)
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==drag any example script into this ring:FizzBuzz scripts for any language mapping:a FizzBuzz version that compiles to any mappings in this project: JavaScript, Python, Smalltalk and Ci1another, slightly different variant of FizzBuzz, which also compiles to any language mapping in this projectrecursive factorial script with function header for any language mapping:other example scripts for any language except C:nested FOR block example. Try this one for any language mapping except Ctry the current script by executing it:convert to various textual languages. Use the watcher's context menu to export:for i in range(1, 20): if (((i % 5) == 0) & ((i % 3) == 0)): print "FizzBuzz" else: if ((i % 3) == 0): print "Fizz" else: if ((i % 5) == 0): print "Buzz" else: print str(i)a FizzBuzz version that compiles to any mappings in this project: JavaScript, Python, Smalltalk and C
\ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/EXAMPLES b/elements/pl-snap/Snap/Examples/EXAMPLES new file mode 100644 index 00000000..70b1ec53 --- /dev/null +++ b/elements/pl-snap/Snap/Examples/EXAMPLES @@ -0,0 +1,10 @@ +animal-game.xml Animal Game +Codification.xml Codification +copter.xml Copter +count-change.xml Count Change +icecream-visual.xml Icecream Visual +JSfunctions.xml JSfunctions +live-tree.xml Live Tree +swimmer.xml Swimmer +tree.xml Tree +vee.xml Vee diff --git a/elements/pl-snap/Snap/Examples/JSfunctions.xml b/elements/pl-snap/Snap/Examples/JSfunctions.xml new file mode 100644 index 00000000..edba0d74 --- /dev/null +++ b/elements/pl-snap/Snap/Examples/JSfunctions.xml @@ -0,0 +1 @@ +data:image/png;base64,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data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAAHUpJREFUeAHt3QuQXXV9B/ANhIAQCCFCAuERFGx9BOwICNKGBLJMgPDMQH20NTNSdazaotaxWkt0WpzqaMVWnUlnKoK1WiRACJCSQCJPNToUfFRLEYQYSBRT8uKRV7//m3vWzebu7t2bLdm9+zkzN+fcc/7/c/7nszC/+/uf/zmno8NEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIENjDAnvv4eM7/AgQuPTSSycdf/zxs/bbb79Rq1ev/tUIOGWnSIAAgX4FRvVbQgECuylw0UUXfTO7uKy+m6e2b9++dNSoUUv22Wefxddff72AvJu+qhMgMDwF9hqezdbq4SSwadOmn6S92+ptPjzB94+zfO3mzZufmj179tXD6Vy0lQABAoMlIAMeLEn76VPg4osv/v1kvvf0LLRt27bvL1y48OSyfsaMGZeNGzduTtb95+jRo5ftvffeK5Ihb+1Zx3cCBAi0g8DodjgJ5zD0BbZu3Tplr726Olw+kSz4P9auXXv0QQcd9IOq9Vn+6yxPTbnLEoQ78nn2wgsvXJbAfce+++57TYLxc1VZcwIECAx3AQF4uP8Fh0n7k812JpDWWpsAe+uCBQtW5MsD3Zuf9R9N0L0qwXlqff24LF9UPumunpF11XXk7tUsEyBAYFgKdKUkw7L1Gj1sBJIBzyyNTSBde8IJJ3Rlvd1P4MYbb1x08803n5BA/d5qfcpvKcsvvPDCY9U6cwIECLSDgAy4Hf6KQ/wc0o38mmSxR5Rm5truXfPmzasGZDVsebLg30vGXG07I4O4Hsq14eerFeYECBBoBwEBuB3+ikP8HJL9dibw1lqZ4Lqkv+YmA+4sZZL9rtu4ceP3li9fXsuC+6tnOwECBIaTgAA8nP5aw7StCb4zq6aX0c3VcqP5nDlzjk/APrpsy33CywTfRkrWESDQ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QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBFgf8D0VWcikIKmX8AAAAASUVORK5CYII=
110
Hello!12
Hello, World!
\ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/animal-game.xml b/elements/pl-snap/Snap/Examples/animal-game.xml new file mode 100644 index 00000000..6a712450 --- /dev/null +++ b/elements/pl-snap/Snap/Examples/animal-game.xml @@ -0,0 +1 @@ +Be sure to save the project after playing so that it will remember the animals you teach it!data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAACT0lEQVR4nO3bQYrqQBRA0d5WT3vYS+hF9zZchn/QICGmKlEjd/DPgSAYBAeXZyVWPq4Q+qi/AP83AZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAZISICkBkhIgKQGSEiApAU78fH9dr7+ff6+8hQAHfr6/bsf19/Pv4HQCHFhOPZPwfQR4wHIKivBcAtyxnH4m4fkEOLEOziQ8nwAnblNv9Z4IzyPAHbMAtyK8necQAe7ZCG0WoXXiYwS4YyuodYBb60QBHiPAHVvTbivAUZDMCXBg85+QBw4BHiPAgWfDE+FjBDjxaoQC3CfACQG+nwB3iPC9BLjnxXWgm9JzApw440LEFJwT4MRZAZqCYwIcODU+AQ4JcGC9D/AuyOt1eKP6crncnfMzvE2AA5sbDnYi2zp3uVxEOCHALVsXEYPIloHNPmOb1jYBruxNPlfE5xLgwrvisxYcE+DCXShPRibA4wS4sH4I/ewdMeK7J8CVvWdAHglPcPsEeMBoV/T0fQ4R4BGT9ZxnQF4jwAPuIlutE93je54AD1j/rA4fWOdhAiQlQFICJCVAUgIkJUBSAiQlQFICJCVAUgIkJUBSAiQlQFICJCVAUgIkJUBSAiQlQFICJCVAUgIkJUBSAiQlQFICJCVAUgIkJUBSAiQlQFICJCVAUgIkJUBSAiQlQFICJCVAUgIkJUBSAiQlQFL/ANRdqvbhGkj8AAAAAElFTkSuQmCCdata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAACtUlEQVR4nO3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Bo3+AAF/RMkcAAAAAElFTkSuQmCC1N1 leafrabbit diff --git a/elements/pl-snap/Snap/Examples/copter.xml b/elements/pl-snap/Snap/Examples/copter.xml new file mode 100644 index 00000000..e804bebb --- /dev/null +++ b/elements/pl-snap/Snap/Examples/copter.xml @@ -0,0 +1 @@ +data:image/png;base64,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:image/png;base64,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EBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgQE2A4QIECAAIFAQIADdCMJECBAgIAA2wECBAgQIBAICHCAbiQBAgQIEBBgO0CAAAECBAIBAQ7QjSRAgAABAgJsBwgQIECAQCAgwAG6kQQIECBAQIDtAAECBAgQCAQEOEA3kgABAgQICLAdIECAAAECgYAAB+hGEiBAgAABAbYDBAgQIEAgEBDgAN1IAgQIECAgwHaAAAECBAgEAgIcoBtJgAABAgT+C9/nPXgguEvXAAAAAElFTkSuQmCC5 \ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/count-change.xml b/elements/pl-snap/Snap/Examples/count-change.xml new file mode 100644 index 00000000..5c42c84c --- /dev/null +++ b/elements/pl-snap/Snap/Examples/count-change.xml @@ -0,0 +1 @@ +data:image/png;base64,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data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+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+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC
011
spaced-2001503090slots1782150spacedslots-2spacedslots0position1
52115
i
1
71015
7
\ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/icecream-visual.xml b/elements/pl-snap/Snap/Examples/icecream-visual.xml new file mode 100644 index 00000000..0a7575ec --- /dev/null +++ b/elements/pl-snap/Snap/Examples/icecream-visual.xml @@ -0,0 +1 @@ +Lists of lists of functions! Green flag to display every possible ice cream serving; space to display every possible pizza serving. Each of the grey ("other") reporters such as SMALL and VANILLA takes a Boolean input. If the input is TRUE, it reports its name as a text string; if the input is FALSE it reports a command script that can be RUN to draw its part of the picture. CROSSPRODUCT takes a list of lists, each of which is a mutually exclusive option, e.g., [small medium large]. It reports a list of lists in which each sublist contains one item from each of the original option lists: CROSSPRODUCT [[A B C] [X Y]] ==> [[A X] [A Y] [B X] [B Y] [C X] [C Y]] It's called "crossproduct" because if the input is viewed as a list of sets, it reports the Cartesian cross product of those sets. The cool thing is that there can be any number of sets, each with any number of items, because crossproduct is written as a tree recursion rather than as a nested loop.data:image/png;base64,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:image/png;base64,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
1datamapmany1data lists
1
1
110i
1
cont
catchtag
cont
catchtag
Take any number of input lists, and create a new list containing the items of the input lists. So APPEND [A B] [C D] where the [,,,] are lists reports the list [A B C D] not [[A B] [C D]].
11111
Reports a new list containing the items of the input list, but in the opposite order.
1inputresult
Reports a new list whose items are the same as in the input list, except that if two or more equal items appear in the input list, only the last one is kept in the result.
1
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 < as the comparison function will sort from low to high; using > will sort from high to low.
1even itemsmerge11#1#2
menu item
-1
new firstrest1
22
\ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/live-tree.xml b/elements/pl-snap/Snap/Examples/live-tree.xml new file mode 100644 index 00000000..a7cb2933 --- /dev/null +++ b/elements/pl-snap/Snap/Examples/live-tree.xml @@ -0,0 +1 @@ +data:image/png;base64,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:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAgAElEQVR4Xu2dCdxXU/7HL5MiDGIso8Y+TRj70thJhmyJUSJlzVaSneIhZlDILkIJKUu2GkXWDDNGKfuSjAYzQvZB4f/+Pv0e/6enZ7m/3z333nPv/ZyX6+n5/c79nu95n/Oczz3nnmWxQEEEREAEREAERCBxAoslnqISFAEREAEREAERCCTAqgQiIAIiIAIikAIBCXAK0JWkCIiACIiACEiAVQdEQAREQAREIAUCEuAUoCtJERABERABEZAAqw6IgAiIgAiIQAoEJMApQFeSIiACIiACIiABVh0QAREQAREQgRQISIBTgK4kRUAEREAEREACrDogAiIgAiIgAikQkACnAF1JioAIiIAIiIAEWHVABERABERABFIgIAFOAbqSFAEREAEREAEJsOqACIiACIiACKRAQAKcAnQlKQIiIAIiIAISYNUBERABERABEUiBgAQ4BehKUgREQAREQAQkwKoDIiACIiACIpACAQlwCtCVpAiIgAiIgAhIgFUHREAEREAERCAFAhLgFKArSREQAREQARGQAKsOiIAIiIAIiEAKBCTAKUBXkiIgAiIgAiIgAVYdEAEREAEREIEUCEiAU4CuJEVABERABERAAqw6IAIiIAIiIAIpEJAApwBdSYqACIiACIiABFh1QAREQAREQARSICABTgG6khQBERABERABCbDqgAiIgAiIgAikQEACnAJ0JSkCIiACIiACEmDVAREQAREQARFIgYAEOAXoSlIEREAEREAEJMCqAyIgAiIgAiKQAgEJcArQlaQIiIAIiIAISIBVB0RABERABEQgBQIS4BSgK0kRyAKBC4Ngw8WD4KXvgmCFqiD4LAs+y0cRyBIBCXCWSku+ioADAn8JgulnBsHGTZn6cxDcQ5yNzwqCdZuKq+9FQATKJyABLp+Z7hCBzBIYGwTNZwYB/wWLtQqC3/YOgm8aygxC/QU94MGnB8GgzGZYjouAxwQkwB4XjlwTgbgIIK4vYnvtn4Lgj/Rwn62bzsVB0OXHIBhLT7lZXD7IrggUnYAEuOg1QPkvLAGGmB+mAegAgN4I7c21QSDQU/huiTOCYOvCAlLGRSBmAhLgmAHLvAi4IIAgdkUkx7iwVUdob+T3I2kILkJsSWJBIL3v+exwPrvNdZqyJwIisICABFg1QQQ8J4AYjuIP9WCuc+N4H4t9E14mPVcPOXejZ3wK736rEN9lPEcj90Qg0wQkwJkuPjlfFAKI4iD+WAdw3YIwHu4639jvgu07sPs810pcbyPGe7tOR/ZEQAT+n4AEWLVBBDJCgIlRPZgYdRPuPok4dnTtNiL8W2w+S6PQislZ7Zmc9XfXacieCIiABFh1QAQySYDh4s1xfDLXbET4964zgf1zEd9+iO8Krm3LngiIwMIE1ANWjRCBjBGoYmlQ8yB4hz/eX7BLVVt+/8pVFi4Kgmn0sv+LAO/uyqbsiIAI1E9AAqyaIQIZJcCQ8TRcX5cJU3vwXniKi2zQA/4OAT7s7AXvgxVEQARiJCABjhGuTItA3ATosU6wzTS4bqfXemiU9BD0TjQI9zO0vUQUO7pXBEQgHAEJcDhOiiUC3hFg3dCBtlUkjrXmWpw/5rH0hLtW6qjt/YyNDRDg31VqQ/eJgAiEJyABDs9KMQtMgJ7mIb5sSoEvO9DjvZ7iMKH8K4K5J0PH+/PZCP6gP+C98MZVQfBtucWF3f9yz23k8+Ry71V8ERCB8glIgMtnpjsKRgBxM2E7lHejgxjmPTet7OOHnUpk72a35HoGoT0Aof1PbX+I8xK/r0PP+Hg27bglrK/YWaZFEHz5A73pAUHwftj7FE8ERKByAhLgytnpzgIRsOU5thMVvczb6HFGetdaLrajg6Dl2kHwAGl34JphW0TiwwsN2cFXE95eXKOJ1z1Megw/n4fdPsTnkCQFERCBJAhIgJOgrDRyQQBhO4iMWG/4GYZpd0kiU6X3sp0R3ln0ak8k3fFh0mU4uRv3DCfuv7lnfXymA99wIJ3pxHkfAe4Uxr7iiIAIRCcgAY7OUBYKRICJTxvxR/OkvWtFrDaIK+sI6HAEtAf2P+EaUPe0orDp8tDwCnHXxN/ejb3DtuVHv6Bnf1oMBz6E9VXxRKBoBCTARStx5dcJAQTrXQy14L3pBv2D4FMnRusYQYTPQDT5ES3YYQ5YOIRrVH3D5ySwN2J/r5YfReOsu0WgXAIS4HKJKb4IlAggbP/kn79jbHdvNq543GcwNosbkR2Gj+/W7bkz/DyOhqAtn6/vcx7kmwjkjYAEOG8lqvwkSgARfpAE9+Dqi4Bdm2jiZSaGAC+OEL/Kba0Zbj6iZriZPHzEZyPwn48UREAEkiIgAU6KtNLJJQHEayQZs+Fd2wjjToaMbaKW1wGfbSlTzYSyfgjzZyxpWq2qzpImrzMh50QgBwQkwDkoRGUheQIM217OHw8rhIL/8fPPiJitnbWjAv+NmG2ImM1P3qvwKXK04WEMnV+D71/ysxnrm1cMf7diioAIuCAgAXZBUTYKQ4Ah3LMQrFP5w2mG6F6NcDFy+/+hZtYxS4aOYSMMm/zkbeAhYUkmkX2Gg5+TiVW8dVSOiUBOCUiAc1qwypZbAvR4j+KP5Xys2jm5IxGs3g2lQNxbiWtLiGzTDvvpbeCB4QseJM7hQWKot07KMRHIKQEJcE4LVtlyQ4Ch2n3o8dpw8xqlpToHhrHMeuFD6AXbrON/eTy7eHEE+AfytTICPCdMvhRHBETAHQEJsDuWspQjAgiT7bd8E38gG/LzUfZ93OuuIPi+zCyawNlGGG24jkKIR5d5f6zReUjoxUPCtfjVMtaEZFwERKBeAhJgVQwRaIAA4vkcM6kOGsg2kFEg8d74dnqZtiezDV33imLL5b0MlY+hAdgIn9q5tCtbIiAC4QhIgMNxUiwRiESgpreJkZkI3u8jGXN0Mw8Yb/Fg8CzDz4keLuHIfZkRgcwTkABnvgiVgawQGBsEzWcuOC7w1wjfYQjf3Wn6jgDbmcE9eSAYk6YfSlsEikpAAlzUkle+UyNQGvo9kD++m9i448g0HBnCpLJ5C7alVBuQRgEoTRGAgP74VA1EIAUCpWVNV5L0m4jgxkm7YAc9kObp/M+WVSmIgAikQEACnAL0IiRph8IjLIcVIa+V5nEQByA0C4IZ3P89f4hnIYZXVWqr3PsQ4Encsxxpbl3uvYovAiLghoAE2A1HWalFoHTyzs1Urqdo4HcVnEUJwOgG3gMfwTf2TtgumyX9PA8t7ZPgxQPSB6RzJ+lxmqKCCIhAGgQkwGlQL0CazPrdjDWmj5HV2b7M+vUBO8K7J8J7I9ey+DOwZgcqhqR/xx+jnaxka4YvhBkd5PgCfthe1TvxgDQlvlRkWQREoDECEmDVj9gIlI6/szW0zZZmrWlftj2MLbEMGEZkJ/EH1xFXJyCwe9bnMsJ4KdxAFbzGPs070T391HXWSGM7bD6B+DICriACIpAWAQlwWuQLlC7DnVPJ7npUtj2K2ONCeE8j7+fAwA4+6IX4PtpY8V8WBK3YcusJhNg2yLiC+Ke4rC6UB0kE3bD7a5d2ZUsERKA8AhLg8ngpdoUEaPTHc+tuXMfT8N9QoZlM3XZBEKzOwfcP47QJ6TDyfXw5GWAf6oHsQ30298xuTo/5ZGZMl3N/Q3HpAf+d7z7nYcjKQ0EERCAlAhLglMAXMVl6gtdT4XrTsxvCu89T88yAB44byd/h5HcGIror+f2k0vzC7e/Y2YL7b0bEj6rUTs192JuLvUuwhZsKIiACaRGQAKdFvqDploZjreG/BwEIdbJQllCVJlkN5yFjGfz+eZJV1Dxgtw82jdvcH4Kg64Ag+FulNjGCqWAt+L9bqQ3dJwIiEJ2ABDg6Q1kogwCNP1oSnEjFa4EKvIoI2GlDuQhhJllFzSjwHoPbztgZA7tu5dqDf1fusUMhliz3XsUXARFwS0AC7JanrDVAAHGyiURnUuGs4b+OWVlnbVbaF5nfD0cQOO0vm8F69Sy5OgdhDDXJKmouS+usbRet+fA8gne5tnwpVMDXW4m4DUPi64a6QZFEQARiIyABjg2tDBsBGvyeVDKWBQcr8/M2xOLw2mTokd3J79Yrs/ebtjFFZkLUSVZRMwq7B7CxN1zHw3WvMPa45zV7L018Y64gAiKQIgEJcIrw85w0ivtHZgBfRa9wHfL5IOLauaH8ItJHUBGv5vtU9kWupBxqT7JihnKHONbrhvELdp1gZ7uOtWCyVz96tiMbuw+/v6FMjifeLWHsK44IiEB8BCTA8bEtpOXBHPDOKTsjqVibAOAJNuDYN8wGHNy3NFszvcg9qyAQhyIQ9/kIkOHfQfh3Ir4tSx5vpSfZ0wc/EdY78Kcbvj3Fw85O9flUFQQrsbnHHL7n2ShArxVEQATSJCABTpN+jtKmJ7Yi70HvRQB2IFsvIKY9BjLcWW4WEbi7sHGAbdeICB9d7v1xxSd/ffljIUsBzxTVS4xsBrdNZrJThbwI+Lg1Po7lWhF1HVCzzWWNc4xKnEgZDcLnX3rhsJwQgYITkAAXvAK4zD69sNdp+I9n54jJUexi5xjuH4oIv4aIbBrFVtR7eSDoRp4u4Q9lNWzZ4QU9zCY+voh/s/Bvv6hpuL6/tN7a1gu/gL9b1djH5wfxuXXaTF3nV/ZEIKsEJMBZLbmc+10VBMszXPoCgrESWT0Y0XgoySzTW9yZ3uK1pNmWazxCtnft9BGz+/m9DZ8zmdu/cAnv3lkvPAHP1uC6CD+r8Pk9eD4Ey+P881geiUDxCEiAi1fmmcoxvblxVNLOCMd1SQgH2z+2RbhuK+08NYXx5i68w55TFxo948H41B1hW91noIiu9d774attY9mW3vxejFBM9Nln+SYCRSEgAS5KSWc4n4jiCQiHnRL0MiK8eVxZqbXJxXTS64VQ2aSwegMPBj3447keAbZ3wl4HFgz/8mvOGsbJdUsTsLz2V86JQFEISICLUtIZzyezpFdmYpftibw8PdRucfTi6C2+xfTgPqctOECh0VA6v9d28mKk2v9A3mzY2YaiNQHL/+KShwUhIAEuSEHnJZv0Um04eEV6wzYhqnua+cKXH1kD3IY1wO+n6UeYtEvrlneBma3LVhABEfCAgATYg0KQC00ToMc5gMrKCHQwx3bU4udxiPB3XIfzoU02Sjwgat/S/e1+OsuvEk+8zATx9WlumY8A71zmrYouAiIQEwEJcExgZdYNgdJsXtvreD2uaxCQfjWW6YE+hADvye+209Y+blIMb4X0/8tw+DCGw88Jf1c6MRHgd2E1IYmJbOnkUKmKQPYISICzV2aF8Zhe7wgqqK27ndaKDT56s41i3cwjgnsjLDfxeTPi9mVXDOsdJxIQtZdI89Us7KuMr1/ZDl4IsLFSEAER8ICABNiDQpALCxNg1nMXZiFfh2DYyUlnIBrXNcWo5lAHKvTjCOIuTcV38T1p2tD3SrU3u3BhNw4b+Pojw+XtGC5/Iw77sikCIlA+AQlw+cx0R4wEai0Fur+xAxzqc4F7t0G0x/DdClTsMxHiq2J01U56uoJ0uuBnmzjTiWrb1jbzQPNaVmZsR82v7heBrBCQAGelpHLuZ51JVgcjnlMqzXLNSUXc/zyi075SO03dRzpHEudy0li2qbhpfl/ycyh+LpOmH0pbBERgYQISYNWIVAnUnmRFZbwa4T3JhUOlXp9tX9mGodcLGXod5MJubRtsV7kJtm2/ZTtdyNvAw821sO2En2t666QcE4ECEpAAF7DQfckyPbMR+GI7Sk1dIQh2rG+SVVRfSWMINuz4wNfYW3qntM7tjZqPKPfD4HHub4YAbx/Fju4VARFwS0AC7JanrIUgYJOsbG9n3kuGnmQVwmyDUS4LglbfcTYxEdpR4a+kl31yFHtZuxcBnonPjyHAdkKSggiIgCcEJMCeFERR3IgyySoqI4TIzvNl2W4wm6HjvYoyI5h8f0Gez0CA7XQnBREQAU8ISIA9KYi8u1ESPzSgeierSJOsorLCl+ewsSXXzUXoFZLfH5pxrvKpQTAjKjvdLwIi4I6ABNgdS1mqhwCN/zF8XMW1MtdMBM92tEo90BPvwzA47gVzmUHVjQMYnkndqRgc4AX4GhxiMYth90wcGhEDApkUAW8JSIC9LZpsO4ay7UcOeP1avUb2bq6WCN7qcR4nWAmxWkPiY3g46FaJDZ/vKR2bOIy8tfTZT/kmAkUkIAEuYqnHmGca/D9QqW7kWp9kJvGetRP//rE0G/kgHw+wR4QP4eGAY3OD+XQTj8TnB2JElKhpuA8lwf193ywkUShKTAQ8ISAB9qQgsu7GBQx1MpR7J/mwjS+e45i+A5lqPLsmXwhzTyrbtT4fYI9YmfDuzTUBP+2Qh8wH8vQImVia/GyT+cwoAyKQMwIS4JwVaNLZqWJ9Ketrx1OROtKLfIUe5FH0IG2S00KBXTDaMRHoZd83raA3vAf5uAXnbYlUP/wdkTRTl+mRnzfJz9/IRy+XdmVLBEQgOgEJcHSGhbVA4z6Gxn1/KtF7rOntz/vd+xqDYQfYE7c1Av2B79DoOb6MjxtwvcAkpq6sX7K1tJkL5OMzyqiKsrGhaAUREAGPCEiAPSqMrLlC4/4fKtC5zLAdFsZ34n9LPHsPPC5M/LTi4OffSHsrrhu57J32RvycQD73SsunStPloWc+AvwHmD9fqQ3dJwIiEA8BCXCJq4kDw6fd6Z3dGw9qWYXxR7YDFr2xc32kwXvqTvh1O38UX/EOuwPvsN80P/n8AD67nH+ubMPT+G9Lq7wPVUGwKq8HPkR89XfufWnJwSIS0B9mqdTpKYymce3Kr2fTYNn6UAXHBGxY194TI2DG2auAb3ZQ/eFcDR6DSBzbSIRntOrwF35hV01/A/4a5xH4uZS/XsozESguAQlwrbKnp/MXgDDSGAwvwg5JSVd7BOGvCHArBHjrpNNuKL2xQdCcl7sv8v2a+HYivtmwc6OBh7UbiNuLSB/y8yTu8XLUBD8H4193H5d+NcVY34tAEQhIgOuUMiJhvaBhgJmMEu9ehEqQVB55wLG1tp0RrN8klWZj6VDWx/H9pVy2Q5e952UuWfiAwE0g9u7cNN120/Jtb2nyZ/6tRN7sfbaCCIiAZwQkwPUUCOOK7WlUJ/HVOzRem3hWZpl1BwE+igp3GUxTP8AecXoQkDap6gb86V0pVM4zXu8HZoOTr03obU7E1h6V2nJ9H3l8DZ+m8sBzsGvbsicCIhCdgAS4AYZVbN3HBBabhPPTOkGwzoFB8H103MW2gCBsCoF/prkW+MIg2JDJdhMRpiWp/DYj2x60IgceLjpj7woMrcY10odXGPD+lHxehADznKAgAiLgGwEJcBMlQiM2nShrcu2qpRzRqy88f+LBZsX+iEN0a+VZIO0/U+FPQ5SepSxjOZweIT4NgT+TEZTF+XkxrzH4KJ1AfueR353xYUo6HihVERCBxghIgEPUDxqy1wG1NkONp3KYrPVyFCokAMvvEMD96JXZ+8nEAuk+S2JbcF2I+FbFnTDpXUcaNp/gI67+pHlX3GnWtk8Gl+dBZ66WICVJXWmJQHkEJMCN8KIRPQixuBhINqz4Dj/X4/cHaNQ6l4dZsdMiwEQp29v5VsrtCyZK7cKxg4nuaGXvmqk3e5L+S/SKD+YBznbYij2UhsTvpK7alpoKIiACHhKQANdTKLwn3Jnhw2v5qi3XeBoxa8SD0j7Bo4H2KVs6bUUv42MPy1QulQggfrancy/E7z563HY8YiqBfbDXYh9s6wFvTt15hCHh3eJ2xIbbSeNw6u6qcacl+yIgApURkADX4sbs57Y01rdx2VDl07bPMQ33nLpoadym8pkdt2dDiybUCh4RYF/MlrxgtjKys4j7UEY3++AeirgXf3BX4Utrfo5CiG2IOpZAHb3f8k/eN4slARkVARGITEACDMKqIFiGcboHENydAfIi73oPY6jQNmdoMNCYXk/c3txzLyK9f+SSkAEnBHiIOoGh3sEYexvx+b0To46NMJLSn3ozALPNqENDEOLzHSdhW7nZUPerMGACv4IIiICPBAovwAjpOCDsQ+G8wzvCPrwjfDhsQdn7xVKPec4y9DT68p4x7L2K554AomPHItpxgsMQnmPdp+DWInXvavw9Equf8NBgE/zucJUCLD6Gw1AeDjmqWUEERMBHAoUWYJuRS6F8TON3No3fiEoLCDvWW24LzL70ZprcyrDSdHRf/QTo7m7EkYF/5dsWlGVXynJyllghxPdTd2yewSv436Op0ZcweePh8HsEuBMPIo+Gia84IiACyRMotADbmk1XmxRgazgwj+Aaiwh7d9hA8lUrmRR5+EFrglO5piA2OyaTqvtUGDpvjWDew2XbRj5GHepIXSpra8war6qY+cwSpP9h4xeV2nCfQ1kUARGoS6DQAuy6OtCIduH98UigfkjXeiMaQjv/ViEmAjz0/B3WNsnofMSXycbZD2Rid2ZMX0NObL/sO8hXz3JzxbZXu1MPbbkcpyoqiIAI+EpAAhxDydArewmz67CU6Xg26LelMAoOCZTWuI7A5GdcOyE07zo074Up8tiXP85zcMaG1S9nWNr+HSpQ/6qIeDxcfhXqBkUSARFIhYAEOCbstdag3skw90ExJVM4s3AdSaYPLcrsc/I7lPz25prLA93pPNCNaqrQEe97+MNeFwHeuKm4+l4ERCA9AhLgGNkzFNiVoUA76P3fvJPbJo39j2PMXqKm6dL9EobPk2jrUu9uRKIOpJwYQmxnDu/L9TpXr8b2JbdJgTygzEpz85GUcSl5EcgEAQlwjMVET2QAgGkHA17rBYvRg7mCHswpMSaZS9M2WQ6Otlb2jSL36tihbRXq0H1waM/1BPMM9uDBZJF5BgjwRwjwdVS8c3NZIZQpEcgJAQlwDAVJz3cder523ux6XNcgGv2YoDXQljvx+2wa0b18O7w9BgyRTbKAdXXWZtu6bNt17Es4Lh/ZaA4MIMQd+MMdxrUm2bH9ng+pnS1bXsd3XZgFPT4H2VUWRCC3BCTAjouWxm8EJntwTWsVBDvw8u6bOo3jc/y+JdfNNJxHOU4+N+bgaOupD6eCzqA3dyQ/n0dQeHZRqCEAo+P493lcS8HnCvjYA57tgvUTdW/punVP5ERABPwiIAF2VB62BIke7nV20Dsmz2D4z46jqzewcLUP8Wgng7n08Lqx+9YzjtzIvJnSfsk3wmcZ1HYAolJ9/COwvqey7svvtuGGQi0C1KdL4WU7f33Bz1Fw6sfD3RKCJAIi4DcBCbCD8qEBfMz2kcbU/eUcVVjrvjHc182BK5k2AY9JcOxIJibAY8/ameG72TzgjOPBhh0/FeojAKO77AARrrlwWlGUREAE/CYgAY5QPrUmWc0B5MH0zqaUa45G8xAazCu5bz42jsCGvTsuVIABgwDV61znwqAX78cX2UqSHvAjfL8swmwTkBQaIGDL36hPOyLAawuSCIiA3wQkwBWUT+1JVgC8GtE8qQIzC91Cw/kAH9h+wIv0/qLa9vX+y5hkxUxem2TVDo7Xw/GEhnyFj83otaMFV/I1Pz74VVoDvA6cNvHBH/kgAiLQMAEJcJm1o2aSFeCmrkBPw+VEFxrPTti1s2uXpBdzIr0Y23Qil6FmkhX5nMFL8w5NrZFm5u8mvBN+AWHhtblCIw8qT9h3cNpJlERABPwmIAEOWT42ycrWVnK14DqzsUlWIU02GI0h2dv58iDSeSpvDWnNJCvytzTvdAcybbd6klWYgGjPt3ftsH86TPwixiltwjFTZ1QXsfSV56wRkACHKDEatceJZj2KsiZZhTDdYBSEamsKZyzXiojOQIT48ij2fLi3ZpIVeRrPcPNe5fpEOfyHe0bAgtsV6iMA43eoLxOzcB6ySlAEik5AAtxIDaDBH8jXtGVBxZOsolYwhPh6CukoGtWp9Gq2xl5FR9RF9SPK/XBkXlVwDvn4lA1KelV6Xi92njI/KJAdoviT53ttFyzyZ5u/2PpgBREQAY8JSIDrKRx6EXuiclfwztGOhLvGxSSrKHWARtVmtNr61zUR4ouyssUgO1m14YWt+d2WijassUlWYfjAwc7+tX2QVw0Tv4hxeGD7knz3p47YRiYKIiACHhOQANcqHBr4zRG4m4GyER9/wPUtjf06vpQfjevFPBSchI9v8oDQgZ7kf33xra4f+DoOjvvw+VuuDqJAfbcj709QJra3tkI9BGwbSj7eF0Y2u1xBBETAYwISYAqnih4VInE3/9yWy07c6U5Dvxdwqnzbf5jJYMsivjYJaUOuq22faZ/qFyJ5M+xsb+I5XLYZxAn4ONyVjwgMo9jBFtic5spmnuwYH/hvQA/YTk1SEAER8JhA4QWYBss2rN+D63VgHMMwafV7RoRkBxqyyb5u6UcP8yz8tXfUHyDI+9IbfjnNegbHIcYPX+wggIvgNpjPZuPTPS4fErD5MTav0jvO+kvb9oFmyKbFgWzdmWZ9UNoiIAJNEyisACNgt5N52qlqATsVARtbG1cVw5z0iucxnrcE/57fNMp0YtDg/o2U25OXETw8HJ60FzyonMGDiu1k1Zyf19DzsglX1QHf/sGPOXW3lYziIzbtMAs7Gcm2rFSoRYB37mswNj9Lh1aoWohANggUToBpwK+iaI60RpzMD6Kxst/rDcSdx3hnhwGlXrGvRcrDxLHkhdHp6jwdmcSBBbA5HMG9wJZJcY0iTWO6UCCOPdS0Qyx/74odeb2S9Lpgs7Urm3mxA5sdYfOor6M2eeGsfIiAKwKFEmAaqM8twwjH0DAziRGQz4hbRdyhroDHYadqQW99OrbbctlOUc83Z1P+kxcMATsNNTPE4bgWbO5rbMMHeA8i3tEIwiqunGAb0N0ZsXgAwSeLCrUJlPYVHwbvpUVGBETAfwKFEuByiwMBnsk9j9GgeXtuL41ub4TQNumYxXD5xrS86zNefstAlCkAACAASURBVBu/2ySth/DdZiI7C/aOkUoz+VvsIvwLnXVcNxEE+ADrHePDUs4cwBB5/pE8/xa7b7u0m3VbDIGcbq9T4KL9srNemPK/EAQkwI0UM2LzNIDm0dvaxcfagH81BzgMr/uQgEh1Q6SG4Lc1xjfx/fEu8jAoCNZj5tdbYWzZOmDeSf7L9TtJG5kg/QttolcYP4oSBy5DKfMujErY+nUFERABzwlIgBsX4JF83Z6G3oZ2vQmIYDtOW7ezc22osXtjaz5plG2m9ClctnzHROvSJDNC+j+ydrkdM7PecJUuPetpVNx/kxc7PUqhRAAuo+GyEVw2EBQREAH/CUiAGxfg0wF0Gj04bw43R9DoWFbvhfwcDe12YasY991EXnog2h/ws09S5w6T7jf2Hpj0bFjcScCm7fK0K/lfy4nBnBgp7bW9NFxsPbuCCIiA5wQkwI0L8G58be9RvZjwU1pytBUiemGYSWT1ZQ0bE/l8N9tbmi7xgXSP7T13bIFemQn+bTC0pUpOAu86D+Bdp9nkJEOFGgII8POU64eu3/uLsAiIQDwEJMCNcK0KgmWYXWxrTlPlVJp5fBtOfEkDuyvi+2aU6sCL4fXnBcEdNlyJnQmVnEwUNn0Efypx34Nh57D3hIlnk8EQ4VV93o4zTD5cxqGeWL2YksZ6cJf5kC0RKAqBVIUlC5Bp1OwM2j8gILZFZeLBho5J1DbYcH4UYmmWss2gXpk83oKwH+M6g/Abh1Cuie1NXdqGix06cDrlcq1Lu1m2BZMPKMeRsAaLggiIgO8EJMBNlBCN2hc0aqfTqF2XZGFWMbxK79v2O16D9E+M83Qb8mgNds0OVn/hF9vUw0mwAyTs3TM2f+3EYMkIPr/CP1sywetoHH/Epe2s2rLZ4bAe2NjmMlnNm/wWgTwSkAA3LcDvEmW8q2U8YSoRDelxxLPZyjNJ19bzJhIQyxuoEL1I7ENE/yRE/96oCdMDtoMtbJlUy6i2at8PIzs8w2ZB28Yjtjb5X6QzhX/fQVqTXKaVFVsw+R/v9buzc9u4rPgsP0WgyAQkwJ6VPo3oQ7i0J9cNCEnvNNxDNCeQru04NR116xZlCZGtG2Yt8Bvkhc6qu1CaDX4kdlflwaETFfkgBHhbfrYppfIeP6eQhzt4T2wTz3If7HUJkLditpu9d1cQARHwnIAE2JMCupCeLo3nRERkyZLopTqsWhLOMVSQTfBpIkJnJ0Z5ExDgP+HMrfi1yC5btl0lu4F15/vtagsy+XiG362HnMuzcm1iGnluRf7melNQckQERKBBAhJgDyoHDeefbb0xreezNJ7be+DSzy7Qu+yMb1fwwWr4dyvD0oscupCGv8zkXgORDXXyDw8Tu9MLP8gEmat6lyjyMpt8TeEancThFXEzgsdKzGy3k6f0Nx03bNkXAUcE9MfqCGSlZhg2fBYx2IL7L6DxPK9SO3HfhxCfRg/9TIZ0F+fnxYgWH6UbbJctPCh7T2jus/XdB1P5tyUf66abCzepk6ctsWQPcDxrKIiACGSBgAQ4pVJCePdGeEeR/Of05HaJe0MMV9mkobfZ4LYs6iOu/jT4d7myXa4d22ULBT6Sd7x3lHtv3uLHdfBF3jgpPyLgEwEJcAqlgXDcQrK9uMYhYF1ScCFykuThQSrPnjxEvIQIHowIvhzZaJkG8OFDbhkJQ9uas9ABAe7HyMS5gFih0CCUeRHIEAEJcIKFNYylOJ8umKFqM3X7IBw3J5i886R4t7oWh0KMtSF0KtIjNP42tJtYQIBfJO1ZvJfeL7FEPU2otN76EOrU6p66KLdEQATqEJAAJ1QlGHLug1gMBvibCJVtAZmbYFtlkreryVBr8jcqqa0QEZ37bZYzorNZbmBWmBEeRkZwq+3Y1rZCE7pNBEQgYQIS4ASA0zhOAPTuiNQwGshjE0gylSQQ4v7kkX0ggmbkdwhCfH6cjpDeYNKz4xgL3+uDxUOwWBkWW8XJXLZFQATcEZAAu2O5iCUaxY15P/pXIDfnZ1fek06OMTlvTPPAcRXOHMX1Cfk+Na5JUvSAe8D2ekTHzkUudID5s7D4nIee3QsNQpkXgQwRkADHVFg0iOhvcCrXFARix5iS8dpsaYjYtot8BSHugRC/6NJh7P+OCvyq6122XPqYlC3q26ukNRUWhySVptIRARGIRkACHI3fIndfwHAoO1nZTku2h/M5NIjMVSpu4FSH1gyN3sNlQ6OP0UPrSKWz9btOAk85P3JYc5v+QfC+E4MZNYIAz8b1u6hvoFAQARHIAgEJsMNSohG8EXO2RtZO6vk9jaEdFOBMbBy6mrip0m5U15DwbxDj0cxcPtSFEzD/luU33dmvOvLBES78ScsGDyKfwPUi6tzgtHxQuiIgAuURkACXx6ve2AyF7gXIG2kAl0EMBtDLu8JOpjExpkEc7SCJ3JiAVV9YnUOGWvBkcjnD0vbvigPC819OABoW1U7FDnhyozYl8aQg5IYIlEFAAlwGrPqiIgCTEN6OfDcBsbVTjKoDDeJM4D6Z1JKciNlI/Hb4DCVRO+1pLpzOgNOtiTuRowThOQ+OO8PRjmRUEAERyAABCXCFhYTwcupbde9tLj2wXnVnONMg3sd3ayHKG1eYRCFug9MXZNRmMdsZxEMYmjZhViiTgL0LZ0vTNqwBK/S78DKxKboIpEpAAlwmfptUZEuLuK2dLYGhx3FCfSaI14945yHAy5WZRCGic3rP+pze8xSi+xmiuy4CMoZ/d+b6Cq62XpqPFcIQKO2w9rVOQgpDS3FEwB8CEuAyyqJmkhUiMWPJIOjAdFN2lqw/MBt6DWZgvatGcVE+vAfuScW7gW+eq7tEq3TYgy2lsbo5mu9tPbFCIwRKZ0lPL036EysREIGMEJAAhyiomklWRF2aXu1AhpvtfNwmA2LyHYAPoJf8YJORCxKBnu6lPMD0h8vNcDmioWzD/DziHMf3yxH/wWmc58uxS98XBFNZ2SxtBXovAtyirBsVWQREIFUCEuAm8NdMsgLUeARjr3JKCxF5j/sepGE8vpz78hrXTlAib524ToPJpWHySe/ueGaW2/t222f6Sf59FL/MDHNvUeJQR3vbPuMw/WVR8qx8ikAeCEiAGyhFxIKlpcE5APq0vklWYQofAbYNOVbkZaYdll7oAM8ZiMRaXPswgvB4uTB4p96F0QdG9oN22JjKqfP9EeIny7WTx/g8pJzPg8nRCPCqecyf8iQCeSUgAa5TsrTwbXh3a5Os2tpkoIYmWYWpEIjO2djoj40Vw8TPYxy6uW0YN36evH23ThCsd2DEYWR2mdiayVtXwtV21nqTq6roa62pZ8zDCnaFA4gVREAEskJAAlyrpBjKG07v6rAwk6zCFHBpcsyMou5VjDD8CU63Usle5CHkD2GYhY1T2vLzZmx3oLz+y31D4Hx52PvzFI+RlnHkZ01GWjbNU76UFxHIOwEJMCVMA/YXQNhyIluPOpGGfA9XBW8bJDA8uBvj2WUPu7ryIQ075PsCmJ6FON4Jz+5x+kBad2K/M+l9TXo3kh56X5xA/p8i7/PJ9C7FybVyKgLZJ1BoAabhOpkipL0OluKyYbzduF7mg26uipY0PsDWHdg8xZVN3+2Q57vxsQvXueQ7scMoSNf2mu7B9Qsq9mgE6UjfWbnwj3xPx84bsGaEX0EERCArBAopwAw12zrTv9BbWoWftta0pxUYDdlf+awVQ3lbuypAbFrPdwnS2M6VTZ/tkN9/4p9NlOoKx4fS8BUfqkjXZp7bEqbxvIM+iA++TcOXJNIkv7NIx7ZC1Wz7JIArDRFwRKBQAsxM2o7MpL0aduvSMD+EQOxbmyPCfCWf70tDtoYjvgFpXkCaNkN1ZVc2fbSDwC3PItSX8W2x79h+k98/TttPXi0cSwW34ejWXLbrVm/K3CZu5SogwHPI0JVJjjbkCqAyIwIpESiEANtkKGY2j6QB3gzOTyIQnRGIz+oypyE7ms8upSFb1lV5IMDtEeBn8rxLEULXiYp0F9frqN3mrti5soN/9n6YahCszzWNd/In5+mdPPX2K/LVlzp2sytmsiMCIhA/gdwLMI3TE2Dc0daOcvVkDar10uoNtNCb0Tg/71os8YGlxEF77NpynFwFRg1sopW9572f/Nl7X28D5bAlFd5GOdrz8y0K5Xzqw23eOhzSMfL1PfV2Tx4qHgl5i6KJgAh4QKAIAvwGjdMJYRsnGjPa56AVYjLXVfnYECFGr2f4c6Armz7YIV+3UYG608O/mLzZZLZMBB60VmNE5Bac3bW0hOkynA+1M5ePGaQc7CSktlSut3z0Tz6JgAjUTyD3AlxuwdOY2f7NnRlKtc04nARs/g1D/6OR7+DEoAdGSnmyIf2e5GuMBy5V5ALD06Mp7/24+Ruu4eTFtr3MVLCHRuqrzfzmWUhBBEQgKwQkwHVKisbsY3pFl9Gjo212EzB0OaAPpHFf3Y3F9KxUBUEzToKynlZLdqRqT6/LZuBmPlDuV9nDBJcJ2Z2NHRThU2bxe238eZu6xUCPggiIQJYISIAXFeDX+cjeA9t6UiehNPvaloks4cRgSkbYfWoHhm5tadG/yMvvU3Ij1mR5p30OD2An8IexPD8ntGKIvfeC3rGXgbq1M35O5IGhuZcOyikREIEGCUiA66ChAX6UBm0pBGZbl/XG3tNhd3161ibwmQs09P3wf4g19rDZM3MZKNPh0glD9l77N1xPl5YweVd2pbOVr8HRZcrMoqKLgAikTEACXKcAaNCuB8ofadDWclk2CPCn2LMj4/hntkJpj+wj4DKUntZJ2fI+mrc8eOzDi1V7HbEBIvwiIwCnMKFvcjSr7u4uzULvT71ayZ1VWRIBEUiCgAR40R5wHzv2jp7qci4LoLRD1Ec0lHYebmZCaScvGw04psjrTOFg65uv4g+mPUI8k+t86siotAuy9O56H5ebx6SdJ6UvAkUhIAGuU9K859yGXs5TNGgcOesulHrW1ov8FwI/hTRuD7s0yp0X5VmicX/Ltubk2rGx9dPlWc12bI5DXJklPyPJRUeuj7gup67wcTqBMrKDKDbI6zv5dKgqVRFIhoAEuB7OtqyD3bKWqnK4fzA2jyGpy7juAfq2iFobS9oEmX8/wz9vpxGdlEyxN55KaUOSR4k1B5/a+uCTjz4w/Hs7ZdeF61umIA9neP7UpP0szVloQTltn3TaSk8ERCAaAQlwNH6h7y7twvQsjfTPPWsazz1ovA/i2o6CqBZkwntcU+hljWaJz8OhE3AUsTT56Gr8eRJfd3VkNtdmGN24El62hMlmuY9BDA9LKsOk/QJp/bvuvuZJpa90REAEKicgAa6cXdl3Ws+aA4eX6xsEX9R3M9/vjhh3tx4y39vsW9uWa7YJMqp9BztExCrIpfeJJ5DmMBp067ErlEGAh5cBsOvDLaxeCiYwinJw1YJ9mmMLCPDb9L6fKMrRi7GBlGERSIGABDhB6LZnL+9/9+Z96sQwyRLfzic+mMuOMvxZkBFH23zBaUA8HkY8dqVCnERjbptSKFRIAFE8Co4UU/WpWlPoFh/DYdCvVmiu0duoI/8hgu3gNSAO+7IpAiIQHwEJcHxsF7FMw/wJvZXBCBx6V34wQY7jPTF2X8Gb1RHgPVCNZ8v3THfUR4Dy3os/MFt2tiHXdK7TXJcfxj/H7pnYvValIAIikC0CEuAEy4vG8g2Se47G0t4Xph4QiN9SAZ5BeL+Mo1edegY9cYBy3xTOdg71H7jeYRRkELxtJnXkgO1vsf0nHuoejGxMBkRABBIlIAFOEDeN5WSAN6exTH3GKl3wQxDem8j+PzSDNplKUMVmGS0WCO8fueZwDYU9e31UHqhTP1CnNqNOWQ9bQQREIEMEJMAJFhY9zhtIbte0e5s02pfghy2ZudWX3niCxeBFUjwAjeIB6AD+AL/FoZsR0JMrcaypiX2V2NQ9IiACyRCQACfDuToVGt0TaXTPQ/SWTzDZhZLiIeB+Ct3eTZ5Jo29CrJAiAQR0KHXiMMrDljDdVc4DUVUQrMrJVB9QjjoJKcUyVNIiUCkBCXCl5Cq4DwHejsb2cRrZVE5ForF/EbfXpbXez/dduCrAm+lbSns6s0ItWJE/SjuLugfCahOsGgyMXbe3XdVc79qWaZByXgQyREACnGBhIb6L09D+MDUIWtzFkqSkkmZnq9UQXZIN5rGeuB1jz18nlbbSKY8AIxRHUFZnU1fW5M5nENhjG9oGlAeqrsS5BQFuWV4qii0CIuADAQlwwqVAoznP1tvyHvjJJJJmb+v9bN9pCvolelRbJ5Gm0ohOACHuRJnZcjU7d3kG1+kI7UIbsVCX7L3x2XxuG38oiIAIZIyABDjhAqNFnWsn6dBoXh530jTi59GbGkgv6i4E33pLChkjQH3ZmPpyDX+o2/BzFuV5Aa8PbrFs8N1g28qUutQ6Y9mSuyIgAhCQACdcDWg03ybJ2LcOJJ0xNM5/Ii0T+6qEs6nkHBPgFI9WbG15K2ZtCdMnXFdwtePakvK1nwoiIAIZIyABTrjAGDZ8iiR/oNHcOa6kSeMf2N7Q9pWm53tfXOnIbjoEKF8TYnu4soM9XqAutU/HE6UqAiIQhYAEOAo9z+6tCoJl2OjhNWuYee+7KYc32D7BCjklgBDbQR1vx/kwl1N0ypYIeEFAAuxFMUR3giUpHXnXO44CfYvJVptGtygLvhNAgB83HyXAvpeU/BOB+glIgHNQM0rn0doxeO/QGK+TgywpCyEISIBDQFIUEfCYgATY48IJ4xqTrabxrnd9rtdtn2lNyAlDLR9xJMD5KEflorgEJMAZLfvSYQrX4/6HvPfdmg2Fd6AwxyLAzTOaJbldJgEJcJnAFF0EPCMgAfasQMK4Q8M7lng2C/Z2BPeQmntskw8KdB/eAdtWhgo5JyABznkBK3u5JyABzlARsxZ0ddaCTsHlVgw5H8ESo7tru0+v+E0+n4ood8tQtuRqhQQkwBWC020i4AkBCbAnBdGUG0y0OotdkKqY6Twd4d2yvvg0yNfx+d7aGakpmvn4XgKcj3JULopLQAKcgbIvNbT2jvcyhpftHN96A/Fs+ZFtzKDj6TJQrlFdlABHJaj7RSBdAhLgdPk3mjq93h0pIBtmns+1F8L6QlPu0ih/Q5x+xL2hqbj6PtsEJMDZLj95LwISYE/rAO9zr8a14xhynsSQ8+5h3eS+53kP/BkC3DHsPYqXTQIS4GyWm7wWgRoCEmAP6wI93+kUTFuE9AzEd2g5LtIon0v8E3VEXTnUshlXApzNcpPXIiAB9rAOILw9Ed5rcO39pZlo1TcIvijXzaogWJ51wXO5VuwfBJ+We7/iZ4eABDg7ZSVPRaA+AuoBe1IvaEztXe/+9HpH0es9NIpb2DLhvVLHEEah6P+9EmD/y0geikBjBCTAKdePC4JgDU4uehLhXYHC6IVojovqEg3zI9hYAVtbRLWl+/0lIAH2t2zkmQiEISABDkMppjgMOQ+gAM7lmsryoq1dJYPdo7B5BQLc0pVN2fGPgATYvzKRRyJQDgEJcDm0HMal8XwSc9vR8x3CkPPpDk1Xm8I+E6iDLcMsXXKdtuwlQ0ACnAxnpSICcRGQAMdFtgG7nNu7M8p4F19/z89OZwfBi3G4wHKk2dgfj7gfE4d92UyfgAQ4/TKQByIQhYAEOAq9Mu+1rSIB3pte78P0TDuVeXtZ0RHg0aSzBemsV9aNipwZAhLgzBSVHBWBeglIgBOqGDSWM0jqtwA/lfe9V8WdLOnZ5h0PIsBLxJ2W7KdDQAKcDnelKgKuCEiAXZFswA6N5OF8ZYI7m5OMtqgKgq9iTvJn86T9/Q9B0HWAg5nVSfmsdMITkACHZ6WYIuAjAQlwjKVCA3kv5vfjGklPtFeMSdVrmvRfZRj6Nd4D75902kovfgIS4PgZKwURiJOABDgGujSMa2P2ca7lANyTIef7Y0imSZMsR7qC9A9E/FdrMrIiZI6ABDhzRSaHRWAhAhJgxxUC0RsM1H6YtWMB2zs2X5a5QUHQjhfAr/AAoOMJyyKXjcgS4GyUk7wUgYYISIAd1Q12tNqqWRDcyZDv6phcwpczeWmkv6KQz0xi4pcjlDITkoAEOCQoRRMBTwlIgB0UTM0+zph6GuHdgd/nsQZ3d9b4TnZgPpIJliM9y0PBd/i1UyRDutk7AhJg74pEDolAWQQkwGXhWjgyDeCRiJsNOc/n6kMv806Lwecf8Ptofj85gnknt+IL2huczv+Wd2JQRrwhIAH2pijkiAhUREACXAG2qiBo1iIIpnDrVlx3IG6H1DZTahib8/m2FZh3egu+Lomv/2M5UmuWI73v1LiMpUpAApwqfiUuApEJSIDLRMiQ7mB6vSdy2yx+7scSn1frmqBh5JVwcDQCvHKZ5mOJjj9z8HU4vlpvWCEnBCTAOSlIZaOwBCTAIYue2c1bA8uGmFdFzC5BzM5t6NZS3L+hdpw0mH6goR6PF6vjzybpeyMPXBGQALsiKTsikA4BCXAI7gjqPYDqQtTqSVYhbrH3wD8g1Nsg1H8PEz/OOBwA0YNJYTfi+5JxpiPbyRKQACfLW6mJgGsCEuBGiDY0ySpMIXDvR8AdxkSsgWHixx3HHgjoju9wWhA8E3daLuzj7xOaud04SQmwi5omGyKQHgEJcD3sq5qYZBWmuHhXbEL3HQK8S5j4ccehsX6Xwp6MP0fEnVZU+/hqs8cHc+k848YfEG23NXuxv3NU5rpfBEQgeQIS4DrMa0+y4vCE/RDjRSZZhSkmROQy4nWjcfx1mPhxx8GfkRT29giwbZPpbRgbBM1nBsEXOGhD5n28ddQDx9QD9qAQ5IIIRCAgAS7BK2eSVRjeFwZBB/Z/tHN/vTgOkMZ6Jwr7UQSYDbv8Dfj5Et4tDrcN/PXSD88kwH6Ug7wQgUoJFF6AEd5fAeEeAG7PpKlZTJpy1kOkgfwRmxvWt1Sp0gKLch/+0KkPeiFuo6PYiete/BuK7WN5Qmh1ahB8HVc6ebErAc5LSSofRSVQaAGmAXuQgt+T6w2uZYExiR6ind/rJGD/UwwNRvD4Z/qh1LuchT/7pO/Nwh4wYrARIwbTeGA5kweWS3zzz0d/JMA+lop8EoHwBAopwDRco0DUjcb+QwDYNo2jbdYtny3Gv3cMj6/xmNj8J/Y/QtQ7ubIZxU7ppKaevmwQUjsvsJrN7+/i2/ZR8likeyXARSpt5TWPBAolwDRYV1CIR3F9TcYvQBjt9+rAdzchyDvS+1rXVUFj8zpsdUJU1nBlM4od/FmT+60HbBuEsDTYj4BfzL0KdtN+1eWVhwS4PF6KLQK+ESiEALMRxUDUxpa22Lm4V9LQsy3ywsGWvgBjAKK8gqtCYkb1voj6WNJr4cpmVDvk8wt8Op8HjSFRbbm4n7LpQtncw9WV06NMiBVCEpAAhwSlaCLgKYFcCzAN1DFwr+Kyk4BuQQiPbagcbJYw3z3ietYydn/iIITfoPg2xJp6wJ+n7UHEh4MiDAYPKXN5IJiMPwekDidjDkiAM1ZgclcE6hDIuwDPJ79307h3a6rkS+tP7dxcp0xoJD/H4Dm1h7ub8iXO7/HnpFIPeNk40wljG1+eJN46MG8dJr7iLExAAqwaIQLZJuBUbLKNovo9sJ3ruxNiaUcNOgnYnIHgzWTIdz8nBh0YsV45L4HXZVtK9rxIJ9iQPylfwtDzlgw9T03Hi2ynKgHOdvnJexGQANeqAzRonyGW5yCWV7qqGsw8HsGL5+0QdWeTu6L6Rj7/g42Vyav1zt/j3zP4OYXhgoeSODNYu11FLcEF90uA3XCUFRFIi4AEuBZ5xPIdgNh74N6uCoR3nN0RupuwuZQrm1Ht0HA/hY2WNkGMn38gz+vzc3Wupfn3PD7/hH9b7/gFfn+Mh4f7o6ZZ+37Sf5nfbcmXdruKAFYCHAGebhUBDwhIgBfuAdvQs70H7uCqbKoWHOwwD9DLI2Sfu7IbxQ4PGhfjj60HXrWuHTbE+CPf7cq1Bde6iPHKxGnO9T+uD7lep0f/HBPLJlVy1CKiYbtdHdOK3a54yvkmSj6Kfq8EuOg1QPnPOgEJ8MICfCu/boUw/c5lwdIL/goh64fd4S7tVmrrAo4l5B3wY/gTal9oGvoV8H8fKoudhbwx15pctlxrMT77nO9sGNv2cJ7Cw8aD/YPg/fp843ijjRjm1m5XlRZcnfskwI5AyowIpERAArywAJ+JmJxCz25Fl+VBQ/k6oKfRAz7Ipd0otvDpByZAbc4EqBcrtUNveUN6w3vAbJvSMLad/LRM7WFsvrMJVo/B9D7StKVYthGICblCRAIS4IgAdbsIpExAArywAO/Orw8gEDbk6izQUN6Jsc6I0XVctyB6M5wZr9AQPn1M4V/JQ8H5FZpo8DZs78aX1cPY5Hc9/l09jM3vP/H7P7km0lO+gWnQXqyNdp3/pOxJgJMirXREIB4CEuBaXKt4T4swzHW9Fph3rqcAmh/Vk5tW4fqO6y0+m8zPEYjg9HiKt2GrNN7Pkf4XpG1iGXswtksGQQ8Sst3BNuGnjTLYiUd23vIk3infyAzsf8XuSI4SkADnqDCVlUISkADXKXYbmi3tleysQtjZwLxz/StiV92zRol7An5//rllLUF+m39PZlh4RJRh4bBOk8+r8KEzPrUJe4/reLwb72PvlrG7aY0g8/tr+DWR34dTDu+6TjNP9iTAeSpN5aWIBCTACZQ6vb+W9Ky/bqhnjRAdivDuT2GYINvMZOshmyA/xjWC+6a5dpOHgE6kd5/r4fYofsLheO7f1wQZIV6Jn9ZDtvfnE3mAGc4ZwbOi2M/bvRLgvJWo8lM0AhLghEqcxnI+orI9k5GebSpJxLFHqYe8VUmQvzdB5n6bzNS3qfvDfo/g/cgkqvXS3BGrMV9hdhx57gwL6yH/LMg8NGwRNo95jicBznPpKm9FICABTqiUaSxtDfDZTvw23AAACUNJREFUiMfV5SaJUB6CEB3AvZ3LvbcJgbOdvy7w5WSkpvJmggyDa5uKV5TvJcBFKWnlM68EJMAJlSyNpQ2fPtzYiUwJufJzMvS0p9EDns17YHsPq5AxAhLgjBWY3BWBOgQkwAlVCXqxz9Db/AYB7phQkk0mgwAPpwJ0wKe1moysCN4RkAB7VyRySATKIiABLgtX5ZER4FEI8BaIXbvKrbi9kwb8T1gchU+sEFLIGgEJcNZKTP6KwMIEJMAJ1QgaS1YXBSchdjaZyJuAXz+xH+UqzDD+yBun5EgoAhLgUJgUSQS8JSABTqhoSst+xiHArEjyJ9CIf4k3p2tykz9lEtYTCXBYUoonAn4SkAAnVC6XcfoPi3s/cb3LVlT3acRfYWj8VWZC23C0QoYISIAzVFhyVQTqISABTrBa2C5bJGfvgZ1vrFFpNvDpNu7dEp/aVmpD96VDQAKcDnelKgKuCEiAXZEMYceGe+lt9qe3eWOI6IlEYWj8MCrBNQhwy0QSVCLOCEiAnaGUIRFIhYAEOEHsNJh2bq69Bz4xwWQbTWoYwvspWz4yPL5UVRB864tf8qNpAhLgphkphgj4TEACnGDpsBTp7yT3CRtfdEow2SaToiH/hp75sfTMRzYZWRG8ISAB9qYo5IgIVERAAlwRtnzdxIPBmwjwc/TMD81XzvKdGwlwvstXucs/AQlw/su4yRzSkN9NpN8hwBs2GVkRvCEgAfamKOSICFREQAJcEbZ83WTHAHIc4kUMQS+br5zlOzcS4HyXr3KXfwIS4PyXcZM5vIQziFkf9aFva5SbdLzgESTABa8Ayn7mCUiAM1+EbjJAY149A5oK8RI/Js3joIaBC05wUvCUgATY04KRWyIQkoAEOCSovEejMf+IiVjPczzhEvzclPzantVfc71ugsw1nB7yO3nnkKX8SYCzVFryVQQWJSABVq2oJmBbUvLjJUS2Ww0SPjuOf+/LtZkJMpXla94Vv2GCzAEOw08LgpnClx4BCXB67JWyCLggIAF2QTEHNtgR62Eqw/IIcPuGskODfwzf7VcjyPz8hntep8f8yPwguIkh67dygCIzWZAAZ6ao5KgI1EtAAqyKUdMDvop/7IMArxEWCbOne9Mj3o9KZD3kX5kgc//SYe9XvGgEJMDR+OluEUibgAQ47RLwJP2SmA6JshTJbLDLF7tbKiRBQAKcBGWlIQLxEZAAx8c2U5ZpzDfH4X/Qg/1FphwvsLMS4AIXvrKeCwIS4FwUo5tM0KD/xKEMK1QFwWduLMpKnAQkwHHSlW0RiJ+ABDh+xplJgQb9e5y198APZ8bpAjsqAS5w4SvruSAgAc5FMbrJBDOhP6FCDEGAadsVfCcgAfa9hOSfCDROQAKsGvIzARp023TD3gPrVKQM1AsJcAYKSS6KQCMEJMCqHrUFeDK/tECAtxMW/wlIgP0vI3koAo0RkACrftQW4GFsqtGRpUhrC4v/BCTA/peRPBQBCbDqQCgCvAPuS8RBCPByoW5QpFQJSIBTxa/ERSAyAfWAIyPMjwGOJdyWYwmfZAiarZ4VfCcgAfa9hOSfCDROQAKsGrIQAVsLvA7vgQ9csCRJwWMCEmCPC0euiUAIAhLgEJAURQR8JCAB9rFU5JMIhCcgAQ7PSjFFwCsCEmCvikPOiEDZBCTAZSPTDSLgBwEJsB/lIC9EoFICEuBKyek+EUiZgAQ45QJQ8iIQkYAEOCJA3S4CaRGQAKdFXumKgBsCEmA3HGVFBBInIAFOHLkSFAGnBCTATnHKmAgkR0ACnBxrpSQCcRCQAMdBVTZFIAECEuAEICsJEYiRgAQ4RrgyLQJxEpAAx0lXtkUgfgIS4PgZKwURiIWABDgWrDIqAokRkAAnhloJiYBbAhJgtzxlTQSSJiABTpq40hMBRwQkwI5AyowIpERAApwSeCUrAlEJSICjEtT9IpAuAQlwuvyVughUTEACXDE63SgCXhCQAHtRDHJCBMonIAEun5nuEAGfCEiAfSoN+SICZRCQAJcBS1FFwEMCEmAPC0UuiUAYAhLgMJQURwT8JSAB9rds5JkINEpAAqwKIgLZJiABznb5yfsCE5AAF7jwlfVcEJAA56IYlYkiEpAAF7HUlec8EZAA56k0lZdCEZAAF6q4ldkcEpAA57BQlaViEJAAF6Oclcv8EpAA57dslbOcE5AA57yAlb3cE5AA576IlcG8EpAA57Vkla+iEJAAF6Wklc/cEZAA565IlaGCEZAAF6zAld38EJAA56cslZNiEpAAF7PclescEJAA56AQlYVCE5AAF7r4lfksE5AAZ7n05LsIBIEEWLVABDJKQAKc0YKT2yJQIiABVlUQgYwSkABntODktghIgFUHRCDbBCTA2S4/eS8C6gGrDohARglIgDNacHJbBNQDVh0QgWwTkABnu/zkvQioB6w6IAIZJSABzmjByW0RUA9YdUAEsk1AApzt8pP3IqAesOqACGSUgAQ4owUnt0VAPWDVARHINgEJcLbLT96LgHrAqgMikFECEuCMFpzcFgH1gFUHRCDbBCTA2S4/eS8C6gGrDohARglIgDNacHJbBNQDVh0QAREQAREQgfQIqAecHnulLAIiIAIiUGACEuACF76yLgIiIAIikB4BCXB67JWyCIiACIhAgQlIgAtc+Mq6CIiACIhAegQkwOmxV8oiIAIiIAIFJiABLnDhK+siIAIiIALpEZAAp8deKYuACIiACBSYgAS4wIWvrIuACIiACKRHQAKcHnulLAIiIAIiUGACEuACF76yLgIiIAIikB4BCXB67JWyCIiACIhAgQlIgAtc+Mq6CIiACIhAegQkwOmxV8oiIAIiIAIFJiABLnDhK+siIAIiIALpEZAAp8deKYuACIiACBSYgAS4wIWvrIuACIiACKRHQAKcHnulLAIiIAIiUGACEuACF76yLgIiIAIikB4BCXB67JWyCIiACIhAgQlIgAtc+Mq6CIiACIhAegQkwOmxV8oiIAIiIAIFJiABLnDhK+siIAIiIALpEZAAp8deKYuACIiACBSYgAS4wIWvrIuACIiACKRHQAKcHnulLAIiIAIiUGACEuACF76yLgIiIAIikB4BCXB67JWyCIiACIhAgQlIgAtc+Mq6CIiACIhAegQkwOmxV8oiIAIiIAIFJvB/+JwVOxTgAy8AAAAASUVORK5CYII= \ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/swimmer.xml b/elements/pl-snap/Snap/Examples/swimmer.xml new file mode 100644 index 00000000..61292adc --- /dev/null +++ b/elements/pl-snap/Snap/Examples/swimmer.xml @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAD2UlEQVR4Xu3YsUviYRzH8a+h6GKD0iYotDVILoI4t7U6OAnhHk6G0OwYNLX5F4gRuDo5pJv+Aw5u4lRLkGT3e+CO6zi6IOPzdM/b7Tr9fX6/9/PCjottf7yMFwVEBWIAFJVn1hUAIBCkBQAozc84ADEgLQBAaX7GAYgBaQEASvMzDkAMSAsAUJqfcQBiQFoAgNL8jAMQA9ICAJTmZxyAGJAWAKA0P+MAxIC0AACl+RkHIAakBQAozc84ADEgLQBAaX7GAYgBaQEASvMzDkAMSAsAUJqfcQBiQFoAgNL8jAMQA9ICAJTmZxyAGJAWAKA0P+MAxIC0AACl+RkHIAakBQAozc84ADEgLQBAaX7GAYgBaQEASvMzDkAMSAsAUJqfcQBiQFoAgNL8jAMQA9ICAJTmZxyAGJAWAKA0P+MAxIC0AACl+RkHIAakBQAozc84ADEgLQBAaX7GAYgBaQEASvMzDkAMSAsAUJqfcQBiQFoAgNL8jAMQA9ICAJTmZxyAGJAWAKA0P+MAxIC0AACl+RkHIAakBQAozc84ADEgLQBAaX7GAYgBaQEASvMzDkAMSAsAUJqfcQBiQFoAgNL8jAMQA9ICAJTmZxyAGJAWAKA0P+MAxIC0AACl+RkHIAakBQAozc84ADEgLQBAaX7GAYgBaQEASvMzDkAMSAsAUJqfcQBiQFoAgNL8jAPwDwOxWMxyuZwtl8tffzOdTq1cLrs/Pz09WSqVQs6OCgDwt5D39/dWqVQsnU7b0dGRTSYTi8fjdnJyYu122zKZjBWLRfeJ9Xpt2Wx2R8cQ7mUA+M7ZDwYDq9VqNp/PHcjotbe3Z9G35MvLi/s2TCaT4erZwZMD8B8RHx4e7ODgwG5ubuzu7s5ub2/dJxKJhD0/P//109H7V6vVDo7n/78EAD94xp1Ox7rd7rvv3m63dn19befn53Z4eGgXFxfWbDY/uBDm2wD4yXM/PT214XD45ioRxOg1m83s+PjY/doulUrW7/ffvC+fz39y/ft/HIA7PMP9/X17fHx0V7y6urJWq+W+CRuNhl1eXrqfn52dWa/Xs0KhYIvFYofr3/NSAPzic4tAjkYj9+/Fer1um83GLY7HY6tWq1+87v/lASg4o+i/eX5+UwrmvZoEoFfHEd7NADC8M/fqiQHo1XGEdzMADO/MvXpiAHp1HOHdDADDO3OvnhiAXh1HeDcDwPDO3KsnBqBXxxHezQAwvDP36okB6NVxhHczAAzvzL16YgB6dRzh3QwAwztzr54YgF4dR3g3A8DwztyrJwagV8cR3s0AMLwz9+qJAejVcYR3M6+obUe3SLkjfQAAAABJRU5ErkJggg==data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAOhUlEQVR4Xu3VwQkAAAjEMN1/abewn7jAQRC64wgQIECAAIF3gX1fNEiAAAECBAiMAHsCAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+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+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQIHLFxAWmhEwHPAAAAAElFTkSuQmCC1010555 \ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/tree.xml b/elements/pl-snap/Snap/Examples/tree.xml new file mode 100644 index 00000000..937c198b --- /dev/null +++ b/elements/pl-snap/Snap/Examples/tree.xml @@ -0,0 +1 @@ +data:image/png;base64,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data:image/png;base64,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86FiVa6LsRjAREREGvLC+AoDmIiIqMT8qL6NAUxERFRiAcCfyzA0A5iIiEhjPlQ/ywAmIiIqsQCqP8UAJiIiKj2DK8sGDQxgIiKiIshWmpIBTEREVAQBVO9jABMREekgU2lKBjAREVGR+GA6wgAmIiIqMT8qW9I9E8wAJiIiKqJ0pSkZwEREREWUrjQlA5iIiKiI0pWmZAATEREVWarSlAxgIiKiIvOh+pMMYCIiotKbUpqSAUxERFQCPhgfZAATERGVWHJpSgYwERFRiSSWpmQAExERlUhiaUoGMBERUYkklqZkABMREZVQvDQlA5iIiKiEAqg+wAAmIiIqsXhpSgYwERFRiXlR/QwDmIiIqMR8qP4kA5iIiKj0DAxgIiIiHTCAiYiIdMAAJiIi0gEDmIiISAcMYCIiIh0wgImIiHTAACYiItIBA5iIiEgHDGAiIiIdMICJiIh0wAAmIiLSAQOYiIhIBwxgIiIiHTCAiYiIdMAAJiIi0gEDmIiISAcMYCIiIh0wgImIiHTAACYiItIBA5iIiEgHDGAiIiIdMICJiIh0wAAmIiLSAQOYiIhIBwxgIiIiHTCAiYiIdMAAJiIi0gEDmIiISAcMYCIiIh0wgImIiHTAACYiItIBA5iIiEgHDGAiIiIdMICJiIh0wAAmIiLSAQOYiIhIBwxgIiIiHTCAiYiIdMAAJiIi0gEDmIiISAcMYCIiIh0wgImIiHTAACYiItIBA5iIiEgHDGAiIiId2FClahjAqt7nQ0RENCvUo+p1rQK4HlWv630+REREs4INlXdr1wOuvFvv8yEiIpoValHVo1UA16KqR+/zISIimi0q61D15HTDtw5VTwKo1PtkiIiIZo06lHdPP4DLu/U+DyIiolnHhqobphHAN+h9/ERERLNVWYEhfAOAMr0PnoiIaFarQ3l3LnPCdah6ksPORERE2qqMro6u/Hodqp6pQ+WpaKt6xobKr8dWO3PBFRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERHRrPL/AZmlY8H9gByUAAAAAElFTkSuQmCCabs10-471009height103566433400.9584480.587962583843564983550.45177427992306074 \ No newline at end of file diff --git a/elements/pl-snap/Snap/Examples/vee.xml b/elements/pl-snap/Snap/Examples/vee.xml new file mode 100644 index 00000000..cb864154 --- /dev/null +++ b/elements/pl-snap/Snap/Examples/vee.xml @@ -0,0 +1 @@ +This is the project which started it all. After an example by E. Paul Goldenberg. Featuring recursion without the need for a base case and first class custom blocks it was Brian's demo at the 2008 Scratch conference, why Scratch needed custom procedures.To this day, Vee is the first project we test whenever we change anything or add new features to Snap.data:image/png;base64,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data:image/png;base64,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
\ No newline at end of file diff --git a/elements/pl-snap/Snap/HISTORY.md b/elements/pl-snap/Snap/HISTORY.md new file mode 100644 index 00000000..5bfa819a --- /dev/null +++ b/elements/pl-snap/Snap/HISTORY.md @@ -0,0 +1,9220 @@ +# Snap! (BYOB) History + +## in development: + +## 9.2.10: + * fixed #3322 + +2024-03-01 +* morphic: fixed #3322 +* prepared v9.2.10 patch + +## 9.2.9: +* **New Features:** + * new "preserveTitle" API configuration, thanks, Bernat! + * new "hideProjects" API configuration switch, hides / shows the project menu button in the tool bar + * new "hideSettings" API configuration switch, hides / shows the project menu button in the tool bar +* **Notable Fixes:** + * hide the cloud menu button when the "noCloud" API configuration is switched on + * hide the project menu button when the "noImports" API configuration is switched on + +2024-02-23 +* gui: make sure to hide the cloud menu button when "noCloud" API configuration is switched on +* gui: hide the project menu when "noImports" API configuration is switched on +* new: new "hideProjects" API configuration switch, hides / shows the project menu button in the tool bar +* new: new "hideSettings" API configuration switch, hides / shows the settings menu button in the tool bar +* prepared v9.2.9 patch + +2024-02-22 +* new dev version for v9.2.9 + +## 9.2.8: +* **Notable Fixes:** + * fixed a codification bug for strings beginning with a number, thanks, @schanzer, for the report! + +2024-02-20 +* blocks: fixed a codification bug for strings beginning with a number, thanks, Emmanuel, for the report! +* prepared v9.2.8 patch + +## 9.2.7: +* **New Features:** + * new "Lirin" costume series, thanks, Meghan and Brian! + * new showScriptBalloonAt() and closePopUps() API methods + * new flashSpriteScriptOutlineAt() and unflashSpriteScriptsOutline() API methods +* **Documentation Updates:** + * extended API documentation for flashing block outlines and displaying annotations in speech balloons + +2024-02-20 +* new dev version for v9.2.7 +* added new Lirin costumes, thanks, Brian and Meghan! +* api: added showScriptBalloonAt() and closePopUps() API methods +* api: added flashSpriteScriptOutlineAt() and unflashSpriteScriptsOutline() API methods +* prepared v9.2.7 patch + +## 9.2.6: +* **Notable Changes:** + * allow-listed birdbrain tech for extensions + +2024-02-13 +* extensions: allow-listed birdbrain tech for extensions +* prepared v9.2.6 patch + +## 9.2.5: +* **New Features:** + * api: added resetUnsavedChanges(), thanks, Bernat! +* **Notable Fixes:** + * api: fixed noExitWarning setting for sites that have their own mechanism, thanks, Bernat! +* **Documentation Updates:** + * extended API documentation for resetting the unsaved changes flag +* **Translation Updates:** + * Dutch, thanks, Jule Rapp! + +2024-02-12 +* new dev version for v9.2.5 +* Dutch translation update, thanks, Jule! +* api: resetUnsavedChanged(), thanks, Bernat! +* api: fixed noExitWarning setting for sites that have their own mechanism, thanks, Bernat! +* prepared v9.2.5 patch + +## 9.2.4: +* **New Features:** + * api: added flashSpriteScriptAt(idx) api for highlighting a single block at a finer granularity +* **Documentation Updates:** + * extended API documentation for highlighting a single block + +2024-01-22 +* api, blocks: new flashSpriteScriptAt() api +* extended API documentation for highlighting a single block +* prepared v9.2.4 patch + +2024-01-22 +* new dev version for v9.2.4 + +## 9.2.3: +* **New Features:** + * api: added optional color-csv parameter to flashScripts() api +* **Notable Fixes:** + * fixed a bug in the MQTT library, thanks, Simon! +* **Documentation Updates:** + * extended API documentation for optional scripts-flashing color + +2024-01-22 +* api: added optional color-csv parameter to flashScripts() api +* updated MQTT library, thanks, Simon! +* prepared v9.2.3 patch + +2024-01-21 +* new dev version for v9.2.3 + +## 9.2.2: +* **New Features:** + * new "dot" symbol (for "dot-product" block labels on machines where the unicode char is not available) +* **Notable Changes:** + * the variadic SUM reporter now also accepts a scalar (single number) as input (and returns it as identity) + * changed the filter names in the pixels library to lowercase +* **Notable Fixes:** + * fixed #3296 (make sure to stop video when resizing the stage) +* **Translation Updates:** + * Ukrainian, thanks, Serhiy Kryzhanovsky! + +2024-01-19 +* gui: fixed #3296 (make sure to stop video when resizing the stage) +* pixels library: Changed the filter effect names to lowercase +* Ukrainian translation update, thanks, Serhiy Kryzhanovsky! +* prepared v9.2.2 patch +* fixed a syntax glitch in the Ukrainian translation update + +2024-01-18 +* new dev version for v9.2.2 +* symbols: added "dot" symbol +* threads: also accept a scalar (single number) in the variadic SUM reporter (returns its identity) + +## 9.2.1: +* **New Features:** + * experimental "dta_zip(list)" extension primitive +* **Notable Fixes:** + * fixed a raycasting glitch, thanks, Dariusz, for yet another brilliant catch! + * fixed a typecasting glitch when creating a stage menu with numerical title + +2024-01-15 +* new dev version for v9.2.1 +* threads: fixed a raycasting glitch, thanks, Dariusz, for yet another brilliant catch! +* objects: fixed a typecasting glitch when creating a stage menu with numerical title +* extensions: added experimental "dta_zip(list)" extension primitive +* prepared v9.2.1 patch + +## 9.2.0: +* **New Features:** + * (better) matrix-kernel convolution support, automatic zero-padding + * new graphic filter effects tools in the pixels library + * support for THIS "inputs" selector inside custom block definitions +* **Notable Changes:** + * hyperized ITEM OF + * tweaked hyperDyadic() to zip matching atoms based on comparing their dimensions backwards (as in NumPy) + * the SWITCH TO COSTUME command now accepts > 4 column pixel matrices both with or without color channels + * the NEW COSTUME reporter now accepts > 4 column pixel matrices both with or without color channels if its dimension inputs are left blank or zero + * playing back a list of numbers as sound now uses the host device's sample rate once the microphone has been initialized, otherwise 44.1 kHz (as before) + * MQTT library update, thanks, Simon! +* **Notable Fixes:** + * fixed a RESHAPE edge case when passing in a single zero dimension + * made sure ITEM OF returns data matching the shape specified by the query struct (automatic zero-padding) + * fixed speech balloons inside ASK menus + * added safeguard against accidentally querying too many list dimensions (e.g. when forgetting to transpose a convolution) + +2024-01-11 +* prepared v9.2.0 minor release + +2024-01-10 +* lists, threads, objects: optimized internal matrix ops by speeding up shape & rank determination assuming well-formed tables +* lists: some more minor optimizations for item() and columns() +* threads: added support for THIS "inputs" selector inside custom block definitions + +2024-01-09 +* pixels library: added Sobel edge-detection variants for left/right/top/bottom +* threads: use the microphone's sample rate for playing back lists of samples once it has been used, otherwise 44.1 kHz +* pixels library: added 5x5 Gaussian blur filter + +2024-01-08 +* threads: tweaked hyperDyadic() to allow explicit dimension matching +* pixels library: added graphic filter effects (matrix-kernel convolutions) +* incremented dev version to v9.2.0 +* lists: added safeguard against accidentally querying too many dimensions +* threads: refactored reportDimensions() +* threads: accept > 4 column pixel matrices in the NEW COSTUME reporter leaving the dimension inputs blank or zero +* objects: accept > 4 columns pixels matrices as costumes in the SWITCH TO COSTUME reporter + +2024-01-05 +* objects: fixed speech balloons inside ASK menus + +2024-01-03 +* new dev version for v9.1.2 +* lists: fixed a RESHAPE edge case when passing in a single zero dimension +* lists: made sure ITEM OF returns data matching the shape specified by the query struct +* lists: hyperized ITEM OF +* threads: refactored reportRank() +* threads: tweaked hyperDyadic() to zip matching atoms based on comparing their dimensions backwards (as in NumPy) +* threads: refactored hyperizing mechanism for coordinates + +## 9.1.1: +* **Notable Fixes:** + * fixed using #open: to load a library from a url, thanks, Bernat! +* **Translation Updates:** + * Catalan, thanks, Joan! + +2023-12-12 +* gui: fixed using #open: to load a library from a url, thanks, Bernat! +* Catalan translation update, thanks, Joan! +* prepared v9.1.1 patch + +## 9.1.0: +* **New Features:** + * new 'text' list conversion selector, recursively joins all text and number leaf elements with spaces in between, filtering out and ignoring whitespace + * text inside "say" and "think" balloons gets vertical scroll bars if it exceeds the displayable space, is scrolled to the bottom by default to support language projects such as sengen + * added "say" commands to the stage's palette + * added "write" command to the stage's PEN primitives palette - prints text in proportional font at specified size wrapping lines "scrolling" to the end + * added "min", "max" and "atan2" reporters to the OPERATORS palette +* **Notable Changes:** + * "reshape" now treats zero-ish (0, "", false) values in its dimension input as place-holders to accomodate the whole source list + * updated "Just Words" library for the new "text" list selector + * experimental setting to let list indices wrap around bounds, e.g. 0 returns the last element, -1 the second last etc., turned off, probably not a good idea +* **Notable Fixes:** + * fixed "relabel" for HOF primitives (MAP, FIND, KEEP, COMBINE) + * optimized scanning variable memory for function dependencies - speed up editing custom blocks in projects with large lists +* **Translation Updates:** + * German + +2023-12-05 +* updated "Just Words" library, made sure it's a library file, not a project +* prepared v9.1 minor release + +2023-11-30 +* objects: scroll text inside speech/thought balloons, display long text scrolled to the bottom to support language-centered projects (e.g. sengen) + +2023-11-29 +* objects, threads, scenes: added "say" commands to the stage's palette + +2023-11-27 +* objects: tweaked "write" primitive for the stage +* updated "Just Words" libary with a new version of the "sentence" reporter + +2023-11-24 +* objects: optimized scanning variable memory for function dependencies - speeds up editing custom blocks in projects with large lists +* lists: turned off experimental list indices wrapping by default, not sure whether this is a good idea after all +* blocks: fixed "relabel" for HOF primitives (MAP, FIND, KEEP, COMBINE) +* objects: added "write" command to the stage's PEN primitives palette - prints text in proportional font at specified size wrapping lines "scrolling" to the end +* objects: added "min", "max" and "atan2" reporters to the OPERATORS palette + +2023-11-23 +* lists, gui: let list indices wrap around bounds, e.g. 0 returns the last element, -1 the second last etc. + +2023-11-22 +* new dev version for v9.0.15 +* lists, blocks, threads: new 'text' list conversion selector, recursively joins all text and number leaf elements with spaces in between, filtering out and ignoring whitespace +* German translation update for 'lines' list selector +* updated "Just Words" library for the new "text" list selector, removed now redundant "append words" reporter +* lists: changed "reshape" to treat zero-ish (0, "", false) values in its dimension input as place-holders to accomodate the whole source list +* pushed dev version to v9.1.0 + +## 9.0.14: +* **Notable Fixes:** + * fixed 'distribution' and 'uniques' list selectors support for nested atomic lists +* **Translation Updates:** + * Spanish, thanks, David Martín! + * Chinese, thanks, moodykeke! + +2023-11-21 +* new dev version for v9.0.14 +* threads: fixed 'distribution' list selector support for nested atomic lists +* threads: fixed 'uniques' list selector support for nested atomic lists +* Spanish translation update, thanks, David Martín! +* Chinese translation update, thanks, moodykeke! +* prepared v9.0.14 patch + +## 9.0.13: +* **Notable Fixes:** + * fixed word-sentences library + +## 9.0.12: +* **Notable Fixes:** + * fixed loading the "Words, sentences" library + * fixed importing data into single-palette mode projects (avoid garbling the palette) + * fixed some broken file references in the pwa cache +* **Library Updates:** + * added 3 minimal library variants "Just Words", "Replace Letters" and "Just Bars" + +2023-11-20 +* new dev version for v9.0.12 +* gui: fixed importing data into single-palette mode projects (avoid garbling the palette) +* sw: fixed #3270 (service worker cache uri issues) +* added 3 minimal library variants "Just Words", "Replace Letters" and "Just Bars" +* prepared v9.0.12 patch + +## 9.0.11: +* **Notable Fixes:** + * fixed global color sensing - workaround for Chrome v119's canvas clipping bug - used in pipette tool in paint editors, color input slots and color sensing primitives +* **Translation Updates:** + * Italian, thanks, Stefano! + * Spanish (libraries), thanks, Victoria and Mary! + +2023-11-07 +* morphic: fixed global color sensing - workaround for Chrome v119's canvas clipping bug - used in pipette tool in paint editors, color input slots and color sensing primitives +* Italian translation update, thanks, Stefano! +* Spanish (libraries) translation update, thanks, Victoria and Mary! +* prepared v9.0.11 patch + +## 9.0.10: +* **Notable Fixes:** + * fixed localizing blocks search and keyboard entry, thanks, Oliver, for the bug report! + +2023-11-02 +* objects: fixed localizing blocks search and keyboard entry, thanks, Oliver, for the bug report! +* prepared v9.0.10 patch + +## 9.0.9: +* **Notable Fixes:** + * fixed localizing relabelled primitive blocks +* **Translation Updates:** + * Spanish, thanks, David Martín! + +2023-10-30 +* blocks: fixed #3263 - localizing relabelled primitive blocks +* Spanish, translation update, thanks, David Martín! +* prepared v9.0.9 patch + +## 9.0.8: +* **Notable Fixes:** + * SPLIT now observes the preference setting for case-sensitivity + * fixed a typo in 'noDefaultCat' configuration setting, thanks, Emmanuel, for the report! +* **Translation Updates:** + * Brazilian Portuguese, thanks, Ville Medeiro! + +2023-10-20 +* threads: made SPLIT observe the "case sensitivity" preference setting +* prepared v9.0.8 patch + +2023-10-17 +* Brazilian Portuguese translation update, thanks, Ville Medeiro! + +2023-10-11 +* new dev version +* gui: fixed a typo in 'noDefaultCat' configuration setting, thanks, Emmanuel, for the report! + +## 9.0.7: +* **Translation Updates:** + * Chinese, thanks, moodykeke! + +2023-10-09 +* Chinese translation update, thanks, moodykeke! +* prepared v9.0.7 patch + +## 9.0.6: +* **Notable Fixes:** + * fixed #3252 - local return glitch + * fixed #3248 - names of easing functions are swapped ("-"in"/"-"out") + +2023-09-14 +* threads: fixed #3252 - local return glitch +* animation library: fixed #3248 - names of easing functions are swapped ("-"in"/"-"out") +* prepared v9.0.6 patch + +## 9.0.5: +* **Notable Changes:** + * MQTT extension update, thanks, Xavier and Simon! + +2023-08-01 +* MQTT extension update, thanks, Xavier and Simon! +* prepared v9.0.5 patch + +## 9.0.4: +* **Notable Changes:** + * Emergency Patch for BJC Projects. + * The recent cache busting in #3238 is incompatible with BJC servers. + +## 9.0.3: +* **Notable Changes:** + * do not cache remote requests, thanks, Michael! +* **Translation Updates:** + * new Tigrinya translation, yay! Thanks, Tesfaldet Negash and Heran Sium! + * Catalan, thanks, Joan! + +### 2023-07-31 +* new dev version +* gui: do not cache remote requests, thanks, Michael! +* Catalan translation update, thanks, Joan! +* new Tigrinya translation, yay! Thanks, Tesfaldet Negash and Heran Sium! +* migrated block specs of new Tigrinya translation to the new format (underscores as placeholders for input slots) +* prepared v9.0.3 patch + +## 9.0.2: +* **Notable Fixes:** + * fixed #3239 (a context serialization glitch) + +### 2023-07-27 +* store: fixed #3239 (a context serialization glitch) +* prepared v9.0.2 patch + +## 9.0.1: +* **Notable Fixes:** + * fixed "play sound until done" blocking glitch + +### 2023-07-19 +* objects: fixed "play sound until done" blocking glitch +* prepared v9.0.1 patch + +## 9.0.0: +* **New Features:** + * new "this" reporter for introspection offering access to "script", "caller", "continuation" and "inputs", enabling programs to access their dynamic scope and runtime call-stack + * "call" is now hyperized and accepts a list/table etc. of rings as procedure input, returns a list/table etc. of applying all arguments to each ring. Currently constrained to primitive data (text, number, Boolean) inputs, albeit in any dimension (e.g. lists of lists of data) + * new "extent" selector in the "(attribute) OF (object)" reporter's dropdown menu returns a list if width-height coordinates + * new "uniques" selector in list properties reporter's dropdown, answers a new list containing the source list's unique values based on equality (i.e. a set) + * new "sorted" and "shuffled" selectors in list properties reporter's dropdown + * new "stage", "agent" and "script" selectors in "is a?" reporter's dropdown + * new "case sensitivity" preference setting + * new "case sensitivity" selector to the setting blocks' dropdowns + * new dropdown menu with "length", "lower case" and "upper case" selectors in the "length of text" reporter + * new option to make individual input slots in custom blocks "static", i.e. irreplaceable by reporters + * new option to specify a "separator" (infix) label for variadic input slots inside custom blocks + * new "replaceables" selector in block-attributes dropdown, manages whether inputs slots are static + * new "separators" selector in block-attributes dropdown, manages infix-separators for variadic input slots + * new "comment" selector in block-attributes dropdown, accesses cutom block definitions' help text, i.e. comments attached to the prototype hat + * new context comments preserve ring comments and hat block comments in the evaluator for later introspection + * new "generate puzzle" feature - single click Parson's Puzzle generator for educators + * new "solutions" selector in the "my (attributes)" reporter, answers a dictionary of a puzzle sprite's solution scripts tagged by their comments, if any + * new "Tiles" library, divides the stage into sub-regions in each of which to perform an action + * new "Arcs" library, turns sprites by a delta of degrees moving them at a given radius + * new "Sarron" and "Aleassa" costume series, thanks, Meghan and Brian! + * new Armenian translation, yay! Thanks to the contributors! + * new embedding configuration options: noSpriteEdits + * Expanded the `#open:` URL scheme to accept image URLs. + * new "ide_translation_dict", "ide_set_translation_dict(data)" and "txt_export(txt, name)" extension primitives + * new "hideDefaultCat" configuration setting, lets you hide the default built-in category buttons +* **Notable Changes:** + * IF is now variadic and expandable with "else if" cases + * explicit variadic input list visuals + * "this script" reporter has been morphed into the new general "this" introspection/self reflection reporter + * RUN/CC and CALL/CC primitives have been deprecated and removed from the palette, will still be present and work in existing projects + * changed the first input slot of the "reshape" block from "list" type to "any" type + * changed JOIN, APPEND and COMBINATIONS to show "with" infix label in between inputs, and to collapse from 2 inputs directly to "input list" case, same as +, min, AND etc. (monadic uses in existing projects will not change) + * dragging blocks and scripts out of balloons and watchers now only includes the surrounding ring if it has formal parameters + * changed the semantics of empty list-type slots to return a new empty list instead of "nothing" + * improved browser resource management for graphics and sounds + * changed long-form input dialog setting's behavior to automatically expand / collapse slot type view + * made "distribution" list selector case-sensitivity setting aware and optimized for atomic data + * slightly optimized pen drawing performance when WARPed + * removed multibranched conditional library (cases.xml), because IF is now variadic + * removed the "remove duplicates" reporter from the "list utilities" libraries because it is now a primitive + * updated audio comp library with a faster (hyper) version of the "Hz for secs" reporter + * updated animation library with a faster (hyper) version of "glide" and added "steps" selector to the "animate" command + * new "fade-in" block in the audio comp library lets you reduce audible "clicks" in sounds computed from raw samples + * messages and identifying sprites, costumes and sounds by their names is now case-insensitive by default (e.g. in "object", "broadcast", "of" blocks) + * translations now use abstract block specs + * updated the strings library for and with the new case sensitivity and lower case primitives + * generated JSON strings are now (somewhat) pretty printed (with newlines and indentations) + * increased arrows heads size for variadic inputs and dropdown menus + * confined the red drop-target halo of multi-slots to the boundaries of its arrows / arity controls +* **Notable Fixes:** + * fixed #3154 (let "this script" capture variables in rings) + * catch misspelled or non-existing translation keys in urls and elsewhere, thanks, Joan! + * fixed a bug that led to the default input of "When I am clicked" not being translated + * fixed serializing complex inputs to contexts (procedure objects) + * fixed dragging blocks, costumes and sounds out of table views + * fixed #3207 (initial arrow head orientation for long form input slot dialog) + * fixed a number/text type glitch in the "(ray length) TO (sprite)" reporter for hyperized angular offsets + * fixed #3180 (preserve zero values in blockified lists instead of turning them into empty slots) + * fixed stopping ASK prompter under certain race conditions + * fixed MAP, KEEP, FIND and COMBINE primitives to work with JS-funargs + * fixed assigning same costume names to recurrent video snaps + * fixed sound naming rules for same-named imports + * fixed preserving embedded scripts when collapsing variadic c-slots + * fixed preserving embedded scripts when relabelling blocks with variadic c-slots + * improved sensing precision when clicking on variadic slot arrows + * fixed JIT-compiling variadic Boolean infix ops (AND, OR) + * fixed identity case for COMBINATIONS + * fixed occasional costume reference error for computed, non-wardrobe costumes in sprite-duplicates + * fixed the "stage size" reporter in the "Getters and setters" library + * fixed accessing negative indices in linked lists +* **Documentation Updates:** + * extended API documentation for "noSpriteEdits" and "hideDefaultCat" configurations + * updated CONTRIBUTING.MD for the new underscore-placeholder notation for block input slot translations +* **Translation Updates:** + * German + * Greek, thanks, HM100! + * Armenian, thanks to the contributors! + +### 2023-07-18 +* lists: fixed accessing negative indices in linked lists +* v9-rc17 +* blocks: fixed a multi-arg slot insertion / deletion glitch +* v9-rc18 +* blocks: tweaked rendering of variadic arrows +* v9-rc19 +* prepared v9 release + +### 2023-07-17 +* Getters and setter library: fixed "stage size" reporter +* List utilities library: removed "remove duplicates" reporter (because it is now a primitive) +* v9-rc14 +* gui: new "hideDefaultCat" configuration setting +* updated API documentation for "hideDefaultCat" configuration +* v9-rc15 +* updated Pyret transpilation example +* changed list symbol representation for variadic slots +* v9-rc16 + +### 2023-07-14 +* byob, threads: prevent custom blocks from being deleted from scenes that have a puzzle solution +* v9-rc12 +* byob, objects, threads: reverted disabling block deletion for puzzle-solution projects, made sure to propagate changes to solutions instead +* v9-rc13 + +### 2023-07-13 +* blocks: trying out alternative visuals for the variadic arrows list symbol +* symbols: added new "verticalEllipsis" symbol +* blocks: tweaked ArrowMorph rendering +* morphic: increased subpixel rendering precision +* blocks: tweaked variadic input slot arrows (made them bigger yet) +* blocks: tweaked variadic C-Slot layout +* v9-rc10 +* blocks: slight layout correction for list symbols +* v9-rc11 + +### 2023-07-12 +* blocks: confine the red drop-target halo of multi-slots to the boundaries of its arrows / arity controls +* blocks, threads: renamed "values" list selector to "uniques" +* German translation update for "uniques" selector +* v9-rc7 +* blocks: replaced the variadic black "ladder" symbol with a white vertical ellipsis label +* blocks: changed the semantics of empty list-type slots to return a new empty list instead of "nothing" +* threads: made "distribution" list selector case-sensitivity setting aware +* threads: optimized "uniques" list selector for atomic data sets (e.g. CSVs) +* v9-rc8 +* threads: fixed a "uniques/distribution" optimization glitch +* v9-rc9 + +### 2023-07-11 +* blocks, symbols, gui: design overhaul of variadic input slots +* v9-rc5 +* blocks: fixed displaying multi-slot separators for the first 2 sub-slots +* blocks: fixed refreshing custom block instances whose multi-slots properties changed +* blocks, symbols: tweaked multi-slot layout +* v9-rc6 + +### 2023-07-10 +* new "Tiles" library, divides the stage into sub-regions in each of which to perform an action +* new "Arcs" library, turns sprites by a delta of degrees moving them at a given radius +* v9-rc4 + +### 2023-07-07 +* threads: changed order or priority for reporting comments +* blocks: moved "comment" down one item in the dropdown menu +* blocks, threads: new "extent" selector in the "(attribute) OF (object)" reporter's dropdown menu +* German translation update for the new "extent" menu option string +* byob: fixed a newly introduced non-long-form input slot bug when clicking the loop-arrow check mark +* v9-rc2 +* fixed a dropdown menu glitch in the OF reporter +* v9-rc3 + +### 2023-07-06 +* v9-rc1 + +### 2023-07-05 +* lists, blocks, threads: new "values" selector in list properties reporter's dropdown, answers a new list containing the source list's unique values based on equality (i.e. a set) +* German translation update for "values" selector +* blocks, objects, tables, threads: when dragging scripts and blocks out of balloons and watchers only include the surrounding ring if it has formal parameters +* tables: fixed dragging blocks, costumes and sounds out of table views + +### 2023-07-04 +* gui: keep script comments (attached to top blocks) when generating or adding to a puzzle +* threads: fixed a glitch when querying context comments +* threads, blocks: extended "comment" selector for introspection +* threads, blocks: new "solutions" selector in the "my (attributes)" reporter, answers a dictionary of a puzzle sprite's solution scripts tagged by their comments, if any +* objects: fixed a possible costume reference glitch when duplicating a sprite with a non-wardrobe costume +* German translation update for "solutions" selector + +### 2023-07-03 +* blocks: half-toned list symbols for collapsed RUN/CALL/LAUNCH/TELL/ASKL primitives +* gui: added multi-sprite Parson's Puzzle capability + +### 2023-07-02 +* new "Aleassa" costumes series, thanks, Meghan and Brian! + +### 2023-06-29 +* threads: new context comments preserve ring comments in the evaluator for later introspection +* blocks: when reifying hat blocks ("my scripts") use comments attached to them as context comments +* byob: when querying custom block definitions use comments attached to the prototype hat as context comment +* store: persist context comments + +### 2023-06-28 +* blocks, threads: tweaked "slots" result for variadic input groups, currently read-only +* blocks, threads: new "comment" selector in block-attributes dropdown, accesses cutom block definitions' help text, i.e. comments attached to the prototype hat +* German translation update for the "comment" block attribute + +### 2023-06-27 +* blocks, threads: new "replaceables" selector in block-attributes dropdown, manages whether inputs slots are static +* blocks, threads: new "separators" selector in block-attributes dropdown, manages infix-separators for variadic input slots +* blocks: apply declared separator to replaced default variadic inputs in custom blocks +* German translation update for "replaceables" and "separators" block attributes +* gui: changed naming scheme for generated puzzles + +### 2023-06-26 +* objects, gui, store: embed solutions in Parson's Puzzles +* gui: limit generating puzzles to sprites that are not already puzzles themselves +* German translation update for "solution" menu item strings + +### 2023-06-09 +* gui: keep the unattached comments when generating a puzzle +* gui: hide palette buttons by default when generating a puzzle +* German translation update for "Generate puzzle" menu item +* updated CONTRIBUTING.MD for the new underscore-placeholder notation for block input slot translations +* store: fixed a deserialization glitch that kept expanding SCRIPT VARS, thanks, Eckart, for the report! + +### 2023-06-08 +* blocks: fixed default names / count for variadic ring parameters and script variables +* threads: fixed identity case for COMBINATIONS +* removed multibranched conditional library (cases.xml), because IF is now variadic +* gui: new experimental "generate puzzle" feature - single click Parson's Puzzle generator for educators + +### 2023-06-07 +* blocks: added "with" infix to APPEND and COMBINATIONS primitives, making the blocks collapse from 2 inputs to input list, omitting the single input case, same a JOIN (and MIN, MAX) +* blocks: fixed a variadic input slot collapsing glitch + +### 2023-06-06 +* blocks: added "with" infix to JOIN, made it collapse from 2 inputs to input list, omitting the single input case +* German translation update for "with" (as JOIN infix label) +* byob, blocks: new option to specify a "separator" (infix) label for variadic input slots inside custom blocks +* blocks, byob, store: serialize variadic input slot separators +* blocks, byob: minor code tweaks +* blocks, byob: update collapsed variadic slots when changing the "static" setting + +### 2023-06-05 +* blocks: made drop-halo for variadic slots white (instead of red) in "explicit input list" mode +* blocks: tweaked variadic c-slot layout +* blocks: tweaked keyboard entry for new variadic conditionals +* store: make sure to expand restored variadic inputs to their minimum number of slots +* byob, blocks, store: new option to make individual input slots in custom blocks "static", i.e. irreplaceable by reporters + +### 2023-06-04 +* blocks: limited dropping reporters on variadic arrow heads to empty variadic slots in "explicit input lists" mode +* blocks: show "input list:" label for empty variadic slots, except when overriden by a "collapse" label + +### 2023-06-03 +* blocks: fixed zebra coloring for variadic input slots' list icons + +### 2023-06-02 +* blocks, symbols: made collapse list icon red +* blocks: tweaked collapse labels +* blocks: fixed translation of collapse labels +* blocks: increased variadic arrow heads size +* blocks: fixed render color for collapse list icons in flat design mode +* blocks: increased arrow heads size for dropdown menus +* blocks: tweaked input slot dropdown menu arrow layout + +### 2023-06-01 +* blocks: turned on "explicit input lists" for variadic slots +* blocks: tweaked variadic collapse labels for JOIN and RESHAPE + +### 2023-05-31 +* blocks: added collapse labels for explicit input lists +* blocks: made variadic infix inputs collapsible for explicit input lists +* blocks: added ability to specify empty variadic collapse labels +* blocks: tweaked variadic slot arrows layout +* threads: fixed reportAssociativeBool() for empty variadic inputs + +### 2023-05-30 +* blocks: enable explicit input lists in variadic slots, experimental, under construction +* gui: added hidden experimental "explicit input lists" session setting + +### 2023-05-24 +* threads: refactored variable error handling for new translation mechanism +* widgets: made confirmation dialog text auto-wrapping +* paint: removed newlines in switch-to-vector-editor confirmation for translation +* sketch: removed newlines in switch-to-bitmap-editor confirmation for translation +* gui: removed newlines in confirmation dialogs for translation +* objects: removed newlines in confirmation dialogs for translation + +### 2023-05-23 +* blocks: implemented postfix functionality for variadic slot labels +* blocks: implemented label groups for variadic slots +* German translation update for variadic "else if" case + +### 2023-05-22 +* gui: show a login message for student accounts, thanks, Michael! +* threads: added variadic conditional case to the experimental JIT compiler +* threads: fixed JIT-compiling variadic Boolean infix ops +* adjusted Pyret POC (transpile.xml) to new variadic operators / conditionals + +### 2023-05-21 +byob: preserve embedded scripts when relabelling custon blocks with non-matching variadic c-slots +blocks: make sure to fix layout when labelling primitive blocks +byob: make sure to fix layout when labelling custom blocks + +### 2023-05-20 +* blocks: improved sensing precision when clicking on variadic slot arrows + +### 2023-05-19 +* objects, threads: replaced IF with variadic version, took out block migration +* threads: fixed evaluating empty c-slots in variadic if block +* blocks: updated slot spec documentation for multi-slots +* blocks: preserve embedded scripts when collapsing variadic c-slots +* blocks: preserve embedded scripts when relabelling blocks with non-matching variadic c-slots + +### 2023-05-18 +* objects: enhanced migration spec for variadic expansion +* objects, blocks: renamed new variadic #cond spec into #elseif +* threads: fixed scope for new variadic conditionals +* threads: fixed script evaluation sequence for variadic conditionals +* objects: made IF variadic, experimental, destructive (!) and under construction + +### 2023-05-17 +* blocks, objects, threads: variadic IF, experimental, first pass, under construction + +### 2023-05-10 +* locale: fixed returning the original string when looking up an existing key with a falsy translation in the current translations language dictionary + +### 2023-05-09 +* extensions: added "ide_set_translation_dict(data)" extension primitive +* extensions: added "txt_export(txt, name)" extension primitive +* updated strings library with new case sensitivity and lower case primitives +* updated German translation with new case sensitivity strings +* lists: pretty print generated JSON strings +* migrated all translations to the new consolidated underscore notation for marking input slots + +### 2023-05-08 +* gui: reformatted some code to please JSHint ;) +* blocks, objects, threads: added dropdown menu with 'lower case' and 'upper case' selectors to "length of text" reporter +* locale: removed "length of %s" from English translation +* extensions: added "ide_translation_dict" extension primitive +* blocks: use abstract block specs for all translations + +### 2023-05-07 +* gui: made "case sensitivity" setting official +* blocks, threads: added "case sensitivity" selector to the setting blocks' dropdowns +* extensions: removed experimental case sensitivity primitive (because it's now official) + +### 2023-05-01 +* objects: changed new costume name function to reflect the case-sensitivity preference setting +* objects, threads: fixed costume naming rule for video snaps +* objects: changed new sound name function to reflect the case-sensitivity preference setting +* objects: fixed costume naming rule for nameless costumes +* objects: fixed sound naming rules for same-named imports + +### 2023-05-01 +* blocks, objects: changed messages dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed costume-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed sound-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed object-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed receiver-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed collidables-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed location-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed distance-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed clonable-names dropdown menu to reflect the case-sensitivity preference setting +* blocks: changed user-edit-names dropdown menu to reflect the case-sensitivity preference setting +* gui: changed new sprite name function to reflect the case-sensitivity preference setting + +### 2023-04-30 +* threads: simplified snapEquals() +* threads: made sprite name identification case-insensitive by default +* objects: made messages (broadcasts) case-insensitive by default +* objects: made "switch to costume" case-insensitive by default +* threads: made costume name identification case-insensitive by default +* objects, threads: made sound name identification case-insensitive by default + +### 2023-04-29 +* threads, gui: experimental hidden session preference settings for "case sensitive text comparison" +* extensions: new "txt_case_sensitive([bool])" extension primitive + +### 2023-04-28 +* blocks, objects: use abstract block specs for all translations (under construction) + +### 2023-04-25 +* threads: fixed MAP primitive to work with JS-funargs +* threads: fixed KEEP primitive to work with JS-funargs +* threads: fixed FIND primitive to work with JS-funargs +* threads: fixed COMBINE primitive to work with JS-funargs +* gui, objects: added configuration option for hideCorral +* gui, objects: renamed "hideCorral" configuration option to "noSpriteEdits" +* gui: also hide sprite bar and stage handle in "noSpriteEdits" configuration +* updated API documentation + +### 2023-04-23 +* adjusted German translation for "reshape" +* adjusted Catalan translation for "reshape" +* adjusted Greek translation for "reshape" +* adjusted Hindi translation for "reshape" +* adjusted Hindi translation stub for "reshape" +* adjusted Hungarian translation for "reshape" +* adjusted Italian translation for "reshape" +* adjusted Polish translation for "reshape" +* adjusted Brazilian Portuguese translation for "reshape" +* adjusted Simplified Chinese translation for "reshape" + +### 2023-04-22 +* objects: changed the first input slot of the "reshape" block from "list" type to "any" type + +### 2023-04-21 +* threads: hyperized CALL (without parameters) +* threads: added support for literal parameters to hyperEval() +* threads: added type assertion for literal parameters to hyperEval() +* threads: refactored assertType() to return the test value instead of a Boolean +* threads: tweaked "map" primitive for hyperEval() +* threads: refactored hyperEval() for non-scalar inputs + +### 2023-04-20 +* byob: changed long-form input dialog setting's behavior to automatically expand / collapse slot type view +* byob: make sure the input slot dialog is fully visible and within the World when toggling between title text and input name + +### 2023-04-19 +* threads: fixed stopping ASK prompter under certain race conditions + +### 2023-04-18 +* blocks: fixed #3180 (preserve zero values in blockified lists instead of turning them into empty slots) + +### 2023-04-17 +* fixed a number/text type glitch in the "(ray length) TO (sprite)" reporter for hyperized angular offsets + +### 2023-04-16 +* changed "this caller" to return only a single block. Use "this script of (this caller)" to get the procedure script + +### 2023-04-15 +* renamed "context" environment reporter (back) to "this" +* updated German and Greek translations for "context" -> "this" renaming + +### 2023-04-14 +* renamed "current" environment reporter to "context" +* updated German translation for "current" -> "context" rename +* updated Greed translation for "current" -> "context" rename +* blocks: added "stage" selector to "is a?" reporter's dropdown +* blocks: added "agent" and "script" selectors to "is a?" reporter's dropdown +* updated German translation for "agent" - hold your horses as we're discussing terminology + +### 2023-04-13 +* updated "animation" library: simplified "glide" and added "steps" selector to the "animate" command + +### 2023-04-12 +* cloud: switched to new backend url format, thanks, Bernat! +* new Armenian translation, yay! Thanks to the contributors! + +### 2023-04-06 +* Greek translation update, thanks, HM100! +* byob: fixed #3207 + +### 2023-03-31 +* store: fixed serializing complex inputs to contexts (procedure objects) + +### 2023-03-28 +* objects: fixed a bug that led to the default input of "When I am clicked" not being translated + +### 2023-03-27 +* gui, objects, store: incremented dev version to v9 +* new Sarron sprite character costume series, thanks, Meghan and Brian! +* gui: catch misspelled translation keys in urls, thanks, Joan! +* German translation update +* gui: updated credits to Meghan for Sarron costumes + +### 2023-03-26 +* threads: tweaked (attribute OF object) primitive to let scripts access their dynamic scope and runtime call-stack + +### 2023-03-24 +* objects: made deprecated CALLCC and RUN/CC available in the palette in dev for debugging + testing for compatibility + +### 2023-03-23 +* blocks, threads: added 'sorted' selector to list properties dropdown +* objects: slightly optimized pen drawing performance when WARPed +* blocks, threads: added 'shuffled' selector to list properties dropdown + +### 2023-03-22 +* blocks, threads: optimized and simplified continuations +* blocks, threads: added "inputs" selector to "this" reporter dropdown +* objects: removed RUN/CC and CALL/CC from the blocks palette + +### 2023-03-21 +* threads: optimized and simplified "this caller" infrastructure + +### 2023-03-20 +* threads: fixed #3154 (let "this script" capture variables in rings) +* objects, threads: capture the dynamic scope in "this caller" (temporary & experimental) +* blocks, objects, threads: collapsed "this script" and "this caller" into new "this (environment)" reporter +* gui, store: pushed dev version to 8.3 + +### 2023-03-17 +* objects, guj: added "dynamic sprites rendering" hidden option setting for debugging purposes +* audio comp library: new "fade-in" block that lets you reduce audible "clicks" in sounds computed from raw samples + +### 2023-03-16 +* objects: dynamically cache sprite image depending on graphic effects +* morphic: fixed scale when grabbing uncached image morphs +* objects, threads: fixed #3075 (except Chrome still sabotages sounds, browsers suck) +* updated audio comp library with a faster (hyper) version of the "Hz for secs" reporter + +### 2023-03-15 +* objects: turned off image caching for sprites, experimental + +### 2023-03-14 +* new dev version + +## 8.2.3: +* **Notable Fixes:** + * fixed blocks search for scenes, thanks, Peter, for the report! + +## 8.2.2: +* **Notable Fixes:** + * fixed "letter random of text" selector + * fixed "insert thing at random of list" selector + * fixed "replace item random of list with thing" selector + * fixed #3193 (invoking the scenes menu inside a custom block editor) + +### 2023-03-13 +* prepared v8.2.2 release + +### 2023-03-10 +* new dev version +* threads: fixed "letter random of text" selector +* threads: fixed "insert thing at random of list" selector +* threads: fixed "replace item random of list with thing" selector +* blocks: fixed #3193 (invoking the scenes menu inside a custom block editor) + +## 8.2.1: +* **Notable Fixes:** + * fixed #3190 - unable to search blocks in the stage + * fixed finding blocks by typing their infix or collapse variants (e.g. "and", "or", "sum", "product" etc.) + * fixed #3191 - keep certain warning dialogs open when switching scenes + +### 2023-03-05 +* new dev version +* objects: fixed #3190 - unable to search blocks in the stage +* objects: fixed finding blocks by typing their infix or collapse variants (e.g. "and", "or", "sum", "product" etc.) +* gui, widgets, store: fixed #3191 - keep warning dialogs open when switching scenes +* prepared v8.2.1 release + +## 8.2.0: +* **New Features:** + * AND / OR are now variadic (and hyper!), thanks, Dan, for the suggestion + * all comparison operators are now variadic + * new "distribution" selector in the list attribute reporter's dropdown menu +* **Notable Changes:** + * removed variadic reporters library (because the primitives are now variadic) + * MQTT library update, thanks, Simon and Xavier +* **Notable Fixes:** + * fixed "rename" and "rename all" for custom block formal parameters + * fixed accessing random list elements + * TuneScope hotfix, thanks, Harsh, Glen & team! + * fixed including hidden variables when exporting blocks + * fixed #3183 - determining the length of huge strings fails +* **Translation Updates:** + * German + * Catalan, thanks, Joan! + +### 2023-03-01 +* prepared v8.2 release + +### 2023-02-28 +* Catalan translation update, thanks, Joan! +* v8.2-rc2 + +### 2023-02-27 +* adjusted Kannada translation for variadic comparison ops +* adjusted Korean translation for variadic comparison ops +* adjusted Malayalam translation for variadic comparison ops +* adjusted Norwegian translation for variadic comparison ops +* adjusted Polish translation for variadic comparison ops +* adjusted Portuguese translation for variadic comparison ops +* adjusted Romanian translation for variadic comparison ops +* adjusted Russian translation for variadic comparison ops +* adjusted Slovenian translation for variadic comparison ops +* adjusted Slovakian translation for variadic comparison ops +* adjusted Swedish translation for variadic comparison ops +* adjusted Tamil translation for variadic comparison ops +* adjusted Telagu translation for variadic comparison ops +* adjusted Turkish translation for variadic comparison ops +* adjusted Ukrainian translation for variadic comparison ops +* adjusted Simplified Chinese translation for variadic comparison ops +* adjusted Traditional Chinese translation for variadic comparison ops +* adjusted Greek translation for variadic comparison ops +* adjusted Dutch translation for variadic comparison ops +* adjusted Catalan translation for variadic comparison ops +* adjusted Brazilian Portuguese translation for variadic comparison ops +* lists: tweaked distribution() +* German translation update for list "distribution" +* threads: tweaked "unicode of" +* objects: changed 'When ... is edited' hat block label to lowercase +* v8.2-rc1 + +### 2023-02-26 +* threads: fixed #3183 - determining the length of huge strings fails +* blocks, threads, lists: added "distribution" selector to list attribute reporter + +### 2023-02-21 +* blocks, objects, threads: made all comparison operators variadic +* blocks: tweaked layout for variadic predicates +* blocks, objects: changed "any !=" to "all pairs !=", thanks, Dan! +* blocks: changed "all pairs !=" to "neighbors !=", thanks, Brian! +* gui: fixed #3186 - include hidden variables when exporting blocks +* German translation update +* adjusted Bulgarian translation for variadic comparison ops +* adjusted Bangla translation for variadic comparison ops +* adjusted Valencian Catalan translation for variadic comparison ops +* adjusted Czech translation for variadic comparison ops +* adjusted Danish translation for variadic comparison ops +* adjusted Esperanto translation for variadic comparison ops +* adjusted Spanish translation for variadic comparison ops +* adjusted Estonian translation for variadic comparison ops +* adjusted Basque translation for variadic comparison ops +* adjusted Finnish translation for variadic comparison ops +* adjusted French translation for variadic comparison ops +* adjusted Galician translation for variadic comparison ops +* adjusted Hebrew translation for variadic comparison ops +* adjusted Hindi translation for variadic comparison ops +* adjusted Arabic translation for variadic comparison ops +* adjusted Croation translation for variadic comparison ops +* adjusted Hungarian translation for variadic comparison ops +* adjusted Interlingua translation for variadic comparison ops +* adjusted Indonesian translation for variadic comparison ops +* adjusted Italian translation for variadic comparison ops +* adjusted Japanese translation for variadic comparison ops +* adjusted Japanese Hira translation for variadic comparison ops + +### 2023-02-20 +* TuneScope hotfix, thanks, Harsh & team! +* threads: fixed accessing random list elements + +### 2023-02-17 +* MQTT library update, thanks Simon and Xavier! +* removed variadic reporters library (because the primitives are now variadic) + +### 2023-02-16 +* adjusted Arabic translation for Boolean ops +* adjusted Bulgarian translation for Boolean ops +* blocks: fixed "rename all" for custom block formal parameters +* blocks: fixed "rename" for custom block formal parameters +* threads: refactored variadic AND, OR into generalized reportAssociativeBool() +* adjusted Bangla translation for Boolean ops +* adjusted Valencian Catalan translation for Boolean ops +* adjusted Czech translation for Boolean ops +* adjusted Danish translation for Boolean ops +* adjusted Esperanto translation for Boolean ops +* adjusted Spanish translation for Boolean ops +* adjusted Estonian translation for Boolean ops +* adjusted Basque translation for Boolean ops +* adjusted Finnish translation for Boolean ops +* adjusted French translation for Boolean ops +* adjusted Galician translation for Boolean ops +* adjusted Hebrew translation for Boolean ops +* adjusted Hindi translation for Boolean ops +* adjusted Croatian translation for Boolean ops +* adjusted Hungarian translation for Boolean ops +* adjusted Interlingua translation for Boolean ops +* adjusted Indinesian translation for Boolean ops +* adjusted Italian translation for Boolean ops +* adjusted Japanese translation for Boolean ops +* adjusted Japanese Hiragana translation for Boolean ops +* adjusted Kannada translation for Boolean ops +* adjusted Korean translation for Boolean ops +* adjusted Malayalam translation for Boolean ops +* adjusted Norwegian translation for Boolean ops +* adjusted Polish translation for Boolean ops +* adjusted Portuguese translation for Boolean ops +* adjusted Romanian translation for Boolean ops +* adjusted Russian translation for Boolean ops +* adjusted Slovenian translation for Boolean ops +* adjusted Slovakian translation for Boolean ops +* adjusted Swedish translation for Boolean ops +* adjusted Tamil translation for Boolean ops +* adjusted Telagu translation for Boolean ops +* adjusted Turkish translation for Boolean ops +* adjusted Ukrainian translation for Boolean ops +* adjusted Simplified Chinese translation for Boolean ops +* adjusted Traditional Chinese translation for Boolean ops +* adjusted Greek translation for Boolean ops +* adjusted Dutch translation for Boolean ops +* adjusted Catalan translation for Boolean ops +* adjusted Brazilian Portuguese translation for Boolean ops +* threads: accept Boolean values in "with input list" variant of variadic Boolean ops +* threads: let associative Boolean ops handle empty input lists +* threads: refactored evaluation to lazy initialize args +* threads: fixed base cases for variadic associative Boolean ops + +### 2023-02-15 +* pushed dev version to 8.2 +* blocks, objects, threads: made AND variadic +* blocks, objects, threads: made OR variadic +* adjusted English translation: removed "any" -> "random" rewording +* blocks: renamed all 'any' selectors in dropdowns into 'random' +* help: adjusted help screen file names for AND / OR +* adjusted German translation for Boolean ops +* blocks: added translation support for infix labels + +### 2023-02-13 +* new dev version + +## 8.1.6: +* **Notable Fixes:** + * fixed playing back a list of samples "until done", thanks for the report, @mjguzdial! + * fixed messed up stage layout when switching back from presentation to edit mode on small displays, thanks for the report, Eckart! + * fixed scaling down large stage sizes in presentation mode on small screens +* **Documentation Updates:** + * updated API documentation for onload() configuration callback option + +### 2023-02-10 +* gui: fixed scaling down large stage sizes in presentation mode on small screens +* gui: prepared v8.1.6 patch + +### 2023-02-09 +* gui: fixed messed up stage layout when switching back from presentation to edit mode on small displays, thanks for the report, Eckart! + +### 2023-02-08 +* new dev version +* gui: added onload() callback to configuration dictionary +* updated API documentation for onload() configuration callback option +* threads: fixed playing back a list of samples "until done", thanks for the report, @mjguzdial! + +## 8.1.5: +* **Notable Fixes:** + * fixed a scope highlighting bug + +### 2023-02-06 +* blocks: fixed a scope highlighting bug +* gui: prepared v8.1.5 patch + +## 8.1.4: +* **Notable Fixes:** + * blocks: fixed setting a default value for Boolean input slots in custom blocks + +### 2023-02-05 +* blocks: fixed setting a default value for Boolean input slots in custom blocks +* gui: prepared v8.1.4 patch + +## 8.1.3: +* **Notable Fixes:** + * fixed jit-compiling dropdown choices (e.g. "item /last/ of list") + +### 2023-02-04 +* threads: fixed jit-compiling dropdown choices (e.g. "item /last/ of list") +* gui: prepared v8.1.3 patch + +## 8.1.2: +* **Notable Fixes:** + * fixed #3176 - triggering user interaction hat blocks + +### 2023-02-04 +* objects: fixed #3176 - triggering user interaction hat blocks +* gui: prepared v8.1.2 patch + +## 8.1.1: +* **Notable Fixes:** + * loading old projects only hides new blocks if they already contain hidden ones + * distinguish selected named list indices ("random", "last") from same-named typed-in dictionary keys + * fixed opening projects when the language is set to non-English +* **Documentation Updates:** + * updated API documentation for "noAutoFill" configuration setting + +### 2023-02-03 +* threads: fixed distinguishing selected named indices ("random", "last") from same-named typed-in dictionary keys +* store: tweaked loading literal input slots +* blocks: disabled automatic translation of typed-in arguments that match translatable drop-down choices +* gui: fixed opening projects when the language is set to non-English +* updated API documentation for "noAutoFill" configuration setting +* prepared v8.1.1 patch + +### 2023-02-02 +* new dev version +* store: fixed #3175 - loading old projects only hides new blocks if they already contain hidden ones + +## 8.1.0: +* **New Features:** + * lists as dictionaries: alphanumeric indices for lists, access fields (JSON) and columns (CSV) by name + * include custom block data dependencies in libraries, eliminates the need for initialization routines creating and populating variables required by custom block definitions + * visually highlight variable scope when mouse-hovering over a variable declaration in visible stepping mode + * visually highlight the variable declaration of variable accessor blocks when mouse-hovering over them in visible stepping mode + * visually highlight senders / receivers when mouse-hovering over messaging blocks in visible stepping mode + * show intermediate results when debugging a script, i.e. when clicking on a script in visible stepping mode. Thanks, Vic! + * new "When (sprite) is edited" event hat block, supports light user interaction logging + * new PIPE primitive in the control category + * "touching" predicate now also accepts a 2-item list representing x/y-coordinates to check for collision with an arbitrary point + * hyper-rays: support lists of relative angles in the left "ray length TO sprite" input slot for instant fields of vision + * added "delete" option to context menu of global and sprite-local variable declarations in the blocks palette + * added "translations" selector to metaprogramming blocks + * new "disable dragging data" preference setting for (kids') MicroWorld creators + * pixels library: Added command blocks to rename and export costumes + * new "ide_blocks" extension primitive + * new extension primitives: "txt_to_utf8(txt)" and "txt_from_utf8(utf8List)", thanks, John! + * new extension primitive "txt_transform(name, txt)" for encoding, decoding, escaping, unescaping and hashing text + * new extension primitive "cst_export(cst, name)" for exporting/downloading a costume + * new extension primitive: "syn_scripts([xml])" for getting & setting (and deleting!) the scripts of a sprite + * codification: calling "code of" on a sprite returns a text version of its scripting area (concatenated codified scripts delimited by empty lines) + * extensions can auto-load and auto-exec allowed or allow-listed external JS scripts that modify the IDE, e.g. to add buttons by storing the external url in global (optionally hidden) variables whose name starts with "__module__" + * extensions can add custom buttons to the palette, thanks, Bernat! + * added retina support for inlined morphic worlds, enabling high-res embedding of Snap! components into other websites + * added configuration options for embedding Snap! into other websites + * new API methods for synchronizing scripts across sprites and Snap! instances + * new API methods for signalling scripts through highlighting blocks that correspond to marked portions of mapped text code +* **Notable Changes:** + * enabled same-named global and sprite-local variables + * no more error messages when the number of actual arguments doesn't match the number of implicit parameters + * removed empty parens from extension prims "ide_all_blocks", "ide_language" and "ide_translations" + * hyperized bitwise operators, and gave them more mnemonic block names, thanks, Bernat and Brian! + * optional inputs "broadcast" and "switch to scene" blocks don't auto-fill when called with an input list + * made formal parameters available in variable-menu dropdowns of all blocks inside of block editors + * hyperized "code of" reporter (codification primitive) + * round watcher readouts to 6 decimal digits (like Scratch), instead of 9 + * updated "for each" help screen, thanks, Brian! + * TuneScope extension update, thanks, Harsh, Jo and Glen! + * SciSnap2 extension update, thanks, Eckart! + * MQTT library update, thanks, Simon! + * removed PIPE from all libraries (b/c it is now a built-in primitive in the control blocks palette) + * updated "Codification" example project + * hide "stage selected - no motion primitives" text when hiding the category names in single palette mode + * order "my scripts" list by their top-down position in the scripting area (not by the time of their placement) + * don't show "result pic" option in block context menu with "click-to-run" disabled + * enable JavaScript extensions when running Snap! locally without a webserver (location.protocoll "file:") + * enable "JavaScript function" primitive to be hidden / shown independently from enabling JavaScript extensions + * shrunk some new built-in costumes, to make them load faster +* **Notable Fixes:** + * fixed refactoring (renaming) variables (I hope, haha!) + * fixed retaining transience when renaming a global or sprite-local variable + * fixed displaying message senders + * improved text wrapping - wrap words that are too wide for a line by letters + * improved touch-hold gesture on mobile Android devices, thanks, @ego-lay-atman-bay! + * don't show block relabel options that are marked as hidden + * fixed aggressive cache issue, thanks, Michael! + * fixed exporting pics of morphs in dev mode, thanks, @xBZZZZ! + * fixed API->broadcast() to also accept a data payload, thanks, Zak! + * SciScnap2 library: fixed SQL queries containing the percent characters + * fixed exporting information about blocks in custom categories when creating a summary document (#3097) + * fixed occasional "reporter did not report" error when changing a custom command block to become a reporter + * fixed a naming issue when importing duplicate data files + * fixed occasional errors when using "broadcast" and "this script" in the same script + * fixed deselecting / selecting blocks in the "Unused Blocks" dialog + * fixed "obj_name" extension prim to also accept numbers as names + * fixed "Make Variables" extension for numerical names + * fixed palette category ghosting update when hiding / unhiding blocks using extension primitives + * fixed accidentally drawing unwanted dots when changing a pen color dimension thanks, Joan! + * fixed zebra coloring for polyadic read-only input slots + * fixed a label rendering glitch when flashing blocks + * prevented variables from being renamed to blanks + * caught an occasional maximimum call-stack size range error when embedding blocks into a scripts pic + * improved frame scheduling, prevent excessive frame drops, thanks, SArpnt! + * hiding the keyboard handler text area better by reducing its visible dimensions to zero + * fixed a codification glitch for empty list slots + * fixed deleting embedded reporters in keyboard-entry mode + * fixed zebra coloring when importing a script from file or smart PNG + * fixed accidentally triggering "When I receive green flag" events for any broadcast message + * COMBINing an empty list with JOIN results in an empty text rather than in the number zero + * hide new primitives in old microworlds + * explicitly garbage collect (i.e. remove) terminated audio elements + * don't crash the "play frequency" block when passing a non-numerical input +* **Documentation Updates:** + * new "docs" folder for documentation files, thanks, Michael! + * new doc for extensions, thanks, Michael! + * extended API documentation +* **Translation Updates:** + * German + * Catalan, thanks, Joan! + * Dutch, thanks, Hans! + * Brazilian Portuguese, thanks, Artur! + +### 2023-02-01 +* added remote modules for CS10 and BJC, thanks, Michael! +* updated version history +* v8.1-rc5 +* fixed another "unused blocks" glitch for dependencies +* v8.1-rc6 +* added Victoria to the credits tab +* v8.1-rc7 +* prepared v8.1 release + +### 2023-10-31 +* blocks, threads, objects, lists: alphanumeric indices for lists, experimental +* byob: fixed "unused blocks" dialog +* morphic, gui: removed experimental canvas image data optimization +* v8.1-rc2 +* alphanumeric index for insert +* v8.1-rc3 +* adjusted translations to changed block spec for "letter of" +* v8.1-rc4 + +### 2023-01-30 +* gui: added spriteNamed() helper +* api: added getSpriteScriptsXML() +* api: added loadSpriteScriptsXML() +* api: added unflashSpritScripts() +* api: added flashSpritScripts() +* updated and extended API documentation +* v8.1-rc1 + +### 2023-01-29 +* shrunk some new built-in costumes, to make them load faster + +### 2023-01-27 +* threads: show intermediate results when debugging a script, i.e. when clicking on a script in visible stepping mode. Thanks, Vic! +* threads: tweaked above to correctly display lists and tables, and also handle custom reporters + +### 2023-01-26 +* locale: added Artur to the translators credits +* blocks: enabled scope-highlighting for touch devices, experimental + +### 2023-01-25 +* gui: experimental autoLoadExtensions() mechanism +* Brazilian Portuguese translation update, thanks, Artur! +* updated version history + +### 2023-01-23 +* gui, store: read back data dependencies included in exported libraries +* byob, gui: distinguish between global and sprite-local data dependencies +* gui, store: read back local data dependencies included in exported libraries +* blocks, gui: include custom block data dependencies in exported single scripts +* blocks: only include data dependencies in exported block definitions +* objects, gui: include global custom block data dependencies in exported sprites +* objects: fixed #3150 - renaming a transient variable removes its transience + +### 2023-01-22 +* byob, gui, threads: new file structure for libraries to include global data dependencies + +### 2023-01-21 +* threads: fixed fork() +* byob: init data dependencies for block export dialog +* byob: added data dependencies UI to block export dialog + +### 2023-01-20 +* lists: refactored some helper functions +* threads: added VariableFrame >> branch() +* threads: added VariableFrame >> merge() +* threads: renamed branch() to fork() + +### 2023-01-19 +* gui, extensions: added user edit event for language change + +### 2023-01-18 +* blocks: added "scriptOnly" flag to rewind() +* byob: added CustomBlockDefinition >> dataDependencies() + +### 2023-01-17 +* TuneScope update, thanks, Harsh, Jo and Glen! +* MQTT library update, thanks, Simon! + +### 2023-01-16 +* extensions: refactored extension primitive "ide_synchscripts(obj, xml)" into "syn_scripts([xml])" +* objects: added Sprite >> synchScriptsFrom(xml) method (internal) +* updated pyret.html with example code for exporting & importing xml + +### 2023-01-13 +* morphic: catch occasional stack overflow when embedding data into a PNG +* gui: fixed #3158 + +### 2023-01-12 +* updated inline.html test page with "noDevWarning" configuration +* objects: tweaked sprite name-change user edit event details + +### 2023-01-11 +* objects: added serialized scripts (w/o dependencies) to scripts-related user-logging events +* extensions: new extension primitive: "ide_synchscripts(obj, xml)", experimental, might change +* gui: added configuration option for "noDevWarning" + +### 2023-01-10 +* gui: added openScriptsOnlyString() method to IDE, experimental + +### 2023-01-09 +* store, objects: hide new primitives in old microworlds +* gui, objects: enable "JS function" primitive to be hidden / shown independently from enabling JavaScript extensions +* threads: explicitly garbage collect (i.e. remove) terminated audio elements in case they haven't been removed already +* objects: don't crash the "play frequency" block when passing a non-numerical input + +### 2023-01-05 +* threads: COMBINing an empty list with JOIN results in an empty text rather than in the number zero +* gui: enable JavaScript extensions when running Snap! locally without a webserver (location.protocoll "file:") +* Catalan translation update, thanks, Joan! + +### 2022-12-23 +* blocks, threads: added "translations" selector to metaprogramming blocks +* German translation update for "translations" selector + +### 2022-12-19 +* objects: fixed #3151 (accidentally triggering "When I receive green flag" events for any broadcast message) + +### 2022-12-13 +* gui, blocks, objects: refined user-edit events for blocks +* blocks: refined user-edits for comments: reactToEdit() +* blocks: refined user-edits for comments: collapse / expand +* blocks: refined user-edits for comments: grab +* blocks: refined user-edits for comments: drop +* blocks: refined user-edits for comments: snap +* blocks: refined user-edits for comments: delete by dropping on palette +* blocks: refined user-edits for comments: duplicate +* blocks: refined user-edits for blocks: snap +* blocks: refined user-edits for reporter blocks: delete + +### 2022-12-11 +* blocks: improved backmapping for codification, still under construction +* threads: hyperized "code of" reporter (codification primitive) +* threads: calling "code of" on a sprite returns a text version of its scripting area (concatenated codified scripts delimited by empty lines) + +### 2022-12-09 +* gui: added configuration option for "noUserSettings". Sigh. + +### 2022-12-08 +* blocks: backmapping for codification, under construction + +### 2022-12-06 +* gui: fixed zebra coloring when importing a script from file or smart PNG + +### 2022-12-04 +* gui: added configuration option for "zebra". Sigh. + +### 2022-12-02 +* gui: added configuration option for "blocksZoom" +* gui: added user-event for dropping a costume icon in the wardrobe +* objects: recategorized a costume user event +* gui: removed redundant "duplicate costume" user event +* gui: added costume # to "remove costume" user event +* gui: added "rename sound" user event +* gui: added "delete sound" user event +* gui: added user-event for dropping a sound icon in the jukebox +* blocks: fixed deleting embedded reporters in keyboard-entry mode + +### 2022-12-01 +* blocks: don't show "result pic" option in context menu with "click-to-run" disabled +* blocks: added configuration option for "noRingify" +* blocks: fixed search +* objects: fixed an event recording glitch +* blocks: don't show block relabel options that are marked as hidden +* byob: fixed disabling relabelling to hidden custom blocks +* fixed #3139 (Dutch translation) + +### 2022-11-30 +* German translation update +* gui: added configuration option for "noImports" +* blocks: fixed an event recording glitch +* blocks, byob, objects: added configuration option for "noOwnBlocks" + +### 2022-11-29 +* gui: added configuration option for "noPalette" +* objects: associate data with the "When (sprite) is edited" event hat block +* gui, objects: more detailed user-event logging +* blocks: more detailed user-event logging +* byob: more detailed user-event logging +* threads: more detailed user-event logging +* gui: more detailed user-event logging + +### 2022-11-28 +* objects: new recordUserEdit() mechanism +* objects: migrated objects to new recordUserEdit mechanism +* blocks: migrated blocks to new recordUserEdit mechanism +* blocks: migrated custom blocks to new recordUserEdit mechanism +* threads: migrated processes to new recordUserEdit mechanism +* extensions: migrated extensions to new recordUserEdit mechanism +* gui: migrated IDE to new recordUserEdit mechanism +* objects, blocks, gui: new "When (sprite) is edited" event hat block +* api: removed experimental scriptsAsText method (no longer needed) + +### 2022-11-26 +* threads: order "my scripts" list by their top-down position in the scripting area + +### 2022-11-25 +* gui: removed clickToRun configuration option (because it's supported by the microworld) +* gui: simplified configurations application +* gui: simplified noSprites configuration +* pyret: new codify tester +* gui: added version property to IDE for external observers +* blocks: fixed a codification glitch for empty list slots +* blocks: record unsaved changes when renaming a variable +* api: new experimental scriptsAsText() method + +### 2022-11-24 +* gui: added configuration option for path (to the host's base directory) +* gui: added configuration option for border (surrounding the IDE) +* gui: added configuration option for "hideCategories" +* gui: added configuration option for "load" +* objects: hide "stage selected - no motion primitives" text when hiding the category names in single palette mode + +### 2022-11-23 +* set up a test page for the Snap!-Pyret connection project +* SciSnap2 extension update, thanks, Eckart! +* gui: added hidden experimental 'Use CPU for graphics' preference setting for Canvas2D "willReadFrequently" property +* gui: added configuration object to IDE initialization +* gui: added configuration options for design, mode, blocksZoom, hideControls and noCloud +* gui: added configuration option for language +* gui: added configuration option for clickToRun +* gui: extended hideControls configuration for edit mode +* gui: added configuration option for noSprites +* refactored snap.html + +### 2022-11-22 +* morphic: added retina support for inlined worlds, enabling high-res embedding of Snap! components into other websites +* morphic: hide the keyboard handler text area better by reducing its dimensions to zero +* blocks: prevented variables from being renamed to blanks + +### 2022-11-21 +* morphic: added threshold to right-click on mobile, thanks, @ego-lay-atman-bay + +### 2022-11-18 +* blocks: made formal parameters available in variable-menu dropdowns of all blocks inside of block editors +* gui: refactored SpriteIcon >> flash() mechanism +* blocks: refactored Block >> showMesageUsers() + +### 2022-11-17 +* objects: fixed displaying message senders +* gui: parameterized SpriteIconMorph >> flash() +* gui, blocks: highlight senders / receivers when mouse-hovering over messaging blocks in visible stepping mode + +### 2022-11-16 +* blocks, objects: added comments to scope-highlighting +* blocks: refactored scope-highlighting entry point +* blocks: visually highlight the variable declaration of variable accessor blocks when mouse-hovering over them in visible stepping mode or when paused +* blocks: confined scope-highlighting to visible stepping mode & non-dragging +* blocks: catch attribute-references when highlighting variable scope + +### 2022-11-15 +* blocks: added "delete" option to context menu of global and sprite-local variable declarations in the blocks palette +* threads: fixed #3144 +* Catalan translation update, thanks, Joan! +* blocks: support flashing blocks in arbitrary colors +* blocks: fixed a label rendering glitch when flashing blocks +* blocks: visually highlight variable scope when mouse-hovering over a variable declaration in visible stepping mode or when paused +* blocks: extended variable scope highlighting to palette templates + +### 2022-11-14 +* blocks, objects: refactored renaming global and sprite-local variables + +### 2022-11-11 +* blocks: refactored renaming script variables, upvars and ring parameters + +### 2022-11-09 +* blocks: tweaked unwind() for rings + +### 2022-11-08 +* blocks: special cased unwind() for c-clots, experimental +* blocks: reverse unwind() sequence for rings, experimental +* blocks: nest unwound non-static c-slot scripts + +### 2022-11-07 +* objects: tweaked monitoring non-sprite morphs for development +* blocks: op-sequence analysis, experimental + +### 2022-11-02 +* updated "Codification" example project + +### 2022-11-01 +* morphic: made Canvas GPU/CPU optimization dynamic + +### 2022-10-31 +* morphic: improve text wrapping - wrap too wide words by letters +* morphic: turned Canvas GPU/CPU optimization into a central switch (after discovering severe slowdown in Chrome) + +### 2022-10-27 +* threads: tweaked assertType() and allowed empty text as zero-argument for changeVar() + +### 2022-10-26 +* blocks: caught an occasional maximimum call-stack size range error when embedding blocks into a scripts pic +* snap.html: improved frame scheduling, thanks, SArpnt! + +### 2022-10-25 +* objects, blocks, tables, scenes, gui: added new "disable dragging data" preference setting for (kids') MicroWorld creators +* store: made "disable dragging data" setting persistent per scene in project +* German translation update (for the new "disable dragging data" setting) + +### 2022-10-24 +* threads: added optional atomicity-control predicate callbacks to hyperDyadic() +* blocks, threads: fully hyperized (relation TO object) reporter with lists of relative angles for hyper-rays + +### 2022-10-21 +* objects: enabled same-named global and sprite-local variables +* gui: incremented dev version to 8.1 +* threads: tweaked context binding + +### 2022-10-20 +* removed PIPE from the iteration-composition library +* removed PIPE from the frequency-distribution-analysis library +* removed PIPE from the bar-charts library +* removed PIPE from the SciSnap!2Blocks library + +### 2022-10-19 +* threads: added ring-type assertion to PIPE primitive +* extensions, objects, widgets: custom extension buttons for palette categories, thanks, Bernat! + +### 2022-10-18 +* blocks: fixed zebra coloring for polyadic read-only input slots +* morphic: optimized getMinimumFontHeight() +* morphic: optimized canvas for reading back image data +* objects, threads: new PIPE primitive in the control category, experimental, not yet sure about this + +### 2022-10-17 +* objects: fixed a pen color dimension setting and position-inheritance bug, thanks, Joan! + +### 2022-09-30 +* objects, threads: added support for detecting sprite-collision with an arbitrary coordinate (a list of 2 numerical items representing x and y) +* TuneScope extension update, thanks, Harsh, Jo and Glen! + +### 2022-09-26 +* bitwise operators library: fixed #3118 +* updated German translation (removed obsolete argument-parameter mismatch error message) +* objects: added Sprite>>hasPrimitiveCategories() method + +### 2022-09-23 +* extensions: fixed palette category ghosting update when hiding / unhiding blocks +* updated "for each" help screen, thanks, Brian! + +### 2022-09-22 +* extensions: fixed "obj_name" extension prim to also accept numbers as names +* extensions: new "cst_export(cst, name)" extension primitive +* pixels library: Added command blocks to rename and export costumes +* extensions: fixed "Make Variables" extension for numerical names +* extensions: fixed and renamed "ide_blocks" extension primitive + +### 2022-09-21 +* extensions: refactored hyperized translation primitives +* band-aided bignums library +* gui: fixed #3097 +* threads: fixed #3083 +* gui: fixed #3099 +* byob: fixed #3105 + +### 2022-09-20 +* threads: refactored reportUnicodeAsLetter() +* threads: refactored reportTextSplit() +* threads: refactored reportAnd() & reportOr() +* threads: refactored reportNumbers() +* threads: refactored arithmetic ops +* threads: refactored reportModulus() +* threads: refactored reportAtan2() +* threads: refactored reportMin/Max +* threads: refactored some logic primitives +* threads: refactored reportNot() +* threads: refactored reportAttributeOf() +* threads: refactored reportBlockAttribute() +* extensions: refactored hyperized bitwise operators + +### 2022-09-19 +* blocks: optional inputs "broadcast" and "switch to scene" blocks don't auto-fill when called with an input list +* objects: round watcher readouts to 6 decimal digits (like Scratch), instead of 9 +* SciScnap2 library: fixed SQL queries containing the percent characters +* threads: removed error messages for arguments-parameters number mismatch +* threads: refactored and generalized hyper() +* threads: refactored reportRound() and reportMonadic() + +### 2022-09-18 +* blocks, threads: added "JS escape" option to text-transform reporter (in dev mode) +* extensions: new extension primitive "txt_transform(name, txt)" for encoding, decoding, escaping, unescaping and hashing text + +### 2022-09-14 +* extensions: new extension primitives: "txt_to_utf8(txt)" and "txt_from_utf8(utf8List)", thanks, John! + +### 2022-09-12 +* new dev version +* pwa: moved documentation into new "docs" folder, thanks, Michael +* fixed aggressive cache issue, thanks, Michael! +* hyperized bitwise operators, and gave them more mnemonic block names, thanks, Bernat and Brian! +* morphic: fixed exporting pics of morphs in dev mode, thanks, @xBZZZZ! +* api: fixed API->broadcast() to also accept a data payload, thanks, Zak! +* new "ide_all_blocks()" extension primitive, thanks, Michael! +* extensions: removed empty parens from extension prims "ide_all_blocks", "ide_language" and "ide_translations" + +## 8.0.0: +* **New Features:** + * passing a list to the ASK command in sensing presents a menu to the user + * formatting a list of texts displays it as chat-history in an ASK menu + * ASK nothing or a falsy value terminates all threads currently displaying a question or waiting to ask one and clears the last "answer" + * new "Menus" library + * broadcasting now supports optional additional data transmission, also when switching scenes + * export script (including dependencies) via its context menu + * export / import sprite-local custom block definitions from the palette + * export block definitions from inside the block editor + * embed blocks into costume metadata to be shared as image file + * exported script pics now always include the actual blocks, which can be extracted from the image inside Snap! + * exported scripts (!) pics now also always include either the actual blocks (if it's a single script), the block definition (if it's a block editor), or a sprite-representation of the current object (sprite or stage) + * added green flag symbol to "when I receive" dropdown menu, support when clicking the green flag button in the IDE + * added "combinations" primitive to the palette + * new POSITION primitive reporter in the MOTION category + * new MOUSE POSITION primitive reporter in the SENSING category + * new "position" choice in OF reporter's attribute dropdown, reports a list of XY coordinates + * new "variables" choice in OF reporter's attribute dropdown, reports a list of reachable variable names + * new "categories" choice in MY reporter's dropdown, reports an ordered list of all category names whose indices match the "category" reported elsewhere + * new "label", "type", "scope", "slots", "defaults", "menus" and "editables" choices in the OF BLOCK block-attribute reporter's dropdown + * new "set attribute of block" primitive + * new "define block" primitive + * new "delete block" primitive + * new "this script" primitive + * added support to the OF reporter for binding a ring to another one, e.g. THIS SCRIPT, to access its local variables + * new localization extension primitives in the "ide" category, hyperized + * new extension primitive for importing a costume from a url + * new extension primitive for querying all variable names accessible from a specified scope (global, sprite, script) + * new extension primitive for querying whether a watcher for a variable by name is shown onstage + * new support for setting the translation via the API + * new TuneScope extension and library, thanks, Glen, Eric, and team! + * new "Tad", "Jahrd", "Derec" and "Jamet" costume series, thanks, Meghan and Brian! +* **Notable Changes:** + * exporting a library includes dependencies (auto-select all referenced blocks) + * exporting / importing a sprite includes dependencies (global custom blocks and palette categories) + * imported single scripts are now placed into the hand, for the user to position them in the scripting area + * moved "append", "reshape", "combinations" blocks down one group in the palette + * moved "current date" block up to "timer" group in the palette + * moved "attribute of block" block from the sensing category to control + * include currently dragged sprites in the MY OTHER SPRITES/CLONES lists + * library import dialog makeover for custom categories and hidden blocks, thanks, Michael! + * when querying a custom reporter's "definition" property only report its reporter without the REPORT block (if applicable) + * SciSnap2 extension update (ImagePad), thanks, Eckart! + * MQTT extension update, thanks, Simon and Xavier! +* **Notable Fixes:** + * fixed relabelling "sum", "product", "minimum" and "maximum" reporters + * fixed relabelling local custom blocks to global ones and vice-versa + * fixed library blocks preview to deal with both local and global blocks + * fixed scope of script vars inside experimental JIT-compiled rings, thanks, xBZZZ! + * fixed a "wandering" watcher positioning bug when saving / loading a project into a scaled stage + * fixed an edge case for slot type inferral + * fixed variadic AND/OR reporters library, thanks, Brian! + * fixed a pen-size issue in the frequency distribution analysis' graph-plot block, thanks, Brian! + * fixed block label color when expanding or inserting variadic infix slots + * framerate is throttled to < 67 fps +* **Documentation Updates:** + * new Manual for v8, yay! Thanks, Brian! + * updated contribution guidelines, thanks, Peter! + * updated help screens for NUMBERS and FIND FIRST, thanks, Brian, Peter and WarpedWartWars! + * updated the API documentation for "setTranslation" +* **Translation Updates:** + * German + * Greek, thank you, HM100! + +### 2022-08-04 +* new Manual for v8, yay! Thanks, Brian! +* prepared major release v8 + +### 2022-08-03 +* gui: added credits for Bambi +* gui: added credits for Glen & team +* gui: added credits for Meghan +* blocks, threads: new "variables" choice in OF reporter's attribute dropdown, reports a list of reachable variable names +* German translation update for "variables" string (lowercased) + +### 2022-08-02 +* cloud: update +* new release candidate version + +### 2022-08-01 +* blocks, objects, store: include a representation of the stage as sprite in the "scripts pic" export if it is more than a single one +* removed some "under construction" markers +* new release candidate version +* threads: fixed an error display glitch +* new release candidate version + +### 2022-07-31 +* threads: fixed #3085 (I hope ^^) +* byob: fixed #3088 (I hope ^^) +* blocks: include the (whole) current sprite in the "scripts pic" export if it is more than a single one +* gui: support directly importing an embedded sprite inside a smart costume + +### 2022-07-30 +* Greek translation update, thank you, HM100!! +* blocks: include custom block definition in the "scripts pic" of the block editor +* blocks: include script xml (blocks) in the "scripts pic" export if it is a single one + +### 2022-07-23 +* throttle framerate to < 67 fps + +### 2022-07-22 +* v8.0.0 release candidate + +### 2022-07-21 +* fixed #3072 + +### 2022-07-20 +* new TuneScope extension and library, thanks, Glen, Eric, and team! + +### 2022-07-19 +* new "Jamet" costumes, thanks, Meghan and Brian! +* updated sw.js with new costumes +* updated sw.js with new libraries +* blocks, objects: added green flag symbol to "when I receive" dropdown menu +* objects: support "when I receive" hat blocks with (empty) data when clicking the green flag button in the IDE +* blocks: fixed reverting a mixed-type polyadic sub-slot back to default +* removed a bunch of "experimental" tags in the code and documentation + +### 2022-07-18 +* German translation update: Changed translation of "point in direction" to "setze Richtung auf ... Grad" +* threads: JSCompiler scope fixes and redesign, thanks, xBZZZZ! +* blocks: added support for mixed-typed polyadic inputs +* threads, blocks, objects, gui: added support for additional data transmission for broadcasts and scene switches +* German translation update for "with data" and "data" strings + +### 2022-07-11 +* extensions: fixed #3065 +* threads: added support to the OF reporter for binding a ring to another one, e.g. THIS SCRIPT to access its local variables +* byob: embed blocks code into all custom block definition pics + +### 2022-07-04 +* blocks, gui: directly import embedded blocks from a smart pic if the pic is dragged and dropped onto a scripting area or palette - otherwise import the pic as costume (with embedded blocks) +* gui: import smart pic as costume via "Import..." item in the project menu + +### 2022-07-01 +* extensions: added a slash-suffix to the EDC url allow-list entry + +### 2022-06-30 +* MQTT extension update, thanks, Simon and Xavier! + +### 2022-06-29 +* threads: catch empty options in "menus of blocks" selector +* threads: added support for "defaults" selector on primitives +* threads: added support for "editables" selector on primitives +* threads, byob: added support for "menus" selector on primitives +* extensions: new extension primitive for querying all variable names accessible from a specified scope (global, sprite, script) +* extensions: new extension primitive for querying whether a watcher for a variable by name is shown onstage +* new "Derec" costumes, thanks, Meghan and Brian! + +### 2022-06-28 +* blocks, byob, threads: new "menus" selector for block attributes +* German translation update for "menus" +* blocks, threads: new "editables" selector for block attributes (indicates read-only input slots) +* German translation update for "editables" +* blocks, threads: new "defaults" selector for block attributes +* blocks, objects, threads: new "delete block" primitive in sensing + +### 2022-06-27 +* threads: trim block label before identifying existing definition in DEFINE + +### 2022-06-25 +* threads: made slot-type mnemonics case-insensitive +* threads: made categories case-insensitive + +### 2022-06-24 +* threads: made block attribute "type" case-insensitive for textual mnemonics +* threads: allow variadic slot type declaration using ellipses after type numbers +* threads: allow case-insensitive text for custom block scope specification +* threads: update an existing global definition matching DEFINE's label +* German translation update (for new error message) + +### 2022-06-23 +* objects, threads: turned DEFINE into a command block with an upvar, experimental +* German translation update for the new format of the DEFINE block +* objects: moved DEFINE primitives to the control category +* threads: compile block references in DEFINE + +### 2022-06-22 +* objects, blocks, threads: new "this script" primitive in sensing, experimental +* German translation update for "define block" + +### 2022-06-21 +* threads: fixed #3061 + +### 2022-06-02 +* threads: when querying a custom reporter's "definition" property only report its reporter without the REPORT block (if applicable) + +### 2022-05-30 +* threads: support single value for slot type +* German translation update (for new strings 'type', 'scope' and 'slots') +* threads: added mnemonics support for programmatically setting slot shapes + +### 2022-05-29 +* blocks, threads: new "slots" choice in the OF BLOCK block-attribute reporter's dropdown +* blocks, threads: programmatically change slot shapes in custom blocks +* blocks: correctly identify list slots in primitives + +### 2022-05-28 +* new extension primitive for importing a costume from a url + +### 2022-05-27 +* blocks, threads: update programmatic custom block scope changes in data references + +### 2022-05-25 +* threads: update programmatic custom block-type changes in data references +* byob: update manual custom block-type changes in data references + +### 2022-05-23 +* blocks: fixed block label color when expanding or inserting variadic infix slots + +### 2022-05-20 +* byob, objects, threads: update sprite-local custom blocks in data + +### 2022-05-19 +* blocks, lists, objects, threads: made global Contexts observable +* gui: pushed dev version to 8 +* byob: update global custom blocks in data + +### 2022-05-17 +* blocks: added experimental private isChangeableTo(type) method +* blocks, threads: tweaked programmatic blocks-changing + +### 2022-05-06 +* threads: include currently dragged sprites in the MY OTHER SPRITES/CLONES lists + +### 2022-05-03 +* threads, byob: tweaked double definition naming + +### 2022-05-02 +* blocks, threads: programmatically change the type of unused custom blocks +* blocks, threads: new "scope" choice in block menu dropdown +* blocks, threads: programmatically change the scope of unused custom blocks +* blocks, objects, threads: new DEFINE BLOCK primitive +* objects: move DATE reporter up in the palette below TIME + +### 2022-05-01 +* byob: programmatically reduce the number of inputs in a custom block +* byob: programmatically add inputs to a custom block + +### 2022-04-28 +* threads, byob: programmatically re-define custom blocks, experimental, under construction +* threads: programmatically re-categorize custom blocks +* blocks, object: new "set attribute of block" primitive, experimental +* German translation update + +### 2022-04-27 +* threads, byob: custom block definition api, highly experimental, very much under construction + +### 2022-04-26 +* gui: distinguish between embedded blocks code and raw data in PNGs +* morphic: fixed bulk-drop of images +* German translation update for "get blocks" and "get data" +* store: fixed storing costume metadata in projects and sprite +* gui: switch to scripts pane when extracting blocks or data from a costume +* morphic, gui: place imported scripts into the hand (not into the scripting pane) + +### 2022-04-25 +* morphic, gui, objects, extensions: renamed "embeddedCode" property of costumes to "embeddedData" + +### 2022-04-24 +* morphic: fixed an encoding bug for embedding blocks in PNG metadata + +### 2022-04-22 +* morphic, objects, gui: support embedding blocks into PNG metadata +* blocks: automatically include extractable blocks in all script pics & result pics +* morphic: catch errors when decoding embedded PNG metadata + +### 2022-04-20 +* threads: terminate all threads waiting to display a question on ASKing a falsy value +* threads: clear "answer" on ASK nothing/falsy +* byob, blocks: export block definition from inside the block editor +* objects: added "code" field to Costume constructor +* objects, gui, extensions, store: support blocks embedded into costumes (under construction) + +### 2022-04-19 +* threads: ASK nothing or a falsy value terminates the thread currently displaying a question + +### 2022-04-08 +* blocks, threads: added new "label" selector to OF BLOCK's block dropdown +* German translation update for "label" + +### 2022-04-07 +* extensions: added "translateback" extension primitive +* extensions: hyperized "translate" extension primitive +* extensions: hyperized "translateback" extension primitive +* new "menus" library + +### 2022-04-06 +* extensions: tweaked restoring the display mode when changing languages +* gui: tweaked display status when refreshing the IDE + +### 2022-04-05 +* gui, extensions: refactored callback synch for language-switching +* extensions: renamed localization extension prims +* api: added "setTranslation" method to API +* api documentation update +* fixed help screen for FIND FIRST, thanks, Brian! +* MQTT library update, thanks, Simon! +* gui: library import dialog make-over for custom categories and hidden blocks, thanks, Michael! +* extensions: restore presentation mode when using the extension prim to change languages +* store: fixed a watcher positioning bug when saving / loading a project into a scaled stage + +### 2022-04-04 +* objects: added speech-balloon-value-association support for ASK menu items +* extensions: added new extension primitive "loc_translate(text)" +* extensions: added more extension translation primitives, under construction +* objects: tweaked ASK menu display distinction for FALSE Booleans +* extensions: tweaked localization extension prims, under construction +* extensions, gui: added new extension prims (done) + +### 2022-04-03 +* objects: added shortcut support for ASK menu items + +### 2022-04-01 +* objects: added ASK-menu data representation for Booleans +* objects: added ASK-menu data representation for Sounds +* objects: added icon support for ASK menu items +* objects: added formatting support for visualizing chat histories in ASK menus + +### 2022-03-31 +* threads, objects: new menu functionality for ASK command, when passing a list +* objects: support various data types inside menus (sprites, costumes, blocks) +* objects: wrap long texts inside menus into several lines +* objects: added new POSITION primitive block to the MOTION category +* threads: added new MOUSE POSITION primitive block to the SENSING category +* German translation update for "mouse position" +* blocks, threads: new "categories" choice in MY reporter's dropdown, reports an ordered list of all category names whose indices match the "category" reported elsewhere +* German translation for "categories" +* objects: tweaked submenu qualification for ASK + +### 2022-03-28 +* new "Tad" turtle costumes, thanks, Meghan and Brian! +* blocks, threads: new "position" choice in OF reporter's attribute dropdown, reports a list of XY coordinates +* German translation update for "position" + +### 2022-03-25 +* threads: added @xBZZZZ's JSCompiler fixes (was #3009) +* threads: refactored some JSCompiler code (mostly to please JSHint) + +### 2022-03-24 +* German translation update for "costume name" +* threads, extension: decodeURI XHR requests + +### 2022-03-23 +* byob: fixed #3020 +* SciSnap2 extension update (ImagePad), thanks, Eckart! + +### 2022-03-22 +* blocks: fixed relabelling "sum", "product", "minimum" and "maximum" reporters +* store: tweaked script deserialization +* byob: exporting a library includes dependencies (auto-select all referenced blocks) + +### 2022-03-21 +* updated frequency distribution analysis library, thanks, Brian! + +### 2022-03-18 +* objects, gui: refactored sprite serialization, added SpriteMorph >> toXMLString() api +* blocks: added optional receiver sprite to toXMLScript() api +* store: cleaned up version assertion +* gui: migrated library import dialog to the new file structure + +### 2022-03-17 +* blocks: refactored dependencies scan for scripts +* gui: refactored palette serialization for scripts +* byob, blocks, gui: refactored blocksLibraryXML() +* gui: new format for exporting sprites, under construction +* gui: store: import sprites with dependencies + +### 2022-03-16 +* restored v7.4.0-dev + +## 7.3.1: +* **Notable Fix:** + * guard against broken SVG costumes when loading a project + +### 2022-03-16 +* objects, threads: reformulated the zero-costume-width fix addressing a costume-loading issue +* German translation update for new error message +* prepared v7.3.1 emergency patch + +### 2022-03-15 +* blocks, store, gui: deserialize new format for exported scripts +* blocks: new "export script" feature (including dependencies) +* blocks: tweaked "export scripts" for reporters +* German translation update (for "export script" feature) +* blocks: added BlockMorph >> toXMLString() api + +### 2022-03-14 +* gui, byob: refactored library serialization +* blocks, byob, gui: new format for exported scripts, under construction + +### 2022-03-11 +* blocks: fixed an edge case for slot type inferral +* objects: added "combinations" primitive to the palette +* moved "append", "reshape", "combinations" blocks down one group in the palette +* incremented dev version +* updated variadic reporters library, thanks, Brian +* objects: adjusted library-import for sprite-local blocks + +### 2022-03-10 +* gui: made dev-warning closeable and added official url + +### 2022-03-09 +* new dev version +* byob, store, gui: export / import sprite-local custom block definitions, under construction +* byob, gui: adapted library import dialog to the new format +* byob: added collecting dependencies for sprite-local custom blocks +* objects: guard against broken SVG costumes when loading a project + +## 7.3.0: +* **New Features:** + * variadic associative infix reporters + * shift-click on STOP button to stop all scenes + * STOP "all scenes" dropdown option + * "category" selector for block-getter in sensing +* **Notable Changes:** + * show project name in browser tab, thanks, Peter! + * SciSnap2 extension update (FFT), thanks, Eckart! + * removed now redundant variadic reporters from the variadic reporters library +* **Notable Fixes:** + * addressed security issues in the JIT-compiler, thanks, xBZZZZ! + * animation library: fixed pen state for GLIDE, thanks, Brian! +* **Translation Updates:** + * German + +### 2022-03-07 +* blocks: refactored experimental export scripts feature +* prepared v7.3.0 + +### 2022-03-04 +* scenes, objects, threads, gui: refactored STOP +* German translation update for "all scenes" +* animation library: fixed pen state for GLIDE, thanks, Brian! +* threads: addressed security issues in the JIT-compiler, thanks, xBZZZZ! +* gui: show project name in browser tab, thanks, Peter! +* objects: handle (some cases of) extent-less costumes +* blocks, threads: "category" selector for block-getter in sensing +* updated German translation with "category" + +### 2022-03-03 +* SciSnap2 extension update (FFT), thanks, Eckart! +* threads: removed experimental code +* scenes, gui: shift-click on STOP button to stop all scenes +* blocks, threads: STOP "all scenes" dropdown option + +### 2022-03-02 +* gui: never close a dev-warning + +### 2022-03-01 +* blocks: adjusted restoring inputs for relabelling to / from variadic infix reporters +* blocks: refactored adding and removing inputs in variadic slots +* blocks: adjusted inserting / deleting single inputs in variadic infix slots +* objects: adjusted block-search-bar for variadic infix reporters +* objects: adapted formula editor for variadic infix reporters +* objects: removed scaffolding +* store: apply block migration dictionary to hidden blocks in microworlds +* store: removed scaffolding +* blocks: removed scaffolding +* threads: removed scaffolding +* renamed help screens for addition and multiplication blocks +* removed now redundant variadic reporters from the variadic reporters library +* added dev warning box + +### 2022-02-28 +* blocks, objects, threads, store: made addition reporter variadic +* blocks, objects, threads: made multiplication reporter variadic +* blocks: tweaked infix label shadow rendering +* German translation update (for "sum" and "product") +* blocks, objects, threads: made "min" and "max" reporters variadic +* German translation update (for "minimum" and "maximum") +* threads: added list-type assertions for new variadic blocks +* threads: adjusted optimizations for COMBINE to the new variadic infix reporters +* objects. adjusted relabel options for new variadic infix blocks + +### 2022-02-27 +* variadic infix branch + +### 2022-02-26 +* new dev version + +## 7.2.5: +* **Notable Fix:** + * escape JIT-compiled variable names + +### 2022-02-26 + * threads: escape JIT-compiled variable names + +## 7.2.4: +* **Notable Fix:** + * tweaked JOIN BLOCKS for variables + +### 2022-02-25 +* new dev version +* threads: tweaked JOIN BLOCKS for variables +* prepared patch + +## 7.2.3: +* **Notable Fix:** + * escape JIT-compiled inputs + +### 2022-02-25 + * threads: escape JIT-compiled inputs + +## 7.2.2: +* **Notable Changes:** + * renamed "crossproduct" to "combinations" +* **Translation Updates:** + * German + +### 2022-02-22 + * renamed "crossproduct" to "combinations" + +## 7.2.1: +* **New Features:** + * new "List Comprehension" library adding a HOF version of ZIP + * added "crossproduct" as relabel option for "append" +* **Translation Updates:** + * German + +### 2022-02-22 +* new dev version +* new "List Comprehension" library adding a HOF version of ZIP +* threads: added "crossproduct" as relabel option for "append" +* blocks: restore embedded inputs when relabelling variadic primitives +* German translation update for "crossproduct %lists" +* prepared patch + +## 7.2.0: +* **New Features:** + * new SciSnap2 extension and library, thanks, Eckart! + * new MQTT extension and library, thanks, Simon and Xavier! +* **Notable Changes:** + * hyperized reporter-IF/ELSE +* **Notable Fixes:** + * strings library: fixed lowercase(number), thanks, Brian and Simon! + * swapped "lists" and "other" in the make-a-block category menu, thanks Brian, for the report! + * don't let deleted sprites clone + +### 2022-02-21 +* threads: optimized hyper-if/else to skip repeated evaluation of literal true/false cases +* objects: prevent deleted sprites from cloning +* prepared v7.2.0 + +### 2022-02-18 +* new MQTT extension and library, thanks, Simon and Xavier! + +### 2022-02-17 +* strings library: fixed lowercase(number), thanks, Brian and Simon! +* new SciSnap2 extension and library, thanks, Eckart! +* added Eckart to the contributors credits +* byob: swapped "lists" and "other" in the make-a-block category menu + +### 2022-02-16 +* threads: hyperized reporter-IF/ELSE + +### 2022-02-14 +* new dev version +* gui: temporary fix for a new temporary Chrome v98 blank-tab bug (later reverted) + +## 7.1.4: +* **Notable Changes:** + * hyperized Boolean AND, OR operators +* **Notable Fixes:** + * preserve contents of variadic inputs when editing or translating a custom blocks + +### 2022-02-11 +* prepared v7.1.4 + +### 2022-02-09 +* new dev version +* blocks, byob: preserve contents of variadic inputs when editing or translating a custom blocks +* threads: hyperized Boolean AND, OR operators + +## 7.1.3: +* **New Features:** + * new bitwise operators library, thanks, Bernat! +* **Notable Fixes:** + * JSON encoding for nested lists + * enforce static typing for stage backgrounds and sounds, and for sprite duplicates + * prevent Chrome from crashing when using serial ports on a Mac, thanks, Dariusz! + * fixed missing blocks in variadic reporters library, thanks, Brian! + * fixed an infinite loop in the signada library, thanks, Bernat! + * fixed missing blocks in bar chars library + * fixed missing blocks in frequency distribution analysis library + * fixed missing blocks in iteration composition library + * fixed a comment in "remove duplicates" in the list utilities library + * fixed missing blocks in parallelization library + +### 2022-02-08 +* signade library: fixed cached values being stuck forever in edge case, thanks, Bernat! +* variadic reporters library: fixed blocks that apparently were "lost in translation" before, thanks, Brian! +* fixed PIPE in bar-charts library +* fixed PIPE in frequency distribution analysis library +* fixed PIPE in iteration composition library +* fixed the comment in "remove duplicates" in the list utilities library to reflect that the last match is kept +* fixed "do in parallel" block in parallelization library +* new bitwise operators library, thanks, Bernat! +* moved bitwise operators into standard extensions +* prepared v7.1.3 + +### 2022-02-07 +* lists: fixed JSON encoding for nested lists +* objects: fixed static "costume" type for stage backgrounds and sprite duplicates +* objects: fixed static "sound" type for stage backgrounds and sprite duplicates +* extensions: fixed #2980, thanks, Dariusz! + +### 2022-02-04 +* new dev version + +## 7.1.2: +* **Notable Changes:** + * friendlier error messages +* **Translation Updates:** + * German + +### 2022-01-31 +* new dev version +* threads, locale: friendlier error messages +* German translation update +* prepared v7.1.2 + +## 7.1.1: +* **Notable Fixes:** + * disabled reporter drops into "When I am ..." hat block (again) + * fixed "pick random" for descending ranges, thanks, Brian! + +### 2022-01-30 +* new dev version +* blocks: disabled reporter drops into "When I am ..." hat block (again) +* threads: fixed #2972 (fixed "pick random" for descending ranges), thanks, Brian! +* prepared v7.1.1 + +## 7.1.0: +* **New Features:** + * delete and insert individual variadic slots, script vars & ring params via the context menu + * drag blocks, costumes and sounds out from result bubbles, and from speech balloons and variable watchers when in edit mode + * export data (costumes, sounds, text, numbers, atomic lists) from result bubbles, and from speech balloons and variable watchers when in edit mode via the context menu +* **Notable Fixes:** + * fixed layout for scrolling custom categories, thanks, Eckart, for the bug report! + * text-costumes library: fixed preserving (more) pen state, thanks, Brian! +* **Translation Updates:** + * Hungarian, thank you, Attila Faragó, for this HUGE update! + * German + +### 2022-01-28 +* tables: support dragging costumes and sounds out from table views +* blocks: support exporting costumes from result bubbles +* blocks: support exporting sounds from result bubbles +* objects: support exporting sounds and costumes from speech balloons in edit mode +* objects: support exporting sounds and costumes from variable watchers in edit mode +* blocks: support exporting numbers and text from result bubbles +* objects: support exporting numbers and text from speech balloons when in edit mode +* lists: support exporting atomic lists from list watchers everywhere when in edit mode +* tables: support exporting atomic tables from table views everywhere when in edit mode +* v7.1.0 + +### 2022-01-27 +* blocks, gui: support dragging costumes and sounds out from result bubbles +* objects: support dragging costumes and sounds out from speech balloons +* objects: support dragging costumes and sounds out from variable watchers + +### 2022-01-26 +* blocks: refactored slot context menus +* blocks: support for deleting and inserting individual script vars & ring params +* German translation update +* blocks: support for deleting and inserting individual rings inside variadic inputs +* updated text-costumes library, thanks, Brian! +* Hungarian translation update, thank you, Attila Faragó! + +### 2022-01-25 +* blocks: support deleting and inserting individual variadic slots + +### 2022-01-23 +* morphic: added Node >> childThatIsA +* tables: support dragging blocks out from table views + +### 2022-01-22 +* blocks: support dragging blocks out from result bubbles +* objects: support dragging blocks out from speech balloons +* objects: support dragging blocks out from variable watchers +* morphic, objects: only allow dragging block out from balloons and watchers in edit mode (not in presentation mode) + +### 2022-01-21 +* new dev version +* gui: fixed layout for scrolling custom categories, thanks, Eckart, for the bug report! + +## 7.0.6: +* **Notable Changes:** + * added more localizable error strings +* **Notable Fixes:** + * fixed binding an unbound context to a sprite (e.g. when using JOIN blocks) + * fixed loading the Chinese translation, thanks, @moodykeke +* **Translation Updates:** + * German (for error messages) + +### 2022-01-21 +* threads: refactored Context >> image +* v7.0.6 + +### 2022-01-20 +* German translation update (for error messages) +* threads: added more localizable error strings +* objects: added more localizable error strings + +### 2022-01-17 +* new dev version +* fixed loading the Chinese translation, thanks, @moodykeke +* threads: fixed binding an unbound context to a sprite (e.g. when using JOIN blocks) + +## 7.0.5: +* **New Features:** + * text costumes library: new block to add a rectangular colored background with optional padding to a copy of a costume, for making "clickable buttons" +* **Notable Changes:** + * improved emoji handling for "length of text" reporter, thanks, Michael! + * added support for EDC's Early Math Microworld extension +* **Notable Fixes:** + * strings library: fixed an index range bug, thanks, Brian! +* **Translation Updates:** + * Chinese, thanks, Simon! + +### 2022-01-14 +* v7.0.5 + +### 2022-01-13 +* threads: improved emoji handling for "length of text" reporter, thanks, Michael! +* extensions: added support for EDC's Early Math Microworld extension + +### 2022-01-10 +* new dev version +* text costumes library: new block to add a rectangular colored background with padding to a copy of a costume +* Chinese translation update, thanks, Simon! +* strings library: fixed an index range bug, thanks, Brian! + +## 7.0.4: +* **New Features:** + * syntax tree format for translatable input options and constants: "[choice]" + * syntax tree support for variable getter names +* **Notable Fixes:** + * strings library: substrings handle negative indices as documented, thanks, Brian! +* **Translation Updates:** + * Catalan library translations, thanks, Joan! + +### 2022-01-07 +* blocks: added syntax tree representation for variable getters +* blocks, byob: blank-out variable getters in syntax-tree result list +* v7.0.4 + +### 2022-01-06 +* Catalan library translations, thanks, Joan! + +### 2022-01-05 +* new dev version +* blocks: added syntax tree representation for translated input options and constants +* strings library update, thanks, Brian! + +## 7.0.3: +* **New Features:** + * arity control for assembling polyadic inputs using JOIN (pass a list whose first item is an integer representing the number of slots followed by the contents of those slots) +* **Notable Changes:** + * same blocks with empty variadic inputs compare as equal regardless of their arity + * made "When I receive any messagge" non-thread-safe by default (again) to enable tail recursive broadcasts + * improved handling of user-defined errors and errors inside custom blocks +* **Notable Fixes:** + * fixed storing the stage name(s) - also fixes undesired translation + * removed distinction between number and string keys in "analyze" + * fixed variable binding when broadcasting through the API, thanks, Zak! + * fixed programmatically hiding palette blocks using the "hide variable" block, thanks, Zak! + * fixed / worked around PWA caching for URLs with query parts, thanks, Ken! + * added missing "identical to" relabel option to "less than" reporter, thanks, Mary! +* **Translation Updates:** + * Italian, thanks, Stefano! + +### 2022-01-04 +* manifest: fixed #2954 +* threads, blocks: added arity control for assembling polyadic inputs +* v7.0.3 + +### 2022-01-03 +* Italian translation update, thanks, Stefano! +* api: fixed variable binding when broadcasting through the API, thanks, Zak! +* objects: fixed programmatically hiding palette blocks using the "hide variable" block, thanks, Zak! +* threads, api: made "When I receive any messagge" non-thread-safe by default (again) to enable tail recursive broadcasts +* threads, extensions: improved handling of user-defined errors and errors inside custom blocks +* sw.js: fixed #2957, thanks, Ken! +* objects: fixed #2950, thanks, Mary! +* manifest: fixed #2954 + +### 2022-01-02 +* store: fixed storing the stage name(s) + +### 2022-01-01 +* extensions: removed distinction between number and string keys in "analyze" + +### 2021-12-22 +* new dev version +* threads: same blocks with empty variadic inputs compare as equal regardless of their arity + +## 7.0.2: +* **Notable Fixes:** + * setting a clone's rotation coordinates shadows its inherited costumes + * preserve embedded inputs when JOINing a nested expression with an empty list + * improved loading custom block categories + +### 2021-12-21 +* prepared patch + +### 2021-12-20 +* blocks, threads: preserve embedded inputs when JOINing a nested expression with an empty list +* objects: improved loading custom block categories + +### 2021-12-18 +* new dev version +* objects: shadow (a clone's) costumes when setting its rotation coordinates + +## 7.0.1: +* **Notable Changes:** + * better support for multi-byte emojis with "split" and "unicode", thanks, Michael! + * added support for Uni Oxford (Ken Kahn's) ecraft2learn extension +* **Notable Fixes:** + * keep the order of sprites in the corral when saving newly created projects + * allow parentheses in project names (again) + * dropping a library or sprite file into presentation mode switches back to edit mode + * exporting blocks uses the project name as file name, followed by "blocks" + +### 2021-12-17 +* prepared patch + +### 2021-12-16 +* gui: removed some commented out code +* gui: fixed #2941 +* byob: fixed #2945 + +### 2021-12-15 +* threads, lists: better support for multi-byte emojis with "split" and "unicode", thanks, Michael! +* extensions: added support for Uni Oxford (Ken Kahn's) ecraft2learn extension + +### 2021-12-14 +* new dev version +* store: keep the order of sprites in the corral when saving newly created projects +* gui: allow parens in project names + +## 7.0.0: +* **New Features:** + * scenes + * extensions + * single blocks palette option, thanks, Michael! + * web-serial support, thanks, Dariusz Dorożalski! + * hide any block, including variables and custom helper blocks in palette, also use "hide/show var" primitive on custom blocks (same as on primitives) + * generate Parsons Problems from projects: Hide all unused blocks from the scripting area in the palette + * user defined custom block palettes + * introspection, syntax analysis and assembly (new block-attribute reporter, split & join scripts) + * PWA, thanks, Joan and John, for pioneering this at Robolot and in Mircoblocks! + * new "blocksZoom=n" url parameter, thanks, Bernat! + * message and key hat blocks can be expanded to show an optional upvar referencing their event data + * BROADCAST blocks are expandable to feature a second input for message receivers, default is "all" + * block-instances can be dragged off from templates in the "export blocks", "unused blocks" and "hide blocks" dialogs + * added "enter" key to key-pressed dropdown + * added green flag symbol to message drop-down + * the green flag button's background color indicates whether the current scene is running or idle + * empty categories are indicated by half-tone buttons + * added "r-g-b-a" option to dropdown menu of SET / CHANGE PEN command and PEN reporter + * new preference setting per scene for pen color model and graphic effects, HSV or HSL, default is HSV + * new preference setting per scene to "disable click-to-run" on blocks, for use in micro-world extensions + * new Signada hardware library, thanks, Citilab Barcelona! +* **Notable Changes:** + * saved projects remember the last edited sprite + * libraries no longer rely on the JSF primitive, projects may need to re-import their libraries to run without having to enable JS extensions + * bulk hide/show arbitrary blocks in the palette via the palette's context menu (instead of the primitive blocks' context menus) + * hidden blocks don't appear in search results / keyboard input options + * codification and js-func blocks don't appear in search results unless enabled + * migrated SEND blocks to be BROADCAST TO blocks + * "when I receive 'any message'" hat scripts are threadsafe (uninterruptable by other messages) + * changed the scale of the graphics color effect from 0-200 to 0-100 + * result-bubbles (when clicking on a reporter) now stay visible until the next click + * took out "Hyper blocks support" setting from the gears menu (it's now hidden behind shift-click) + * new Birdbrain Technology extensions for Finch and Hummingbird, thanks, Kristina and Bambi! + * retired Leap Motion library + * display blocks with their error messages for custom blocks, thanks, Michael! + * made scrollbars thinner by default and slightly transparent in flat design mode + * blocked xhr requests from Snap! to s.b.e + * the "message" reporter and watcher in the control category has been deprecated and moved to dev mode for backwards compatibility + * updated the Snap! API and documentation with methods to navigate among scenes and control processes + * removed old hidden "prefer smooth animations" setting (no longer used, old projects will continue to work just fine) + * removed old hidden "virtual keyboard" setting (was no longer used for the last years) + * removed old hidden "project urls" setting + * removed hidden "cache inputs" setting (only used for debugging the evaluator) +* **Notable Fixes:** + * made scrollbars in the wardrobe and jukebox more responsive + * fixed centering of menus, thanks, Brian Broll! + * fixed occasional invisible error messages + * fixed audio_comp library "plot sound" block to work with translations, thanks, Hans, for the report! + * colors library: fixed SET PEN to work with more than a single sprite per costume, thanks, Jadga, for the report! + * fixed exporting comment pics from inside the block editor, thanks, Jadga, for the report! + * fixed copying unattached comments among sprites, thanks, Jadga, for the report! + * disabled dropping reporters onto message hat block input slots + * fixed outdated blocks specs for "When I am ..." hat block in many translations + * fixed duplicating custom block definitions that don't have a body + * allow selecting the fill color in the vector editor via touch-hold gesture on touch devices + * fixed an infinite loop in the FILL block when the pen colors have been set to an invalid color (via a bad library) + * fixed some minor variable-renaming issues + * fixed STOP OTHER SCRIPTS for use inside TELL + * made "remove duplicates" reporter in the "list utilities" library (a lot) faster + * fixed translation support for the libraries list, thanks, Joan! +* **Documentation Updates:** + * updated manual, thanks, Brian! + * updated readme, thanks, Michael! +* **Translation Updates:** + * German + * Chinese, thanks, Simon! + * Brazilian Portuguese, thank you, Cassiano D'Andrea! + * Catalan, thanks, Joan! + +### 2021-12-13 +* objects: tweaked asynchronous costume loading/rendering issue +* rc7 +* v7 release + +### 2021-12-12 +* threads: fixed #2932 + +### 2021-12-11 +* objects: remove all clones when the green flag is sent to a scene +* rc6 + +### 2021-12-10 +* Catalan and German translation updates, thanks, Joan! +* translation support for the libraries list, thanks, Joan! +* objects: fixed categories cache invalidation for duplicated sprites +* rc4 +* threads: remove all clones when the green flag is broadcast to all +* rc5 + +### 2021-12-09 +* blocks, threads: never push untested last minute changes that might break everything +* gui: select motion category when switching to a scene that doesn't have the current custom category +* rc2 +* objects: worked around an asynchronous rendering issue +* rc3 + +### 2021-12-08 +* blocks: refactored syntax trees +* rc1 + +### 2021-12-07 +* objects: backwards-compatibility fix for key-event hat blocks +* store, objects: load category-less custom blocks into "other" + +### 2021-12-06 +* blocks, threads: refactored block assembly, experimental +* German translation update + +### 2021-12-05 +* blocks, threads, objects: introspection & syntax analysis, experimental + +### 2021-12-03 +* blocks, threads: block-assembly support for multi-args, experimental +* threads: changed the visualization for an empty context to reporter-ring + +### 2021-12-02 +* blocks, threads: block-assembly support refactorings, experimental + +### 2021-12-01 +* blocks, threads: block-assembly support refactorings, experimental +* blocks, threads: equality testing for scripts, experimental + +### 2021-11-30 +* blocks, threads: block-assembly support, experimental +* gui: fixed #2920 + +### 2021-11-29 +* renamed "r-g-b-a" option to "RGBA" and "r-g-b(-a)" to "RGB(A)" + +### 2021-11-28 +* fixed a glitch in "remove duplicates" in the "list utilities" library + +### 2021-11-27 +* blocks, threads: tweaked SET / CHANGE PEN dropdown option to "r-g-b(-a)" +* made "remove duplicates" reporter in the "list utilities" library (a lot) faster + +### 2021-11-26 +* added signada extension files to the pwa cache +* blocks, treads, objects: added "r-g-b-a" option to dropdown menu of SET / CHANGE PEN command and PEN reporter + +### 2021-11-25 +* gui: rearranged and amended the project menu +* German translation update for project menu entries +* objects: fixed a FILL issue when the pen color has been set to an invalid color via a bad library + +### 2021-11-24 +* threads: fixed #2918 +* gui, objects, scenes: added scene-setting to hide/show buttons in the unified palette +* store: made "show buttons" setting for unified palette persistent in the XML +* German translation update for "Show buttons" setting +* added indented sub-preferences to the settings menu + +### 2021-11-23 +* byob: refresh category buttons when hiding / showing blocks +* gui: refresh category buttons when switching to dev mode and back +* gui: refresh category buttons when turning built-in extensions on and off + +### 2021-11-19 +* objects, byob, gui: visually indicate empty categories by half-toning their buttons + +### 2021-11-18 +* gui: only pause generic hat blocks when loading a new project, not when switching to a new scene + +### 2021-11-17 +* gui: set the green-flag button's background color to "active" while a thread is running +* api: changed "processes" method to "isRunning" +* updated api documentation +* gui: refresh stop button when switching scenes + +### 2021-11-16 +* store, gui: updated serializer app tag to v7 +* api: removed incomplete api documentation from the source code +* updated api documentation + +### 2021-11-15 +* German translation update +* gui: made "Hyper blocks support" setting hidden in the gears menu +* gui, objects, threads, store, translations: Removed old hidden "prefer smooth animations" setting +* gui: removed experimental hidden "add scenes" option from the settings menus +* gui, translations: removed old hidden "virtual keyboard" setting +* gui: removed old hidden "project urls" setting +* gui: removed hidden "cache inputs" setting (only used for debugging the evaluator) + +### 2021-11-14 +* locale: contextualize translations +* gui: refresh IDE when changing the pen color model + +### 2021-11-12 +* store: fixed importing custom categories from libraries, thanks, Eckart, for reporting this! +* gui, objects, scenes, store: reverted to HSV as default pen color model +* store: fixed a serialization conflict for global variables referencing the stage +* gui: made HSL preference setting hidden behind shift-click + +### 2021-11-11 +* German translation update, changed %hsva -> %clrdim +* Brazilian Portuguese translation update, thank you, Cassiano D'Andrea!! +* threads, gui: experimental "disalbe click-to-run" preference +* gui, scenes, store: made "pen color model" and "disable click-to-run" settings persistent per scene + +### 2021-11-10 +* objects, store: new "penColorModel" setting, can e 'hsv' or 'hsl' +* gui, objects: new (hidden) pen-color-model preference setting (per session) +* objects: changed the scale of the graphics color effect from 0-200 to 0-100 +* objects: refactored graphics color effect to reuse Morphic's conversion methods +* objects: use the selected pen color model (hsl or hsv) for graphic effects + +### 2021-11-09 +* objects, store: refactored block-migration mechanism +* gui: changed display of project name in the IDE to PROJECT (SCENE) +* gui: adjusted random color for new sprites to HSL model +* objects: fixed keyboard entry for script variable getters +* gui: changed edit project notes to always edit project motes instead of scene notes +* byob, blocks, gui: allow block-instances to be dragged off from templates in the "export blocks" dialog +* byob, gui: allow block-instances to be dragged off from templates in the "unused blocks" dialog + +### 2021-11-08 +* objects: renamed some internal color methods +* objects, store: renamed internal pen color channel cache +* objects, blocks, threads: renamed internal pen accessor methods +* objects, threads, store, extensions: switched pen color dimensions from HSV to HSL +* threads: fixed upvars in hat block prims when the user clicks on them to run them + +### 2021-11-07 +* widgets, blocks, byob: allow block-instances to be dragged off from templates in the "hide blocks" dialog +* gui: prevent switching to another sprite if a "hide blocks" dialog is open + +### 2021-11-06 +* blocks: fixed some minor variable-renaming issues + +### 2021-11-03 +* sketch: allow selecting the fill color in the vector editor via touch-hold gesture on touch devices +* updated version history + +### 2021-10-29 +* objects: flood-fill edge case fix, thanks, Dariusz! +* gui: removed obsolete dev comments +* blocks, objects: fixed scanning for senders and receivers of messages for new BROADCAST scheme + +### 2021-10-28 +* introduced default values for expandable slot specs +* updated German translation +* migrated Basque and Swedish translations to new BROADCAST block specs +* migrated Slovenian, Romanian and Interlingua translations to new BROADCAST block specs +* migrated Estonian, Hungarian, Croatian and Esperanto translations to new BROADCAST block specs +* migrated Danish, Czech, Valencian Catalan and Arabic translations to new BROADCAST block specs +* migrated Bulgarian, Traditional Chinese, Indonesian and Galician translations to new BROADCAST block specs +* migrated Hebrew, Japanese Hiragana, Slovakian and Ukrainian translations to new BROADCAST block specs +* migrated Japanese, Bangla, Portuguese and Norwegian translations to new BROADCAST block specs +* migrated French, Italian, Greek and Spanish translations to new BROADCAST block specs +* migrated Russian, Dutch, Tamil and Turkish translations to new BROADCAST block specs +* migrated Catalan, Hindi, Polish and Telagu translations to new BROADCAST block specs +* migrated Brazilian Portuguese, Malayam, Korean and Kannada translations to new BROADCAST block specs +* migrated Finnish and Simplified Chinese translations to new BROADCAST block specs + +### 2021-10-27 +* included bbt extensions +* updated service worker to cache bbtSnapExtension.js +* pwa versioning & cache-busting mechanism +* changed PWA icon to Alonzo +* tweaked PWA + +### 2021-10-26 +* objects: don't show codification and js-func blocks in search results unless enabled +* gui, objects: new "showingExtensions" session setting for showing extension prims in the palette +* German translation update for "extension blocks" setting +* widgets: r-g-b editor for custom category colors (right-click on color-field) + +### 2021-10-25 +* byob: fixed #2902 + +### 2021-10-22 +* blocks, objects: only show the "message" upvar in the "When I receive" hat if "any message" is selected +* blocks: only show "key" upvar in the "When ... is pressed" hat if "any key" is selected +* blocks: tweaked blocks layout for hidden expansion slots +* blocks, objects, store, threads: made SEND blocks expandable for receivers and renamed them back to BROADCAST +* threads: deep copy atomic lists sent from one scene to another +* bignum library: fixed IS IDENTICAL + +### 2021-10-21 +* threads, objects: make "when I receive 'any message'" hat scripts threadsafe (uninterruptable by other messages) +* threads: enabled sending atomic lists to other scenes +* threads: took out broadcasting a 2-item list to mean a message directed to a particular sprite +* blocks, objects, threads: added "all" option to the receiver-dropdown of the SEND block +* objects, blocks, threads: replaced BROADCAST block variants with SEND block variants +* tweaked German translation for "all" + +### 2021-10-20 +* blocks: enable sending green-flag events when switching scenes +* blocks, objects, gui, threads: removed "When switched to this scene hat block" +* objects: rearranged "switch to scene" and "pause all" blocks in the palette +* updated German translation (removed "when switched to this scene") +* blocks, threads: removed options "1" and "last" from "switch to scene" dropdown + +### 2021-10-19 +* threads: enable sending green-flag events to specific sprites + +### 2021-10-14 +* gui, byob, objects: scroll custom category buttons if there are more than 6 +* gui, byob: scroll selected custom category button into view +* gui: fixed "show categories" setting display +* gui: sort custom category menu ("delete a category") alphabetically +* blocks: enabled symbols inside input slots, activated %greenflag as selectable message + +### 2021-10-12 +* scenes, store: store single palette setting per project (for making extensions) +* gui, scenes, objects: added scene-setting to hide/show category names in the unified palette +* store: made "hide/show categories in unified palette" setting persistent +* byob: hide unused blocks in palette +* objects: tweaked unified palette formatting for hidden categories + +### 2021-10-11 +* objects: sort order of blocks in custom categories alphabetically in the unified palette + +### 2021-10-08 +* objects: tweaked variable block visibility +* objects: filter hidden blocks out from search / keyboard input results +* objects: prevent deprecated "message" reporter from showing up in search results +* objects: tweaked hiding / showing inherited local blocks + +### 2021-10-07 +* objects, byob: new BlockVisibilityDialogMorph for bulk-selecting blocks to hide / show in the palette +* ojects: simplified palette context menu +* blocks: removed "hide" option from context menu of primitive blocks in the palette +* objects, byob: optimized bulk hiding & showing palette blocks + +### 2021-10-06 +* threads: programmatically hide individual variables in palette +* extensions: new extension primitives for hiding and showing arbitrary blocks in the palette +* threads: keep hidden variables out of the palette and drop-down menus +* objects: added utilities to enumerate all palette blocks for hiding & showing +* objects, threads, extensions: refactored block hiding methods +* objects: added method to check whether an arbitrary block is hidden in the palette + +### 2021-10-05 +* threads, store: added infrastructure for hiding individual variables in palette + +### 2021-10-04 +* blocks: added "enter" key to key-pressed dropdown +* updated German translation for "enter" key +* threads: extended "hide/show var" primitive to also hide/show custom blocks in the palette + +* migrated Bangla block specs +* migrated Portuguese block specs +* migrated Norwegian block specs +* migrated French block specs +* migrated Italian block specs +* migrated Greek block specs +* migrated Spanish block specs +* migrated Russian block specs +* migrated Dutch block specs +* migrated and fixed Tamil block specs +* migrated Turkish block specs +* migrated Catalan block specs +* migrated Hindi block specs +* migrated Polish block specs +* migrated and fixed Simplified Chinese block specs +* fixed Telagu block specs for %interaction +* fixed Brazilian-Portuguese block specs for %interaction +* fixed Malayalam block specs for %interaction +* fixed Korean block specs for %interaction +* fixed Kannada block specs for %interaction +* fixed Finnish block specs for %interaction + +### 2021-10-03 +* migrated Hebrew block specs +* migrated and fixed Japanese Hiragana block specs +* migrated Slovak block specs +* migrated Ukrainian block specs +* migrated and fixed Japanese block specs + +### 2021-10-02 +* migrated Indonesian block specs +* migrated Galician block specs + +### 2021-10-01 +* objects: tweaked detectable keynames and representations +* German translation update +* migrated Euskara block specs +* migrated Telagu block specs +* migrated Swedish block specs +* migrated Slovenian block specs +* migrated Romanian block specs +* migrated Brazilian-Portuguese block specs +* migrated Malayalam block specs +* migrated Korean block specs +* migrated Kannada block specs +* migrated Interlingua block specs +* migrated Hungarian block specs +* migrated Croatian block specs +* migrated Finnish block specs +* migrated Estonian block specs +* migrated Esperanto block specs +* migrated Danish block specs +* fixed Danish block spec for "When I am %interaction" +* migrated Czech block specs +* migrated Valencian-Catalan block specs +* migrated Arabic block specs +* migrated and fixed Bulgarian block specs +* migrated and fixed Traditial-Chinese block specs + +### 2021-09-30 +* blocks, objects, threads, gui: optional upvars referencing event data for message, key and scene hat blocks +* blocks: disabled dropping reporters onto message hat block input slots +* threads: restricted inter-scene messages to text and numbers +* objects: assign case-sensitive key symbol to key event hat blocks' upvars + +### 2021-09-29 +* objects, blocks: refactored experimental "When I receive message" hat block + +### 2021-09-28 +* objects, blocks, threads: new "When I receive message" hat block featuring an upvar for the transmission, experimental in dev mode + +### 2021-09-27 +* objects: renamed scene event hat block +* German translation update + +### 2021-09-09 +* German translation update + +### 2021-09-08 +* objects: changed category for "switch to scene" to control +* blocks, objects, threads: new hat block for "when this scene starts" +* blocks, threads: changed "switch to scene" to be a stop block +* threads: disabled "when this scene starts" hat blocks to directly switch to another scene +* threads: slowed down scene switching to let the user better interrupt it, commented out for now + +### 2021-09-07 +* blocks, objects, threads: new change-of-scene event +* gui, threads: enabled change-of-scene events for user-induced scene switches, made them user-stoppable + +### 2021-09-06 +* blocks: fixed exporting comment pics from inside the block editor, thanks, Jadga, for the report! +* gui: fixed copying unattached comments among sprites, thanks, Jadga, for the report! + +### 2021-08-27 +* colors library: fixed SET PEN to work with more than a single sprite per costume, thanks, Jadga, for the report! + +### 2021-08-06 +* gui: new "blocksZoom=n" url parameter, thanks, Bernat! +* extensions: added to the documentation + +### 2021-08-03 +* extensions: updated documentation +* byob: record unsaved changes when applying edits to a custom block definition + +### 2021-08-02 +* extensions: updated documentation + +### 2021-08-01 +* gui: fixed saving projects with their names +* store: fixed deserializing global settings per scene in multi-scene projects + +### 2021-07-29 +* gui: fixed switching scenes in presentation mode + +### 2021-07-23 +* byob, objects, gui, store: support custom categories in libraries +* gui, byob: arrange custom categories alphabetically +* store: fixed exporting sprites + +### 2021-07-22 +* store: serialize user defined block palettes +* objects: enabled custom categories for the stage +* store: load user defined palettes +* gui: restore custom palettes when activating a scene +* objects: added new category feature to palette context menu +* gui, objects, scenes: fixed costume maximum extent +* gui: cleaned up hidden menu +* objects, gui: added delete category feature to palette context menu + +### 2021-07-21 +* user defined custom block palettes, under construction + +### 2021-07-20 +* threads, extensions: blocked xhr requests to from Snap! to s.b.e, thanks, Bernat! +* widgets, scenes, gui: custom category prompter + +### 2021-07-19 +* fixed #2863, thanks, Brian! + +### 2021-07-16 +* new libraries manual versions, thanks, Brian! +* palette hiding/showing primitives fixes, tanks, Michael! +* readme update, thanks, Michael! +* objects, gui: rearranged internal order of categories +* byob: rearranged internal order of categories +* objects: fixed overlapping blocks bug in unified palette +* store, gui: fixed capturing global settings for serializing scenes +* gui: update palette when switching to a new scene / loading a new project + +### 2021-07-15 +* gui: made sprite-bar height independent of the number of categories + +### 2021-07-13 +* objects: fixed search from palette context menu + +### 2021-07-12 +* Chinese translation update, thanks, Simon! +* objects: fixed refactored "Delete a variable" button for stage palette + +### 2021-07-11 +* added libraries and media to cache, thanks, Joan! + +### 2021-07-10 +* PWA support, thanks, John, for showing me! + +### 2021-07-09 +* extensions: whitelisted 'https://snap.berkeley.edu/' +* morphic: made scrollbars thinner by default +* morphic: tweaked slider transparency for flat design mode +* objects: translation support for category labels in the unified palette +* threads: fixed vanishing JSF block bug in new error messages +* gui: fixed blocks cache invalidation for unified palette + +### 2021-07-08 +* objects: added category labels to unified palette +* gui: accelerated unified palette scrolling animation +* adjust scroll bars when refreshing the palette +* store: commented out saving the unified palette setting in the project xml during development +* gui: fixed scroll-into-view glitch when adding scenes + +### 2021-07-07 +* morphic, gui: tweaked perish() animation +* objects: fixed "hide / show primitives" for unified palette +* threads: display blocks with their error messages for custom blocks, thanks, Michael! + +### 2021-07-06 +* byob, objects: new feature: hide custom helper blocks in palette +* German translation update (hiding helper blocks in the palette) +* gui: unified palette: offer the currently visible category when letting the user make a block +* scenes, objects, gui: made unified palette the default for dev + +### 2021-07-05 +* gui: unified palette: indicate "selected" category in selector buttons +* extensions: web-serial extension primitives, pioneered by Dariusz Dorożalski +* added new "serial ports" library +* added jshint esversion tags +* gui: unified palette: don't animate scrolling if delta is zero +* byob: replaced checkboxes in custom block context menus with symbols + +### 2021-07-04 +* fixed audio_comp library "plot sound" block to work with translations, thanks, Hans, for the report! + +### 2021-07-03 +* objects: arranged the blocks in the unified palette column-wise +* gui: fixed the paletteHandle for the unified palette +* gui, scenes, store: fixed unified palette for multi-scene projects +* gui: fixed unified palette for searching +* gui: renamed "Unified palette" to "Single palette" in the settings menu +* updated German translation for unified palette setting + +### 2021-07-02 +* gui, object, store, etc.: unified blocks palette option, thanks, Michael! +* merged scenes branch +* morphic: fixed centering of menus, thanks, Brian Broll! +* gui: animate scrollToPaletteCategory() +* gui: guard against missing categories when scrolling the unified palette + +### 2021-05-21 +* gui, scenes, store: proxied thumbnail, name and notes in project, restored in XML +* gui: distinguished project name from scene names, removed hidden "export as plain text" option +* gui: sceneified project notes +* gui: adjusted project thumbnail in "save" dialog +* gui: some cleanups +* gui, scenes: sceneified unsaved changes management +* blocks: fixed search-blocks for scenesMenu + +### 2021-05-20 +* gui: marked projectName to be refactored and sceneified + +### 2021-05-19 +* gui: disabled scene icon context menu for project scene +* gui: disabled dragging the project scene icon +* gui: made sure the project scene stays in place +* gui: added exporting single scenes +* scenes, store: removed redundant properties "notes" and "thumbnail" from project +* store: removed "thumbnail" property from scene xml + +### 2021-05-18 +* gui: fixed exporting media only for a single scene +* gui: fixed cloud file format components +* gui: "projectized" cloud file format for a single scene +* gui: fixed cloud file format for multi-scene projects +* gui: ensured unique scene names + +### 2021-05-11 +* gui: add multi-scene projects +* gui: adjusted scene album rendering +* gui: tweaked scene album rendering + +### 2021-05-10 +* gui: project menu entries for "new scene" and "add scene" + +### 2021-04-28 +* gui: only show scene album if the project has more than a single scene + +### 2021-04-23 +* store: serialize sprite-order from scenes +* gui: sceneified refreshIDE() +* gui: sceneified toggling dynamic input labels and switching languages +* gui: sceneified "zoom blocks" +* store: moved sprite-selection attribute from stage to scenes tag +* scenes, store, gui: remember last edited scene in a project + +### 2021-04-22 +* store, gui: first pass at deserializing multi-scene projects +* gui, scenes: migrated "new project" feature +* gui: replaced openScene() with openProject() + +### 2021-04-21 +* store, gui: refactored project loading structure + +### 2021-04-20 +* scenes, store, gui: multi-scene project serialization format, first pass + +### 2021-04-16 +* scenes, store, gui: remember last edited sprite in a scene / project +* scenes: removed Project class +* scenes, store, gui: export multi-scene projects + +### 2021-04-14 +* scenes: new Project class +* store: sceneified projects +* gui: switched to scene-based project serialization + +### 2021-04-12 +* blocks, objects, threads, gui: new "switch to scene _" command primitive +* morphic, gui: support bulk-file-drop for importing scenes +* gui: tweaked scene album colors + +### 2021-04-08 +* gui: scroll selected scene icon into view + +### 2021-04-01 +* gui: made scrollbars in the wardrobe and jukebox more responsive + +### 2021-04-01 +* gui: made scene icons selectable +* gui: made scene icons observe the scene's stage versions + +### 2021-07-02 +* extensions: took out web-serial extension prims (not yet ready) + +### 2021-06-25 +* extensions: added first rough experimental version of web-serial extension primitives +* extensions: commented out web-serial extension prims while thinking about their design + +### 2021-06-24 +* extensions: tweaked loading unlisted script-extensions +* byob, threads, store: removed unused code +* extensions: added documentation for adding external JS modules +* updated bignumbers library + +### 2021-06-23 +* updated bignums library +* pushed dev version to 6.10 +* took out device libraries (Hummingbird blocks and Leap Motion) + +### 2021-06-22 +* extensions: added script-loading extension primitive + +### 2021-06-20 +* updated extensions documentation + +### 2021-06-19 +* extensions: added color extension primitives +* byob: fixed search for dynamic extension menus +* tweaked make-vars library to reduce internal dependencies +* updated the abominable colors library ;-) + +### 2021-06-18 +* extensions: added text extension primitives +* updated strings library +* extensions: tweaked variable declaration extension primitive, commented out palette refresh prim +* tweaked make-variables library +* tweaked strings library +* extensions: added color library dropdown menu +* blocks, threads, extensions: separated extension primitives from extension dropdown menus +* blocks, byob: dynamic extension dropdown menu support +* updated strings library (changed variable name to '_case independent') + +### 2021-06-17 +* extensions: added APL extension primitives +* updated apl library +* threads, extensions: added variable extension primitives +* updated make-variables library + +### 2021-06-16 +* threads: added exception handling primitives for try/catch +* extensions: added try-catch extension primitives +* updated try-catch library +* extensions: added object-naming extension primitive +* updated text-costume library + +### 2021-06-15 +* extensions: tweaked world-map primitives +* updated maps library +* extensions: new naming convention +* updated list-utilities library +* extensions: documented function semantics +* updated frequency-distribution-analysis library +* updated animation library +* updated words-sentences library +' extensions: added tts +* updated text-to-speech library +* updated bar-charts library +* fixed #2850 (occasional invisible error message), thanks, Ken, for the bug report! +* extensions: added long-form xhr primitive +* extensions: added geolocation extension primitive +* maps: changed default style to OpenStreetMap +* updated http-blocks library +* updated pixels library +* updated audio library +* updated localstorage library + +### 2021-06-14 +* new dev version +* threads, blocks, objects, extensions: new safe extensions mechanism +* objects: added new "primitive" blocks to dev palette +* updated list-utilities library +* updated animation library +* updated frequency-distribution-analysis library +* extensions: added some world-map extension primitives +* threads: associate setting with JSF-block rather than the evaluator +* extensions: added more world-map extension primitives + +## 6.9.0 +* **Notable Changes:** + * JS-functions are now disabled by default until switched on in the settings menu per session + * error messages in presentation mode are now shown as pop-up messages onstage +* **Notable Fixes:** + * register unsaved changes when the user edits a comment + * fixed bignums library and and made colors library faster, thanks, Brian! + * fixed setting the IDE language via a url parameter, thanks, Joan! +* **Translation Updates:** + * Polish, thanks, Witek! + * new Hindi translation, thanks, Barthdry! + * German + +### 2021-06-14 +* prepared release + +### 2021-06-11 +* byob, blocks: catch JS functions inside custom dropdown definitions +* German translation update + +### 2021-06-10 +* threads: error messages in presentation mode are now shown as pop-up messages onstage +* store: commented out modal prompt to enable JS when loading a project that uses it +* gui: renamed setting to "JavaScript extensions" + +### 2021-06-09 +* new dev version +* Polish translation update, thanks, Witek! +* blocks: register unsaved changes when the user edits a comment +* new Hindi translation, thanks, Barthdry! +* fixed bignums library and and made colors library faster, thanks, Brian! +* gui: fixed setting the IDE language via a url parameter, thanks, Joan! +* threads, gui, objects, byob, store: reinstated JS-function control, disabled JS-functions by default +* gui, store: automatically logout when the user enablesJavaScript, commented out for now + +## 6.8.1 +* **Notable Fixes:** + * fixed peeling off niladic custom block instances from prototype templates + +### 2021-05-04 +* new dev version +* gui: fixed "peeling off" niladic custom block instances from prototype templates +* prepared patch + +## 6.8.0 +* **New Features:** + * first-class colors, sorta, in the new "Colors" library, thanks, Brian! + * you can now also "peel off" custom block instances from their prototype templates in the block editor +* **Notable Changes:** + * speed-up talk bubble positioning by 5x +* **Notable Fixes:** + * work around a floating point precision glitch in "ray length" + * fixed an occasional rendering glitch when changing the display style of a variable watcher + * fixed color effect for negative inputs, thanks, Brian! + * fixed some issues round bignums, thanks, Brian! +* **Documentation Updates:** + * updated manual, thanks Brian! + +### 2021-05-03 +* new versions of "Colors" and bignums libraries, updated documentation, thanks, Brian +* bumped dev version to v6.8 +* prepared minor release + +### 2021-04-23 +* objects: fixed color effect for negative inputs, thanks, Brian! + +### 2021-04-17 +* objects: fixed an occasional rendering glitch when changing the display style of a variable watcher +* objects: tweaked CellMorph shadow rendering +* byob: enable "peeling off" custom block instances from their prototype templates + +### 2021-04-17 +* new dev version +* threads: worked around a floating point precision glitch in "ray length" +* objects: speed-up talk bubble positioning by 5x + +## 6.7.4 +* **Notable Fixes:** + * fixed DEAL in the APL library, thanks, Brian! + * fixed a resizing edge case bug for the stage prompter (ASK command) + * fixed finding "index of" block by search + +### 2021-04-09 +* objects fixed #2821 - "index of" block not found by search +* prepared patch + +### 2021-03-28 +* new dev version +* fixed DEAL in the APL library, thanks, Brian! +* objects: fixed a resizing edge case bug for the stage prompter (ASK command) + +### 2021-03-31 +* gui: tweaked scene icon settings +* gui: moved stage icon to the top of the corral + +### 2021-03-30 +* gui: added documentation +* gui: added SceneIconMorph and SceneAlbumMorph prototypes +* gui: turned scenes into an observable list +* gui: added scene icon thumbnails + +### 2021-03-25 +* gui, scenes: sceneified trash +* gui: first "live" multi-scene experiment + +### 2021-03-19 +* gui, store, scenes: capture global settings in scenes + +## 6.7.3 +* **Notable Changes:** + * hyperized "key _ pressed?" predicate +* **Notable Fixes:** + * repeat stops when encountering a non-numerical counter input, thanks, Stefan! + * updated list-utilities library, thanks, Brian! +* **Documentation Updates:** + * updated manual with links in the toc, thanks Brian! + +### 2021-03-19 +* manual updated with active links and links in the toc, thanks, Brian! +* threads: hyperized "key _ pressed?" predicate +* prepared patch + +### 2021-03-18 +* gui, scenes, objects: more scene-refactorings + +### 2021-03-17 +* objects, gui, paint, sketch, store: de-globalized stage dimensions +* new dev version +* threads fixed repeat for non-numbers, thanks Stefan! +* updated list-utilities library, thanks, Brian! + +## 6.7.2 +* **Notable Changes:** + * disabled empty-slot implicit parameter in FOREACH +* **Notable Fixes:** + * fixed "transpose" in the APL library, thanks, Brian! +* **Translation Updates:** + * Catalan, thanks, Joan! + +### 2021-03-15 +* gui: marked methods for scene refactorings + +### 2021-03-12 +* scenes, gui, store: added scenes class + +### 2021-03-11 +* gui, store: refactor loading a project into the IDE + +### 2021-03-09 +* new dev version +* Catalan translation update, thanks, Joan! +* lists, apl: fixed "transpose", thanks, Brian! +* threads: disabled empty-slot implicit parameter in FOREACH +* prepared patch release + +## 6.7.1 +* **Notable Fixes:** + * fixed recursive calls in PIPE + * the "length of list" block no longer appears twice in search results + * prevent inserting items at non-integer / out-of-bounds indices + * save all items of a heterogeneously structured linked/arrayed list + +### 2021-03-09 +* new dev version +* objects: fixed #2797 +* fixed recursive calls in PIPE +* lists: prevent usage of lists as dictionaries +* store: fixed #2798 +* prepared patch + +## 6.7.0 +* **New Features:** + * undelete sprites +* **Notable Changes:** + * optimized special cases for COMBINE (sum, product, min, max) by up to 34 x + * rebind (relabel) recursive calls when duplicating a custom block definition + * custom block label parts inside the prototype (in the block editor) are now displayed the same as in block instances + * variadic ring inputs are now arranged vertically (e.g. the reporter rings in PIPE) + * changed zebra-coloring for yellow custom block prototypes (in the block editor) so the hat block changes the shade, not the prototype + * improved layout and rendering of (+) buttons in custom block prototypes + * updated libraries: list utilities, variadic reporters, iteration-composition, colors and APL, thanks, Brian! +* **Notable Fixes:** + * displaying a table containing the stage no longer crashes the page + * correct identities when combining the items of an empty list with + / * / min / max +* **Documentation Updates:** + * updated manual, thanks Brian! +* **Translation Updates:** + * German + +### 2021-03-08 +* prepared minor release + +### 2021-03-06 +* updated libraries and manual, thanks, Brian! + +### 2021-03-05 +* tables, objects: displaying a table containing the stage no longer crashes the page +* gui: added "trash is empty" information, commented out for now +* gui: changed gui strings for undelete feature +* updated German translation +* byob: rebind (relabel) recursive calls when duplicating a custom block definition + +### 2021-03-04 +* gui: added trash button for undeleting sprites +* gui: accept drops of sprites and sprite-icons in trash button +* gui: animate undeleted sprites to glide back onstage + +### 2021-03-03 +* symbols: added "trash" symbol +* symbols: added "trashFull" symbol + +### 2021-03-02 +* threads: optimized special cases for COMBINE (sum, product, min, max) by up to 34 x +* threads: optimized special cases for compiled version of COMBINE +* gui, objects: undelete sprites +* threads: correct identities when combining the items of an empty list with + / * / min / max +* gui: pushed dev version to 6.7 because of new documentable features + +### 2021-03-01 +* byob: improved layout and rendering of (+) buttons in custom block prototypes +* byob: display custom block label parts in the prototype (in the block editor) the same as in block instances +* byob: changed zebra-coloring for yellow custom block prototypes (in the block editor) so the hat block changes the shade, not the prototype + +### 2021-02-27 +* new dev version +* blocks: arrange variadic ring inputs vertically (e.g. the reporter rings in PIPE) +* blocks: removed a redundant unused case for block highlights + +## 6.6.0 +* **New Features:** + * new "reshape" primitive for lists + * list operations as dropdown menu of new "length of list" block +* **Notable Changes:** + * 2D lists inside ITEM OF now have the right order of dimensions (rows, columns, planes, etc.) + * changed "length of list" to become a general list operations primitive + * enhanced MIN and MAX to also operate on text + * added "is _ identical to _ ?" to relabel options of equals + * enabled scientific notation in numeric text fields + * removed experimental "transpose (list)" primitive - has been merged into "length of list" + * removed "reverse" block from the "frequency distribution analysis" library +* **Notable Fixes:** + * don't show internal "compile" reporter in search results + * fixed a bug for showing the senders of a message + * compiled "find first" now also reports empty instead of false if none is found + * support one level of currying in the experimental JS JIT compiler +* **Documentation Updates:** + * updated manual with hyper-semantics of ITEM OF, thanks Brian! +* **Translation Updates:** + * German + +### 2021-02-25 +* updated manual, thanks, Brian! +* prepared minor release + +### 2021-02-23 +* threads, objects: commented out experimental slice() primitive + +### 2021-02-20 +* lists: removed experimental list.slice() feature from production code +* threads, objects: experimental list slice() primitive, hidden, available via find / relabel + +### 2021-02-16 +* objects: reverted list palette reordering + +### 2021-02-15 +* threads: fixed #2783 +* threads: fixed #2784 +* blocks: took out "transpose" from "length" dropdown +* German translation update +* removed "reverse" block from the "frequency distribution analysis" library +* support for ranges of indices using zero and negative numbers inside index-lists in "item of" + +### 2021-02-14 +* lists: fixed transcription typos in strideTranspose(), thanks, Brian! + +### 2021-02-13 +* blocks, threads, lists: distinguish between "columns" (<3D) and (deep) "transpose" +* byob: fixed a bug for showing the senders of a message + +### 2021-02-12 +* blocks, threads, lists: distinguish between "transpose" (<3D) and "deep transpose" + +### 2021-02-11 +* objects: rearranged the blocks in the lists category palette +* lists: fixed list.reverse() to return a shallow copy instead of mutating the original + +### 2021-02-10 +* objects: added "is _ identical to _ ?" to relabel options of equals +* morphic: enable scientific notation in numeric text fields +* threads: changed error message for "lines" conversion +* updated German translations + +### 2021-02-09 +* lists: refactored matrix ops to avoid JS stack overflows +* objects: fixed internal migration for "transpose" block +* threads: enhanced MIN and MAX to also operate on text +* threads: enhanced list attributes 'rank', 'shape' and 'ravel' to also handle scalars +* threads: enhanced 'reshape' to also handle scalars +* lists: limit crash-dangerous matrix-exploding ops to 1 MM elements (reshape, crossproduct) +* objects, threads: took out "crossproduct" primitive option from the palette +* objects, blocks: added defaults to RESHAPE in palette + +### 2021-02-08 +* lists, objects, threads: new RESHAPE primitive +* lists: added internal naive (recursive) version of CROSSPRODUCT +* lists: added TRANSPOSE for higher dimensions, thanks, Brian! +* objects, blocks, threads: added "cross product" to "append" as dropdown, and "reverse" to "length" + +### 2021-02-06 +* simplified private list.range() method +* blocks: changed wordings for list attributes + +### 2021-02-05 +* new manual for v6.6, thanks, Brian! +* objects: don't show internal "compile" reporter in search results +* blocks, objects, threads: added experimental "atribute of list" reporter primitive to dev mode +* objects: replaced "length of list" primitive with new "attribute of list" reporter +* objects: added "txt" option to list attribure dropdown - not yet operational +* lists, threads: added "txt" list conversion + +### 2021-02-04 +* lists, threads: changed query semantics for table selectors in ITEM OF to rows, columns, planes, etc. +* pushed dev version number +* lists: tweaked query() +* cloud: trimmed usernames, thanks, Michael + +### 2021-02-03 +* new dev version + +## 6.5.2 +* **Notable Changes:** + * identity comparison of texts is now case-sensitive + * hyperized image attribute reporter primitive (monadic) + * when constructing a costume from a pixel list handle single values as greyscale + * experimental "transpose (list)" primitive relabelling option for "all but first" + * renamed "Obsolete!" blocks to "Undefined!" +* **Notable Fixes:** + * fixed a glitch in the animation library's "sine in-out" easing function + * fixed a postMessage glitch in the API, thanks, Bernat! + * fixed a glitch in the Turkish translation that broke the "Looks" blocks category + * fixed a glitch that prevented the text cursor from displaying instantly in certain situations + * fixed importing exported reporter-scripts (experimental feature) +* **Translation Updates:** + * Tamil, thanks, Barthdry! + * German + * Turkish + +### 2021-02-02 +* lists: added a few internal - as of now unused - matrix operations +* lists, threads: refactored hyper list access +* prepared patch + +### 2021-02-01 +* lists: refactored some matrix operations +* threads: made identity comparison of texts case-sensitive +* blocks, gui: fixed importing exported reporter-scripts (experimental feature) + +### 2021-01-30 +* threads, objects, lists: renamed experimental "rotate" primitive into "transpose" +* objects: added "transpose" to palette for testing +* updated German translation for "transpose" +* morphic: fixed #2768 +* objects: removed "transpose" from the palette for now + +### 2021-01-29 +* threads, objects: new experimental "rotate (list)" primitive relabelling option for "all but first" +* threads, objects: removed previous experimental "column" and "width" primitives again +* lists, threads, objects refactored experimental "rotate" primitive +* updated German translation +* added more relabelling options for "rotate" + +### 2021-01-27 +* threads: hyperized new experimental "column" primitive + +### 2021-01-26 +* threads: handle single values as greyscale when constructing a costume from a pixel list +* threads, objects experimental "column _ of _" reporter relabelling option for "item _ of _" +* threads, objects experimental "width of _" reporter relabelling option for "length of _" +* updated German translation (with experimental block specs) +* fixed an input slot spec glitch in the Turkish translation +* store: renamed "Obsolete!" blocks to "Undefined!" + +### 2021-01-25 +* threads: hyperized image attribute reporter primitive (monadic) +* pulled pending PRs + +### 2021-01-21 +* new dev version +* animation library: fixed a glitch in the "sine in-out" easing function + +## 6.5.1 +* **New Features:** + * experimental (non-hyperized) "not equals" primitive reachable via "relabel" +* **Notable Changes:** + * 10% speed-up for reporters, WARP and TURBO + * updated list utilities library, thanks, Brian! +* **Notable Fixes:** + * fixed a bug when changing a Boolean input slot with a default value to numerical type +* **Documentation Updates:** + * Snap! Manual sources and compiling documentation, thanks, Brian! + * updated "contentWindows" part of the Snap! API, thanks, Bernat +* **Translation Updates:** + * Dutch, thanks, Joek! + +### 2021-01-11 +* prepared patch + +### 2021-01-08 +* updated Snap! Manual and manual compiling documentation, thanks, Brian! + +### 2021-01-07 +* updated Snap! API documentation, thanks, Bernat! + +### 2021-01-05 +* widgets: fixed a conversion bug when retrieving a numerical value from an input field +* objects, threads: experimental (non-hyperized) "not equals" primitive reachable via "relabel" +* Dutch translation update, thanks, Joek! +* updated list utilities library, thanks, Brian! + +### 2021-01-04 +* new dev version +* threads: optimized frame stepper, reduced frames for input evaluation, 10 % speed-up for reporters, WARP and TURBO + +## 6.5.0 +* **New Features:** + * warning about "unsaved changes" when opening or creating a new project + * visual indication of unsaved changes in the IDE's project label + * automatic backup of unsaved changes to localstore, option to restore in the file menu until the first change in the new project +* **Notable Changes:** + * 25% speed-up for reporters, WARP and TURBO + * up to 40x speed-up for "new costume from list" reporter primitive + * re-enabled reporter drops in "key _ pressed?" input slot +* **Notable Fixes:** + * fixed a bug in hyperblocks + * fixed keyboard formula entry for subtraction +* **Documentation Updates:** + * new Manual for v6.5, thanks, Brian! + * added unsavedChanges() method and documentation to the Snap! API +* **Translation Updates:** + * German + * Catalan, thanks, Joan! + * Russian, thanks, Pavel! + +### 2020-12-23 +* Manual updated, thanks, Brian! +* prepared release + +### 2020-12-22 +* threads: up to 40x speed-up for "new costume from list" reporter primitive +* api: added unsavedChanges() method and documentation +* blocks, gui: visual indication of unsaved changes in the IDE's project label +* Russian translation update, thanks, Pavel! + +### 2020-12-21 +* gui: tweaked backup / restore +* new Manual for v6.5, thanks, Brian! +* German translation update + +### 2020-12-20 +* gui, blocks, objects: keep track of unsaved edits + +### 2020-12-19 +* threads: added code-documentation for the WARP/timestamp optimization +* gui: new auto-backup to localstore feature + +### 2020-12-18 +* threads: optimized scheduler, reduced system calls to Date.now(), 25 % speed-up for reporters, WARP and TURBO +* threads: fixed a typo in hyperDyadic() + +### 2020-12-17 +* blocks: added hook for caching variadic inputs +* blocks: refactored blockSequence() non-recursively +* reverted variadic input caching experiment + +### 2020-12-16 +* threads, objects: added dev debugging hook for counting yields + +### 2020-12-14 +* new dev version +* objects: fixed keyboard formula entry for subtraction +* blocks: re-enabled reporter drops in "key _ pressed?" input slot + +## 6.4.1 +* **Documentation Updates:** + * new Manual for v6.4, thanks, Brian! +* **Notable Fixes:** + * fixed zebra coloring for imported scripts + +### 2020-12-14 +* new dev version +* new Manual for v6.4, thanks, Brian! +* gui fixed zebra coloring for imported scripts +* prepared patch + +## 6.4.0 +* **New Features:** + * ray casting: new "ray length" option in the "relation TO object" primitive + * hyperdyadic MIN and MAX primitives reachable via "relabel" + * hyperdyadic less / great than or equals primitives reachable via "relabel" + * hyperdyadic ATAN2 primitive reachable via "relabel" + * new SIGN function in arithmetic dropdown +* **Notable Changes:** + * searching for blocks and keyboard entry now includes the contents of dropdown menus + * disabled dropping reporters into certain dropdowns (monadic functions, types, costume attributes, graphic effects, layers, audio attributes, pen attributes, dates, relation, keys, video attributes) + * changed VIDEO _ ON _ reporter primitive to be hyper-monadic (second slot) + * hyperized OBJECT reporter primitive in sensing +* **Notable Fixes:** + * keep internal linked-list organization intact for hyperblocks + * improved SVG loading in Firefox, thanks, Joan! + * prevent browser override for ctrl+o gesture + * fixed layout issue when importing a sprite in presentation mode +* **Translation Updates:** + * Spanish, thanks, Joan! + * Catalan, thanks, Joan! + * Tamil, thanks, Barthdry! + * German + +### 2020-12-11 +* blocks: fixed special drop-downs for keyboard entry +* store: fixed layout issue when importing a sprite in presentation mode +* prepared minor release + +### 2020-12-09 +* Tamil translation update, thanks, Barthdry! +* threads, objects: added hyperdyadic ATAN2 primitive reachable via "relabel" +* threads: hyperized OBJECT reporter primitive in sensing + +### 2020-12-07 +* GUI: improved SVG loading, thanks, Joan! +* threads, objects, blocks: compiled multimap, thanks, Brian +* reverted multimap, let's use a JS-block based custom block to engineer it first + +### 2020-12-05 +* objects: alternative collision detection method using the video-cache, commented out for reference. +* German translation update for "ray length" + +### 2020-12-04 +* threads: refactored raycasting +* integrated raycasting into "relation TO object" primitive + +### 2020-12-03 +* threads: raycasting edge detection, under construction + +### 2020-12-02 +* threads, blocks: added SIGN function to monadic dropdown +* Catalan translation update, thanks, Joan! +* Morphic: prevent browser override for ctrl+o gesture +* objects, threads: refactored mouseX / mouseY to use generic coordinate conversion + +### 2020-12-01 +* threads, objects: added hyperdyadic MIN and MAX primitives reachable via "relabel" +* threads, objects: added hyperdyadic less/greaterThanOrEquals prims +* blocks: made monadic functions and data types menus static +* blocks: made costume attribute, graphic effects and layers menus static +* blocks: made audio attributes menu static +* blocks: made pen attributes menus static +* blocks: made sensing attributes menus largely static +* threads: changed reportVideo() to be hyper-monadic +* lists: made sure map() doesn't mutate internal list linked-ness + +### 2020-11-30 +* threads: keep internal linked-list organization intact for hyperblocks +* update libraries + +### 2020-11-27 +* objects: extended block-search to include dropdown choices in primitives +* byob, objects: extended block-search to include dropdown choices in custom blocks + +### 2020-11-26 +* blocks, objects: refactored input slot specs +* blocks: refactored special input slot dop-down menus for search + +### 2020-11-23 +* new dev version + +## 6.3.7 +* **Notable Changes:** + * added "loadProjectXML" method to the api + * hyperized "atrribute OF sprite" reporter primitive in the sensing category + * show the common attributes for sprites in the OF-dropdown by default + * hyperized "color/sprite AT location" reporter primitive + * hyperized "VIDEO _ ON _" reporter primitive +* **Documentation Updates:** + * API update for "loadProjectXML" +* **Notable Fixes:** + * fixed display of inherited sprite-local variables +* **Translation Updates:** + * Greek, thanks, HM100! + +### 2020-11-23 +* Greek translation update, thanks, HM100! +* prepared patch + +### 2020-11-22 +* objects: fixed display of inherited sprite-local variables +* threads: make sure video capture is turned on before accessing it programmatically + +### 2020-11-21 +* new dev version +* api: new loadProjectXML() method +* updated api documentation +* threads: hyperized "atrribute OF sprite" reporter primitive +* blocks: show the common attributes for sprites in the OF-dropdown by default +* threads: hyperized "color/sprite AT location" reporter primitive +* threads: hyperized "VIDEO _ ON _" reporter primitive + +## 6.3.6 +* **Notable Changes:** + * changed determining "neighbors" from rectangular to circular perimeter +* **Notable Fixes:** + * fixed a loading bug for projects with watchers on SVG costumes + * fixed stretching SVG costumes with fixed aspect ratios in Firefox + * only report neighbors that are visible +* **Translation Updates:** + * Italian, thanks, Stefano! + * Spanish, thanks, Joan! + +### 2020-11-20 +* threads: only report neighbors that are visible, thanks Frederic, for reporting this bug! +* Italian translation update, thanks, Stefano! +* Spanish translation update, thanks, Joan! +* threads, objects: changed determining "neighbors" from rectangular to circular perimeter +* objects: fixed a loading bug for projects with watchers on SVG costumes +* prepared patch + +### 2020-11-19 +* new dev version +* objects: rasterize SVGs internally before stretching them, so it all works on Firefox + +## 6.3.5 +* **Notable Fixes:** + * support exported SVGs to be edited in Inkscape + +### 2020-11-19 +* new dev version +* objects: tweaked exported SVG's color alpha part as stroke-opacity so Inkscape can handle them, sigh. +* prepared patch + +## 6.3.4 +* **Notable Changes:** + * added "postMessage" mechanism to the api for communicating with Snap! inside an iFrame, thanks, Bernat! +* **Documentation Updates:** + * API update for "postMessage", thanks, Bernat! +* **Notable Fixes:** + * fixed updating cells showing sprites or costumes inside list watchers + * fixed a project loading bug (for watchers showing costumes) + +### 2020-11-18 +* new dev version +* objects: fixed updating cells showing sprites or costumes inside list watchers +* objects: fixed a project loading bug (for watchers showing costumes) +* api: new postMessage mechanism, thanks, Bernat! +* prepared patch + +## 6.3.3 +* **Notable Changes:** + * added type assertion for numerical value in CHANGE VARIABLE BY NUM block, thanks, Eckart, for the suggestion +* **Notable Fixes:** + * fixed a costume fitting issue, thanks, Joan! + * fixed keyboard formula input for "power of", "neg", "lg" and "id" + * fixed repositioning sprite after "editRotationPointOnly" +* **Translation Updates:** + * Spanish, thanks, Joan! + +### 2020-11-1/ +* blocks, objects: refactored and unified default values for block templates +* Spanish translation update, thanks, Joan! +* gui, objects: fixed #2715 - reposition sprite after "editRotationPointOnly" +* prepared patch + +### 2020-11-15 +* new dev version +* objects: fixed costume fitting, thanks, Joan! +* objects: fixed keyboard formula input for "power of" +* objects: fixed keyboard formula input for "neg" +* objects: fixed keyboard formula input for "lg" and "id" +* threads: added type assertion for numerical value in CHANGE VARIABLE BY NUM block + +## 6.3.2 +* **Notable Changes:** + * added meaningful defaults to blocks in the palette that didn't already have them +* **Notable Fixes:** + * fixed a costume-shrinkWrap edgecase bug, thanks, Brian, for reporting it! + * fixed dynamic costume-inheritance for PASTE and CUT + * fixed being unable to place the cursor at the end of a multi-line text + +### 2020-11-12 +* morphic: fixed being unable to place the cursor at the end of a multi-line text +* prepared patch + +### 2020-11-11 +* objects: added meaningful defaults to blocks in the palette that didn't already have them +* threads: fixed dynamic costume-inheritance for PASTE and CUT + +### 2020-11-09 +* new dev version +* objects: fixed #2712 - a costume-shrinkWrap edgecase bug, thanks, Brian, for reporting it! + +## 6.3.1 +* **Notable Fixes:** + * fixed PASTE and CUT for the stage + +### 2020-11-05 +* new dev version +* objects: fixed #2709 +* prepared patch + +## 6.3.0 +* **New Features:** + * new gesture: holding the shift-key when dragging extracts a single command from a stack of blocks + * new "extract" single command block context menu option + * new CUT FROM command in the pen category + * added "pie chart" option to PLOT command in the frequency distribution analysis library + * added getProjectXML() method to the API + * new noCloud flag that disables cloud access, thanks, Bernat +* **Notable Changes:** + * security: pause generic WHEN hat blocks when loading a project or importing a sprite until the user clicks the green flag or un-pauses the red stop sign, unless opening it with #present:&noRun +* **Documentation Updates:** + * API update +* **Notable Fixes:** + * fixed a translation bug for zero-value menu selection entries + * wait until all assets have loaded before auto-triggering the green-flag event + * don't show some development-only blocks as search results + * fixed "rename costume" dialog title to distinguish between costumes and backgrounds +* **Translation Updates:** + * Russian, thanks, Pavel! + * German + * French, thanks, Jeremy! + +### 2020-11-04 +* prepared minor release + +### 2020-11-03 +* Russian translation update, thanks, Pavel! +* objects: added "relabel" feature for the new "cut from" / "paste on" primitives + +### 2020-11-02 +* objects: tweaked drop-shadows for sprites +* blocks: tweaked drop-shadows for comments +* objects, threads: added new CUT FROM command to the pen category +* updated German translation with new "cut from %spr" entry +* morphic: reverted "unclosable menu prevention", because it broke the search box in the project dialog + +### 2020-10-28 +* gui: tweaked wait-until-assets-are-loaded mechanism +* gui: fixed "rename costume" dialog title to distinguish between costumes and backgrounds +* German translation update for "rename background" +* French translation update + +### 2020-10-27 +* gui, objects, store: pause generic WHEN hat blocks when loading a project or importing a sprite until the user clicks the green flag or un-pauses the red stop sign, unless opening it with #present:&noRun +* morphic: prevent unclosable menus, thanks, Brian B.! + +### 2020-10-26 +* objects: added test for the existence of generic WHEN hat blocks + +### 2020-10-23 +* pushed dev version to v6.3.0 because of new features +* objects: don't show some development-only blocks as search results +* blocks: fixed a multi-line-text spec typo +* blocks: removed unused %month slot +* blocks: removed unused %lst slot + +### 2020-10-22 +* blocks: fixed UNDO/REDO for "extracted" (single) command blocks +* blocks: refactored userExtractJustThis +* blocks: refactored userDestroyJustThis +* blocks: un-hid "extract" menu-option +* morphic: create drop-shadows just in time +* blocks: holding the shift-key when dragging extracts a single command from a stack of blocks +* German translation update for new string "extract" + +### 2020-10-21 +* gui: wait until all costumes have loaded before auto-triggering the green-flag event +* gui, objects, store: wait until all sounds have loaded before auto-triggering the green-flag event +* gui, cloud: added noCloud flag that disables cloud access, thanks, Bernat! +* blocks: new experimental (hidden) "extract" single command block context menu option + +### 2020-10-20 +* added "pie chart" option to PLOT command in the frequency distribution analysis library +* morphic: enabled zero values for menu selection entries +* blocks: fixed translation bug for zero-value menu selection entries +* Russian translation update, thanks, Pavel! +* api: added getProjectXML() method +* gui: removed an obsolete comment + +### 2020-10-15 +* new dev version +* Russian translation update, thanks, Pavel! + +## 6.2.4 +* **Documentation Updates:** + * Reference manual update +* **Notable Fixes:** + * fixed showing message senders if there are comments in scripts +* **Translation Updates:** + * Russian, thanks, Pavel! + +### 2020-10-09 +* new dev version +* objects: fixed showing message senders if there are comments in scripts +* Russian translation update, thanks, Pavel! +* prepared patch + +## 6.2.3 +* **Notable Fixes:** + * disabled "result pic" option for custom block definitions +* **Translation Updates:** + * Greek, thanks, HM100! + +### 2020-10-09 +* new dev version +* Greek translation update, thanks, HM100! +* blocks: disabled "result pic" option for custom block definitions +* prepared patch + +## 6.2.2 +* **New Features:** + * new "add comment" option in the block context menu, thanks, Rob Fidler! + * new "settings" button in the input slot dialog + * added "bar / lines" option for plotting charts in the "frequency distribution analysis" library + * enabled "result pic" for command scripts containing a "report" block +* **Notable Changes:** + * made (hidden) "Blurred shadows" setting persistent, use to get rid of "red bar" artifacts on old laptops using Chrome + * specifying alpha values is now optional for generating pixels in bitmaps (costumes), none means the pixel is solid + * attribute selection in the SET block are now prefixed with "my" + * assume stage dimensions for "SWITCH TO COSTUME" with list if current costume dimensions don't fit + * new "48 kHz" option in the "sampling rate" dropdown + * increased area / sensitivity for collapsing variadic input slots, esp. on mobile devices +* **Notable Fixes:** + * "append" block now shows up when searching for it + * disable blurred shadows inside input slots if the hidden "blurred shadows" setting is turned off, use this setting on old laptops displaying "red bars" in Chrome +* **Translation Updates:** + * Greek, thanks, HM100! + * German + +### 2020-10-08 +* blocks: enabled "result pic" for command scripts containing a "report" block +* prepared release + +### 2020-10-07 +* byob: added "settings" button to input slot dialog +* symbols: added "gearPartial" icon +* blocks: fixed an empty-slot detection issue (reported in the forums), but left it commented out for now, until researching the consequences ;-) +* blocks: increased area / sensitivity for collapsing variadic input slots +* blocks: tweaked expanding variadic inputs +* blocks: reverted sensitivity tweaks for variadic inputs +* blocks, threads: reintroduced a different approach for making it easier to collapse variadic inputs + +### 2020-10-06 +* blocks: disable blurred shadows inside input slots if the hidden "blurred shadows" setting is turned off +* widgets: honor (hidden) blurred shadows setting for input widgets +* objects: honor (hidden) blurred shadows setting for watcher cell widgets +* tables: honor (hidden) blurred shadows setting for pictograms in tables +* gui: made (hidden) "Blurred shadows" setting persistent, use to get rid of "red bar" artifacts on old laptops using Chrome +* blocks: fixed a zoom blocks glitch +* byob: fixed positioning of loop arrow symbol in the input slot dialog + +### 2020-10-05 +* Greek translation updata, thanks, HM100! +* blocks, threads: prefixed attribute selection in the SET block with "my" +* German translation update +* objects: assume stage dimensions for "SWITCH TO COSTUME" with list if current costume dimensions don't fit + +### 2020-10-04 +* threads: made alpha values optional for generating costume pixels, none = solid +* objects: fixed #2694 - removed "dev" flag from "append" primitive - made sure it shows up in block-search + +### 2020-09-28 +* tweaked "frequency distribution analysis" library to plot lines in any color or style + +### 2020-09-25 +* new dev version +* updated "frequency distribution analysis" library: New "lines" option for plotting +* blocks: new "add comment" option in the block context menu, thanks, Rob Fidler! +* blocks: added "48 kHz" option to the "sampling rate" dropdown + +## 6.2.1 +* **New Features:** + * added "get value from key" reporter to database library, thanks, Brian! +* **Notable Changes:** + * updated reference manual for v6.2, thanks, Brian! +* **Notable Fixes:** + * fixed translatability of certain drop-downs such as "point in direction _" +* **Translation Updates:** + * Turkish, thanks, Turgut! + * Italian, thanks, Stefano! + +### 2020-09-21 +* reference manual update to v6.2, thanks, Brian! +* added single record query to data library, thanks, Brian +* Turkish translation update, thanks ,Turgut! +* Italian translation update, thanks, Stefano! + +### 2020-09-20 +* new dev version +* blocks: fixed translatability of certain drop-downs such as "point in direction _" + +## 6.2.0: +* **New Features:** + * show message senders and receivers from the blocks context menu + * "export block definition" including dependencies + * hyperized "distance/direction to _" reporter primitive + * new "Database" library operating on localstore +* **Notable Changes:** + * swapped version number and "Build Your Own Blocks" in page title +* **Notable Fixes:** + * changing the type of a custom block from reporter to command in the block editor changes the prototype instead of adding another one + * deleting project notes in the "save" dialog now also deletes them in the saved project + * items in list-boxes such as the project list are no longer auto-translated + * fixed a redo issue + * fixed a rare race condition when loading projects +* **Translation Updates:** + * Catalan, thanks, Joan! + * Norwegian, thanks, Olav! + * German + +### 2020-09-18 +* objects: Fixed costume thumbnail for asynch loading, thanks, Bernat! +* prepared release + +### 2020-09-14 +* blocks: fixed "redrop" (redo) +* byob: consolidated custon block definition update counter, thanks, Brian B.! + +### 2020-09-12 +* morphic: don't auto-translate ListMorph items + +### 2020-09-10 +* added input type assertions to Database library + +### 2020-09-08 +* swapped version number and "Build Your Own Blocks" in page title + +### 2020-09-07 +* gui: deleting project notes in the "save" dialog now also deletes them in the saved project + +### 2020-09-04 +* byob, blocks, objects: refactored scanning for message senders +* blocks: support scanning for message receivers from inside a block editor +* blocks: fixed changing the type of a custom block from reporter to command in the block editor + +### 2020-09-03 +* byob: experimental: Inspect & export dependencies for global custom blocks (shift-right-click for context menu) +* byob: new feature: "export block definition" including dependencies +* blocks, byob, objects: find message sends in global custom blocks dependencies + +### 2020-09-02 +* threads: hyperized "distance/direction to _" reporter primitive + +### 2020-09-01 +* Norwegian translation update, thanks, Olav +* gui, blocks: fixed a bunch of typos and UI strings, thanks, Brian Broll! +* colors library update, thanks, Brian H.! +* German translation update +* objects: also scan custom blocks for message sends + +### 2020-08-31 +* Catalan translation update, thanks, Joan! + +### 2020-08-18 +* blocks: tweaked menu separator line above "senders.../receivers..." to only show once + +### 2020-08-08 +* blocks: changed "show senders/receivers" menu entry to "senders.../receivers..." +* gui: tweaked SpriteIconMorph>>flash() for flat design mode + +### 2020-08-07 +* new dev version +* added new localstorage library +* show message senders / receivers from the blocks context menu, thanks, Bernat! + +## 6.1.4: +* fixed "green flag" symbol size for embedded proects (for real ^^) + +## 6.1.3: +* **Notable Changes:** + * exporting pictures of (semi-) faded blocks now includes the cropped solid background color + * "to lowercase" reporter now also in Strings library, thanks, Brian! +* **Notable Fixes:** + * fixed restoring ringed inputs when relabelling and compiling HOFs + * added viewport, thanks, Radman! + * fixed "green flag" symbol size for community website, thanks, Bernat! +* **Translation Updates:** + * Catalan, thanks, Joan! + * Portuguese, thanks, Manuel! + +### 2020-08-05 +* threads: experimental hyperized reporter-if, commented out for now +* blocks: fixed restoring ringed inputs when relabelling and compiling HOFs +* added viewport, thanks, Radman! +* Catalan translation update, thanks, Joan! +* Portuguese translation update, thanks, Manuel! +* added blocks to Strings library, thanks, Brian! +* fixed "green flag" symbol size for community website, thanks, Bernat! + +### 2020-08-04 +* new dev version +* blocks: include background color when exporting (semi-) transparent script pics + +## 6.1.2: +* fixed variable scope for ASK/TELL + +### 2020-08-01 +* threads: fixed variable scope for ASK/TELL + +## 6.1.1: +* rolled back scope binding change + +### 2020-07-31 +* rolled back scope binding change + +## 6.1.0: +* **New Features:** + * fade blocks +* **Documentation Updates:** + * added migration guide for Morphic2/Snap!6 +* **Notable Changes:** + * changed label of green "length of" reporter to "length of text" + * new iconic buttons for grow, shrink and flip actions in the paint editor, thanks, Jadga! + * UI: automatically switch to scripts tab when dragging a block into the editor pane + * slightly darker default (non-flat) IDE colors, more cotrast + * enabled grouping the libraries dialog, thanks, Brian! + * cleaned up, grouped and annotated libraries, thanks, Brian! + * updated "About Snap!" dialog box +* **Notable Fixes:** + * fixed FOR EACH for hybrid lists, thanks, Brian! + * fixed script execution behavior when turning turbo mode off programmatically, thanks, Jadga, for reporting it. + * fixed keyboard shortcuts for saving projects (ctrl + s), finding blocks (ctrl + f) etc.. + * fixed shift-key constrain mode and "clear" in paint and vector editors, thanks, Joan! + * made remaining synchronous http requests asynch (url: #open, #run) + * update the Hand's position on mouse-down - avoid triggering at the origin point if clicking before the mouse has been moved + * fixed a list-watcher direct-editing index offset bug + * fixed input slider target update rendering + * fixed sprite speech balloon display for sounds + * library browser: import selected library on pressing enter + * fixed binding contexts to other receivers (variable scope for ASK / TELL) + * fixed numeric input fields in dialog boxes + * fixed reacting to keyboard input in dialog boxes + * fixed zoom blocks type-in dialog + * made stack-highlights un-touchable +* **Translation Updates:** + * German + +### 2020-07-30 +* gui: updated Jadga as contributor in credits +* prepared release + +### 2020-07-29 +* blocks: made stack-highlights un-touchable + +### 2020-07-28 +* blocks: tweaked stack-highlight for (partially) faded blocks + +### 2020-07-27 +* threads: fixed binding contexts to other receivers (variable scope for ASK / TELL) +* gui: updated "About Snap!" dialog box +* gui: library browser: import selected library on pressing enter +* widgets: fixed numeric input fields in dialog boxes +* widgets: fixed reacting to keyboard input in dialog boxes +* blocks: fixed zoom blocks type-in dialog + +### 2020-07-26 +* objects: fixed sprite speech balloon display for sounds +* cleaned up, grouped and annotated libraries, thanks, Brian! + +### 2020-07-24 +* gui: cleaned up block-fading pre-sets +* updated German translation +* gui: tweaked IDE colors for block-fading +* blocks, threads, byob, widgets: tweaked block representations in widgets for fading +* blocks, byob: tweaked more block representations in widgets for fading + +### 2020-07-23 +* morphic: fixed mouseDown events for touch devices +* morphic, gui: added separators to list morphs, '~' for the libraries dialog +* blocks: tweaked block-fading coloring + +### 2020-07-22 +* morphic, blocks, gui: tweaked block-fading mouse-over +* blocks, threads: tweaked context visualizations to be alpha-independent +* gui: save block-transparency in settings +* morphic: fixed input slider target update rendering + +### 2020-07-21 +* blocks: tweaked block highlights for fade-out +* widgets, gui: tweaked scripts tab for fade-out +* blocks, gui: tweaked default mode colors to slightly darker + +### 2020-07-20 +* objects: fixed a list-watcher direct-editing offset bug +* morphic: update the Hand's position on mouse-down - avoid triggering at the origin point +* symbols: added hooks for dynamic coloring +* blocks: added blocks-fading support for symbols (under construction) +* morphic: tweaked transparency of grabbed morphs + +### 2020-07-19 +* blocks: blocks-fade-out support for label arrows (under construction) +* blocks: blocks-fade-out support for multi-line inputs (under construction) + +### 2020-07-17 +* morphic, blocks: blocks-fadeout (under construction) + +### 2020-07-15 +* morphic: made keyboard handler (more) invisible, thanks, Bernat! +* gui: made remaining synchronous http requests asynch (url: #open, #run) +* morphic, gui: switch to scripts tab when dragging a block into the editor pane +* blocks: refactored transparency handling for syntax elements + +### 2020-07-13 +* paint, symbols: new iconic buttons for grow, shrink and flip actions, thanks, Jadga! +* sketch: tweaked layout to match the paint editor's +* fixed shift-key constrain mode and "clear" in paint and vector editors, thanks, Joan! + +### 2020-07-10 +* morphic: prevent the browser from hijacking cmd-d/f/i/p/s key events +* added migration guide for Morphic2/Snap!6 +* updated Eisenbergification library, thanks, Brian! + +### 2020-07-09 +* new dev version +* threads: fixed FOR EACH for hybrid lists, thanks, Brian! +* threads: fixed script execution behavior when turning turbo mode off programmatically, thanks, Jadga, for reporting it. +* locale: added English translation for 'length of %s' to 'length of text %s' to avoid confusion among both blocks +* updated German translation for 'length of %s' + +## 6.0.0: +* **New Features:** + * new Morphic architecture, faster loading, smaller memory footprint, mobile-friendly + * hyper-blocks + * new "send msg to sprite" primitive in control + * new "index of" primitive in lists + * new fast "append" reporter in lists + * show login status in the cloud button (outline = logged out, solid = logged in) + * custom drop-downs (experimental, uses JS) + * blockify lists / tables with atomic values in watchers + * extended libraries (APL, thanks, Brian) and programmatic handling of variables (thanks, Joan) + * "result pic..." context menu entry for reporters (used to be hidden "script pic with result..." option) + * more block relabelling options, e.g. for loops + * prefix keys in custom drop-down menus with '§_' to only show them if the shift-key is pressed + * new "id" option in the monadic function reporter primitive (hyperizable to support deep copies of nested lists) + * new api for creating new lists for embedded Snap sessions +* **Notable Changes:** + * repeated WARPs inside loops have been sped up + * duplicated blocks / scripts are grabbed by their top-left corner rather than their center + * close all widgets when opening a new project + * scan first ten rows of a list to determine the number of columns to show in table views + * give duplicated custom block definitions unique names + * sort sound and message names in drop-down menus alphabetically + * changed result for FIND to empty instead of false if none is found + * new flat design + * increased contrast in dark mode + * toggling Retina support has been hidden (because it no longer works the same) +* **Notable Fixes:** + * multi-c slots embedding reporters has been disabled + * programmatically changing a clone from "permanent" to "temporary" now works in presentation mode + * costumes and sounds of clones are now properly shadowed when modifying them programmatically + * fixed editing cells in multi-page list watchers + * recursive calls to "broadcast and wait" execute smoothly again + * expanding a collapsed comment or clicking on it now brings it to the front + * long project titles no longer overlap other buttons in the control bar + * "empty" continuations referring to the end of a script no longer throw an error. +* **Translation Updates:** + * New Hebrew translation + * Ukranian + * Catalan + * Portuguese + * Chinese + * Japanese + * Bengali + * German + +## 5.4.5: +* **Notable Change:** + * always record audio in mono +* **Translation Update:** + * German, thanks, Sven! + +### 2020-01-28 +* new dev version +* gui: record sounds in mono +* gui, objects: force stereo audio recordings to mono +* Germans translation tweak, thanks, Sven! + +## 5.4.4: +* **Notable Fixes** + * fixed strings library format + * automatically remove orphaned variable watchers + +### 2020-01-11 +* objects: automatically remove orphaned variable watchers +* prepared patch + +### 2020-01-10 +* fixed strings library format + +## 5.4.3: +* **Notable Fix** + * render Boolean slots correctly after mouse-over + +### 2020-01-06 +* blocks: reset BooleanSlotMorph canvas context's global alpha after rendering the slider button +* prepared patch + +## 5.4.2: +* **Notable Fix:** + * prevent Morphs from sharing canvasses when rerendering + +### 2020-01-04 +* morphic: fixed tagging of shared Canvasses +* prepared patch + +## 5.4.1: +* **Notable Change:** + * optimized loading projects +* **Notable Fix:** + * reduced distortion and clicks when playing notes +* **Translation Update:** + * Catalan + +### 2020-01-03 +* new dev version +* morphic: recycle cached Canvasses +* gui: recycle cached Canvasses +* objects: recycle cached Canvasses +* blocks: recycle cached Canvasses +* widgets: recycle cached Canvasses +* byob: recycle cached Canvasses +* symbols: recycle cached Canvasses +* symbols: recycle cached Canvasses +* Catalan translation update +* objects: tweaked notes to reduce distortion and clicks +* prepared minor release + +## 5.4.0: +* **New Features:** + * log pen vectors + * export pen trails as SVG + * access pen trails as SVG_Costume: new "pen vectors" reporter variant of "pen trails" + * new Snap! API: broadcast and react to messages, access global variables from outside Snap! +* **Notable Change:** + * when creating a costume from pen trails (raster or vector) make its rotation center the position of the sprite +* **Notable Fixes:** + * support null-serialization in list-csv conversions + * avoid circular inheritance when using blocks to set sprites' parents +* **Translation Updates:** + * NEW Slovak translation, thanks, Peter Lukacovic + * German + +### 2019-12-19 +* objects, threads: refactored inheritance circularity avoidance +* prepared release + +### 2019-12-18 +* gui, api: rearranged Snap! API into its own file +* added API documentation +* threads: avoid circular inheritance when using blocks to set sprites' parents + +### 2019-12-16 +* gui, objects: added ability to add general message listeners for "any" message +* gui: added IDE >> getMessages() to Snap! API +* gui: refactored IDE >> addMessageListenerForAll(callback) + +### 2019-12-15 +* gui, threads: new Snap! API: programmatically broadcast messages and optionally wait from outside Snap! +* gui: added global variable access methods to the new Snap! API +* gui, objects: added ability to add message listeners to broadcasts + +### 2019-12-13 +* added direct relabelling option to pen trails blocks' context menus + +### 2019-12-10 +* NEW Slovak translation, thanks, Peter Lukacovic + +### 2019-12-09 +* store: save and restore "log pen trails" setting in project file + +### 2019-12-08 +* lists: support null-serialization in list-csv conversions + +### 2019-12-07 +* threads: turn "log pen trails" off when loading or creating a new project + +### 2019-12-05 +* threads: set the rotation point of "pen vectors" costumes to the position of the sprite that creates them +* objects: set the rotation point of "pen trails" costumes to the position of the sprite that creates them + +### 2019-12-03 +* objects, blocks, threads, gui: added "log pen vectors" session setting +* updated German translation + +### 2019-12-02 +* new dev version +* objects: export pen trails as SVG (under construction) +* threads: new "pen trails (SVG)" reporter (experimental, hidden in dev) +* objects, threads: adjusted rotation center of SVG-pen-trails +* objects: added aspect racio governance and generator tags to trails SVGs +* threads: catch empty trails log when trying to generate a vector trails costume +* objects: support relabelling "pen trails" to "pen trails (SVG)" and vice-versa +* gui: added "svg" entry to the stage icon's context menu +* objects: renamed "pen trails (SVG)" to "pen vectors" +* German translation update +* cleaned up change markers + +## v5.3.8: +* **Notable Change:** + * optimized color collision detection + +### 2019-11-29 +* new dev version +* objects, threads: optimized color collision detection +* prepared release + +## v5.3.7: +* **Notable Fixes:** + * wait until the camera actually records something when turning video capture "on" + * only report video capture as "on" when the camera actually records something + +### 2019-11-19 +* threads: when turning video capture "on" wait until the camera actually records something +* prepared release + +### 2019-11-18 +* new dev version +* threads: only report video capture as "on" when the camera actually records something + +## v5.3.6: +* **Notable Fix:** + * fixed variadic reporters library + +## v5.3.5: +* **Notable Fix:** + * make sure list watchers are correctly initiailized + +## v5.3.4: +* **Notable Fixes:** + * allowed reserved JS object property names as variable names in Snap (e.g. "constructor") + * disabled direct editing of list watchers for non-literal typed lists (such as costumes) in speech bubbles and prompters + * now preserving the sprite's rotation point when taking a video-snap on it + * now preventing costumes from becoming "broken" when pasting video snaps on them while the camera is not yet fully initialized + * now catching sub-pixel sized thumbnails + +### 2019-11-15 +* objects: prevent costumes from becoming "broken" when pasting video snaps on them while the camera is not yet fully initialized +* objects: catch sub-pixel sized thumbnails +* prepared release + +### 2019-11-14 +* lists: disabled direct editing of list watchers for non-literal typed lists (such as costumes) in speech bubbles and prompters +* objects: preserve the sprite's rotation point when taking a video-snap on it + +### 2019-11-13 +* new dev version +* threads: allowed reserved JS object property names as variable names in Snap (e.g. "constructor") + +## v5.3.3: +* **Notable Change:** + * dropdown translation improvements, thanks, Joan! +* **Notable Fixes:** + * fixed submenu translation control for dropdowns + * fixed help screens for "distance to _" and "answer" primitives, thanks, Brian and Michael! +* **Translation Update:** + * Catalan + +### 2019-11-12 +* new dev version +* drop-down menu translation improvements by Joan +* submenu-title translation control +* help screen fixes by Brian and Michael +* prepared release + +## v5.3.2: +* **Notable Fixes:** + * fixed #2518 (broken localization system) + * fixed size of MY help screen, thanks, Brian +* **Translation Updates:** + * Catalan, thanks, Joan + +### 2019-11-06 +* new dev version +* morphic, blocks: reverted recent changes to tranlation mechanism +* morphic: added support for "verbatim" (untranslated) menu items +* blocks: don't translate variable names in drop-down menus +* objects: don't translate variable names in "delete a variable" button menu +* blocks: don't translate variable names in "inherit" block menu +* blocks: fixed dropdown menu generation for untranslated items +* blocks: don't translate message names in drow-down menus +* blocks: don't translate names in dropdowns +* byob: don't translate items in dropdowns +* help: fixed size of MY help screen, thanks, Brian +* prepared release + +## v5.3.1: +* **Notable Fixes:** + * no longer translate variable names in drop-down menus for which translations exist + * fixed zero extent costume creation, thanks, Bernat! + +### 2019-11-05 +* threads: fixed zero extent costume creation, thanks, Bernat! +* prepared release + +### 2019-11-04 +* new dev version +* morphic: limit translation of menu items to specially marked ones +* blocks: translate "my" submenu label in "set" block + +## v5.3.0: +* **New Features:** + * expanding the rings in "map", "keep" and "find" shows 3 inputs named "value", "index" and "list" + * limited expanding rings in special HOFs to 3 parameters + * calling an empty reporter-ring with no formal parameters passing a single argument treats it as the identity function of that argument +* **Notable Changes:** + * dropping a ring parameter inside a reporter-ring no longer replaces the ring +* **Notable Fix:** + * fixed the initial scale of new clones when the stage has been resized +* **Translation Update:** + * German + +### 2019-11-02 +* blocks: limit expanding rings in special HOFs to 3 parameters +* blocks: renamed default special HOF parameters to "item, index, list" +* updated German translation +* blocks: dropping a ring parameter inside a reporter-ring no longer replaces the ring +* threads: calling an empty reporter-ring with no formal parameters passing a single argument treats it as the identity function of that argument +* blocks: renamed default special HOF parameter "item" to "value" +* updated German translation for "value" +* objects: fixed the initial scale of new clones when the stage has been resized +* prepared release + +### 2019-11-01 +* new dev version +* expanding the rings in "map", "keep" and "find" shows 3 inputs named "item", "idx" and "data" +* German translation update for "idx" and "data" + +## v5.2.5: +* **Notable Fix:** + * resume AudioContext on every request + +### 2019-10-30 +* objects: resume AudioContext on every request + +## v5.2.4: +* **Notable Changes:** + * optimized performance for backgrounds and pen trails + * optimized performance for sprite rendering and rotation + * added support for counting down using the "numbers" reporter +* **Notable Fixes:** + * fixed FOR so it can take numbers entered as text (bug report by Kathy from Piazza) + * removed "current" option from "switch to costume" block's drop-down menu + +### 2019-10-30 +* threads: optimized HOF primitives to only assert input types once +* objects: documented new canvas architecture for sprites +* prepared release + +### 2019-10-29 +* threads: added support for counting down using the "numbers" reporter +* morphic: improved canvas recycling +* objects: optimized sprite rendering and rotating +* threads: FOR so it can take numbers entered as text (bug report by Kathy from Piazza) + +### 2019-10-28 +* new dev version +* morphic: enable recycling and deep copying canvas elements +* objects, maps: recycle Stage layers - optimizes backgrounds and pen trails frame rate +* blocks: removed "current" option from "switch to costume" block's drop-down menu + +## v5.2.3: +* **Notable Changes:* + * added sprite dimension selectors to the OF reporter's dropdown menu + +### 2019-10-25 +* blocks, threads: added sprite dimension selectors to the OF reporter's dropdown menu +* prepared patch + +## v5.2.2: +* **Notable Fix:** + * more optimizations for collision detection + * **Translation Update:** + * Catalan + +### 2019-10-25 +* morphic, objects: optimized collision detection yet more +* prepared patch + +## v5.2.1: +* **Notable Fix:** + * optimized collision detection + +### 2019-10-24 +* morphic, objects: optimized collision detection +* prepared patch + +## v5.2.0: +* **New Features:** + * new media creation primitives: + * new primitive in "looks": NEW COSTUME from a list of pixels and dimensions, allowing CURRENT + * new primitive in "sound": NEW SOUND from a list of samples + * added selectors for sprites' and the stage's bounding box (LEFT, RIGHT, TOP, BOTTOM) to MY dropdown + * new experimental entry for "green flag pressed" in the BROADCAST block's dropdown when the shift key is pressed +* **Notable Changes:** + * running STOP ALL now also toggles (pauses and resumes) all generic WHEN hat blocks (just like pressing the stop button) + * changed default name for new costumes created with STRETCH etc. to localized 'costume' +* **Notable Fixes:** + * loading a project that fires STOP ALL from a WHEN hat block no longer "hangs" Snap + * fixed pixel-manipulation distortions on newly imported hi-res images + * assert that dimensions given for STRETCH are finite numbers (avoid crash) + * disabled direct editing of list watchers for non-literal typed lists (such as costumes, avoids unloadable projects) + * fixed occasional "dead clicks" on buttons and menu items +* **Translation Updates:** + * English + * German + +### 2019-10-24 +* prepared release + +### 2019-10-23 +* lists: disabled direct editing of list watchers for non-literal typed lists (such as costumes) + +### 2019-10-22 +* morphic: url-clicking fix by @brollb, updated morphic documentation +* pushed dev version to release-candidate status +* objects: normalized (de-retinized) costume thumbnails, fixed pixel-manipulation distortions on newly imported hi-res images + +### 2019-10-21 +* blocks, threads: new experimental entry for "green flag pressed" in the BROADCAST block's dropdown when the shift key is pressed +* updated English and German translations for `__shout__go__` +* updated German translation for new media creation primitives +* objects: rearranged "looks" and "sound" palettes for new media creation primitives + +### 2019-10-20 +* objects, threads: added "new sound" from list of samples primitive reporter to "sound" category +* objects, threads: added sampling rate input to "new sound" primitive +* threads: changed default name for new costumes created with STRETCH etc. to localized 'costume' +* threads: generate stereo sounds +* threads: added list type assertion for samples to "new sound" primitive +* objects: tweaked labels for "new costume" and "new sound" primitives +* objects: delegate (quasi-inherit) Stage>>newSoundName() from Sprite + +### 2019-10-18 +* objects, blocks, threads: added dimension getters for the stage +* German translation update (left, right, top, bottom selectors in MY) +* blocks, objects, threads: added "new costume" primitive reporter to "looks" category + +### 2019-10-17 +* objects, blocks, threads: added selectors for sprites' bounding box (left, right, top, bottom) to MY dropdown + +### 2019-10-16 +* new dev version +* morphic: added "enableLinks" flag to text elements, off by default +* widgets: made only URLs inside dialog boxes' bodies clickable +* threads: running STOP ALL now also pauses (pauses and resumes) all generic WHEN hat blocks +* threads: removed a conflicting thread from STOP ALL - loading a project that fires STOP ALL from a WHEN hat block no longer "hangs" Snap +* threads: assert that dimensions given for STRETCH block are finite numbers + +## v5.1.1: +* **New Features:** + * new cloud-menu entry: "Open in Community Site", thanks, Michael! + * accept a list of pixels in the SWITCH TO COSTUME block + * URLs in dialog boxes are now clickable and can open new browser tabs, thanks, Brian Broll! +* **Notable Changes:** + * made "i" upvar inside FOR loop's C-Shape slot mutable by user script + * prevent switching to another sprite if a block editor is open (so local blocks of different sprites don't mix) + * display a permanent warning when using IE +* **Notable Fixes:** + * typing strings into the search-field again shows relevant blocks (regression from IME) + * fixed project dialog's search-field behevior (regression from IME) + * morphic collision detection off-by-1 fix, thanks, Dariusz! + * fixed MY PARTS so mutating the result list has no effect + * fixed a typo in the OF-reporter's help screen, thanks, @jasonappah + * enable costumes created in the vector editor to be stretchable in Firefox, thanks, @coproc +* **Translation Updates:** + * Catalan + * Ukrainian, thanks, + * Galician, thanks, Bernat + * Turkish, thanks, Turgut! + * German + +### 2019-10-15 +* gui: prevent switching to another sprite if a block editor is open (so local blocks of different sprites don't mix) +* updated German translation +* gui: simplified asset loading scheduler +* gui: display a permenent warning when using IE +* prepared release + +### 2019-10-14 +* morphic: new "reactToInput" text-editing event +* objects: fixed #2485 (find blocks and text-entry mode feature) +* gui: fixed ProjectDialog's search field behavior for IME +* threads: fixed MY PARTS so mutating the result list has no effect +* threads: made "i" upvar inside FOR loop's C-Shape slot mutable by user script +* URLs in dialog boxes are now clickable and can open new browser tabs, thanks, Brian Broll! + +### 2019-10-11 +* objects, threads: accept a list of pixels in the SWITCH TO COSTUME block + +### 2019-10-09 +* new dev version +* morphic: collision detection off-by-1 fix, thanks, @DarDoro +* translation updates for: Catalan, Ukrainian, Galician and Turkish +* gui: new cloud- menu entry: "Open in Community Site", thanks, Michael! +* fixed a typo in the OF-reporter's help screen, thanks, @jasonappah +* enable costumes created in the vector editor to be stretchable in Firefox, thanks, @coproc + +## v5.1.0 +* **New Features:** + * new "paste on" block in the pen category, prints a sprite onto another one + * new "r-g-b-a" option in "(aspect) AT (location)" sensing reporter, returns a 4-item list of values from 0-255 (same as pixels from a costume) + * "temporary?" attribute is now programmatically settable (in the SET->my... block) +* **Notable Changes:** + * generated costumes that are not in the wardrobe are now made persistent in the project (saved & restored) +* **Notable Fixes:** + * fixed tainted audio context for auto-playing projects when the user interacts, thanks, Bernat! + * saved clones no longer forget if they inherit the "costume #" attribute +* **Translation Updates:** + * German + * Galician, thanks, Miguel! + +### 2019-08-08 +* store: allow wardrobe-less costumes to be shared among several sprites (e.g. when inheriting the "costume #" attribute) +* objects: fixed an issue when a sprite inherits both the wardrobe and the costume # +* store, objects: fixed the bug that made clones forget inheritance of costume # when saved +* prepared minor release + +### 2019-08-07 +* new dev version +* blocks, threads: added "r-g-b-a" option to (aspect) AT (location) reporter in the sensing category +* blocks, threads: made "temporary?" attribute for clones settable (in the SET->my... block) +* objects: made the "paste on" block avaible in the "pen" palette +* fix for tainted audio context when the user interacts with an auto-playing project +* store: persist temporary costumes that aren't in the wardrobe (e.g. generated graphics, maps, paste-ups) +* German translation update +* Galician translation update, thanks, Miguel! + +## v5.0.9 +* **New Feature:** + * new experimental "paste on" block in the "pen" category, currently hidden in dev mode +* **Notable Fixes:** + * resolved scroll bar conflicts (allow vertical scrolling past horizontal scroll bar), thanks, Michael! + * support for importing OGG audio files, thanks, Bernat! +* **Translation Update:** + * Chinese, thanks, Simon! + +### 2019-08-06 +* new dev version +* objects, threads: new experimental "paste on" block in the "pen" category, hidden in dev mode +* morphic: resolved scroll bar conflicts (allow vertical scrolling past horizontal scroll bar), thanks, Michael! +* gui: fixed color of scripts scroll frame +* morphic: support for importing OGG audio files, thanks, Bernat! +* Chinese translation update, thanks, Simon! +* prepared maintenance release + +## v5.0.8 +* **Notable Fix:** + * fixed default names for 'script variables' block + +### 2019-07-25 +* blocks: fixed default names for 'script variables' block +* prepared maintenance release + +## v5.0.7 +* **Notable Fix:** + * fixed #2041 + +### 2019-07-24 +* byob: fixed #2041 +* prepared maintenance release + +## v5.0.6 +* **Notable Fix:** + * IME text editing support, thanks, Zhenlei Jia @swiperthefox! + +### 2019-07-23 +* morphic: minor code reformatting for LINTers +* prepared maintenance release + +### 2019-07-22 +* new dev version +* morphic, blocks: support for enhanced character set keyboard input, thanks, @swiperthefox! + +## v5.0.5 +* **Notable Fix:** + * fixed cloud project collection support, thanks Bernat! + +## v5.0.4 +* **Notable Fixes:** + * fixed a glitch when running a generic WHEN hat block with a literal Boolean input + * fixed a bug in the SHOW PICTURE block of the "Pixels" library + +### 2019-07-10 +* threads: fixed a glitch when running a generic WHEN hat block with a literal Boolean input +* fixed a bug in the SHOW PICTURE block of the "Pixels" library +* tweaked "messages" menu for custom blocks, thanks, Joan! +* maintenance release + +## v5.0.3 +* **Notable Change:** + * CSV-parsing auto-detects the most likely delimiter among comma, semi-colon, pipe and tab + +### 2019-07-10 +* threads: enhanced CSV-parsing to auto-detect the most likely delimiter among comma, semi-colon, pipe and tab +* maintenance release + +## v5.0.2 +* **New Feature:** + * experimental tolerant color collision detection (in dev mode) +* **Notable Fixes:** + * fixed a layout glitch for variadic C-shaped input slots, thanks, Bernat, for reporting it! + * updated the manual for the new WRITE block, thanks, Brian + +### 2019-07-09 +* blocks: fixed a layout glitch for variadic C-shaped input slots, thanks, Bernat, for reporting it! +* updated the manual for the new WRITE block, thanks, Brian (was #2448) +* maintenance release + +### 2019-07-08 +* new dev version +* morphic, objects, threads: experimental tolerant color collision detection (in dev mode) + +## v5.0.1 +* **Notable Changes:** + * gliding animation when inserting blocks using the keyboard + * optimized collision detection +* **Notable Fixes:** + * show "browser" source option in project dialog when (deprecated) locally stored projects still exist + * list watchers occasionally didn't show cells after reassigning a changed list to a variable + * FOREACH over a linked list failed for scripts mutating it + * eliminated an occasional empty label line when variadic inputs wrap as a whole, thanks, Mary, for reporting this bug! + +### 2019-07-04 +* gui: show "browser" source option in project dialog when (deprecated) locally stored projects still exist +* maintenance release + +### 2019-07-03 +* blocks: eliminated an occasional empty label line when variadic inputs wrap as a whole, thanks, Mary, for reporting this bug! + +### 2019-07-02 +* morphic: optimized collision detection by only looking at the alpha channel data + +### 2019-07-01 +* new dev version +* lists: fixed #2446 +* threads: fixed an issue when iterating over a linked list with a script mutating it, thanks, Brian! +* cloud: fixed collection grid page size, thanks, Bernat! +* morphic: fixed a race condition in Morph.glideTo() +* blocks: added gliding animation when inserting blocks using the keyboard + +## v5 +### 2019-06-27 +* **New Features:** + * the "tools" library has been integrated as primitives + * export 1- /2- dimensional lists with atomic data as CSV + * export n-dimensional lists with atomic data as JSON + * import CSV, Text, or JSON via drag & drop + * option to import CSV etc. as "raw data", i.e. unparsed + * parse JSON using the SPLIT reporter + * new "aspect AT location" reporter in Sensing category for sniffing colors and sprites + * new blocks for setting and changing the stage's background color + * new "microphone" reporter in Sensing for getting volume, note, pitch signals and frequencies + * new experimental live audio-scripting support + * new video capturing and video-motion detection support, thanks, Josep! + * new "object" reporter in the Sensing category for getting a sprite by its name + * blocks for changing and querying the "flat line ends" setting + * selectors for changing and querying "draggable" and "rotation style" settings + * new sound + music "volume" feature + blocks + * new sound + music stereo "panning" feature + blocks + * new sound attribute getter reporter + * new "play sound at sample rate" command + * accept lists and lists of lists as inputs to all sound primitives + * new "play frequency" commands in the Sounds category + * pixel access primitives for bitmap and vector (!) graphics + * new "stretch" primitive for costumes, also for flipping + * new "get graphic effect" reporter + * new "get pen attribute" reporter + * new "pen down?" predicate + * new "shown?" predicate + * new "write" command in pen category (used to be "label" in tools) + * new "numbers", "is empty", "map","keep", "find", "combine" and "for each" primitives in list category + * 2 optional formal inputs for rings in MAP, KEEP, FIND, COMBINE: index and source list + * new JIT-compiler "blitz-HOF" primitives for "map", "keep", "find" & "combine" via "compile" + * new "for" loop and "if then else" reporter primitives in the Control category + * added "neg", "lg" (log2) and "2^" selectors to monadic function reporter in Operators + * added "^" reporter (power of) in the Operators category + * added "width" and "height" to the MY blocks dropdown + * added "width" and "height" as attribute selectors of the OF primitive + * added "costume" selector to the MY attributes dropdown + * added plus (+) and minus (-) keys to sensing and key hat + * special context-aware drop-downs for custom blocks + * new "stick to" submenu in the sprite context menu where applicable + * multi-line and monospaced "code" input slots for custom blocks + * new "string" library, thanks, Brian + * new "text costumes" library for generating costumes from letters or words of text + * new "World Map" extension and library for interactive maps + * graphic effects and sound attributes can now be animated with easing functions + * enhanced support for embedding Snap in other website, thanks, Bernat! + * export sounds +* **Notable Changes:** + * added third hsv dimension to pen colors, changed SET and CHANGE pen blocks + * added transparency (alpha) to pen colors + * new drop-down options for sprite-layer control ("GO TO front/back") + * "loop arrow" symbol for primitive loops, also available for custom blocks + * optimized in-project storage of atomic-data lists (more efficient, less space) + * remove all clones when the Green Flag is clicked + * adjust bottom of STOP block to reflect the menu selection (show / hide bottom notch) + * enable dropping commands into all rings + * colors in the vector editor are now named "Edge color" and "Fill color", thanks, Brian! + * renamed "whitespace" option in SPLIT to "word" + * made the "name" attribute programmatically settable + * made the "temporary?" attibute readyble + * deprecated storing projects in the browser's localStorage + * deprecated some (useless) graphic effects + * additional "publish / unpublish" buttons in the project dialog + * buttons for saving & loading projects to disk in the project dialog + * more language options for the Text2Speech library, thanks Joan! +* **Notable Fixes:** + * predicates inside generic WHEN hat blocks can now pass upvars + * eliminated "clicks" when playing music notes + * "relabel" blocks with translated drop-down choices + * transforming arrayed to linked lists without loosing the last element + * using "inherit" no longer un-hides the palette in presentation mode + * relabelling custom blocks with empty numerical input slots no longer fills in zeroes + * the language menu now has a "globe" icon (so it can be found in any language) + * accept a number as input for a sound - interpret as index + * fixed many costume sizes, thanks, Brian! +* **Translation Updates:** + * Chinese, thanks, Simon! + * Turkish, thanks, Turgut! + * Indonesian, thanks, Emanuella! + * Greek, thanks, Alexandros! + * Catalan, thanks, Joan! + * Portuguese, thanks, Manuel! + * Spanish + * German + * French + +### 2019-06-27 +* updated manual and help screen for COMBINE, thank you, Brian! +* updated CRAYONS library, thanks you, Brian! +* prepared release + +### 2019-06-25 +* threads: 2 optional formal inputs for rings in MAP, KEEP, FIND, COMBINE: index and source list +* objects, threads: renamed COMBINE label, switching the inputs +* objects: took out "relabel" options for COMBINE +* adjusted German translation to the switched order of inputs for COMBINE +* adjusted Spanish translation to the switched order of inputs for COMBINE +* adjusted Portuguese translation to the switched order of inputs for COMBINE +* adjusted Catalan translation to the switched order of inputs for COMBINE +* adjusted French translation to the switched order of inputs for COMBINE + +### 2019-06-24 +* removed "such that" from KEEP and FIND block labels +* adjusted German, French, Portuguese, Spanish, Catalan translations +* updated Catalan translation, thanks, Joan! +* updated Portuguese translation, thanks, Manuel! +* fixed #2417 +* fixed #2416 + +### 2019-06-06 +* Maps: fixed a typecasting issue, thanks, Bernat! + +### 2019-06-04 +* Objects, Lists: fixed #682 +* Lists, Tables: fixed table watcher cell updates for costumes (save / load) + +### 2019-06-03 +* Threads: fixed #2249, predicates inside generic WHEN hats should be able to pass upvars +* Blocks: fixed #1740 +* Blocks: fixed #670 and #1804 + +### 2019-06-02 +* Objects, Store: made "pen down?" and "shown?" attributes watchable onstage +* Objects, Blocks: made "shown?" attribute inheritable +* Objects, Blocks: made "pen down?" attribute inheritable +* Objects: made watchers immediately react to inheritance changes + +### 2019-06-01 +* Objects: new "pen down?" predicate +* Objects: new "shown?" predicate +* updated German translation for "shown?" and "pen down?" + +### 2019-05-31 +* Threads: optimized FOREACH performance for large linked lists +* German translation update (FINDFIRST, WORD, TEMPORARY?) +* Threads: also allow numbers as sprite names in SET +* updated "animation" library (purged unused blocks) +* updated "audioComp" library (purged unused blocks) +* updated "frequency distribution" library (changed PIPE to use EMPTY prim) +* Maps: added support for zxy, zyx and xyz style maps and satellite imagery +* updated "World Map" library with options for Satellite, Streets and Shading + +### 2019-05-29 +* Threads, Objects: added "Find First" primitive to lists category +* Blocks, Threads, Objects: added "blitz" version of FIND +* Blocks, Threads, Objects: renamed "whitespace" option in SPLIT to "word" +* GUI, Threads: made "name" attribut programmatically settable, (I hate my life!) +* Blocks: made the "temporary?" attibute readable (I hate my life even more!) + +### 2019-05-28 +* Maps: added various different tile hosts +* added "set map style" command to maps library + +### 2019-05-25 +* added credits and license information to map costumes + +### 2019-05-24 +* new experimental Maps module, our own thin slippy maps client for Snap! +* adjusted "World Map" library to the new client + +### 2019-05-23 +* Objects: changed WRITE block to print at the rotation center instead of the geometric one + +### 2019-05-21 +* Objects: fixed stage-size settings bug +* new "World Map" library +* enhanced detecting '+' and '-' keys for Firefox + +### 2019-05-20 +* Objects, Blocks added plus- and minus- keys to key pressed predicate and hat block +* Objects: refactored projection layer update +* Catalan translation update, thanks, Joan! + +### 2019-05-16 +* Objects: more refactoring to generalize projection extensions + +### 2019-05-15 +* Objects, Treads: refactored videoLayer so it can also be used for other extensions (maps, 3d) +* Objects: refactored video frame capture + +### 2019-05-14 +* Objects: fixed originalCloneName reference when setting a new parent + +### 2019-05-12 +* Threads: fixed costume names and thumbnails for computed costumes + +### 2019-05-09 +* Blocks, Objects, Threads: tweaked new video-snap (still capture) feature +* Objects: fixed video still "snap on sprite" for Firefox +* GUI: added credits in the "about" dialog for @jferran6 and @jguille2 +* German and Catalan translation updates + +### 2019-05-08 +* Blocks, Objects, Threads: integrated video capture control into global settings prims in Sensing +* Blocks, Threads: added a %self menu +* Blocks, Threads, Objects: Finalized Video ops +* Objects, Threads, GUI: auto-start video capture when querying, stop video on stop-all +* GUI, Objects: arranged video blocks in palette +* Blocks, Objects, Threads: new video-snap (still capture) feature + +### 2019-05-07 +* Blocks, Objects, Threads, Video: optimized video motion detection +* Objects: actually stop the webcam, i.e. all tracks of the media stream when stopping video + +### 2019-05-06 +* Blocks, Objects, Threads, Video: New video motion detection feature by Josep Ferràndiz i Farré, under construction + +### 2019-05-03 +* Blocks: reverted reordering MY block dropdown by data type - back to similarities +* Blocks: added "compile / un-compile" options to HOF-prims +* Objects: added relabelling options for HOF-prims +* German translation update +* removed new HOF prims from the "atomic HOFs" library (aka "Bigger Data") +* edited "parallelization" library to use the new "is (list) empty" primitive + +### 2019-05-02 +* Blocks: reordered MY block dropdown by data type +* Blocks, Threads: added "width" and "height" to the MY block's dropdown +* Blocks, Threads: added "width" and "height" to the OF block's dropdown for sprites +* Blocks, Objects: added hidden "blitz-HOF primitives" for MAP, KEEP and COMBINE +* updated German, Catalan, Spanish and French translations for "blitz-HOF" primitives +* duplicated help-screens for "map" & friends for their atomic "blitz" variants +* Objects: expose "import raw data" option in variable watcher context menu +* German translation update for "raw data" importing feature +* Threads: added JIT-Compiler support for new IF/ELSE reporter primitive + +### 2019-04-30 +* Blocks, Threads: added "id" to image attributes dropdown +* Blocks, Threads: removed "id" from image attributes +* Blocks, Threads: added "costume" selector to MY dropdown +* German translation update +* Objects: adjusted costume stretch minimum to 1 pixel + +### 2019-04-29 +* optimized animation library +* Threads: stop audio frequency instances when "stop all" is executed + +### 2019-04-28 +* more helpscreens and bignum library update, thanks, Brian! +* more language options for the Text2Speech library, thanks, Joan! +* Objects, translations: changed "hz" typo to "Hz", thanks, Brian, for catching this! + +### 2019-04-27 +* Lists, Threads, Objects: new "is empty" predicate primitive in List category +* Threads, Objects: new "numbers" constructor primitive in List category +* Threads: renamed "aggregation" property to "accumulator" +* GUI: removed "tools" library, yay! +* updated German, Catalan, Spanish and French translations for former tools +* renamed help screen for "is _ empty?" + +### 2019-04-26 +* updated Catalan translation (for new HOF prims) +* updated Spanish translation (for new HOF prims) +* updated French translation (for new HOF prims) +* corrected French translation for "warp" to be "warp" instead of "englobe" +* moved "for each" down in the lists pallette towards the imperative blocks +* updated "tools" library (for new HOF prims) +* removed "catch" etc. from "tools" library (has been moved to "iteration" lib) +* updated "cases" library (for new HOF prims) +* updated "bignums" library (for new HOF prims) +* updated "crayons" library (for new HOF prims) +* updated "animation" library (for new HOF prims) +* updated "audio comp" library (for new HOF prims) +* updated "parallelism" library (for new HOF prims) +* renamed help screens for the new HOF prims +* Theads: added support for single implicit parameter to FOR EACH prim + +### 2019-04-25 +* updated German translation (for new HOF prims) +* Costume size fixes, yay! Thank you, Brian!! + +### 2019-04-24 +* Threads, Objects: new "combine" primitive in list category +* Threads: added type-assertions for the new HOF prims +* Threads, Objects: new "for" loop primitive in Control category +* Threads, Objects: new "if then else" reporter primitive in Control category + +### 2019-04-23 +* Threads: fixed JS stack overflow issue for MAP primitive +* Threads: new "map" and "for each" primitives in list category +* Threads: new "keep" primitive in list category + +### 2019-04-22 +* Threads: fixed variable binding for "arguments", turned dictionary key into a Symbol + +### 2019-04-15 +* Catalan translation update + +### 2019-04-12 +* Objects: enabled text-variables as inputs for graphic effects / pen attributes +* updated amination library with graphic effects and audio attributes + +### 2019-04-11 +* Blocks, Threads: renamed monadic selectors: "neg" to "-" and "log2" to "lg", added "2^" +* Objects: moved costume-pixels primitives down in the palette towards the graphic effects +* German translation update +* re- renamed minus selector back to "neg" +* updated tools library (removed "label", because it's now a primitive) +* updated text-costumes library (removed "label", because it's now a primitive) +* updated pixels-library (removed blocks that are now primitives) +* updated audio-comp library (removed blocks that are now primitives) + +### 2019-04-10 +* Objects: took out MAP and FOREACH primitives (available in dev mode) +* Objects: fixed #2371 (playing sounds in the stage) +* GUI: fixed #2367 (changing project source after exporting to disk) +* GUI: fixed #2373 (limit zoom blocks slider to 5x) + +### 2019-04-09 +* Blocks, Objects, Threads: new "getImageAttribute" reporter primitive +* Objects, Threads: let "getImageAttribute" deal with null costumes +* Objects, Threads: new "stretch" primitive for costumes, also for flipping +* Threads: new feature: new costume from list of pixels +* Objects, Threads: added "current" to costume input slot dropdown +* Blocks: deprecated graphic effects: "duplicate", "comic" and "confetti" +* Objects: added reporter for graphic effects +* Objects, Blocks: added pen attribute reporter +* Objects: added "write" command to Pen category (same as "label" from tools +* Objects: added "map" and "for each" primitives to List category +* Objects: made HOF primitives hidable + +### 2019-04-08 +* Blocks, Objects, Threads: new "getSoundAttribute" reporter primitive +* Blocks, Objects, Threads: new "play sound at sample rate" command primitive +* Objects: added relabelling information for the new "play sound at sample rate" block +* Objects, Threads: accept a number as input for a sound - interpret as index +* Objects, Threads: accept lists and lists of lists as inputs to all sound playing primitives +* Threads: accept lists and lists of lists as inputs to the "get sound attribute" primitive + +### 2019-04-05 +* Objects: eliminated "clicks" when playing music notes +* Objects: eliminated "clicks" when playing a frequency +* Widgets, Objects: Adjusted PianoKeyboard for the new audio engine +* Objects: tweaked oscillator fade-out +* Blocks, Threads: added "sample rate" selector to microphone drow-down +* updated German translation for "sample rate" +* Objects: stop microphone output when the user presses the stop button + +### 2019-04-04 +* Objects, Threads: new "play frequency" commands in the Sounds category +* Objects, Store: renamed "pan left/right" to "balance" +* updated German translation +* moved "stage width" and "stage height" into attribute menu of the OF block for the stage +* added 'volume' and 'balance' selectors to the OF block +* Objects, Threads, Blocks: added inheritance support for "volume" +* Objects, Threads, Blocks: added inheritance support for "balance" + +### 2019-04-03 +* Objects, Threads: Safari compatibility tweaks (only use StereoPanner if available) +* Objects, Store: new feature: volume blocks +* Objects: added relabelling information for the new volume blocks +* Objects, Store: new feature: audio stereo-panning blocks +* Objects: added relabelling information for the new stereo-panning blocks +* German translation update for volume and panning blocks +* updated AudioComp library for the new volume and stereo-panning features + +### 2019-04-02 +* Objects, Threads: lazily initialize volume property +* Objects: use AudioContext to play recorded sounds +* Objects: new audio scheme support for the stage +* Objects: added basic stereo-panning support for sounds (under construction) +* Objects, Threads: added basic stereo-panning support for notes +* Objects: map volume to a logarithmic gain scale +* Blocks, Threads: added "log2" function selector to monadic reporter, tweaked "log" + +### 2019-04-01 +* Objects: let the Microphone share the Note prototype's AudioContext +* Objects: took out gain node from Note oscillator (will be used for "volume" setting) +* Objects: refactored audio context sharing and lazy initialization +* Objects, Threads: added volume support for notes (under construction) + +### 2019-03-31 +* Blocks, Threads: added "stage width" and "stage height" as gettable attributes to MY +* updated German translation +* updated AudioComp library (removed stage width/height blocks, added translation) + +### 2019-03-30 +* Objects: support multi-channel live-audio scripting +* Threads, Objects: added JIT-compilation to live-audio scripting + +### 2019-03-28 +* Blocks, Threaeds, Objects: new experimental live audio scripting support + +### 2019-03-26 +* updated French translation +* updated animation library with partial French translation + +### 2019-03-25 +* GUI: fixed unintentional pen trails when manually cloning or duplicating a sprite whose pen is down + +### 2019-03-18 +* Threads: replaced 'colorBehindSprite' with 'colorAtSprite' +* Blocks: renamed some items of the microphone dropdown +* updated German translation + +### 2019-03-17 +* Threads: renamed 'colorAtSprite' to 'colorBelowSprite' (first step to refactoring it altogether) + +### 2019-03-15 +* Objects: improved microphone pitch detection + +### 2019-03-14 +* atomic HOFs lib: consolidate names with tools lib, thanks, Brian +* atomic HOFs lib: added translations from tools lib + +### 2019-03-13 +* Objects: Simplified and optimized pitch detection, made it work on Safari +* Objects: made "play frequency" command experimental / only revealed in dev +* added "play hz" and "stop hz" blocks to AudioComp libary +* Objects: Optimized microphone volume detection + +### 2019-03-12 +* Threads: changed microphone volume (back) to a scale of 0-100 +* Threads, Objects: added "play frequency" primitive to "Sound" category +* updated German translation for "play frequency" primitive +* Objects, Threads: added "^" reporter (power of) in the Operators category +* Objects: updated relabel-dictionary +* updated Animation und AudioComp libraries with new powerOf primitive +* disabled pitch detection for Safari, so at least the other microphone features work + +### 2019-03-11 +* added note / hz conversion blocks to audioComp library +* ported multiline library to new (custom input slot) format +* new "text costumes" library for generating costumes from letters or words of text +* took out "b block" costume from catalog +* added microphone "resolution" concept governing "bins" (buffer / bin sizes) +* added microphone "resolution" settings to GUI +* updated German translation for microphone settings +* removed microphone resolution setters from audioComp library + +### 2019-03-10 +* Objects, Blocks, Threads: added microphone note and pitch detection +* Tweaked note detection to only change when the audio signal is strong enough +* updated German translation for pitch-detection +* tweaked pitch detection to smoothen low audio signals + +### 2019-03-07 +* AudioComp lib: added block to set the microphone's buffer and fft sizes +* German translation update (microphone features) +* simplified "globe" symbol + +### 2019-03-06 +* AudioComp lib: turn off mic after 5 secs of idling +* AudioComp lib: support Safari +* removed "loudness / microphone" block from AudioComp lib (turned into primitive) +* new "microphone" reporter in Sensing for getting volume, signals and frequencies +* Objects: keep microphone always on when running Snap! locally +* GUI: let users turn off microphone manually in the settings menu (in the offline version) + +### 2019-03-05 +* GUI: added "globe" icon to language menu item +* AudioComp lib: added @mjguzdial style live signal and fft support + +### 2019-03-04 +* GUI: deprecated storing projects in localStorage +* GUI: reenabled publish / unpublish buttons in the project dialog +* GUI: spread project dialog action buttons over 2 rows +* GUI: changed project dialog's initial & miminum extent +* Updated German translation + +### 2019-02-26 +* Symbols: new "globe" symbol +* GUI: replaced "storage" icon in project dialog with "globe" symbol + +### 2019-02-26 +* GUI: made "inheritance support" setting hidden +* Objects: disabled calls to world.worldCanvas.focus() + +### 2019-02-25 +* German translation for animation library +* GUI, snap.html: don't focus embedded worlds + +### 2019-02-24 +* Catalan translation update, thanks, Joan! + +### 2019-02-23 +* new help screens for some blocks, thanks, Brian! + +### 2019-02-22 +* Paint, Sketch: fixed pipette bug for fill color introduced +* Tweaked German translation +* Tweaked sharing scripts with global custom blocks among projects, thanks, Bernat! + +### 2019-02-21 +* Blocks: fixed deleting a single command inside a stack + +### 2019-02-20 +* Tweaked German translation +* Vector editor color name changes, thanks, Brian! + +### 2019-02-19 +* Threads: fixed #2332. I hate it. It's fixes like this that bog Snap! down. +* Udated German translation + +### 2019-02-18 +* Objects: enable sprite nesting via the context menu + +### 2019-02-15 +* BYOB: tweaked yesterday's fix... +* Blocks: fixed a glitch in the custom block help mechanism (show only the prototype) + +### 2019-02-14 +* BYOB: keep empty numerical input slots in custom blocks empty when relabelling + +### 2019-02-07 +* Store: tweaked loading mechanism to enable command blocks inside reporter rings +* Objects: tweaked spec for settings getter +* Blocks: improved dropping command blocks into reporter rings +* Morphic: simplified and optimized Node>>parentThatIsA / parentThatIsAnyOf +* Blocks, Lists, Tables: refactored for optimized parent-by-type detection +* Blocks: adjusted keyboard typing for command blocks inside reporter rings +* GUI, Blocks: enable dropping command blocks into all rings by default. Yeah! + +### 2019-02-06 +* Blocks, BYOB: refactored custom block input options and drop-down menus +* Blocks: adjust bottom of STOP block to reflect the menu selection (show / hide bottom notch) +* Blocks: enable dropping commands into all rings, under constructions + +### 2019-02-05 +* BYOB: radio button symbols for special slot / drop-down menu options + +### 2019-02-04 +* BYOB: new experimental feature: special context-aware drop-down menus for custom blocks +* BYOB: identify multi-line input slots by the pilcrow symbol in the slot editor +* BYOB: support default values in multi-line input slots inside custom blocks +* Blocks: enable piano keyboard menu to work with textual values representable as numbers +* Blocks: enable dial menu to work with textual values representable as numbers + +### 2019-02-01 +* BYOB: new experimental feature: special multi-line and monospaced input slot types + +### 2019-01-28 +* Threads, Objects: new "object" reporter in the Sensing category +* Blocks, Objects, Threads: added "flat line ends" option to "turbo mode" accessor blocks +* Blocks, Threads: added 'draggable' and 'rotation style' selectors to accessor blocks +* Greek translation update, thanks, Alexandros! +* German translation update +* pushed version to "Beta" + +### 2019-01-25 +* Threads: tweaked CSV-parser to handle \r-only record delimiters +* Cloud, GUI: Decouple cloud access from GUI, thanks, Michael and Bernat! +* GUI: added ability to export sounds + +### 2019-01-24 +* Turkish translation update, thanks, Turgut! +* updated audio-comp library blocks with new loop-arrow symbols + +### 2019-01-23 +* Objects, Threads: new blocks for setting and changing the stage's background color +* Store: save stage's background color in project +* updated German translation +* Blocks: Tweaked rendering of C-shaped slots in predicates +* updated cases library blocks with new loop-arrow symbols +* updated animation library blocks with new loop-arrow symbols, tweaked FOR block + +### 2019-01-22 +* Objects: Remove all clones when the Green Flag is clicked +* Blocks: adjust label row below C-Slot to accomodate loop icon, if any +* updated iteration-composition library blocks with new loop-arrow symbols +* updated list-utilities library blocks with new loop-arrow symbols +* Threads: cleaned up CSV parser +* Objects: fixed pen hsv-cache invalidation for clones + +### 2019-01-21 +* let users make C-shape slots with loop arrow symbols. Sigh. +* updated internal "for each" primitive block with new arrow symbol. Sigh. +* updated Indonesian translation, thanks, Emmanuella Rumanti +* updated FOR and FOREACH in tools library with new new loop-arrow symbols + +### 2019-01-19 +* fixed "Staatsgalerie bug" - relabel did not restore drop-down choice when localized + +### 2019-01-17 +* Greek translation update, thanks, Alexandros Prekates! +* cloud: user role support, thanks, Bernat + +### 2019-01-16 +* suppress 'loop' arrow symbol where label text follow the C-slot in translations + +### 2019-01-15 +* updated German translation +* updated all translations for the new %loop slot + +### 2019-01-14 +* Symbols: added 'loop' arrow symbol +* Blocks, Objects, Store: added 'loop' symbol to primitive loop blocks +* pushed dev version to 5.0 + +### 2019-01-12 +* Threads: try to identify Brian's problem with parsing a CSV + +### 2019-01-11 +* Chinese translation update, thanks, Simon! +* Turkish translation update, thanks, Turgut Guneysu! +* new string library, thanks, Brian! +* project renaming and remixing support, thanks, Bernat! +* pushed dev version to 4.3 + +### 2019-01-10 +* Morphic: recognize data sets in dropped text files (csv, json) +* Lists: updated list documentation, enabled table support by default +* GUI: import & examine data sets and text files via drag'n'drop or "import" menu +* updated German translation + +### 2019-01-09 +* Store: tweaked format for serializing atomic data lists +* Morphic: added option to include alpha in color comparison +* Objects: fixed "set pen color (color picker)" to observe, i.e. overwrite transparency +* Lists, Threads, Objects: added (Bernat's) JSON parser to SPLIT block +* Lists, Objects: added "export as JSON" capability +* Lists, Objects: automatically parse json files on import +* Lists: prevent Booleans in CSVs + +### 2019-01-08 +* Objects: automatically parse csv files on import, experimental "raw data" and "parse" ops +* Lists: fixed an off-by-one error in becomeLinked() +* Store: optimized serialization of lists with atomic data in project files +* Blocks, Objects, Threads: renamed "color" to "hue" in pen-blocks and in location sensor +* updated German translation + +### 2019-01-07 +* Lists, Objects: directly export and import lists as csv files, under construction + +### 2019-01-04 +* Objects, Blocks, Threads: new feature/block: sense colors and sprites anywhere +* updated German translation +* Objects: fixed pixel color sensing for stage pen trails + +### 2019-01-02 +* Objects, Blocks, Threads, GUI, Store: added third color dimension and transparency to pen +* renamed help screens for "setHue" to "setPenHSVA" and "changeHue" to "changePenHSVA" +* pushed dev version to 4.2.3 +* updated German translation + +### 2019-01-01 +* Morphic: added HSL color conversion support +* Morphic: fixed glitch in WorldMorph >> getGlobalPixelColor + +### 2018-12-28 +* Blocks, Threads: added 'neg' selector to monad operator dropdown +* Blocks, Objects, Threads: added "front/back" options to "go to front" layer primitive +* updated German translation +* renamed help screen for layer primitive +* fixed #2294 + +### 2018-12-07 +* GUI: fixed #2284 (executing "inherit" should not un-hide palette in presentation mode) + +## v4.2.2.9 +### 2018-11-29 +* GUI: prepared release +* GUI: fixed offline version (avoid sessionStorage access) + +### 2018-11-28 +* Objects: added special checks to make imporing text-based files into vars easier in Windows +* GUI: allow smaller stage extent in embed mode (for social website) + +### 2018-11-27 +* Objects: Cache stage>>penTrailsMorph to optimize collision detection +* Objects: Fixed a collision detection errror when objects are sub-pixel sized +* Objects: made importing files into variable watchers more lenient wrt to file types +* Objects: added "open anyway?" option to "unable to import" dialog for variables + +## v4.2.2.8 +### 2018-11-21 +* Tools library: Fixed LABEL block to again allow printing both text and numbers +* Frequency Distribution Analysis library: Added histogram and plot blocks + +### 2018-11-13 +* Blocks: fixed #2261 (check for selectedBlock before declaring an InputSlotMorph to be "empty") + +### 2018-11-12 +* new dev version +* BYOB: updated version date +* Objects: fixed #2250 +* Frequency Distribution Analysis library: added "pipe" and "lower case" blocks +* Store, XML: fixed #2251 (sorta, load project anyway even though costumes / sounds are missing) +* BYOB: fixed #2260 + +## v4.2.2.6 +### 2018-11-06 +* prepared release + +### 2018-11-06 +* new dev version +* Blocks: fixed a scope issue introduced in v4.2.2.4 +* Blocks: enabled "duplicate block definition" in the palette +* updated German translation + +## v4.2.2.5 +### 2018-11-02 +* new library: Frequency Distribution Analysis, separated from "Bigger Data" +* Objects: avoid rendering graphic effects for null-extent canvasses + +## v4.2.2.4 +### 2018-10-29 +* Blocks: fixed #2234 (display all reachable local variables in drop-down menu) +* new "does variable _ exist" predicate in var-library, thanks, Brian! + +## v4.2.2.3 +* New Features: + * new fast atomic "analyze" and "group" reporters in the "Bigger Data" library +* Notable Changes: + * don't stamp if the canvas is too small, avoid a JS error message + * changed "csv" option in SPLIT to comply with RFC 4180 and parse the whole table +* Notable Fix: + * help for local custom blocks +* Translation Update: + * Japanese, thanks Yoshiteru Nakamura! + +### 2018-10-26 +* Blocks, Threads: changed SPLIT "csv" to comply with RFC 4180, took out others options +* fixed #2235 (help for local custom blocks) + +### 2018-10-24 +* Blocks, Threads: added "csv records" to SPLIT options, renamed "csv" to "csv fields" + +### 2018-10-23 +* Objects: Don't stamp if the canvas is too small (and would throw an error) +* Threads: New "reportAtomicGroup" HOF primitive using the JIT compiler +* "Bigger Data" library: Added "group" function for fast data drill-down analyses +* Japanese translation updates, thanks, Yoshiteru Nakamura! + +### 2018-10-22 +* "Bigger Data" library: Added "analyze" function for fast frequency distributions + +## v4.2.2.2 +### 2018-10-19 +* Threads: fixed #2227 - capture argument reporter's lexical environment in JIT-compiler + +## v4.2.2.1 +### 2018-10-16 +* New translation for Ukrainian, thanks, Serhiy Kryzhanovsky, for the contribution! +* added timed FOR-loop to Animation library + +## v4.2.2 +* New Feature: + * support for stand-alone offline usage (open file snap.html in a web browser) +* Notable Changes: + * renamed github repo to "Snap" + * reorganized source code files and translations into a subfolder structure + * SET PEN COLOR TO (number) now wraps the hue around for numbers < 0 and > 100 +* Notable Fixes: + * restore propagation of inherited attributes when loading + * support for older versions of Chrome, thanks, Michael! + * fixed "letter of" primitive for numeric input, thanks, Michael and Dan! + +### 2018-10-07 +* renamed repo to "Snap" + +### 2018-10-05 +* Objects: Adjusted pen hue wrapping and took out pen shade wrapping +* Store: Fixed #1918 - escape options in block drop downs #2174, thanks, Michael! + +### 2018-10-04 +* GUI, Cloud: improved UX when running Snap! locally without a web server +* pushed dev-version to v4.2.2 +* added OFFLINE.md +* Objects: made SET PEN COLOR and SET PEN SHADE inputs wrap around + +### 2018-10-03 +* Threads: fixed "letter of" primitive for numeric input, thanks, Michael and Dan! + +### 2018-10-02 +* new dev version +* Store: fixed #2219 - properly restore propagation of inherited attributes when loading +* Cloud: fixed cloud check, thanks, Michael! +* deduped tools, thanks, Michael! +* moved translations into subfolder "locale" +* removed obsolete doc files +* moved *.js files into subfolder "src" (and edited gui.js to deal with ypr.js) +* moved media files (icon, logo, click sound) into "src" subfolder + +## v4.2.1.4 +### 2018-09-09 +* new dev version +* Threads: fixed #2176 ('arguments' not found for calling empty multi-slots) +* Blocks: enabled drop-down for "inherit" command for clone-initialization scripts + +## v4.2.1.3 +### 2018-07-19 +* Threads: fixed a regression conflict between "when I am stopped" and broadcasts + +## v4.2.1.2 +* New Feature: + * new "&lang=nn" url parameter for specifying a session translation in a web-link +* Changed: + * smart ternary Boolean slots - only 2 states except inside rings and in the palette + * made project dialog wider to accommodate translations for the "recover" button +* Fixes: + * corrected scope for outer script variables in inter-sprite messages (TELL, ASK, OF) + * eliminated false "reporter didn't report" error messages + +### 2018-07-13 +* Blocks: enabled smart ternary Boolean slots by default + +### 2018-07-12 +* Threads: tweaked outer script variable scope for TELL/ASK and OF +* Blocks: fixed #2145 - newlines in block labels conflict with input declarations +* GUI: increased project dialog width to accommodate translations for the "recover" button + +### 2018-07-11 +* GUI: added support for "&lang=nn" url parameter, made it non-permanent +* Threads: fixed outer script variable scope for TELL/ASK and OF +* Tools: fixed JOIN WORDS and LIST -> SENTENCE + +### 2018-07-10 +* Threads, GUI: fixed #712 - false "reporter didn't report" error messages + +## v4.2.1.1 +### 2018-07-10 +* Threads, GUI: reverted Cache-Control header for HTTP requests b/c of CORS issues + +## v4.2.1 +* New Features: + * new libraries for parallelization and JSON support + * new "loudness" reporter in audio comp library, thanks, Bernat! +* Notable Changes: + * significant speed-up for HTTP based robot APIs such as the Hummingbird kit +* Notable Fixes: + * "When I am stopped" hat block now also works for stacks of HTTP based robot commands + * resolved name conflicts in pixels and audio comp libraries +* Translation Updates: + * New Basque translation, thanks, Asier Iturralde Sarasola! + * Portuguese, thanks, Manuel! + * French, thanks, Nathalie and Joan! + * Spanish, Catalan and French translations of the tools library, thanks, Nathalie and Joan! + +### 2018-07-09 +* Portuguese translation update, thanks, Manuel! +* New Basque translation, thanks, Asier Iturralde Sarasola! +* French translation update, thanks, Nathalie and Joan! +* Spanish, Catalan and French translations of the tools library, thanks, Joan! +* New JSON library, thanks, Bernat! +* URL cache issue fix, thanks, Joan! + +### 2018-07-06 +* Objects: fixed #2142 - search and keyboard entry support for custom block translations + +### 2018-07-05 +* Threads: added JIT compiler support for "change variable" primitive +* Threads: optimized RUN with reportURL (fire-and-forget) + +### 2018-07-03 +* speed up HTTP based hardware APIs (by not waiting for the result if the URL reporter is used inside a REPORT block within a custom COMMAND block definition) + +## v4.2 "Solstice" +* New Features: + * "recover project" feature, (cloud backups), thanks, Bernat Romagosa! + * vector paint editor, thanks, Carles Paredes and Bernat Romagosa! + * "When I am stopped" event option, runs one atomic frame before terminating, use-case: stop robots when a user hits the stop button + * experimental JIT compiler for atomic HOFs, used in new "Bigger Data" library + * new library for programmatically creating variables, thanks, Brian Harvey! + * added options for sprite attributes to the SET block + * new "webcam snap" reporter in the "Pixels" library + * new "record" reporter in the "Audio Comp" library + * added "name" selector to the "Pixels" library + * added drop-down menu to "letter _ of _ ", adjusted all translations (thanks, Joan!) +* Notable Changes: + * hidden sprites can no longer be collision detected (but can test for other sprites) + * new sprites created by pressing the arrow button no point in random directions (unless you hold down the shift-key) + * new "center" option for location blocks (GO TO, POINT TOWARDS, DISTANCE TO and DIRECTION TO) + * disabled keyboard shortcuts for green-flag (cmd-enter) and stop (esc) in presentation mode +* Notable Fixes: + * rearranging and scrolling sound icons + * rendering and layout of variadic C-shaped input slots + * when collapsing ring-typed multi-arg slots only filled rings are preserved + * support for numerical custom block input names + * no more "leftover" clones when pressing the stop button or executing the STOP block +* Translation Updates: + * German, thanks, Jadga! + * Portuguese, thanks, Manuel! + * Catalan, thanks, Joan! + +### 2018-06-21 +* Threads, Objects: made "When I am stopped" scripts atomic, so you can use loops + +### 2018-06-20 +* Sketch: enable right-click to select secondary color in vector paint editor +* GUI: allow only one instance of Camera and Sound Recorder to open +* new "webcam snap" reporter in the "Pixels" library +* new "record" reporter in the "Audio Comp" library + +### 2018-06-18 +* Threads: added capability to JIT-compile command scripts to JS + +### 2018-06-17 +* GUI: fixed cloud scope issues + +### 2018-06-15 +* BYOB: fixed #2043 (regression) + +## v4.2 Release Candidate +### 2018-06-14 +* Threads: Prevent terminated threads from launching new ones + +### 2018-06-12 +* Renamed vectorPaint.js to sketch.js +* GUI: updated credits for Carles Paredes +* "Pixels" library: Enabled multiple references to the same pixel (variable) + +### 2018-06-11 +* Objects, Threads: fixed #2108 (added drop-down menu to "letter _ of _ ") +* German translation update + +### 2018-06-09 +* Objects, Threads: Also trigger "When I am stopped" when programmatically calling "stop all" + +### 2018-06-08 +* Blocks, Objects: new experimental "When I am stopped" event option +* Threads: Prevent terminated threads from forking new ones and from cloning + +### 2018-06-06 +* updated German translation, thanks, Jadga! +* updated Portuguese translation, thanks, Manuel! +* new Project Cloud Backups feature, thanks, Bernat! +* BYOB, Blocks, Threads, Store: fixed support for numerical custom block input names + +### 2018-06-05 +* VectorPaint: fixed rotation center editing for existing costumes +* VectorPaint: fixed initial rendering, so costumes can be re-opened after saving +* Symbols: fixed 'polygon' symbol rendering + +### 2018-06-04 +* Blocks: tweaked layout of variadic C-shaped input slots + +### 2018-05-24 +* Blocks: fixed rendering and layout of variadic C-shaped input slots + +### 2018-05-08 +* Threads: tweaked JS-Compiler to better handle process related ops + +### 2018-05-03 +* GUI: (again) randomize pen color when creating a new sprite + +### 2018-05-02 +* Blocks, Threads: added "center" to drop-down options of location blocks (GO TO, POINT TOWARDS, DISTANCE TO and DIRECTION TO) +* updated German translation +* disabled keyboard shortcuts for green-flag (cmd-enter) and stop (esc) in presentation mode +* Blocks, Threads: added options for sprite attributes to the SET block + +### 2018-04-27 +* GUI: when creating a new sprite only randomize color and direction when shift-clicking + +### 2018-04-25 +* GUI: fixed rearranging sound icons in the jukebox +* GUI: fixed scrolling for the jukebox (updating the sounds list version) +* GUI: only randomize position when shift-clicking on new turtle-sprite button + +### 2018-04-24 +* added 'name' selector to pixel library + +### 2018-04-16 +* Blocks: only preserve filled rings when collapsing ring-typed multi-arg-slots +* Blocks: minor tweaks + +### 2018-04-13 +* Objects: added implicit parameter count to experimental JIT compile reporter + +### 2018-04-12 +* Threads: disable detecting collision with hidden sprites + +### 2018-03-23 +* Threads: new experimental atomic COMBINE utilizing JIT compiler +* added atomic COMBINE to new experimental "Bigger Data" library +* removed unused blocks from the audio comp library +* added and removed atomic FOR EACH to new experimental "Bigger Data" library + +### 2018-03-22 +* Threads: extended implicit parameters handling for experimental JS-Compiler +* Threads: new experimental atomic HOFs utilizing JIT compilation (MAP, KEEP, SORT) +* new experimental "Big Data" library using JIT compiler + +### 2018-03-20 +* Threads: refactored experimental JS-compiler +* Threads: enabled variables access for experimental JS-compiler + +### 2018-03-19 +* new Vector Paint Editor, thanks, Carles Paredes and Bernat Romagosa! + +## v4.1.2.7 +### 2018-03-19 +* Threads: initialize Process>>gensyms with null (because it's hardly ever needed) +* Objects: remove obsolete STOP primitive from the stage's palette + +### 2018-03-16 +* Threads: experimental JIT compiler support for multi-word formal parameters and a single implicit formal parameter mapped to all empty input slots + +## v4.1.2.6 +### 2018-03-14 +* Threads: changed testing order for type inference, speeds up list operations significantly +* Cloud: remix project method, thanks, Bernat! + +## v4.1.2.5 +### 2018-03-13 +* Objects: draw a "dot" pentrail when moving zero steps while the pen is down + +## v4.1.2.4 +### 2018-03-09 +* Blocks, Objects, Threads: added "random" option for "go to", "point towards" and "point in direction" primitives + +### 2018-03-08 +* Objects: fixed #2053 +* GUI: fixed #2052 + +## v4.1.2.3 +### 2018-03-05 +* cloud tweaks, thanks, Bernat and Michael! +* fixed "join words" in the tools, library, thanks, Brian, for reporting the bug! +* added new "text to speech" library +* made sure sound data is always stored in the project (not referenced) +* added capability to compile input slot options to experimental JIT +* Spanish and German translation updates + +## v4.1.2.2 +### 2018-02-22 +* crayons library: fixed "nearest crayon to" reporter + +## v4.1.2.1 +* Notable Changes: + * account verification + * optimized "broadcast and wait" for atomic subroutines + * changed leap motion library to https +* Translation Updates: + * Spanish + +### 2018-02-20 +* Libraries: Changed LeapMotion library source to https +* account verification + +### 2018-02-19 +* GUI, snap.html: started v4.1.2.1 development +* Threads: optimized "broadcast and wait" for atomic subroutines +* Spanish translation update + +## v4.1.2 +### 2018-02-17 +* Notable Changes: + * new cloud backend +* New Features: + * experimental JIT compiler (in progress) +* Translation Updates: + * new Catalan-Valencia translation + * Catalan + * German + +### 2018-02-15 +* Threads, Blocks, Objects: experimental JIT compiler + +### 2018-02-12 +* Threads: Allow JS-functions for invoke() +* Threads, Objects: Small compilation experiment + +### 2018-02-09 +* Store, GUI: small tweaks +* new Valencian Catalan translation, thanks, Jose A. Múrcia!! + +### 2018-02-08 +* Cloud, GUI, Widgets: New Cloud API, thanks, Bernat! +* GUI: fixed a url-bar refresh bug introduced by the new cloud mechanism +* GUI: made sure user names are lower case when sent to the cloud +* Cloud: made sure project thumbnails are normalized when saved +* Cloud: warn user if overwriting an existing project with another one + +### 2018-02-06 +* GUI: start developing v4.1.2 +* Morphic: roll back temporary rectangle filling workaround for a bug in Chrome v57 + +## v4.1.1 +* New Features: + * translation support for custom blocks + * new "direction to..." primitive as variant of "distance to..." in "Sensing" + * included local methods in the OF-block's left drop-down menu + * added "width" and "height" selectors to Pixels library + * added scroll events, thanks, Bernat! + * new dial widget POINT IN DIRECTION's drop-down menu + * new "rotate" option for sprite context menu + * new sound recorder, thanks, Bernat! + * new "Crayons" library, thanks, Brian! +* Notable Changes: + * global and local variables are now separat in the palette, each sorted alphabetically, local vars marked with location pin (only in palette) + * keyboard events are now always thread safe (the same as in Scratch nowadays) + * the OF-block auto-unringifies when being dropped on ring-slots, such as in CALL + * accidentally clicking on a custom block definition no longer fires up the Block Dialog +* Notable Fixes: + * scroll menus if they are taller than the world + * enabled color picker for pen trails on stage + * track keyboard events after accepting ASK using the keyboard + * improved support for emojis, thanks, Michael! + * avoid occasional stuck text cursors, thanks, Bernat! + * paint editor flood fill alpha issue, thanks, Bernat! + * implicit parameter binding in visible stepping, thanks, Joan! + * when deleting a temporary clone, detach all its parts and delete the temporary ones + * new release protocol to avoid browser caching related version conflicts +* Translation Updates: + * German + * Greek + * Turkish + * Chinese + * Spanish + * Russian + +### 2018-02-05 +* Russian translation update, thanks, temap! + +### 2018-02-02 +* Libraries: Crayons library, thanks, Brian! + +### 2018-02-01 +* GUI: encode recorded sounds to base64 +* snap.html: added version queries to script urls + +### 2018-01-25 +* Morphic: new DialMorph widget +* Blocks: added dial widget to POINT IN DIRECTION's drop-down menu +* Objects: added "rotate" option to Sprite context menu +* Threads, Blocks: fixed Joan's fix for #1972, because it broke HOFs +* new Sound Recorder, yay!! Thanks, Bernat! +* Blocks: fixed a glitch in the error-bubble handling mechanism + +### 2018-01-23 +* fixed #1972, thanks, Joan! +* Objects, GUI: When deleting a temporary clone, detach all its parts and delete the temporary ones + +### 2018-01-22 +* Morphic: fixed occasional stuck cursors, thanks, Bernat! +* Paint: fixed a flood-fill alpha issue, thanks, Bernat!I +* Blocks, GUI: minor fixes, contributed by the community +* various Translation updates, contributed by the community +* Blocks, Objects, Threads: separated global and local variables in the palette, marked local ones with location pin +* Blocks, Objects: added scroll events, thanks, Bernat! + +### 2018-01-21 +* Threads: fixed a scope-glitch in the new OF-block's drop-down mechanism +* Blocks: made the OF-block auto-unringify when dropped on ring-slots +* Blocks: disabled firing the Custom-Block-Dialog when accidentall clicking on a custom block definition script + +### 2018-01-19 +* merged a bunch of pull requests (unicode support for emojis, translation updates) + +### 2018-01-18 +* Blocks, Threads, BYOB, Store: included local methods in the OF-block's left drop-down menu + +### 2018-01-17 +* Objects: made keyboard events always be thread safe (same as in Scratch nowadays) + +### 2018-01-04 +* Objects: fixed #1979 - make sure to always re-focus the world-canvas + +### 2018-01-04 +* Morphic: scroll menus if they are taller than the world +* Morphic: added keyboard navigation for menus that scroll +* added "width" and "height" selectors to Pixels library + +### 2018-01-02 +* new "direction to..." primitive as variant of "distance to..." in "Sensing" + +### 2017-12-12 +* fixed #1963 + +### 2017-12-01 +* GUI: started development on v 4.1.1 +* BYOB, Store, Threads: Localization support for custom blocks (experimental) +* Tools: German translation of tools (experimental) + +## v4.1.0.5 +### 2017-11-26 +* GUI: fixed #1933 - avoid creating "obsolete" blocks by not copying method blocks into sprites that don't understand them +* Store: fixed #1937 - allow stage width to be a minimum of 240 pixels + +## v4.1.0.4 +### 2017-11-16 +* Threads: suppress "exit" context when forking a process while single-stepping, this avoids a false "reporter didn't report" error message +* Blocks: avoid coloring the block-highlight when re-coloring a syntax element, this prevents highlighted blocks inside LAUNCH statements to expand when repeatedly single-stepped. + +## v4.1.0.3 +### 2017-11-15 +* Portuguese & Polish translation updates, thanks, Witek and Manuel!! +* escape xml attribute contents, thanks, Brian Broll! +* changed minimum stage width to 240 +* new Audio Comp library for Guzdial-style sound samples fun + +## v4.1.0.2 +### 2017-10-28 +* Store: fixed a glitch that raised an error instead of creating an “obsolete” block + +## v4.1.0.1 +### 2017-10-28 +* Store: fixed a glitch when loading method blocks stored in sprite-local vars +* Objects: sped up "turbo" mode frame rate (slowing down "turbo" but making it more generally usable) +* Chinese and Catalan translation updates + +### 2017-10-20 +* fixed SVG encoding, thanks, Joan for the contribution! +* German translation update + +## v4.1 "New York" +* Features: + * polymorphic sprite-local custom blocks + * inheritance of sprite-local custom blocks + * inheritance of sprite attributes (x, y, direction, size, costumes, costume #, sounds, scripts) + * first-class costumes and sounds + * visual indicator (map-pin icon) for sprite-local custom blocks (i.e. methods) + * camera snapshots for costumes and new sprites + * localization support when typing expressions + * support for user-forced line-breaks in custom block labels + * ternary Boolean slot setting: support to limit Boolean input slots to “true/false” outside of rings and in palette + * support for default values in custom block Boolean slots + * experimental: duplicate block definition (hidden in shift-click context menu) + * support for codification of String, Number and Boolean value types + * costume icons indicate svg costumes + * sprites’s rotation centers can be adjusted onstage + * clones share their original sprite’s scripts, not a shallow-copy of them + * a highlight-colored balloon indicates the number of active processes per shared script + * new musical “notes”, "location", "footprints", "cross" and "keyboard" symbols + * new “visible stepping” toggle button in the control bar + * new "keyboard entry" toggle button in the scripts tool bar + * turn on the “Inheritance support” setting per default + * Assert data types to list operations for more meaningful error messages + * programmatically hide and show primitives in the palette + * new "pen trails" reporter primitive and stage context menu entry + * two-item lists as x-y coordinate arguments for "point towards”, "go to" and “distance to” primitives + * Piano keyboard as drop-down menu for entering musical notes, Thanks, Lucas and Michael! + * Basic “instruments” support: sine, square, sawtooth and triangle waves + * Support https in “url” reporter + * splitting csv-text + * prevent context menu and dragging for stage watchers in presentation mode + * "floating" search and make-a-block buttons in the blocks palette + * "Make a block" button in every category + * experimental "download script" feature + * new "Animation" library + * new "Pixels" library for MediaComp + * double-clicking a corral sprite icon flashes the sprite onstage +* Fixes: + * changed keyboard shortcut indicator for “find blocks” to “^” + * prevent Snap from “hanging” when encountering certain errors in visible stepping + * only mark implicit parameters if no formal ones exist + * optimized thread-launch and script highlighting to a single frame instead of formerly two + * changed direction attribute of sprites to automatically confine to 0-360 degrees + * fixed rotation-bug when flipping costumes in "only turn left/right" mode" + * fixed variable renaming (“refactoring”) bugs, thanks, Bernat! + * fixed “fill” block crash when applying the same color twice + * fixed occasional empty drop-down menu items named “close” + * fixed some typos + * limited sprites' direction and coordinates to finite numbers + * made block vars transient for block libraries + * keep “undo” and “redo” buttons at the same location + * fixed SVG encoding for exporting vector costumes + +### 2017-10-17 +* Blocks: keep “undo” and “redo” buttons at the same location +* Objects, Threads: added "with inpus" to TELL and ASK prims, changed TELL's C-shape to command-style input +* Objects: moved TELL and ASK templates in the palette up underneath RUN CALL +* Blocks: show all own vars and attributes in INHERIT drop-down when inside a ring +* Objects: made 'myself' default input for "a new clone of" reporter +* German translation update +* GUI, Objects: double-clicking a corral sprite icon flashes the sprite onstage + +### 2017-10-12 +* Threads: make sure to retain the current instrument when launching a new thread +* Threads: retain the current receiver when launching a new thread + +### 2017-10-11 +* Objects: make sure to fully remove parts from their anchor when deleting them +* Objects: fixed a bounding-box-detection bug in Costumes. Thanks, Simon Mong! +* Objects: fixed a flood-fill rounding bug. Thanks, Simon Mong! + +### 2017-10-10 +* Blocks: fixed #1885 + +### 2017-10-09 +* changed label of "BYOB4 (Snap) history +* changed label of "Method" to "Method Editor", thanks, Brian! + +### 2017-10-06 +* Esperanto translate update, thanks, Sebastian! + +### 2017-10-04 +* Objects: limited sprites' direction and coordinates to finite numbers +* Store, BYOB: made block vars transient for block libraries +* updated “Animation” library + +### 2017-09-28 +* GUI: enable experimental setting for "ternary Boolean slots" +* GUI, Blocks: experimental feature: Download script, thanks, Bernat! +* Blocks: made "import script" undoable +* Objects: make sure inheritance hierarchies are consistently made temporary +* new "Animation" library +* new "Pixels" library for MediaComp + +## v4.1 release candidate +### 2017-09-26 +* Symbols: added 'keyboard' and 'keyboardFilled' icons +* GUI: fixed camera support for Safari, thanks, Bernat! +* Morphic: added stopEditing() event for keyboardReceiver +* Blocks: added floating toggle for keyboard entry to scripts toolbar +* GUI: make Snap! work in Safari 11 offline (file:// protocol) again, Sheesh +* GUI, Blocks: Support "Keyboard Editing" setting in scripts toolbar + +### 2017-09-25 +* GUI, Symbols: added “visible stepping” toggle button to the control bar +* fixed camera retina issues, thanks, Bernat!! +* Widgets: inverted property name for “enabled” to “isDisabled” for PushButtons +* GUI: hiding camera support (again), because of issues with Safari +* Objects: added "Make a block" button to every category +* Symbols, Objects: new "floating" make-a-block button in the palette + +### 2017-09-21 +* GUI, Objects: added floating search button to search palette to take the user back + +### 2017-09-19 +* BYOB: added “inherited” option to inheritable method templates’ context menu in the palette +* fixes for exporting resources, thanks, Michael! +* GUI: let costume icons indicate svg icons (again! how come this was lost?!, I hate Git!!) +* Objects, etc.: added floating search button to blocks palette + +### 2017-09-18 +* Symbols: added ‘location’ icon (map-pin) +* Blocks: added visual “map-pin” icon to indicate local method blocks + +### 2017-09-14 +* Blocks, Objects: added “inherited” option to inheritable variable templates’ context menu in the palette +* Objects: disabled context menu and dragging for watchers in presentation mode + +### 2017-09-14 +* GUI: disable camera (but make it accessible as hidden setting) because of retina issues + +### 2017-09-08 +* GUI, Objects, Widgets, Symbols: Camera Snapshot Dialog. Thank you, Bernat!! + +### 2017-09-06 +* Blocks, Threads: added “csv” option to the SPLIT primitive +* Threads: allow https query from locally loaded sources (thanks, Michael, for the hint!) + +### 2017-09-05 +* German translation update +* Threads, Objects: Renamed “http” block to “url”, use location.protocol (support https) + +### 2017-09-04 +* Blocks, Objects: fixed #1339 + +### 2017-08-30 +* Blocks, Threads: Confine programmatically setting the “temporary?” attribute to dev mode +* BYOB: enable exporting script pics of custom blocks in the newest Chrome version, which disables opening tabs on dataURLs +* Morphic, Objects: fixed #1843 +* Croation translation update, thanks, Zeljko Hrvoj! + +### 2017-08-29 +* Threads: allow two-item lists as x-y coordinate arguments for “distance to” reporter +* GUI, Objects: enable exporting costumes and variable-data in the newest Chrome version, which disables opening tabs on dataURLs +* Blocks, Threads: added “temporary?” as gettable and settable attribute for clones + +### 2017-08-04 +* GUI: enable exporting project summaries in the newest Chrome version, which disables opening tabs on dataURLs + +### 2017-08-03 +* enable exporting script pics in the newest Chrome version, which disables opening tabs on dataURLs + +### 2017-08-02 +* Blocks: Improve PianoKeyboard for keyboard navigation & entry +* Blocks, Widgets: Moved PianoKeyboard code to widgets.js +* Blocks, Widgets: Added sound feedback to PianoKeyboard +* New file: symbols.js (moved out of blocks.js) +* Updated credits to reflect Michael’s piano keyboard design contribution +* Threads: simplified “instrument” access +* Threads: enable multiple instruments per sprite in parallel threads +* GUI, Widgets: Changed piano keyboard design credits to Lucas Karahadian +* GUI: fixed #1820 + +### 2017-08-01 +* Morphic: Tweaks by Craig Latta (thanks!) + +### 2017-07-31 +* Blocks, Objects: fixed PianoMenu to work with block zoom etc. +* Threads, Objects, Blocks, Store: added “instruments”: sine, square, sawtooth, triangle waves + +### 2017-07-27 +* Objects: don't shadow costume # when editing a costume +* Blocks, Objects: remodeled context menu for inheritance to use check-boxes +* Blocks, Objects, Threads: fold two "stop" commands into one +* Objects: Allow two-item lists as arguments for "point towards" and "go to" primitives + +### 2017-07-26 +* Threads: programmatically hide and show primitives in the palette. Thanks, Cynthia Solomon, for this idea! +* Objects: added "pen trails" reporter primitive and stage context menu entry +* Threads, Blocks: added 'costume' and 'sound' as first-class data types +* Lists, Store, Objects, Threads: enable type-assertion for list elements (costumes, sounds) + +### 2017-07-25 +* Objects: fixed rotation-bug when flipping costumes in "only turn left/right" mode" +* BYOB: changed Block Editor label to "Method" for methods +* GUI: moved settings 'Keyboard Editing', 'Nested auto-wrapping', "Table support" and "Table lines" to hidden (default is "on" for all) + +### 2017-07-15 +* BYOB: shadow inherited scripts when changing the category of an inherited method + +### 2017-07-12 +* Blocks: fixed #1800. Thanks, Ken, for the bug report! +* Objects, Threads: “new clone of ...” primitive, made TELL, ASK primitives official +* Objects: only refresh certain propagated inherited attributes on being dropped +* Objects: renamed “delete” primitive to “inherit” + +### 2017-07-11 +* Objects: fixed an inheritance glitch for clones +* Objects: fixed variable inheritance for traditional Scratch-like clones +* Objects: tweaked inheritance indication for stage watchers +* Objects: fixed custom block inheritance for traditional Scratch-like clones +* Objects: optimized deleting traditional Scratch-like cones + +### 2017-07-09 +* Objects, Threads: added experimental (only shown in dev mode) “tell ... to ..." and “ask ... for ...” primitives + +### 2017-07-08 +* Threads: Assert data types to list operations -> meaningful error messages +* GUI: enable inheritance per default, must be user-enabled for existing projects + +### 2017-07-07 +* Objects, GUI, Store: tweak naming of instantiating to “clone”, enable inheritance by default +* Objects, GUI: run “When I start as clone” scripts when manually cloning a sprite, only position at hand pointer if no such scripts exist +* Morphic, Objects: confine turtle direction readout to 0-360 degrees, thanks, Cynthia for the bug report!! + +### 2017-07-05 +* Objects, GUI: UI for OOP + +### 2017-07-04 +* Morphic: Simplify contains() +* Unify Scratch-style clones and Snap-specimens, part 1: implement clones as specimens + +### 2017-07-03 +* Objects, Threads, GUI, Blocks, YPR: renamed Sprite::isClone to Sprite:isTemporary + +### 2017-06-30 +* Objects: reflect attribute inheritance status by ghosting / un-ghosting stage monitors +* Objects: migrate experimental “jukebox” reporters to the new “my sounds” reporter + +### 2017-06-29 +* Objects: manage inheritance relationships when setting a prototype or deleting a sprite + +### 2017-06-27 +* Objects: Inheritance of costumes and sounds - propagate changes +* Store: Tweaked loading sprites with inherited complex attributes (costumes, sounds) + +### 2017-06-26 +* Objects, Blocks, Threads, Tables, Store: First-Class Sounds +* Block: new musical “notes” symbol +* Objects, Blocks, Threads, GUI: inheritance support for sounds + +### 2017-06-24 +* Threads: tweaked error-catching & handling for receiver-less scripts +* Blocks: experimented with first-class sounds, deferred for now +* corrected a typo in the German translation. Thanks, Jadga, for reporting this! + +### 2017-06-23 +* Blocks: shadow inherited scripts on deleting blocks and comments via the context menu +* Blocks: shadow inherited scripts on “clean up” +* Blocks, Objects: shadow inherited scripts on keyboard entry +* Blocks: shadow inherited scripts on input edit, ringify/unringify, relabel action + +### 2017-06-22 +* Morphic: support for copy-on-write worlds (“selectForEdit”) +* Blocks, Objects: shadow inherited scripts on dragging & dropping blocks and comments + +### 2017-06-21 +* objects: stop all scripts for a sprite when shadowing or inheriting its scripts + +### 2017-06-20 +* threads, blocks, ide: make sure to stop active processes when deleting a block +* objects: migrate experimental “wardrobe” reporters to the new “my costumes” reporter + +### 2017-06-19 +* threads: fixed #1767 (optimized thread-launch and highlighting) +* threads, blocks: optimized thread count indicator for “glow” halos + +### 2017-06-02 +* added a thread count indicator to shared-script highlights + +### 2017-05-31 +* added inheritance support for scripts, partly done, copy-on-write is still missing + +### 2017-05-30 +* let clones share the orginal’s scripts without shallow-copying them + +### 2017-05-12 +* exposed ‘costumes’ as an attribute +* added inheritance support for the wardrobe (‘costumes’) +* added inheritance support for ‘costume #’ + +### 2017-05-09 +* added tools to the library browser +* added attributes to the “delete” block’s drop-down menu + +### 2017-05-05 +* attribute inheritance support for ‘x’, ‘y’, ‘dir’ and ‘size’ + +### 2017-04-11 +* Objects: export text from variable watchers to new browser tab by default + +## v4.0.10.1 +### 2017-04-10 +* Revert to 4.0.10 to prepare for newly surfaced bug in the Chrome browser +* fixed #1707 (new Chrome blitting issue) + +### 2017-03-22 +* sprite-local custom block inheritance, first pass, still under heavy development + +### 2017-03-21 +* Change: Methods (sprite-local custom blocks) can no longer have block (instance) vars + +### 2017-03-07 +* Morphic, Objects, translation: let sprites’s rotation centers be adjusted onstage +* BYOB: added attributes for dynamic method definition lookup +* BYOB, Blocks, Objects, GUI: distinguish custom blocks by shared “isCustomBlock” attribute + +### 2017-03-01 +* Objects: experiment with new dynamic method (cache) updating +* Objects, Blocks, BYOB, Store, Threads, GUI: roll-back double-pointer container cache for methods + +### 2017-02-27 +* Objects: experiment with new “methods” attribute + +### 2017-02-16 +* turn “definition” property of custom block instances into a double-pointer (Variable) structure, in preparation for OOP (method inheritance) + +### 2017-02-14 +* Lists: remove experimental methods for object-use +* Objects, BYOB: disable (comment out) experimental block inheritance for now + +### 2017-02-09 +* Blocks: fixed #1406 + +### 2017-02-09 +* Blocks: prevent Snap from “hanging” when encountering certain errors in visible stepping mode +* Threads: fixed #1618 - only mark implicit parameters if no formal ones exist + +### 2017-02-07 +* Blocks: catch block label part issues, prevent palette from not showing + +### 2017-02-02 +* Objects, BYOB: highly experimental custom block inheritance, under construction… +* Blocks: fixed #1650 + +### 2017-02-01 +* GUI: let costume icons indicate svg costumes + +### 2017-01-31 +* Lists: experimental methods for use as objects (hierarchical dictionaries) + +### 2017-01-30 +* Store: fixed #1645 + +### 2017-01-27 +* Blocks, Objects, Threads, Store: added support for codification of String, Number and Boolean value types + +### 2017-01-24 +* BYOB: changed “new line” symbol to $nl +* German translation update +* BYOB: new experimental feature: duplicate block definition (hidden in shift-click context menu) + +### 2017-01-23 +* BYOB, Blocks, Store: added support for default values in custom block Boolean slots +* GUI, Blocks, Store: allow project-setting “Ternary Boolean slots” to be switched off +* German translation update + +### 2017-01-20 +* Blocks: improved inspectability of local variables +* GUI: improved library browser, thanks, Michael! +* BYOB: support user-forced line-breaks in custom block labels +* Blocks: limit Boolean input slots to “true/false” unless inside a ring or in the palette + +### 2017-01-19 +* GUI: began new development version +* Blocks: fixed #1630 +* Objects: support localization when typing expressions +* German translation update +* Blocks: changed keyboard shortcut indicator for “find blocks” to “^” +* GUI: fixed #1631 + +### 2017-01-13 +* GUI: added "savingPreferences" flag for bh's "Eisenbergification" library, sigh. + +## v4.0.10 +* Features: + * auto-wrapping of C-slots + * undo / redo for blocks, unlimited, but has some issues + * search field for projects, thanks, Bernat!! + * basic typography support for custom block labels, thanks, Bernat!! + * treat JS-function reporters the same as variable getters wrt rings + * new url switch #dl: for downloading raw shared projects + * new url option switch: &noExitWarning + * svg support for images from the web (svg files have been supported for a long time) + * use media dialog for browsing and importing sounds + * highly experimental infix-expression-to-reporter parser. Thanks, Bernat, for the brilliant idea to add it to the search-blocks field! + * hierarchical menus, also for custom blocks, thanks, Brian! + * variable refactoring, thanks, Bernat! + * “#run:” flags (same as “#present:”): ’editMode’, ‘noRun’, ‘hideControls’, thanks, Brian! + * Libraries Browser, thanks, Michael! +* Fixes: + * Music (play note) to work again in new and recent browser versions (Chrome 55) + * IDE layout: fixed resizing issues when the window becomes too small + * Keep left-over blocks from “relabel” around + * Evaluate the generic WHEN-hat block’s predicate and first step of the attached script in the same atom + * “go back _ layers” to work with out-of bounds numbers, thanks, Brian Broll! + * Translation updates (Russian, Polish, Danish, Portuguese, Catalan, German) + +### 2017-01-11 +* Error handling improvements for custom drop-down submenus and generic WHEN hats + +### 2017-01-10 +* German translation update + +### 2017-01-09 +* GUI: “#run:” flags, thanks, Brian! +* GUI: Libraries Browser, thanks, Michael! +* Blocks: Fixed out of bounds issue with “go back _ layers”, thanks, Brian Broll! + +### 2017-01-08 +* Blocks: fixed #1608 + +### 2017-01-05 +* Blocks: refactored variable refactoring code +* fixed #1604 +* Blocks, GUI: changed shortcut symbol for “Ctrl” key to ^ +* Blocks: fixed #696 - Keep left-over blocks from “relabel” around + +### 2017-01-04 +* Variable refactoring, yay! Thanks, Bernat!! +* Threads: fixed #1602 + +### 2017-01-03 +* Hierarchical menus, thanks, Brian! +* Tweaks to hierarchical menus + +### 2017-01-02 +* Morphic: use animations to schedule tool tips + +### 2016-12-31 +* Morphic: support for menu shortcuts (ongoing) +* GUI, Blocks: menu shortcuts (experimental) + +### 2016-12-29 +* BYOB: Disabled hover-help for custom blocks (some people find it annoying) +* GUI: Hide setting for “prefer smooth animations” (now - mostly - redundant) + +### 2016-12-27 +* GUI, Threads, Objects, Store: Disable JS-Functions, to protect users from malicious scripts, commented out for now + +### 2016-12-25 +* GUI: update undrop controls when switching sprites and display modes + +### 2016-12-23 +* Objects: tweaked reporterize infixParser + +### 2016-12-22 +* Objects: simplified reporterize>>blockFromAST +* Threads: prevented color slots from flashing. Good catch, thanks, Joan! + +### 2016-12-21 +* Objects: added Boolean operators to “reporterize” + +### 2016-12-20 +* Objects: tweaked “reporterize” + +### 2016-12-19 +* GUI: new url-switch: &noExitWarning +* Blocks, Objects: highly experimental infix-expression-to-reporter parser + +### 2016-12-13 +* Catalan translation update, thanks, @jguille2 ! + +### 2016-12-12 +* fixed #1560 +* Morphic: added a few in-/out- only easing functions for animations +* Morphic: added easeOutElastic function thanks to @joshmarinacci’s excellent blog post + +### 2016-12-09 +* Translation updates (Russian, Polish, Danish, Portuguese) + +### 2016-12-08 +* GUI: use media dialog for browsing and importing sounds + +### 2016-12-07 +* Morphic, GUI: URI-encode SVG data for Firefox-compatibility + +### 2016-12-06 +* GUI: Switch to asynchronous loading of resources (costumes, sounds, libraries etc.) +* Morphic: Added support for dropping links to SVGs from other web pages onto the World +* GUI: Support importing unrasterized SVG_Costumes from the “Costumes” and “Backgrounds” dialog + +### 2016-12-05 +* Objects: fixed #1543 + +### 2016-12-01 +* GUI: fixed #1540 +* Morphic, Blocks, GUI: Filter Project Names in the “open” dialog, thanks, Bernat!! +* GUI: update scrollbars of the project dialog as the project list is filtered +* Blocks: fixed #1522 + +### 2016-11-29 +* Blocks: added undo / redo icons to scripts pane context menu +* Blocks: added hidden “clear undrop queue” option to scripts pane context menu + +### 2016-11-28 +* Objects, Blocks: map keyboard shortcut ctr-y to “undrop” (in addition to shift-ctrl-z) +* Blocks: added symbols for “turnBack” and “turnForward” +* Morphic: added support for floating tool bars in scroll frames +* Blocks: added dynamic “undo” / “redo” buttons to each scripting pane +* GUI, Blocks: Enable nested auto-wrapping by default + +### 2016-11-25 +* Morphic: First-class animations +* Blocks, Objects, GUI: Switch to new animation mechanism, add a few + +### 2016-11-24 +* Morphic, Store: work around a dreaded FF NS_ERROR_FAILURE for supporting retina +* Blocks: drag-origin support for blocks and comments duplicated inside a block editor + +### 2016-11-23 +* Blocks, Morphic: “Undrop / Redrop” support for sticky comments + +### 2016-11-22 +* Blocks, GUI: “Undrop / Redrop” for deleting blocks via the context menu or in keyboard edit mode +* Morphic: support “onBeforeDrop” callback parameter in slideBackTo() + +### 2016-11-21 +* Blocks: Delete variable getter blocks if the user drops them on template slots (e.g. script vars) + +### 2016-11-14 +* Blocks, Objects: Unlimited “Undrop / Redrop” of block drops per script pane and session (under construction) +* GUI: new url switch #dl: for downloading raw shared projects + +### 2016-11-09 +* Blocks, GUI: preference setting to enable auto-wrapping inside nested block stacks +* Blocks: Treat JS-function reporters the same as variable getters wrt rings +* German translation update + +### 2016-11-07 +* New C-Slot auto-wrapping / snapping feature (similar to Scratch) + +# v4.0.9.2 +### 2016-11-10 +* new Galician translation, yay!! Thanks, tecnoloxia.org! +* Italian translation update +* German translation update + +## v4.0.9.1 +## v4.0.9 +### 2016-10-27 + +### 2016-10-24 +* Text Editing Tweaks, thanks, Bernat!! +* Store: fixed #1472 +* Threads: Tweak continuations + +### 2016-10-21 +* Threads: Fixed #1422 + +### 2016-10-20 +* Blocks: Tweak Keyboard-Entry + +### 2016-10-11 +* Objects: fixed #1456 (collect message names from all scripts, including custom block definitions) + +### 2016-10-11 +* Blocks: make sure to fix multi-args when deleting a custom reporter definition + +### 2016-10-10 +* Morphic: configure autoscrolling +* GUI: suppress autoscrolling for the palette and the project dialog + +### 2016-10-07 +* Blocks: [Keyboard-Entry] if an inserted block has inputs, go to the first one + +### 2016-09-29 +* Objects: fixed #1437 + +### 2016-09-24 +* don’t update the recursion cache when updating a custom block definition + +### 2016-09-23 +* custom block execution: only yield if directly recursive and unwrapped (“speed up”) +* new feature: “wait 0” or “wait ``” now yields once, unless warped +* revert treating visual stepping as thread safe, because of music scheduling + +### 2016-09-22 +* renamed “single stepping” to “visible stepping”, thanks, Brian! +* updated German translation + +### 2016-09-21 +* remove shift-click-to-forward-one-frame option for the “resume” button + +### 2016-09-20 +* atomic synching of single-stepping + +### 2016-09-19 +* new “stepForward” symbol +* dragging the single-step speed slider all the way to the left turns the “resume” side of the “pause” button into “stepForward” + +### 2016-09-18 +* Treat single-stepping as thread safe (reverted on 160923) +* Allow user to trigger one step at a time, both in normal and single-stepping mode + +### 2016-09-16 +* enable single stepping for clone-scripts w. multiple blocks flashing per script +* enable single stepping for custom block definitions +* Objects: fixed #1410 (duplicating a sprite does not duplicate its sounds) + +### 2016-09-15 +* new single stepping feature (like Scratch 1.4) with flashing blocks +* slider for single-stepping speed +* pausing now flashes the currently active blocks + +## v4.0.8.7 +### 2016-08-12 +* Threads: for hidden sprites display ASK questions in the input box +* Morphic: replace deprecated KeyboardEvent.keyIdentifier with .key + +## v4.0.8.6 +### 2016-08-03 +* Store: restore implicit formal parameters for serialized lambdas + +## v4.0.8.5 +### 2016-07-31 +* GUI: fixed #1348 - opening projects from url not working in non-English + +## v4.0.8.4 +### 2016-07-20 +* GUI: fixed #1333 - paint a new costume not working in retina mode in FF and Edge + +## v4.0.8.3 +### 2016-07-19 +* Morphic: avoid blitting artifacts for non-integer devicePixelRatios in Firefox +* Widgets: fixed 3D corners for buttons in Firefox for Windows +* Objects: fixed color collision detection for retina mode +* Threads: enable broadcasts to be sent to specific sprites (experimental) + +## v4.0.8.2 +### 2016-07-17 +* Morphic: fixed collision detection for non-integer devicePixelRatios + +## v4.0.8.1 +### 2016-07-15 +* Blocks: activate generic hat blocks inserted via keyboard editing + +## v4.0.8 +### 2016-07-14 +* New Features + - Retina Display Support, thanks, Bartosz Leper!! + - Additional Graphic Effects, thanks, Dylan Servilla!! + - Interactive Toggle Switches for Boolean Slots and Literals + - Resizable Palette (double-click on resizers to slide back to normal) +* New Default Settings (now enabled by default) + - Keyboard Editing + - Tables Support +* Bugfixes (most notable only): + - reject dropping hat-blocks into block editor scripting areas + - accept multi-line inputs (e.g. in JS-functions or code-mapping blocks) with shift-enter + - prevent “make a block” dialog from being closed by pressing “OK” if no label text has been specified + - show error message balloons happening in other sprites next to their icon in the sprite-corral + - (again) enable recursive cloning + - prevent expandable blocks from expanding / collapsing inside the palette +* Translation updates + - Italian + - Swedish + - Chinese + - Russian + - Catalan + - German + +## v4.0.7.2 +### 2016-05-09 +* Threads: fixed #1212 - Null continuation doesn't escape from calling context. +* Updated Simplified Chinese translation, thanks to @ubertao! +* Media import dialog with thumbnail, thanks to @ubertao! + +## v4.0.7.1 +* cloning speed-up + +### 2016-05-04 +* Morphic, Objects, Blocks, Threads, GUI: Partially shallow-copy clones for speed +* new Estonian translation! Yay!! Thanks, Hasso Tepper! + + +## v4.0.7 +### 2016-05-02 +* first class sprites, new MY reporter block and extended functionality of TOUCHING +* fixed switching from list watcher to table view inside sprite speech bubbles +* fixed paint editor automatic rotation center issue +* enhanced functionality to SET a sprite’s attributes +* execute clone initialization scripts’ first step in the same frame as the clone command +* auto-repair (sorta) certain broken project files +* Threads: More aggressive emergency yielding +* “corpsify” deleted sprites, which might still be referred to by variables and lists +* Blocks: simplify block copying +* experimental hidden “live-coding support” preference +* updated penTrails library to shrinkWrap generated costumes +* demos from the documentation: + * http://snap.berkeley.edu/run#cloud:Username=jens&ProjectName=population + * http://snap.berkeley.edu/run#present:Username=jens&ProjectName=Woodworm + * http://snap.berkeley.edu/run#present:Username=jens&ProjectName=Ferris%20Wheel%202016 + * http://snap.berkeley.edu/run#cloud:Username=jens&ProjectName=PathFollower + * http://snap.berkeley.edu/run#present:Username=jens&ProjectName=cartwheel + * http://snap.berkeley.edu/run#cloud:Username=jens&ProjectName=rotation +* new Indonesian translation. Yay!! Thank you, Alexander Liu!! +* Translation updates: Slovenian, Portuguese, Chinese +* minor bug fixes + +## v4.0.6 +### 2016-03-16 +* Store, Objects, GUI: fixed #99 (saving linked lists) +* Objects: fixed #1163 +* added web api / https reporter library +* Blocks, Store: New “transient variable” feature +* German translation update + +### 2016-03-06 +* Objects: Reenable custom hat blocks when dropping a sprite + +## v4.0.5 +### 2016-02-24 +* table views + +### 2016-01-22 +* Blocks: Fixed a slight rendering glitch when deleting reporters via the context menu + +### 2016-01-19 +* Threads, Store: Throw an error for “obsolete” blocks instead of (forever) doing nothing (and thus often freezing and crashing). Thanks, Paul, for helping identify this! + +### 2016-01-18 +* Paint: avoid pixel collision detection in PaintCanvas (optimization) +* BYOB: fixed a zebra coloring glitch in the block editor + +### 2016-01-17 +* BYOB: preserve custom block instances’ block var values when editing their definition + +### 2016-01-16 +* Blocks: fixed a multi-line input slot layout glitch + +### 2016-01-11 +* BYOB: fixed #1107 + +### 2016-01-08 +* BYOB: fixed #1098 +* Threads: remove a redundant yield from the fork primitive +* GUI: fixed #1099, thanks, Michael! +* Portuguese translation update, thanks, Manuel! + +### 2015-12-23 +* Morphic: fixed #1083 + +### 2015-12-22 +* Blocks, Objects, Threads, Locale: revert to ’any key’ in the key-pressed menu +* GUI: Improve sorting and tab switching in the Project Dialog, Thanks, Michael! + +### 2015-12-21 +* Morphic: Native Copy & Paste support, thanks, @cyderize, for this contribution!! +* GUI: Code tweaks +* Portuguese translation update, thanks, Manuel! + +### 2015-12-19 +* Objects: Optimization: Don’t redraw unrotateable sprites on TURN + +### 2015-12-18 +* new Arabic translation, yay!! Thanks Tarek Galal!!! + +### 2015-12-17 +* Threads: fixed #1071 “length of list” type error possibility by no longer guaranteeing that the red “length of” reporter also works on text input + +## v4.0.4 (draft): +* Show result bubble when the user clicks on a command script that uses REPORT (You can now click on REPORT and it actually does something) +* New generic “When” hat block, enhances red stop button behavior +* New block (instance) variables feature (experimental) +* evaluator performance optimizations +* Morphic grab-threshold fix for scroll frames +* fixed several block rendering glitches +* List category LENGTH reporter now also works on text +* Changed “any” to “random” (in English only) +* new FILL primitive in the Pen category +* switched to animation frame scheduling, please use TURBO for music +* Updated German translation + +### 2015-12-15 +* snap.html: switch to animation frame scheduling because Chrome sucks sooooo much!!!! +* GUI: pushed version to 4.0.4 + +### 2015-12-15 +* Cloud: 10 MB cloud upload limit for media per project +* Objects, Paint: Automatic Sprite Center Detection, Thanks, Craxic!! +* Morphic: Handling of diacritics, [Alt] + key in input fields (Windows), Thanks, DanDoro!! +* NL translation update +* Use Blob API to Save Files (to Disk), Thanks, Michael!! + +### 2015-12-14 +* Objects: added “fill” primitive to the Pen category +* Updated German translation +* GUI: Directly download projects from cloud by holding shift while opening - commented out +* GUI, Cloud: show size of uploaded / downloaded projects +* GUI, Cloud: upload size limit of 5 MB - commented out + +### 2015-12-12 +* Locale: change English ‘any’ (in “item of”) to ‘random’ because teachers + +### 2015-12-11 +* Threads: extend red LENGTH reporter to also work on Text +* GUI, Objects, Blocks: extend the red stop button to reflect whether custom hat blocks are paused (indicated by a red square instead of the stop sign) +* Blocks: Tweak C-Slots to better fit inside reporters + +### 2015-12-10 +* Store: persist block (instance) vars +* Threads: only show result bubble on user-clicked scripts if “Report” is in the lexical script (not inside a reporter block definition) +* Morphic: obey grab threshold when dragging inside scroll frames + +### 2015-12-09 +* Threads: allow invoke() to operate on both blocks and rings with arguments +* Blocks: cache reporter slot specs for evaluation performance (30% speedup) + +### 2015-12-08 +* Objects, Blocks, Threads, GUI, Store, Locale: Automatically enable/disable custom hat blocks when they’re used in a project +* BYOB: initialize custom block vars on every definition-refresh + +### 2015-12-07 +* Threads, GUI: Stop button stops / restarts custom hat blocks, green flag starts custom hat blocks + +### 2015-12-02 +* Threads: Only support block vars for blocks that actually define any, to avoid race conditions among parallel global blocks with the same definition that also access sprite-local variables + +### 2015-12-01 +* BYOB, Blocks: Fix BlockMorph.fullCopy() for block vars + +### 2015-11-28 +* BYOB, Store: Fix some bugs related to block vars (zebra coloring etc.) + +### 2015-11-27 +* Blocks, BYOB, Store: new experimental block variables feature +* BYOB: more prototype label rendering fixes + +### 2015-11-26 +* Threads, Blocks: Performance optimizations (replace “contains” with chained tests) +* German translation update (for custom hat blocks) + +### 2015-11-25 +* Threads, Objects, GUI, Store: Generic “When” hat block +* BYOB: fixed a rendering bug when using plain prototype labels + +### 2015-11-24 +* Blocks: fix a re-rendering glitch when changing block specs in dev mode +* Threads: add optional receiver (environment) to invoke() function + +### 2015-11-21 +* Threads: Show result bubble when the user clicks on a command script that uses REPORT (You can now click on REPORT and it actually does something) + +### 2015-12-04 +* Cloud: doubled the number of supported backend slices +* Cloud, GUI: support new “raw” cloud project services + +### 2015-11-20 +* Lists: fixed linked lists identity loss when showing watchers + +### 2015-11-17 +* Blocks: fixed a zebra-coloring glitch for BooleanSlotMorph + +## v4.0.3 (unreleased) +### 2015-11-16 +* Blocks, GUI: Slightly less transparency for dragged reporters and sprite icons +* new Bulgarian and Romanian translations contributed! +* fix for IE backspace and tab errors contributed! +* better resource loading mechanism contributed! + +### 2015-11-14 +* Frames, snap.html, snap_slo.html: remove initial version for now, needs more low-levelish rewrite (Map-based “shortcut” design doesn’t cut it). + +### 2015-11-13 +* Frames, snap.html: initial version of a new general purpose prototypal single inheritance object system +* snap_slo.html: alternative animation-frame based outer scheduler, experimental +* Threads: added optional timeout to the new synchronous invoke(block) function +* Blocks: fixed too brutally optimized redraw for “ringify” and “unringify” + +### 2015-11-12 +* Blocks, Objects, Threads: new internal slot type: %cl for auto-reifying C-slots that reject reporter drops. Changed (hidden) “for each” to reject reporters in C-slot + +### 2015-11-11 +* Objects: fixed a between slideBackTo() and possible running scripts in sprites, thanks, Paul, for reporting it! + +### 2015-10-09 +* Morphic: cache fullImage and fullBounds when dragging +* Blocks: make reporters semi-transparent while dragging +* GUI: make SpriteIcons semi-transparent while dragging +* Blocks: make it harder to drop reporters onto filled custom C-slots and variadic slot arrows +* Blocks: make ScriptsMorphs notice transparent clicks (addresses #997) +* Blocks: fixed “undrop” for replacing C-slots with reporters +* BYOB: fixed ctrl-f for the BlockEditor in all situations + +### 2015-11-07 +* Threads: invoke a block synchronously + +### 2015-11-04 +* Morphic: new grabTheshold preference to suppress accidental grabbing through micro-movements of the hand +* GUI: hidden (shift-click) option to adjust the grabThreshold for the current session +* Lists, Blocks: Expand list watchers inside result bubbles to show everything +* Objects: Expand list watchers inside speech/thought bubbles to show everything +* Morphic: fixed a bug that occasionally expanded the Hand’s bounds when dragging morphs + +### 2015-11-01 +* BYOB: Script pic: Always export comments attached to custom block definitions +* Blocks: fixed #982 (made %interaction slot static) +* Morphic: removed an obsolete line (“dragOrigin”) +* BYOB: make block editor big enough to show the whole definition, if possible +* BYOB: remember user-set position and size of block editor when pressing “OK”, per session (not serialized in project) +* Blocks: speed up stacking of commands (also when done programmatically) by suppressing redraws +* Morphic, Blocks, BYOB: Suppress redundant redraws + +### 2015-10-30 +* Blocks: Tweak precision of rendering of transparent “holes” +* updated Czech translation +* Morphic: Streamlined nop-stepping +* Blocks: Let SyntaxElements step (again), for better input slot editing experience + +### 2015-10-07 +* BYOB, Objects, GUI: New “Remove Unused Global Blocks” Feature +* GUI, Lists: “Export Project Summary” improvements: + - show variable values as watcher pics + - expand list watcher pics to show their complete contents (1. level) + - url for shared projects + - table of contents + - basic support for sprite nesting and inheritance + - make the summary “browsable” instead of editable + - outline around sprite / stage snapshots + - experimental hidden (shift-click) “drop-shadows” option +* GUI: Rearrange project menu, only show global blocks-related ops if there are any +* GUI: Remove URL location.hash information when loading a new project +* Store: Fix deserialization support for projects using inheritance +* German translation update + +### 2015-10-02 +* GUI, Blocks, BYOB: New “Export Project Summary” Feature, also: exporting script pics now includes attached comments +* Blocks, Objects, Threads: Key hat block and key sensor support for “any” key +* German translation update + +### 2015-09-23 +* Morphic, Objects: Improve display precision (stop rounding display coordinates) +* Added “ceiling” function, thanks, Michael +* Updated various translations + +### 2015-09-15 +* new Croatian translation. Yay!! Thanks, Zeljko Hrvoj! +* fixed #925 + +### 2015-08-14 +* Blocks: fixed #907 + +### 2015-08-09 +* Interlingua support, yay!! thanks, Ken Dickey! + +## v4.0.2 +### 2015-08-06 +* Polish & German translation updates + +### 2015-07-30 +* Blocks: improve keyboard editing for embedded rings + +### 2015-07-28 +* GUI: fixed relative urls, thanks, Michael! +* Morphic: escalate origin with “accept” and “cancel” events from text cursors +* BYOB: keep BlockEditors open when or keys are pressed +* GUI: stop keyboard editing of blocks when selecting another sprite + +### 2015-07-27 +* Polish translation update, thanks, Bartosz Leper! +* Turkish translation. Yay!! Thanks, Hakan Ataş! +* Hungarian translation. Yay!! Thanks, Makány György! +* GUI: relative-url fixes, Thanks, Michael! +* Morphic: enable exporting a screenshot of the World +* Morphic: enable more fine-grained control over dragging position correction +* Morphic: enable all Morphs to “scrollIntoView()” +* Morpic: keyboard accessibility for menus +* Objects: fixes and enhancements for nested sprites +* Blocks, Objects, BYOB, GUI: keyboard editing support +* Objects, Blocks, Threads, GUI, Store, Widgets: Prototypal inheritance for sprite-local variables +* Objects, Blocks: enable monitoring closurized non-locals and thread-temporaries (script vars of running processes) +* GUI: stage resizing handle + +### 2015-06-26 +* Morphic: Fix Inspector duplication, update documentation + +## v4.0.1 (unreleased) +### 2015-06-25 +* Morphic, Objects, Blocks, XML: Optimizations and dramatic speed-up. Thanks, Nathan!! +* Objects: push maximum clone count up to 1000, tweak Note::play + +### 2015-06-08 +* Blocks: Fixed #820 + +### 2015-05-23 +* BYOB: Fix encoding glitch + +### 2015-05-21 +* BYOB: Fix encoding for exported libraries of global blocks + +### 2015-05-18 +* Objects, GUI: Fix encoding for exported sprites (esp. comments) +* Portuguese translation update, thanks, Manuel!! + +## v4.0 +### 2015-05-01 +* Morphic, Blocks: select all text when first clicking an input slot +* BYOB: indicate numeric inputs in the block prototype with the # sign +* Threads: return empty string when querying first letter of a list +* GUI: hide “save to disk” option behind shift-click again (has issues in Chrome) +* GUI: parameters for embedding projects in iFrames, thanks, Bernat! + +### 2015-04-26 +* Store: fixed #784 + +### 2015-04-15 +* Threads: flush Stage>>keysPressed when prompting the user +* Objects: fixed #770 + +### 2015-03-25 +* Threads: fixed #752 + +### 2015-03-15 +* Store: fixed #743 +* GUI, html: switch from beta to release candidate + +### 2015-03-09 +* Blocks: fixed #738 +* GUI, Blocks: Only enable input caching for blocks + +### 2015-03-06 +* Blocks: fixed #736 + +### 2015-03-02 +* BYOB: fixed #730 + +### 2015-02-28 +* Blocks, Store, GUI: Cache inputs, accelerates evaluating recursive reporters and warped / turbo recursive commands by up to 40% +* Objects: slightly optimize warped / turbo execution +* Threads: fixed #715 +* BYOB: fixed #716 + +### 2015-02-24 +* Store: fixed #725 + +### 2015-02-23 +* Blocks, Objects: Add user-interaction choices to the “When I am ...” hat block +* Update German translation +* Store: Avoid incompatibility warning for very old (pre-earmarked) projects + +### 2015-02-20 +* Malayam, Tamil and Telagu translations, thanks, Vinay Kumar!! +* Un-hide “Save to disk” feature (currently supported by both Chrome and Firefox, but not by Safari) +* Update German translation +* GUI: Make “project data in URLs” a hidden dev option (prevent long urls per default) + +### 2015-02-06 +* GUI: Added url switch #cloud: to open a shared project in edit mode + +### 2015-01-28 +* Objects: Fixed #710 + +### 2015-01-21 +* Objects: Keep layering of nested sprites thru drag & drop +* GUI, Store, BYOB: Generate ScriptsPaneTexture programmatically +* GUI: Fix Zoom Dialog’s sample background in “flat” design +* Updated Korean and Catalan translations, thanks, Yunjae Jang and Bernat Romagosa! +* Objects: Fix speech bubbles of dragged nested sprites + +### 2015-01-13 +* BYOB: fixed #702 +* GUI: fixed #680 + +### 2015-01-12 +* Cloud, GUI: Backend load balancing support, eliminate now obsolete authentication roundtrip, Cloud error message tweaks +* Store: notify users of potential incompatibilities when opening projects created in other forks (e.g. BeetleBlocks) +* Threads: Don’t highlight scripts running inside clones (boosts performance), Thanks, @aranlunzer, for the hint! +* Objects: Disable clones from being edited via their context menus or double-click +* Italian translation update, thanks, Alberto Firpo! +* GUI: add additional yields to nextSteps() (work around a bug in Chrome) + +### 2014-12-17 +* Objects, Store: Experimental “processes” count watcher (hidden in dev mode) +* Threads: Remove terminated processes from expired clones +* Threads: Let “zombifying” scripts access receivers’ local vars + +### 2014-12-15 +* New Swedish translation! Yay!! Thanks, Erik A Olsson! + +### 2014-12-11 +* Threads: yield after each cycle in the experimental “forEach” primitive + +### 2014-12-06 +* Store: Fixed #668 + +### 2014-12-05 +* Morphic: Avoid auto-scaling artefacts in Safari on retina displays (resulting in “traces” when dragging items) + +### 2014-12-04 +* Threads, Objects: Experimental “ForEach” primitive (hidden in dev mode) +* GUI: Another attempt at pointing the project dialog to the cloud if signed in + +### 2014-12-03 +* Morphic: Cache actual bounding box of the Pen arrow shape +* Threads, Objects: Improve edge-collision detection of default sprite “arrow” shape + +### 2014-12-02 +* New Kannada translation. Yay!! Thanks, Vinayakumar R!! + +### 2014-12-01 +* Objects: Hide hidden elements in the project thumbnail +* GUI: Point project dialog to cloud if already signed in, thanks, Michael! +* favicon: Transparent background, thanks, Michael! + +### 2014-11-225 +* Threads: Fixed #656 + +### 2014-11-225 +* Threads: Evaluator optimizations (reducing the stack size for reporters) +* Threads: Full TCO (tail-call-elimination), now Snap! *is* Scheme :-) + +### 2014-11-224 +* Threads: Fixed #318 +* Objects: Fixed #416 +* Objects: Fixed #372 +* Threads: Fixed #644 +* Store: Fixed #34 +* Threads: Fixed #131 +* snap.html, favicon.ico: new Favicon, thanks, Michael! +* Threads: improved whitespace detection for “split” primitive, thanks, Michael! +* Threads: tail-call-elimination for reporters experiment (commented out, under construction) + +### 2014-11-213 +* Threads: Fix “stop this block” primitive for tail-call-elimination + +### 2014-11-21 +* Threads, Blocks: Fix STOP THIS BLOCK’s lexical awareness + +### 2014-11-20 +* Lists: Fixed #642 avoid “freezing” when calling CONS on non-list/null +* Threads: Fixed #364 avoid “freezing” when calling LAUNCH on empty ring +* Threads: Added optional “onComplete” callback to Process, thanks, @bromagosa! +* GUI: Set Default Save location to Cloud on load, thanks, @cycomachead! +* GUI: Updated the “About” Dialog with a mention of support from CDG (SAP Labs) +* BYOB: Percent sign fix for block labels, thanks, @natashasandy! +* Threads: fix ‘line’ option in ‘split’ block for Windows files, thanks, @brianharvey! +* Morphic: fix slider range 1, thanks, @tonychenr ! +* translation update, thanks, Manuel! + +### 2014-11-17 +* Threads, Blocks: Treat REPORT blocks inside custom command definitions as STOP THIS BLOCK / IGNORE INPUTS + +### 2014-11-14 +* Threads, Store: Fix reporting out of nested custom C-shaped blocks + +### 2014-11-06 +* Morphic: Enable mouseMove events with right button pressed + +### 2014-10-08 +* Objects: fixed #608, #610 + +### 2014-10-06 +* GUI, Objects: fixed #604. Thanks, @Gubolin! + +### 2014-10-02 +* GUI: New feature - minimal stage mode (shift-click on small-stage button) + +### 2014-10-01 +* Threads: workaround for some REPORT issues +* Objects: fixed #599 (disable IDE keyboard shortcuts in presentation mode) +* Blocks: correctly display symbol for %obj type input slots in the prototype template +* Portuguese translation update, thanks, Manuel! + +### 2014-09-30 +* Objects: fixed #593 match broadcast numbers with event hat blocks containing strings that can be parsed as numbers +* BYOB: allow percent symbols in custom block texts (fix #361), thanks, @Gubolin!! +* Morphic: allow negative min/max values for sliders (fix #285), thanks, @Gubolin!! +* Objects: fixed #378 (disable context menus for boolean representations) +* Blocks: fixed #584 + +### 2014-09-29 +* Threads: fixed #591 fully copy local variables for sprite duplicates and (Scratch-like) clones +* Portuguese translation update, thanks, Manuel! +* fixed #590 (Russian translation syntax glitches) Thanks @alexf2000 ! +* Paint: flood fill issue fixed, thanks, Kartik! + +### 2014-09-22 +* Blocks: Make upvars mutable +* GUI: fixed #585 (sprite name conflict with stage). Thanks, Michael, for the report! + +### 2014-09-18 +* Threads: fixed #174, replace UpvarReferences with references to Variable objects, fixes upvar scope issues + +### 2014-09-17 +* Threads, Objects, Store: Refactor variables handling, introducing Variable objects, all functionality stays the same + +### 2014-08-13 +* Threads, Blocks: enable Zombiefication of JS-Functions +* Morphic: Fix #563 (Paste into Chrome), thanks, @Muon, for the hint! + +### 2014-07-30 +* Objects: propagate HIDE and SHOW to nested sprite parts +* GUI: propagate DELETE to nested sprite parts +* Blocks, Threads: export script pic with result bubble (shift-context-menu of reporter scripts) +* updated Portuguese translation, thanks, Manuel! + +### 2014-07-29 +* fixed #526, thanks, Bernat, for reporting it! +* Objects, GUI: duplicate and clone nested sprites +* GUI, Store: export and import nested sprites +* Objects: double clicking on a sprite in the stage selects it in the IDE +* Objects: added ‘move’ option to the sprite context menu, lets the user move (nested) sprites in edit mode without changing their layering, and also sprites marked “undraggable” +* updated Portuguese translation, thanks, Manuel! +* updated German translation +* Morphic: fixed #497 (prevent bubble shadows from getting cut-off) +* Blocks: keep result-bubbles within the enclosing scripting pane + +### 2014-07-28 +* Lists: fixed "Load Failed Type Error Cannot read property 'isLinked' of null" +* Threads: enable “JS function” block to create custom control structures and HOFs + +### 2014-07-25 +* Objects, Threads: new “JavaScript function” primitive. Go figure… +* GUI: updated Credits + +### 2014-07-24 +* Objects: fixed “lost sprites bug” - ensure duplicated sprites keep wearing their current costume through save and re-load +* GUI, Objects: improve unique sprite- and costume names +* Threads: Display “empty” Contexts (e.g. continuations) as empty rings + +### 2014-07-23 +* Objects: Scale down oversized images to current stage dimensions. Thanks, Dan, for reporting this! + +### 2014-07-22 +* Objects, Threads: fixed #521 (deleting variable watchers by dropping them on the palette results in wrong ones to be created when showing them again) + +### 2014-07-21 +* fixed #518 + +### 2014-07-18 +* Lists: incorporate Brian’s adhoc fixes, thanks, Brian! +* GUI: Use new mechanism for unique costume names on the paint editor, renamed costumes and costumes dragged and dropped onto sprite icons +* add “letter” option to the split block’s list of delimiters, Thanks, Michael! +* update German translation + +### 2014-07-17 +* new translation into Bangla (Bengali)!!! Yay, thanks, Mokter!! +* Lists: make internal list ops iterative (instead of recursive), thanks, Brian! +* Objects, Blocks: new feature (hidden in dev mode): Save screenshot, thanks, Viraj! +* GUI: Use new mechanism for unique costume names on imported costumes as well + +### 2014-07-11 +* Morphic: keyboard shortcut ctrl/cmd-shift-a for ‘@‘ +* Morphic: allow directly editing properties in inspector widgets +* Blocks: change the color of the %pause symbol to be more yellowish +* Threads: fixed #506, thanks @haritop, for both the report and for providing the fix!! +* GUI: fixed #412 (incomplete sprite-removal) +* GUI: fixed #507 (limit persistent block zoom to 12x), thanks Michael! +* Morphic, GUI, Objects: fixed #508 (don’t popup empty menus), thanks Michael! + +### 2014-07-08 +* Threads: show error messages for custom blocks (propagating to the script’s top block) +* Threads: adjust to Doug Crockford’s latest infuriating nitpickings in JSLint +* GUI: show username in ‘logout’ entry of cloud menu +* GUI, Objects: fixed scrolling glitch in the palette, thanks, Kunal! +* GUI, Objects: add keyboard shortcut for “new project”: ctr-n +* revert changes made for JSLint’s sake after the issue was fixed in JSLint +* Blocks: change “delete” behavior in context menus to only delete this particular blocks (and reconnect the next block to the previous one) +* fixed #490 + +### 2014-07-06 +* Blocks: add “ringify” to every context menu that already has “unringify” + +### 2014-06-23 +* Morphic: Inspector enhancements (dynamic property update, keyboard shortcuts) +* GUI: update visibility of share/unshare buttons, Thanks, Kunal! + +### 2014-06-05 +* Objects: gracefully hide & show the stage, fixed #281 +* Objects: add hide and show blocks to the stage’s “looks” category +* Objects: added more relabelling options to SAY and THINK variants +* Blocks, objects: enable relabelling blocks with C-Slots +* Blocks: enable relabelling blocks across categories +* Objects: more relabelling options for SAY, THINK, ASK +* BYOB, Blocks: relabelling custom blocks (experimental) + +### 2014-06-05 +* Objects: stop replacing the empty string with the number zero in watchers +* Threads: initialize new variables with zero (instead of null) +* Objects: fixed #465 +* Objects: fixed #457 + +### 2014-06-04 +* Blocks: refactor “script pics” feature +* BYOB: new scriptsPicture() method for custom block definitions +* GUI: new (hidden) feature: “Export all scripts as pic” (including custom block refs) +* Graphic effects!!! Yay, thanks, Yuan! +* Bug fixes from Nathan, yay, thanks, Nathan!! +* German translation update +* Paint Editor transforms, yay, thanks, Kartik!! + +### 2014-05-26 +* Objects: Fixed #445 (minor search + zoom issues) +* Localization additions and Portuguese translation update, thanks, Manuel! +* GUI, cloud: Show last-changed-timestamp when opening cloud projects + +### 2014-05-20 +* Morphic: Prevent default action for ctrl-/cmd-key event +* Snap.html: Focus the world canvas on startup, so Snap reacts to keyboard events right away +* Threads: new Variable data structure, for refactoring upvar references, not yet used anywhere +* Objects, GUI: Search Blocks, feature. Thanks, Kyle, for architecting and designing this!!! +* Objects, GUI: Keyboard-shortcuts for opening (cmd-o), saving (cmd-s) projects and for finding blocks (cmd-f) + +### 2014-05-02 +* error message when trying to import a non-text file into a variable, thanks, Nate! +* fixed #407 (custom-block coloring w/ zebra off) + +### 2014-04-30 +* new Finnish translation, yay! Thanks, Jouni! +* new Brazilian Portuguese translation, yay! Thanks, Aldo! +* Russian translation update +* Portuguese translation update +* additional localisations, thanks, Manuel! +* text-encoding fix for exporting variable contents, thanks, Blob! +* set turbo mode block fix, thanks, Michael and Nathan! +* enable storage and retrieval of first-class costumes in both file formats + +### 2014-03-31 +* Objects: experimental “wardrobe” and “jukebox” reporters in dev mode +* Blocks, Objects: display costume thumbnails in speech/thought/value bubbles and watcher cells +* Objects: let “switch to costume” block accept actual costume objects (in addition to names and numbers) + +### 2014-02-13 +* GUI, Store: constrain minimum stage size to 480 x 180 +* GUI: Fixed #322, #324 +* Widgets: new “promptVector” dialog box feature +* GUI: Use new vector prompter for stage dimensions +* German translation update + +### 2014-02-11 +* GUI: Set stage dimensions arbitrarily (new entries in the settings menu when holding shift) +* Store: Saving & Loading for arbitrary stage dimensions in the project data +* new Date block, thanks, Michael!!! + +### 2014-02-05 +* Objects, Paint: One-stop-shopping for stage dimensions (changing the stage dimensions in line 3720 of objects.js takes care of everything) + +### 2014-02-04 +* GUI: Import costumes and backgrounds from the project menu, thanks, Brian, for the changeset! +* GUI: Import sounds from the project menu, thanks, Brian, for the changeset! +* Objects, Store, GUI: Flat line end option in the settings menu, saved with the project +* German translation update +* Objects: Enable playing sounds and notes on Firefox, thanks, Dean Brettle, for this fix!! +* Update Portuguese translation, thanks, Manuel! +* Update French translation, thanks, grego! + +### 2014-02-03 +* Threads: Fixed #313. “Block of sprite” now works for interpolated (“timed”) blocks and for reporters (i.e. SAY FOR, THINK FOR, GLIDE, ASK etc.) +* Morphic: replace deprecated DOM “body” references with “documentElement” + +### 2014-01-10 +* Threads: Revert pull request #295 (xhr-headers), breaks existing installations +* BYOB: Fixed #292 (pulldowns loose lines when exported as library) +* BYOB: Fixed #291 (readonly custom menus become non-readonly when block is edited) + +### 2014-01-09 +* Objects: Mechanism for migrating blocks in existing projects to newer versions +* Blocks, Objects, Threads: Collapse old STOP primitives into a single one with a dropdown of options +* German translation update for new (migrated) STOP block +* Morphic: Fixed updateReferences() (how could nobody notice so long?!) +* XML: resolved unexpected assignment expressions (conform to the latest JSLint quibbles) +* validated all source files against the latest JSLint version + +### 2014-01-08 +* Threads, Blocks, Objects: The FOR reporter’s first input now also accepts blocks and scripts („rings“), and reports a copy that is bound to the sprite indicated by the second input. This lets you „zombify“ (or remote-control) sprites (and create custom TELL and ASK blocks) +* Blocks: initial support for „sensing“ sprite-only custom block definitions, commented out for now +* Paint: Add mouseLeaveDragging() event behavior, thanks, Kartik, for this fix! +* Objects: Only shrink-wrap sprite costumes, thanks, Kartik, for this fix! +* Threads: Added xhr-headers to HTTP block, thanks, Tim! +* Threads, Blocks, Objects: Added StopOthers primitive, thanks, Kartik! +* Added „all but this option“ to StopOthers primitive, fixed the implementation +* Updated German translation with new strings + +### 2013-12-19 +* Objects: stage watchers for „mouse x“ and „mouse y“ sensing reporters. Thanks, Michael! +* Store: fixed saving/loading/localisation of new mouse coordinate stage watchers + +### 2013-12-12 +* Objects, Morphic: fixed #277, #279 (blitting null-canvasses fails) + +### 2013-12-11 +* Threads: accept lists as inputs to the green (text) LENGTH OF reporter + +### 2013-12-05 +* Threads: fixed literal-to-non-literal zero-value comparison bug +* Objects: fixed #264 (mapped `` to green-flag instead of ``) + +### 2013-12-04 +* Threads: handle text comparisons case-insensitive (again) +* Lists: harmonize equality testing and List CONTAINS testing +* French translation update, thanks, Martin! +* Threads: fixed #261 (less tolerant null-value-to-number-coercion) + +### 2013-11-26 +* Cloud: fixed #125 (encode email address when signing up), thanks, Nathan! +* Threads: fixed #207 (stricter comparison of strings vs. numbers). Some edge cases remain, such as empty string equals zero and disregarding trailing / leading blanks. These are intentional. Please don’t nitpick and spare me the fundamentalism :-) +* Threads: fixed #245 (consistently auto-convert empty strings to zeroes) +* Localization and Portuguese translation updates, thanks, Manuel! +* Catalan translation update, thanks, Bernat!! +* Threads: Text comparisons are now case-sensitive („fixes“ #175) +* Threads: fixed #179 - don’t identify primitive (static) C-Slots as implicit formal parameters +* Threads: fixed #249 - preserve variable value types with edge cases (empty string, Boolean false) +* Threads: fixed #133 - preserve edge-cased argument types (empty string, Boolean false) +* Fixed issue #244 (relabelling now preserves empty input slots), thanks, Nathan! + +### 2013-11-22 +* Morphic: Don’t trigger events for eclipsed morphs (whose parent-chain contains a hidden morph) +* Blocks: Prevent „hide“ menu option for non-palette template blocks +* new Catalan translation! Yay, thanks, Bernat Romagosa Carrasquer!! + +### 2013-11-15 +* Blocks, BYOB, Store: „read-only“ option for editable custom block input slots +* BYOB, Blocks: custom block input slots reverting to default now show their default value +* Blocks: fixed read-only input slot coloring glitch, thanks Bernat, for reporting it! +* Objects: fixed #231 (watcher-display of Booleans) + +### 2013-11-12 +* Blocks, BYOB, Store: customizable drop-down menus for input slots +* Objects: fixed wrong NaN display for variable watchers +* Blocks: left-align multi-line text in value-bubbles +* Portuguese translation update, thanks, Manuel! + +### 2013-11-07 +* GUI, Cloud: transmission integrity check + +### 2013-11-04 +* GUI: filter quotation marks from project names (for backend index) +* BYOB: only show symbol menu for label fragments +* BYOB: customizable drop-down menus for input slots (experimental, commented out) + +### 2013-10-25 +* Blocks: enable Costumes as Symbols and Symbols as custom block label parts +* BYOB: Symbol selection menu for BlockLabelFragmentMorphs +* Portuguese translation update +* Widgets: enable Symbols in InputField drop down menus +* BYOB: enable Symbols in InputSlotDialog Morph’s drop down menu + +### 2013-10-17 +* Threads: fixed #213 - Empty else block breaks return to caller + +### 2013-10-15 +* Morphic: further condense damage list by merging nearby rectangles, thanks, Craxic! + +### 2013-10-14 +* Morphic: Condense damage list by merging overlapping dirty rectangles, thanks, Craxic! +* Objects: Increase maximum clone count from 128 to 300 +* Portuguese translation update, thanks, Manuel!! + +### 2013-10-10 +* Cloud: added "sanity check" to cloud-saving mechanism that errors if the serialized project data is corrupt and cannot be parsed as XML, addresses #203, #200, #171 + +### 2013-10-09 +* Theads: added a variant for linked lists to the experimental MAP primitive reporter + +### 2013-10-08 +* Lists: fixed type-issue for linked list indices (thanks, Nate, for reporting it!) +* Threads, Objects: experimental MAP primitive reporter in lists category, visible in dev mode +* Blocks: fixed #199 (can't delete reporter with attached comment via context menu) + +### 2013-10-04 +* Threads: Type-check the SPLIT block's input before eval'ing it +* Objects: Prevent watcher cells from growing wider as their contents becomes taller +* Objects: Keep watchers onstage when hiding/showing them, fixes #195 +* BYOB, GUI, locale: New preference setting for plain block prototype labels + +### 2013-10-01 +* Objects: smooth numerical values displayed in watchers + +### 2013-09-30 +* Blocks: fixed #186 (can't duplicate blocks with anchored comments) + +### 2013-09-20 +* Morphic: fixed #172, Rectangle.amountToTranslateWithin() for IF ON EDGE, BOUNCE + +### 2013-09-18 +* Objects, GUI: prevent costumes with CORS-tainted canvases, expected to fix #155, #154, #151, #148, #147, #127 for future projects +* BYOB: Prevent local custom blocks in global custom block definitions, fixes #167 for future projects + +### 2013-09-19 +* Objects: fixed #169 (sprites are sometimes off-placed when the project is loaded) +* Objects, GUI: fixed #146 (filter out empty costumes) + +### 2013-09-17 +* Cloud: encodeDict() fix and new parseDict() method - used for accessing shared projects +* GUI: fixed #119, #149 (accessing a shared projects requires lowercasing the username) +* Portuguese translation update for SPLIT block, thanks, Manuel! +* Store, Objects: prevent costumes from being drawn while they are loading, fixes parts of #154 + +### 2013-09-16 +* new Danish translation, yay!! thanks, Morten and Hanne! +* new Greek translation, yay!! thanks, Ino! +* Portuguese translation update, thanks, Manuel! +* French translation update, +* Norwegian translation update +* threads: minor custom block evaluation scope fix +* paint: flood fill freeze fix, thanks for the contribution, Kartik! +* objects: new SPLIT primitive reporter +* German translation update for new SPLIT primitive and delimiter options +* GUI: getPublicProject adjustments (lowercase username) +* GUI: prompt() - invocation fixes (null-choices) +* GUI: synchronous URL fetching simplifications for libraries and example projects +* GUI: fixed #115 - prevent loading several instances of the same block definition + +### 2013-08-17 +* Norwegian translation, yay!! thanks, Olav Marschall! +* "Dynamic" library list, thanks, Brian + +### 2013-08-14 +* Traditional Chinese translation, yay!! thanks, Chu-Ching-Huang! + +### 2013-08-12 +* Objects, Threads: Nestable Sprites Collision Detection & fixes +* Dutch translation update + +### 2013-08-10 +* Objects, GUI: Nestable Sprites fixes +* German translation update + +### 2013-08-09 +* GUI: Nested Sprite Rotation style buttons on corral icons +* Store, Objects: Nested Sprite saving / loading + +### 2013-08-08 +* Objects: Nested Sprite Scaling +* Objects: Nested Sprite Rotation +* Objects: Nested Sprite synchronous / independent rotation +* Dutch translation update, thanks, Sjoerd Dirk Meijer! + +### 2013-08-07 +* Objects, GUI: Sprite Nesting preliminaries +* Objects: Fixed stage costume scaling & misplacing bug. Thanks, Josh, for the report! +* Objects, GUI: Sprite Nesting GUI +* Objects: Nested Sprite Motion + +### 2013-08-05 +* Polish translation, yay!! Thanks, Witek Kranas! +* Morphic: mouseEnterDragging fix + +### 2013-08-02 +* Blocks: Undrop Reporters feature tweaks +* Blocks: Undrop Comments feature +* Blocks: Undrop Commands feature +* German translation update (for Undrop feature) + +### 2013-08-01 +* Blocks, Threads: "whitespace" & other options in SPLIT reporter's dropdown +* Blocks: Italicize editable input options (e.g. for the SPLT block) +* Blocks: Undrop Reporters feature (in script areas' context menus) + +### 2013-07-31 +* Blocks, Threads, Objects: experimental text SPLIT primitive in the operators category + +### 2013-07-30 +* Blocks: Made it harder to drop reporters on the variadic input per se (as opposed to into one of its slots) in (default) "prefer empty slot drops" setting +* Blocks, Threads, Objects: PAUSE primitive command block +* GUI: fixed #104 (storing a cloud project under another name causes media loss) + +### 2013-07-24 +* Dutch translation, yay!! Thanks, Frank Sierens + +### 2013-07-15 +* Objects: increased palette's vertical growth by scrollBarSize +* Objects, Blocks, Threads: experimental text-function primitive (hidden, shown only in dev mode) + +### 2013-07-13 +* Paint: fixed pipette tool for floodfill + +### 2013-07-12 +* Blocks: Pipette symbol +* Paint: Pipette tool + +### 2013-07-11 +* Blocks: fixed occasional flickering in scripting areas (caused by deleted feedback morphs, a bug that surfaced in Chrome 28 on OSX and may be due to a possible Chrome GC issue) +* Blocks: preserve nested blocks in the scripting area when replacing a variadic input list with another input ("kick out" the nested blocks instead of "swallowing" them) +* Blocks, Threads: new floor() function in monadic math reporter's drop-down + +### 2013-07-10 +* GUI: Reset hidden primitives and code mappings upon loading a new project + +### 2013-07-09 +* Objects, Blocks, Threads: Collapsed codification primitives (code, header) into a single block +* Blocks: Added isEmptySlot() to BooleanArgMorph (thanks, Brian, for the bug report!) + +### 2013-07-08 +* Store: fixed serialization placement-bug for sprites + +### 2013-07-05 +* Blocks: fixed CommentMorph hiding/showing bug when switching to / from presentation mode + +### 2013-07-04 +* Codification (text code mapping and block header support) + +### 2013-07-02 +* Objects: took out "security margin" in Costume's shrinkWrap() method b/c Chrome no longer needs it -> fixed empty costume bug when drawing over the paint editor's bounds +* GUI: Import libraries feature (in the project menu) + +### 2013-06-28 +* Morphic, GUI: improved importing costumes by dragging in pictures from other web pages + +### 2013-06-27 +* Objects: fixed speech bubble scaling when sprite is not onstage (reported in the forums) + +### 2013-06-26 +* GUI: fixed #100 saving costumes to the cloud + +### 2013-06-25 +* Widgets, Blocks: code mapping dialog input is now multi-line monospaced + +### 2013-06-24 +* Objects, Blocks: pretty printing for mapped code, now supporting Python mappings + +### 2013-06-21 +* Morphic, Blocks: "flat" design fix: Handle manually "unshadowed" StringMorphs +* Objects, Blocks: %code input slot - multi-line, monospaced, type-in slot for code mappings + +### 2013-06-20 +* GUI: add code mapping preference to persistent settings +* Blocks, BYOB, Lists, Objects: "flat" design enhancements for blocks and watchers +* Blocks: Multi-line input slots (TextSlotMorphs - %mlt) +* Objects: doMapCode() primitive now uses a multi-line input slot + +### 2013-06-19 +* Store: persisting code mappings in project and block library files + +### 2013-06-18 +* Code mapping (generating textual code from blocks), first iteration + +### 2013-06-06 +* BYOB: Newly created custom reporters now have an initial default REPORT block as definition body + +* Morphic: focus World canvas on mouse down (otherwise prevent default) + +### 2013-06-05 +* Objects: fix for hiding 'getLastAnswer' and 'getTimer' primitives + +### 2013-06-04 +* Morphic: Prevent undesired native dragstart events (introduced in Chrome 27) + +### 2013-05-17 +* GUI: user preferences (settings) are now made persistent in localStorage + +### 2013-05-16 +* "flat" GUI design preference (in the settings menu) + +### 2013-05-15 +* Objects: Costume shrinkWrap adjustments +* Morphic: Flat design preference introduced (default is off) +* Widgets: preparing for "flat GUI skins" + +### 2013-05-14 +* paint.js: Paint editor, first version, contributed by Kartik Chandra, Yay!! +* Threads, Objects, Blocks: Broadcast & message enhancements: When I receive ``, and getLastMessage reporter + watcher + +### 2013-05-10 +* Reset Password via e-mailed link (frontend only) + +### 2013-05-06 +* Reset Password feature (frontend only) + +### 2013-04-30 +* Objects: Costume shrink-wrapping +* Morphic: Allow triggers to be dragged if so specified (#83) +* GUI: select dragged costume +* Blocks: eraser symbol for paint editor +* Morphic: ScrollFrame scrollY() fix (fixes #24) + +### 2013-04-29 +* Blocks: symbols for solid rectangles and circles + +### 2013-04-27 +* Blocks: paint bucket symbol +* highlight adjustments when merging scripts (#70) + +### 2013-04-26 +* Morphic: ensure unique World stamps +* Blocks: symbols for paint editor + +### 2013-04-25 +* Objects, Blocks, GUI, Store: Hide primitives feature +* Morphic: Introducing World.stamp as reference in multi-World setups +* Widgets: restore multi-dialog restrictions for multi-world setups +* Translation update for "hide primitives" feature + +### 2013-04-24 +* Widgets, BYOB, GUI: prevent multiple block editors on the same block definition, allow multiple dialogs on different objects, handle dialog instances in DialogBoxMorph.prototype + +### 2013-04-23 +* Lists, Objects: Circularity no longer breaks watchers +* Widgets: Multiple Dialogs of the same kind are prevented except for a few (e.g. BlockEditor). Thanks for this fix, Nathan! (and for the many little UI things you've fixed as well) +* German translation update + +### 2013-04-22 +* GUI: Double clicking support for cloud side of project dialog + +### 2013-04-21 +* using the percent character in variable names is now safe (fixes Github issue #65) +* Morphic: added Doubleclick support, example: inspectors +* GUI: Double clicking a project in the project dialog performs the dialog's action on it (open / save) + +### 2013-04-19 +* German translation update for "scripts pic" feature + +### 2013-04-18 +* plenty of bug fixes from Nathan. Yay, you go!! + +### 2013-04-17 +* Blocks: "scripts pic" option in the ScriptsMorph's userMenu lets you export a picture of all scripts (including comments) + +### 2013-04-16 +* Cloud, GUI: additional dev settings + +### 2013-04-15 +* Blocks: place sticky comments on World layer on dragging their anchor block + +### 2013-04-12 +* Lists: fix for typecasting bug in CONTAINS +* BYOB: Tooltips for custom block templates (sitting in the palette): mousing over a custom block in the palette pops up its definition hat comment in a comment-colored speech bubble +* GUI: Sharing/Unsharing/Deleting now available in all version of the project dialog + +### 2013-04-11 +* Morphic: virtual keyboard enhancements (see Morphic.js) +* GUI: disabled localStorage (as in I9 running locally) no longer prevents Snap! from loading + +### 2013-04-10 +* Fixes for type casting and dragging dialogs by buttons, thanks, Nathan! +* Fix for loading shared projects in different formats (cloud data and plain project data) + +### 2013-04-09 +* various formatting and encoding normalizations +* Morphic: Formatting options for Triggers and MenuItems (and ListItems): bold, italic +* Morphic: ListMorph (items) manipulation capabilites +* GUI: display shared project names bold typed in the project dialog +* GUI: Feedback msg when sharing / unsharing projects +* GUI: Shield (hide) IDE while opening a shared project for presentation +* GUI: Support for debugging shared projects + +### 2013-04-08 +* Cloud, GUI: Sharing / Unsharing projects finalization +* Lists: Adjust initial list watcher size to blocks' zoom scale +* Portuguese and Italian translations update, thanks, Manuel and Stefano! +* GUI fix: switch to edit mode and tab to scripts when loading a project, +* Objects: new feature (hidden in shift-clicked stage context menu): turn pen trails into new costume + +### 2013-04-05 +* renaming variable blobs now features a drop-down with reachable variable names and a picture of the block to be renamed + +### 2013-04-04 +* loading shared projects in presentation mode, exporting URL for shared projects +* Selecting "Help" for a custom block now pops up the comment attached to its definition's prototype hat, if any +* BYOB fix for detaching comments from prototype hat blocks + +### 2013-04-03 +* YPR converter fix: No more text area in upper left corner of the Snap! IDE +* Blocks, BYOB, Store: PrototypeHatBlocks in the BlockEditor accept anchored comments + +### 2013-04-02 +* Japanese translations update, thanks, Kazuhiro Abe! +* Content-type support for Cloud backend +* sharing / unsharing projects support and GUI +* the Block Editor now allows anchored comments +* duplicating a block / script / sprite now also duplicates anchored comments +* deleting a block / script now also deletes anchored comments + +### 2013-03-25 +* Spanish translation! Yay, thanks, Victor Muratalla!! +* Objects: Boolean value block representations are now translated, thanks, Victor, for the report +* Simplified Chinese translation update, thanks 邓江华 !! + +### 2013-03-22 +* Widgets: optional sliders and "lively" graphics for numerical prompters +* Blocks, GUI: "Zoom blocks…" feature in the settings menu (no longer hidden) +* Objects: numeric prompters for watcher's sliderMin/Max +* translation updates +* Objects: 'pic…' screenshot feature for the stage +* GUI, Cloud: Fallback message support before showing an error + +### 2013-03-21 +* Cloud: allow every XMLHttpRequest to transport cookies (withCredentials = true) + +### 2013-03-20 +* GUI: deactivated motd and cloudmsg mechanism for now (has some issues) +* Updated Portuguese translation, thanks, Manuel! +* Updated all translations for %keyHat and %msgHat specs +* YPR: fixed turnLeft / turnRight swap bug + +### 2013-03-19 +* Blocks: SyntaxElementMorph fixLayout() optimization for active highlights +* Russian translation!! Yay, thanks, Svetlana Ptashnaya!! +* Store, GUI, Blocks: Scaling support for Comments and serialization/deserialization +* GUI: motd support: On startup Snap! looks for http://snap.berkeley.edu/motd.txt, if it exists it is shown in a dialog box +* GUI: fix for #run: URL switch +* GUI: cloudmsg support: cloud related notifications can be put into http://snap.berkeley.edu/cloudmsg.txt + +### 2013-03-18 +* GUI, Blocks, BYOB, Widgets: Scaling Blocks and Scripts (shift-click on settings menu) +* Widets: numerical prompts +* GUI: #signup URL switch +* Blocks: adjusting highlights when modifying active scripts + +### 2013-03-14 +* GUI: When logged into the Cloud, "cloud" becomes default in the project dialog +* Store: local custom blocks can now store their definition receiver directly as value (avoiding turning them into "Obsolete!" blocks when re-opening the project), this is important for reified blocks assigned to variables elsewhere, and such for the part of OOP we can already do now. + +### 2013-03-13 +* Store: context receiver persistence fix (for reified scripts) +* Threads: Execute reified blocks in the callee's context (not in the caller's) + +### 2013-03-12 +* Threads: OR, AND are now special form primitives ("lazy") +* Threads: fix for minor pen optimization glitch (catching the stage) +* Lists, Objects: Resizing list watchers no longer makes them "tremble" + +### 2013-03-11 +* Czech translation update, thanks, Michael! +* Morphic: "pic..." fix for scroll panes, thanks, Davide! +* Morphic fix: Clicking on editable text once again moves the caret to the mouse cursor + +### 2013-02-28 +* "Updating..." message while updating the cloud project list +* Morphic: Clipboard "paste" text support (works currently only in Chrome) + +### 2013-02-27 +* Morphic: onNextStep and nextSteps() mechanism +* GUI, Cloud: Ersatz-progress-bar-messages, using nextSteps() + +### 2013-02-25 +* Extended Signup dialog (COPPA-conforming, I hope) +* Morphic: mouse click event bubbling for input fields +* Widgets: Optional drop-downs for input fields + +### 2013-02-22 +* Objects: Fix for playNote distortion issue in Chrome + +### 2013-02-21 +* Cloud work: Connect / Reconnect mechanism and password hashing "salt" +* Exporting SVG_Costumes + +### 2013-02-18 +* SVG_Costumes (partial) +* Cloud work +* scaling during WARP glitch fix + +### 2013-02-15 +* Store: Sprites are now first class stored objects (can be "values"), needed for OF block +* Blocks, GUI, Threads: "Turtle" and "Empty" costume names, gosh, Brian! +* Threads: Error messages fix + +### 2013-02-14 +* clone drop-down menu fix (removed "close" entry) +* auto switching to small stage mode if the window gets narrow. Commented out b/c I don't like it +* changed costume name 'Turtle' to 'default' +* link to s.b.e/tos.html in signup dialog +* "Save project to disk" experimental feature (works currently only in Chrome) +* RUN variable OF sprite fix + +### 2013-02-13 +* GUI, Widgets: Cloud frontend complete +* OF reporter block in the sensor palette (Scratch functionality, not yet BYOB) +* CLONE block now takes sprite name or 'myself' as input, drop-down menu +* FAST TRACKING renamed to TURBO MODE +* unscheduled execution again made the default. +* "Prefer smooth animations" setting, runs strictly scheduled at around 30 fps max. +* scheduling mode saved in project data +* Settings menu clean-up +* Input slots in Hat blocks are now static (cannot receive reporters drops) + +### 2013-02-11 +* Fixed / Variable Frame Rate option in the settings menu (default is fixed, as in Scratch) + +### 2013-02-05 +* Cloning collision detection refinements, still *very* experimental + +### 2013-02-05 +* Cloning, basic Scratch style, still *very* experimental + +### 2013-02-04 +* fast tracking, a.k.a. "Turbo Mode" + +### 2013-02-02 +* Morphic, Objects, GUI, Store: "turtle costume pen" options (tip, middle) + +### 2013-02-01 +* Blocks: Context-menu-delete fix for CommandBlocks inside C-Slots: userDestroy() +* Morphic: Pen-redraw() optimization for warp() fix +* Cloud: Dual-component project optimization +* GUI: `` key now works with ProjectDialog + +### 2013-01-29 +* Cloud: persistent log-in and auto-log-in +* GUI, Widgets: Cloud work... +* Morphic: "pic..." generic exporting feature + +### 2013-01-25 +* Morphic: Better padding support for ScrollFrames +* Morphic: Better resizing & re-rendering support for Menus and ListMorphs +* Morphic: Inspection improvements for Menus and ListMorphs +* Morphic: Text scrolling improvements (scrollCursorIntoView()) +* Widgets: Rendering improvements for InputFields +* BYOB: changed all 'Ok' occurrences to 'OK' +* Threads, Lists: JOIN zero / false bug fix +* GUI: new ProjectDialogMorph + +### 2013-01-23 +* Import / Export text files from variable watchers (context menu) +* Max. size of displayed text in CellMorphs and value bubbles set to 500 characters + +### 2013-01-22 +* Symbols for local storage and for examples +* Cannot evaluate to null or undefined within an argument -> use empty string instead + +### 2013-01-21 +* Threads: No more type coercion when setting a variable's value, instead only when incrementing it + +### 2013-01-18 +* new YPR version. Thanks, Nathan! +* Blocks: fixed "sometimes list watchers can be dragged out of value feedback bubbles" +* BYOB/Blocks: fixed restoring existing inputs and upvar names when editing custom blocks + +### 2013-01-17 +* "Reference Manual" entry in the Snap! Menu +* BYOB: Editing custom-block-prototypes only changes the prototype in the block editor (no longer every instance of the block), pressing OK or APPLY propagates changes to all block instances, pressing CANCEL does nothing (no longer reverts previously edited slots in instances back to their default state) + +### 2013-01-16 +* Store, GUI: Cloud Data Format support +* Lists: CONS fix for zero CAR value + +### 2013-01-15 +* Threads, Blocks: Continuations tweaks (enabling reporter - CATCH / THROW) + +### 2013-01-11 +* Morphic: StringMorph leftClick event error catch + +### 2013-01-10 +* "input list:" (with colon) +* Blocks: Drawn symbols for TURN RIGHT / LEFT +* continuations tweaks +* revert of "returning 'undefined' to parent frame fix" (121204), breaks call/cc +* ScriptPane cleanUp tweak for attached comments + +### 2013-01-08 +* Blocks: ArgLabelMorph. Dynamic labels for "kicked out" variadic inputs ("input list") +* Dynamic input label support in BLOCKS, STORE, THREADS, BYOB, GUI and LOCALE +* Blocks, BYOB: Zebra coloring fix for rings in grey blocks + +### 2013-01-07 +* Slovenian translation!! Yay, thanks, Sasa!!! (Snap now supports a dozen languages!) +* list-colored drop "halo" for variadic inputs +* most modules: space / tab white space reformatting +* help screens!! Thanks, Brian!!! +* help screen API for custom blocks (currently only for the tools library) +* importing libraries is now "silent", i.e. it doesn't show a dialog letting you select which blocks to import anymore. + +### 2012-12-19 +* Threads, Cloud: switched most XMLHttpRequests to asynchronous (except URL switches) +* Morphic: Allow StringMorphs to hide their characters for password input +* Widgets: Login-Prompter +* cloud api work + +### 2012-12-17 +* cloud api work +* Morphic: auto-text selection fix +* all modules: replaced tabs for spaces +* "Clean up" now arranges sticky comments correctly + +### 2012-12-13 +* "elastic" anchor lines for sticky comments +* cloud api work + +### 2012-12-11 +* better alignment for sticky comments +* cloud api work + +### 2012-12-10 +* Sticky comments (attachable to blocks in main scripting area) + +### 2012-12-08 +* Objects: SAY nothing bug fix. Thanks, Brian! + +### 2012-12-07 +* Blocks: Drop target feedback for comments (in preparation for sticky ones) +* Objects: redraw turtle on pen color change, disable clicking on watchers + +### 2012-12-05 +* Morphic: trigger "reactToEdit()" when tabbing among text fields +* GUI: display tool's name when importing the module + +### 2012-12-04 +* Morphic: text element mouse event propagation fix (list boxes) +* Lists: Empty list element follow-up fix +* Threads: Returning "undefined" to parent frame fix (caused type errors) + +### 2012-12-03 +* GUI, BYOB: tools module can be imported from the project menu +* Morphic: enhancement for editing non-left-aligned texts +* Morphic: minor text element fix for initial mouse down behavior +* Lists, Objects: text elements in list watcher cells are now editable +* Lists fix: comparing something with a non-existent list element no longer produces an infinite loop, thanks, Aleks, for reporting this! +* dynamically load ypr.js when first needed +* minor translation strings updates + +### 2012-11-29 +* Store: Cloud Data Format now references media by its name, obliterating the need to re-save media when reordering wardrobes or jukeboxes, but relying on unique names (within each sprite or the stage) +* Store: serializing / de-serializing of media in different receptacles +* Morphic: CTR-Z / CMD-Z for undo in text input fields +* Morphic: SHIFT-arrows selects text in input fields +* Morphic: new global method sizeOf(object) returns number of keys +* Morphic: redundant (quasi-inherited) code taken out of TextMorph +* GUI: "hasChangedMedia" property for IDE_Morph (Cloud Data Format support) +* GUI: When a sprite's current costume is deleted, it switches to the default one + +### 2012-11-28 +* Morphic: Interactive Tooltips ("isClickable" and resizing support for SpeechBubbleMorphs) +* Blocks: list watchers inside evaluation bubbles are now interactive +* Store: The user-edited name for the stage is now persistent +* Store: Cloud Data Format fix - mediaIDs are now independent of sprite sorting and layer +* French translation update + +### 2012-11-27 +* Morphic: SpeechBubbleMorph shadow artefact fix +* Morphic: Backtab support & entry field tabbing ("wrapping") fix +* Objects: List watchers inside speech bubbles are resizable again +* Store, GUI: Cloud data formats (separating media from program data) +* Store: Fix for saved "obsolete" blocks (projects can be re-loaded) +* new Operators primitive: IS IDENTICAL TO? +* new translation string for new primitive +* Simplified Chinese translation update +* BYOB, Objects: global custom block refresh fix + +### 2012-11-23 +* Blocks: C-Slot rendering fix (eliminate occasional transparent line) +* Store, GUI: Beginnings of the Cloud data format (in progress...) + +### 2012-11-22 +* Blocks: right click delete reporter fix (restores slot), thanks, Ryan! +* Blocks: restore zero-value default fix +* Objects Fix: Variable blobs become undraggable on save / load. Thanks, Ryan! +* Morphic: enable all keys for text input (take out legacy browser support) +* new "Animations" option in the settings menu +* zooming the stage in & out now animates depending on the user's preference + +### 2012-11-21 +* Morphic: fixed reactToEdit() event trigger -> fixes scrambled sprite names +* Threads: hide / show variable watcher fix for watchers on globals +* Threads: Process reentrancy fix for played notes in non-thread-safe mode +* Store: global watcher load fix +* Store: Sprite ordering fix for Safari +* Objects / GUI / Blocks: fix for "relabel" + +### 2012-11-20 +* major refactoring of blocks dict and blocks generation code +* new "show all entry in the stage's context menu + +### 2012-11-19 +* blocks context menu: duplicate "this block only" feature +* blocks context menu: relabel feature +* blocks context menu: ringify / unringify misplacement fix +* Morphic: MenuItem icon shadow dimension adjustments +* store: fixes STOP ALL block spec +* added some more translation strings +* updated Korean translation + +### 2012-11-16 +* Esperanto translation! Woohoooo, thanks Sebastian Cyprych! +* a few additional localizable strings +* store.js: "Obsolete!" Reporter fix, thanks, Nathan! +* Morphic.js: support for dropped binary files +* .ypr project loading, Whoa! Awesome, Nathan!! +* French translation stub! Thanks, Jean-Jacques Valliet! + +### 2012-11-15 +* WARP block moved up in Control palette (for better discoverability) + +### 2012-11-14 +* first experimental Web Audio API version, sine-wave only. Thanks, Achal! +* new blocks: TEMPO, REST FOR n BEATS, PLAY NOTE, CHANGE TEMPO, SET TEMPO +* currently only fully supported by Safari + +### 2012-11-12 +* Simplified Chinese translation! Wohoo, thanks, 邓江华 ! + +### 2012-11-09 +* Widgets: fixed minor rendering bugs for dialog boxes +* GUI, Blocks: changed control bar layout, added cloud button (under construction...) +* new module stub: cloud.js (likewise under construction) + +### 2012-11-07 +* Morphic: new slider edit event, updated documentation (text editing) +* blocks, GUI: New "Execute on slider change" option for "live coding" + +### 2012-11-06 +* Morphic: Menu re-vamp, now supporting multi-line items, icons, and icon-text pairs + +### 2012-11-05 +* GUI, Objects: Pressing `` triggers the green flag, the red stop sign + +### 2012-10-30 +* Morphic: allow edited text scrolling to be disabled + +### 2012-10-29 +* Czech translation! Woohooo, thanks, Michael Moc! +* translations now dynamically load and unload. Thanks, Nathan, for the hint! +* Morphic now supports `` + a on Macs, thanks, Davide! + +### 2012-10-26 +* fix: Process inputOption() backward compatibility for localizable drop-down options + +### 2012-10-25 +* Korean translation! Woohooo, thanks, Yunjae Jang! +* Portuguese translation! Wohoo, thanks, Manuel Menezes de Sequeira! +* Morphic optimizations in FrameMorph and InspectorMorph, thanks, Davide! +* removed defunct "Open Projekt" entry in lang-de.js, thanks, Manuel! + +### 2012-10-24 +* sprite sequence in corral can be ordered via drag & drop (& persists) + +### 2012-10-23 +* added "Edit label fragment" to translator dictionary +* minor fix in language changing mechanism +* minor fix re. block rendering (hole erasing) b/c of new ascenders +* minor fix re. dialog box rendering b/c of new ascenders +* minor fix re. dialog box shadow rendering. Thanks, Brian, for spotting this! + +### 2012-10-22 +* Japanese(Kanji and Hiragana) translations! Woohooo, thanks, Kazuhiro Abe! +* IF ON EDGE BOUNCE fix. Thanks, Stefano! +* additional localization strings and snap.html fix, thanks, Kazuhiro Abe! +* global / local watcher label fix. Thanks, Nathan! +* Morphic: Text scrolling when editing. Thanks, Nathan and Stefano! +* Morphic: Took out WorldMorph.trailsCanvas handling, thanks, Davide! +* Morphic text rendering ascender space fix (+ adjustments mostly everywhere) + +### 2012-10-19 +* the costumes tab now also displays the default "Turtle" icon symbols +* fixed a small scoping bug in Morphic's touched event (thanks, Davide!) +* new version of lang-it.js (thanks, Stefano!) + +### 2012-10-18 +* minimal translation dict updates ('rename costume' and 'rename sound') + +### 2012-10-17 +* Italian translation! Woohooo, thanks, Stefano! +* added "unringify" to translator dictionary, thanks, Stefano! +* fixed a require() bug in XML, thanks, Nathan! +* fixed #run: URL switch. #run: is now officially supported! + +### 2012-10-16 +* fixed clicking sound entry in the settings menu +* input slots are now deselected on losing focus +* fix: Cannot delete the only label part in a custom block prototype anymore +* button acknowledgement label now spells 'OK' instead of 'Ok' +* fix: Cannot create unnamed ('') variables anymore +* fix: ScriptVariables' names' spaces are now normalized & can't be set to empty ('') +* changed wording of "Import" tooltip +* Thanks, Nathan, for spotting and reporting these bugs! +* added localization for block definition deletion and about dialogs +* edits in the sprite name field no longer need to be acknowledged by pressing `` +* new file: Translation Guide (translating Snap.txt) + +### 2012-10-15 +* Morphic: New "reactToKeystroke()" events are escalated when editing strings/texts +* Blocks, Threads, Objects, Store: InputSlots now have localizable menu options +* GUI, Locale, lang-de: localization re-organized (now considered complete for LTR) + +### 2012-10-10 +* generalized localization hooks merged into Morphic.js and Widgets.js +* Morphic: TextMorphs (multi-line strings) now support text shadows (used in widgets) + +### 2012-10-04 +* Morphic: triggering "reactToEdit" when text editing is terminated + +### 2012-10-02 +* basic localization mechanism, use settings menu to switch languages +* German translation (for testing), #lang:de launches Snap! localized + +### 2012-09-25 +* xml.js: escape tilde character to avoid file corruption thru serializer.store() + +### 2012-09-24 +* threads.js fix for REPORT inside C-Slots (pop another frame under certain conditions) + +### 2012-09-20 +* js: blocks, byob, morphic, objects, threads, widgets edited for latest JSLint + +### 2012-09-19 +* store.js: minor fixes +* gui.js: URL #open: feature now works with all importable resources (e.g. blocks) + +### 2012-09-18 +* comments (non-sticky) +* ScriptsMorph duplicating fix +* block editor cleanUp fix (prototype hat always stays on top) +* block editor persistence of free-floating objects (scripts, comments) + +### 2012-09-14 +* store.js: fix for loading variables containing reporters and unevaluated inputs + +### 2012-09-13 +* morphic.js: Refactoring to conform with JSHint's line breaking checks +* new morphic.txt documentation version +* new version of "Contributing to BYOB4" guideline with section on coding style +* exporting & importing sprites + +### 2012-09-12 +* serialization adjustments (app attribute in top-level XML node) +* same-named custom block conflict detection and resolution +* overloading of custom blocks with samed-named imported ones +* cascaded block library support (block sets depending on each other) + +### 2012-09-11 +* exorting & importing global custom blocks + +### 2012-09-10 +* exporting global custom blocks (beginning) +* byob.js: BlockExportDialogMorph (beginning) + +### 2012-08-30 +* custom block definition export (disabled for now) +* zebra-coloring fix (for Hummingbird-video bug) +* any number of script vars possible + +### 2012-08-16 +* SNAP! Connection Strategy +* OS-native File Dialog for importing projects, pictures, sounds (also for Safari 6) + +### 2012-08-15 +* octagonal stop sign symbol +* cache manifest +* SWITCH TO COSTUME (-1) goes back one costume in the list & wraps around +* Variable blobs can be renamed + +### 2012-08-14 +* fix: disappearing and undraggable sprite bug (thanks, Kirk!) +* widgets: ToggleMophs can now have two different labels/symbols to reflect their state +* gui/blocks: switching symbols for all toggles, re-introducing the green flag symbol + +### 2012-08-13 +* dev-mode reporter for FRAMES for thread performance monitoring +* minor refactoring of store.js to conform with the latest JSLint + +### 2012-08-10 +* blocks: bug fix for input accessing in variable drop-downs +* dev-mode reporter for STACK SIZE for tail-call-elimination monitoring + +### 2012-08-09 +* Pause button: Pauses/resumes all currently active stage processes (scripts) +* blocks: minor performance tweaks + +### 2012-08-08 +* Morphic, GUI, blocks, BYOB: More "gentle" font control (can be overridden by browser) +* BYOB: new "Apply" button in the block editor (updates definition keeping editor open) +* BYOB: editing custom block prototpyes preserves existing inputs in custom block instances + +### 2012-08-07 +* SymbolMorphs for object type slot and identifier, and for "new sprite" button +* Verdana font preference for block labels (wider) +* store fix: Watcher label for "answer" now survives save/load (Thanks, Tom!) + +### 2012-08-06 +* blocks: SymbolMorph replaces Unicode characters for "green flag" and "stop" signs +* widgets: allow SymbolMorphs as button labels, new layout rule: minLabelExtent for buttons +* gui: button layouts moved to minLabelExtent rule +* fix: prevent drops on multi-arg arrows +* SymbolMorphs for all items in the GUI's tool bar + +### 2012-08-03 +* blocks fix: enable reporter drops on empty rings in "prefer empty slot drops" mode + +### 2012-08-02 +* threads: Invoking a lambda with empty input slots without arguments binds them to '' +* blocks/gui/byob: MultiArg layout fix +* "Clicking sound" option in the settings menu + +### 2012-08-01 +* JOIN can now have any number of input slots, and be CALLed with an input list + +### 2012-07-31 +* lists fix: preserve zero/false values when assigned in list blocks +* threads refactored (eliminated now redundant context.isInsideCustomBlock attribute) +* blocks/byob: mutable formal parameters for custom block definitions and rings +* threads: CHANGE VAR typecasting bug fixed + +### 2012-07-30 +* adjust REPORT / STOP BLOCK semantics (special case implicit C-shaped slot lambdas) + +### 2012-07-28 +* speech bubble scaling +* Boolean value representations in operator color (green) +* eliminated "ring" type + +### 2012-07-26 +* REPORT primitive moved to STOP blocks in palette +* graphical representation of Boolean values in watchers and bubbles +* fix: empty numerical input slots evaluate to zero (thanks, Stephen!) + +### 2012-07-25 +* fix: SET PEN COLOR no longer offsets the sprite +* settings menu: optional input sliders (for Android) + +### 2012-07-24 +* Color collision detection & thumbnail adjustments and fixes, incl. helpscreens + +### 2012-07-23 +* Color collision detection (first rough pass) + +### 2012-07-20 +* fix: textify zero and false values in JOIN primitive (don't skip) + +### 2012-07-19 +* graphic effects (currently only "ghost") for the stage +* new feature: Pen trails collision detection +* fix: Keystroke detection + +### 2012-07-18 +* fix: catch nil inputs in motion and looks primitives +* fix: answer variable value Boolean false not as zero +* GUI: window-reflow adjustments +* store fix: Booleans retain their type thru save/load (not converted to Strings) +* threads fix: using REPORT/STOP BLOCK inside a WARP block now stops warping + +### 2012-07-17 +* costumes/sounds: omit filename suffixes when importing +* costumes/sounds: rename via context menu +* costumes: export via context menu +* thumbnails: are now centered within their widgets + +### 2012-07-16 +* Morphic scroll frames: customizable "growth" property, used in scripting panes +* store: Sprites' visibility state gets persisted thru save/load +* store: Watchers' visibility attribute format now same as sprites' (hidden="true") +* BYOB fix: Custom block prototype rendering fix when opening a Block Editor instance +* blocks fix: Predicate slots no longer turn into reporter slots upon save/load +* blocks fix: made dropping reporters into empty slots easier when preferring empty slots + +### 2012-07-13 +* objects fix: zero values now show up in watchers (are no longer blank) +* objects fix: dragged sprites now keep their correct relative stage coordinates +* threads fix: dragged sprites are identifiable by running scripts + +### 2012-07-12 +* small stage mode (for bigger scripting area, e.g. in lectures or on mobiles) + +### 2012-07-11 +* app mode: arbitrary stage scaling (auto-resizes to fill the browser's client area) + +### 2012-07-10 +* app mode related adjustments to blocks.js, gui.js and threads.js +* fix: line breaks in project notes are now preserved thru export/import (xml) + +### 2012-07-09 +* xml decoding fix +* app mode, first rough pass (no stage scaling yet) + +### 2012-07-05 +* store: stage watchers monitoring lists remember their dimensions + +### 2012-07-04 +* major refactoring of serialization (new xml.js, store.js) + +### 2012-07-03 +* GUI: open a project from URL via #open:URL +* GUI: run a project from data via #run:XML or from URL via #run:URL + +### 2012-07-02 +* store fix: Newly loaded projects did not get keyboard events (now they do) +* threads fix: Evaluating STOP ALL did not stop sounds (now it does) + +### 2012-06-29 +* Morphic: StringMorphs now have the option to visualize blanks (as colored dots) +* Blocks: all input slots (in blocks) are now visualizing blanks +* GUI: re-ordering sounds via drag & drop +* GUI copying sounds among sprites via drag & drops on corral icons + +### 2012-06-28 +* GUI: re-ordering costumes via drag & drop +* GUI: copying costumes among sprites via drag & drop on corral icons + +### 2012-06-27 +* blocks/store/objects/threads fix: STOP BLOCK gets converted to REPORT on save/reload +* byob/GUI: new entry in the settings menu to always show input dialog in long form +* blocks/GUI: new entry in the settings menu to prefer empty slots for reporter drops +* blocks: in scripting areas rings and variable reporters can be nested inside each other +* in general rings will not vanish on ring/var drop if already inside other rings +* context menu help feature for blocks + +### 2012-06-26 +* blocks/threads fix: "any unevaluated" slots now reify their typed-in input values +* byob/threads fix: custom block definition reification now ignores empty-slot bindings +* GUI: copying scripts among sprites via drag & drop on corral icons (first rough version) + +### 2012-06-25 +* objects fix: changing pen properties sometimes offsets the sprite +* blocks: variable slots no longer accept reporter drops (Jens regrets but doesn't agree to auto-ringify dropped variable blobs at this stage of development) +* blocks: better (yet) control over where reporters can be dropped +* blocks fix: sometimes reporters cannot be dropped into slots in the block editor +* threads: comparing strings (the = block) is now case-insensitive +* threads/blocks: multi-args can now be eval'ed with variadic inputs +* lists: equality testing fix for mixed linked/arrayed lists (thanks, Brian!) +* LIST primitive with new, static input spec +* store: stage watcher styles (small, large, slider) are now persistent thru save/re-load +* objects: stage watcher slider min/max is now settable thru context menu +* store: stage watcher slider min/max are now persistent through save/re-load + +### 2012-06-22 +* changed license to AGPL (all modules and documentation) + +### 2012-06-21 +* POINT TOWARDS and GO TO primitive command blocks in the motion category + +### 2012-06-20 +* Morphic/Blocks: More precise control over where reporters are dropped and snap +* Morphic documentation update + +### 2012-06-19 +* store.js fixes for empty, non-editable input slots (e.g. list and boolean slots) +* objects.js/byob.js fixes for editing recursive custom blocks + +### 2012-06-18 +* GUI: Screenshot feature +* GUI, store.js: Error catching turned off in dev mode (for debugging store.js) +* store.js: saving / loading of sprites' scale, draggability and rotation style +* Morphic/GUI: Virtual keyboard support can be toggled (to hide caret in Opera etc.) +* GUI, store.js: Saving / loading of "thread safety" setting +* blocks caching limited to primitives +* introducing palette caching + +### 2012-06-15 +* store.js: Stage vars (watchers) fix +* store.js: Empty (bodiless) custom blocks fix +* store.js: Global custom blocks support + +### 2012-06-14 +* store.js: Global vars fix (xml.js deprecated) + +### 2012-06-13 +* new module: xml.js, a simple XML DOM/encoder/parser for Morphic.js + +### 2012-06-12 +* global custom blocks (first pass, no serialization yet) + +### 2012-06-11 +* Morphic: auto-detect Chrome issue 90001 and set "useBlurredShadows" appropriately +* Blocks: solid block highlighting (as in Scratch 1.4) when "useBlurredShadows == false" +* GUI: Settings menu entry for blurred / solid shadows and highlights +* Threads: Type checking, primitive in the operators category + +### 2012-05-25 +* late-binding custom blocks, changes in threads.js, byob.js and store.js (et al.) + +### 2012-05-23 +* Morphic: single-touch-and-hold pops up the context menu +* Morphic: pinch-zoom and virtual keyboard improvements + +### 2012-05-22 +* Morphic/Blocks: SlideBackToFormerSituation + +### 2012-05-21 +* Pinch-Zoom for touchscreen devices +* Virtual keyboard for touchscreen devices + +### 2012-05-18 +* Morphic: better keystroke detection +* new interpolating HTTP reporter in the sensor palette + +### 2012-05-16 +* monadic OF primitive block in the operators category + +### 2012-05-15 +* GUI: disabled file dialog for now due to some issues +* Blocks/BYOB: Prototype block zebra coloring adjustment +* Store: minor fixes in the blocks dictionary + +### 2012-05-14 +* Morphic: droppedText() event +* GUI: opening project files via drag & drop +* GUI: invoking the file dialog to open projects, import costumes and sounds +* Threads: nested upvar fix +* Threads: hybrid variable scope taken out (it's all lexical again for now) +* Blocks/BYOB: zebra-coloring related fixes + +### 2012-05-09 +* exporting projects (holding the shift key URI-encodes the XML) + +### 2012-05-07 +* reification: omit empty slots inside nested lambdas for implicit parameters +* display fixes for rings inside rings +* DISTANCE TO reporter block primitive in the sprite's sensing category + +### 2012-05-04 +* rotation style support for sprite "turtle" costume +* rotation style buttons hidden for stage +* export background-less pictures of scripts +* sprite draggability control checkbox (in the IDE's sprite bar) + +### 2012-05-03 +* text- and object- type slots (and hints) +* zebra coloring fixes for input slots with pull-down menus +* costume flipping +* rotation styles + +### 2012-05-02 +* settings menu item for toggling zebra coloring +* new thumbnail() for StageMorph +* store.js: Fixes for local storage in local instance ("airplane saving") + +### 2012-04-25 +* unringify menu item for Blocks +* evaluator: variable setters can refer to variables by their reified getters + +### 2012-04-30 +* zebra coloring (first pass) + +### 2012-04-24 +* Rings (first pass completed) + +### 2012-04-20 +* Rings (basics) + +### 2012-04-17 +* Snap! Build Your Own Blocks. Alpha + +### 2012-04-16 +* custom block prototype slot type and default value indicators +* Sounds, first pass (thanks, Ian!) + +### 2012-04-03 +* ASK/ANSWER for the stage + +### 2012-04-06 +* ASK/ANSWER for sprites + +### 2012-04-03 +* minWidth property for SyntaxElements + +### 2012-04-02 +* pressing the stop sign makes all speech bubbles disappear +* null continuations now behave the same as STOP SCRIPT blocks + +### 2012-04-01 +* settings menu: touchscreen settings +* thread safety option +* store.js: Costumes & pen trails support. Thanks, Nathan! +* context menus for watchers (thx, Nathan!) + +### 2012-03-31 +* Stage: extra pen trail layer +* Morphic: texture handling (eliminating canvas patterns b/c of Chrome problems) +* Objects: motion precision fixes + +### 2012-03-29 +* Sprites: the rotation center now is the pen tip + +### 2012-03-28 +* Costumes: rotation center functionality + +### 2012-03-27 +* Costumes, first iteration + +### 2012-03-23 +* Morphic: handle multiple image file drops + +### 2012-03-22 +* GUI: WardrobeMorph +* Slider and ScrollFrame colors + +### 2012-03-21 +* Costume, CostumeEditorMorph, CostumeIconMorph + +### 2012-03-20 +* Morphic: droppedImage() event + +### 2012-03-19 +* THREADS: unevaluated inputs +* Morphic: detect and respect minimum font size renderable +* Morphic: text selection display fix for FF + +### 2012-03-16 +* long form input dialog speedup (pictograms are now plain pictures instead of Toggles) +* Morphic: Morphs behind another one no longer receive mouseEnter/mouseLeave events +* Blocks: ScriptPanes behind other Morphs no longer show drop target feedbacks + +### 2012-03-15 +* Morphic: colored shadows +* Widgets: ToggleMorph with embedded toggle elements +* pictographic slot type buttons in the long form input dialog +* palette speedup +* Error message when RUN/CALL/LAUNCHing a block w/o passing the expected no. of inputs +* Illegal drops prevented in user mode (enabled in dev mode) + +### 2012-03-14 +* JOIN becomes variadic (Jens isn't enthusiastic about it) +* About text changed according to Mitch's suggestion +* BYOB: JaggedBlockMorph +* pictographic type buttons in the short form input dialog + +### 2012-03-13 +* Widgets: ToggleElementMorph, TabMorph +* BlockEditor: Pictographic type buttons +* IDE: Tabs for scripts/costumes/sounds + +### 2012-03-09 +* SAY _ FOR _ SECS primitive command block for Sprites +* Morphic: thought bubble display variant of SpeechBubbleMorph +* THINK and THINK FOR SECS primitive command blocks for Sprites +* STAMP primitive command block for Sprites +* ROUND, JOIN, LETTER OF, LENGTH OF, UNICODE OF and UNICODE AS LETTER primitive reporters + +### 2012-03-08 +* Morphic: SpeechBubbleMorph orientation left/right +* Threads: empty block definitions no longer raise an exception +* SAY primitive command block for Sprites + +### 2012-03-07 +* object collision detection (TOUCHING? predicate block for Sprites) +* poly-key state detection + +### 2012-03-06 +* Morphic: prevent text edits from reversing +* added "WITH INPUT LIST" variants for RUN/LAUNCH/CALL primitives - commented out +* changed '%inputs' slot type to non-static (makes "w/input list" redundant) +* Threads: fixed tail-call optimization induced bug in pushContext() +* WHEN I AM CLICKED hat block (control) +* WHEN KEY PRESSED hat block (control) +* MOUSE DOWN? predicate (sensing) +* KEY PRESSED? predicate (sensing) + +### 2012-03-05 +* upvars +* globals vars serialization fix +* MultiArgs: shift-clicking on an arrow repeats action 3 times + +### 2012-03-01 +* store.js: color slot and global vars patch (thanks, Nathan!) +* blocks.js: bug fix for drop-down menus (wouldn't allow selecting empty) + +### 2012-02-29 +* global variables +* hybrid lists CDR fix (thanks, Brian!) +* debugging primitives (alert, console.log) in development mode +* all libraries edited to conform to JsLint's latest petty rules ('else' after 'return') + +### 2012-02-26 +* primitive control structures adjusted to new REPORT rule + +### 2012-02-24 +* STOP BLOCK primitive +* error catching turns off in development mode (on in user mode) + +### 2012-02-22 +* Morphic: Tabbing among input fields fix +* Threads: REPORT primitive fix + +### 2012-02-21 +* user and development modes (shift-click on Snap! logo) +* Open Project dialog (thanks, Nathan) +* blocks caching for primitives and custom blocks +* custom block prototype edits visible in the palette while editing +* sprite duplication +* custom block definition duplication and re-binding +* the only sprite in the IDE is now deletable +* primitive blocks for GHOST effect + +### 2012-02-17 +* Morphic: introducing combined mouse-keyboard events +* GUI: Project label + +### 2012-02-16 +* saving & loading, xml serialization, thanks, Nathan! + +### 2012-02-15 +* scriptable and programmable stage, selectable in the corral +* stage watchers with "active", auto-updating object name labels +* IF ON EDGE BOUNCE primitive, still buggy +* GUI fixes, all frame morphs in the corral now reject object drops + +### 2012-02-14 +* multiple sprites & lots of new stuff in all modules +* Morphic: dragging optimization +* Nathan's fixes to Morphic (shadow fix, mouse wheel fix) + +### 2012-02-09 +* Morphic: formatting capabilities for Menus and ListMorphs +* Morphic: optional 'own properties' highlighting in the Inspector's "show" menu + +### 2012-02-08 +* categories and block type editing for existing custom blocks + +### 2012-02-07 +* BYOB: categories (colors) for new custom blocks + +### 2012-02-06 +* Morphic: color specifiable in String() constructor +* Widgets: ToggleButtonMorphs +* Objects: block categories +* GUI: tabbed palette mock-up (not yet within a real GUI) + +### 2012-02-03 +* Morphic: horizontal mouse wheel scrolling (thanks for this fix, Nathan!) +* more primitives in the Pen category + +### 2012-02-02 +* more primitives in Motion, Looks and Pen categories + +### 2012-02-01 +* upvars in %var slot drop-down menu + +### 2012-01-31 +* upvar GUI in input slot long form dialog (w/o upvar functionality) + +### 2012-01-30 +* input slot long form dialog - multiple inputs +* input slot long form dialog - default input values + +### 2012-01-27 +* input slot long form dialog - basic (single) input types + +### 2012-01-25 +* STORE: serializing, saving and loading projects, first pass, all by Nathan +* HatBlock bezier curve fixed width +* settings for AlignmentMorph regarding handling of hidden Morphs +* GUI enhancements +* input slot long form dialog variant outline +* pointless filters in most FORINS in response to Nathan's derogatory comments :-) + +### 2012-01-23 +* Threads: tail call elimination + +### 2012-01-20 +* Morphic: question mark input for WebKIT 2 compatibility (does it break on Windows?) +* Morphic: turtle tracks round endings for WebKIT 2 compatibility (cannot use closePath()) + +### 2012-01-19 +* MOD, TRUE and FALSE reporter blocks +* AND, OR, NOT reporter blocks +* BROADCAST AND WAIT command block + +### 2012-01-15 +* BlockLabelPlaceHolderMorphs +* BlockInputDialogMorph (short form) + +### 2012-01-09 +* Morphic: single quote input for WebKIT 2 compatibility +* BYOB: BlockInputFragmentMorphs + +### 2012-01-06 +* InputSlotEditor basics +* bigger tick for radio buttons +* PushButtons redone for WebKIT 2 compatibility + +### 2011-12-14 +* feature: deleting block instances and custom block definitions + +### 2011-12-13 +* call/cc for lambdas and custom blocks + +### 2011-12-12 +* BlockDialogMorph (basics) +* CustomReporterBlockMorph + +### 2011-12-09 +* BlockEditor basics for CustomCommandBlocks + +### 2011-12-07 +* byob.js (CustomBlockDefinition, CustomCommandBlockMorph) + +### 2011-12-05 +* new primitives: MOUSE X, MOUSE Y, TIMER, RESET TIMER + +### 2011-12-02 +* Widgets: InputFieldMorphs +* Prompters based on DialogBoxes +* Renaming of input templates +* Morphic keyboard enhancements + +### 2011-11-30 +* Widgets: AlignmentMorphs +* keyboard events for DialogBoxMorphs + +### 2011-11-29 +* Widgets: DialogBoxMorph basics + +### 2011-11-28 +* layout optimization merged into Morphic.js -> trackChanges + +### 2011-11-24 +* layout optimization for dropped and snapping blocks (thanks, John!) +* Equality testing for lists (thanks, Brian!) + +### 2011-11-23 +* hybrid lists (arrayed and linked) +* CONS and CDR + +### 2011-11-21 +* Atomicity (WARP) +* REPEAT UNTIL +* WAIT UNTIL + +### 2011-11-18 +* Lists: watcher shows list range (speed-up, stability) + +### 2011-11-16 +* Lists: conservative watcher updating (speed-up) +* GUI: logo pane and 'about' box + +### 2011-11-15 +* Morphic: more tolerant grabbing +* Lists: synchronized Watcher updating (speed-up) + +### 2011-11-14 +* Morphic: fullImageClassic() for ListWatcherMorphs +* Threads: MultiArgMorph now use Lists instead of JS-Arrays +* List Blocks +* GUI: adding/removing variables doesn't make the palette jump to the top +* Blocks: list type slots + +### 2011-11-11 +* Morphic: visibleBounds() bug fix + +### 2011-11-09 +* ListWatchers (basics) + +### 2011-11-08 +* Lists + +### 2011-11-03 +* widgets: ToggleMorphs (check boxes and radio buttons) +* non-variable watchers +* checkbox toggling for variable watchers + +### 2011-11-02 +* Morphic: StringMorph shadows + +### 2011-10-31 +* new: widgets.js +* PushButtons + +### 2011-10-27 +* more extensive Error catching +* slider for numerical text entries in "mobile mode" +* bigger blocks in "mobile mode" + +### 2011-10-26 +* Blocks: empty choice for input drop down menus +* automatic positioning of new watchers +* watchers on temporary variables are deleted by HIDE VARIABLE block (not hidden) +* HIDE VARIABLE with empty input deletes all watchers on temporary vars + +### 2011-10-25 +* GUI: WatcherMorphs +* SHOW VARIABLE, HIDE VARIABLE blocks + +### 2011-10-21 +* GUI: CellMorphs (for stage watchers) + +### 2011-10-20 +* unevaluated FunctionSlotMorphs (%f) +* autolambdafying ReporterSlotMorphs (%r, %p) + +### 2011-10-19 +* Morphic: scrolling speedup + +### 2011-10-17 +* another take on continuations + +### 2011-10-12 +* autolambdafying CSlotMorphs (C-shaped) and CommandSlotMorphs (inline) +* Morphic: right mouse click emulation for Mac + +### 2011-10-10 +* hybrid scope + +### 2011-10-09 +* call/cc + +### 2011-10-07 +* swooshy hat block tops (instead of circle segments) + +### 2011-10-06 +* force yield after timeout + +### 2011-09-28 +* GLIDE block + +### 2011-09-27 +* WAIT block + +### 2011-09-26 +* basic message broadcasting +* thread forking (LAUNCH block) + +### 2011-09-23 +* error catching for block evaluation + +### 2011-09-22 +* implicit parameters + +### 2011-09-19 +* formal parameters +* recursion +* closures + +### 2011-09-14 +* c-slots in primitives are now static by default +* basic THE BLOCK, CALL and REPORT + +### 2011-09-13 +* basic Lambda primitives +* basic Lambda visualization (showBubble) + +### 2011-09-12 +* Threads: renamed StackFrame to Context +* Blocks: persistent input default values + +### 2011-09-11 +* Morphic: PenMorph.setHeading() fixed + +### 2011-08-26 +* TemplateSlotMorphs (%t, %mult%t, %scriptVars) +* script variables +* lockable inputs + +### 2011-08-24 +* numerical virtual keyboard (pop-up-sliders - taken out again) +* sliders now work with negative floor numbers +* mouse wheel scroll events (thanks, Nathan!) + +### 2011-08-23 +* Sprite-scoped variables + +### 2011-08-18 +* optimizations for menu bubble help and Blocks layout + +### 2011-08-17 +* Threads: evaluating reporters +* showValue bubbles + +### 2011-08-16 +* Morphic: SpeechBubbleMorphs and bubble help for menus/buttons + +### 2011-08-11 +* Morphic: broken rect fix for float-positioned Morphs +* Blocks: straight bottom edges for stop-blocks +* PenMorph: round line ends + +### 2011-08-10 +* nasciturus: objects, gui + +### 2011-08-04 +* evaluator: ThreadManager, Process, StackFrame, VariableFrame + +### 2011-07-27 +* Morphic: fullBounds() now ignores hidden submorphs +* MultiArgMorphs: Optional label and minimum inputs settings, '%inputs' +* Morphic: simplified BoxMorph rendering +* Same-colored (white), semi-transparent reporter drop feedbacks + +### 2011-07-26 +* MultiArgMorphs (%mult%x) + +### 2011-07-22 +* stringField settable as numeric, supresses textual input +* editable numeric input slots supress textual type-in +* evaluation helper methods and properties +* collision detection + +### 2011-07-21 +* scrollBarSize can now optionally be specified individually +* block highlighting +* specs for any-unevaluated and Boolean-unevaluated inputs + +### 2011-07-20 +* HatBlocks + +### 2011-07-19 +* high-level documentation and code comments +* optional blurred slot shades (off by default) + +### 2011-07-18 +* ColorSlotMorphs (%clr) +* collision detection groundwork + +### 2011-07-14 +* optional drop-down menu for type-in slots +* read-only menus for type-in slots (%inst, %var, %lst, %obj, %eff, + %dir, %cst, %snd, %key, %idx, %msg, %att, %fun, %typ) +* global pixel color sensing +* renamed TypeInSlotMorph to InputSlotMorph + +### 2011-07-12 +* rectangular reporter layout +* label mutli-line wrapping for reporters +* user-definable label line breaks (%br) +* font size customizable for individual menus +* ArrowMorphs + +### 2011-07-11 +* optional intra-block-label word wrap (flag) layout setting + +### 2011-07-08 +* extrapolate blockSpec upon label part drop + +### 2011-07-07 +* BlockMorph color changing +* entry field tabbing (Firefox and Opera only) +* label multi-line wrapping for command blocks + +### 2011-07-06 +* BooleanSlotMorphs (%b) +* Color mixing +* contrast setting for SyntaxElementMorphs +* exit confirmation + +### 2011-07-05 +* block specs + +### 2011-06-30 +* StringMorphs and TextMorph notify their parents of layout changes +* TypeInSlotMorphs (round - %n - and rectangular - %s -) + +### 2011-06-28 +* World menu in every Morph's developersMenu +* changed the standard to "sharp shadows" because of Firefox5 bug + +### 2011-05-31 +* ReporterBlockMorphs + +### 2011-05-30 +* C-slots only attach to blocks' tops (no longer also to bottoms) + +### 2011-05-27 +* Templates +* Padding for ScrollFrames + +### 2011-05-24 +* CommandSlotMorphs (%c) + +### 2011-05-18 +* Textures + +### 2011-05-16 +* Autoscrolling + +### 2011-05-11 +* Scrolling by dragging +* Scrolling by dragging velocity diff --git a/elements/pl-snap/Snap/LICENSE b/elements/pl-snap/Snap/LICENSE new file mode 100644 index 00000000..710ccc04 --- /dev/null +++ b/elements/pl-snap/Snap/LICENSE @@ -0,0 +1,661 @@ +GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + + Preamble + +The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + +A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + +The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + +An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + +The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + +0. Definitions. + +"This License" refers to version 3 of the GNU Affero General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + +An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +1. Source Code. + +The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + +The Corresponding Source for a work in source code form is that +same work. + +2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + +3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + +4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + +a) The work must carry prominent notices stating that you modified +it, and giving a relevant date. + +b) The work must carry prominent notices stating that it is +released under this License and any conditions added under section +7. This requirement modifies the requirement in section 4 to +"keep intact all notices". + +c) You must license the entire work, as a whole, under this +License to anyone who comes into possession of a copy. This +License will therefore apply, along with any applicable section 7 +additional terms, to the whole of the work, and all its parts, +regardless of how they are packaged. This License gives no +permission to license the work in any other way, but it does not +invalidate such permission if you have separately received it. + +d) If the work has interactive user interfaces, each must display +Appropriate Legal Notices; however, if the Program has interactive +interfaces that do not display Appropriate Legal Notices, your +work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + +a) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by the +Corresponding Source fixed on a durable physical medium +customarily used for software interchange. + +b) Convey the object code in, or embodied in, a physical product +(including a physical distribution medium), accompanied by a +written offer, valid for at least three years and valid for as +long as you offer spare parts or customer support for that product +model, to give anyone who possesses the object code either (1) a +copy of the Corresponding Source for all the software in the +product that is covered by this License, on a durable physical +medium customarily used for software interchange, for a price no +more than your reasonable cost of physically performing this +conveying of source, or (2) access to copy the +Corresponding Source from a network server at no charge. + +c) Convey individual copies of the object code with a copy of the +written offer to provide the Corresponding Source. This +alternative is allowed only occasionally and noncommercially, and +only if you received the object code with such an offer, in accord +with subsection 6b. + +d) Convey the object code by offering access from a designated +place (gratis or for a charge), and offer equivalent access to the +Corresponding Source in the same way through the same place at no +further charge. You need not require recipients to copy the +Corresponding Source along with the object code. If the place to +copy the object code is a network server, the Corresponding Source +may be on a different server (operated by you or a third party) +that supports equivalent copying facilities, provided you maintain +clear directions next to the object code saying where to find the +Corresponding Source. Regardless of what server hosts the +Corresponding Source, you remain obligated to ensure that it is +available for as long as needed to satisfy these requirements. + +e) Convey the object code using peer-to-peer transmission, provided +you inform other peers where the object code and Corresponding +Source of the work are being offered to the general public at no +charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + +a) Disclaiming warranty or limiting liability differently from the +terms of sections 15 and 16 of this License; or + +b) Requiring preservation of specified reasonable legal notices or +author attributions in that material or in the Appropriate Legal +Notices displayed by works containing it; or + +c) Prohibiting misrepresentation of the origin of that material, or +requiring that modified versions of such material be marked in +reasonable ways as different from the original version; or + +d) Limiting the use for publicity purposes of names of licensors or +authors of the material; or + +e) Declining to grant rights under trademark law for use of some +trade names, trademarks, or service marks; or + +f) Requiring indemnification of licensors and authors of that +material by anyone who conveys the material (or modified versions of +it) with contractual assumptions of liability to the recipient, for +any liability that these contractual assumptions directly impose on +those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + +8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + +13. Remote Network Interaction; Use with the GNU General Public License. + +Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + +14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + +If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + +17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + +Copyright (C) + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + +If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + +You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/elements/pl-snap/Snap/README.md b/elements/pl-snap/Snap/README.md new file mode 100644 index 00000000..aacc131e --- /dev/null +++ b/elements/pl-snap/Snap/README.md @@ -0,0 +1,60 @@ +![Snap! Logo](src/snap_logo_sm.png) +# Snap! Build Your Own Blocks + +[https://snap.berkeley.edu][snap] + +**[Try Snap! Now](https://snap.berkeley.edu/snap/)** + +a visual, blocks based programming language +inspired by Scratch + +written by Jens Mönig and Brian Harvey +jens@moenig.org, bh@cs.berkeley.edu + +## Snap! Community + +This repository contains the source code for Snap! IDE. If you have +questions about using Snap!, please check out [the Snap! Forum][forum]. + +We also maintain an active community at [snap.berkeley.edu][snap], +where you can save and share your own projects. You can also +[check out the code][snapcloud], if you're curious. + +[snap]: https://snap.berkeley.edu +[snapcloud]: https://github.com/snap-cloud/snapCloud +[forum]: https://forum.snap.berkeley.edu + +## Security + +If you have security concerns, please do not post them publicly. +Please reach out to us at [contact@snap.berkeley.edu](mailto:contact@snap.berkeley.edu). + +## Documentation + +The definitive source of how to use Snap! is the [Snap! Manual](help/SnapManual.pdf). + +* [API.md](docs/API.md) describes the API for modifying the Snap! interface. +* [Extensions.md](docs/Extensions.md) describes the basic interface for building JavaScript extensions for Snap! +* [Migrating.md](docs/Migrating.md) gives guidance for older extensions to migrate to Morphic 2 and Snap! v6. +* [Offline.md](docs/Offline.md) has instructions for running Snap! as a progressive web application. + +_Please read the [Contribution Guidelines](docs/CONTRIBUTING.md) before making an issue or pull request. Thanks!_ + +## License +Copyright (C) 2008-2024 by Jens Mönig and Brian Harvey + +Snap! is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of +the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +Want to use Snap! but scared by the open-source license? Get in touch with us, +we'll make it work. diff --git a/elements/pl-snap/Snap/Sounds/A_bass.wav b/elements/pl-snap/Snap/Sounds/A_bass.wav new file mode 100644 index 00000000..199466bc Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_elec_bass.wav b/elements/pl-snap/Snap/Sounds/A_elec_bass.wav new file mode 100644 index 00000000..cc9631df Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/A_elec_guitar.wav new file mode 100644 index 00000000..50d45924 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_elec_piano.wav b/elements/pl-snap/Snap/Sounds/A_elec_piano.wav new file mode 100644 index 00000000..8bab589f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_guitar.wav b/elements/pl-snap/Snap/Sounds/A_guitar.wav new file mode 100644 index 00000000..8cc732fc Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_minor_ukulele.wav b/elements/pl-snap/Snap/Sounds/A_minor_ukulele.wav new file mode 100644 index 00000000..8836aab1 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_minor_ukulele.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_piano.wav b/elements/pl-snap/Snap/Sounds/A_piano.wav new file mode 100644 index 00000000..d35bf5f4 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_sax.wav b/elements/pl-snap/Snap/Sounds/A_sax.wav new file mode 100644 index 00000000..0846ef13 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_trombone.wav b/elements/pl-snap/Snap/Sounds/A_trombone.wav new file mode 100644 index 00000000..7fdb72c2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/A_trumpet.wav b/elements/pl-snap/Snap/Sounds/A_trumpet.wav new file mode 100644 index 00000000..54bc9a51 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/A_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_bass.wav b/elements/pl-snap/Snap/Sounds/B_bass.wav new file mode 100644 index 00000000..58e2cf62 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_elec_bass.wav b/elements/pl-snap/Snap/Sounds/B_elec_bass.wav new file mode 100644 index 00000000..65daeb2e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/B_elec_guitar.wav new file mode 100644 index 00000000..5a452128 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_elec_piano.wav b/elements/pl-snap/Snap/Sounds/B_elec_piano.wav new file mode 100644 index 00000000..cfb56b79 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_guitar.wav b/elements/pl-snap/Snap/Sounds/B_guitar.wav new file mode 100644 index 00000000..d3469d36 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_piano.wav b/elements/pl-snap/Snap/Sounds/B_piano.wav new file mode 100644 index 00000000..e993de64 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_sax.wav b/elements/pl-snap/Snap/Sounds/B_sax.wav new file mode 100644 index 00000000..e38c005b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_trombone.wav b/elements/pl-snap/Snap/Sounds/B_trombone.wav new file mode 100644 index 00000000..4ba7102b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/B_trumpet.wav b/elements/pl-snap/Snap/Sounds/B_trumpet.wav new file mode 100644 index 00000000..f87ffd04 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/B_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_bass.wav b/elements/pl-snap/Snap/Sounds/C2_bass.wav new file mode 100644 index 00000000..fac06d54 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_elec_bass.wav b/elements/pl-snap/Snap/Sounds/C2_elec_bass.wav new file mode 100644 index 00000000..80c28b18 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/C2_elec_guitar.wav new file mode 100644 index 00000000..fb10b9a8 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_elec_piano.wav b/elements/pl-snap/Snap/Sounds/C2_elec_piano.wav new file mode 100644 index 00000000..2b198c6c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_guitar.wav b/elements/pl-snap/Snap/Sounds/C2_guitar.wav new file mode 100644 index 00000000..7596d446 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_piano.wav b/elements/pl-snap/Snap/Sounds/C2_piano.wav new file mode 100644 index 00000000..01e5176c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_sax.wav b/elements/pl-snap/Snap/Sounds/C2_sax.wav new file mode 100644 index 00000000..bd6d177b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_trombone.wav b/elements/pl-snap/Snap/Sounds/C2_trombone.wav new file mode 100644 index 00000000..b95107d4 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C2_trumpet.wav b/elements/pl-snap/Snap/Sounds/C2_trumpet.wav new file mode 100644 index 00000000..e89a2461 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C2_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_bass.wav b/elements/pl-snap/Snap/Sounds/C_bass.wav new file mode 100644 index 00000000..e6252425 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_elec_bass.wav b/elements/pl-snap/Snap/Sounds/C_elec_bass.wav new file mode 100644 index 00000000..ff4bd6a2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/C_elec_guitar.wav new file mode 100644 index 00000000..e4aa734c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_elec_piano.wav b/elements/pl-snap/Snap/Sounds/C_elec_piano.wav new file mode 100644 index 00000000..e79e086d Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_guitar.wav b/elements/pl-snap/Snap/Sounds/C_guitar.wav new file mode 100644 index 00000000..ad348a11 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_major_ukulele.wav b/elements/pl-snap/Snap/Sounds/C_major_ukulele.wav new file mode 100644 index 00000000..431d8d87 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_major_ukulele.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_piano.wav b/elements/pl-snap/Snap/Sounds/C_piano.wav new file mode 100644 index 00000000..250e793a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_sax.wav b/elements/pl-snap/Snap/Sounds/C_sax.wav new file mode 100644 index 00000000..9aa523af Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_trombone.wav b/elements/pl-snap/Snap/Sounds/C_trombone.wav new file mode 100644 index 00000000..ec345643 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/C_trumpet.wav b/elements/pl-snap/Snap/Sounds/C_trumpet.wav new file mode 100644 index 00000000..86dc1afc Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/C_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Cat.mp3 b/elements/pl-snap/Snap/Sounds/Cat.mp3 new file mode 100644 index 00000000..e65fdcab Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Cat.mp3 differ diff --git a/elements/pl-snap/Snap/Sounds/Chord.wav b/elements/pl-snap/Snap/Sounds/Chord.wav new file mode 100644 index 00000000..838ff3a1 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Chord.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_bass.wav b/elements/pl-snap/Snap/Sounds/D_bass.wav new file mode 100644 index 00000000..3e96b954 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_elec_bass.wav b/elements/pl-snap/Snap/Sounds/D_elec_bass.wav new file mode 100644 index 00000000..1a51d216 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/D_elec_guitar.wav new file mode 100644 index 00000000..78c9e1d2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_elec_piano.wav b/elements/pl-snap/Snap/Sounds/D_elec_piano.wav new file mode 100644 index 00000000..30d21b6b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_guitar.wav b/elements/pl-snap/Snap/Sounds/D_guitar.wav new file mode 100644 index 00000000..1ef4dbc8 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_piano.wav b/elements/pl-snap/Snap/Sounds/D_piano.wav new file mode 100644 index 00000000..96bcb257 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_sax.wav b/elements/pl-snap/Snap/Sounds/D_sax.wav new file mode 100644 index 00000000..5997e90a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_trombone.wav b/elements/pl-snap/Snap/Sounds/D_trombone.wav new file mode 100644 index 00000000..24fe6b47 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/D_trumpet.wav b/elements/pl-snap/Snap/Sounds/D_trumpet.wav new file mode 100644 index 00000000..71aa86b7 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/D_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Dog1.wav b/elements/pl-snap/Snap/Sounds/Dog1.wav new file mode 100644 index 00000000..1cbdbcc1 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Dog1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Dog2.wav b/elements/pl-snap/Snap/Sounds/Dog2.wav new file mode 100644 index 00000000..68e024c4 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Dog2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_bass.wav b/elements/pl-snap/Snap/Sounds/E_bass.wav new file mode 100644 index 00000000..32694ff6 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_elec_bass.wav b/elements/pl-snap/Snap/Sounds/E_elec_bass.wav new file mode 100644 index 00000000..e0b9a2a0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/E_elec_guitar.wav new file mode 100644 index 00000000..bf17cc4b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_elec_piano.wav b/elements/pl-snap/Snap/Sounds/E_elec_piano.wav new file mode 100644 index 00000000..36ebf3d4 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_guitar.wav b/elements/pl-snap/Snap/Sounds/E_guitar.wav new file mode 100644 index 00000000..599c91e3 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_piano.wav b/elements/pl-snap/Snap/Sounds/E_piano.wav new file mode 100644 index 00000000..60710850 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_sax.wav b/elements/pl-snap/Snap/Sounds/E_sax.wav new file mode 100644 index 00000000..b2ef5040 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_trombone.wav b/elements/pl-snap/Snap/Sounds/E_trombone.wav new file mode 100644 index 00000000..8a839e70 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/E_trumpet.wav b/elements/pl-snap/Snap/Sounds/E_trumpet.wav new file mode 100644 index 00000000..c69d9f0c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/E_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_bass.wav b/elements/pl-snap/Snap/Sounds/F_bass.wav new file mode 100644 index 00000000..27dc7124 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_elec_bass.wav b/elements/pl-snap/Snap/Sounds/F_elec_bass.wav new file mode 100644 index 00000000..6bcf4a43 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/F_elec_guitar.wav new file mode 100644 index 00000000..af3453f2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_elec_piano.wav b/elements/pl-snap/Snap/Sounds/F_elec_piano.wav new file mode 100644 index 00000000..75bdf6b5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_guitar.wav b/elements/pl-snap/Snap/Sounds/F_guitar.wav new file mode 100644 index 00000000..319565ec Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_major_ukulele.wav b/elements/pl-snap/Snap/Sounds/F_major_ukulele.wav new file mode 100644 index 00000000..3bb62f8c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_major_ukulele.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_piano.wav b/elements/pl-snap/Snap/Sounds/F_piano.wav new file mode 100644 index 00000000..3b06bc7e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_sax.wav b/elements/pl-snap/Snap/Sounds/F_sax.wav new file mode 100644 index 00000000..a0c0e72b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_trombone.wav b/elements/pl-snap/Snap/Sounds/F_trombone.wav new file mode 100644 index 00000000..385ecb6c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/F_trumpet.wav b/elements/pl-snap/Snap/Sounds/F_trumpet.wav new file mode 100644 index 00000000..96736932 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/F_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/FingerSnap.wav b/elements/pl-snap/Snap/Sounds/FingerSnap.wav new file mode 100644 index 00000000..df562208 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/FingerSnap.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_bass.wav b/elements/pl-snap/Snap/Sounds/G_bass.wav new file mode 100644 index 00000000..64c3d726 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_elec_bass.wav b/elements/pl-snap/Snap/Sounds/G_elec_bass.wav new file mode 100644 index 00000000..731409e5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_elec_bass.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_elec_guitar.wav b/elements/pl-snap/Snap/Sounds/G_elec_guitar.wav new file mode 100644 index 00000000..b2a3b855 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_elec_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_elec_piano.wav b/elements/pl-snap/Snap/Sounds/G_elec_piano.wav new file mode 100644 index 00000000..d0f9ef33 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_elec_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_guitar.wav b/elements/pl-snap/Snap/Sounds/G_guitar.wav new file mode 100644 index 00000000..aef829dc Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_guitar.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_piano.wav b/elements/pl-snap/Snap/Sounds/G_piano.wav new file mode 100644 index 00000000..2603f58e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_piano.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_sax.wav b/elements/pl-snap/Snap/Sounds/G_sax.wav new file mode 100644 index 00000000..2fc70298 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_sax.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_trombone.wav b/elements/pl-snap/Snap/Sounds/G_trombone.wav new file mode 100644 index 00000000..81c3198a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_trombone.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_trumpet.wav b/elements/pl-snap/Snap/Sounds/G_trumpet.wav new file mode 100644 index 00000000..a4290c58 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_trumpet.wav differ diff --git a/elements/pl-snap/Snap/Sounds/G_ukulele.wav b/elements/pl-snap/Snap/Sounds/G_ukulele.wav new file mode 100644 index 00000000..0bba8cc0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/G_ukulele.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Kitten.wav b/elements/pl-snap/Snap/Sounds/Kitten.wav new file mode 100644 index 00000000..45742d5e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Kitten.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Laugh-female.wav b/elements/pl-snap/Snap/Sounds/Laugh-female.wav new file mode 100644 index 00000000..77848043 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Laugh-female.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Laugh-male1.wav b/elements/pl-snap/Snap/Sounds/Laugh-male1.wav new file mode 100644 index 00000000..191e3b76 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Laugh-male1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Laugh-male2.wav b/elements/pl-snap/Snap/Sounds/Laugh-male2.wav new file mode 100644 index 00000000..2ab89217 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Laugh-male2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Laugh-male3.mp3 b/elements/pl-snap/Snap/Sounds/Laugh-male3.mp3 new file mode 100644 index 00000000..f6f22c7b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Laugh-male3.mp3 differ diff --git a/elements/pl-snap/Snap/Sounds/Meow.wav b/elements/pl-snap/Snap/Sounds/Meow.wav new file mode 100644 index 00000000..45742d5e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Meow.wav differ diff --git a/elements/pl-snap/Snap/Sounds/Pop.wav b/elements/pl-snap/Snap/Sounds/Pop.wav new file mode 100644 index 00000000..fc3b2724 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/Pop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/SOUNDS b/elements/pl-snap/Snap/Sounds/SOUNDS new file mode 100644 index 00000000..e5f538f5 --- /dev/null +++ b/elements/pl-snap/Snap/Sounds/SOUNDS @@ -0,0 +1,12 @@ +Cat.mp3 Cat +Chord.wav Chord +Dog1.wav Dog 1 +Dog2.wav Dog 2 +FingerSnap.wav Finger Snap +Kitten.wav Kitten +Laugh-female.wav Laugh Female +Laugh-male1.wav Laugh Male 1 +Laugh-male2.wav Laugh Male 2 +Laugh-male3.mp3 Laugh Male 3 +Meow.wav Meow +Pop.wav Pop diff --git a/elements/pl-snap/Snap/Sounds/afro_string.wav b/elements/pl-snap/Snap/Sounds/afro_string.wav new file mode 100644 index 00000000..0fc6966a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/afro_string.wav differ diff --git a/elements/pl-snap/Snap/Sounds/alien_creak1.wav b/elements/pl-snap/Snap/Sounds/alien_creak1.wav new file mode 100644 index 00000000..2c7d112f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/alien_creak1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/alien_creak2.wav b/elements/pl-snap/Snap/Sounds/alien_creak2.wav new file mode 100644 index 00000000..d9461486 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/alien_creak2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/bass_beatbox.wav b/elements/pl-snap/Snap/Sounds/bass_beatbox.wav new file mode 100644 index 00000000..665108f7 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/bass_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/beat_box1.wav b/elements/pl-snap/Snap/Sounds/beat_box1.wav new file mode 100644 index 00000000..0e9468f5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/beat_box1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/beat_box2.wav b/elements/pl-snap/Snap/Sounds/beat_box2.wav new file mode 100644 index 00000000..0ec606c0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/beat_box2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/bell_cymbal.wav b/elements/pl-snap/Snap/Sounds/bell_cymbal.wav new file mode 100644 index 00000000..adeb4b6d Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/bell_cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/bell_toll.wav b/elements/pl-snap/Snap/Sounds/bell_toll.wav new file mode 100644 index 00000000..abaaec67 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/bell_toll.wav differ diff --git a/elements/pl-snap/Snap/Sounds/bird.wav b/elements/pl-snap/Snap/Sounds/bird.wav new file mode 100644 index 00000000..dbc5b615 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/bird.wav differ diff --git a/elements/pl-snap/Snap/Sounds/birthday.wav b/elements/pl-snap/Snap/Sounds/birthday.wav new file mode 100644 index 00000000..45acf23e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/birthday.wav differ diff --git a/elements/pl-snap/Snap/Sounds/birthday_bells.wav b/elements/pl-snap/Snap/Sounds/birthday_bells.wav new file mode 100644 index 00000000..848a8229 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/birthday_bells.wav differ diff --git a/elements/pl-snap/Snap/Sounds/boing.wav b/elements/pl-snap/Snap/Sounds/boing.wav new file mode 100644 index 00000000..a64b46e6 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/boing.wav differ diff --git a/elements/pl-snap/Snap/Sounds/bubbles.wav b/elements/pl-snap/Snap/Sounds/bubbles.wav new file mode 100644 index 00000000..9ea58084 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/bubbles.wav differ diff --git a/elements/pl-snap/Snap/Sounds/buzz_whir.wav b/elements/pl-snap/Snap/Sounds/buzz_whir.wav new file mode 100644 index 00000000..92320b1c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/buzz_whir.wav differ diff --git a/elements/pl-snap/Snap/Sounds/car_passing.wav b/elements/pl-snap/Snap/Sounds/car_passing.wav new file mode 100644 index 00000000..95e94ed7 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/car_passing.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cave.wav b/elements/pl-snap/Snap/Sounds/cave.wav new file mode 100644 index 00000000..0b7153a6 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cave.wav differ diff --git a/elements/pl-snap/Snap/Sounds/chee_chee.wav b/elements/pl-snap/Snap/Sounds/chee_chee.wav new file mode 100644 index 00000000..494b4549 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/chee_chee.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cheer.wav b/elements/pl-snap/Snap/Sounds/cheer.wav new file mode 100644 index 00000000..3521e06a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cheer.wav differ diff --git a/elements/pl-snap/Snap/Sounds/chomp.wav b/elements/pl-snap/Snap/Sounds/chomp.wav new file mode 100644 index 00000000..0af89632 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/chomp.wav differ diff --git a/elements/pl-snap/Snap/Sounds/clap_beatbox.wav b/elements/pl-snap/Snap/Sounds/clap_beatbox.wav new file mode 100644 index 00000000..3aed1cab Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/clap_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/clapping.wav b/elements/pl-snap/Snap/Sounds/clapping.wav new file mode 100644 index 00000000..6fce3210 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/clapping.wav differ diff --git a/elements/pl-snap/Snap/Sounds/computer_beeps1.wav b/elements/pl-snap/Snap/Sounds/computer_beeps1.wav new file mode 100644 index 00000000..7b7236ac Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/computer_beeps1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/computer_beeps2.wav b/elements/pl-snap/Snap/Sounds/computer_beeps2.wav new file mode 100644 index 00000000..24284b52 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/computer_beeps2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cough-female.wav b/elements/pl-snap/Snap/Sounds/cough-female.wav new file mode 100644 index 00000000..27af31c5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cough-female.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cough-male.wav b/elements/pl-snap/Snap/Sounds/cough-male.wav new file mode 100644 index 00000000..09496f88 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cough-male.wav differ diff --git a/elements/pl-snap/Snap/Sounds/crash_beatbox.wav b/elements/pl-snap/Snap/Sounds/crash_beatbox.wav new file mode 100644 index 00000000..c5ad0932 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/crash_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/crash_cymbal.wav b/elements/pl-snap/Snap/Sounds/crash_cymbal.wav new file mode 100644 index 00000000..a3b3e618 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/crash_cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cricket.wav b/elements/pl-snap/Snap/Sounds/cricket.wav new file mode 100644 index 00000000..4b67325f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cricket.wav differ diff --git a/elements/pl-snap/Snap/Sounds/crickets.wav b/elements/pl-snap/Snap/Sounds/crickets.wav new file mode 100644 index 00000000..8506ba12 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/crickets.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cymbal.wav b/elements/pl-snap/Snap/Sounds/cymbal.wav new file mode 100644 index 00000000..b87f2772 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cymbal_crash.wav b/elements/pl-snap/Snap/Sounds/cymbal_crash.wav new file mode 100644 index 00000000..ccd4b479 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cymbal_crash.wav differ diff --git a/elements/pl-snap/Snap/Sounds/cymbal_echo.wav b/elements/pl-snap/Snap/Sounds/cymbal_echo.wav new file mode 100644 index 00000000..25fed10c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/cymbal_echo.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_around.wav b/elements/pl-snap/Snap/Sounds/dance_around.wav new file mode 100644 index 00000000..c1925877 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_around.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_celebrate.wav b/elements/pl-snap/Snap/Sounds/dance_celebrate.wav new file mode 100644 index 00000000..8a56e157 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_celebrate.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_chill_out.wav b/elements/pl-snap/Snap/Sounds/dance_chill_out.wav new file mode 100644 index 00000000..f52256b5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_chill_out.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_funky.wav b/elements/pl-snap/Snap/Sounds/dance_funky.wav new file mode 100644 index 00000000..b3c55d1e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_funky.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_head_nod.wav b/elements/pl-snap/Snap/Sounds/dance_head_nod.wav new file mode 100644 index 00000000..1df8c7dd Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_head_nod.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_magic.wav b/elements/pl-snap/Snap/Sounds/dance_magic.wav new file mode 100644 index 00000000..ceceb685 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_magic.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_slow_mo.wav b/elements/pl-snap/Snap/Sounds/dance_slow_mo.wav new file mode 100644 index 00000000..0cc50fb9 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_slow_mo.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_snare_beat.wav b/elements/pl-snap/Snap/Sounds/dance_snare_beat.wav new file mode 100644 index 00000000..994b4102 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_snare_beat.wav differ diff --git a/elements/pl-snap/Snap/Sounds/dance_space.wav b/elements/pl-snap/Snap/Sounds/dance_space.wav new file mode 100644 index 00000000..3bf7d6d5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/dance_space.wav differ diff --git a/elements/pl-snap/Snap/Sounds/door_creak.wav b/elements/pl-snap/Snap/Sounds/door_creak.wav new file mode 100644 index 00000000..c3dd5780 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/door_creak.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drip_drop.wav b/elements/pl-snap/Snap/Sounds/drip_drop.wav new file mode 100644 index 00000000..caa229bd Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drip_drop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drive_around.wav b/elements/pl-snap/Snap/Sounds/drive_around.wav new file mode 100644 index 00000000..d6085379 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drive_around.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum.wav b/elements/pl-snap/Snap/Sounds/drum.wav new file mode 100644 index 00000000..6c46da7b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_bass1.wav b/elements/pl-snap/Snap/Sounds/drum_bass1.wav new file mode 100644 index 00000000..8af7daf7 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_bass1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_bass2.wav b/elements/pl-snap/Snap/Sounds/drum_bass2.wav new file mode 100644 index 00000000..921ccbca Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_bass2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_bass3.wav b/elements/pl-snap/Snap/Sounds/drum_bass3.wav new file mode 100644 index 00000000..e12b29f0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_bass3.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_buzz.wav b/elements/pl-snap/Snap/Sounds/drum_buzz.wav new file mode 100644 index 00000000..d5d84b45 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_buzz.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_funky.wav b/elements/pl-snap/Snap/Sounds/drum_funky.wav new file mode 100644 index 00000000..78f94344 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_funky.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_jam.wav b/elements/pl-snap/Snap/Sounds/drum_jam.wav new file mode 100644 index 00000000..b0a5ffe7 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_jam.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_machine.wav b/elements/pl-snap/Snap/Sounds/drum_machine.wav new file mode 100644 index 00000000..01ad624a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_machine.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_satellite.wav b/elements/pl-snap/Snap/Sounds/drum_satellite.wav new file mode 100644 index 00000000..1305adff Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_satellite.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_set1.wav b/elements/pl-snap/Snap/Sounds/drum_set1.wav new file mode 100644 index 00000000..a3e37968 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_set1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/drum_set2.wav b/elements/pl-snap/Snap/Sounds/drum_set2.wav new file mode 100644 index 00000000..68293ed8 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/drum_set2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/duck.wav b/elements/pl-snap/Snap/Sounds/duck.wav new file mode 100644 index 00000000..47bb66eb Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/duck.wav differ diff --git a/elements/pl-snap/Snap/Sounds/eggs.wav b/elements/pl-snap/Snap/Sounds/eggs.wav new file mode 100644 index 00000000..4517e18f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/eggs.wav differ diff --git a/elements/pl-snap/Snap/Sounds/elec_piano_A_minor.wav b/elements/pl-snap/Snap/Sounds/elec_piano_A_minor.wav new file mode 100644 index 00000000..6588c68a Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/elec_piano_A_minor.wav differ diff --git a/elements/pl-snap/Snap/Sounds/elec_piano_C_major.wav b/elements/pl-snap/Snap/Sounds/elec_piano_C_major.wav new file mode 100644 index 00000000..8aaa8341 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/elec_piano_C_major.wav differ diff --git a/elements/pl-snap/Snap/Sounds/elec_piano_F_major.wav b/elements/pl-snap/Snap/Sounds/elec_piano_F_major.wav new file mode 100644 index 00000000..18f735a5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/elec_piano_F_major.wav differ diff --git a/elements/pl-snap/Snap/Sounds/elec_piano_G_major.wav b/elements/pl-snap/Snap/Sounds/elec_piano_G_major.wav new file mode 100644 index 00000000..c29d54ee Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/elec_piano_G_major.wav differ diff --git a/elements/pl-snap/Snap/Sounds/elec_piano_loop.wav b/elements/pl-snap/Snap/Sounds/elec_piano_loop.wav new file mode 100644 index 00000000..e0eeec55 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/elec_piano_loop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/fairydust.wav b/elements/pl-snap/Snap/Sounds/fairydust.wav new file mode 100644 index 00000000..db7ce2f1 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/fairydust.wav differ diff --git a/elements/pl-snap/Snap/Sounds/finger_snap.wav b/elements/pl-snap/Snap/Sounds/finger_snap.wav new file mode 100644 index 00000000..df562208 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/finger_snap.wav differ diff --git a/elements/pl-snap/Snap/Sounds/flam_snare.wav b/elements/pl-snap/Snap/Sounds/flam_snare.wav new file mode 100644 index 00000000..23fb7685 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/flam_snare.wav differ diff --git a/elements/pl-snap/Snap/Sounds/footsteps-1.wav b/elements/pl-snap/Snap/Sounds/footsteps-1.wav new file mode 100644 index 00000000..8e8c865f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/footsteps-1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/garden.wav b/elements/pl-snap/Snap/Sounds/garden.wav new file mode 100644 index 00000000..6fd3c78e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/garden.wav differ diff --git a/elements/pl-snap/Snap/Sounds/gong.wav b/elements/pl-snap/Snap/Sounds/gong.wav new file mode 100644 index 00000000..66bb12ad Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/gong.wav differ diff --git a/elements/pl-snap/Snap/Sounds/goose.wav b/elements/pl-snap/Snap/Sounds/goose.wav new file mode 100644 index 00000000..5527b3c3 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/goose.wav differ diff --git a/elements/pl-snap/Snap/Sounds/guitar_chords1.wav b/elements/pl-snap/Snap/Sounds/guitar_chords1.wav new file mode 100644 index 00000000..f06df4fe Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/guitar_chords1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/guitar_chords2.wav b/elements/pl-snap/Snap/Sounds/guitar_chords2.wav new file mode 100644 index 00000000..2907aecf Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/guitar_chords2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/guitar_strum.wav b/elements/pl-snap/Snap/Sounds/guitar_strum.wav new file mode 100644 index 00000000..776b1fb1 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/guitar_strum.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hand_clap.wav b/elements/pl-snap/Snap/Sounds/hand_clap.wav new file mode 100644 index 00000000..bb235246 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hand_clap.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hey.wav b/elements/pl-snap/Snap/Sounds/hey.wav new file mode 100644 index 00000000..34cc3a6e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hey.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hi_beatbox.wav b/elements/pl-snap/Snap/Sounds/hi_beatbox.wav new file mode 100644 index 00000000..1594da1c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hi_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hi_na_tabla.wav b/elements/pl-snap/Snap/Sounds/hi_na_tabla.wav new file mode 100644 index 00000000..50d448c9 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hi_na_tabla.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hi_tun_tabla.wav b/elements/pl-snap/Snap/Sounds/hi_tun_tabla.wav new file mode 100644 index 00000000..7b43730f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hi_tun_tabla.wav differ diff --git a/elements/pl-snap/Snap/Sounds/high_conga.wav b/elements/pl-snap/Snap/Sounds/high_conga.wav new file mode 100644 index 00000000..4f7be3bc Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/high_conga.wav differ diff --git a/elements/pl-snap/Snap/Sounds/high_hat.wav b/elements/pl-snap/Snap/Sounds/high_hat.wav new file mode 100644 index 00000000..f5f13699 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/high_hat.wav differ diff --git a/elements/pl-snap/Snap/Sounds/high_tom.wav b/elements/pl-snap/Snap/Sounds/high_tom.wav new file mode 100644 index 00000000..59a92d47 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/high_tom.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hihat_cymbal.wav b/elements/pl-snap/Snap/Sounds/hihat_cymbal.wav new file mode 100644 index 00000000..47c63b00 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hihat_cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/hip_hop.wav b/elements/pl-snap/Snap/Sounds/hip_hop.wav new file mode 100644 index 00000000..d93eb978 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/hip_hop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/horse.wav b/elements/pl-snap/Snap/Sounds/horse.wav new file mode 100644 index 00000000..6c1667c2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/horse.wav differ diff --git a/elements/pl-snap/Snap/Sounds/horse_gallop.wav b/elements/pl-snap/Snap/Sounds/horse_gallop.wav new file mode 100644 index 00000000..2cd61944 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/horse_gallop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/human_beatbox1.wav b/elements/pl-snap/Snap/Sounds/human_beatbox1.wav new file mode 100644 index 00000000..3af08911 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/human_beatbox1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/human_beatbox2.wav b/elements/pl-snap/Snap/Sounds/human_beatbox2.wav new file mode 100644 index 00000000..4881c8dd Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/human_beatbox2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/jungle.wav b/elements/pl-snap/Snap/Sounds/jungle.wav new file mode 100644 index 00000000..8c1ee373 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/jungle.wav differ diff --git a/elements/pl-snap/Snap/Sounds/kick_back.wav b/elements/pl-snap/Snap/Sounds/kick_back.wav new file mode 100644 index 00000000..b2c09a8f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/kick_back.wav differ diff --git a/elements/pl-snap/Snap/Sounds/large_cowbell.wav b/elements/pl-snap/Snap/Sounds/large_cowbell.wav new file mode 100644 index 00000000..5c1268a9 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/large_cowbell.wav differ diff --git a/elements/pl-snap/Snap/Sounds/laser1.wav b/elements/pl-snap/Snap/Sounds/laser1.wav new file mode 100644 index 00000000..e4a71f14 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/laser1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/laser2.wav b/elements/pl-snap/Snap/Sounds/laser2.wav new file mode 100644 index 00000000..3557a48b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/laser2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/lo_geh_tabla.wav b/elements/pl-snap/Snap/Sounds/lo_geh_tabla.wav new file mode 100644 index 00000000..54cbd3c5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/lo_geh_tabla.wav differ diff --git a/elements/pl-snap/Snap/Sounds/lo_gliss_tabla.wav b/elements/pl-snap/Snap/Sounds/lo_gliss_tabla.wav new file mode 100644 index 00000000..e1915ae3 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/lo_gliss_tabla.wav differ diff --git a/elements/pl-snap/Snap/Sounds/low_conga.wav b/elements/pl-snap/Snap/Sounds/low_conga.wav new file mode 100644 index 00000000..f4340348 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/low_conga.wav differ diff --git a/elements/pl-snap/Snap/Sounds/low_tom.wav b/elements/pl-snap/Snap/Sounds/low_tom.wav new file mode 100644 index 00000000..0af4e765 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/low_tom.wav differ diff --git a/elements/pl-snap/Snap/Sounds/medieval1.wav b/elements/pl-snap/Snap/Sounds/medieval1.wav new file mode 100644 index 00000000..2b793e46 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/medieval1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/medieval2.wav b/elements/pl-snap/Snap/Sounds/medieval2.wav new file mode 100644 index 00000000..308e6fd0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/medieval2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/meow2.wav b/elements/pl-snap/Snap/Sounds/meow2.wav new file mode 100644 index 00000000..a07a948f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/meow2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/motorcycle_passing.wav b/elements/pl-snap/Snap/Sounds/motorcycle_passing.wav new file mode 100644 index 00000000..ad751180 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/motorcycle_passing.wav differ diff --git a/elements/pl-snap/Snap/Sounds/muted_conga.wav b/elements/pl-snap/Snap/Sounds/muted_conga.wav new file mode 100644 index 00000000..5eeaadd2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/muted_conga.wav differ diff --git a/elements/pl-snap/Snap/Sounds/odesong-b.wav b/elements/pl-snap/Snap/Sounds/odesong-b.wav new file mode 100644 index 00000000..eaafb5dd Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/odesong-b.wav differ diff --git a/elements/pl-snap/Snap/Sounds/owl.wav b/elements/pl-snap/Snap/Sounds/owl.wav new file mode 100644 index 00000000..0f5f1792 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/owl.wav differ diff --git a/elements/pl-snap/Snap/Sounds/party_noise.wav b/elements/pl-snap/Snap/Sounds/party_noise.wav new file mode 100644 index 00000000..74c33ff0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/party_noise.wav differ diff --git a/elements/pl-snap/Snap/Sounds/plunge.wav b/elements/pl-snap/Snap/Sounds/plunge.wav new file mode 100644 index 00000000..7c77b4f2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/plunge.wav differ diff --git a/elements/pl-snap/Snap/Sounds/rattle.wav b/elements/pl-snap/Snap/Sounds/rattle.wav new file mode 100644 index 00000000..fdf0e470 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/rattle.wav differ diff --git a/elements/pl-snap/Snap/Sounds/ride_cymbal.wav b/elements/pl-snap/Snap/Sounds/ride_cymbal.wav new file mode 100644 index 00000000..bf4cbfd9 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/ride_cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/ripples.wav b/elements/pl-snap/Snap/Sounds/ripples.wav new file mode 100644 index 00000000..1fc4da85 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/ripples.wav differ diff --git a/elements/pl-snap/Snap/Sounds/roll_cymbal.wav b/elements/pl-snap/Snap/Sounds/roll_cymbal.wav new file mode 100644 index 00000000..319195fa Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/roll_cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/rooster.wav b/elements/pl-snap/Snap/Sounds/rooster.wav new file mode 100644 index 00000000..d26b4c95 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/rooster.wav differ diff --git a/elements/pl-snap/Snap/Sounds/scratch_beatbox.wav b/elements/pl-snap/Snap/Sounds/scratch_beatbox.wav new file mode 100644 index 00000000..4df7c25c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/scratch_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/scratchy_beat.wav b/elements/pl-snap/Snap/Sounds/scratchy_beat.wav new file mode 100644 index 00000000..f2b8a0a0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/scratchy_beat.wav differ diff --git a/elements/pl-snap/Snap/Sounds/scream-female.wav b/elements/pl-snap/Snap/Sounds/scream-female.wav new file mode 100644 index 00000000..a33fdaf8 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/scream-female.wav differ diff --git a/elements/pl-snap/Snap/Sounds/scream-male1.wav b/elements/pl-snap/Snap/Sounds/scream-male1.wav new file mode 100644 index 00000000..d1ee85fe Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/scream-male1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/screech.wav b/elements/pl-snap/Snap/Sounds/screech.wav new file mode 100644 index 00000000..2129ceae Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/screech.wav differ diff --git a/elements/pl-snap/Snap/Sounds/shaker.wav b/elements/pl-snap/Snap/Sounds/shaker.wav new file mode 100644 index 00000000..8dd5e2c3 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/shaker.wav differ diff --git a/elements/pl-snap/Snap/Sounds/sidestick_snare.wav b/elements/pl-snap/Snap/Sounds/sidestick_snare.wav new file mode 100644 index 00000000..7d48fb5b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/sidestick_snare.wav differ diff --git a/elements/pl-snap/Snap/Sounds/singer1.wav b/elements/pl-snap/Snap/Sounds/singer1.wav new file mode 100644 index 00000000..07c2b514 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/singer1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/singer2.wav b/elements/pl-snap/Snap/Sounds/singer2.wav new file mode 100644 index 00000000..ca1ea991 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/singer2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/small_cowbell.wav b/elements/pl-snap/Snap/Sounds/small_cowbell.wav new file mode 100644 index 00000000..ddcc7a2b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/small_cowbell.wav differ diff --git a/elements/pl-snap/Snap/Sounds/snap.wav b/elements/pl-snap/Snap/Sounds/snap.wav new file mode 100644 index 00000000..b4bdce13 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/snap.wav differ diff --git a/elements/pl-snap/Snap/Sounds/snare_beatbox.wav b/elements/pl-snap/Snap/Sounds/snare_beatbox.wav new file mode 100644 index 00000000..672f0cee Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/snare_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/snare_beatbox2.wav b/elements/pl-snap/Snap/Sounds/snare_beatbox2.wav new file mode 100644 index 00000000..9f2a6843 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/snare_beatbox2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/snare_drum.wav b/elements/pl-snap/Snap/Sounds/snare_drum.wav new file mode 100644 index 00000000..a8931c69 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/snare_drum.wav differ diff --git a/elements/pl-snap/Snap/Sounds/sneeze-female.wav b/elements/pl-snap/Snap/Sounds/sneeze-female.wav new file mode 100644 index 00000000..bc304669 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/sneeze-female.wav differ diff --git a/elements/pl-snap/Snap/Sounds/sneeze-male.wav b/elements/pl-snap/Snap/Sounds/sneeze-male.wav new file mode 100644 index 00000000..f41ce497 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/sneeze-male.wav differ diff --git a/elements/pl-snap/Snap/Sounds/space_ripple.wav b/elements/pl-snap/Snap/Sounds/space_ripple.wav new file mode 100644 index 00000000..ba1ffc7e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/space_ripple.wav differ diff --git a/elements/pl-snap/Snap/Sounds/spiral.wav b/elements/pl-snap/Snap/Sounds/spiral.wav new file mode 100644 index 00000000..1c226591 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/spiral.wav differ diff --git a/elements/pl-snap/Snap/Sounds/splash_cymbal.wav b/elements/pl-snap/Snap/Sounds/splash_cymbal.wav new file mode 100644 index 00000000..6c553be0 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/splash_cymbal.wav differ diff --git a/elements/pl-snap/Snap/Sounds/spooky_string.wav b/elements/pl-snap/Snap/Sounds/spooky_string.wav new file mode 100644 index 00000000..964a2f52 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/spooky_string.wav differ diff --git a/elements/pl-snap/Snap/Sounds/squawk.wav b/elements/pl-snap/Snap/Sounds/squawk.wav new file mode 100644 index 00000000..52b61632 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/squawk.wav differ diff --git a/elements/pl-snap/Snap/Sounds/string_accent.wav b/elements/pl-snap/Snap/Sounds/string_accent.wav new file mode 100644 index 00000000..47bd093b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/string_accent.wav differ diff --git a/elements/pl-snap/Snap/Sounds/string_pluck.wav b/elements/pl-snap/Snap/Sounds/string_pluck.wav new file mode 100644 index 00000000..43b42a10 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/string_pluck.wav differ diff --git a/elements/pl-snap/Snap/Sounds/suspense.wav b/elements/pl-snap/Snap/Sounds/suspense.wav new file mode 100644 index 00000000..ce8a8d1b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/suspense.wav differ diff --git a/elements/pl-snap/Snap/Sounds/tambura.wav b/elements/pl-snap/Snap/Sounds/tambura.wav new file mode 100644 index 00000000..9fca1d23 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/tambura.wav differ diff --git a/elements/pl-snap/Snap/Sounds/tap_conga.wav b/elements/pl-snap/Snap/Sounds/tap_conga.wav new file mode 100644 index 00000000..1ef707a7 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/tap_conga.wav differ diff --git a/elements/pl-snap/Snap/Sounds/tap_snare.wav b/elements/pl-snap/Snap/Sounds/tap_snare.wav new file mode 100644 index 00000000..f3bde926 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/tap_snare.wav differ diff --git a/elements/pl-snap/Snap/Sounds/techno.wav b/elements/pl-snap/Snap/Sounds/techno.wav new file mode 100644 index 00000000..7daa3131 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/techno.wav differ diff --git a/elements/pl-snap/Snap/Sounds/techno2.wav b/elements/pl-snap/Snap/Sounds/techno2.wav new file mode 100644 index 00000000..9a4d1f16 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/techno2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/tom_drum.wav b/elements/pl-snap/Snap/Sounds/tom_drum.wav new file mode 100644 index 00000000..d59b4471 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/tom_drum.wav differ diff --git a/elements/pl-snap/Snap/Sounds/triumph.wav b/elements/pl-snap/Snap/Sounds/triumph.wav new file mode 100644 index 00000000..36d0b38c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/triumph.wav differ diff --git a/elements/pl-snap/Snap/Sounds/trumpet1.wav b/elements/pl-snap/Snap/Sounds/trumpet1.wav new file mode 100644 index 00000000..0c8e612f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/trumpet1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/trumpet2.wav b/elements/pl-snap/Snap/Sounds/trumpet2.wav new file mode 100644 index 00000000..8d2868a5 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/trumpet2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/wah_beatbox.wav b/elements/pl-snap/Snap/Sounds/wah_beatbox.wav new file mode 100644 index 00000000..df3acfd2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/wah_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/water_drop.wav b/elements/pl-snap/Snap/Sounds/water_drop.wav new file mode 100644 index 00000000..8e35df6f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/water_drop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/whoop.wav b/elements/pl-snap/Snap/Sounds/whoop.wav new file mode 100644 index 00000000..50fbf899 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/whoop.wav differ diff --git a/elements/pl-snap/Snap/Sounds/wolf_howl.wav b/elements/pl-snap/Snap/Sounds/wolf_howl.wav new file mode 100644 index 00000000..7e2498a2 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/wolf_howl.wav differ diff --git a/elements/pl-snap/Snap/Sounds/wub_beatbox.wav b/elements/pl-snap/Snap/Sounds/wub_beatbox.wav new file mode 100644 index 00000000..1875c34e Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/wub_beatbox.wav differ diff --git a/elements/pl-snap/Snap/Sounds/xylo1.wav b/elements/pl-snap/Snap/Sounds/xylo1.wav new file mode 100644 index 00000000..cb2d9f67 Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/xylo1.wav differ diff --git a/elements/pl-snap/Snap/Sounds/xylo2.wav b/elements/pl-snap/Snap/Sounds/xylo2.wav new file mode 100644 index 00000000..b0a57d2f Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/xylo2.wav differ diff --git a/elements/pl-snap/Snap/Sounds/xylo3.wav b/elements/pl-snap/Snap/Sounds/xylo3.wav new file mode 100644 index 00000000..3df19b1b Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/xylo3.wav differ diff --git a/elements/pl-snap/Snap/Sounds/xylo4.wav b/elements/pl-snap/Snap/Sounds/xylo4.wav new file mode 100644 index 00000000..91de735c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/xylo4.wav differ diff --git a/elements/pl-snap/Snap/Sounds/ya.wav b/elements/pl-snap/Snap/Sounds/ya.wav new file mode 100644 index 00000000..87b3e1bd Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/ya.wav differ diff --git a/elements/pl-snap/Snap/Sounds/zoop.wav b/elements/pl-snap/Snap/Sounds/zoop.wav new file mode 100644 index 00000000..066ecb4c Binary files /dev/null and b/elements/pl-snap/Snap/Sounds/zoop.wav differ diff --git a/elements/pl-snap/Snap/docs/API.md b/elements/pl-snap/Snap/docs/API.md new file mode 100644 index 00000000..5e92d50f --- /dev/null +++ b/elements/pl-snap/Snap/docs/API.md @@ -0,0 +1,566 @@ +# The Snap! API + +Jens Mönig, Bernat Romagosa, February 23, 2024 + +This document describes how Snap! can be accessed from an outside program to start scripts, send and retrieve information. The model use case is embedding interactive Snap! projects in other websites such as MOOCs or other adaptive learning platforms. + +This experimental Snap! API is a set of methods for an IDE_Morph containing a Snap! project. These methods are maintained to work with future versions of Snap! They can be used to trigger scripts, get feedback from running scripts, and access the project's global variables. + +Currently the API consists of the following methods: + +#### Navigate Scenes + +* `IDE_Morph.prototype.getScenes()` +* `IDE_Morph.prototype.getCurrentScene()` +* `IDE_Morph.prototype.switchTo()` + +#### Control Processes + +* `IDE_Morph.prototype.isRunning()` +* `IDE_Morph.prototype.stop()` + +#### Broadcast Messages (and optionally wait) + +* `IDE_Morph.prototype.broadcast()` + +#### Listen to Messages + +* `IDE_Morph.prototype.addMessageListenerForAll()` +* `IDE_Morph.prototype.addMessageListener()` +* `IDE_Morph.prototype.getMessages()` + +#### Access Global Variables + +* `IDE_Morph.prototype.getVarNames()` +* `IDE_Morph.prototype.getVar()` +* `IDE_Morph.prototype.setVar()` + +#### Create and Modify Lists + +* `IDE_Morph.prototype.newList()` + +#### Access the Serialized Project + +* `IDE_Morph.prototype.getProjectXML()` +* `IDE_Morph.prototype.loadProjectXML()` +* `IDE_Morph.prototype.unsavedChanges()` +* `IDE_Morph.prototype.resetUnsavedChanges()` + +#### Synchronize Scripts + +* `IDE_Morph.prototype.getSpriteScriptsXML()` +* `IDE_Morph.prototype.loadSpriteScriptsXML()` + +#### Highlight Blocks + +* `IDE_Morph.prototype.flashSpriteScripts()` +* `IDE_Morph.prototype.flashSpriteScriptAt()` +* `IDE_Morph.prototype.unflashSpriteScripts()` +* `IDE_Morph.prototype.flashSpriteScriptOutlineAt()` +* `IDE_Morph.prototype.unflashSpriteScriptsOutline()` + +#### Display Speech Balloons next to Blocks + +* `IDE_Morph.prototype.showScriptBalloonAt()` +* `IDE_Morph.prototype.closePopUps()` + +#### Set the Language + +* `IDE_Morph.prototype.setTranslation()` + +## Referencing the IDE + +There are two ways in which Snap! can be used as an extension editor for other web applications: Either by directly embedding the Snap! IDE as a Canvas element in another web page, or by embedding Snap! in an iframe. + +### Embedding Snap! as a Canvas + +Embedding Snap! directly into another web page involves loading all the source scripts, setting up a +Canvas for the IDE, configuring the desired looks and behavior of the Snap! editor and starting an +animation loop to bring it to life. + + +A page that embeds its own Snap! editor might be structured like this: + + +``` + + + + Embedded Snap! + + + + ... + + + + + + +``` + +Note that in this setup you are explicitly creating an instance of the IDE and can simply assign it to a variable for further communication. Also note that when instantiating a new WorldMorph you can specify a flag indicating whether it is to take over all the available browser real-eastate or not. + +You can configure the looks and behavior of the IDE by passing it a configuration dictionary object. Currently the following preferences are supported: + +|keyword |type |setting | +|- |- |- | +|noAutoFill |bool |do not let the IDE fill the whole World canvas| +|path: |str |path to additional resources (translations)| +|load: |str |microworld file name (xml)| +|onload: |callback |called when the microworld is loaded| +|design: |str |currently `"flat"` (bright) or `"classic"` (dark)| +|border: |num |pixels surrounding the IDE, default is none (zero)| +|lang: |str |translation to be used, e.g. `"de"` for German| +|mode: |str |currently `"presentation"` or `"edit"`| +|hideControls: |bool |hide/show the tool bar| +|hideCategories: |bool |hide/show the palette block category buttons| +|hideProjects: |bool |hide/show the projects menu button in the tool bar| +|hideSettings: |bool |hide/show the settings menu button in the tool bar| +|noDefaultCat: |bool |hide/show the default built-in category buttons| +|noSpriteEdits: |bool |hide/show the corral & sprite controls/menus| +|noSprites: |bool |hide/show the stage, corral, sprite editor| +|noPalette: |bool |hide/show the palette including the categories| +|noImports: |bool |disable/allow importing files via drag&drop, hides the project menu button| +|noCloud: |bool |disable/enable functionalities to access the Snap! cloud| +|noOwnBlocks: |bool |hide/show "make a block" and "make a category" buttons| +|noRingify: |bool |disable/enable "ringify" / "unringify" in context menus| +|noUserSettings: |bool |disable/enable persistent user preferences| +|noDevWarning: |bool |ignore development version incompatibility warning| +|noExitWarning: |bool |do not show a browser warning when closing the IDE with unsaved changes| +|preserveTitle: |bool |do not set the tab title dynamically to reflect the current Snap! version| +|blocksZoom: |num |zoom factor for blocks, e.g. `1.5`| +|blocksFade: |num |fading percentage for blocks, e.g. `85`| +|zebra: |num |contrast percentage for nesting same-color blocks| + +Note that such configurations will not affect the user's own preference settings, e.g. configuring the blocks zoom or language will not overwrite the user's own settings which are kept in localstorage. + + + +### Embedding Snap! in an iframe + +Getting hold of an ide can usually be achieved by +evaluating: + + var ide = world.children[0]; + +The model case in mind is embedding Snap! in an iframe following a pattern such as this example: + +``` + + + + Snap! iFrame + + + + + +``` + +In such a set up the ide can be accessed through the ```contentWindow``` property, e.g. + + var ide = document.getElementsByTagName("iframe")[0].contentWindow.world.children[0]; + +### Cross-domain iframes + +If the iframe and the container do not share domains, you won't be able to reach the world +and, thus, the API. For that particular case, you should use the `postMessage` mechanism, +as follows: + + document.querySelector('iframe').contentWindow.postMessage( + { selector: , params: }, + '*' + ); + +For instance, to get the value of a variable named "foo", you would do: + + document.querySelector('iframe').contentWindow.postMessage( + { selector: 'getVar', params: [ 'foo' ] }, + '*' + ); + +The way to capture the return values of these messages from the page containing the iframe +is to define an `onmessage` listener: + + winndow.addEventListener('message',function(e) { + console.log('the response to', e.data.selector, 'is', e.data.response); + },false); + +Note that `e.data.selector` carries the original selector back, so you can tie it to the +request, while `e.data.response` carries the return value of the API method call. + +## Interacting with the IDE + +### IDE_Morph.prototype.getScenes() +The getScenes() method returns an array with the names of all scenes in the projects. The minimum number of elements is 1, since there is always at least one scene per project. The scene names are unique strings within the array. Note that the empty string ('') is a valid scene identifier. + +#### syntax + ide.getScenes(); + +#### return value +an Array of Strings, minimum length 1 + + +### IDE_Morph.prototype.getCurrentScene() +The getCurrentScene() method returns a string representing the name of the currently active scene in the project. If the scene is unnamed and empty string is returned. + +#### syntax + ide.getCurrentScene(); + +#### return value +a String, can be an empty String + + +### IDE_Morph.prototype.switchTo() +The switchTo() method displays the specified scene. It suspends all processes and clones of the previously active scene and passes control to the new scene. + +#### syntax + ide.switchTo(sceneName); + +#### parameters +* sceneName + - string, the name of the scene to be activated + +#### return value +undefined + + +### IDE_Morph.prototype.isRunning() +The isRunning() method returns `true` if the active scene is currently running one or more threads, `false` if the scene is idle. + +#### syntax + ide.isRunning(); + +#### return value +a Boolean + + +### IDE_Morph.prototype.stop() +The stop() method immediately terminates all currently running threads in the active scene and removes all temporary clones. It does not trigger a "When I am stopped" event. + +#### syntax + ide.stop(); + +#### return value +undefined + + +### IDE_Morph.prototype.broadcast() +The broadcast() method triggers all scripts whose hat block listens to the specified message. An optional callback can be added to be run after all triggered scripts have terminated. + +#### syntax + ide.broadcast(message [, callback]); + +#### parameters +* message + - string, the message to be sent to all listeners +* callback | optional + - function to execute after all scripts terminate, no arguments + +#### return value +undefined + + +### IDE_Morph.prototype.addMessageListenerForAll() +The addMessageListenerForAll() method sets up a function that will be called whenever a message is broadcast. The function takes one argument, the message being broadcast, and can be used to react to any message. Multiple message listeners can be set up, they all get executed in the order in which they were added. + +#### syntax + ide.addMessageListenerForAll(callback); + +#### parameters +* callback + * function to execute whenever a message is sent, takes one argument: The message string + +#### return value +undefined + + +### IDE_Morph.prototype.addMessageListener() +The addMessageListener() method sets up a function that will be called whenever the specified message is broadcast. Multiple message listeners can be set up per message, they all the executed in the order in which they were added. + +#### syntax + ide.addMessageListener(message, callback); + +#### parameters +* message + * string, the message to which the listener will react. If the message is an empty string the callback will be executed at any broadcast, passing the message as argument +* callback + * function to execute whenever the specified message is sent, takes no argument, except when the message to listen to is the empty string, then it takes the message as argument + +#### return value +undefined + + +#### IDE_Morph.prototype.getMessages() +The getMessage() method returns a new Array that contains all the message strings that occur in the project, both in hat blocks and in broadcast blocks. + +#### syntax + ide.getMessages(); + +#### return value +an Array of Strings, or an empty Array + + +### IDE_Morph.prototype.getVarNames() +The getVarNames() method returns a new Array that contains all the global variable names in the project. + +#### syntax + ide.getVarNames(); + +### return value +an Array of Strings, or an empty Array + + +### IDE_Morph.prototype.getVar() +The getVar() method returns the value of the global variable indicated by the specified name. + +#### syntax + ide.getVar(name); + +#### return value +whatever value the variable holds. + + +### IDE_Morph.prototype.setVar() +The setVar() methods assigns a value to the a global variable specified by name. + +#### syntax + ide.setVar(name, value); + +#### return value +undefined + + +### IDE_Morph.prototype.newList() +The newList() methods returns a new Snap! list. Optionally a source array containing the list elements can be specified. + +#### syntax + ide.newList([array]); + +#### return value +a new Snap! List + + +### IDE_Morph.prototype.getProjectXML() +the getProjectXML() method returns a string in XML format representing the serialized project currently loaded into the IDE. + +#### syntax + ide.getProjectXML(); + +#### return value +an XML String + + +### IDE_Morph.prototype.loadProjectXML() +the loadProjectXML() method replaces the current project of the IDE with another serialized one encoded in a string in XML format. Note that no user acknowledgement is required, all unsaved edits to the prior project are lost. + +#### syntax + ide.loadProjectXML(projectData); + +#### parameters +* projectData + * XML string representing a serialized project + +#### return value +undefined + + +### IDE_Morph.prototype.getSpriteScriptsXML() +the getSpriteScriptsXML() method returns a string in XML format representing the serialized scripts of the sprite identified by name or the currently edited sprite stripped of all dependenies, i.e. without custom block definitions or data (variables) + +#### syntax + ide.getSpriteScriptsXML([spriteName]); + +#### parameters +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken + +#### return value +an XML String + + +### IDE_Morph.prototype.loadSpriteScriptsXML() +the loadSpriteScriptsXML() method replaces the scripts of the specified sprite or stage with a set of serialized ones encoded in a string in XML format, no questions asked. Note: No dependency handling is expected, i.e. the xml-String is meant to be stripped of all dependenies, i.e. without custom block definitions or data (variables) + +#### syntax + loadSpriteScriptsXML(scriptsXML); + +#### parameters +* scriptsXML + * XML string representing a set of serialized scripts stripped of their dependencies + +#### return value +an XML String + + +### IDE_Morph.prototype.flashSpriteScripts() +the flashSpriteScripts() method highlights the blocks of the scripts of the sprite indicated by name - or the current sprite or stage if none - that correspond to the portion of the text between the start- and end lines when using the current codification mapping + +#### syntax + flashSpriteScripts(fromLOC, toLOC[, spriteName[, colorCSV]]); + +#### parameters +* fromLOC + * integer representing the first line of mapped code to be signaled, starting at 1 +* toLOC + * integer representing the last line of mapped code to be signaled +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken +* colorCSV + * string with comma-separated integer values representing a color in the form "r,g,b[,a]", or none, in which case the default highlight color will be used. Color components are numbers between 0 and 255, alpha a fraction between 0 and 1. + +#### return value +undefined + + +### IDE_Morph.prototype.flashSpriteScriptAt() +the flashSpriteScriptAt() method highlights the innermost block of the scripts of the sprite indicated by name - or the current sprite or stage if none - that corresponds to the position of the given character index when using the current codification mapping + +#### syntax + flashSpriteScriptAt(charIdx[, spriteName[, colorCSV]]); + +#### parameters +* charIdx + * integer representing the character index of mapped code to be signaled, starting at 0 +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken +* colorCSV + * string with comma-separated integer values representing a color in the form "r,g,b[,a]", or none, in which case the default highlight color will be used. Color components are numbers between 0 and 255, alpha a fraction between 0 and 1. + +#### return value +undefined + + +### IDE_Morph.prototype.unflashSpriteScripts() +the unflashSpriteScripts() method un-highlights the blocks of the scripts of the sprite indicated by name - or the current sprite or stage if none - + +#### syntax + unflashSpriteScripts([spriteName]); + +#### parameters +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken + +#### return value +undefined + + +### IDE_Morph.prototype.flashSpriteScriptOutlineAt() +the flashSpriteScriptOutlineAt() method highlights the outline of the innermost block of the scripts of the sprite indicated by name - or the current sprite or stage if none - that corresponds to the position of the given character index when using the current codification mapping + +#### syntax + flashSpriteScriptOutlineAt(charIdx[, spriteName[, colorCSV[, border]]]); + +#### parameters +* charIdx + * integer representing the character index of mapped code to be signaled, starting at 0 +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken +* colorCSV + * string with comma-separated integer values representing a color in the form "r,g,b[,a]", or none, in which case the default highlight color will be used. Color components are numbers between 0 and 255, alpha a fraction between 0 and 1. +* border + * integer representing the pixel width of the outline highlight + +#### return value +undefined + + +### IDE_Morph.prototype.unflashSpriteScriptsOutline() +the unflashSpriteScriptsOutline() method un-highlights the blocks outlines of the scripts of the sprite indicated by name - or the current sprite or stage if none - + +#### syntax + unflashSpriteScriptsOutline([spriteName]); + +#### parameters +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken + +#### return value +undefined + + +### IDE_Morph.prototype.showScriptBalloonAt() +the showScriptBalloonAt() method highlights the outline of the innermost block of the scripts of the sprite indicated by name - or the current sprite or stage if none - that corresponds to the position of the given character index when using the current codification mapping + +#### syntax + showScriptBalloonAt(contents, charIdx[, spriteName]); + +#### parameters +* contents + * data to be displayed inside the speech balloon, can be a string, number, costume, morph, canvas, list, table etc. - anything first-class in Snap! +* charIdx + * integer representing the character index of mapped code to be signaled, starting at 0 +* spriteName + * name of sprite or stage whose scripts to fetch, or none, in which case the currently edited object will be taken + +#### return value +undefined + + +### IDE_Morph.prototype.closePopUps() +the closePopUps() method removes all pop-up menus and speech balloon, if any + +#### syntax + closePopUps(); + +#### return value +undefined + + +### IDE_Morph.prototype.unsavedChanges() +the unsavedChanges() method returns a Boolean value indicating whether the currently edited project has been modifed since it was last saved. + +#### syntax + ide.unsavedChanges(); + +#### return value +a Boolean + + +### IDE_Morph.prototype.resetUnsavedChanges() +the resetUnsavedChanges() method resets the value returned by unsavedChanges() to false. + +#### syntax + ide.resetUnsavedChanges(); + +#### return value +undefined + + +### IDE_Morph.prototype.setTranslation() +the setTranslation() method switches to the specified language, formatted as ISO 639-1 code, and optionally runs a callback afterwards, e.g. to broadcast an event. Note that switching to another translation involves serializing and deserializing the current project and thus stops all running processes. If you wish to "continue" a project afterwards you can use the callback to trigger an event, such as the green flag ('\_\_shout__go\_\_'). Also note that the language setting does not overwrite the user's own setting which is stored in the browser this way, so that the next time the user opens Snap their own language preference again takes effect. + +#### syntax + ide.setTranslation(countryCode [, callback]); + +#### parameters +* countryCode + - string representing a country in ISO 639-1 format +* callback | optional + - function to execute after the language has been set, no arguments + +#### return value +undefined + + +## Manipulating Lists + +Snap! lists can be accessed and manipulated through a set of methods described in the file `lists.js` diff --git a/elements/pl-snap/Snap/docs/CONTRIBUTING.md b/elements/pl-snap/Snap/docs/CONTRIBUTING.md new file mode 100644 index 00000000..f4faab6e --- /dev/null +++ b/elements/pl-snap/Snap/docs/CONTRIBUTING.md @@ -0,0 +1,248 @@ +# How to contribute + +last updated on Jun. 09, 2023 + +Attached is the current development code base for Snap! (formerly known as BYOB4). +It consists of several JavaScript, HTML and text files, and while some of it may +be functional most parts will be in flux and subject to frequent, even fundamental +modifications. This document lays out a few simple guidelines ensuring that +collaborative code contribution works out. + + +## Coding + +Please check your code frequently with JSLint, either at JSlint.com or +via a locally installed jslint. + +For our Snap code set JSLint's settings to: + +* assume a browser +* tolerate missing 'use strict' pragma +* `4` indentation +* `78` maximum line length + +If you're working on the core Morphic library you can also + +* tolerate eval +* tolerate unfiltered for in + +although you'll probably not ever going to need either EVAL or FORIN in your +changesets anyway. + +There are, of course, other tools - like JSHint and browser debug tools - that +help you debug your code. Feel free to use whichever suits you best, but let's +all agree on JSLint's (nitpicky!) formatting rules so we get code that's well +readable and easily shareable among ourselves. + + +### Coding style + +Snap's codebase is both big and fast moving. We'll continue to churn out several +builds per day for a long time, hunting bugs and adding features throughout the +whole application. We'll also need to be able to get our heads around the whole +codebase. Being able to read and to quickly understand the code is most important, +much more so than mathematical elegance. + +Let me really stress this point: In creating Snap we're neither playing "Code Golf" +(solving a problem using the least number of keystrokes) nor are we trying to +outsmart Knuth. Instead we're maintaining a large number of small interchangeable +code chunks, therefore: + + +### Avoid + +* accessing the DOM +* frameworks (e.g. JQuery) +* modules and namespaces (e.g. IIFE) + - all of Snap is a single "World" with unique names for everything + - remember: Changesets contain "small interchangeable code chunks"... +* passing "thisArg" to functions like `map()`, `filter()` or `forEach()` + - except in `call()` + - always use `myself` to reference `this` in an outer scope instead +* meta-class systems + - use Morphic's way of creating class-like constructors instead + - initialize all attributes either in the constructor or in an `init()` + method, so you now the object's structure by casting a single look + upon it. Avoid adding adding attributes elsewhere, or if you do, + initialize them explicitly to "null" in the constructor or `init()` + code +* nested ternary operators +* RegEx +* overwriting existing definitions + - except in changesets, duh :-) + - create new constructors instead +* non-descriptive names for variables, functions, objects +* giant functions + - which often are "modules in disguise", + especially if they define local helper functions + - create a new constructor instead + + +### Testing your code + +(don't worry, I'm not talking about formal UnitTest Suites or other BDSM software +fetishes, just about playing with what you're creating while you're doing it) + +To test your changes locally, just open `index.html` in your browser. + +### Inspectors + +To actually play with your Morphs you can right-click on them and open an +inspector on them. You can open more than one inspector on each object. The +inspector pretty much works the same as in Smalltalk. It even has an evaluation +pane at the bottom, in which you can type in any JS code, mark it with your mouse +(or select all with ctrl-a), righ-click on the selection and either "do it", "show +it" or "inspect it" (again, like in Squeak). + +Needless to say, in the evaluation pane `this` always refers to the inspected +object. + + +### Source Code Mgmt + +Snap! is hosted on Github at https://github.com/jmoenig/Snap. You can make a fork +via the Github "Fork" button and then create a PR by pushing a branch to your fork +and then creating a PR against the master brancd of `jmoenig/Snap`. You can see +current PRs here: https://github.com/jmoenig/Snap/pulls + +--- + + +## Translating Snap! + +At this stage of development, Snap! can be translated to any LTR language +maintaining the current order of inputs (formal parameters in blocks). + +Translating Snap! is easy: + + +### 1. Download + +Download the sources and extract them into a local folder on your +computer: https://github.com/jmoenig/Snap/releases/latest. + +Use the German translation file (named 'lang-de.js') as template for your +own translations. Start with editing the original file, because that way +you will be able to immediately check the results in your browsers while +you're working on your translation (keep the local copy of snap.html open +in your web browser, and refresh it as you progress with your +translation). + + +### 2. Edit + +Edit the translation file with a regular text editor, or with your +favorite JavaScript editor. + +In the first non-commented line (the one right below this +note) replace "de" with the two-letter ISO 639-1 code for your language, +e.g. + + fr - French => SnapTranslator.dict.fr = { + it - Italian => SnapTranslator.dict.it = { + pl - Polish => SnapTranslator.dict.pl = { + pt - Portuguese => SnapTranslator.dict.pt = { + es - Spanish => SnapTranslator.dict.es = { + el - Greek => => SnapTranslator.dict.el = { + +etc. (see ) + + +### 3. Translate + +Then work through the dictionary, replacing the German strings against +your translations. The dictionary is a straight-forward JavaScript ad-hoc +object, for review purposes it should be formatted as follows: + +``` +{ + "English string": "Translation string", + "last key": "last value" +} +``` + +and you only edit the value strings following the colon. Note that each +key-value pair needs to be delimited by a comma, but that there shouldn't be a +comma after the last pair (again, just overwrite the template file and you'll be +fine). + +If something doesn't work, or if you're unsure about the formalities you +should check your file with [JSLint](https://JSLint.com) + +This will inform you about any missed commas etc. + + +### 4. Accented characters + +Depending on which text editor and which file encoding you use you can +directly enter special characters (e.g. Umlaut, accented characters) on +your keyboard. However, I've noticed that some browsers may not display +special characters correctly, even if other browsers do. So it's best to +check your results in several browsers. If you want to be on the safe +side, it's even better to escape these characters using Unicode. + +See this collection of JavaScript utilities: http://0xcc.net/jsescape/ + + +### 5. Block specs + +At this time your translation of block specs will only work +correctly, if the order of formal parameters and their types +are unchanged. Placeholders for inputs (formal parameters) are +indicated by a single underscore character that is not part of another world, +i.e. there should be a blank spade between the underscore slot placeholder and +any preceding or following text. + +For example: + + 'say _ for _ secs' + +notice blank spaces between the underscores and their surrounding text. + +In this example: + + 'point towards _' + +the underscore already stands alone as the last word and therefore doesn't +require to be followed by another space. + +Likewise: + + '_ effect' + +doesn't require the underscore placeholder to be preceded by a space since +it already is the first word. + + +### 6. Submit + +When you're done, rename the edited file by replacing the "de" part of the +filename with the two-letter ISO 639-1 code for your language, e.g. + + fr - French => lang-fr.js + it - Italian => lang-it.js + pl - Polish => lang-pl.js + pt - Portuguese => lang-pt.js + es - Spanish => lang-es.js + el - Greek => => lang-el.js + +and send it to me for inclusion in the official Snap! distribution. +Once your translation has been included, Your name will the shown in the +"Translators" tab in the "About Snap!" dialog box, and you will be able to +directly launch a translated version of Snap! in your browser by appending + + lang:xx + +to the URL, `xx` representing your translations two-letter code. + + +### 7. Known issues + +In some browsers accents or ornaments located in typographic ascenders +above the cap height are currently (partially) cut-off. + +--- + +Enjoy! + +-Jens diff --git a/elements/pl-snap/Snap/docs/Extensions.md b/elements/pl-snap/Snap/docs/Extensions.md new file mode 100644 index 00000000..0edf7346 --- /dev/null +++ b/elements/pl-snap/Snap/docs/Extensions.md @@ -0,0 +1,179 @@ +# Snap! Extensions + +> Last updated October 19, 2022 + +Snap! Extensions take the idea of a library, and expand it by allowing you to add your own JavaScript code. +Much of the work happens through two (hidden) primitive blocks. + +## Enable Extensions Blocks +Go to the Settings Menu (the cog) and turn on "Extension Blocks". +You now have two new blocks in the _Other_ category title called `primitive`. + +The first argument is a dropdown menu which contains list of allowed JavaScript calls, showing the function signature. +The second argument is a variadic input to pass data to the selected JavaScript function. +Both the reporter and command block have access to the same set of functions, you can use whichever is necessary. + +It is expected that you'll use the `primitive` block directly in a library, but you'll want to wrap it inside a custom block. + +## Adding New Primitive Functions + +The built-in set of primitives will get you a lot of functionality, but you'll likely want to do something more. +You can also extend Snap! with your own externally hosted JavaScript file(s) +and have them add your own extension primitives and menus to the global +SnapExtensions dictionaries. This lets you provide libraries to support +special APIs and custom hardware. + +### 1. Primitives (additional blocks) + +The names under which primitives are stored will apear in the dropdown +menus of the hidden extension "primitive" blocks sorted alphabetically. +(You can find those extension primitives in Snap's search bar or in dev +mode. There are two version of the primitive block, a command version and +a reporter one, both show the same list of available extensions.) + +#### naming conventions +`domain-prefix_function-name(parameter-list)` +example: 'lst_sort(list, fn)' +- domain-prefix: max 3-letter lowercase identifier + followed by an underscore + e.g.: err_, lst_, txt_, dta_, map_, tts_, xhr_, geo_, mda_ +- function-name: short, single word if possible, lowercase +- parameter-list: comma separated names or type indicators + +#### function semantics +- functions are called by the "primitive" blocks with any arguments provided +- use the "function () {}" notation to define functions, not the ES6 arrow + notation, otherwise "this" will not get scoped correctly +- "this" refers to the current snap object (sprite or stage) at call-time +- a reference to the current process is always passed as last argument + +### 2. Menus (for input slots) + +The names of the available dynamic drowdown menus can be written into the +"options" dialog when defining an input slot. Additionally you can choose +from a list of available menus when holding down the shift-key while +clicking on the partial-gear button in Snap's input-slot dialog. + +#### naming conventions +`domain-prefix_function-name` +example: 'clr_number' +- domain-prefix: max 3-letter lowercase identifier + followed by an underscore + e.g.: clr_, txt_, lst_ +- function-name: short, single word if possible, lowercase +- NOTE: dynamic menu functions cannot have any inputs + +#### function semantics +- use the "function () {}" notation to define functions, not the ES6 arrow + notation, otherwise "this" will not get scoped correctly +- "this" refers to the current input-slot at call-time (when the menu is + requested by the user by clicking on the down-arrow symbol) +- to get a handle on the current block use "this.parentThatIsA(BlockMorph)" +- likewise to get a handle on the current sprite use + "this.parentThatIsA(IDE_Morph).currentSprite" +- if you want the menu of one input slot to depend on the contents of + another input slot of the same block, you can get a handle to the block + using the above method, and then access all inputs by calling + "block.inputs()". This will give you an array of all input slots. + You can access the contents of an input slot by calling "slot.evaluate()" + +### 3. Buttons (in the palette) + +You can have your extension add buttons at the top of the palette in a +particular category. Usually, you will want to add these buttons to the +category created by your XML library. + +To do so, just add a button entry in your JS extension file: + +```js + SnapExtensions.buttons.palette.push( + { + category: 'My Extension', + label: 'Do Something', + action: function () { doYourStuffWith(this); }, + hint: 'This button does things', + hideable: false + } + ); +``` + +Inside the action, "this" points to the currently selected object, be it a +sprite or the Stage. + +The `hideable` attribute defines whether the button will be hidden when +turning off "Show buttons" in single palette mode. By default, extension +buttons will not be hidden. + +### 4. External JavaScript files + +You can provide extensions for your custom hardware or for arbitrary APIs +or extend Snap! with JavaScript libraries from other parties. You can +load additional JavaScript files using the + + src_load(url) + +extension primitive inside Snap, which you can find using Snap's search bar +in the IDE. The loading primitive will wait until the source file has fully +loaded and its defined functions are ready to be called. +Snap remembers the external extensions that have been already loaded and +will ignore any subsequent calls to load the same external extension again. +This lets you lazily initialize your extension by simply adding a +"src_load(url)" command for your external JS file before calling any of its +added functions. + +### 5. Miscellaneous + +#### calling extension primitives in other JavaScript functions + +You can call other extension primitives from your own JavaScript functions, +especially if you want to reuse them in your own extensions. Just make sure +to use `apply()` instead of calling them directly, so "this" gets scoped +correctly, e.g.: + +```js + SnapExtensions.primitives.get('var_declare(scope, name)').apply( + this, + ['global', '_my var', proc] + ); +``` +Don't forget to pass in a reference to the current process as last parameter +in case the callee requires it. + +#### adding primitives to SnapExtensions + +It is the suggested best practice to expose your own extension primitives +by adding them to the global SnapExtensions libraries (for primitives and +menus) using the very same conventions described herein, and then to offer +a library of custom blocks that make calls to your additional operations. + +#### developing an extension + +Running the "src_load(url)" primitive will throw an error unless you first +check the "Enable JavaScript extensions" setting in Snap's preferences menu, +or if your JavaScript extension comes from a list of trusted hosts. +While you develop your JavaScript extension it's recommended to turn on the +"Enable JavaScript extensions" setting to load the extension once, and +then to turn it off again, so you can make sure your custom blocks are not +using any "JS Function" blocks (because those will be caught if the +preference is turned off). + +#### Publishing an Extension + +When you're ready to publish your extension you can contact us to allow-list +the url hosting your JS file, or you can send me a Github pull-request to +include it in the main Snap branch. +We recommend submitting your extensions to the main Snap! Github repository +so they can be made available in the offline versions (source download +and PWA). + +External extensions are a powerful tools to change, override and generally +mold Snap into anything you want, so please use these capabilities sensibly. +We look forward to your innovations and don't plan to restrict the scope of +what extensions are allowed to modify. For security reasons we do ask you to +refrain from exposing any form of JS eval(), including "new Function()" to +end users (if you want to use eval() internally in your extension we'll +frown on you but not reject your contribution). + +## Examples + +SciSnap v2, TuneScope, and MQTT are some of the libraries that make excellent use of extensions APIs. diff --git a/elements/pl-snap/Snap/docs/Migrating.md b/elements/pl-snap/Snap/docs/Migrating.md new file mode 100644 index 00000000..d5be122c --- /dev/null +++ b/elements/pl-snap/Snap/docs/Migrating.md @@ -0,0 +1,79 @@ +# Migrating to Morphic2 and Snap!6 + +Jens Mönig, July 11, 2020 + +This document gives a very brief overview of the Morphic changes from v1 to v2 without explaining the architectural changes. It is meant to help you move your existing Morphic application, such as a fork of the Snap! programming environment, to the new Morphic kernel quickly and successfully. + +The first section is a list of changes. you don't have to read it to get started migrating. Instead you may refer to it when you feel the need for a - very - slightly deeper insight into the changes that have been made. + +The second section is a recipe how to actually migrate your code. It's a list of words to search your code for, with directions what to replace them with. It's best to go through that list in the order it is written down here, file by file. Afterwards your Morphic app or Snap! fork should be able to work with the new Morphic2 kernel. + +## Morphic Changes + +* `noticesTransparentClick` => `!isFreeForm` (reversed default) +* `drawOn()` / `fullDrawOn()` takes context instead of Canvas as first arg +* `drawNew()` is deprecated => `render()`, also takes context as arg +* new`rerender()` to earmark for rerendering +* `.image`accessing has been turned intoa getter method: `getImage()` +* `.image`property has been deprecated, renamed to `cachedImage`for Morphs that need to check for pixel-wise collision frequently +* new `isCachingImage` flag (default: false) +* new `shouldRerender` flag (default: false) +* `fixLayout()`is now available for all Morphs, determines extent and arranges submorphs, if any, gets called from `setExtent()` +* new `fixHolesLayout()` method in case your Morphs have untouchable areas ("holes") +* "silent" - functions are no longer needed, e.g. `silentSetExtent()`, `silentMoveBy()` + - `silentSetExtent` => use `bounds.setExtent()` to avoid infinite recursion + - `silentMoveBy` => use `moveBy()` + - `silentSetPosition` => use `setPosition()` + - `silentSetWidth` => use `bounds.setWidth()` to avoid infinite recursion + - `silentSetHeight` = use `bounds.setHeight()` to avoid infinite recursion +* likewise "silent" parameters to functions are no longer needed and supported and should simply be removed +* `cachedFullImage` has been removed and is no longer available (except internally for the HandMorph) +* `cachedFullBounds` has been removed and is no longer available (except internally for the HandMorph) +* `trackChanges` and other damage-list housekeeping tweaks are no longer needed and no longer supported, except for the Pen constructor's isWarped property and its methods, such as `startWarp()` and `endWarp()`. +* Pen >> `wantsRedraw` is no longer needed and deprecated +* holes: Morphs can have a list of rectangles representing "untouchable" areas, in this case use `fixHolesLayout()` to arrange them +* new Morphic constants avoid creating zillions of objects for the same thing, these are + - `new Point()`, `new Point(0, 0)` => `ZERO` + - `new Color()`, `new Color(0, 0, 0)` => `BLACK` + - `new Color(255, 255, 255)` => `WHITE` +* `virtualKeyboard` property in Morphic preference has been deprecated +* `fullImageClassic()` => is now always just `fullImage()` +* `keyboardReceiver` => `keyboardFocus` +* keyboard navigation can be activated for any visible menu by pressing an arbitrary key +* new `noDropShadow` property for Morphs that already have built-in shadows (Menus, SpeechBubbles) +* new `fullShadowSource` flag for Morphs, default is `true`, turn off (`false`) to only use the simple image instead of `fullImage()` + +## Migrating Your Sources + +Search your code for these words and replace them according to the instructions. It's best to follow the order given here. The last 3 replacements with constants are optional optimizations and can be left out. + +**Words to search your code for:** + +* **drawNew** + - rename method definitions to `render`, notice that the first argument needs to be the 2D context, therefore remove the part in the code that makes a new canvas and queries its context. + - factor out the parts of the code that determine and set the extent and add or arrange submorphs and move them into a - possibly new - method named `fixLayout()` + - rename function calls to `drawNew()` to `fixLayout()` and/or `rerender()`, check whether the call is at all needed as it might be redundant in the new system +* **wantsRedraw** => replace with `rerender()` +* **noticesTransparentClick** => replace with `!isFreeForm`, use with caution, as free forms should also cache their image for performance reason, which in turn strains memory usage +* **.image** => rename getters to `getImage()`, use with caution because of performance bottlenecks +* **cachedFullImage** => no longer supported, remove all references +* **fullImageClassic** => rename method calls to just `fullImage()` +* **silentSet** + - remove method definitions + - rename method calls: + - *silentSetExtent* => use `bounds.setExtent()` to avoid infinite recursion + - *silentMoveBy* => use `moveBy()` + - *silentSetPosition* => use `setPosition()` + - *silentSetWidth* => use `bounds.setWidth()` to avoid infinite recursion + - *silentSetHeight* = use `bounds.setHeight()` to avoid infinite recursion +* **silentMove** => replace `silentMoveBy()` with `moveBy()` +* **silentReplace** => (Snap! only) use replace instead +* **silent** => remove parameters named "silent" from function definitions and calls +* **cachedFullBounds** => no longer supported, remove all references +* **trackChanges** => no longer supported, remove all references +* **keyboardReceiver** => rename to `keyboardFocus` +* **startLayout** => no longer supported, remove all calls +* **endLayout** => no longer supported, remove all calls +* **new Point(0, 0)** => `ZERO`, but only if the point is not to be mutated +* **new Color() / new Color(0, 0, 0)** => `BLACK`, again, only if the color is not to be mutated +* **new Color(255, 255, 255)** => `WHITE` diff --git a/elements/pl-snap/Snap/docs/Offline.md b/elements/pl-snap/Snap/docs/Offline.md new file mode 100644 index 00000000..9fe07e7f --- /dev/null +++ b/elements/pl-snap/Snap/docs/Offline.md @@ -0,0 +1,101 @@ +# Using Snap! Without an Internet Connection + +last updated on Nov. 25, 2021 + +Snap! is a web application hosted at +[https://snap.berkeley.edu/run](https://snap.berkeley.edu/run "Snap! online"). + +If you would like to use Snap! without being connected to the internet, e.g. in a remote area +or in a school with limited or unreliable online service there are two ways to set up Snap! locally +on your computer: Either as a "progressive web app" (PWA) or by downloading the sources and opening +them locally in your browser. + +## Installing Snap! as PWA + +The easiest way set up Snap! locally on your computer is to open the Snap! IDE in your browser and then to select "install" in the browser's url bar, usually found on the far right. This will let +you use Snap! just like any other app on your computer, tablet or phone, even if you have no +internet connection. You will also be able to import costumes, backgrounds, souds and additional +blocks just like you would if you were online, using the same dialogs and user interface. + +Currently the ability to install Snap! as a PWA is supported by Chrome, Edge, Safari on iOS, and Firefox on Android. If you're using one of these browsers, this is the preferred method for you: +Install once and you're done. + +## Downloading Snap!'s Sources + +If your preferred web browser does not support PWAs, e.g. if you're using Desktop Firefox, you can still use Snap! offline by following these + +### Simple Steps: + +1. Download the latest Snap! Release from +[https://github.com/jmoenig/Snap/releases/latest](https://github.com/jmoenig/Snap/releases/latest "Snap! Source Code"), and unpack the contents of the archive to your local disk. +2. Open the file `snap.html` in your browser. +3. There is no step 3. + +Snap! is just a web page, you can open it locally in your browser, no need to install anything +on your computer. You can use whichever operating system you like, you don't even need +admin rights. You can also use a memory stick to distribute the directory with source files +among the participants of a workshop or the students of your class, even if some of them +are using MacOS and others run MS Windows or Linux. + +### Remember to Unpack + +Windows users, this is for you. + +Once you've downloaded the source code, please remember to actually unpack the archive +to your computer. If you downloaded the zip file please actually unzip it, before you open +`snap.html`. If you use a Mac simple double-clicking the zip file unpacks it. But if you're +on Windows double clicking the zip fie will *not* unzip it but instead show you the contents of +the archive. + +### Which Web Browser? + +It's best to open Snap! in Chrome, Edge, Safari or Firefox. + +Snap! is using web standards and runs in any modern web browser. Some browsers are faster +than others, which makes using Snap! more fun. For the best user experience we recommend +Chrome or Firefox. IE does not comply with modern web standards and will not work. The new Edge browser is based on Chrome and will work just fine, if you have an old Windows version with an old version of Edge it will also work, but some operations will be so slow it takes the fun out of programming and playing. + +### What about Tablets? + +Snap! works on most modern tablets, but the UI isn't yet optimized for mobile use. Therefore we recommend to use a stylus or "pencil". This makes is much easier to click on small elements like +input slots, drop-down menus and expansion arrows. If a tablet is your primary computing device +for programming we also recommend an external Bluetooth keyboard. You'll be able to use Snap! +with the "soft" keyboard as well, but you might find it getting in the way of other UI elements +you'd like to see, e.g. blocks or sprites. + +### Restrictions of the Offline Version + +You can't access the cloud, duh. Everything else just works. + +Aside from accessing the cloud using Snap! offline in the browser by opening the `snap.html` +file locally there aren't any restrictions. You can use all the blocks, import pictures, sounds, +libraries, take snapshots with the webcom, record sounds with the microphone, draw your +own costumes etc. + +### Saving and Loading + +When you use Snap! locally you will not be able to save projects to the cloud, nor can you +access projects saved in the cloud. Instead projects will be exported as xml-files to your +computer, from where they can also be opened again. + +There are two ways to load projects and assets from your computer when you use Snap! +without an internet connection: + +1. Using the options in Snap's file menu opens an OS-native file dialog that lets you select +which file to import or load. +2. Alternatively you can drag projects and assets (extension libraries, pictures, sounds etc.) +from your computer directly into Snap! and drop it. If you import sounds or images you can +also drag and drop several files all at once. + +Easy, isn't it? + +### Keeping Snap! up-to-date + +From time to time it's wise to check whether a new version of Snap! is available. You can +find out the lastest release using the link above, and compare that to the offline sources on +your computer. If there is a newer version, simply replace the source files with the newer ones. + + +Enjoy! + +-Jens diff --git a/elements/pl-snap/Snap/docs/README.md b/elements/pl-snap/Snap/docs/README.md new file mode 100644 index 00000000..7b394c7f --- /dev/null +++ b/elements/pl-snap/Snap/docs/README.md @@ -0,0 +1,43 @@ +# Snap! Development Documentation +> last updated May 6, 2023. + +This guide is intended for _developers_ who want to ingrate Snap! into existing projects. Each of these guides is a breif introduction to maintaining an extension. The goal is to _minimize_ the amount of customizations you need to make to the Snap! source code, located in `src/`. + +**Before contributing source code modifications, please review [the contributations guide](./CONTRIBUTING.md) and get in touch! + +_Note:_ This document applies only to the Snap! IDE. The Snap!Cloud backend lives at [@snap-cloud/snapCloud](https://github.com/snap-cloud/snapCloud) on GitHub. + +## Guides + +There are many ways to build your own customized Snap! environments. Start in this order, with the least customizations. + +### Microworlds + +Microworlds are restricted Snap! environments, which hide blocks, and may change some settings that are saved with the project. + +Things you can save with the project: + +* Hiding Blocks +* Single Palette Settings +* Disable Click-to-Run +* Disable Dragging Data + +_More coming soon!_ + +### [Extensions.md](./Extensions.md) + +You can write JavaScript files which provide additional blocks, add interface elements, etc. These extensions are often packaged as a Snap! library. + +### [API.md](./API.md) + +The Snap! API can be used to embed or customize Snap! to be used in unique environments. You can check out the (work in progress) [Pyret example](../pyret/inline.html). + +### [Offline.md](./Offline.md) + +This describes how you can distribute Snap! to work offline. + +--- + +### [Migrating.md](./Migrating.md) + +This describes the internal changes to the Morphic library. It is probably not useful unless you have made a fork of Snap!. diff --git a/elements/pl-snap/Snap/help/BLANK.png b/elements/pl-snap/Snap/help/BLANK.png new file mode 100644 index 00000000..a935a25d Binary files /dev/null and b/elements/pl-snap/Snap/help/BLANK.png differ diff --git a/elements/pl-snap/Snap/help/BLANKWIDE.png b/elements/pl-snap/Snap/help/BLANKWIDE.png new file mode 100644 index 00000000..a17c707a Binary files /dev/null and b/elements/pl-snap/Snap/help/BLANKWIDE.png differ diff --git a/elements/pl-snap/Snap/help/Frobnicate Snap! Manual.sequ b/elements/pl-snap/Snap/help/Frobnicate Snap! Manual.sequ new file mode 100644 index 00000000..72d1b584 --- /dev/null +++ b/elements/pl-snap/Snap/help/Frobnicate Snap! Manual.sequ @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/Snap Manual Link Dictionary.ald b/elements/pl-snap/Snap/help/Snap Manual Link Dictionary.ald new file mode 100644 index 00000000..c4adc5d9 --- /dev/null +++ b/elements/pl-snap/Snap/help/Snap Manual Link Dictionary.ald @@ -0,0 +1,25 @@ +<>] + /1 [/c << /code2 [/t (uri:https://en.wikipedia.org/wiki/Spectral_color)] + /word2 [/t (Spectral color)] +>>] + /2 [/c << /code2 [/t (uri:https://en.wikipedia.org/wiki/Color_theory)] + /word2 [/t (color theory)] +>>] + /3 [/c << /code2 [/t (uri:https://en.wikipedia.org/wiki/Photoreceptor_cell)] + /word2 [/t (Rods and Cones)] +>>] + /4 [/c << /code2 [/t (uri:https://en.wikipedia.org/wiki/Indigo)] + /word2 [/t (Indigo)] +>>] + /5 [/c << /code2 [/t (uri:https://en.wikipedia.org/wiki/Magenta)] + /word2 [/t (a long story)] +>>] +>>] + /ExcludeWords [/c << /NumItems [/i 0] +>>] + /Name [/t (Dictionary)] +>>] +>> \ No newline at end of file diff --git a/elements/pl-snap/Snap/help/SnapManual.docx b/elements/pl-snap/Snap/help/SnapManual.docx new file mode 100644 index 00000000..9a593afb Binary files /dev/null and b/elements/pl-snap/Snap/help/SnapManual.docx differ diff --git a/elements/pl-snap/Snap/help/SnapManual.md b/elements/pl-snap/Snap/help/SnapManual.md new file mode 100644 index 00000000..1b617bbc --- /dev/null +++ b/elements/pl-snap/Snap/help/SnapManual.md @@ -0,0 +1,134 @@ +SNAP! MANUAL STYLE GUIDE and editing tips + +There are a lot of little details following this paragraph, but the most important thing is that the manual text should be correct, complete, unambiguous, and understandable by a teenager who has no idea how Snap! is implemented. And well-indexed. + +Fonts: +* Names of blocks and menu options: Tekton Pro Bold +* The name "Snap!": Candara, with the "!" in italics. (Copy/paste it.) +* Computer text outside of Snap!: Courier +* Everything else: Baskerville + +(If you're not careful, Word will put Times, Arial, or Helvetica in. Don't let it.) All 12 point except for headings, table of contents, and index. (You should never have to change the size by hand; setting the style to, e.g., "Heading 1" will set the font, style, and size correctly. And the TOC and Index take care of themselves.) + +Note: If you insert more than one word of Courier or Tekton Pro Bold in a text paragraph, carefully turn each space between words into Baskerville. Also be careful about spaces or punctuation abutting a non-Baskerville word. This sounds super finicky, but it looks terrible if you miss one. This also means you can't select a word to change into a different font by double-clicking, because Word will include the trailing space in the selection. + +Paragraphs: We have two paragraph styles, Normal and "Indented oaragraph." (Someday I'll get around to fixing the spelling.) The names are a little confusing. Word's automatic treatment of styles is more often correct with the names this way, even though indented is the really normal case. So you should manually choose Indented (which will stay chosen until you change it), with two exceptions: (1) The first paragraph after a heading (chapter, section, or subsection) should not be indented. This is one of those mysterious book editor rules, not worth fighting. (2) The text right after a displayed picture (in the context of pictures, "display" is the opposite of "run in with text"; it means the picture is on a line by itself) /may or may not/ be indented, depending on whether it is really a continuation of the paragraph interrupted by the display (not indented) or is starting a new topic (indented). + +Imported pictures (mainly exported from Snap!): They show up too big. If you have a retina display, they show up WAY too big. It's best if you shrink the picture to 50% or even 25% in Preview > Tools > Adjust size /before/ you import it into Word, to keep the .docx and .pdf files smaller. Or, in Snap!, shift-click the Settings gear and uncheck "Enable retina display." To shrink further, "Format Picture" > "Size" and try for 25% or 33% of the original size. If the picture is a single block to be run in with text, try 20% or even 15%. We are not trying for manual-wide consistency of sizes, in part because some very wide script pictures wouldn't fit unless we made everything tiny. But, all else being equal, use the same size percentage within a text topic. Alas, all else +/isn't/ equal, and the pictures Snap! makes aren't consistently scaled. Make it look good. If you try to resize a picture by grabbing its corner, +/don't forget to hold down the shift key!/ Whoever decided that Fun House Mirror should be the default made the second-worst mistake in computing history, after the creation of the Web. (Lots of worse things have happened, but Facebook and friends aren't mistakes; they're just evil.) But, back to the point, it's best to resize by number in Format Picture. + +Displayed figures: The manual is inconsistent between centering and left-justifying the picture. It's ≈90% true that pictures of menus are left-justified while all other pictures (mostly blocks and results) are centered. Let's try to stick to that. If there are more than one picture in a display, select them all, click "Align or Distribute" > "Distribute horizontally," then decide how to align them vertically (typically Align Middle for syntactically unrelated pictures, but sometimes Align Top), then Group them. The whole group should be "Text Wrap" > "Top and Bottom." In "Format Picture" > "Layout" > "Advanced" you can set the top and bottom spacing to zero. + +There is a special case of display alignment for pictures with a list as the shown result of an expression. These pictures take a lot of vertical space, so in some cases they are aligned right, with a text paragraph in a text box to the left of the speech balloon but overlapping horizontally with the actual block. See page 38 for two examples. + +Pictures in line with text (typically a single block): Text Wrap > Tight, then Format Picture > Layout > Advanced left space to zero, right space to 0.06 inches. Then you can drag the block where it belongs in the text, but the fine positioning will require the cursor arrow keys. Put spaces in the text left or right of the picture where syntactically appropriate, i.e., where you'd put a space left or right of a word. To see why pictures taller than a single block are problematic in line, look at the second paragraph on page 7. It's layed out correctly, with respect to its meaning, but it /looks/ screwy. I should fix it. + +Writing style: Use exclamation points (other than in the name "Snap!") very sparingly; they should indicate danger, not enthusiasm. Absolutely do not suggest that something is "fun" or "interesting," etc. (But "more interesting" is okay when it means that you are giving a first, trivial example followed by an example that actually does something useful.) + +First person: Although the manual has two official authors, it's okay to use "I" when describing how you programmed something, e.g., +> the word “bark” is just an arbitrary name I made up +on page 9. But when documenting a disagreement, use "Jens thinks..." and "Brian thinks...," not "I think..." (We should try to minimize the need to document significant disagreements by resolving them!) It's also okay to use "we" for uncontroversial choices, both about Snap! itself and about examples in the manual ("we used..."). But /do not/ use "we" for a putative group including yourself and the reader, as in "next we should..." The reader is "you." + +Second person: Theoretically, "you" belongs in a tutorial, not in a reference manual. But the distinction is somewhat blurred in this manual, which is more nearly a reference in the early chapters and more nearly a tutorial in the OOP ones. But as early as page 9 we have +> In text input slots, a space character is shown as a brown dot, so that +> you can count the number of spaces between words, and in particular you +> can tell the difference between an empty slot and one containing spaces. +This is all okay, even though the occasional professor user complains about it. + +Index: The hardest and most annoying part of writing the manual (not counting fighting with Microsoft and Adobe) is indexing (as for any nonfiction writing). Make index entries for *names* (of blocks, of menu options, of dropdown input options) and for *ideas* (both "lexical scope" and "scope, lexical"; every significant word in the idea's name should have an index entry). People's names are indexed only by family name. If this is your first time, read the existing index to learn how entries are styled. Make sure that the index entries have the correct fonts! You can edit the text of the entry before you click "Mark" in the dialog. The index should probably be two or three times its current size, given the manual's current contents. If something isn't indexed, it effectively isn't in the manual. + +Punctuation: Trailing periods and commas go inside the quotation marks; other punctuation goes outside. This is occasionally problematic when ending a sentence with a quoted name of a block, option, input value, etc. I have very rarely put a period outside the closing quotation mark to avoid ambiguity, but I prefer to rephrase the sentence so that the quoted name isn't at the end. + +Use parentheses instead of dashes, all else being equal, but try not to nest parentheses. If you do use dashes, they have to be em dashes, not en dashes or double hyphens. (If you are indicating a range of numbers, such as RGB values 0-255, that calls for an en dash.) The subtraction operator is different from all of these. If you're on a Mac, option-minus is en dash; option-shift-minus is em dash. + +I tend to parenthesize too much, including several-sentence digressions, after which I forget the close paren. If you find one of those, remove the open paren, probably. Word changes " into curly quotes, and once in a rare while it gets confused about whether or not it's inside quoted text. Keep an eye out. + +Never (really, never) put a colon between a verb and its object, even if the object is a picture. That is, you wouldn't say +>X The higher order functions are: map, keep, and combine. +so you equally can't say "The higher order functions are:" followed by a picture of three blocks. Instead, rephrase to avoid the need for the colon or to move the verb elsewhere in the sentence. +> There are three higher order functions: +> Here are the higher order functions: +> The next category of blocks is higher order functions. +That last alternative doesn't need a colon, although it wouldn't hurt. (Note in passing that the subject of that last alternative is "category," not "blocks," so its verb is in the singular.) + +Widows and orphans: In this context, a "widow" is the last line of a paragraph, separated from the rest of the paragraph by a page break. An "orphan" is the first line of a paragraph, or a heading line, separated from the following text by a page break. Printers have used "widow" since forever; I never heard "orphan" until computer typesetting became a thing, probably because orphans are easy to fix: Insert a page break. Fixing a widow, though, involves tiny tweaks to spacing, may involve changes to several previous pages, may involve changes to the actual text, and requires a sense of aesthetics. If you solve either kind of problem with explicit page breaks, remember that the next change to the text of the manual may result in an almost-empty page downstream. In particular, don't think about widows or orphans until you've finished typing in all of the text you're adding! + +Short pages: Always start a chapter (Word "Heading 1," identified by a Roman numeral) on a new page, no matter how short that makes the previous page. (But if it's just a few lines, see if you can't squeeze some space out of the previous few pages.) Starting a section (Word "Heading 2," identified by a capital letter) on a new page is optional, but I generally do it if the section would otherwise start on the last quarter of a page or so. The same is true for subsections (Word "Heading 3," no identifier) but I'm less prone to putting page breaks before subsections. Real book editors (i.e., human beings employed by publishing companies to edit books) get very uptight if facing pages (2n and 2n+1) aren't exactly the same height, but amateurs like us don't worry about that. + +Another reason for a short page is that what comes next is a tall picture that won't fit at the bottom of the page. This can be okay, but if the picture is only slightly too tall, try to make room by squeezing earlier pages. If you do end up leaving a really significant empty space at the end of a page, try to make the immediately preceding text lead the reader to expect that the presentation of this topic isn't finished. + +Scratch: We officially think that the reader of the manual has used Scratch. This affects us in two ways: We barely mention the blocks that we share with them, and we sometimes explicitly compare the behaviors of Snap! and Scratch. Try not to let the latter be understandable as /criticism/ of Scratch; our party line is that Scratch is ideal for its stated purpose, and our language is different because our goals are different. Say that explicitly (but don't say "party line" of course) if there's any possibility of misunderstanding. And there's nothing wrong with documenting a block we share with Scratch in detail if that'll help the narrative. + + +HOW TO MAKE THE MANUAL: + +Yes, this is a 22-step process. :-( + +0. Change version number on the cover and at the top of page 5. If there has been a really major change (e.g., hyperblocks), consider updating the picture on the cover. + +1. Save changes. + +2. Remake table of contents: Click on "Table of Contents" at the top of page 2, then choose Update, then choose one of the two options depending on whether you have changed, added, or deleted any headings. + +3. Carefully check every line of the Table of Contents! Look for wrong fonts, missing labels (I, II, etc for level 1; A, B, etc for level 2; nothing for level 3), Chapter VII header at the top of the second column (if not, adjust spacing around chapters in the first column), Heading 2 letters restarting from A in each chapter. + +4. Edit Table of Contents: On page 2, insert a page break before Appendix A; change the text of II.E ("if you lose...") to boldface italic. On page 3, insert a column break before Appendix B. Manually fix the page number for the Index at the end of the ToC, which is not an official section (so it won't be numbered or lettered), so not automatically updated by Word. + +5. Save again. + +6. Scroll through the entire manual, looking for bad page breaks, mislabeled headings, and pictures out of place. (Some old pictures that are run in with text were inserted into their pages by putting a bunch of spaces in the text, setting the picture's "Wrap Text" to "None," and manually positioning the picture. These pictures will be out of place if the text on that page changes. To fix them, move the picture out of the way; delete the extra spaces (keeping one before and/or one after where the picture belongs, depending on nearby punctuation; set the picture's "Wrap Text" to "Tight"; then position the picture where it belongs. The last little bit of positioning should be done with the cursor arrow keys rather than with the mouse. Finally, go to + Format Picture > Layout > Advanced > Text Wrapping +and change the left distance to 0 and the right distance to 0.06 inches.) + +7. If you made changes, save again, then go back to step 2. + +8. Onward to the index! Click inside the index; the entire thing will be selected in grey. Now in the Word menu choose Insert > Index and Tables... In the "Formats" menu, choose "Modern." Then click OK. Word will ask if you want to replace the selected index. Say yes. + +9. Now edit the index. First, delete the headings for punctuation characters (!, ., #, and ⚡). Don't be afraid about the entire index still being selected in grey; you can select a subset of the index (such as a heading) within the big selection. Next, delete the heading for the "fi" ligature, and the (second) "F" heading after it. Scan through looking for widows and orphans, and try to fix them by adjusting spacing around individual headings. + +10. These issues are mostly fixed, but read the entire index looking for font problems. If you find one, don't just fix it in the index; go back to the page indicated and fix the entry there. (Click the ¶ button to make it visible.) + +11. Save again! + +12. Go to File > Page Setup and make sure it says "US Letter Borderless." (It's in a submenu buried below "US Letter" in the main menu.) Before you click OK, go up to the top where it says "Page Attributes," click, select "Microsoft Word," and make sure the "apply changes to" field says "whole document," not "current section." If anything goes wrong later in the process, or if you take your eyes off the Word window for a second, Word will switch it back to "US Letter," so keep checking! + +13. To make sure this worked, instead of choosing "Save as..." and then saving as PDF, choose "Print," make sure the preview of the cover is borderless, and then choose "Save as PDF" down in the bottom left corner. If the preview isn't borderless, click "Page setup" inside the Print dialog and repeat step 12 there. + +14. If Word pops up a dialog saying that a header or footer is outside the printable area, it means you looked away from the Word window for a second. Click "No" and go back to step 12. + +15. You now have a PDF; time to massage it. If you're on a Mac, find the file "snap-manual-meta.workflow" and double click it. Edit the Snap version number in the Title field, then click the Run button at the top right. If you're not on a Mac, find something equivalent for your operating system and edit this file to add that information. The goal is to change the PDF's metadata to get "Microsoft Word" out of the title. + +16. You're done with the required steps, but your PDF is 80Mb. It would be nice to reduce that. Fire up your virtual Windows machine and copy the PDF to its desktop. (For me, the following steps crash Acrobat on my Mac. That's why I have to shrink the PDF on my virtual PC. If it works on your Mac, great!) +Also copy the file "Snap Manual Link Dictionary.ald" from the help folder of the repo onto your PC desktop. You also need to have AutoBookmarker Pro installed on your PC. + +17. Open SnapManual.pdf in Acrobat. Go through their extremely obnoxious login process. + +18. Choose "Action Wizard" from the Tools menu, then choose "Frobnicate Snap Manual" as the action to perform. This will both reduce the size and make the links in the Table of Contents, the Index, and URLs active. + +19. Go eat dinner. + +20. Go eat breakfast. + +21. When it finally finishes, copy the file back to your Mac. It should be reduced down to 60Mb or so. (Yes, that's still a lot.) + + +LONG TERM PROJECTS + +* Find out what makes both the .docx and the .pdf so big, and fix it. + +* Convert to TeXinfo. (Someone did this a long time back, but I was scared to try to deal with picture layout in TeX so didn't keep it up.) + +* Systematically find and fix all the word-wrap-none pictures. + +* Add a bazillion index entries. + +* Tutorials, duh, real soon now. + +* Make Jens read it carefully, fix any errors, and add any missing features, shortcuts, gotchas, etc. + +* Get the line spacing consistent within a paragraph. + +* Find all the hideous block pictures, especially the ones including results in speech balloons, and redo them. + + diff --git a/elements/pl-snap/Snap/help/SnapManual.pdf b/elements/pl-snap/Snap/help/SnapManual.pdf new file mode 100644 index 00000000..184e2647 Binary files /dev/null and b/elements/pl-snap/Snap/help/SnapManual.pdf differ diff --git a/elements/pl-snap/Snap/help/addCustomBlock.png b/elements/pl-snap/Snap/help/addCustomBlock.png new file mode 100644 index 00000000..0ec55dae Binary files /dev/null and b/elements/pl-snap/Snap/help/addCustomBlock.png differ diff --git a/elements/pl-snap/Snap/help/addVariable.png b/elements/pl-snap/Snap/help/addVariable.png new file mode 100644 index 00000000..e1b55015 Binary files /dev/null and b/elements/pl-snap/Snap/help/addVariable.png differ diff --git a/elements/pl-snap/Snap/help/bounceOffEdge.png b/elements/pl-snap/Snap/help/bounceOffEdge.png new file mode 100644 index 00000000..908cfa60 Binary files /dev/null and b/elements/pl-snap/Snap/help/bounceOffEdge.png differ diff --git a/elements/pl-snap/Snap/help/bubble.png b/elements/pl-snap/Snap/help/bubble.png new file mode 100644 index 00000000..1368c55d Binary files /dev/null and b/elements/pl-snap/Snap/help/bubble.png differ diff --git a/elements/pl-snap/Snap/help/catch.png b/elements/pl-snap/Snap/help/catch.png new file mode 100644 index 00000000..17165058 Binary files /dev/null and b/elements/pl-snap/Snap/help/catch.png differ diff --git a/elements/pl-snap/Snap/help/changeBrightness.png b/elements/pl-snap/Snap/help/changeBrightness.png new file mode 100644 index 00000000..2c24d1d5 Binary files /dev/null and b/elements/pl-snap/Snap/help/changeBrightness.png differ diff --git a/elements/pl-snap/Snap/help/changeEffect.png b/elements/pl-snap/Snap/help/changeEffect.png new file mode 100644 index 00000000..15f25480 Binary files /dev/null and b/elements/pl-snap/Snap/help/changeEffect.png differ diff --git a/elements/pl-snap/Snap/help/changePan.png b/elements/pl-snap/Snap/help/changePan.png new file mode 100644 index 00000000..0681dfed Binary files /dev/null and b/elements/pl-snap/Snap/help/changePan.png differ diff --git a/elements/pl-snap/Snap/help/changePenHSVA.png b/elements/pl-snap/Snap/help/changePenHSVA.png new file mode 100644 index 00000000..c8f96ad0 Binary files /dev/null and b/elements/pl-snap/Snap/help/changePenHSVA.png differ diff --git a/elements/pl-snap/Snap/help/changeScale.png b/elements/pl-snap/Snap/help/changeScale.png new file mode 100644 index 00000000..08a50a89 Binary files /dev/null and b/elements/pl-snap/Snap/help/changeScale.png differ diff --git a/elements/pl-snap/Snap/help/changeSize.png b/elements/pl-snap/Snap/help/changeSize.png new file mode 100644 index 00000000..eb996c42 Binary files /dev/null and b/elements/pl-snap/Snap/help/changeSize.png differ diff --git a/elements/pl-snap/Snap/help/changeVolume.png b/elements/pl-snap/Snap/help/changeVolume.png new file mode 100644 index 00000000..c33a49d0 Binary files /dev/null and b/elements/pl-snap/Snap/help/changeVolume.png differ diff --git a/elements/pl-snap/Snap/help/changeXPosition.png b/elements/pl-snap/Snap/help/changeXPosition.png new file mode 100644 index 00000000..c4cff229 Binary files /dev/null and b/elements/pl-snap/Snap/help/changeXPosition.png differ diff --git a/elements/pl-snap/Snap/help/changeYPosition.png b/elements/pl-snap/Snap/help/changeYPosition.png new file mode 100644 index 00000000..0fd0de5f Binary files /dev/null and b/elements/pl-snap/Snap/help/changeYPosition.png differ diff --git a/elements/pl-snap/Snap/help/clear.png b/elements/pl-snap/Snap/help/clear.png new file mode 100644 index 00000000..b0501787 Binary files /dev/null and b/elements/pl-snap/Snap/help/clear.png differ diff --git a/elements/pl-snap/Snap/help/clearEffects.png b/elements/pl-snap/Snap/help/clearEffects.png new file mode 100644 index 00000000..fb1a03f7 Binary files /dev/null and b/elements/pl-snap/Snap/help/clearEffects.png differ diff --git a/elements/pl-snap/Snap/help/createClone.png b/elements/pl-snap/Snap/help/createClone.png new file mode 100644 index 00000000..639f9d5e Binary files /dev/null and b/elements/pl-snap/Snap/help/createClone.png differ diff --git a/elements/pl-snap/Snap/help/deleteVariable.png b/elements/pl-snap/Snap/help/deleteVariable.png new file mode 100644 index 00000000..ec36b24b Binary files /dev/null and b/elements/pl-snap/Snap/help/deleteVariable.png differ diff --git a/elements/pl-snap/Snap/help/direction.png b/elements/pl-snap/Snap/help/direction.png new file mode 100644 index 00000000..974da513 Binary files /dev/null and b/elements/pl-snap/Snap/help/direction.png differ diff --git a/elements/pl-snap/Snap/help/doAddToList.png b/elements/pl-snap/Snap/help/doAddToList.png new file mode 100644 index 00000000..9548ae7e Binary files /dev/null and b/elements/pl-snap/Snap/help/doAddToList.png differ diff --git a/elements/pl-snap/Snap/help/doAsk.png b/elements/pl-snap/Snap/help/doAsk.png new file mode 100644 index 00000000..03a96440 Binary files /dev/null and b/elements/pl-snap/Snap/help/doAsk.png differ diff --git a/elements/pl-snap/Snap/help/doBroadcast.png b/elements/pl-snap/Snap/help/doBroadcast.png new file mode 100644 index 00000000..e10963d2 Binary files /dev/null and b/elements/pl-snap/Snap/help/doBroadcast.png differ diff --git a/elements/pl-snap/Snap/help/doBroadcastAndWait.png b/elements/pl-snap/Snap/help/doBroadcastAndWait.png new file mode 100644 index 00000000..ab34120e Binary files /dev/null and b/elements/pl-snap/Snap/help/doBroadcastAndWait.png differ diff --git a/elements/pl-snap/Snap/help/doCallCC.png b/elements/pl-snap/Snap/help/doCallCC.png new file mode 100644 index 00000000..d286ad43 Binary files /dev/null and b/elements/pl-snap/Snap/help/doCallCC.png differ diff --git a/elements/pl-snap/Snap/help/doChangeTempo.png b/elements/pl-snap/Snap/help/doChangeTempo.png new file mode 100644 index 00000000..b6a3104f Binary files /dev/null and b/elements/pl-snap/Snap/help/doChangeTempo.png differ diff --git a/elements/pl-snap/Snap/help/doChangeVar.png b/elements/pl-snap/Snap/help/doChangeVar.png new file mode 100644 index 00000000..fe2d66db Binary files /dev/null and b/elements/pl-snap/Snap/help/doChangeVar.png differ diff --git a/elements/pl-snap/Snap/help/doDeclareVariables.png b/elements/pl-snap/Snap/help/doDeclareVariables.png new file mode 100644 index 00000000..78911d6c Binary files /dev/null and b/elements/pl-snap/Snap/help/doDeclareVariables.png differ diff --git a/elements/pl-snap/Snap/help/doDeleteAttr.png b/elements/pl-snap/Snap/help/doDeleteAttr.png new file mode 100644 index 00000000..c5ee071c Binary files /dev/null and b/elements/pl-snap/Snap/help/doDeleteAttr.png differ diff --git a/elements/pl-snap/Snap/help/doDeleteFromList.png b/elements/pl-snap/Snap/help/doDeleteFromList.png new file mode 100644 index 00000000..365433d6 Binary files /dev/null and b/elements/pl-snap/Snap/help/doDeleteFromList.png differ diff --git a/elements/pl-snap/Snap/help/doFaceTowards.png b/elements/pl-snap/Snap/help/doFaceTowards.png new file mode 100644 index 00000000..509e006f Binary files /dev/null and b/elements/pl-snap/Snap/help/doFaceTowards.png differ diff --git a/elements/pl-snap/Snap/help/doFor.png b/elements/pl-snap/Snap/help/doFor.png new file mode 100644 index 00000000..11c98eff Binary files /dev/null and b/elements/pl-snap/Snap/help/doFor.png differ diff --git a/elements/pl-snap/Snap/help/doForEach.png b/elements/pl-snap/Snap/help/doForEach.png new file mode 100644 index 00000000..b797427a Binary files /dev/null and b/elements/pl-snap/Snap/help/doForEach.png differ diff --git a/elements/pl-snap/Snap/help/doForever.png b/elements/pl-snap/Snap/help/doForever.png new file mode 100644 index 00000000..0cff6d1b Binary files /dev/null and b/elements/pl-snap/Snap/help/doForever.png differ diff --git a/elements/pl-snap/Snap/help/doGlide.png b/elements/pl-snap/Snap/help/doGlide.png new file mode 100644 index 00000000..2d6f373f Binary files /dev/null and b/elements/pl-snap/Snap/help/doGlide.png differ diff --git a/elements/pl-snap/Snap/help/doGotoObject.png b/elements/pl-snap/Snap/help/doGotoObject.png new file mode 100644 index 00000000..02e52cb9 Binary files /dev/null and b/elements/pl-snap/Snap/help/doGotoObject.png differ diff --git a/elements/pl-snap/Snap/help/doHideVar.png b/elements/pl-snap/Snap/help/doHideVar.png new file mode 100644 index 00000000..732761d8 Binary files /dev/null and b/elements/pl-snap/Snap/help/doHideVar.png differ diff --git a/elements/pl-snap/Snap/help/doIf.png b/elements/pl-snap/Snap/help/doIf.png new file mode 100644 index 00000000..dc651abf Binary files /dev/null and b/elements/pl-snap/Snap/help/doIf.png differ diff --git a/elements/pl-snap/Snap/help/doIfElse.png b/elements/pl-snap/Snap/help/doIfElse.png new file mode 100644 index 00000000..fe339da1 Binary files /dev/null and b/elements/pl-snap/Snap/help/doIfElse.png differ diff --git a/elements/pl-snap/Snap/help/doInsertInList.png b/elements/pl-snap/Snap/help/doInsertInList.png new file mode 100644 index 00000000..64ac7206 Binary files /dev/null and b/elements/pl-snap/Snap/help/doInsertInList.png differ diff --git a/elements/pl-snap/Snap/help/doPauseAll.png b/elements/pl-snap/Snap/help/doPauseAll.png new file mode 100644 index 00000000..975fa734 Binary files /dev/null and b/elements/pl-snap/Snap/help/doPauseAll.png differ diff --git a/elements/pl-snap/Snap/help/doPlayNote.png b/elements/pl-snap/Snap/help/doPlayNote.png new file mode 100644 index 00000000..0145a9bb Binary files /dev/null and b/elements/pl-snap/Snap/help/doPlayNote.png differ diff --git a/elements/pl-snap/Snap/help/doPlaySoundAtRate.png b/elements/pl-snap/Snap/help/doPlaySoundAtRate.png new file mode 100644 index 00000000..cd68146b Binary files /dev/null and b/elements/pl-snap/Snap/help/doPlaySoundAtRate.png differ diff --git a/elements/pl-snap/Snap/help/doPlaySoundUntilDone.png b/elements/pl-snap/Snap/help/doPlaySoundUntilDone.png new file mode 100644 index 00000000..ecad859d Binary files /dev/null and b/elements/pl-snap/Snap/help/doPlaySoundUntilDone.png differ diff --git a/elements/pl-snap/Snap/help/doRepeat.png b/elements/pl-snap/Snap/help/doRepeat.png new file mode 100644 index 00000000..0b88eaf7 Binary files /dev/null and b/elements/pl-snap/Snap/help/doRepeat.png differ diff --git a/elements/pl-snap/Snap/help/doReplaceInList.png b/elements/pl-snap/Snap/help/doReplaceInList.png new file mode 100644 index 00000000..f7d19149 Binary files /dev/null and b/elements/pl-snap/Snap/help/doReplaceInList.png differ diff --git a/elements/pl-snap/Snap/help/doReport.png b/elements/pl-snap/Snap/help/doReport.png new file mode 100644 index 00000000..00d11906 Binary files /dev/null and b/elements/pl-snap/Snap/help/doReport.png differ diff --git a/elements/pl-snap/Snap/help/doResetTimer.png b/elements/pl-snap/Snap/help/doResetTimer.png new file mode 100644 index 00000000..796bbc2f Binary files /dev/null and b/elements/pl-snap/Snap/help/doResetTimer.png differ diff --git a/elements/pl-snap/Snap/help/doRest.png b/elements/pl-snap/Snap/help/doRest.png new file mode 100644 index 00000000..f16eca59 Binary files /dev/null and b/elements/pl-snap/Snap/help/doRest.png differ diff --git a/elements/pl-snap/Snap/help/doRun.png b/elements/pl-snap/Snap/help/doRun.png new file mode 100644 index 00000000..32d83abf Binary files /dev/null and b/elements/pl-snap/Snap/help/doRun.png differ diff --git a/elements/pl-snap/Snap/help/doSayFor.png b/elements/pl-snap/Snap/help/doSayFor.png new file mode 100644 index 00000000..7d27ad04 Binary files /dev/null and b/elements/pl-snap/Snap/help/doSayFor.png differ diff --git a/elements/pl-snap/Snap/help/doSetFastTracking.png b/elements/pl-snap/Snap/help/doSetFastTracking.png new file mode 100644 index 00000000..7ee62a95 Binary files /dev/null and b/elements/pl-snap/Snap/help/doSetFastTracking.png differ diff --git a/elements/pl-snap/Snap/help/doSetGlobalFlag.png b/elements/pl-snap/Snap/help/doSetGlobalFlag.png new file mode 100644 index 00000000..34e9c155 Binary files /dev/null and b/elements/pl-snap/Snap/help/doSetGlobalFlag.png differ diff --git a/elements/pl-snap/Snap/help/doSetInstrument.png b/elements/pl-snap/Snap/help/doSetInstrument.png new file mode 100644 index 00000000..fcae381f Binary files /dev/null and b/elements/pl-snap/Snap/help/doSetInstrument.png differ diff --git a/elements/pl-snap/Snap/help/doSetTempo.png b/elements/pl-snap/Snap/help/doSetTempo.png new file mode 100644 index 00000000..90d6fb3a Binary files /dev/null and b/elements/pl-snap/Snap/help/doSetTempo.png differ diff --git a/elements/pl-snap/Snap/help/doSetVar.png b/elements/pl-snap/Snap/help/doSetVar.png new file mode 100644 index 00000000..7085eb07 Binary files /dev/null and b/elements/pl-snap/Snap/help/doSetVar.png differ diff --git a/elements/pl-snap/Snap/help/doSetVideoTransparency.png b/elements/pl-snap/Snap/help/doSetVideoTransparency.png new file mode 100644 index 00000000..498b3843 Binary files /dev/null and b/elements/pl-snap/Snap/help/doSetVideoTransparency.png differ diff --git a/elements/pl-snap/Snap/help/doShowVar.png b/elements/pl-snap/Snap/help/doShowVar.png new file mode 100644 index 00000000..644f4c37 Binary files /dev/null and b/elements/pl-snap/Snap/help/doShowVar.png differ diff --git a/elements/pl-snap/Snap/help/doStamp.png b/elements/pl-snap/Snap/help/doStamp.png new file mode 100644 index 00000000..21627a95 Binary files /dev/null and b/elements/pl-snap/Snap/help/doStamp.png differ diff --git a/elements/pl-snap/Snap/help/doStop.png b/elements/pl-snap/Snap/help/doStop.png new file mode 100644 index 00000000..9bdc932d Binary files /dev/null and b/elements/pl-snap/Snap/help/doStop.png differ diff --git a/elements/pl-snap/Snap/help/doStopAll.png b/elements/pl-snap/Snap/help/doStopAll.png new file mode 100644 index 00000000..e8cff7ce Binary files /dev/null and b/elements/pl-snap/Snap/help/doStopAll.png differ diff --git a/elements/pl-snap/Snap/help/doStopAllSounds.png b/elements/pl-snap/Snap/help/doStopAllSounds.png new file mode 100644 index 00000000..695af67a Binary files /dev/null and b/elements/pl-snap/Snap/help/doStopAllSounds.png differ diff --git a/elements/pl-snap/Snap/help/doStopBlock.png b/elements/pl-snap/Snap/help/doStopBlock.png new file mode 100644 index 00000000..82e4a4a3 Binary files /dev/null and b/elements/pl-snap/Snap/help/doStopBlock.png differ diff --git a/elements/pl-snap/Snap/help/doStopOthers.png b/elements/pl-snap/Snap/help/doStopOthers.png new file mode 100644 index 00000000..b90dff9b Binary files /dev/null and b/elements/pl-snap/Snap/help/doStopOthers.png differ diff --git a/elements/pl-snap/Snap/help/doStopThis.png b/elements/pl-snap/Snap/help/doStopThis.png new file mode 100644 index 00000000..30e9051a Binary files /dev/null and b/elements/pl-snap/Snap/help/doStopThis.png differ diff --git a/elements/pl-snap/Snap/help/doSwitchToCostume.png b/elements/pl-snap/Snap/help/doSwitchToCostume.png new file mode 100644 index 00000000..89624e7d Binary files /dev/null and b/elements/pl-snap/Snap/help/doSwitchToCostume.png differ diff --git a/elements/pl-snap/Snap/help/doTellTo.png b/elements/pl-snap/Snap/help/doTellTo.png new file mode 100644 index 00000000..2888c3c3 Binary files /dev/null and b/elements/pl-snap/Snap/help/doTellTo.png differ diff --git a/elements/pl-snap/Snap/help/doThink.png b/elements/pl-snap/Snap/help/doThink.png new file mode 100644 index 00000000..3e27b822 Binary files /dev/null and b/elements/pl-snap/Snap/help/doThink.png differ diff --git a/elements/pl-snap/Snap/help/doThinkFor.png b/elements/pl-snap/Snap/help/doThinkFor.png new file mode 100644 index 00000000..71c1b31b Binary files /dev/null and b/elements/pl-snap/Snap/help/doThinkFor.png differ diff --git a/elements/pl-snap/Snap/help/doUntil.png b/elements/pl-snap/Snap/help/doUntil.png new file mode 100644 index 00000000..f1869f04 Binary files /dev/null and b/elements/pl-snap/Snap/help/doUntil.png differ diff --git a/elements/pl-snap/Snap/help/doWait.png b/elements/pl-snap/Snap/help/doWait.png new file mode 100644 index 00000000..a7143872 Binary files /dev/null and b/elements/pl-snap/Snap/help/doWait.png differ diff --git a/elements/pl-snap/Snap/help/doWaitUntil.png b/elements/pl-snap/Snap/help/doWaitUntil.png new file mode 100644 index 00000000..730cac1f Binary files /dev/null and b/elements/pl-snap/Snap/help/doWaitUntil.png differ diff --git a/elements/pl-snap/Snap/help/doWarp.png b/elements/pl-snap/Snap/help/doWarp.png new file mode 100644 index 00000000..c589c3ce Binary files /dev/null and b/elements/pl-snap/Snap/help/doWarp.png differ diff --git a/elements/pl-snap/Snap/help/doWearNextCostume.png b/elements/pl-snap/Snap/help/doWearNextCostume.png new file mode 100644 index 00000000..caf0d1d3 Binary files /dev/null and b/elements/pl-snap/Snap/help/doWearNextCostume.png differ diff --git a/elements/pl-snap/Snap/help/down.png b/elements/pl-snap/Snap/help/down.png new file mode 100644 index 00000000..741d605c Binary files /dev/null and b/elements/pl-snap/Snap/help/down.png differ diff --git a/elements/pl-snap/Snap/help/evaluate.png b/elements/pl-snap/Snap/help/evaluate.png new file mode 100644 index 00000000..c7de2b51 Binary files /dev/null and b/elements/pl-snap/Snap/help/evaluate.png differ diff --git a/elements/pl-snap/Snap/help/evaluateCustomBlock.png b/elements/pl-snap/Snap/help/evaluateCustomBlock.png new file mode 100644 index 00000000..505cb8c3 Binary files /dev/null and b/elements/pl-snap/Snap/help/evaluateCustomBlock.png differ diff --git a/elements/pl-snap/Snap/help/floodFill.png b/elements/pl-snap/Snap/help/floodFill.png new file mode 100644 index 00000000..26e2e667 Binary files /dev/null and b/elements/pl-snap/Snap/help/floodFill.png differ diff --git a/elements/pl-snap/Snap/help/fork.png b/elements/pl-snap/Snap/help/fork.png new file mode 100644 index 00000000..1e2dd34a Binary files /dev/null and b/elements/pl-snap/Snap/help/fork.png differ diff --git a/elements/pl-snap/Snap/help/forward.png b/elements/pl-snap/Snap/help/forward.png new file mode 100644 index 00000000..75772c2a Binary files /dev/null and b/elements/pl-snap/Snap/help/forward.png differ diff --git a/elements/pl-snap/Snap/help/getCostumeIdx.png b/elements/pl-snap/Snap/help/getCostumeIdx.png new file mode 100644 index 00000000..436c42f0 Binary files /dev/null and b/elements/pl-snap/Snap/help/getCostumeIdx.png differ diff --git a/elements/pl-snap/Snap/help/getEffect.png b/elements/pl-snap/Snap/help/getEffect.png new file mode 100644 index 00000000..0e6abd3e Binary files /dev/null and b/elements/pl-snap/Snap/help/getEffect.png differ diff --git a/elements/pl-snap/Snap/help/getLastAnswer.png b/elements/pl-snap/Snap/help/getLastAnswer.png new file mode 100644 index 00000000..62138634 Binary files /dev/null and b/elements/pl-snap/Snap/help/getLastAnswer.png differ diff --git a/elements/pl-snap/Snap/help/getLastMessage.png b/elements/pl-snap/Snap/help/getLastMessage.png new file mode 100644 index 00000000..44846520 Binary files /dev/null and b/elements/pl-snap/Snap/help/getLastMessage.png differ diff --git a/elements/pl-snap/Snap/help/getPan.png b/elements/pl-snap/Snap/help/getPan.png new file mode 100644 index 00000000..a930c5d3 Binary files /dev/null and b/elements/pl-snap/Snap/help/getPan.png differ diff --git a/elements/pl-snap/Snap/help/getPenAttribute.png b/elements/pl-snap/Snap/help/getPenAttribute.png new file mode 100644 index 00000000..494ede3e Binary files /dev/null and b/elements/pl-snap/Snap/help/getPenAttribute.png differ diff --git a/elements/pl-snap/Snap/help/getPenDown.png b/elements/pl-snap/Snap/help/getPenDown.png new file mode 100644 index 00000000..b16e530b Binary files /dev/null and b/elements/pl-snap/Snap/help/getPenDown.png differ diff --git a/elements/pl-snap/Snap/help/getScale.png b/elements/pl-snap/Snap/help/getScale.png new file mode 100644 index 00000000..7228f23d Binary files /dev/null and b/elements/pl-snap/Snap/help/getScale.png differ diff --git a/elements/pl-snap/Snap/help/getTempo.png b/elements/pl-snap/Snap/help/getTempo.png new file mode 100644 index 00000000..62a1b21a Binary files /dev/null and b/elements/pl-snap/Snap/help/getTempo.png differ diff --git a/elements/pl-snap/Snap/help/getTimer.png b/elements/pl-snap/Snap/help/getTimer.png new file mode 100644 index 00000000..dc2e1eaa Binary files /dev/null and b/elements/pl-snap/Snap/help/getTimer.png differ diff --git a/elements/pl-snap/Snap/help/getVolume.png b/elements/pl-snap/Snap/help/getVolume.png new file mode 100644 index 00000000..451a7e37 Binary files /dev/null and b/elements/pl-snap/Snap/help/getVolume.png differ diff --git a/elements/pl-snap/Snap/help/goBack.png b/elements/pl-snap/Snap/help/goBack.png new file mode 100644 index 00000000..725cc457 Binary files /dev/null and b/elements/pl-snap/Snap/help/goBack.png differ diff --git a/elements/pl-snap/Snap/help/goToLayer.png b/elements/pl-snap/Snap/help/goToLayer.png new file mode 100644 index 00000000..82335307 Binary files /dev/null and b/elements/pl-snap/Snap/help/goToLayer.png differ diff --git a/elements/pl-snap/Snap/help/gotoXY.png b/elements/pl-snap/Snap/help/gotoXY.png new file mode 100644 index 00000000..76bc4be3 Binary files /dev/null and b/elements/pl-snap/Snap/help/gotoXY.png differ diff --git a/elements/pl-snap/Snap/help/hide.png b/elements/pl-snap/Snap/help/hide.png new file mode 100644 index 00000000..93cff702 Binary files /dev/null and b/elements/pl-snap/Snap/help/hide.png differ diff --git a/elements/pl-snap/Snap/help/isObject_type_.png b/elements/pl-snap/Snap/help/isObject_type_.png new file mode 100644 index 00000000..dc27d11e Binary files /dev/null and b/elements/pl-snap/Snap/help/isObject_type_.png differ diff --git a/elements/pl-snap/Snap/help/joinwords.png b/elements/pl-snap/Snap/help/joinwords.png new file mode 100644 index 00000000..8916d2ac Binary files /dev/null and b/elements/pl-snap/Snap/help/joinwords.png differ diff --git a/elements/pl-snap/Snap/help/list$arrowRightsentence.png b/elements/pl-snap/Snap/help/list$arrowRightsentence.png new file mode 100644 index 00000000..1383af6c Binary files /dev/null and b/elements/pl-snap/Snap/help/list$arrowRightsentence.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/.gitignore b/elements/pl-snap/Snap/help/manual-LaTeX/.gitignore new file mode 100644 index 00000000..cb5f3c2b --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/.gitignore @@ -0,0 +1,7 @@ +*.aux +*.log +*.out +*.toc +en/snap-manual.pdf +pl/snap-podrecznik.pdf +*.synctex.gz diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/alonzo-waving.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/alonzo-waving.png new file mode 100644 index 00000000..4135a789 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/alonzo-waving.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/boy1-walking.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/boy1-walking.png new file mode 100644 index 00000000..189bdd4f Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/boy1-walking.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-cloud.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-cloud.png new file mode 100644 index 00000000..4adb77c1 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-cloud.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-file.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-file.png new file mode 100644 index 00000000..7658b99f Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-file.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-new-sprite.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-new-sprite.png new file mode 100644 index 00000000..951bd883 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-new-sprite.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-settings.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-settings.png new file mode 100644 index 00000000..ad28e651 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-settings.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-start.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-start.png new file mode 100644 index 00000000..f8033232 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-start.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-stop.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-stop.png new file mode 100644 index 00000000..62bbd0a7 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/btn-stop.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/cover-picture.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/cover-picture.png new file mode 100644 index 00000000..6bd0abc6 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/cover-picture.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/defs.tex b/elements/pl-snap/Snap/help/manual-LaTeX/common/defs.tex new file mode 100644 index 00000000..86f93565 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/common/defs.tex @@ -0,0 +1,187 @@ +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{baskervald} % Default font +\usepackage[onehalfspacing]{setspace} +\usepackage{graphicx} +\usepackage{color} +\usepackage{textcomp} +\usepackage[hidelinks, pdfusetitle]{hyperref} +\usepackage{float} +\usepackage{ltxcmds} +\usepackage{fp} +\usepackage{tikz} +\usepackage{etoolbox} +% We frequently prevent page breaks before pictures, and it has a tendency to create a lot of widowed lines. Let's prevent it from happening. +\usepackage[all]{nowidow} +\usepackage{wasysym} + +\usetikzlibrary{calc} +\usetikzlibrary{fit} + +% This macro produces a "Snap!" logo. +% +% Note that in Polish (and other languages), nouns are inflected. The form "Snap!" with suffix looks plain stupid, so the macro takes a suffix as argument. If the suffix is non-empty, no exclamation mark is generated, and the suffix is used instead. +\newcommand{\Snap}[1]{% + \textsf{% + Snap% + \ifx\\#1\\\textit{!\@}% + \else #1% + \fi% + }% +} + +\newcommand{\code}[1]{\textsf{\textbf{#1}}} +\makeatletter +\newcommand{\defaultGraphicsScale}{0.6} +\makeatother + +\renewcommand{\thechapter}{\Roman{chapter}} +\renewcommand{\thesection}{\Alph{section}} +\renewcommand{\thesubsection}{} + +\makeatletter +\edef\defaultFontSize{\f@size} + +% A dirty hack: Apparently, this is the only way to multiply a length by a constant factor in the code below. What a mess. +\newdimen\raiseLength + +\newcommand{\inlinepicraised}[3]{% + {% + \FPeval\fontSizeRatio{\f@size / \defaultFontSize}% + \FPeval\scale{#3 * \fontSizeRatio}% + \raiseLength=#2% + \raisebox{\fontSizeRatio\raiseLength}{% + \includegraphics[scale=\scale]{#1}% + }% + }% + % Add kerns if the next character is punctuation. + \ltx@ifnextchar@nospace.{\,}{% + \ltx@ifnextchar@nospace,{\,}{% + }% + }% +} +\makeatother + +\newcommand{\inlinepic}[2][\defaultGraphicsScale]{% + \inlinepicraised{#2}{-4pt}{#1}% +} + +\newcommand{\inlinereporterpic}[2][\defaultGraphicsScale]{% + \inlinepicraised{#2}{-1.5pt}{#1}% +} + +\newcommand{\bigpic}[1]{ + \begin{figure}[H] + \centering + \includegraphics[scale=\defaultGraphicsScale]{#1} + \end{figure} +} + +\newcommand{\manualtitlepage}[2][]{ { + \def\title{#2} + \def\translator{#1} + + \begin{titlepage} + + \pgfdeclarelayer{background} + \pgfsetlayers{background,main} + \begin{tikzpicture}[remember picture, overlay, text depth=0] + + \definecolor{title blue}{HTML}{206C8F} + \definecolor{title orange}{HTML}{F59201} + \pgfdeclareimage[width=0.2\textwidth]{logo}{../common/logo} + \pgfdeclareimage{cover picture}{../common/cover-picture} + \coordinate (NW) at ($(current page.north west) + (0.5, -0.5)$); + \coordinate (NE) at ($(current page.north east) + (-0.5, -0.5)$); + \coordinate (SW) at ($(current page.south west) + (0.5, 0.5)$); + \coordinate (SE) at ($(current page.south east) + (-0.5, 0.5)$); + + % Logo at the top left corner. + \node[ + below right, + align=left, + font=\Large, + execute at begin node=\setlength\baselineskip{3ex}] + at ($(NW) + (1.5, -1.5)$) { + \pgfuseimage{logo}\\ + Build Your Own Blocks + }; + + % Version number. + \node[ + below right, + color=white, + font=\fontsize{40pt}{48pt}\selectfont] + at ($(NE) - (7, 5)$) { + 4.0 + }; + + % Title. Note: the % at the end is necessary for correct spacing between the text and orange background. + \node[ + left, + text=white, + align=right, + inner sep=15pt, + font=\fontsize{40pt}{42pt}\selectfont] + (title text) + at ($(NE) - (1.5, 9)$) { + \title% + }; + + % The cover picture. + \node[below left, inner sep=0] (cover picture) + at ($(NE) - (0, 12)$) { + \pgfuseimage{cover picture} + }; + \draw[white, ultra thick] + (cover picture.north west) -- (cover picture.north east); + \draw[white, ultra thick] + (cover picture.south west) -- (cover picture.south east); + + % Authors. + \node[above right, color=white, align=left, font=\Large] + at ($(SE) + (-7, 3)$) { + Brian Harvey\\ + Jens M\"onig + }; + + % Translator. + \ifdefempty{\translator}{}{ + \node [below right, color=white, align=left, font=\large] + at ($(SE) + (-7, 2)$) { + \translator + }; + } + + \begin{pgfonlayer}{background} + % Blue bar on the right. + \fill[title blue] ($(NE) - (7.5, 0)$) rectangle (SE); + + % Title background stretches to the left until it reaches the left edge, which means (NW.x, title text.west.y). + \coordinate (title background left point) + at (NW |- title text.west); + % Orange title background. + \node[ + fit=(title text) (title background left point), + shape=rectangle, + fill=title orange, + text=white, + draw=white, + ultra thick, + align=right, + inner sep=0, + font=\fontsize{40pt}{42pt}\selectfont] {}; + \end{pgfonlayer} + + \end{tikzpicture} + \end{titlepage} +} } + +\newcommand{\TODO}[1]{% + \colorbox{yellow}{\textcolor{red}{\textbf{% + TODO% + \ifstrempty{#1}{}{% + : #1 + }% + }}}% +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/dog2-c.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/dog2-c.png new file mode 100644 index 00000000..6b314d25 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/dog2-c.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/logo.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/logo.png new file mode 100644 index 00000000..38ac4abe Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/logo.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/square.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/square.png new file mode 100644 index 00000000..e1512ecd Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/square.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/tree.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/tree.png new file mode 100644 index 00000000..ff76cf76 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/tree.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/turtle-says-its-position.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/turtle-says-its-position.png new file mode 100644 index 00000000..983d55de Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/turtle-says-its-position.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/turtle-says-its-rounded-position.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/turtle-says-its-rounded-position.png new file mode 100644 index 00000000..62a6af51 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/turtle-says-its-rounded-position.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/common/wiggling-line.png b/elements/pl-snap/Snap/help/manual-LaTeX/common/wiggling-line.png new file mode 100644 index 00000000..52a075a8 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/common/wiggling-line.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/ask-and-set.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/ask-and-set.png new file mode 100644 index 00000000..18bf46cf Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/ask-and-set.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/block-editor-square.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/block-editor-square.png new file mode 100644 index 00000000..adf37092 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/block-editor-square.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/block-prototype-with-plus-highlighted.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/en/block-prototype-with-plus-highlighted.pdf new file mode 100644 index 00000000..d84c50bc Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/block-prototype-with-plus-highlighted.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/block-prototype-with-plus-highlighted.svg b/elements/pl-snap/Snap/help/manual-LaTeX/en/block-prototype-with-plus-highlighted.svg new file mode 100644 index 00000000..f4c6035a --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/en/block-prototype-with-plus-highlighted.svg @@ -0,0 +1,751 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/broadcast-bark-and-wait.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/broadcast-bark-and-wait.png new file mode 100644 index 00000000..149018e0 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/broadcast-bark-and-wait.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/concise-factorial-block-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/concise-factorial-block-script.png new file mode 100644 index 00000000..2203fd46 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/concise-factorial-block-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/create-input-name.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/create-input-name.png new file mode 100644 index 00000000..79ab7ce3 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/create-input-name.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/dragging-block-input.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/dragging-block-input.png new file mode 100644 index 00000000..00bd8a17 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/dragging-block-input.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/dragging-block-into-block-editor.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/dragging-block-into-block-editor.png new file mode 100644 index 00000000..4b1b5ff2 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/dragging-block-into-block-editor.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/example-script-that-uses-a-reporter.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/example-script-that-uses-a-reporter.png new file mode 100644 index 00000000..b06db791 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/example-script-that-uses-a-reporter.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/factorial-5-with-result.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/factorial-5-with-result.png new file mode 100644 index 00000000..ca42ea1f Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/factorial-5-with-result.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/factorial-block-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/factorial-block-script.png new file mode 100644 index 00000000..07368c59 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/factorial-block-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/hand-waving-command.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/hand-waving-command.png new file mode 100644 index 00000000..3aa2f1e7 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/hand-waving-command.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/if.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/if.png new file mode 100644 index 00000000..190b288b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/if.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/inter-sprite-communication-1.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/inter-sprite-communication-1.png new file mode 100644 index 00000000..5956ff98 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/inter-sprite-communication-1.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/inter-sprite-communication-2.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/inter-sprite-communication-2.png new file mode 100644 index 00000000..cec24727 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/inter-sprite-communication-2.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/join-hello-world.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/join-hello-world.png new file mode 100644 index 00000000..ab3163b2 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/join-hello-world.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/make-a-block.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/make-a-block.png new file mode 100644 index 00000000..f3c99c3c Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/make-a-block.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/make-a-variable.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/make-a-variable.png new file mode 100644 index 00000000..a4062186 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/make-a-variable.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/mouse-down.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/mouse-down.png new file mode 100644 index 00000000..cab1b671 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/mouse-down.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/move-10-steps.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/move-10-steps.png new file mode 100644 index 00000000..3d276da3 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/move-10-steps.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/move-mouse-down-steps.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/move-mouse-down-steps.png new file mode 100644 index 00000000..6c52b1a9 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/move-mouse-down-steps.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/nested-sprites-in-corral.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/nested-sprites-in-corral.png new file mode 100644 index 00000000..339b206a Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/nested-sprites-in-corral.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/next-costume.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/next-costume.png new file mode 100644 index 00000000..27f7ca99 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/next-costume.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/play-sound-help-until-done.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/play-sound-help-until-done.png new file mode 100644 index 00000000..e7b65abb Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/play-sound-help-until-done.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/play-sound-help.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/play-sound-help.png new file mode 100644 index 00000000..6e6c27c6 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/play-sound-help.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/plus.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/plus.png new file mode 100644 index 00000000..9b2aa99c Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/plus.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-1.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-1.png new file mode 100644 index 00000000..f20ac007 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-1.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-2.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-2.png new file mode 100644 index 00000000..b77f9f16 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-2.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-3.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-3.png new file mode 100644 index 00000000..e11c1f7f Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-3.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-4.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-4.png new file mode 100644 index 00000000..629d037a Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/predicates-and-conditional-evaluation-4.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/round-x-position-plus-100.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/round-x-position-plus-100.png new file mode 100644 index 00000000..411fc744 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/round-x-position-plus-100.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/script-variable-name-dialog.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/script-variable-name-dialog.png new file mode 100644 index 00000000..900a5d14 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/script-variable-name-dialog.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/script-variables-a-b-c.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/script-variables-a-b-c.png new file mode 100644 index 00000000..42e399d8 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/script-variables-a-b-c.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/scripting-area-with-additional-costume.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/scripting-area-with-additional-costume.png new file mode 100644 index 00000000..27d82938 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/scripting-area-with-additional-costume.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/sign-in.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/sign-in.png new file mode 100644 index 00000000..2452506a Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/sign-in.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/sign-up.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/sign-up.png new file mode 100644 index 00000000..b6989342 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/sign-up.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/snap-manual.tex b/elements/pl-snap/Snap/help/manual-LaTeX/en/snap-manual.tex new file mode 100644 index 00000000..5dbf60c0 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/en/snap-manual.tex @@ -0,0 +1,525 @@ +\documentclass{report} + +\input{../common/defs.tex} + +\begin{document} + +\title{Snap! Reference Manual} +\author{Brian Harvey\texorpdfstring{ \and}{,} Jens M\"onig} +\date{} + +\manualtitlepage{Snap! Reference Manual} + +\tableofcontents + +\chapter*{} +\section*{Acknowledgements} + +We have been extremely lucky in our mentors. Jens cut his teeth in the company of the Smalltalk pioneers: Alan Kay, Dan Ingalls, and the rest of the gang who invented personal computing and object oriented programming in the great days of Xerox PARC. He worked with John Maloney, of the MIT Scratch Team, who developed the Morphic graphics framework that's still at the heart of \Snap{}. The brilliant design of Scratch, from the Lifelong Kindergarten Group at the MIT Media Lab, is crucial to \Snap{}. + +\textbf{\emph{Our earlier version, BYOB, was a direct modification of the Scratch source code. \Snap{} is a complete rewrite, but its code structure and its user interface remain deeply indebted to Scratch. And the Scratch Team, who could have seen us as rivals, have been entirely supportive and welcoming to us.}} + +Brian grew up at the MIT and Stanford Artificial Intelligence Labs, learning from Lisp inventor John McCarthy, Scheme inventors Gerald~J. Sussman and Guy Steele, and the authors of the world's best computer science book, \textit{Structure and Interpretation of Computer Programs}, Hal Abelson and Gerald~J. Sussman with Julie Sussman, among many other heroes of computer science. + +\textbf{\emph{In the glory days of the MIT Logo Lab, we used to say, ``Logo is Lisp disguised as BASIC.'' Now, with its first class procedures, lexical scope, and first class continuations, \Snap{} is Scheme disguised as Scratch.}} + +We have been fortunate to get to know an amazing group of brilliant middle school (!\@) and high school students through the Scratch Advanced Topics forum, several of whom have contributed code to \Snap{}: Kartik Chandra, Nathan Dinsmore, Connor Hudson, and Ian Reynolds. Many more have contributed ideas and alpha-testing bug reports. UC Berkeley students who've contributed code include Michael Ball, Achal Dave, Kyle Hotchkiss, Ivan Motyashov, and Yuan Yuan. Contributors of translations are too numerous to list here, but they're in the ``About\ldots'' box in \Snap{} itself. + +This work was supported in part by the National Science Foundation grant 1143566, and in part by MioSoft. + +\clearpage + +\begin{center} +\bf \Huge \Snap{} Reference Manual \\ +\huge Version 4.0 +\vspace{40pt} +\end{center} + +\Snap{} (formerly BYOB) is an extended reimplementation of Scratch (\url{http://scratch.mit.edu}) that allows you to Build Your Own Blocks. It also features first class lists, first class procedures, and continuations. These added capabilities make it suitable for a serious introduction to computer science for high school or college students. + +To run \Snap{}, open a browser window and connect to either \url{http://snap.berkeley.edu/run} to start with a minimal set of blocks or \url{http://snap.berkeley.edu/init} to load a small set of additional blocks (a little slower startup, but recommended for convenience and assumed in this manual). + +\clearpage + +\chapter{Blocks, Scripts, and Sprites} + +This chapter describes the \Snap{} features inherited from Scratch; experienced Scratch users can skip to section~\ref{sec:nesting-sprites}. + +\Snap{} is a programming language---a notation in which you can tell a computer what you want it to do. Unlike most programming languages, though, \Snap{} is a visual language; instead of writing a program using the keyboard, the \Snap{} programmer uses the same drag-and-drop interface familiar to computer users. + +Start \Snap{}. You should see the following arrangement of regions in the window:\nopagebreak + +\begin{center} +\includegraphics[width=\textwidth]{window-regions} +\end{center} + +(The proportions of these areas may be different, depending on the size and shape of your browser window.) + +A \Snap{} program consists of one or more \emph{scripts}, each of which is made of \emph{blocks}. Here's a typical script:\nopagebreak + +\label{fig:typical-script} +\bigpic{typical-script} + +The five blocks that make up this script have three different colors, corresponding to three of the eight \emph{palettes} in which blocks can be found. The palette area at the left edge of the window shows one palette at a time, chosen with the eight buttons just above the palette area. In this script, the gold blocks are from the Control palette; the green block is from the Pen palette; and the blue blocks are from the Motion palette. A script is assembled by dragging blocks from a palette into the \emph{scripting area} in the middle part of the window. Blocks snap together (hence the name \Snap{} for the language) when you drag a block so that its indentation is near the tab of the one above it:\nopagebreak + +\bigpic{snapping-blocks} + +The white horizontal line is a signal that if you let go of the green block it will snap into the tab of the gold one. + +\subsection{Hat Blocks and Command Blocks} + +At the top of the script is a \emph{hat} block, which indicates when the script should be carried out. Hat block names typically start with the word ``\code{when}''; in this example, the script should be run when the green flag near the right end of the \Snap{} tool bar is clicked. (The \Snap{} tool bar is part of the \Snap{} window, not the same as the browser's or operating system's menu bar.) A script isn't required to have a hat block, but if not, then the script will be run only if the user clicks on the script itself. A script can't have more than one hat block, and the hat block can be used only at the top of the script; its distinctive shape is meant to remind you of that. + +The other blocks in this script are \emph{command} blocks. Each command block corresponds to an action that \Snap{} already knows how to carry out. For example, the block \inlinepic{move-10-steps} tells the sprite (the arrowhead shape on the \emph{stage} at the right end of the window) to move ten steps (a step is a very small unit of distance) in the direction in which the arrowhead is pointing. We'll see shortly that there can be more than one sprite, and that each sprite has its own scripts. Also, a sprite doesn't have to look like an arrowhead, but can have any picture as a costume. The shape of the \code{move} block is meant to remind you of a Lego\texttrademark{} brick; a script is a stack of blocks. (The word ``block'' denotes both the graphical shape on the screen and the procedure, the action, that the block carries out.) + +The number~$10$ in the \code{move} block above is called an \emph{input} to the block. By clicking on the white oval, you can type any number in place of the $10$. The sample script on page~\pageref{fig:typical-script} uses $100$ as the input value. We'll see later that inputs can have non-oval shapes that accept values other than numbers. We'll also see that you can compute input values, instead of typing a particular value into the oval. A block can have more than one input slot. For example, the \code{glide} block located about halfway down the Motion palette has three inputs. + +Most command blocks have that brick shape, but some, like the \code{repeat} block in the sample script, are \emph{C-shaped}. Most C-shaped blocks are found in the Control palette. The slot inside the C shape is a special kind of input slot that accepts a \emph{script} as the input. In the sample script, the \code{repeat} block has two inputs: the number $4$ and the script\nopagebreak + +\bigpic{typical-script-inner} + +\section{Sprites and Parallelism} + +Just below the stage is the ``new sprite'' button~\inlinepic{../common/btn-new-sprite}. Click the button to add a new sprite to the stage. The new sprite will appear in a random position on the stage, facing in a random direction, with a random color. + +Each sprite has its own scripts. To see the scripts for a particular sprite in the scripting area, click on the picture of that sprite in the \emph{sprite corral} in the bottom right corner of the window. Try putting one of the following scripts in each sprite's scripting area:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-1} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-2} +\end{minipage} +\end{figure} + +When you click the green flag~\inlinepic{../common/btn-start}, you should see one sprite rotate while the other moves back and forth. This experiment illustrates the way different scripts can run in parallel. The turning and the moving happen together. Parallelism can be seen with multiple scripts of a single sprite also. Try this example:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-3} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{sprites-and-parallelism-4} +\end{minipage} +\end{figure} + +When you press the space key, the sprite should turn forever in a circle, because the \code{move} and \code{turn} blocks are run in parallel. (To stop the program, click the red stop sign~\inlinepic{../common/btn-stop} at the right end of the tool bar.) + +\subsection{Costumes and Sounds} + +To change the appearance of a sprite, import a new \emph{costume} for it. There are three ways to do this. First, select the desired sprite in the sprite corral. Then, one way is to click on the file icon~\inlinepic{../common/btn-file} in the tool bar, then choose the ``\code{Costumes\ldots}'' menu item. You will see a list of costumes from the public media library, and can choose one. The second way, for a costume stored on your own computer, is too click on the file icon and choose the ``\code{Import\ldots}'' menu item. You can then select a file in any picture format (PNG, JPEG, etc.) supported by your browser. The third way is quicker if the file you want is visible on the desktop: Just drag the file onto the \Snap{} window. In any of these cases, the scripting area will be replaced by something like this:\nopagebreak + +\bigpic{scripting-area-with-additional-costume} + +Just above this part of the window is a set of three tabs: Scripts, Costumes, and Sounds. You'll see that the Costumes tab is now selected. In this view, the sprite's \emph{wardrobe}, you can choose whether the sprite should wear its Turtle costume or its Alonzo costume. (Alonzo, the \Snap{} mascot, is named after Alonzo Church, a mathematician who invented the idea of procedures as data, the most important way in which \Snap{} is different from Scratch.) You can give a sprite as many costumes as you like, and then choose which it will wear either by clicking in its wardrobe or by using the \inlinepic{switch-to-costume-turtle} or \inlinepic{next-costume} block in a script. (Every costume has a number as well as a name. The \code{next costume} block selects the next costume by number; after the highest-numbered costume it switches to costume~1. The Turtle, costume~0, is never chosen by \code{next costume}.) The Turtle costume is the only one that changes color to match a change in the sprite's pen color. + +In addition to its costumes, a sprite can have \emph{sounds}; the equivalent for sounds of the sprite's wardrobe is called its \emph{jukebox}. Sound files can be imported in any format (WAV, OGG, MP3, etc.) supported by your browser. Two blocks accomplish the task of playing sounds. If you would like a script to continue running while the sound is playing, use the block \inlinepic{play-sound-help}. In contrast, you can use the \inlinepic{play-sound-help-until-done} block to wait for the sound's completion before continuing the rest of the script. + +\subsection{Inter-Sprite Communication with Broadcast} + +Earlier we saw an example of two sprites moving at the same time. In a more interesting program, though, the sprites on stage will interact to tell a story, play a game, etc. Often one sprite will have to tell another sprite to run a script. Here's a simple example:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=0.4]{../common/boy1-walking} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\reflectbox{\includegraphics[scale=0.3]{../common/dog2-c}} +\end{minipage} + +\vspace{3ex} +\begin{minipage}[t]{0.5\textwidth} +\centering +\vspace{0pt} % REALLY align to top +\includegraphics[scale=\defaultGraphicsScale]{inter-sprite-communication-1} +\end{minipage}% +\begin{minipage}[t]{0.5\textwidth} +\centering +\vspace{0pt} % REALLY align to top +\includegraphics[scale=\defaultGraphicsScale]{inter-sprite-communication-2} +\end{minipage} +\end{figure} + +In the \inlinepic{broadcast-bark-and-wait} block, the word ``bark'' is just an arbitrary name I made up. When you click on the downward arrowhead in that input slot, one of the choices (the only choice, the first time) is ``\code{new},'' which then prompts you to enter a name for the new broadcast. When this block is run, the chosen message is sent to \emph{every} sprite, which is why the block is called ``broadcast.'' In this program, though, only one sprite has a script to run when that broadcast is sent, namely the dog. Because the boy's script uses \code{broadcast and wait} rather than just \code{broadcast}, the boy doesn't go on to his next \code{say} block until the dog's script finishes. That's why the two sprites take turns talking, instead of both talking at once. + +Notice, by the way, that the \code{say} block's first input slot is rectangular rather than oval. This means the input can be any text string, not only a number. In the text input slots, a space character is shown as a brown dot, so that you can count the number of spaces between words, and in particular you can tell the difference between an empty slot and one containing spaces. The brown dots are \emph{not} shown on the stage when the block is run. + +The stage has its own scripting area. It can be selected by clicking on the Stage icon at the left of the sprite corral. Unlike a sprite, though, the stage can't move. Instead of costumes, it has \emph{backgrounds}: pictures that fill the entire stage area. The sprites appear in front of the current background. In a complicated project, it's often convenient to use a script in the stage's scripting area as the overall director of the action. + +\section{Nesting Sprites: Anchors and Parts} +\label{sec:nesting-sprites} + +Sometimes it's desirable to make a sort of ``super-sprite'' composed of pieces that can move together but can also be separately articulated. The classic example is a person's body made up of a torso, limbs, and a head. \Snap{} allows one sprite to be designated as the \emph{anchor} of the combined shape, with other sprites as its \emph{parts}. To set up sprite nesting, drag the sprite corral icon of a \emph{part} sprite onto the stage display (not the sprite corral icon!) of the desired \emph{anchor} sprite. + +Sprite nesting is shown in the sprite corral icons of both anchors and parts:\nopagebreak + +\bigpic{nested-sprites-in-corral} + +In this illustration, it is desired to animate Alonzo's arm. (The arm has been colored green in this picture to make the relationship of the two sprites clearer, but in a real project they'd be the same color, probably.) Sprite1, representing Alonzo's body, is the anchor; Sprite2 is the arm. The icon for the anchor shows small images of up to three attached parts at the bottom. The icon for each part shows a small image of the anchor in its top left corner, and a \emph{synchronous rotation flag} in the top right corner. In its initial setting, as shown above, it means that the when the anchor sprite rotates, the part sprite also rotates as well as revolving around the anchor. When clicked, it changes from a circular arrow to a straight arrow, and indicates that when the anchor sprite rotates, the part sprite revolves around it, but does not rotate, keeping its original orientation. (The part can also be rotated separately, using its \code{turn} blocks.) Any change in the position or size of the anchor is always extended to its parts. + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{hand-waving-command}% +\hspace{2em}% +\includegraphics[scale=0.4]{../common/alonzo-waving} +\end{figure} + +\section{Reporter Blocks and Expressions} + +So far, we've used two kinds of blocks: hat blocks and command blocks. Another kind is the \emph{reporter} block, which has an oval shape: \inlinereporterpic{x-position}. It's called a ``reporter'' because when it's run, instead of carrying out an action, it reports a value that can be used as an input to another block. If you drag a reporter into the scripting area by itself and click on it, the value it reports will appear in a speech balloon next to the block:\nopagebreak + +\bigpic{x-position-returns-a-number} + +When you drag a reporter block over another block's input slot, a white ``halo'' appears around that input slot, analogous to the white line that appears when snapping command blocks together. Here's a simple script that uses a reporter block:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{example-script-that-uses-a-reporter}% +\hspace{2em}% +\includegraphics{../common/turtle-says-its-position} +\end{figure} + +Here the \code{x position} reporter provides the first input to the \code{say} block. (The sprite's X position is its horizontal position, how far left (negative values) or right (positive values) it is compared to the center of the stage. Similarly, the Y position is measured vertically, in steps above (positive) or below (negative) the center.) + +You can do arithmetic using reporters in the Operators palette:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{using-reporters-for-arithmetic}% +\hspace{2em}% +\includegraphics{../common/turtle-says-its-rounded-position} +\end{figure} + +The \code{round} block rounds $35.3905\ldots$ to $35$, and the \code{+}~block adds $100$ to that. (By the way, the \code{round} block is in the Operators palette, just like~\code{+}, but in this script it's a lighter color with black lettering because \Snap{} alternates light and dark versions of the palette colors when a block is nested inside another block from the same palette:\nopagebreak + +\bigpic{zebra-coloring} + +This aid to readability is called \emph{zebra coloring}.) A reporter block with its inputs, maybe including other reporter blocks, such as \inlinepic{round-x-position-plus-100}, is called an \emph{expression}. + +\section{Predicates and Conditional Evaluation} + +Most reporters report either a number, like \inlinereporterpic{plus}, or a text string, like \inlinereporterpic{join-hello-world}. A \emph{predicate} is a special kind of reporter that always reports \code{true} or \code{false}. Predicates have a hexagonal shape:\nopagebreak + +\bigpic{mouse-down} + +The special shape is a reminder that predicates don't generally make sense in an input slot of blocks that are expecting a number or text. You wouldn't say \inlinepic{move-mouse-down-steps}, although (as you can see from the picture) \Snap{} lets you do it if you really want. Instead, you normally use predicates in special hexagonal input slots like this one:\nopagebreak + +\bigpic{if} + +The C-shaped \code{if} block runs its input script if (and only if) the expression in its hexagonal input reports \code{true}.\nopagebreak + +\bigpic{predicates-and-conditional-evaluation-1} + +A really useful block in animations runs its input script \emph{repeatedly} until a predicate is satisfied:\nopagebreak + +\bigpic{predicates-and-conditional-evaluation-2} + +If, while working on a project, you want to omit temporarily some commands in a script, but you don't want to forget where they belong, you can say\nopagebreak + +\bigpic{predicates-and-conditional-evaluation-3} + +Sometimes you want to take the same action whether some condition is true or false, but with a different input value. For this purpose you can use the \emph{reporter} \code{if} block:\footnote{\onehalfspacing If you don't see it in the Control palette, click on the File button~\inlinepic{../common/btn-file} in the Tool Bar and choose ``Import tools.''}\nopagebreak + +\bigpic{predicates-and-conditional-evaluation-4} + +The technical term for a \code{true} or \code{false} value is a ``Boolean'' value; it has a capital~B because it's named after a person, George Boole, who developed the mathematical theory of Boolean values. Don't get confused; a hexagonal block is a \emph{predicate}, but the value it reports is a \emph{Boolean}. + +Another quibble about vocabulary: Many programming languages reserve the name ``procedure'' for Commands (that carry out an action) and use the name ``function'' for Reporters and Predicates. In this manual, a \emph{procedure} is any computational capability, including those that report values and those that don't. Commands, Reporters, and Predicates are all procedures. The words ``a Procedure type'' are shorthand for ``Command type, Reporter type, or Predicate type.'' + +\section{Variables} + +Try this script:\footnote{The \code{for} block is also in the tools library; choose ``\code{Import tools}'' from the file menu if you don't have it in the Control palette.}\nopagebreak + +\bigpic{squiral-script} + +The input to the \code{move} block is an orange oval. To get it there, drag the orange oval that's part of the \code{for} block:\nopagebreak + +\bigpic{variable-dragging} + +The orange oval is a \emph{variable}: a symbol that represents a value. (I took this screenshot before changing the second number input to the \code{for} block from the default $10$ to $200$, and before dragging in a \code{turn} block.) \code{For} runs its script input repeatedly, just like \code{repeat}, but before each repetition it sets the variable \code{i} to a number starting with its first numeric input, adding $1$ for each repetition, until it reaches the second numeric input. In this case, there will be $200$ repetitions, first with $\code{i}=1$, then with $\code{i}=2$, then $3$, and so on until $\code{i}=200$ for the final repetition. The result is that each \code{move} draws a longer and longer line segment, and that's why the picture you see is a kind of spiral. (If you try again with a turn of $90$ degrees instead of $92$, you'll see why this picture is called a ``squiral.'') + +The variable~\code{i} is created by the \code{for} block, and it can only be used in the script inside the block's C-slot. (By the way, if you don't like the name~\code{i}, you can change it by clicking on the orange oval without dragging it, which will pop up a dialog window in which you can enter a different name:\nopagebreak + +\bigpic{script-variable-name-dialog} + +``\code{I}'' isn't a very descriptive name; you might prefer ``\code{length}'' to indicate its purpose in the script. ``\code{I}'' is traditional because mathematicians tend to use letters between~\code{i} and~\code{n} to represent integer values, but in programming languages we don't have to restrict ourselves to single-letter variable names.) + +\subsection{Global Variables} + +You can create variables ``by hand'' that aren't limited to being used within a single block. At the top of the Variables palette, click the ``\code{Make a variable}'' button:\nopagebreak + +\bigpic{make-a-variable} + +This will bring up a dialog window in which you can give your variable a name:\nopagebreak + +\bigpic{variable-name-dialog} + +The dialog also gives you a choice to make the variable available to all sprites (which is almost always what you want) or to make it visible only in the current sprite. You'd do that if you're going to give several sprites individual variables \emph{with the same name}, so that you can share a script between sprites (by dragging it from the current sprite's scripting area to the picture of another sprite in the sprite corral), and the different sprites will do slightly different things when running that script because each has a different value for that variable name. + +If you give your variable the name ``\code{name}'' then the Variables palette will look like this:\nopagebreak + +\bigpic{variable-on-a-palette} + +There's now a ``\code{Delete a variable}'' button, and there's an orange oval with the variable name in it, just like the orange oval in the \code{for} block. You can drag the variable into any script in the scripting area. Next to the oval is a checkbox, initially checked. When it's checked, you'll also see a \emph{variable watcher} on the stage:\nopagebreak + +\bigpic{variable-watcher} + +When you give the variable a value, the orange box in its watcher will display the value. + +\emph{How} do you give it a value? You use the \code{set} block:\nopagebreak + +\bigpic{ask-and-set} + +Note that you \emph{don't} drag the variable's oval into the \code{set} block! You click on the down arrow in the first input slot, and you get a menu of all the available variable names. + +\subsection{Script Variables} + +In that example, our project is going to carry on an interaction with the user, and we want to remember her name throughout the project. That's a good example of a situation in which a \emph{global} variable (the kind you make with the ``\code{Make a variable}'' button) is appropriate. Another common example is a variable called ``\code{score}'' in a game project. But sometimes you only need a variable temporarily, during the running of a particular script. In that case you can use the \code{script variables} block to make the variable:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{wiggling-line-script}% +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics{../common/wiggling-line} +\end{minipage}% +\end{figure} + +As in the \code{for} block, you can click on an orange oval in the \code{script variables} block without dragging to change its name. You can also make more than one temporary variable by clicking on the right arrow at the end of the block to add another variable oval:\nopagebreak + +\bigpic{script-variables-a-b-c} + +\section{Etcetera} + +This manual doesn't explain every block in detail. There are many more motion blocks, sound blocks, costume and graphics effects blocks, and so on. You can learn what they all do by experimentation, and also by reading the ``help screens'' that you can get by right-clicking or control-clicking a block and selecting ``\code{help\ldots}'' from the menu that appears. If you forget what palette (color) a block is, but you remember at least part of its name, type control-F and enter the name in the text block that appears in the palette area. + +\chapter{Saving and Loading Projects and Media} + +After you've created a project, you'll want to save it, so that you can have access to it the next time you use \Snap{}. There are several ways to do that. You can save a project on your own computer, or you can save it at the \Snap{} web site. The advantage of saving on the net is that you have access to your project even if you are using a different computer, or a mobile device such as a tablet or smartphone. The advantage of saving on your computer is that you have access to the saved project while on an airplane or otherwise not on the net. This is why we have multiple ways to save. + +\section{Local Storage} + +There are two different ways to save a project (or a media file such as a costume) on your computer. The reason for this complexity is that JavaScript, in which \Snap{} is implemented, deliberately restricts the ability of programs running in a browser to affect the computer. This is a good thing, because it means that you can confidently run someone else's \Snap{} project without worrying that it will delete all your files or infect your computer with a virus. But it does make things a little complicated. + +\subsection{Localstore} + +{\Huge \TODO{}} + +\subsection{XML Export} + +The second way to save a project on your computer requires two steps, but it doesn't have the limitations of localstore (\TODO{rename}). Projects saved in this second way are normal files on your computer and can be shared with friends, can be opened in any browser, and have no size limitation. + +From the file menu~\inlinepic{../common/btn-file}, choose ``Export project\ldots'' The entire \Snap{} window will disappear, replaced by a screenful of what looks like gibberish. Don't panic! This is what's supposed to happen. You are looking at your project, in a notation called XML. The main reason it looks like gibberish is that it includes an encoding of the pictures and other media in the project. If you look through the XML, the actual scripts of the project are pretty readable, although they don't look like \Snap{} blocks. \Snap{} has opened a new browser tab for this XML text; the actual \Snap{} window is still there, hiding in its original tab. + +But the point of this XML text isn't for you to read. Once you're looking at that tab, use your browser's Save command (in its File menu, or usually with a shortcut of command-S (Mac) or control-S (everything else). You can choose a filename for it, and it'll be saved in your usual Downloads folder. You can then close that tab and return to the \Snap{} tab. + +\section{Cloud Storage} + +The other possibility is to save your project ``in the cloud,'' at the \Snap{} web site. In order to do this, you need an account with us. Click on the Cloud button (\,\inlinepic{../common/btn-cloud}\,) in the Tool Bar. Choose the ``Signup\ldots'' option. This will show you a window that looks like this:\nopagebreak + +\bigpic{sign-up} + +You must choose a user name that will identify you on the web site, such as \code{Jens} or \code{bh}. If you're a Scratch user, you can use your Scratch name for \Snap{} too. If you're a kid, don't pick a user name that includes your family name, but first names or initials are okay. Don't pick something you'd be embarrassed to have other users (or your parents) see! If the name you want is already taken, you'll have to choose another one. + +We ask for your month and year of birth; we use this information only to decide whether to ask for your own email address or your parent's email address. (If you're a kid, you shouldn't sign up for anything on the net, not even \Snap{}, without your parent's knowledge.) We do not store your birthdate information on our server; it is used on your own computer only during this initial signup. We do not ask for your \emph{exact} birthdate, even for this one-time purpose, because that's an important piece of personally identifiable information. + +When you click OK, an email will be sent to the email address you gave, with an initial password for your account. We keep your email address on file so that, if you forget your password, we can send you a password-reset link. We will also email you if your account is suspended for violation of the Terms of Service. We do not use your address for any other purpose. You will never receive marketing emails of any kind through this site, neither from us nor from third parties. If, nevertheless, you are worried about providing this information, do a web search for ``temporary email.'' + +Finally, you must read and agree to the Terms of Service. A quick summary: Don't interfere with anyone else's use of the web site, and don't put copyrighted media or personally identifiable information in projects that you share with other users. And we're not responsible if something goes wrong. (Not that we \emph{expect} anything to go wrong; since \Snap{} runs in JavaScript in your browser, it is strongly isolated from the rest of your computer. But the lawyers make us say this.) + +Once you've created your account, you can log into it using the ``Login\ldots'' option from the Cloud menu:\nopagebreak + +\bigpic{sign-in} + +Use the user name and password that you set up earlier. If you check the ``Stay signed in'' box, then you will be logged in automatically the next time you run \Snap{} from the same browser on the same computer. Check the box if you're using your own computer and you don't share it with siblings. Don't check the box if you're using a public computer at the library, at school, etc. + +Once logged in, you can choose the ``Cloud'' option in the ``Save as\ldots'' dialog shown on page~\TODO{Link to the picture}. You enter a project name, and optionally project notes, just as for Localstore \TODO{name} saving, but your project will be saved online and can be loaded from anywhere with net access. + +\section{Loading Saved Projects} + +Once you've saved a project, you want to be able to load it back into \Snap{}. There are two ways to do this: + +\begin{enumerate} +\item If you saved the project in Localstore or in your online \Snap{} account, choose the ``Open\ldots'' option from the File menu. Choose the ``Browser'' or ``Cloud'' button, then select your project from the list in the big text box and click OK. (A third button, ``Examples,'' lets you choose from example projects that we provide. You can see what each of these projects is about by clicking on it and reading its project notes.) + +\item If you saved the project as an XML file on your computer, choose ``Import\ldots'' from the File menu. This will give you an ordinary browser file-open window, in which you can navigate to the file as you would in other software. Alternatively, find the XML file on your desktop, and just drag it onto the \Snap{} window. +\end{enumerate} + +The second technique above also allows you to import media (costumes and sounds) into a project. Just choose ``Import\ldots'' and then select a picture or sound file instead of an XML file. + +\Snap{} can also import projects created in BYOB~3.0, or in Scratch~1.4 or (with some effort; see our web site) 2.0. Almost all such projects work correctly in \Snap{}, apart from a small number of incompatible blocks. BYOB~3.1 projects that don't use first class sprites work, too; all BYOB~3.1 projects will work in \Snap{}~4.1. + +\chapter{Building a Block} + +The first version of \Snap{} was called BYOB, for ``Build Your Own Blocks.'' This was the first and is still the most important capability we added to Scratch. (The name was changed because a few teachers have no sense of humor.~\frownie{} You pick your battles.) The new Scratch~2.0 also has a partial custom block capability. + +\section{Simple Blocks} + +In the Variables palette, at or near the bottom, is a button labeled ``Make a block.''\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=0.5]{variables-palette} +\end{figure} + +Clicking this button will display a dialog window in which you choose the block's name, shape, and palette/color. You also decide whether the block will be available to all sprites, or only to the current sprite and its children. Note: You can also enter the ``Make a block'' dialog by right-click/control-click on the script area background and then choose ``\code{Make a block}'' from the menu that appears. + +\bigpic{make-a-block} + +In this dialog box, you can choose the block's palette, shape and name. With one exception, there is one color per palette, e.g., all Motion blocks are blue. But the Variables palette includes the orange variable-related blocks and the red list-related blocks. Both colors are available, along with an ``Other'' option that makes grey blocks in the Variables palette for blocks that don't fit any category. + +There are three block shapes, following a convention that should be familiar to Scratch users: The jigsaw-puzzle-piece shaped blocks are Commands, and don't report a value. The oval blocks are Reporters, and the hexagonal blocks are Predicates, which is the technical term for reporters that report Boolean (true or false) values. + +Suppose you want to make a block named ``square'' that draws a square. You would choose Motion, Command, and type ``\code{square}'' into the name field. When you click OK, you enter the Block Editor. This works just like making a script in the sprite's scripting area, except that the ``hat'' block at the top, instead of saying something like ``\code{when I am clicked},'' has a picture of the block you're building. This hat block is called the \emph{prototype} of your custom block.\footnote{This use of the word ``prototype'' is unrelated to the \emph{prototyping object oriented programming} discussed later.} You drag blocks under the hat to program your custom block, then click OK:\nopagebreak + +\bigpic{dragging-block-into-block-editor} +\bigpic{block-editor-square} + +Your block appears at the bottom of the Motion palette. Here's the block and the result of using it:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]% + {square-block-on-palette} +\includegraphics[scale=\defaultGraphicsScale]{../common/square} +\end{figure} + +\subsection{Custom Blocks with Inputs} + +But suppose you want to be able to draw squares of different sizes. Control-click or right-click on the block, choose ``\code{edit},'' and the Block Editor will open. Notice the plus signs before and after the word \code{square} in the prototype block. If you hover the mouse over one, it lights up:\nopagebreak + +\bigpic{block-prototype-with-plus-highlighted} + +Click on the plus on the right. You will then see the ``input name'' dialog:\nopagebreak + +\bigpic{create-input-name} + +Type in the name ``\code{size}'' and click OK. There are other options in this dialog; you can choose ``\code{title text}'' if you want to add words to the block name, so it can have text after an input slot, like the ``\code{move~(\,)~steps}'' block. Or you can select a more extensive dialog with a lot of options about your input name. But we'll leave that for later. When you click OK, the new input appears in the block prototype:\nopagebreak + +\bigpic{square-block-script-with-size-input} + +You can now drag the orange variable down into the script, then click okay:\nopagebreak + +\bigpic{dragging-block-input} + +Your block now appears in the Motion palette with an input box:\nopagebreak + +\bigpic{square-block} + +You can draw any size square by entering the length of its side in the box and running the block as usual, by clicking it or by putting it in a script. + +\section{Recursion} + +Since the new custom block appears in its palette as soon as you \emph{start} editing it, you can write recursive blocks (blocks that call themselves) by dragging the block into its own definition:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{tree-block-script}\\ +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]% + {tree-block-inside-script} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{../common/tree} +\end{minipage}% +\end{figure} + +If recursion is new to you, here are a few brief hints: It's crucial that the recursion have a \emph{base case}, that is, some small(est) case that the block can handle without using recursion. In this example, it's the case $\code{depth}=0$, for which the block does nothing at all, because of the enclosing \code{if}. Without a base case, the recursion would run forever, calling itself over and over. + +Don't try to trace the exact sequence of steps that the computer follows in a recursive program. Instead, imagine that inside the computer there are many small people, and if Theresa is drawing a tree of size~100, depth~6, she hires Tom to make a tree of size~70, depth~5, and later hires Theo to make another tree of size~70, depth~5. Tom in turn hires Tammy and Tallulah, and so on. Each little person has his or her own local variables \code{size} and \code{depth}, each with different values. + +You can also write recursive reporters, like this block to compute the factorial function:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{factorial-block-script} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]% + {factorial-5-with-result} +\end{minipage}% +\end{figure} + +Note the use of the \code{report} block. When a reporter block uses this block, the reporter finishes its work and reports the value given; any further blocks in the script are not evaluated. Thus, the \code{if else} block in the script above could have been just an \code{if}, with the second \code{report} block below it instead of inside it, and the result would be the same, because when the first \code{report} is seen in the base case, that finishes the block invocation, and the second \code{report} is ignored. There is also a \code{stop this block} block that has a similar purpose, ending the block invocation early, for command blocks. (By contrast, the \code{stop this script} block stops not only the current block invocation, but also the entire top-level script that called it.) + +Here's a slightly more compact way to write the factorial function:\nopagebreak + +\bigpic{concise-factorial-block-script} + +(If you don't see the reporter-\code{if} block in the Control palette, click the file button~\inlinepic{../common/btn-file} in the tool bar and choose ``\code{Import tools}.'') + +For more on recursion, see \textit{Thinking Recursively} by Eric Roberts. (The original edition is ISBN~978--0471816522; a more recent \textit{Thinking Recursively in Java} is ISBN~978--0471701460.) + +\section{Block Libraries} +\chapter{First Class Lists} +\section{The list Block} +\section{Lists of Lists} +\section{Functional and Imperative List Programming} +\section{Higher Order List Operations and Rings} +\chapter{Typed Inputs} +\section{Scratch's Type Notation} +\section{The \Snap{} Input Type Dialog} +\subsection{Procedure Types} +\subsection{Pulldown inputs} +\subsection{Input variants} +\subsection{Prototype Hints} +\subsection{Title Text and Symbols} +\chapter{Procedures as Data} +\section{Call and Run} +\subsection{Call/Run with inputs} +\subsection{Variables in Ring Slots} +\section{Writing Higher Order Procedures} +\subsection{Recursive Calls to Multiple-Input Blocks} +\section{Formal Parameters} +\section{Procedures as Data} +\section{Special Forms} +\subsection{Special Forms in Scratch} +\chapter{Object Oriented Programming} +\section{Local State with Script Variables} +\section{Messages and Dispatch Procedures} +\section{Inheritance via Delegation} +\section{An Implementation of Prototyping OOP} +\chapter{The Outside World} +\section{The World Wide Web} +\section{Hardware Devices} +\section{Date and Time} +\chapter{Continuations} +\section{Continuation Passing Style} +\section{Call/Run w/Continuation} +\subsection{Nonlocal exit} +\chapter{User Interface Elements} +\section{Tool Bar Features} +\subsection{The \Snap{} Logo Menu} +\subsection{The File Menu} +\subsection{The Cloud Menu} +\subsection{The Settings Menu} +\subsection{Stage Resizing Buttons} +\subsection{Project Control Buttons} +\section{The Palette Area} +\subsection{Context Menus for Palette Blocks} +\subsection{Context Menu for the Palette Background} +\section{The Scripting Area} +\subsection{Sprite Appearance and Behavior Controls} +\subsection{Scripting Area Tabs} +\subsection{Scripts and Blocks Within Scripts} +\subsection{Scripting Area Background Context Menu} +\subsection{Controls in the Costumes Tab} +\subsection{The Paint Editor} +\subsection{Controls in the Sounds Tab} +\section{Controls on the Stage} +\section{The Sprite Corral and Sprite Creation Buttons} + +\end{document} diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/snapping-blocks.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/snapping-blocks.png new file mode 100644 index 00000000..0dc5922b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/snapping-blocks.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-1.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-1.png new file mode 100644 index 00000000..5035b404 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-1.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-2.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-2.png new file mode 100644 index 00000000..191003ee Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-2.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-3.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-3.png new file mode 100644 index 00000000..f7707e5b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-3.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-4.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-4.png new file mode 100644 index 00000000..548ef50f Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/sprites-and-parallelism-4.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-on-palette.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-on-palette.pdf new file mode 100644 index 00000000..935ef662 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-on-palette.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-on-palette.svg b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-on-palette.svg new file mode 100644 index 00000000..5c63a5ef --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-on-palette.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-script-with-size-input.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-script-with-size-input.png new file mode 100644 index 00000000..3c5f5c54 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block-script-with-size-input.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block.png new file mode 100644 index 00000000..b95142cd Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/square-block.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/squiral-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/squiral-script.png new file mode 100644 index 00000000..d3b69d6b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/squiral-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/switch-to-costume-turtle.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/switch-to-costume-turtle.png new file mode 100644 index 00000000..ac8002a8 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/switch-to-costume-turtle.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/tree-block-inside-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/tree-block-inside-script.png new file mode 100644 index 00000000..37ddefe7 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/tree-block-inside-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/tree-block-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/tree-block-script.png new file mode 100644 index 00000000..b04d0e3d Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/tree-block-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/typical-script-inner.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/typical-script-inner.png new file mode 100644 index 00000000..b5503f7c Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/typical-script-inner.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/typical-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/typical-script.png new file mode 100644 index 00000000..6763aadb Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/typical-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/using-reporters-for-arithmetic.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/using-reporters-for-arithmetic.png new file mode 100644 index 00000000..83d68cd3 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/using-reporters-for-arithmetic.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-dragging.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-dragging.png new file mode 100644 index 00000000..c2708ed1 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-dragging.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-name-dialog.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-name-dialog.png new file mode 100644 index 00000000..4c3e4886 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-name-dialog.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-on-a-palette.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-on-a-palette.png new file mode 100644 index 00000000..2889afa0 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-on-a-palette.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-watcher.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-watcher.png new file mode 100644 index 00000000..f1bd4019 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/variable-watcher.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/variables-palette.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/variables-palette.png new file mode 100644 index 00000000..aefb97bc Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/variables-palette.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/wiggling-line-script.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/wiggling-line-script.png new file mode 100644 index 00000000..bba0a51e Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/wiggling-line-script.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/window-regions.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/window-regions.png new file mode 100644 index 00000000..7fe4e98a Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/window-regions.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/x-position-returns-a-number.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/x-position-returns-a-number.png new file mode 100644 index 00000000..5996d89d Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/x-position-returns-a-number.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/x-position.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/x-position.png new file mode 100644 index 00000000..4939b805 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/x-position.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/en/zebra-coloring.png b/elements/pl-snap/Snap/help/manual-LaTeX/en/zebra-coloring.png new file mode 100644 index 00000000..fb8c5c8e Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/en/zebra-coloring.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-drzewo-w-skrypcie.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-drzewo-w-skrypcie.png new file mode 100644 index 00000000..bf40f5b3 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-drzewo-w-skrypcie.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat-na-palecie.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat-na-palecie.pdf new file mode 100644 index 00000000..910fef08 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat-na-palecie.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat-na-palecie.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat-na-palecie.svg new file mode 100644 index 00000000..6b8e1f70 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat-na-palecie.svg @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat.png new file mode 100644 index 00000000..aadfef3b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/blok-kwadrat.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/dialog-nazwy-zmiennej-skryptu.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/dialog-nazwy-zmiennej-skryptu.png new file mode 100644 index 00000000..c239239b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/dialog-nazwy-zmiennej-skryptu.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/dialog-nazwy-zmiennej.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/dialog-nazwy-zmiennej.png new file mode 100644 index 00000000..216e4666 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/dialog-nazwy-zmiennej.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-1.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-1.png new file mode 100644 index 00000000..4f2a4d0d Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-1.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-2.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-2.png new file mode 100644 index 00000000..4acf611e Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-2.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-3.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-3.png new file mode 100644 index 00000000..3ee07139 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-3.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-4.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-4.png new file mode 100644 index 00000000..17199505 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/duszki-i-wspolbieznosc-4.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/edytor-blokow-kwadrat.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/edytor-blokow-kwadrat.png new file mode 100644 index 00000000..2ffe5754 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/edytor-blokow-kwadrat.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/jezeli-to.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/jezeli-to.png new file mode 100644 index 00000000..d4815483 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/jezeli-to.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/kolorowanie-w-zebre.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/kolorowanie-w-zebre.png new file mode 100644 index 00000000..45454a6f Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/kolorowanie-w-zebre.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/komenda-machania-reka.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/komenda-machania-reka.png new file mode 100644 index 00000000..341f7471 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/komenda-machania-reka.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/laczenie-blokow.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/laczenie-blokow.png new file mode 100644 index 00000000..b640b5f7 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/laczenie-blokow.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadaj-szczekaj-do-wszystkich-i-czekaj.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadaj-szczekaj-do-wszystkich-i-czekaj.png new file mode 100644 index 00000000..ae776cb3 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadaj-szczekaj-do-wszystkich-i-czekaj.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadawanie-i-odbieranie-komunikatow-1.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadawanie-i-odbieranie-komunikatow-1.png new file mode 100644 index 00000000..bf762623 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadawanie-i-odbieranie-komunikatow-1.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadawanie-i-odbieranie-komunikatow-2.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadawanie-i-odbieranie-komunikatow-2.png new file mode 100644 index 00000000..26272eb1 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nadawanie-i-odbieranie-komunikatow-2.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/nastepny-kostium.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nastepny-kostium.png new file mode 100644 index 00000000..2a9379fa Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nastepny-kostium.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/nowy-blok.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nowy-blok.png new file mode 100644 index 00000000..f80534cb Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/nowy-blok.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszar-skryptow-z-dodatkowym-kostiumem.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszar-skryptow-z-dodatkowym-kostiumem.png new file mode 100644 index 00000000..833ff031 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszar-skryptow-z-dodatkowym-kostiumem.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.pdf new file mode 100644 index 00000000..d4e5800e Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.pdf_tex b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.pdf_tex new file mode 100644 index 00000000..6fc4bdf3 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.pdf_tex @@ -0,0 +1,59 @@ +%% Creator: Inkscape inkscape 0.48.4, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'obszary-okna.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{855.2bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.60243218)% + \put(0,0){\includegraphics[width=\unitlength]{obszary-okna.pdf}}% + \put(0.37031041,0.03597468){\color[rgb]{1,0,0}\makebox(0,0)[b]{\smash{\emph{\Large Obszar skryptów}}}}% + \put(0.42733084,0.57941921){\color[rgb]{1,0,0}\makebox(0,0)[b]{\smash{\emph{\small Pasek narzędzi}}}}% + \put(0.77489765,0.03597473){\color[rgb]{1,0,0}\makebox(0,0)[b]{\smash{\emph{\Large Zagroda duszków}}}}% + \put(0.09676227,0.03597473){\color[rgb]{1,0,0}\makebox(0,0)[b]{\smash{\emph{\Large Paleta}}}}% + \put(0.77708296,0.27919271){\color[rgb]{1,0,0}\makebox(0,0)[b]{\smash{\emph{\Large Scena}}}}% + \end{picture}% +\endgroup% diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.svg new file mode 100644 index 00000000..f593e273 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/obszary-okna.svg @@ -0,0 +1,1388 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + \emph{\Large Obszar skryptów} + \emph{\small Pasek narzędzi} + + + + + \emph{\Large Zagroda duszków} + \emph{\Large Paleta} + \emph{\Large Scena} + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.pdf new file mode 100644 index 00000000..da936de2 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.pdf_tex b/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.pdf_tex new file mode 100644 index 00000000..f5324b76 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.pdf_tex @@ -0,0 +1,55 @@ +%% Creator: Inkscape inkscape 0.48.4, www.inkscape.org +%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010 +%% Accompanies image file 'paleta-dane.pdf' (pdf, eps, ps) +%% +%% To include the image in your LaTeX document, write +%% \input{.pdf_tex} +%% instead of +%% \includegraphics{.pdf} +%% To scale the image, write +%% \def\svgwidth{} +%% \input{.pdf_tex} +%% instead of +%% \includegraphics[width=]{.pdf} +%% +%% Images with a different path to the parent latex file can +%% be accessed with the `import' package (which may need to be +%% installed) using +%% \usepackage{import} +%% in the preamble, and then including the image with +%% \import{}{.pdf_tex} +%% Alternatively, one can specify +%% \graphicspath{{/}} +%% +%% For more information, please see info/svg-inkscape on CTAN: +%% http://tug.ctan.org/tex-archive/info/svg-inkscape +%% +\begingroup% + \makeatletter% + \providecommand\color[2][]{% + \errmessage{(Inkscape) Color is used for the text in Inkscape, but the package 'color.sty' is not loaded}% + \renewcommand\color[2][]{}% + }% + \providecommand\transparent[1]{% + \errmessage{(Inkscape) Transparency is used (non-zero) for the text in Inkscape, but the package 'transparent.sty' is not loaded}% + \renewcommand\transparent[1]{}% + }% + \providecommand\rotatebox[2]{#2}% + \ifx\svgwidth\undefined% + \setlength{\unitlength}{533.54912109bp}% + \ifx\svgscale\undefined% + \relax% + \else% + \setlength{\unitlength}{\unitlength * \real{\svgscale}}% + \fi% + \else% + \setlength{\unitlength}{\svgwidth}% + \fi% + \global\let\svgwidth\undefined% + \global\let\svgscale\undefined% + \makeatother% + \begin{picture}(1,0.45208073)% + \put(0,0){\includegraphics[width=\unitlength]{paleta-dane.pdf}}% + \put(0.33676736,0.03854298){\color[rgb]{0.38039216,0.6,0.18431373}\makebox(0,0)[lb]{\smash{\textit{Tylko jeśli zaimportowano narzędzia}}}}% + \end{picture}% +\endgroup% diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.svg new file mode 100644 index 00000000..ec386063 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/paleta-dane.svg @@ -0,0 +1,594 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + \textit{Tylko jeśli zaimportowano narzędzia} + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/plus.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/plus.png new file mode 100644 index 00000000..a1e6cc73 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/plus.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/podglad-zmiennej.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/podglad-zmiennej.png new file mode 100644 index 00000000..9f5ec503 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/podglad-zmiennej.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/polacz-witaj-swiecie.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/polacz-witaj-swiecie.png new file mode 100644 index 00000000..09d34a59 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/polacz-witaj-swiecie.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/pozycja-x-zwraca-liczbe.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/pozycja-x-zwraca-liczbe.png new file mode 100644 index 00000000..f582aa98 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/pozycja-x-zwraca-liczbe.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/pozycja-x.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/pozycja-x.png new file mode 100644 index 00000000..bf69345d Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/pozycja-x.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-1.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-1.png new file mode 100644 index 00000000..eb799211 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-1.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-2.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-2.png new file mode 100644 index 00000000..d3413f68 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-2.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-3.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-3.png new file mode 100644 index 00000000..793a1063 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-3.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-4.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-4.png new file mode 100644 index 00000000..08bb9ff7 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/predykaty-i-obliczenia-warunkowe-4.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/prototyp-bloku-z-podswietlonym-plusem.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/prototyp-bloku-z-podswietlonym-plusem.pdf new file mode 100644 index 00000000..785f01a0 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/prototyp-bloku-z-podswietlonym-plusem.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/prototyp-bloku-z-podswietlonym-plusem.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/prototyp-bloku-z-podswietlonym-plusem.svg new file mode 100644 index 00000000..f04cc7a5 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/prototyp-bloku-z-podswietlonym-plusem.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-bloku-do-edytora-blokow.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-bloku-do-edytora-blokow.pdf new file mode 100644 index 00000000..cc22559b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-bloku-do-edytora-blokow.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-bloku-do-edytora-blokow.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-bloku-do-edytora-blokow.svg new file mode 100644 index 00000000..50ddd007 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-bloku-do-edytora-blokow.svg @@ -0,0 +1,551 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-parametru-bloku.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-parametru-bloku.pdf new file mode 100644 index 00000000..7ce44c30 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-parametru-bloku.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-parametru-bloku.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-parametru-bloku.svg new file mode 100644 index 00000000..8b0a74c8 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-parametru-bloku.svg @@ -0,0 +1,339 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-zmiennej.pdf b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-zmiennej.pdf new file mode 100644 index 00000000..2dd3f9ef Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-zmiennej.pdf differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-zmiennej.svg b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-zmiennej.svg new file mode 100644 index 00000000..de1ce759 --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przeciaganie-zmiennej.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przesun-o-10-krokow.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przesun-o-10-krokow.png new file mode 100644 index 00000000..ece840c6 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przesun-o-10-krokow.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przesun-o-przycisk-myszy-nacisniety-krokow.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przesun-o-przycisk-myszy-nacisniety-krokow.png new file mode 100644 index 00000000..4e2696f0 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przesun-o-przycisk-myszy-nacisniety-krokow.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przycisk-myszy-nacisniety.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przycisk-myszy-nacisniety.png new file mode 100644 index 00000000..7005a34d Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przycisk-myszy-nacisniety.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/przykladowy-skrypt-wykorzystujacy-funkcje.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przykladowy-skrypt-wykorzystujacy-funkcje.png new file mode 100644 index 00000000..0bb6dda0 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/przykladowy-skrypt-wykorzystujacy-funkcje.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/rejestracja.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/rejestracja.png new file mode 100644 index 00000000..49a64c86 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/rejestracja.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/silnia-5-z-rezultatem.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/silnia-5-z-rezultatem.png new file mode 100644 index 00000000..bc4dd076 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/silnia-5-z-rezultatem.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-drzewo.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-drzewo.png new file mode 100644 index 00000000..d9720df0 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-drzewo.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-kwadrat-z-parametrem-rozmiar.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-kwadrat-z-parametrem-rozmiar.png new file mode 100644 index 00000000..e90e3793 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-kwadrat-z-parametrem-rozmiar.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-silnia.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-silnia.png new file mode 100644 index 00000000..3167b72b Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-silnia.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-zwiezla-silnia.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-zwiezla-silnia.png new file mode 100644 index 00000000..543368a9 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-bloku-zwiezla-silnia.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-kwadratowej-spirali.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-kwadratowej-spirali.png new file mode 100644 index 00000000..3249f9fd Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-kwadratowej-spirali.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-skrecajacej-linii.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-skrecajacej-linii.png new file mode 100644 index 00000000..708a8b68 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/skrypt-skrecajacej-linii.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/snap-podrecznik.tex b/elements/pl-snap/Snap/help/manual-LaTeX/pl/snap-podrecznik.tex new file mode 100644 index 00000000..5db44f5c --- /dev/null +++ b/elements/pl-snap/Snap/help/manual-LaTeX/pl/snap-podrecznik.tex @@ -0,0 +1,532 @@ +% !TeX spellcheck = pl + +\documentclass[a4paper]{report} + +\input{../common/defs.tex} + +\usepackage[polish]{babel} +\usepackage{polski} +\frenchspacing +\usepackage{indentfirst} + +\begin{document} + +\title{Snap! --- Podręcznik użytkownika} +\author{Brian Harvey\texorpdfstring{ \and}{,} Jens M\"onig} +\date{} + +\manualtitlepage[Tłumaczenie na język polski:\\Bartosz Leper]{Snap!\\Podręcznik użytkownika} + +\tableofcontents + +\chapter*{} +\section*{Podziękowania} + +Mieliśmy ogromne szczęście do mentorów. Jens zdobył dużo doświadczenia pracując wśród pionierów Smalltalka: Alana Kaya, Dana Ingallsa i~reszty ekipy, która wynalazła komputery osobiste i~programowanie obiektowe w~najlepszych dniach firmy Xerox PARC. Pracował z~Johnem Maloneyem z~zespołu Scratcha w~MIT\footnote{Massachusetts Institute of Technology, amerykańska uczelnia techniczna --- przyp. tłum.}, autorem platformy graficznej Morphic, wciąż stanowiącej fundament \Snap{a}. Znakomity projekt języka Scratch, autorstwa Lifelong Kindergarten Group z~MIT Media Lab, odgrywa w~\Snap{ie} kluczową rolę. + +\textbf{\emph{Nasza poprzednia wersja, BYOB, była bezpośrednią modyfikacją kodu źródłowego Scratcha. \Snap{} został napisany od zera, lecz struktura jego kodu oraz interfejs użytkownika pozostają mocno zakorzenione w~Scratchu. Z~kolei zespół Scratcha, który mógłby widzieć w~nas rywali, przyjął nas ciepło i~okazał nam całkowite wsparcie.}} + +Brian zdobywał szlify w~MIT oraz Stanford Artificial Intelligence Labs\footnote{Laboratorium sztucznej inteligencji na Uniwersytecie Stanforda --- przyp. tłum.}, gdzie uczył się pod okiem Johna McCarthy'ego, twórcy Lispa, oraz Geralda~J. Suss\-mana i~Guya Steele'a, twórców języka Scheme. Zdobywał również wiedzę od wielu innych wybitnych informatyków, w~tym autorów najlepszej książki z zakresu informatyki --- \emph{Struktury i~interpretacji programów komputerowych}: Hala Abelsona, Geralda~J. Suss\-mana i~Julie Suss\-man. + +\textbf{\emph{Za starych dobrych czasów mawialiśmy w~MIT Logo Lab: ,,Język Logo to Lisp braniu BASIC-a''. Dziś, ze swoimi pierwszoklasowymi procedurami, zasięgami leksykalnymi~i pierwszoklasowymi kontynuacjami, \Snap{} jest jak Scheme w~przebraniu Scratcha.}} + +Szczęśliwym zrządzeniem losu, poprzez forum Scratch Advanced Topics, poznaliśmy wspaniałą grupę błyskotliwych uczniów gimnazjów~(!\@) i liceów. Kilku z nich wniosło swój wkład w~kod \Snap{a}: Kartik Chandra, Nathan Dinsmore, Connor Hudson i~Ian Reynolds. Ponadto wielu zgłosiło pomysły i~raporty błędów podczas testowania wersji alfa. Wśród studentów Uniwersytetu Kalifornijskiego w~Berkeley, którzy przyczynili się do rozwoju kodu, znajdują się Michael Ball, Achal Dave, Kyle Hotchkiss, Ivan Motyashov i~Yuan Yuan. Wymienianie wszystkich tłumaczy zajęłoby zbyt wiele miejsca, ale można ich odnaleźć w~okienku ,,O \Snap{}\ldots'' dostępnym w~programie. + +Niniejsze dzieło powstało częściowo w~ramach grantu nr~1143566 udzielonego przez National Science Foundation, a częściowo przy wsparciu firmy MioSoft. + +\clearpage + +\begin{center} +\bf \Huge \Snap{} \\ +Podręcznik użytkownika \\ +\huge Wersja 4.0 \vspace{40pt} +\end{center} + +\Snap{} to rozszerzona reimplementacja języka Scratch (\url{http://scratch.mit.edu}), która pozwala na tworzenie własnych bloków (ang.\ \textit{Build Your Own Blocks}; stąd dawna nazwa \Snap{a} --- BYOB). Opisywany tu język obsługuje pierwszoklasowe listy, procedury i~kontynuacje. Te dodatkowe możliwości sprawiają, że nadaje się on do przeprowadzenia poważnego wstępu do informatyki dla uczniów liceów i szkół wyższych. + +Aby uruchomić środowisko \Snap{}, wystarczy otworzyć przeglądarkę internetową i~wpisać adres \url{http://snap.berkeley.edu/run}, aby zacząć pracę z~minimalnym zestawem bloków. Można też użyć adresu \url{http://snap.berkeley.edu/init}, aby załadować niewielki zestaw dodatkowych bloków. Wiąże się to z~nieco wolniejszym ładowaniem, ale jest zalecane dla wygody użytkowników (w~dalszej części podręcznika będziemy zakładali korzystanie z~tej właśnie metody). + +\clearpage + +\chapter{Bloki, skrypty i~duszki} + +W~tym rozdziale poznamy kilka cech języka \Snap{} odziedziczonych po Scratchu; doświadczeni użytkownicy Scratcha mogą przejść od razu do sekcji~\ref{sec:zagnieżdżanie-duszków}. + +\Snap{} jest językiem programowania --- notacją, przy pomocy której możemy powiedzieć komputerowi, co ma zrobić. Jednak w~odróżnieniu od większości innych, \Snap{} jest językiem wizualnym; programując w~nim, zamiast posługiwać się klawiaturą, używamy metody ,,przeciągnij i~upuść'', dobrze znanej użytkownikom komputerów. + +Uruchom teraz środowisko \Snap{}. Powinieneś zobaczyć ekran podzielony na kilka obszarów:\footnote{\onehalfspacing Pierwsze uruchomienie \Snap{a} prawdopodobnie spowoduje wyświetlenie angielskiej wersji programu; aby przełączyć się na język polski, należy kliknąć menu ,,Ustawienia''~\inlinepic{../common/btn-settings} na pasku narzędzi, a~następnie użyć polecenia ,,Language\ldots'' (,,Język\ldots'') --- przyp. tłum.}\nopagebreak + +\begin{center} +\def\svgwidth{\textwidth} +\input{obszary-okna.pdf_tex} +\end{center} + +(Proporcje tych stref mogą się różnić, w~zależności od rozmiaru i~kształtu okna przeglądarki). + +Program w~języku \Snap{} składa się z~jednego lub więcej \emph{skryptów}, te zaś z~kolei --- z~\emph{bloków}. Oto przykładowy skrypt:\nopagebreak + +\label{fig:typowy-skrypt} +\bigpic{typowy-skrypt} + +Na powyższy skrypt składa się pięć bloków w~trzech różnych kolorach, odpowiadających trzem z~ośmiu \emph{palet} z~blokami. Obszar palet, znajdujący się po lewej stronie okna, pokazuje jedną paletę na raz. Do zmiany widocznej palety służy osiem przycisków znajdujących się tuż nad tym obszarem. Bloki ciemnożółte, widoczne w~naszym skrypcie, pochodzą z~palety ,,Kontrola''; zielone z~palety ,,Pisak'', a~niebieskie --- z~palety ,,Ruch''. Aby złożyć taki skrypt, należy poprzeciągać odpowiednie bloki z~palet do \emph{obszaru skryptów}, umiejscowionego na środku okna. Kiedy układamy jeden blok pod drugim w~taki sposób, aby wcięcie dolnego bloku znalazło się w~pobliżu wypustki tego powyżej, bloki łączą się ze sobą (ang. \textit{snap together}; stąd nazwa języka \Snap{}):\nopagebreak + +\bigpic{laczenie-blokow} + +Pozioma biała linia sygnalizuje, że jeśli puścimy zielony blok, połączy się on z~wypustką ciemnożółtego. + +\subsection{Bloki-czapki i~bloki komend} + +Na górze skryptu znajduje się \emph{blok-czapka}, który określa, kiedy skrypt ma zostać wykonany. Nazwy bloków-czapek zazwyczaj zaczynają się słowem ,,\code{kiedy}''; nasz przykładowy skrypt powinien zostać uruchomiony w~momencie kliknięcia zielonej flagi, znajdującej się w pobliżu prawej strony paska narzędzi \Snap{a}. (Pasek ten jest częścią okna programu \Snap{}; nie chodzi tutaj o pasek menu przeglądarki lub systemu operacyjnego). Skrypt nie musi posiadać czapki, jednak w~takim przypadku zostanie wykonany tylko wtedy, gdy użytkownik sam go kliknie. Skrypt nie może mieć więcej niż jednej czapki; jej charakterystyczny kształt służy łatwiejszemu zapamiętaniu tej szczególnej własności. + +Pozostałe bloki w naszym skrypcie to \emph{bloki komend}. Każdy z~nich oznacza jakąś akcję, którą \Snap{} potrafi wykonać. Na przykład blok \inlinepic{przesun-o-10-krokow} nakazuje duszkowi\footnote{W grafice komputerowej słowem ,,duszek'' (ang. \textit{sprite}) nazywa się ruchomy obiekt na ekranie --- przyp. tłum.}, czyli strzałce na \emph{scenie} po prawej stronie okna, aby przesunął się o~dziesięć kroków do przodu w~kierunku, w~którym jest zwrócony. Każdy krok to niewielka odległość na ekranie. Wkrótce przekonamy się, że na scenie może być więcej duszków, a~każdy z nich może mieć własne skrypty. Ponadto duszki nie muszą wyglądać jak strzałki; ich kostiumy mogą być dowolnymi obrazkami. Kształt bloku \code{przesuń} ma za zadanie przypominać klocek, skrypt zaś jest jak wieża z klocków. Słowa ,,blok'' będziemy używać dla oznaczenia zarówno graficznego symbolu na ekranie, jak i~procedury (akcji) jaką ten blok wykonuje. + +Liczbę $10$ w powyższym bloku \code{przesuń} nazywamy jego \emph{parametrem}. Kliknąwszy na białym, owalnym polu, możemy wpisać w~jej miejsce dowolną inną. W przykładowym skrypcie ze strony \pageref{fig:typowy-skrypt} parametrem jest liczba $100$. Jak się później okaże, pola parametrów mogą mieć kształty inne od owalnych; oznacza to wtedy, że akceptują one wartości inne niż liczby. Zobaczymy również, że zamiast wpisywać konkretne wartości w~pola, możemy nakazać komputerowi je obliczać. Ponadto blok może mieć więcej niż jeden parametr. Na przykład blok \code{leć}, znajdujący się mniej więcej w~połowie palety ,,Ruch'', przyjmuje trzy parametry. + +Większość bloków komend ma kształt klocków, lecz niektóre, jak \code{powtórz} z~tego samego przykładu, wyglądają jak \emph{klamry}. Większość bloków klamrowych można znaleźć na palecie ,,Kontrola'. Wnętrze klamry jest szczególnym rodzajem pola parametru, który przyjmuje \emph{skrypt} jako parametr. W~przykładowym skrypcie blok \code{powtórz} ma dwa parametry: liczbę $4$ oraz skrypt\nopagebreak + +\bigpic{typowy-skrypt-wnetrze} + +\section{Duszki i~współbieżność} + +Tuż pod sceną znajduje się przycisk ,,nowy duszek''~\inlinepic{../common/btn-new-sprite}. Kliknięcie go spowoduje dodanie nowego duszka do sceny. Pojawi się on w~losowym miejscu na scenie, skierowany w~losową stronę i~zabarwiony na losowy kolor. + +Każdy duszek ma swoje własne skrypty. Aby wyświetlić w~obszarze skryptów te należące do konkretnego duszka, należy kliknąć na jego obrazku w~\emph{zagrodzie duszków}, znajdującej się w~prawym dolnym rogu okna. Spróbuj umieścić następujące skrypty w~obszarze skryptów --- po jednym dla każdego duszka:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{duszki-i-wspolbieznosc-1} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{duszki-i-wspolbieznosc-2} +\end{minipage} +\end{figure} + +Kiedy klikniemy zieloną flagę~\inlinepic{../common/btn-start}, powinniśmy zobaczyć jak jeden duszek się obraca, podczas gdy drugi porusza się w~tę i~z~powrotem. Ten eksperyment pokazuje, jak różne skrypty mogą być wykonywane jednocześnie (\emph{współbieżnie}). Obracanie się dookoła i~ruch po linii prostej zachodzą jednocześnie. Współbieżność zachodzi również w~przypadku wielu skryptów należących do tego samego duszka. Spróbujmy tego przykładu:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{duszki-i-wspolbieznosc-3} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{duszki-i-wspolbieznosc-4} +\end{minipage} +\end{figure} + +Po naciśnięciu spacji duszek powinien zacząć bez końca chodzić w kółko, ponieważ bloki \code{przesuń} i \code{obróć} są wykonywane współbieżnie. (Aby przerwać program, kliknij czerwony czerwony znak ,,stop''~\inlinepic{../common/btn-stop} na prawym brzegu paska narzędzi). + +\subsection{Kostiumy i~dźwięki} + +Aby zmienić wygląd duszka, należy zaimportować dla niego nowy \emph{kostium}. Są na to trzy sposoby. Najpierw trzeba wybrać duszka z~zagrody. Następnie, w~pierwszej metodzie, klikamy na ikonie pliku~\inlinepic{../common/btn-file} na pasku narzędzi, a~następnie wybieramy polecenie ,,\code{Kostiumy\ldots}''. Ukaże się lista kostiumów z~publicznej biblioteki multimediów, spośród których możemy dokonać wyboru. Drugą metodą jest wybór pliku ze swojego własnego komputera. Należy w~tym celu kliknąć ikonę pliku, a~następnie polecenie ,,\code{Importuj\ldots}''. Można wtedy wybrać plik obrazu w~dowolnym formacie (PNG, JPEG itd.) obsługiwanym przez przeglądarkę. Trzeci sposób jest szybszy jeśli plik, którego chcemy użyć, jest widoczny na pulpicie: po prostu przeciągnij go do okna \Snap{a}. W~każdym z~tych przypadków obszar skryptów zacznie wyglądać mniej więcej tak:\nopagebreak + +\bigpic{obszar-skryptow-z-dodatkowym-kostiumem} + +Tuż nad tą częścią okna znajdują się trzy zakładki: ,,Skrypty'', ,,Kostiumy'' i~,,Dźwię\-ki''. W~tym momencie aktywna jest karta ,,Kostiumy''. Widzimy na niej \emph{garderobę} duszka i~możemy z~jej poziomu wybrać dla niego kostium --- domyślny kostium żółwia\footnote{Z powodów historycznych, słowem ,,żółw'' nazywamy ruchomy obiekt, który porusza się wykonując program i~rysuje, zostawiając za sobą ślad} lub wybrany wcześniej kostium Alonza. (Alonzo, maskotka \Snap{a}, został nazwany na cześć Alonza Churcha, matematyka, który jako pierwszy wpadł na pomysł, aby procedury traktować na równi z~danymi, co jest najistotniejszą różnicą między \Snap{em} a~Scratchem). Możemy przypisać duszkowi tyle kostiumów ile chcemy, a~potem wybierać, który z~nich założy, albo poprzez kliknięcie w~obrębie garderoby, albo używając w~skrypcie bloku \inlinepic{zmien-kostium-na-zolwia} lub \inlinepic{nastepny-kostium}. (Każdy kostium ma zarówno numer jak i~nazwę. Blok \code{następny kostium} wybiera następny w~kolejności kostium; po ostatnim wybiera z~powrotem kostium numer~1. Żółw, czyli kostium numer~0, jest przez blok \code{następny kostium} ignorowany). Kostium ,,Żółw'' jest jedynym, który zmienia kolor zgodnie z~kolorem pisaka. + +Oprócz kostiumów, duszki mogą posiadać \emph{dźwięki}; dźwiękowy odpowiednik garderoby duszka nazywamy jego \emph{szafą grającą}. Można importować pliki dźwiękowe w~dowolnym formacie obsługiwanym przez przeglądarkę. Do odtwarzania dźwięków służą dwa rodzaje bloków. Jeśli skrypt ma się dalej wykonywać podczas odtwarzania, używamy bloku \inlinepic{zagraj-dzwiek-ratunku}. Za to aby poczekać, aż dźwięk się zakończy, zanim skrypt będzie kontynuowany, należy wykorzystać blok \inlinepic{zagraj-dzwiek-ratunku-i-czekaj}. + +\subsection{Nadawanie i~odbieranie komunikatów} + +Widzieliśmy wcześniej przykład dwóch duszków poruszających się jednocześnie. Jednak w~bardziej interesującym programie duszki na scenie będą wchodzić w~interakcje, abyśmy mogli opowiedzieć przy ich pomocy jakąś historię, zagrać w~grę itd. Czasami jeden duszek będzie musiał nakazać innemu wykonanie jakiegoś skryptu. Oto prosty przykład:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=0.4]{../common/boy1-walking} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\reflectbox{\includegraphics[scale=0.3]{../common/dog2-c}} +\end{minipage} +\vskip 3ex +\begin{minipage}[t]{0.5\textwidth} +\centering +\vspace{0pt} % REALLY align to top +\includegraphics[scale=\defaultGraphicsScale]{nadawanie-i-odbieranie-komunikatow-1} +\end{minipage}% +\begin{minipage}[t]{0.5\textwidth} +\centering +\vspace{0pt} % REALLY align to top +\includegraphics[scale=\defaultGraphicsScale]{nadawanie-i-odbieranie-komunikatow-2} +\end{minipage} +\end{figure} + +Słowo ,,szczekaj'' występujące w~bloku \inlinepic{nadaj-szczekaj-do-wszystkich-i-czekaj} to pierwszy lepszy wyraz, który przyszedł mi do głowy. Jedną z~opcji, które ukazują się po kliknięciu strzałki w~dół obok tego pola parametru (i~jedyną początkowo dostępną), jest ,,\code{nowy}''. Po jej wybraniu \Snap{} pyta o~nazwę komunikatu. Kiedy wspomniany blok zostanie wykonany, wybrany komunikat zostaje wysłany do \emph{każdego} duszka --- stąd też określenie ,,nadaj do wszystkich''. Jednak w~naszym przykładzie tylko jeden duszek ma skrypt, który jest wywoływany w~momencie nadania tego komunikatu --- jest nim pies. Ponieważ skrypt chłopca wykorzystuje blok \code{nadaj do wszystkich i~czekaj} zamiast \code{nadaj do wszystkich}, chłopiec nie przechodzi do następującego po nim bloku \code{powiedz}, dopóki skrypt psa się nie skończy. Z~tej przyczyny dwa duszki mówią na zmianę, a~nie jednocześnie. + +Warto przy okazji zwrócić uwagę na to, że pierwsze pole parametru na bloku \code{powiedz} nie jest owalne, lecz prostokątne. Oznacza to, że parametr ten może być dowolnym łańcuchem znaków (tekstem), nie tylko liczbą. W~polach parametrów typu tekstowego spacje ukazują się jako brązowe kropki, abyśmy mogli policzyć liczbę odstępów między wyrazami. Co ważniejsze, możemy dzięki temu odróżnić pusty łańcuch od złożonego z~samych spacji. Brązowe kropki \emph{nie będą} widoczne na scenie, kiedy blok zostanie wykonany. + +Scena ma swój własny obszar skryptów. Możemy wyświetlić jej szczegóły klikając ikonę ,,Scena'' po lewej stronie zagrody duszków. W~przeciwieństwie do duszków scena się nie porusza. Zamiast kostiumów ma \emph{tła} --- obrazki wypełniające cały obszar sceny. Duszki rysowane są na aktualnym tle. W~skomplikowanych projektach często wygodnie jest użyć skryptu sceny do koordynacji działań poszczególnych części programu. + +\section{Zagnieżdżanie duszków: kotwice i~części} +\label{sec:zagnieżdżanie-duszków} + +Czasem dobrze jest stworzyć swego rodzaju ,,nadduszka'', złożonego z~kawałków, które poruszają się razem, ale mogą być osobno względem siebie ustawiane. Klasycznym przykładem może być ciało człowieka złożone z~tułowia, kończyn i~głowy. \Snap{} pozwala nam uczynić jednego z~duszków \emph{kotwicą} złożonego obiektu, a~resztę --- jego \emph{częściami}. Aby zagnieździć w~ten sposób duszki, należy przeciągnąć z~zagrody ikonę duszka, który ma zostać \emph{częścią} złożonego obiektu na znajdującego się na scenie (nie w~zagrodzie!) duszka, który zostanie \emph{kotwicą}. + +Zagnieżdżone duszki --- zarówno kotwice jak i części --- mają w zagrodzie specjalne oznaczenia:\nopagebreak + +\bigpic{zagniezdzone-duszki-w-zagrodzie} + +W~tym przypadku chcielibyśmy animować rękę Alonza. (Ręka została pokolorowana na zielono, aby uwypuklić zależność między dwoma duszkami, choć w~prawdziwym projekcie miałyby one raczej ten sam kolor). ,,Duszek1'', reprezentujący ciało Alonza, jest kotwicą; ,,Duszek2'' to ręka. Ikona duszka-kotwicy zawiera w~dolnej części do trzech miniatur doczepionych do niego duszków-części. Z~kolei na ikonie każdej z~części widać pomniejszony obrazek duszka-kotwicy w~lewym górnym rogu, w~prawym górnym zaś --- \emph{przełącznik synchronizacji obrotów}. Początkowo, jak widać na rysunku powyżej, jest on tak ustawiony, aby obrót kotwicy powodował zarówno orbitowanie części wokół niej, jak i~obrót części dookoła swojej własnej osi. Po kliknięciu przełącznik zmienia kształt z~okrągłej strzałki na prostą, co oznacza, że od tej pory obrót duszka-kotwicy będzie powodował jedynie zmianę pozycji przymocowanych do niego części, ale nie będą się one obracać wokół własnej osi. (Części mogą również obracać się niezależnie, przy pomocy bloków \code{obróć}). Każda zmiana pozycji lub rozmiaru kotwicy jest propagowana na wszystkie części. + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{komenda-machania-reka}% +\hspace{2em}% +\includegraphics[scale=0.4]{../common/alonzo-waving} +\end{figure} + +\section{Bloki funkcji i~wyrażenia} + +Jak dotąd używaliśmy dwóch rodzajów bloków: ,,czapek'' i~komend. Kolejnym rodzajem jest blok \emph{funkcji}, który ma owalny kształt: \inlinereporterpic{pozycja-x}. Nazywamy go ,,blokiem funkcji'', ponieważ --- podobnie jak funkcja w~matematyce --- kiedy zostaje wykonany, zamiast przeprowadzać jakąś czynność, zwraca wartość, która może zostać użyta jako parametr w~innym bloku. Jeśli przeciągniemy sam blok funkcji do obszaru skryptów i~klikniemy go, obok pokaże się dymek z~wartością zwróconą przez tę funkcję:\nopagebreak + +\bigpic{pozycja-x-zwraca-liczbe} + +Kiedy przeciągamy blok funkcji nad polem parametru należącym do innego bloku, wokół tego pola pojawia się biała otoczka, analogicznie do sytuacji, w~której łączymy bloki komend i~pojawia się biała linia. Oto przykładowy skrypt wykorzystujący funkcję:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{przykladowy-skrypt-wykorzystujacy-funkcje}% +\hspace{2em}% +\includegraphics{../common/turtle-says-its-position} +\end{figure} + +Funkcja \code{pozycja X} nadaje tu wartość pierwszemu parametrowi bloku \code{powiedz}. Pozycja X~duszka to inaczej jego współrzędna pozioma. Określa ona, jak daleko w~lewo (jeśli jest liczbą ujemną) lub w~prawo (jeśli dodatnią) znajduje się duszek w~stosunku do środka sceny. Analogicznie, pozycja Y~to współrzędna pionowa, mierzona ilością kroków w~górę (wartości dodatnie) lub w~dół od środka (wartości ujemne). + +Przy pomocy funkcji z palety ,,Wyrażenia'' możemy wykonywać obliczenia:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{uzycie-funkcji-do-obliczen}% +\hspace{2em}% +\includegraphics{../common/turtle-says-its-rounded-position} +\end{figure} + +Blok \code{zaokrąglij} zaokrągla $35.3905\ldots$ do $35$, a~blok~\code{+} dodaje do tej liczby $100$. Nawiasem mówiąc, choć blok \code{zaokrąglij} znajduje się na palecie ,,Wyrażenia'', podobnie jak~\code{+}, to w~tym skrypcie ma on jaśniejszy kolor i~czarne litery. To dlatego, że \Snap{} używa na przemian ciemnych i~jasnych odcieni kolorów, kiedy zagnieżdżamy w~sobie bloki z~tej samej palety:\nopagebreak + +\bigpic{kolorowanie-w-zebre} + +Takie \emph{kolorowanie w~zebrę} poprawia czytelność programu. Blok funkcji wraz z~parametrami, a~być może również innymi blokami funkcji, na przykład \inlinepic{zaokraglij-pozycja-x-plus-100}, nazywamy \emph{wyrażeniem}. + +\section{Predykaty i~obliczenia warunkowe} + +Większość funkcji zwraca albo liczbę, jak \inlinereporterpic{plus}, lub łańcuch tekstowy, jak \inlinereporterpic{polacz-witaj-swiecie}. \emph{Predykat} to specjalny rodzaj funkcji, która zawsze zwraca jedną z dwojga wartości: \code{prawdę} lub \code{fałsz}. Predykaty mają kształt sześciokątów:\nopagebreak + +\bigpic{przycisk-myszy-nacisniety} + +\begin{sloppypar} +Specjalny kształt jest oznaką, że predykaty nie mają z~reguły sensu w~tych polach parametrów, które oczekują liczby lub tekstu. Raczej nie napisalibyśmy \inlinepic{przesun-o-przycisk-myszy-nacisniety-krokow}, choć gdybyśmy się uparli, \Snap{} by nam na to pozwolił, co widać na załączonym obrazku. W~typowych sytuacjach predykaty umieszczamy w~specjalnych sześciokątnych polach parametrów takich jak to:\nopagebreak +\end{sloppypar} + +\bigpic{jezeli-to} + +Klamra \code{jeżeli --- to} wykonuje obejmowany przez nią fragment skryptu wtedy i~tylko wtedy, gdy wyrażenie w~jej sześciokątnym polu parametru jest prawdziwe, czyli zwraca wartość \code{prawda}.\nopagebreak + +\bigpic{predykaty-i-obliczenia-warunkowe-1} + +Poniższy blok jest bardzo użyteczny w~animacjach. Wykonuje on skrypt będący jego parametrem \emph{wielokrotnie}, dopóki predykat nie zostanie spełniony:\nopagebreak + +\bigpic{predykaty-i-obliczenia-warunkowe-2} + +Jeśli pracując nad projektem, będziemy chcieli tymczasowo pominąć niektóre komendy w~skrypcie, lecz nie będziemy chcieli zapomnieć, gdzie było ich miejsce, możemy użyć następującej sztuczki:\nopagebreak + +\bigpic{predykaty-i-obliczenia-warunkowe-3} + +Czasami potrzeba wykonać tę samą czynność bez względu na to, czy jakiś warunek zachodzi czy nie, za to z~różnymi parametrami dla obu tych przypadków. Można do tego użyć bloku \emph{funkcji} \code{if}:\footnote{\onehalfspacing Jeśli nie widzisz go w~palecie ,,Kontrola'', kliknij przycisk ,,Plik''~\inlinepic{../common/btn-file} na pasku narzędzi i~wybierz polecenie ,,Importuj narzędzia''.}\footnote{Niestety, podobnie jak pozostałe dodatkowe narzędzia i~biblioteki bloków, funkcja \code{if --- then --- else} posiada wyłącznie angielską nazwę, bez względu na nasze ustawienia języka. Oznacza ona ,,jeżeli --- to --- w~przeciwnym razie'' --- przyp. tłum.}\nopagebreak + +\bigpic{predykaty-i-obliczenia-warunkowe-4} + +Wartości \code{prawda} i~\code{fałsz} określa się technicznymi terminami ,,wartość logiczna'' lub ,,wartość boolowska'' (ang. \textit{Boolean}). Ta ostatnia nazwa pochodzi on nazwiska George'a Boole'a, który stworzył opisującą je teorię matematyczną\footnote{Jest to \emph{algebra Boole'a} --- przyp. tłum.}. Uważaj na nazewnictwo --- sześciokątny blok to \emph{predykat}, ale wartość przezeń zwracana to \emph{wartość logiczna}. + +Jest jeszcze jedna warta wytłumaczenia niejasność terminologiczna: W wielu językach programowania nazwa ,,procedura'' jest zarezerwowana dla \emph{komend}, które wykonują jakąś czynność, zaś nazwa ,,funkcja'' --- dla części programów zwracających wartość (\emph{funkcji} i \emph{predykatów}). W tym podręczniku \emph{procedury} to dowolne składniki programu, zarówno te zwracające, jak i nie zwracające wartości. Podobnie jak komendy, również funkcje i predykaty będziemy nazywać procedurami. Słowa ,,typ proceduralny'' będą skrótem myślowym dla słów ,,typ komendowy, funkcyjny lub predykatowy''. + +\section{Zmienne} + +Wypróbujmy następujący skrypt:\footnote{Blok \code{for}\footnotemark{} również znajduje się w~bibliotece narzędzi; użyj polecenia ,,\code{Importuj narzędzia}'' z~menu ,,Plik'', jeśli nie widzisz ich na palecie ,,Kontrola''.}\footnotetext{Słowa \code{for i = 1 to 10} oznaczają ,,dla $i=1$ do $10$'' --- przyp. tłum.}\nopagebreak + +\bigpic{skrypt-kwadratowej-spirali} + +Parametr bloku \code{przesuń} ma postać pomarańczowego owalu. Aby go tam umieścić, należy przeciągnąć taki sam owal będący częścią bloku \code{for}:\nopagebreak + +\bigpic{przeciaganie-zmiennej} + +Ten owal to \emph{zmienna} --- symboliczna nazwa reprezentująca jakąś wartość. Powyższy rysunek przedstawia sytuację sprzed zmiany drugiego parametru liczbowego bloku \code{for} z~domyślnego $10$ na $200$ oraz przeciągnięcia do jego środka bloku \code{obróć}. Blok \code{for} wykonuje swój parametr skryptowy wielokrotnie, podobnie jak \code{powtarzaj}, lecz przed każdym razem zapisuje liczbę do zmiennej~\code{i}, zaczynając od swojego pierwszego parametru liczbowego, dodając~$1$ przy każdym powtórzeniu, aż dojdzie do liczby z~drugiego parametru liczbowego. W~tym przypadku będziemy mieć $200$ powtórzeń, najpierw dla $\code{i}=1$, potem dla $\code{i}=2$, następnie $3$ i~tak dalej, aż do $\code{i}=200$ w~ostatnim powtórzeniu. W~rezultacie każdy blok \code{przesuń} rysuje coraz to dłuższy segment łamanej, co nadaje jej wygląd zbliżony do spirali. (Możesz spróbować ze skrętem $90$~stopni zamiast $92$; zobaczysz wtedy, dlaczego nazywamy tego rodzaju obraz ,,kwadratową spiralą''). + +Zmienna~\code{i}~została utworzona przez blok \code{for} i~może zostać użyta wyłącznie wewnątrz jego klamry. Nawiasem mówiąc, jeśli nie spodoba nam się nazwa~\code{i}, możemy ją zmienić klikając pomarańczowy owal bez przeciągania go. Pokaże się wtedy okno dialogowe, do którego można wpisać inną nazwę:\nopagebreak + +\bigpic{dialog-nazwy-zmiennej-skryptu} + +Nazwa~,,\code{i}'' nie mówi nam zbyt wiele; można by tu użyć słowa ,,długość'', aby podkreślić znaczenie zmiennej. Nazwa~,,\code{i}'' jest popularna, gdyż w~matematyce istnieje tradycja używania liter od~\code{i} do~\code{n} dla liczb całkowitych. W~językach programowania nie musimy się jednak ograniczać do jednoliterowych nazw zmiennych. + +\subsection{Zmienne globalne} + +Możemy ,,ręcznie'' tworzyć zmienne, których widoczność nie jest ograniczona do jednego bloku. Aby to zrobić, należy kliknąć przycisk ,,\code{Stwórz zmienną}'' w~górnej części palety ,,Dane'':\nopagebreak + +\bigpic{stworz-zmienna} + +Otworzy się okno dialogowe, które pozwala nadać nazwę nowej zmiennej:\nopagebreak + +\bigpic{dialog-nazwy-zmiennej} + +Okno to pozwala również wybrać, czy zmienna ma być dostępna dla wszystkich duszków (co jest pożądane w~większości przypadków), czy ma być ona widoczna tylko dla aktualnego duszka. Postępujemy tak, jeśli mamy zamiar dać wielu duszkom własne zmienne o~\emph{tej samej nazwie}. Możemy potem kopiować skrypty między duszkami, przeciągając je z~obszaru skryptów aktualnego duszka na obrazek innego duszka w~zagrodzie duszków. Dzięki temu różne duszki będą wykonywać nieco inne rzeczy w~momencie wykonywania tego skryptu, ponieważ każdy z~nich będzie miał w~tej zmiennej zapisaną inną wartość. + +Jeśli nadamy zmiennej nazwę ,,imię'', paleta ,,Dane'' będzie wyglądać następująco:\nopagebreak + +\bigpic{zmienna-na-palecie} + +Widzimy teraz przycisk ,,\code{usuń zmienną}'', a~także pomarańczowy owal z~nazwą zmiennej, taki sam jak owal na bloku \code{for}. Zmienną możemy przeciągnąć do dowolnego skryptu w~obszarze skryptów. Obok owalu widzimy pole wyboru; jest ono początkowo zaznaczone, dzięki czemu na scenie widoczny jest \emph{podgląd zmiennej}:\nopagebreak + +\bigpic{podglad-zmiennej} + +Kiedy nadamy zmiennej jakąś wartość, pojawia ona się w~polu podglądu. + +Ale \emph{jak} nadać zmiennej wartość? Należy użyć do tego bloku \code{ustaw}:\nopagebreak + +\bigpic{zapytaj-i-ustaw} + +Zauważ, że \emph{nie przeciągamy} owalu zmiennej do bloku \code{ustaw}! Aby wybrać z~listy dostępnych zmiennych, należy kliknąć strzałkę w~dół przy pierwszym polu parametru tegoż bloku. + +\subsection{Zmienne skryptu} + +W~poprzednim przykładzie przeprowadzaliśmy interakcję z~użytkownikiem i~chcieliśmy zapamiętać jego imię na potrzeby całego projektu. To dobry przykład sytuacji, w~której właściwe jest użycie zmiennej \emph{globalnej} (z~rodzaju tych, które tworzymy przyciskiem ,,\code{Stwórz zmienną}''). Innym typowym przykładem jest zmienna ,,\code{wynik}'' w~projekcie gry. Czasem jednak potrzebujemy zmiennej tylko tymczasowo podczas wykonywania któregoś ze skryptów. W~takim przypadku możemy użyć bloku \code{zmienne skryptu} aby ją utworzyć:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{skrypt-skrecajacej-linii}% +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics{../common/wiggling-line} +\end{minipage}% +\end{figure} + +Podobnie jak w~przypadku bloku \code{for}, aby zmienić nazwę zmiennej, wystarczy kliknąć pomarańczowy owal w~bloku \code{zmienne skryptu} bez przeciągania. Możemy również stworzyć więcej tymczasowych zmiennych klikając strzałkę w~prawo na końcu bloku. Spowoduje to dodanie kolejnego owalu zmiennej:\nopagebreak + +\bigpic{zmienne-skryptu-a-b-c} + +\section{I tak dalej} + +Niniejszy podręcznik nie opisuje szczegółowo każdego bloku. Jest wiele bloków związanych z~ruchem, dźwiękiem, kostiumami, efektami graficznymi i~tak dalej. Ich przeznaczenie można poznać eksperymentalnie, ale także poprzez lekturę ,,ekranów pomocy''\footnote{Niestety, są one dostępne wyłącznie w~języku angielskim --- przyp. tłum.}, które można obejrzeć klikając interesujący nas blok albo prawym przyciskiem myszy, albo lewym z~wciśniętym jednocześnie klawiszem Ctrl, a~następnie wybierając z~menu polecenie ,,\code{pomoc\ldots}''. Jeśli zapomnisz, w~której palecie znajduje się potrzebny Ci blok, ale pamiętasz choćby część nazwy, wciśnij Ctrl-F i~wpisz ją w~polu tekstowym, które pojawi się w~obszarze palet. + +\chapter{Zapisywanie i otwieranie projektów i multimediów} + +Kiedy już stworzymy jakiś projekt, dobrze by było móc go zapisać, aby mieć go pod ręką, kiedy ponownie uruchomimy \Snap{a}. Jest na to kilka sposobów. Możemy zapisać projekt na swoim komputerze albo na stronie internetowej \Snap{a}. Zaletą zapisywania w~sieci jest dostęp do projektów nawet podczas używania innego komputera lub urządzenia mobilnego, takiego jak tablet czy smartfon. Z~kolei zapisywanie na własnym komputerze pozwala na dostęp do zapisanych projektów w~przypadku braku dostępu do sieci, na przykład w~czasie podróży pociągiem lub samolotem. Dlatego właśnie mamy wiele sposobów na zapisanie projektu. + +\section{Zapisywanie na komputerze} + +Istnieją dwa różne sposoby na zapisanie projektu lub pliku multimedialnego (na przykład kostiumu) na własnym komputerze. Ta złożoność wynika z~tego, że JavaScript, w~którym \Snap{} jest zaimplementowany, celowo ogranicza wpływ programów wykonywanych przez przeglądarkę na komputer użytkownika. Jest to pożyteczne, ponieważ dzięki temu możemy z~pełnym zaufaniem uruchamiać w~\Snap{ie} cudze projekty --- bez obawy, że usuną nam wszystkie pliki lub zainfekują komputer wirusem. Jednak mechanizm ten nieco utrudnia pracę. + +\subsection{Localstore} + +{\Huge \TODO{}} + +\subsection{XML Export} + +Drugi sposób na zapisanie projektu na komputerze ma dwa etapy, ale nie ma ograniczeń związanych z~użyciem localstore (\TODO{zmień nazwę}). Projekty zapisane w~ten sposób są zwykłymi plikami na dysku komputera i~można je wysłać do znajomych oraz otworzyć w~dowolnej przeglądarce. Ponadto ich rozmiar nie jest ograniczony. + +Z~menu ,,Plik''~\inlinepic{../common/btn-file} wybieramy ,,Eksportuj projekt\ldots''. Okno \Snap{a} zniknie i~zostanie zastąpione przez ekran wypełniony ,,krzakami''. Bez paniki! Tak ma być. To, co widzimy, to zapis projektu w~notacji zwanej XML. Głównym powodem, dla którego wygląda on jak stek bzdur, jest to, że zawiera on zakodowane obrazki i~inne multimedia zawarte w~projekcie. Jeśli się dobrze wpatrzymy, same skrypty są jako tako czytelne, choć nie wyglądają jak bloki \Snap{a}. Przeglądarka otworzyła dla tekstu XML nową kartę; okno \Snap{a} jest wciąż otwarte, ukryte pod spodem. + +Jednak tekst XML nie jest po to, abyśmy go czytali. Kiedy już mamy otwartą tę kartę, możemy użyć polecenia ,,Zapisz'' w~przeglądarce. Można je uruchomić z~poziomu menu przeglądarki lub przy pomocy skrótu klawiszowego --- zazwyczaj Command-S (Mac) lub Ctrl-S (wszędzie indziej). Wybieramy nazwę dla pliku, a~przeglądarka zapisze go w~folderze ,,Pobrane''\footnote{lub w~innym miejscu, które wskażemy w~oknie zapisu --- przyp. tłum.}. Na koniec zamykamy kartę z~plikiem XML i~wracamy do środowiska \Snap{}. + +\section{Cloud Storage} + +Inną możliwością jest zapisanie projektu ,,w~chmurze'', na stronie internetowej \Snap{a}. Aby to zrobić, musimy najpierw założyć tam konto. Klikamy na przycisku ,,Chmura'' (\,\inlinepic{../common/btn-cloud}\,) na pasku narzędzi, a~następnie wybieramy polecenie ,,Rejestracja\ldots''. Pokaże się następujące okno:\nopagebreak + +\bigpic{rejestracja} + +Należy teraz wybrać nazwę użytkownika, którą będziemy się legitymować w~obrębie strony, taką jak na przykład \code{Jens} lub \code{bh}. Jeśli jesteś użytkownikiem Scratcha, możesz również użyć na stronie \Snap{a} swojej nazwy użytkownika z~serwisu Scratch. Jeśli jesteś dzieckiem, nie wybieraj nazwy użytkownika, która zawierałaby twoje nazwisko; imiona i~inicjały są akceptowalne. Nie wybieraj też nazwy, której wstydziłbyś się pokazać innym użytkownikom lub rodzicom! Jeśli wybrana przez Ciebie nazwa jest już zajęta, będziesz musiał wybrać inną. + +Będziesz musiał też podać swój miesiąc i~rok urodzenia. \Snap{} używa tych informacji tylko i~wyłącznie aby zdecydować, czy zapytać Cię o~Twój własny adres e-mail, czy też o~adres rodzica. Jeśli jesteś dzieckiem, nie powinieneś zakładać konta w~żadnym serwisie internetowym --- wliczając w~to \Snap{a} --- bez zgody rodzica. \Snap{} nie będzie przechowywać Twojej daty urodzenia na serwerze; zostanie ona użyta tylko na Twoim własnym komputerze podczas procedury rejestracji. Program nie wymaga podania \emph{dokładnej} daty, nawet ten jeden raz, ponieważ jest to ważna dana osobowa. + +Po kliknięciu przycisku OK, na podany adres e-mail zostanie wysłana wiadomość z~początkowym hasłem do nowego konta. \Snap{} będzie przechowywać Twój adres, aby w~przypadku zapomnienia hasła móc wysłać Ci link pozwalający je zresetować. Ponadto \Snap{} wyśle Ci wiadomość, jeśli Twoje konto zostanie zawieszone za naruszenie regulaminu. Twój adres nie będzie wykorzystywany do innych celów. Nie będziesz dostawać żadnego rodzaju wiadomości marketingowych poprzez tę stronę --- ani od zespołu \Snap{a}, ani od osób trzecich. Jeśli mimo to wahasz się przed podaniem tej informacji, poszukaj w~internecie pod hasłem ,,tymczasowy e-mail''. + +Na koniec powinieneś przeczytać regulamin usługi i~wyrazić zgodę na jego postanowienia. Oto ich krótkie streszczenie: nie przeszkadzaj korzystać ze \Snap{a} innym użytkownikom, nie umieszczaj cudzych utworów chronionych prawem autorskim ani żadnych danych osobowych w~projektach udostępnionych innym. Zespół \Snap{a} nie bierze również odpowiedzialności za szkody, jeśli coś pójdzie nie tak. (To nie znaczy, że można by \emph{oczekiwać}, że coś złego się stanie --- ponieważ \Snap{} używa JavaScriptu wewnątrz przeglądarki, jest mocno izolowany od całej reszty komputera. Jednak prawo jest prawem i~musimy to wyraźnie zaznaczyć.) + +Po utworzeniu konta, możemy się na nie zalogować używając polecenia ,,Logowanie\ldots'' z~menu ,,Chmura'':\nopagebreak + +\bigpic{zaloguj-sie} + +Użyj ustalonej wcześniej nazwy użytkownika i~hasła. Jeśli zaznaczysz pole ,,Zapamiętaj mnie na tym komputerze'', zostaniesz zalogowany automatycznie, kiedy następnym razem uruchomisz \Snap{a} w~tej samej przeglądarce na tym samym komputerze. Zaznacz to pole jeśli używasz swojego własnego komputera i~nie udostępniasz go innym. Nie zaznaczaj go, jeśli używasz publicznie dostępnego komputera w~bibliotece, szkole itp. + +Kiedy już się zalogujemy, możemy wybrać opcję ,,Chmura'' w~oknie ,,Zapisz projekt'' ze strony \TODO{Link do obrazka}. Wpisujemy nazwę projektu, a~także opcjonalnie notatki, tak jak w~przypadku zapisywania w~Localstore \TODO{nazwa}. Jednak tym razem nasz projekt będzie zapisany online i~będzie mógł zostać wczytany z~dowolnego miejsca z~dostępem do sieci. + +\section{Wczytywanie zapisanych projektów} + +Kiedy już zapisaliśmy projekt, chcielibyśmy go wczytać z~powrotem do \Snap{a}. Są na to dwa sposoby: + +\begin{enumerate} +\item Jeśli zapisałeś projekt w~Localstore \TODO{nazwa} lub na swoim koncie w~serwisie \Snap{}, użyj polecenia ,,Otwórz\ldots'' z~menu ,,Plik''. Wybierz opcję ,,Przeglądarka'' lub ,,Chmura'', a~potem wybierz swój projekt z~listy i~kliknij OK. Trzecia opcja --- ,,Przykłady'' --- pozwala wybrać spośród dostarczonych przez zespół \Snap{a} przykładowych projektów. Możemy dowiedzieć się o~czym jest każdy z~nich klikając na nim i~czytając jego notatki. + +\item Jeśli zapisałeś projekt w~formacie XML na komputerze, kliknij ,,Importuj\ldots'' w~menu ,,Plik''. Przeglądarka pokaże zwyczajne okno otwierania pliku, przy pomocy którego możesz wskazać projekt, podobnie jak w~innych programach. Możesz również znaleźć swój plik XML z~poziomu pulpitu, a~potem po prostu przeciągnąć go do okna \Snap{a}. +\end{enumerate} + +Druga z powyższych technik pozwala również importować do projektu multimedia (kostiumy i dźwięki). Wystarczy wybrać ,,Importuj...'', a potem wskazać obrazek lub dźwięk zamiast pliku XML. + +\Snap{} potrafi również importować projekty stworzone przy pomocy BYOB~3.0, Scratcha~1.4 lub Scratcha~2.0 (to ostatnie z~pewnymi utrudnieniami; zob. naszą stronę internetową). Niemal wszystkie takie projekty pracują poprawnie pod \Snap{em}, z~wyłączeniem niewielkiej liczby niekompatybilnych bloków. Projekty z~BYOB~3.1 również działają, pod warunkiem, że nie korzystają z~pierwszoklasowych duszków; w~\Snap{ie}~4.1 będą już działać wszystkie projekty z~BYOB~3.1. + +\chapter{Tworzenie własnych bloków} + +\Snap{} pierwotnie nazywał się BYOB, co oznacza ,,Zbuduj Swoje Własne Bloki'' (ang. \textit{Build Your Own Blocks}). Była to pierwsza i~do dziś najważniejsza cecha, którą dodaliśmy do Scratcha. (Nazwa została zmieniona, gdyż niektórzy nauczyciele nie podzielali naszego poczucia humoru.\footnote{Skrót BYOB oznacza tak naprawdę \textit{bring your own beer}, czyli ,,przynieś własne piwo'' i~oznacza, że zostajemy zaproszeni na przyjęcie, ale oczekuje się od nas, że przyniesiemy ze sobą alkohol --- przyp. tłum.} Cóż, czasem trzeba wiedzieć kiedy się poddać.) Nowy Scratch~2.0 również częściowo obsługuje tworzenie własnych bloków. + +\section{Proste bloki} + +Na palecie ,,Dane'', w~pobliżu dolnej krawędzi, znajdziemy przycisk ,,nowy blok''.\nopagebreak + +\begin{figure}[H] +\centering +\input{paleta-dane.pdf_tex} +\end{figure} + +Po kliknięciu tego przycisku pokaże się okno dialogowe, przy pomocy którego możemy wybrać nazwę i~kształt bloku, a~także jego paletę (a~zarazem kolor). Możemy także zdecydować, czy blok ten będzie dostępny dla wszystkich duszków, czy tylko dla aktualnego duszka i~jego klonów. Uwaga: Możemy również wywołać okno ,,nowy blok'' poprzez kliknięcie na tle obszaru skryptu prawym przyciskiem (lub lewym z~wciśniętym klawiszem Ctrl), a~następnie wybranie z~menu polecenia ,,buduj nowy blok\ldots''. + +\bigpic{nowy-blok} + +W~tym oknie dialogowym możemy wybrać paletę, kształt i~nazwę bloku. Poza jednym wyjątkiem, każda paleta ma przyporządkowany jeden kolor, np. wszystkie bloki z~palety ,,Ruch'' są niebieskie. Jednak paleta ,,Dane'' zawiera zarówno pomarańczowe bloki związane ze zmiennymi, jak i~czerwone, związane z~listami. Oba kolory są dostępne; jest również opcja ,,Inne'', przy pomocy której w~palecie ,,Dane'' tworzymy szare bloki, które nie pasują do żadnej z~powyższych kategorii. + +Istnieją trzy kształty bloków, zgodnie z~konwencją która powinna być znana użytkownikom Scratcha: bloki w~kształcie puzzli to komendy --- nie zwracają one wyników. Bloki owalne to funkcje, które zwracają wyniki, a~sześciokątne to predykaty, czyli, innymi słowy, funkcje zwracające wyniki typu logicznego (prawdę lub fałsz). + +Załóżmy, że chcemy utworzyć blok o~nazwie ,,kwadrat'', który rysuje kwadrat. W~oknie ,,nowy blok'' wybieramy opcje ,,Ruch'' i~,,Komenda'', a~następnie wpisujemy ,,\code{kwadrat}'' w~pole nazwy. Po kliknięciu przycisku OK przechodzimy do edytora bloków. Korzystamy z~niego w~taki sam sposób, jak z~obszaru skryptów w~głównym oknie. Jedyna różnica polega na tym, że blok-kapelusz na górze skryptu, zamiast nosić nazwę w~rodzaju ,,\code{kiedy zostanę kliknięty}'', zawiera obraz bloku, który budujemy. Ten kapelusz nazywamy \emph{prototypem}\footnote{W~tym znaczeniu słowo ,,prototyp'' nie jest związane z~omawianym później \emph{programowaniem obiektowym opartym na prototypach}.} nowo tworzonego bloku. Aby zaprogramować działanie własnego bloku, układamy inne bloki pod kapeluszem, a~następnie klikamy przycisk OK:\nopagebreak + +\bigpic{przeciaganie-bloku-do-edytora-blokow} +\bigpic{edytor-blokow-kwadrat} + +Nasz blok pojawi się na dole palety ,,Ruch''. Oto on wraz z~rezultatem jego użycia:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]% + {blok-kwadrat-na-palecie} +\includegraphics[scale=\defaultGraphicsScale]{../common/square} +\end{figure} + +\subsection{Własne bloki z parametrami} + +Załóżmy jednak, że chcielibyśmy móc rysować kwadraty o~różnych rozmiarach. Klikamy na bloku prawym przyciskiem lub lewym z~wciśniętym klawiszem Ctrl. Kiedy wybierzemy polecenie ,,\code{edytuj\ldots}'', otworzy się edytor bloków. Zwróć uwagę na symbole plusów przed i~po słowie \code{kwadrat} w~bloku prototypu. Jeśli zatrzymasz wskaźnik myszy nad jednym z~nich, zostanie on podświetlony:\nopagebreak + +\bigpic{prototyp-bloku-z-podswietlonym-plusem} + +Klikamy prawy plus. Pojawi się okno dialogowe ,,Utwórz nazwę parametru'':\nopagebreak + +\bigpic{utworz-nazwe-parametru} + +Wpisujemy nazwę ,,\code{wielkość}'' i~klikamy przycisk OK. Dialog ten ma więcej opcji; możemy wybrać ,,\code{Tekst tytułowy}'', aby dodać słowa do nazwy bloku, tak aby po polu parametru następował tekst, podobnie jak w~bloku ,,\code{przesuń o~(\,)~kroków}''. Możemy też użyć bardziej kompleksowego okna z~wieloma opcjami dotyczącymi naszego pola parametru; zostawmy to jednak na później. Po kliknięciu OK ujrzymy w~prototypie bloku nowy parametr:\nopagebreak + +\bigpic{skrypt-bloku-kwadrat-z-parametrem-rozmiar} + +Teraz już możemy przeciągnąć pomarańczowy owal zmiennej do skryptu, a~następnie kliknąć przycisk OK w~oknie edytora bloków:\nopagebreak + +\bigpic{przeciaganie-parametru-bloku} + +Nasz blok wraz z~polem parametru jest teraz widoczny na palecie ,,Ruch'':\nopagebreak + +\bigpic{blok-kwadrat} + +Możemy narysować kwadrat dowolnego rozmiaru wpisując długość boku w~polu parametru i~uruchamiając blok jak zazwyczaj, poprzez kliknięcie na nim lub umieszczenie go w~skrypcie. + +\section{Rekurencja} + +Ponieważ nowy blok pojawił się na palecie, kiedy tylko \emph{zaczęliśmy} go tworzyć, możemy programować bloki rekurencyjne --- czyli takie, które wywołują same siebie. W tym celu należy przeciągnąć blok do jego własnej definicji:\nopagebreak + +\begin{figure}[H] +\centering +\includegraphics[scale=\defaultGraphicsScale]{skrypt-bloku-drzewo}\\ +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{blok-drzewo-w-skrypcie} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{../common/tree} +\end{minipage}% +\end{figure} + +Jeśli rekurencja jest dla Ciebie czymś nowym, oto kilka wskazówek: Kluczowym składnikiem rekurencji jest \emph{przypadek bazowy}, a~więc jakiś minimalny problem, który nasz blok może rozwiązać od razu, bez wywoływania samego siebie. W~naszym przykładzie jest to przypadek $\code{głębokość}=0$, w~którym blok nie robi zupełnie nic, co gwarantuje instrukcja \code{if}, obejmująca w~całości jego treść. Bez przypadku bazowego blok rekurencyjny wykonywałaby się w~nieskończoność\footnote{Mówiąc ściśle: dopóki nie zabraknie pamięci, bowiem każde zagnieżdżone wywołanie bloku rekurencyjnego zużywa jej odrobinę, zwalniając ją dopiero po zakończeniu wykonywania, co w~tym przypadku nigdy by nie nastąpiło. W~przeciwieństwie do wielu innych języków programowania, \Snap{} jest jednak na tyle powolny, że prawdopodobnie trudno by było doczekać się wyczerpania pamięci bez zauważenia wcześniej, że coś jest nie tak --- przyp. tłum.}, wywołując w~kółko sam siebie. + +Staraj się nie myśleć o~tym, jaką dokładnie sekwencję kroków wykonuje komputer przy uruchamianiu programu rekurencyjnego. Zamiast tego wyobraź sobie, że wewnątrz komputera żyje mnóstwo małych ludzików. Jeśli jedna z~nich --- nazwijmy ją Dorota --- rysuje drzewo o~rozmiarze 100 i~głębokości 6, musi zatrudnić Dominika, aby zrobił drzewo o~rozmiarze 70 i~głębokości 5, a~następnie Darka do zrobienia kolejnego drzewa o~rozmiarze 70 i~głębokości 5. Dominik z~kolei zatrudnia Dagmarę oraz Darię i~tak dalej. Każdy z~ludzików ma swoje własne zmienne lokalne --- \code{rozmiar} oraz \code{głębokość} --- i~każda z~nich ma swoją własną wartość, potencjalnie inną od zmiennych innych ludzików. + +Możesz również tworzyć funkcje rekurencyjne, takie jak na przykład ten blok obliczający silnię:\nopagebreak + +\begin{figure}[H] +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{skrypt-bloku-silnia} +\end{minipage}% +\begin{minipage}{0.5\textwidth} +\centering +\includegraphics[scale=\defaultGraphicsScale]{silnia-5-z-rezultatem} +\end{minipage}% +\end{figure} + +Skupmy się chwilowo na sposobie użycia bloku \code{zwróć}. Kiedy funkcja używa tego bloku, kończy ona swą pracę i~zwraca zadaną wartość; żadne inne bloki w~jej skrypcie nie będą już wykonane. Dlatego też blok \code{jeżeli --- to --- w~przeciwnym razie} z~powyższego skryptu mógłby być po prostu blokiem \code{jeżeli}; wówczas drugi z~bloków \code{zwróć} znajdowałby się pod nim, a~nie wewnątrz niego. Działanie funkcji pozostałoby takie samo, ponieważ w~momencie gdy pierwszy blok \code{zwróć} zostałby wykonany w~przypadku bazowym, działanie funkcji zostałoby zakończone, a~drugi blok \code{zwróć} zostałby zignorowany. Istnieje również komenda \code{zatrzymaj ten blok}, która także kończy wykonywanie aktualnego bloku, a~której używamy do przerywania działania bloków niczego nie zwracających, czyli komend. W~przeciwieństwie do niej blok \code{zatrzymaj ten skrypt} przerywa nie tylko obecne wywołanie bloku, ale cały wywołujący go skrypt, aż do najwyższego poziomu. + +A oto nieco bardziej zwięzły sposób na zapis funkcji silni:\nopagebreak + +\bigpic{skrypt-bloku-zwiezla-silnia} + +(Jeśli nie widzisz bloku funkcji \code{if} na palecie ,,Kontrola'', kliknij przycisk ,,Plik''~\inlinepic{../common/btn-file} na pasku narzędzi i wybierz ,,\code{Importuj narzędzia}''.) + +Pragnących dowiedzieć się więcej na temat rekursji odsyłamy do książek Erica Robertsa \textit{Thinking Recursively} (ISBN~978-0471816522) oraz nieco bardziej aktualnej \textit{Thinking Recursively in Java} (ISBN~978-0471701460). + +\section{Block Libraries} +\chapter{First Class Lists} +\section{The list Block} +\section{Lists of Lists} +\section{Functional and Imperative List Programming} +\section{Higher Order List Operations and Rings} +\chapter{Typed Inputs} +\section{Scratch's Type Notation} +\section{The \Snap{} Input Type Dialog} +\subsection{Procedure Types} +\subsection{Pulldown inputs} +\subsection{Input variants} +\subsection{Prototype Hints} +\subsection{Title Text and Symbols} +\chapter{Procedures as Data} +\section{Call and Run} +\subsection{Call/Run with inputs} +\subsection{Variables in Ring Slots} +\section{Writing Higher Order Procedures} +\subsection{Recursive Calls to Multiple-Input Blocks} +\section{Formal Parameters} +\section{Procedures as Data} +1\section{Special Forms} +\subsection{Special Forms in Scratch} +\chapter{Object Oriented Programming} +\section{Local State with Script Variables} +\section{Messages and Dispatch Procedures} +\section{Inheritance via Delegation} +\section{An Implementation of Prototyping OOP} +\chapter{The Outside World} +\section{The World Wide Web} +\section{Hardware Devices} +\section{Date and Time} +\chapter{Continuations} +\section{Continuation Passing Style} +\section{Call/Run w/Continuation} +\subsection{Nonlocal exit} +\chapter{User Interface Elements} +\section{Tool Bar Features} +\subsection{The \Snap{} Logo Menu} +\subsection{The File Menu} +\subsection{The Cloud Menu} +\subsection{The Settings Menu} +\subsection{Stage Resizing Buttons} +\subsection{Project Control Buttons} +\section{The Palette Area} +\subsection{Context Menus for Palette Blocks} +\subsection{Context Menu for the Palette Background} +\section{The Scripting Area} +\subsection{Sprite Appearance and Behavior Controls} +\subsection{Scripting Area Tabs} +\subsection{Scripts and Blocks Within Scripts} +\subsection{Scripting Area Background Context Menu} +\subsection{Controls in the Costumes Tab} +\subsection{The Paint Editor} +\subsection{Controls in the Sounds Tab} +\section{Controls on the Stage} +\section{The Sprite Corral and Sprite Creation Buttons} + +\end{document} diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/stworz-zmienna.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/stworz-zmienna.png new file mode 100644 index 00000000..5acc16d1 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/stworz-zmienna.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/typowy-skrypt-wnetrze.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/typowy-skrypt-wnetrze.png new file mode 100644 index 00000000..c3618ca5 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/typowy-skrypt-wnetrze.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/typowy-skrypt.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/typowy-skrypt.png new file mode 100644 index 00000000..6e2efe0e Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/typowy-skrypt.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/utworz-nazwe-parametru.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/utworz-nazwe-parametru.png new file mode 100644 index 00000000..cfbc5033 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/utworz-nazwe-parametru.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/uzycie-funkcji-do-obliczen.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/uzycie-funkcji-do-obliczen.png new file mode 100644 index 00000000..44eb37d2 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/uzycie-funkcji-do-obliczen.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagniezdzone-duszki-w-zagrodzie.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagniezdzone-duszki-w-zagrodzie.png new file mode 100644 index 00000000..aca5b609 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagniezdzone-duszki-w-zagrodzie.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagraj-dzwiek-ratunku-i-czekaj.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagraj-dzwiek-ratunku-i-czekaj.png new file mode 100644 index 00000000..29786156 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagraj-dzwiek-ratunku-i-czekaj.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagraj-dzwiek-ratunku.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagraj-dzwiek-ratunku.png new file mode 100644 index 00000000..2d9977da Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zagraj-dzwiek-ratunku.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zaloguj-sie.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zaloguj-sie.png new file mode 100644 index 00000000..d780790e Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zaloguj-sie.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zaokraglij-pozycja-x-plus-100.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zaokraglij-pozycja-x-plus-100.png new file mode 100644 index 00000000..b4b4c341 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zaokraglij-pozycja-x-plus-100.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zapytaj-i-ustaw.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zapytaj-i-ustaw.png new file mode 100644 index 00000000..2596f373 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zapytaj-i-ustaw.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmien-kostium-na-zolwia.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmien-kostium-na-zolwia.png new file mode 100644 index 00000000..ff5f8f6c Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmien-kostium-na-zolwia.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmienna-na-palecie.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmienna-na-palecie.png new file mode 100644 index 00000000..3ef5a021 Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmienna-na-palecie.png differ diff --git a/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmienne-skryptu-a-b-c.png b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmienne-skryptu-a-b-c.png new file mode 100644 index 00000000..4b5b247a Binary files /dev/null and b/elements/pl-snap/Snap/help/manual-LaTeX/pl/zmienne-skryptu-a-b-c.png differ diff --git a/elements/pl-snap/Snap/help/newClone.png b/elements/pl-snap/Snap/help/newClone.png new file mode 100644 index 00000000..81d208fb Binary files /dev/null and b/elements/pl-snap/Snap/help/newClone.png differ diff --git a/elements/pl-snap/Snap/help/playFreq.png b/elements/pl-snap/Snap/help/playFreq.png new file mode 100644 index 00000000..8c83ba97 Binary files /dev/null and b/elements/pl-snap/Snap/help/playFreq.png differ diff --git a/elements/pl-snap/Snap/help/playSound.png b/elements/pl-snap/Snap/help/playSound.png new file mode 100644 index 00000000..3abadf7e Binary files /dev/null and b/elements/pl-snap/Snap/help/playSound.png differ diff --git a/elements/pl-snap/Snap/help/playSound_.png b/elements/pl-snap/Snap/help/playSound_.png new file mode 100644 index 00000000..f49fa71f Binary files /dev/null and b/elements/pl-snap/Snap/help/playSound_.png differ diff --git a/elements/pl-snap/Snap/help/receiveCondition.png b/elements/pl-snap/Snap/help/receiveCondition.png new file mode 100644 index 00000000..831afd5f Binary files /dev/null and b/elements/pl-snap/Snap/help/receiveCondition.png differ diff --git a/elements/pl-snap/Snap/help/receiveGo.png b/elements/pl-snap/Snap/help/receiveGo.png new file mode 100644 index 00000000..b5efb16d Binary files /dev/null and b/elements/pl-snap/Snap/help/receiveGo.png differ diff --git a/elements/pl-snap/Snap/help/receiveInteraction.png b/elements/pl-snap/Snap/help/receiveInteraction.png new file mode 100644 index 00000000..e81b1a78 Binary files /dev/null and b/elements/pl-snap/Snap/help/receiveInteraction.png differ diff --git a/elements/pl-snap/Snap/help/receiveKey.png b/elements/pl-snap/Snap/help/receiveKey.png new file mode 100644 index 00000000..e09f64f5 Binary files /dev/null and b/elements/pl-snap/Snap/help/receiveKey.png differ diff --git a/elements/pl-snap/Snap/help/receiveMessage.png b/elements/pl-snap/Snap/help/receiveMessage.png new file mode 100644 index 00000000..0ab0ba2e Binary files /dev/null and b/elements/pl-snap/Snap/help/receiveMessage.png differ diff --git a/elements/pl-snap/Snap/help/receiveOnClone.png b/elements/pl-snap/Snap/help/receiveOnClone.png new file mode 100644 index 00000000..fee54c5a Binary files /dev/null and b/elements/pl-snap/Snap/help/receiveOnClone.png differ diff --git a/elements/pl-snap/Snap/help/reifyPredicate.png b/elements/pl-snap/Snap/help/reifyPredicate.png new file mode 100644 index 00000000..f5052da1 Binary files /dev/null and b/elements/pl-snap/Snap/help/reifyPredicate.png differ diff --git a/elements/pl-snap/Snap/help/reifyReporter.png b/elements/pl-snap/Snap/help/reifyReporter.png new file mode 100644 index 00000000..f5052da1 Binary files /dev/null and b/elements/pl-snap/Snap/help/reifyReporter.png differ diff --git a/elements/pl-snap/Snap/help/reifyScript.png b/elements/pl-snap/Snap/help/reifyScript.png new file mode 100644 index 00000000..f5052da1 Binary files /dev/null and b/elements/pl-snap/Snap/help/reifyScript.png differ diff --git a/elements/pl-snap/Snap/help/removeClone.png b/elements/pl-snap/Snap/help/removeClone.png new file mode 100644 index 00000000..a970280d Binary files /dev/null and b/elements/pl-snap/Snap/help/removeClone.png differ diff --git a/elements/pl-snap/Snap/help/reportAskFor.png b/elements/pl-snap/Snap/help/reportAskFor.png new file mode 100644 index 00000000..c44de441 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAskFor.png differ diff --git a/elements/pl-snap/Snap/help/reportAspect.png b/elements/pl-snap/Snap/help/reportAspect.png new file mode 100644 index 00000000..c03323ed Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAspect.png differ diff --git a/elements/pl-snap/Snap/help/reportAtomicCombine.png b/elements/pl-snap/Snap/help/reportAtomicCombine.png new file mode 100644 index 00000000..6b76b249 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAtomicCombine.png differ diff --git a/elements/pl-snap/Snap/help/reportAtomicKeep.png b/elements/pl-snap/Snap/help/reportAtomicKeep.png new file mode 100644 index 00000000..065f757d Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAtomicKeep.png differ diff --git a/elements/pl-snap/Snap/help/reportAtomicMap.png b/elements/pl-snap/Snap/help/reportAtomicMap.png new file mode 100644 index 00000000..38b20180 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAtomicMap.png differ diff --git a/elements/pl-snap/Snap/help/reportAttributeOf.png b/elements/pl-snap/Snap/help/reportAttributeOf.png new file mode 100644 index 00000000..97d8433c Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAttributeOf.png differ diff --git a/elements/pl-snap/Snap/help/reportAudio.png b/elements/pl-snap/Snap/help/reportAudio.png new file mode 100644 index 00000000..a1df90ee Binary files /dev/null and b/elements/pl-snap/Snap/help/reportAudio.png differ diff --git a/elements/pl-snap/Snap/help/reportBoolean.png b/elements/pl-snap/Snap/help/reportBoolean.png new file mode 100644 index 00000000..3a056c91 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportBoolean.png differ diff --git a/elements/pl-snap/Snap/help/reportCDR.png b/elements/pl-snap/Snap/help/reportCDR.png new file mode 100644 index 00000000..620edef4 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportCDR.png differ diff --git a/elements/pl-snap/Snap/help/reportCONS.png b/elements/pl-snap/Snap/help/reportCONS.png new file mode 100644 index 00000000..2bb68001 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportCONS.png differ diff --git a/elements/pl-snap/Snap/help/reportCallCC.png b/elements/pl-snap/Snap/help/reportCallCC.png new file mode 100644 index 00000000..8c911c6d Binary files /dev/null and b/elements/pl-snap/Snap/help/reportCallCC.png differ diff --git a/elements/pl-snap/Snap/help/reportColorIsTouchingColor.png b/elements/pl-snap/Snap/help/reportColorIsTouchingColor.png new file mode 100644 index 00000000..665d0c04 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportColorIsTouchingColor.png differ diff --git a/elements/pl-snap/Snap/help/reportCombine.png b/elements/pl-snap/Snap/help/reportCombine.png new file mode 100644 index 00000000..ab5d15a4 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportCombine.png differ diff --git a/elements/pl-snap/Snap/help/reportConcatenatedLists.png b/elements/pl-snap/Snap/help/reportConcatenatedLists.png new file mode 100644 index 00000000..6698feec Binary files /dev/null and b/elements/pl-snap/Snap/help/reportConcatenatedLists.png differ diff --git a/elements/pl-snap/Snap/help/reportDate.png b/elements/pl-snap/Snap/help/reportDate.png new file mode 100644 index 00000000..36478072 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportDate.png differ diff --git a/elements/pl-snap/Snap/help/reportDifference.png b/elements/pl-snap/Snap/help/reportDifference.png new file mode 100644 index 00000000..e8dc4fd2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportDifference.png differ diff --git a/elements/pl-snap/Snap/help/reportEquals.png b/elements/pl-snap/Snap/help/reportEquals.png new file mode 100644 index 00000000..6c89c4d8 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportEquals.png differ diff --git a/elements/pl-snap/Snap/help/reportFalse.png b/elements/pl-snap/Snap/help/reportFalse.png new file mode 100644 index 00000000..192a1e4e Binary files /dev/null and b/elements/pl-snap/Snap/help/reportFalse.png differ diff --git a/elements/pl-snap/Snap/help/reportFindFirst.png b/elements/pl-snap/Snap/help/reportFindFirst.png new file mode 100644 index 00000000..7dd9472c Binary files /dev/null and b/elements/pl-snap/Snap/help/reportFindFirst.png differ diff --git a/elements/pl-snap/Snap/help/reportGet.png b/elements/pl-snap/Snap/help/reportGet.png new file mode 100644 index 00000000..684b43e2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportGet.png differ diff --git a/elements/pl-snap/Snap/help/reportGetImageAttribute.png b/elements/pl-snap/Snap/help/reportGetImageAttribute.png new file mode 100644 index 00000000..9143708b Binary files /dev/null and b/elements/pl-snap/Snap/help/reportGetImageAttribute.png differ diff --git a/elements/pl-snap/Snap/help/reportGetSoundAttribute.png b/elements/pl-snap/Snap/help/reportGetSoundAttribute.png new file mode 100644 index 00000000..9f865785 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportGetSoundAttribute.png differ diff --git a/elements/pl-snap/Snap/help/reportGetVar.png b/elements/pl-snap/Snap/help/reportGetVar.png new file mode 100644 index 00000000..b13d809b Binary files /dev/null and b/elements/pl-snap/Snap/help/reportGetVar.png differ diff --git a/elements/pl-snap/Snap/help/reportGlobalFlag.png b/elements/pl-snap/Snap/help/reportGlobalFlag.png new file mode 100644 index 00000000..b06657a3 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportGlobalFlag.png differ diff --git a/elements/pl-snap/Snap/help/reportGreaterThan.png b/elements/pl-snap/Snap/help/reportGreaterThan.png new file mode 100644 index 00000000..77c21422 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportGreaterThan.png differ diff --git a/elements/pl-snap/Snap/help/reportIfElse.png b/elements/pl-snap/Snap/help/reportIfElse.png new file mode 100644 index 00000000..948488e7 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportIfElse.png differ diff --git a/elements/pl-snap/Snap/help/reportIsA.png b/elements/pl-snap/Snap/help/reportIsA.png new file mode 100644 index 00000000..fdc0485f Binary files /dev/null and b/elements/pl-snap/Snap/help/reportIsA.png differ diff --git a/elements/pl-snap/Snap/help/reportIsFastTracking.png b/elements/pl-snap/Snap/help/reportIsFastTracking.png new file mode 100644 index 00000000..2929a790 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportIsFastTracking.png differ diff --git a/elements/pl-snap/Snap/help/reportIsIdentical.png b/elements/pl-snap/Snap/help/reportIsIdentical.png new file mode 100644 index 00000000..23a57837 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportIsIdentical.png differ diff --git a/elements/pl-snap/Snap/help/reportJSFunction.png b/elements/pl-snap/Snap/help/reportJSFunction.png new file mode 100644 index 00000000..ecb2f0c7 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportJSFunction.png differ diff --git a/elements/pl-snap/Snap/help/reportJoinWords.png b/elements/pl-snap/Snap/help/reportJoinWords.png new file mode 100644 index 00000000..60045a13 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportJoinWords.png differ diff --git a/elements/pl-snap/Snap/help/reportKeep.png b/elements/pl-snap/Snap/help/reportKeep.png new file mode 100644 index 00000000..49ab049a Binary files /dev/null and b/elements/pl-snap/Snap/help/reportKeep.png differ diff --git a/elements/pl-snap/Snap/help/reportKeyPressed.png b/elements/pl-snap/Snap/help/reportKeyPressed.png new file mode 100644 index 00000000..cab41261 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportKeyPressed.png differ diff --git a/elements/pl-snap/Snap/help/reportLessThan.png b/elements/pl-snap/Snap/help/reportLessThan.png new file mode 100644 index 00000000..73316dcd Binary files /dev/null and b/elements/pl-snap/Snap/help/reportLessThan.png differ diff --git a/elements/pl-snap/Snap/help/reportLetter.png b/elements/pl-snap/Snap/help/reportLetter.png new file mode 100644 index 00000000..91b1d125 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportLetter.png differ diff --git a/elements/pl-snap/Snap/help/reportListAttribute.png b/elements/pl-snap/Snap/help/reportListAttribute.png new file mode 100644 index 00000000..be8ce3f2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportListAttribute.png differ diff --git a/elements/pl-snap/Snap/help/reportListContainsItem.png b/elements/pl-snap/Snap/help/reportListContainsItem.png new file mode 100644 index 00000000..0d5b2cd4 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportListContainsItem.png differ diff --git a/elements/pl-snap/Snap/help/reportListIndex.png b/elements/pl-snap/Snap/help/reportListIndex.png new file mode 100644 index 00000000..6497381e Binary files /dev/null and b/elements/pl-snap/Snap/help/reportListIndex.png differ diff --git a/elements/pl-snap/Snap/help/reportListIsEmpty.png b/elements/pl-snap/Snap/help/reportListIsEmpty.png new file mode 100644 index 00000000..58f1bc71 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportListIsEmpty.png differ diff --git a/elements/pl-snap/Snap/help/reportListItem.png b/elements/pl-snap/Snap/help/reportListItem.png new file mode 100644 index 00000000..d207e1e8 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportListItem.png differ diff --git a/elements/pl-snap/Snap/help/reportMap.png b/elements/pl-snap/Snap/help/reportMap.png new file mode 100644 index 00000000..38b20180 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportMap.png differ diff --git a/elements/pl-snap/Snap/help/reportModulus.png b/elements/pl-snap/Snap/help/reportModulus.png new file mode 100644 index 00000000..cfd34c7a Binary files /dev/null and b/elements/pl-snap/Snap/help/reportModulus.png differ diff --git a/elements/pl-snap/Snap/help/reportMonadic.png b/elements/pl-snap/Snap/help/reportMonadic.png new file mode 100644 index 00000000..8d9386a8 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportMonadic.png differ diff --git a/elements/pl-snap/Snap/help/reportMouseDown.png b/elements/pl-snap/Snap/help/reportMouseDown.png new file mode 100644 index 00000000..08de27fd Binary files /dev/null and b/elements/pl-snap/Snap/help/reportMouseDown.png differ diff --git a/elements/pl-snap/Snap/help/reportMouseX.png b/elements/pl-snap/Snap/help/reportMouseX.png new file mode 100644 index 00000000..161db03e Binary files /dev/null and b/elements/pl-snap/Snap/help/reportMouseX.png differ diff --git a/elements/pl-snap/Snap/help/reportMouseY.png b/elements/pl-snap/Snap/help/reportMouseY.png new file mode 100644 index 00000000..bf15b135 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportMouseY.png differ diff --git a/elements/pl-snap/Snap/help/reportNewCostumeStretched.png b/elements/pl-snap/Snap/help/reportNewCostumeStretched.png new file mode 100644 index 00000000..87c24ebe Binary files /dev/null and b/elements/pl-snap/Snap/help/reportNewCostumeStretched.png differ diff --git a/elements/pl-snap/Snap/help/reportNewList.png b/elements/pl-snap/Snap/help/reportNewList.png new file mode 100644 index 00000000..f0fc1942 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportNewList.png differ diff --git a/elements/pl-snap/Snap/help/reportNot.png b/elements/pl-snap/Snap/help/reportNot.png new file mode 100644 index 00000000..2b12626e Binary files /dev/null and b/elements/pl-snap/Snap/help/reportNot.png differ diff --git a/elements/pl-snap/Snap/help/reportNumbers.png b/elements/pl-snap/Snap/help/reportNumbers.png new file mode 100644 index 00000000..328b79d8 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportNumbers.png differ diff --git a/elements/pl-snap/Snap/help/reportObject.png b/elements/pl-snap/Snap/help/reportObject.png new file mode 100644 index 00000000..b7bbf0f8 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportObject.png differ diff --git a/elements/pl-snap/Snap/help/reportPenTrailsAsCostume.png b/elements/pl-snap/Snap/help/reportPenTrailsAsCostume.png new file mode 100644 index 00000000..ffd1a928 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportPenTrailsAsCostume.png differ diff --git a/elements/pl-snap/Snap/help/reportPower.png b/elements/pl-snap/Snap/help/reportPower.png new file mode 100644 index 00000000..aa60cc1d Binary files /dev/null and b/elements/pl-snap/Snap/help/reportPower.png differ diff --git a/elements/pl-snap/Snap/help/reportQuotient.png b/elements/pl-snap/Snap/help/reportQuotient.png new file mode 100644 index 00000000..e8dc4fd2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportQuotient.png differ diff --git a/elements/pl-snap/Snap/help/reportRandom.png b/elements/pl-snap/Snap/help/reportRandom.png new file mode 100644 index 00000000..f3489941 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportRandom.png differ diff --git a/elements/pl-snap/Snap/help/reportRelationTo.png b/elements/pl-snap/Snap/help/reportRelationTo.png new file mode 100644 index 00000000..286e3c2b Binary files /dev/null and b/elements/pl-snap/Snap/help/reportRelationTo.png differ diff --git a/elements/pl-snap/Snap/help/reportReshape.png b/elements/pl-snap/Snap/help/reportReshape.png new file mode 100644 index 00000000..3e629e82 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportReshape.png differ diff --git a/elements/pl-snap/Snap/help/reportRound.png b/elements/pl-snap/Snap/help/reportRound.png new file mode 100644 index 00000000..b57cafa4 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportRound.png differ diff --git a/elements/pl-snap/Snap/help/reportShown.png b/elements/pl-snap/Snap/help/reportShown.png new file mode 100644 index 00000000..59f8d03b Binary files /dev/null and b/elements/pl-snap/Snap/help/reportShown.png differ diff --git a/elements/pl-snap/Snap/help/reportStringSize.png b/elements/pl-snap/Snap/help/reportStringSize.png new file mode 100644 index 00000000..80f28330 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportStringSize.png differ diff --git a/elements/pl-snap/Snap/help/reportTextSplit.png b/elements/pl-snap/Snap/help/reportTextSplit.png new file mode 100644 index 00000000..18d1422c Binary files /dev/null and b/elements/pl-snap/Snap/help/reportTextSplit.png differ diff --git a/elements/pl-snap/Snap/help/reportTouchingColor.png b/elements/pl-snap/Snap/help/reportTouchingColor.png new file mode 100644 index 00000000..fe37c714 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportTouchingColor.png differ diff --git a/elements/pl-snap/Snap/help/reportTouchingObject.png b/elements/pl-snap/Snap/help/reportTouchingObject.png new file mode 100644 index 00000000..07e28bc7 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportTouchingObject.png differ diff --git a/elements/pl-snap/Snap/help/reportTrue.png b/elements/pl-snap/Snap/help/reportTrue.png new file mode 100644 index 00000000..dbc0bda2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportTrue.png differ diff --git a/elements/pl-snap/Snap/help/reportURL.png b/elements/pl-snap/Snap/help/reportURL.png new file mode 100644 index 00000000..8622194e Binary files /dev/null and b/elements/pl-snap/Snap/help/reportURL.png differ diff --git a/elements/pl-snap/Snap/help/reportUnicode.png b/elements/pl-snap/Snap/help/reportUnicode.png new file mode 100644 index 00000000..a6715a14 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportUnicode.png differ diff --git a/elements/pl-snap/Snap/help/reportUnicodeAsLetter.png b/elements/pl-snap/Snap/help/reportUnicodeAsLetter.png new file mode 100644 index 00000000..792018ad Binary files /dev/null and b/elements/pl-snap/Snap/help/reportUnicodeAsLetter.png differ diff --git a/elements/pl-snap/Snap/help/reportVariadicAnd.png b/elements/pl-snap/Snap/help/reportVariadicAnd.png new file mode 100644 index 00000000..cb9883cb Binary files /dev/null and b/elements/pl-snap/Snap/help/reportVariadicAnd.png differ diff --git a/elements/pl-snap/Snap/help/reportVariadicOr.png b/elements/pl-snap/Snap/help/reportVariadicOr.png new file mode 100644 index 00000000..6ba18975 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportVariadicOr.png differ diff --git a/elements/pl-snap/Snap/help/reportVariadicProduct.png b/elements/pl-snap/Snap/help/reportVariadicProduct.png new file mode 100644 index 00000000..e8dc4fd2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportVariadicProduct.png differ diff --git a/elements/pl-snap/Snap/help/reportVariadicSum.png b/elements/pl-snap/Snap/help/reportVariadicSum.png new file mode 100644 index 00000000..e8dc4fd2 Binary files /dev/null and b/elements/pl-snap/Snap/help/reportVariadicSum.png differ diff --git a/elements/pl-snap/Snap/help/reportVideo.png b/elements/pl-snap/Snap/help/reportVideo.png new file mode 100644 index 00000000..66f7e73f Binary files /dev/null and b/elements/pl-snap/Snap/help/reportVideo.png differ diff --git a/elements/pl-snap/Snap/help/sentence$arrowRightlist.png b/elements/pl-snap/Snap/help/sentence$arrowRightlist.png new file mode 100644 index 00000000..731aab95 Binary files /dev/null and b/elements/pl-snap/Snap/help/sentence$arrowRightlist.png differ diff --git a/elements/pl-snap/Snap/help/setBrightness.png b/elements/pl-snap/Snap/help/setBrightness.png new file mode 100644 index 00000000..197141f4 Binary files /dev/null and b/elements/pl-snap/Snap/help/setBrightness.png differ diff --git a/elements/pl-snap/Snap/help/setColor.png b/elements/pl-snap/Snap/help/setColor.png new file mode 100644 index 00000000..758822db Binary files /dev/null and b/elements/pl-snap/Snap/help/setColor.png differ diff --git a/elements/pl-snap/Snap/help/setEffect.png b/elements/pl-snap/Snap/help/setEffect.png new file mode 100644 index 00000000..157b8a0b Binary files /dev/null and b/elements/pl-snap/Snap/help/setEffect.png differ diff --git a/elements/pl-snap/Snap/help/setHeading.png b/elements/pl-snap/Snap/help/setHeading.png new file mode 100644 index 00000000..3b4abb45 Binary files /dev/null and b/elements/pl-snap/Snap/help/setHeading.png differ diff --git a/elements/pl-snap/Snap/help/setPan.png b/elements/pl-snap/Snap/help/setPan.png new file mode 100644 index 00000000..9f5e6514 Binary files /dev/null and b/elements/pl-snap/Snap/help/setPan.png differ diff --git a/elements/pl-snap/Snap/help/setPenHSVA.png b/elements/pl-snap/Snap/help/setPenHSVA.png new file mode 100644 index 00000000..f49b6514 Binary files /dev/null and b/elements/pl-snap/Snap/help/setPenHSVA.png differ diff --git a/elements/pl-snap/Snap/help/setScale.png b/elements/pl-snap/Snap/help/setScale.png new file mode 100644 index 00000000..cd2329b2 Binary files /dev/null and b/elements/pl-snap/Snap/help/setScale.png differ diff --git a/elements/pl-snap/Snap/help/setSize.png b/elements/pl-snap/Snap/help/setSize.png new file mode 100644 index 00000000..485b1928 Binary files /dev/null and b/elements/pl-snap/Snap/help/setSize.png differ diff --git a/elements/pl-snap/Snap/help/setVolume.png b/elements/pl-snap/Snap/help/setVolume.png new file mode 100644 index 00000000..07d46392 Binary files /dev/null and b/elements/pl-snap/Snap/help/setVolume.png differ diff --git a/elements/pl-snap/Snap/help/setXPosition.png b/elements/pl-snap/Snap/help/setXPosition.png new file mode 100644 index 00000000..2b2a4b8d Binary files /dev/null and b/elements/pl-snap/Snap/help/setXPosition.png differ diff --git a/elements/pl-snap/Snap/help/setYPosition.png b/elements/pl-snap/Snap/help/setYPosition.png new file mode 100644 index 00000000..b7aa7cc6 Binary files /dev/null and b/elements/pl-snap/Snap/help/setYPosition.png differ diff --git a/elements/pl-snap/Snap/help/show.png b/elements/pl-snap/Snap/help/show.png new file mode 100644 index 00000000..dfe80303 Binary files /dev/null and b/elements/pl-snap/Snap/help/show.png differ diff --git a/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/Info.plist b/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/Info.plist new file mode 100644 index 00000000..6054ae82 --- /dev/null +++ b/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/Info.plist @@ -0,0 +1,8 @@ + + + + + CFBundleName + snap-manual-meta + + diff --git a/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/QuickLook/Preview.png b/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/QuickLook/Preview.png new file mode 100644 index 00000000..548284a3 Binary files /dev/null and b/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/QuickLook/Preview.png differ diff --git a/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/document.wflow b/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/document.wflow new file mode 100644 index 00000000..e7cc2c8c --- /dev/null +++ b/elements/pl-snap/Snap/help/snap-manual-meta.workflow/Contents/document.wflow @@ -0,0 +1,251 @@ + + + + + AMApplicationBuild + 512 + AMApplicationVersion + 2.10 + AMDocumentVersion + 2 + actions + + + action + + AMAccepts + + Container + List + Optional + + Types + + com.apple.cocoa.path + + + AMActionVersion + 1.1.2 + AMApplication + + Finder + + AMParameterProperties + + fileNames + + + AMProvides + + Container + List + Types + + com.apple.cocoa.path + + + ActionBundlePath + /System/Library/Automator/Get Specified Finder Items.action + ActionName + Get Specified Finder Items + ActionParameters + + fileNames + + ~/Desktop/SnapManual.pdf + + + BundleIdentifier + com.apple.Automator.SpecifiedFiles + CFBundleVersion + 1.1.2 + CanShowSelectedItemsWhenRun + + CanShowWhenRun + + Category + + AMCategoryFilesAndFolders + + Class Name + SpecifiedFilesAction + InputUUID + F39F1842-2391-4CAC-A32B-49C5E7A09DF0 + Keywords + + File + Choose + Find + Get + + OutputUUID + 6DCE18F0-A33F-484B-9246-E4CD7D807C32 + UUID + CFD83777-C216-4F34-A577-822B9F18C5D5 + UnlocalizedApplications + + Finder + + arguments + + 0 + + default value + + name + fileNames + required + 0 + type + 0 + uuid + 0 + + + isViewVisible + + location + 309.000000:239.000000 + nibPath + /System/Library/Automator/Get Specified Finder Items.action/Contents/Resources/Base.lproj/main.nib + + isViewVisible + + + + action + + AMAccepts + + Container + List + Optional + + Types + + com.adobe.pdf + + + AMActionVersion + 1.1 + AMApplication + + Preview + + AMParameterProperties + + authorAttr + + authorFlag + + creatorAttr + + creatorFlag + + keywordsAttr + + keywordsFlag + + subjectAttr + + subjectFlag + + titleAttr + + titleFlag + + + AMProvides + + Container + List + Types + + com.adobe.pdf + + + AMRequiredResources + + ActionBundlePath + /System/Library/Automator/Set PDF Metadata.action + ActionName + Set PDF Metadata + ActionParameters + + authorAttr + Brian Harvey and Jens Mönig + authorFlag + + creatorAttr + + creatorFlag + + keywordsAttr + + keywordsFlag + + subjectAttr + + subjectFlag + + titleAttr + Snap! 8.0 Reference Manual + titleFlag + + + BundleIdentifier + com.apple.Automator.SetPDFMetadata + CFBundleVersion + 1.1 + CanShowSelectedItemsWhenRun + + CanShowWhenRun + + Category + + AMCategoryPDFs + + Class Name + SetDocumentProperties + InputUUID + D54101C3-C6AD-48B7-8C3F-301EF3E66E88 + Keywords + + OutputUUID + 7FBBBBAA-71CE-422C-9BFD-BED8B67B1B59 + UUID + D52C16A3-12CD-4CC6-87C8-939EF7718B06 + UnlocalizedApplications + + Preview + + arguments + + isViewVisible + + location + 309.000000:511.500000 + nibPath + /System/Library/Automator/Set PDF Metadata.action/Contents/Resources/Base.lproj/main.nib + + isViewVisible + + + + connectors + + 5F67F7A0-C310-436B-BFFE-D9B5DAD45F1D + + from + CFD83777-C216-4F34-A577-822B9F18C5D5 - CFD83777-C216-4F34-A577-822B9F18C5D5 + to + D52C16A3-12CD-4CC6-87C8-939EF7718B06 - D52C16A3-12CD-4CC6-87C8-939EF7718B06 + + + workflowMetaData + + workflowTypeIdentifier + com.apple.Automator.workflow + + + diff --git a/elements/pl-snap/Snap/help/sources/doForEach.psd b/elements/pl-snap/Snap/help/sources/doForEach.psd new file mode 100644 index 00000000..38bc64ff Binary files /dev/null and b/elements/pl-snap/Snap/help/sources/doForEach.psd differ diff --git a/elements/pl-snap/Snap/help/sources/help-screen-base.pdn b/elements/pl-snap/Snap/help/sources/help-screen-base.pdn new file mode 100644 index 00000000..2feeeb9a Binary files /dev/null and b/elements/pl-snap/Snap/help/sources/help-screen-base.pdn differ diff --git a/elements/pl-snap/Snap/help/sources/help-screen-base.png b/elements/pl-snap/Snap/help/sources/help-screen-base.png new file mode 100644 index 00000000..a935a25d Binary files /dev/null and b/elements/pl-snap/Snap/help/sources/help-screen-base.png differ diff --git a/elements/pl-snap/Snap/help/stopFreq.png b/elements/pl-snap/Snap/help/stopFreq.png new file mode 100644 index 00000000..4c2584ec Binary files /dev/null and b/elements/pl-snap/Snap/help/stopFreq.png differ diff --git a/elements/pl-snap/Snap/help/throw.png b/elements/pl-snap/Snap/help/throw.png new file mode 100644 index 00000000..6c239ef8 Binary files /dev/null and b/elements/pl-snap/Snap/help/throw.png differ diff --git a/elements/pl-snap/Snap/help/turn.png b/elements/pl-snap/Snap/help/turn.png new file mode 100644 index 00000000..c31b4d29 Binary files /dev/null and b/elements/pl-snap/Snap/help/turn.png differ diff --git a/elements/pl-snap/Snap/help/turnLeft.png b/elements/pl-snap/Snap/help/turnLeft.png new file mode 100644 index 00000000..02d51220 Binary files /dev/null and b/elements/pl-snap/Snap/help/turnLeft.png differ diff --git a/elements/pl-snap/Snap/help/up.png b/elements/pl-snap/Snap/help/up.png new file mode 100644 index 00000000..98e0660b Binary files /dev/null and b/elements/pl-snap/Snap/help/up.png differ diff --git a/elements/pl-snap/Snap/help/write.png b/elements/pl-snap/Snap/help/write.png new file mode 100644 index 00000000..c9846996 Binary files /dev/null and b/elements/pl-snap/Snap/help/write.png differ diff --git a/elements/pl-snap/Snap/help/xPosition.png b/elements/pl-snap/Snap/help/xPosition.png new file mode 100644 index 00000000..b852700a Binary files /dev/null and b/elements/pl-snap/Snap/help/xPosition.png differ diff --git a/elements/pl-snap/Snap/help/yPosition.png b/elements/pl-snap/Snap/help/yPosition.png new file mode 100644 index 00000000..21eb330c Binary files /dev/null and b/elements/pl-snap/Snap/help/yPosition.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-120.png b/elements/pl-snap/Snap/img/snap-icon-120.png new file mode 100644 index 00000000..7765b0ce Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-120.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-128.png b/elements/pl-snap/Snap/img/snap-icon-128.png new file mode 100644 index 00000000..032ea495 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-128.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-144.png b/elements/pl-snap/Snap/img/snap-icon-144.png new file mode 100644 index 00000000..fa4e7637 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-144.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-152.png b/elements/pl-snap/Snap/img/snap-icon-152.png new file mode 100644 index 00000000..d8654098 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-152.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-192.png b/elements/pl-snap/Snap/img/snap-icon-192.png new file mode 100644 index 00000000..01cd9bc8 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-192.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-256.png b/elements/pl-snap/Snap/img/snap-icon-256.png new file mode 100644 index 00000000..371968e4 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-256.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-384.png b/elements/pl-snap/Snap/img/snap-icon-384.png new file mode 100644 index 00000000..ab6b7b22 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-384.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-512.png b/elements/pl-snap/Snap/img/snap-icon-512.png new file mode 100644 index 00000000..3d06cb95 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-512.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-72.png b/elements/pl-snap/Snap/img/snap-icon-72.png new file mode 100644 index 00000000..ee5811a8 Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-72.png differ diff --git a/elements/pl-snap/Snap/img/snap-icon-96.png b/elements/pl-snap/Snap/img/snap-icon-96.png new file mode 100644 index 00000000..654eddff Binary files /dev/null and b/elements/pl-snap/Snap/img/snap-icon-96.png differ diff --git a/elements/pl-snap/Snap/index.html b/elements/pl-snap/Snap/index.html new file mode 100644 index 00000000..905a590f --- /dev/null +++ b/elements/pl-snap/Snap/index.html @@ -0,0 +1,17 @@ + + + + + + Redirecting to Snap! + + +

If you are not automatically redirected to Snap!, + please click here.

+ + + diff --git a/elements/pl-snap/Snap/libraries/Eisenbergification.xml b/elements/pl-snap/Snap/libraries/Eisenbergification.xml new file mode 100644 index 00000000..aa57e628 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/Eisenbergification.xml @@ -0,0 +1 @@ +Allows reading global settings programmatically. Eisenberg'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.
pt:o valor da configuração _ ca:paràmetre _ Project notes Project name User Presentation mode Language Zoom blocks Stage size Stage scale Retina display support Long form input dialog Plain prototype labels Input sliders Execute on slider change Clicking sound Turbo mode Flat design Keyboard editing Visible stepping Thread safe scripts Prefer smooth animations Flat line ends Codification support Inheritance support Hyper blocks support Visible palette
Allows changing global settings programmatically. This block is for Boolean (checkbox) settings; use SET VALUE for numeric or text values. Eisenberg'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.
pt:altera o valor da configuração _ para _ ca:fixa el paràmetre _ a _ Presentation mode Retina display support Long form input dialog Plain prototype labels Input sliders Execute on slider change Clicking sound Turbo mode Flat design Keyboard editing Visible stepping Thread safe scripts Prefer smooth animations Flat line ends Codification support Inheritance support Hyper blocks support
Allows changing global settings programmatically. This block is for numeric or text settings; use SET FLAG for Boolean (checkbox) values. Eisenberg'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.
pt:altera o valor da configuração _ para _ ca:fixa el valor de _ a _ Project notes Project name Language Zoom blocks Stage size Stage scale Visible palette
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/HummingbirdBlocks.xml b/elements/pl-snap/Snap/libraries/HummingbirdBlocks.xml new file mode 100644 index 00000000..67f7968a --- /dev/null +++ b/elements/pl-snap/Snap/libraries/HummingbirdBlocks.xml @@ -0,0 +1 @@ +
LightDistance (cm) Dial Light Sound Other (V)11 2 3Distance (cm)valuehttp://127.0.0.1:30061/hummingbird/in//Not ConnectedOtherSoundIf connected, adjust sound levelLightDial
ko:Hummingbird _ 번 음을 _ 박자로 연주하기 de:Hummingbird Spiele Note _ für _ Schläge pt:Hummingbird Toque Notas _ por _ Batidas fr:Hummingbird Jouer la note _ pour _ battement(s) nl:Hummingbird Speel Noot _ voor _ Beats zh_CN:Hummingbird 演奏 音阶 _ 于 _ 拍 zh_TW:Hummingbird 演奏 音階 _ 於 _ 拍 ar:Hummingbird تشغيل الموسيقى _ _ dk:Hummingbird Spil tone _ i _ slag he:Hummingbird נגן תו _ במשך _ פעימות es:Hummingbird Emitir un sonido _ por _ pulsos ca:Hummingbird Toca nota _ durant _ temps fi:Hummingbird Soita sävel _ _ iskun ajan sv:Hummingbird Spela not _ _ 600.532160beats60000BPM = tempo 60 * 1000/BPM = BPMS beats per millisecond beats = Duration in ms = BPMS * number of beatshttp://127.0.0.1:30061/hummingbird/out/playnote//1000block for number of seconds
Accelerometer (m/s²)Accelerometer (m/s²) Magnetometer (µT)XX Y ZMagnetometer (µT)http://127.0.0.1:30061/hummingbird/in//
ko:micro:bit 버튼 _ de:micro:bit Knopf _ pt:micro:bit Tecla _ fr:micro:bit Bouton _ nl:micro:bit Knop _ zh_CN:micro:bit 按钮 _ zh_TW:micro:bit 按鈕 _ ar:micro:bit زر _ dk:micro:bit Knap _ he:micro:bit לחצן _ es:micro:bit Pulsador _ ca:micro:bit Botó _ fi:micro:bit Painike _ sv:micro:bit Knapp _ AA B
ko:micro:bit 나침반 센서 de:micro:bit Kompass pt:micro:bit Bússola fr:micro:bit Compas nl:micro:bit Kompas zh_CN:micro:bit 指南针 zh_TW:micro:bit 指南針 ar:micro:bit بوصلة dk:micro:bit Kompas he:micro:bit מצפן es:micro:bit Brujula ca:micro:bit Brúixola fi:micro:bit Kompassi sv:micro:bit Kompass
Screen UpScreen Up Screen Down Tilt Left Tilt Right Logo Up Logo Down Shake
ko:모두 멈추기 de:stoppe alles pt:pare todos fr:stop tout nl:stop alle zh_CN:停止 全部 zh_TW:停止 全部 ar:توقف الكل dk:stop alle he:להפסיק הכל es:detener todo ca:atura tot fi:pysäytä kaikki sv:stop allt
ko:Hummingbird 위치 제어 서보 _ _ ° de:Hummingbird Position Servo _ _ ° pt:Hummingbird Posição do Servo _ _ ° fr:Hummingbird Position Servo _ _ ° nl:Hummingbird Positie-Servo _ _ ° zh_CN:Hummingbird 位置伺服 _ _ ° zh_TW:Hummingbird 位置伺服 _ _ ° ar:Hummingbird موقف محرك سيرفو المؤازر _ _ dk:Hummingbird Positionsservo _ _ ° he:Hummingbird סרוו כיוון _ _ es:Hummingbird Servo de posicion _ _ ° ca:Hummingbird Servo posicional _ _ ° fi:Hummingbird Asentoservo _ _ ° sv:Hummingbird Positionsservo _ _ ° 11 2 3 490180position1.41254/180 Scaling Factorportnumpositionvar realPort = portnum-1; //////////////////////////////////////////////////////////////////////////////// // In order to avoid sending more messages than the app can handle, whenever we // send a message we also save it in a persistent global variable. When the // message is processed in the app, the callback checks if the global variable // still matches what it was changed to. If it was, it deletes the global // variable. Otherwise the message is resent with new data. // // When this block is called it checks if the global value has been set. If it // has, it sends a message. Otherwise it just updates the value and lets the // callback handle it. // We can't run code beforehand to define values so we must check each block // call if they are set. if (window.birdbrain === undefined || window.birdbrain.servos === undefined) { window.birdbrain = window.birdbrain || {}; window.birdbrain.servos = { // By attaching this function to a global variable, it is only // defined once instead of every time this block is called, improving // performance significantly. setServoAngle: function (port, angle) { function callback() { if (window.birdbrain.servos[port] === angle) { delete window.birdbrain.servos[port]; } else { window.birdbrain.servos.setServoAngle(port, window.birdbrain.servos[port]); } } //Create a new XMLHttpRequest object var xhr = new XMLHttpRequest(); var actualPort = port+1; var thisURL = "http://127.0.0.1:30061/hummingbird/out/servo/" + actualPort + "/" + angle; //console.log("thisURL: " + thisURL); xhr.open("GET", thisURL, true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(); } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); }; xhr.send(null); } }; } //var realAngle = Math.floor(ang*1.25); //realAngle = Math.max(Math.min(realAngle,225.0),0.0); if (window.birdbrain.servos[realPort] === undefined) { window.birdbrain.servos.setServoAngle(realPort, position); } window.birdbrain.servos[realPort] = position;0
ko:Hummingbird 회전속도 제어 서보 _ _ % de:Hummingbird Drehung Servo _ _ % pt:Hummingbird Rotação do Servo _ _ % fr:Hummingbird Rotation Servo _ _ % nl:Hummingbird Draai-Servo _ _ % zh_CN:Hummingbird 旋转伺服 _ _ % zh_TW:Hummingbird 旋轉伺服 _ _ % ar:Hummingbird فتحة دوران المحرك المؤازر _ _ dk:Hummingbird Rotationsservo _ _ % he:Hummingbird סרוו סיבובים _ _ % es:Hummingbird Servo de rotacion _ _ % ca:Hummingbird Servo rotacional _ _ % fi:Hummingbird Kiertoservo _ _ % sv:Hummingbird Rotationsservo _ _ % 11 2 3 40100-1010portnumspeedvar realPort = portnum-1; //////////////////////////////////////////////////////////////////////////////// // In order to avoid sending more messages than the app can handle, whenever we // send a message we also save it in a persistent global variable. When the // message is processed in the app, the callback checks if the global variable // still matches what it was changed to. If it was, it deletes the global // variable. Otherwise the message is resent with new data. // // When this block is called it checks if the global value has been set. If it // has, it sends a message. Otherwise it just updates the value and lets the // callback handle it. // We can't run code beforehand to define values so we must check each block // call if they are set. if (window.birdbrain === undefined || window.birdbrain.rotationServos === undefined) { window.birdbrain = window.birdbrain || {}; window.birdbrain.rotationServos = { // By attaching this function to a global variable, it is only // defined once instead of every time this block is called, improving // performance significantly. setServoSpeed: function (port, speed) { function callback() { if (window.birdbrain.rotationServos[port] === speed) { delete window.birdbrain.rotationServos[port]; } else { window.birdbrain.rotationServos.setServoSpeed(port, window.birdbrain.rotationServos[port]); } } //Create a new XMLHttpRequest object var xhr = new XMLHttpRequest(); var actualPort = port+1; var thisURL = "http://127.0.0.1:30061/hummingbird/out/rotation/" + actualPort + "/" + speed; //console.log("thisURL: " + thisURL); xhr.open("GET", thisURL, true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(); } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); }; xhr.send(null); } }; } if (window.birdbrain.rotationServos[realPort] === undefined) { window.birdbrain.rotationServos.setServoSpeed(realPort, speed); } window.birdbrain.rotationServos[realPort] = speed;
ko:Hummingbird LED _ _ % de:Hummingbird LED _ _ % pt:Hummingbird LED _ _ % fr:Hummingbird LED _ _ % nl:Hummingbird LED _ _ % zh_CN:Hummingbird LED _ _ % zh_TW:Hummingbird LED _ _ % ar:Hummingbird ضوء _ _ dk:Hummingbird LED _ _ % he:Hummingbird לד % _ _ es:Hummingbird LED _ _ % ca:Hummingbird LED _ _ % fi:Hummingbird LED _ _ % sv:Hummingbird LED _ _ % 11 2 30100portnum,intensitynum//var hummingbirdAppID = "lfloofocohhfeeoohpokmljiinfmpenj"; var realPort = portnum-1; //////////////////////////////////////////////////////////////////////////////// // In order to avoid sending more messages than the app can handle, whenever we // send a message we also save it in a persistent global variable. When the // message is processed in the app, the callback checks if the global variable // still matches what it was changed to. If it was, it deletes the global // variable. Otherwise the message is resent with new data. // // When this block is called it checks if the global value has been set. If it // has, it sends a message. Otherwise it just updates the value and lets the // callback handle it. // We can't run code beforehand to define values so we must check each block // call if they are set. if (window.birdbrain === undefined || window.birdbrain.LEDs === undefined) { window.birdbrain = window.birdbrain || {}; window.birdbrain.LEDs = { // By attaching this function to a global variable, it is only // defined once instead of every time this block is called, improving // performance significantly. setLEDIntensity: function(port, intensity) { function callback() { if (window.birdbrain.LEDs[port] === intensity) { delete window.birdbrain.LEDs[port]; } else { window.birdbrain.LEDs.setLEDIntensity(port, window.birdbrain.LEDs[port]); } } /* var report = { message:"L".charCodeAt(0), port: port.toString().charCodeAt(0), intensity: intensity }; chrome.runtime.sendMessage(hummingbirdAppID, report, callback); */ //Create a new XMLHttpRequest object var xhr = new XMLHttpRequest(); var actualPort = port+1; var ledURL = "http://127.0.0.1:30061/hummingbird/out/led/" + actualPort + "/" + intensity; xhr.open("GET", ledURL, true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(); } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); }; xhr.send(null); } } } var realIntensity = Math.floor(intensitynum*2.55); realIntensity = Math.max(Math.min(realIntensity,255.0),0.0); if (window.birdbrain.LEDs[realPort] === undefined) { window.birdbrain.LEDs.setLEDIntensity(realPort, realIntensity); } window.birdbrain.LEDs[realPort] = realIntensity;0
ko:Hummingbird 삼색 LED _ 빨강 _ % 초록 _ % 파랑 _ % de:Hummingbird Dreifarben-LED _ R _ % G _ % B _ % pt:Hummingbird LED Tricolor _ R _ % G _ % B _ % fr:Hummingbird Tri-LED _ R _ % G _ % B _ % nl:Hummingbird Tri-LED _ R _ % G _ % B _ % zh_CN:Hummingbird 三色LED _ 红 _ % 绿 _ % 蓝 _ % zh_TW:Hummingbird 三色LED _ 紅 _ % 綠 _ % 藍 _ % ar:Hummingbird ضوء الصمام الثلاثي _ _ _ _ dk:Hummingbird Tri-LED _ R _ % G _ % B _ % he:Hummingbird לד שלושה צבעים % _ R _ % G _ % B _ es:Hummingbird Led tricolor _ R _ % G _ % B _ % ca:Hummingbird Tri-LED _ vermell _ % verd _ % blau _ % fi:Hummingbird Tri-LED _ R _ % G _ % B _ % sv:Hummingbird Tri-LED _ R _ % G _ % B _ % 11 200010001000100portnumrednumgreennumbluenumvar realPort = portnum-1; //////////////////////////////////////////////////////////////////////////////// // In order to avoid sending more messages than the app can handle, whenever we // send a message we also save it in a persistent global variable. When the // message is processed in the app, the callback checks if the global variable // still matches what it was changed to. If it was, it deletes the global // variable. Otherwise the message is resent with new data. // // When this block is called it checks if the global value has been set. If it // has, it sends a message. Otherwise it just updates the value and lets the // callback handle it. // We can't run code beforehand to define values so we must check each block // call if they are set. if (window.birdbrain === undefined || window.birdbrain.triLEDs === undefined) { window.birdbrain = window.birdbrain || {}; window.birdbrain.triLEDs = { // By attaching this function to a global variable, it is only // defined once instead of every time this block is called, improving // performance significantly. setLEDIntensities: function(port, intensities) { function callback() { if (JSON.stringify(window.birdbrain.triLEDs[port]) === JSON.stringify(intensities)) { delete window.birdbrain.triLEDs[port]; } else { window.birdbrain.triLEDs.setLEDIntensities(port, window.birdbrain.triLEDs[port]); } } //Create a new XMLHttpRequest object var xhr = new XMLHttpRequest(); var actualPort = port+1; /* Note RGB: red: intensities[0], green: intensities[1], blue: intensities[2] */ var thisURL = "http://127.0.0.1:30061/hummingbird/out/triled/" + actualPort + "/" + intensities[0] + "/" + intensities[1] + "/" + intensities[2]; //console.log("thisURL: " + thisURL); xhr.open("GET", thisURL, true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { callback(); } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.statusText); }; xhr.send(null); } } } var realIntensities = [rednum, greennum, bluenum].map(function(intensity) { return Math.floor(Math.max(Math.min(intensity*2.55, 255), 0)); }); if (window.birdbrain.triLEDs[realPort] === undefined) { window.birdbrain.triLEDs.setLEDIntensities(realPort, realIntensities); } window.birdbrain.triLEDs[realPort] = realIntensities; 0
ko:micro:bit 출력 _ de:micro:bit Drucke _ pt:micro:bit Imprimir _ fr:micro:bit Imprimer _ nl:micro:bit Schrijf _ zh_CN:micro:bit 打印 _ zh_TW:micro:bit 打印 _ ar:micro:bit طباعة _ dk:micro:bit Vis _ he:micro:bit הדפס _ es:micro:bit Imprimir _ ca:micro:bit Escriu _ fi:micro:bit Näytä teksti _ sv:micro:bit Visa text _ Hello
ko:micro:bit 보이기 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ de:micro:bit LED Anzeige _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pt:micro:bit Visor _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ fr:micro:bit Display _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ nl:micro:bit Scherm _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ zh_CN:micro:bit 显示 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ zh_TW:micro:bit 顯示 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ar:micro:bit عرض _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ dk:micro:bit Display _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ he:micro:bit מסך _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ es:micro:bit Monitor _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ca:micro:bit Pantalla _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ fi:micro:bit Näytä _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ sv:micro:bit Skärm _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ falsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/LIBRARIES b/elements/pl-snap/Snap/libraries/LIBRARIES new file mode 100644 index 00000000..8f2443f9 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/LIBRARIES @@ -0,0 +1,48 @@ +iteration-composition.xml Iteration, composition Traditional loop constructs (while, until, etc.) plus the Lisp "named let" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition. +list-utilities.xml List utilities Some standard functions on lists (reverse, sort, etc.) +colors.xml Colors and Crayons Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades. +crayons.xml Crayons Just the crayons, without the rest of the colors library. Fast and simple. +bignumbers.xml Bignums, rationals, complex #s The full Scheme numeric tower. "USE BIGNUMS " to enable. +try-catch.xml Catch errors Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value. +parallel_module.xml Parallelization Run several scripts in parallel and wait until all are done. +Eisenbergification.xml Getters and setters Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa. +list_comprehension_module.xml List comprehension HOF version of ZIP, letting you "hyperize" any dyadic function +~ ~ +~ ~ +~ ~ +maps_module.xml World Map Add interactive maps to projects +menu_module.xml Menus Prompt the user to pick an option. +textCostumes_module.xml Text Costumes Generate costumes from letters or words of text. +speech_module.xml Text to Speech Output text using speech synthesis. +animation_module.xml Animation Glide, grow and rotate using easing functions. +pixel_module.xml Pixels Manipulate costumes pixel-wise. +audioComp_module.xml Audio Comp Analyze, manipulate and generate sound samples. +frequency_distribution_module.xml Frequency Distribution Analysis Analyze data for frequency distribution +localstorage_module.xml Database Persistent key-value storage across Snap! sessions in the same browser +tiles_module.xml Tiles Divide the stage into sub-regions in each of which to perform an action +arcs_module.xml Arcs Turn sprites by a delta of degrees moving them at a given radius +~ ~ +~ ~ +~ ~ +word-sentence.xml Words, sentences One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea. +words_module.xml Just Words Use texts as if they were lists of words. A minimal variant of the Words/Sentences library for language projects like chat bots. +strings.xml Strings, Multi-line input Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks. +replace_letters_module.xml Replace Letters Replace all occurrences of a letter or a sequence of letters with another in a text. +apl.xml APL primitives Adds features from the APL language supporting hyperblocks. +stream-tools.xml Streams (lazy lists) A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial. +bar-charts.xml Bar charts Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the "Frequency Distribution Analysis" library instead. +plot_bars_module.xml Just Bars Draw a list of numbers as vertical lines distributed evenly across the stage. +httpBlocks.xml Web services access (https) An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data. +make-variables.xml Create variables Create and manage global/sprite/script variables in a script +bitwise.xml Bitwise operators Bitwise arithmetic operators for low-level bit manipulation. +~ ~ +~ ~ +~ ~ +SciSnap!2Blocks.xml SciSnap! v2 Scientific Functions, Graphing, SQL interface, Machine Learning, from Uni Göttingen (Eckart Modrow) +TuneScope.xml TuneScope Music Notation, Instruments, Drums, Tones, Chords, Tracks, from the University of Virginia (Glen Bull) +~ ~ +~ ~ +~ ~ +serial_module.xml Serial Ports Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required) +mqtt.xml MQTT (Message Queuing Telemetry Transport) protocol for connecting with IOT devices and/or other software +signada.xml Signada (Network remote control) Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada. diff --git a/elements/pl-snap/Snap/libraries/SciSnap!2Blocks.xml b/elements/pl-snap/Snap/libraries/SciSnap!2Blocks.xml new file mode 100644 index 00000000..3c9c23e6 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/SciSnap!2Blocks.xml @@ -0,0 +1 @@ +Initialization of SciSnap!
Creates global variables "SciSnap!Properties", "SciSnap!Data", and "SciSnap!Messages". Sets the default values of global SciSnap!-properties for items typeOfData width height minValue maxValue columns rows maxSetValue
Sets the value of an existing global SciSnap!-property or inserts it anew. Items: typeOfData width height minValue maxValue columns rows maxSetValue
minValuetypeOfData width height minValue maxValue columns rows maxSetValue
Shows the message with headline in the middle of the window.
headlinetheMessage
Adds a new entry to SciSnap!Messages and shows the error message.
something wrong!
Reports a copy of a costume.
Reports the costume of a sprite.
Returns a random number between 0 and 1.
Reports Pi.
Reports Euler's number.
Rounds value x to n digits.
1.23572
Reports n faculty.
50
Reports a binomial coefficient.
531result1n1i1
Test on vector, matrix, table, predicate, interval, list of intervals, set, or complex-number.
vectorvector transposed-vector matrix table complex-number complex-number-Cartesian-style complex-number-polar-style set comparisonOperator interval listOfIntervals numericalListcomplex-numbercomplex-number-Cartesian-stylecomplex-number-polar-styletransposed-vectorvectormatrixwidth11table1width1SciS_isTable(data)intervalfalselistOfIntervalsset2344listOfIntervals55numericalListfalse
Reports a substring of a string.
thisString14
Reports a string without first/all instances of substring.
allall firstthisthisString
Reports a string in upper case.
thisString
Reports a string in lower case.
ThisString
Stores a string in a file.
this textthis file
Reports the index of first appearance of substring in string.
ringthisString
Reports a string with replacement instead of substring.
allall firstthisthatthisString
Reports date and time in standard notation.
day10hour10minute10second10--T::
seconds todayJulian Date decimal years days this year hours this year minutes this year seconds this year hours today minutes today seconds todayYYYY17MM54DD21h12m45s7daysi11402Julian Date2JD365.2530.6001172099531121531101215821260360024
Takes any number of Boolean (true/false) inputs (use the left and right arrowheads to adjust the number of input slots) and reports TRUE only if all of the inputs are TRUE, otherwise FALSE. Like AND but for multiple inputs.
pt:todas as afirmações _ são verdadeiras 1
Takes any number of Boolean (true/false) inputs (use the left and right arrowheads to adjust the number of input slots) and reports TRUE if at least one input is TRUE, otherwise FALSE.
pt:alguma das afirmações _ é verdadeira 1
Returns an empty costume of the given width and height with background color r/g/b.
400300245245245
Reports the row or column name of the row or column with the number entered, or reports an error message.
columncolumn row1SciSnap!Datatable0columnrow
Evaluates the predicate with a given parameter.
ringified predicate
Evaluates the intervals with a given parameter.
ringified predicateitem3<true
Reports the intersection of two sets.
set1set2are these two sets?setresultset2234element34element344
Reports the union of two sets.
set1set2are these two sets?setresultset223344
Reports the difference between two sets.
set1set2are these two sets?setresultset2234element32set1set24433m14n1m1compare the mth interval with all intervals of set144
Reports the Cartesian product between two sets.
set1set2set4040resultset22item_133
implication
10
equivalence
10
Converts numbers to booleans
1
Converts booleans to numbers
true
Intervals should be of structure [leftLimit,operator1,operator2,rightLimit]
2resultn1
1111111111212121212121212
Intervals should be of structure [leftLimit,operator1,operator2,rightLimit]
11define left edge and operator44define right edge and operator
11resultn1m1n1
11resultn1
0listOfIntervalsitemfalse
Returns all elements of a list not covered by the predicate.
Returns all elements of a list not covered by the intervals.
result3lst_sort(list, fn)34
Test wether the predicate is translatable to a list of intervals.
ringified predicate1comparisonOperator112233false
Intervals should be of structure [leftLimit,operator1,operator2,rightLimit]
interval1interval2intersection0result1144341444341444
1141413<232<3<2<4414142<323<2<3<true
Creates a new empty costume of the specified size and color and sets the local properties
thisSpritethisSprite theStage anotherSprite400300245245245costumeWidthcostumeHeightscaleProperties2212126-10-102211600falsefalsefalsefalsetruetruefalseStagecostume properties: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for Image position on stage 7: upper offset for Image position on stage 8: front color red 9: front color green 10: front color blue line properties: 1: line width 2: line style 3: line color red 4: line color green 5: lineColor blue marker properties: 1: marker style 2: marker width 3: marker connected 4: marker color red 5: marker color green 6: marker color blue data properties: 1: minValue 2: maxValue 3: columns 4: rows scale offsets: 1:left offset 2: right offset 3: upper offset 4: lower offset labels: 1: title 2: x label 3: y label 4: title height 5: x label height 6: y label height 7: x unit 8: y unit ranges: 1: x left 2: x right 3: y lower 4: y upper scale properties: 1: scales x precision 2: scales y precision 3: scales x textheight 4: scales y textheight 5: scales x intervals 6: scales y intervals 7: scales x start 8: scales y start 9: scales x step 10: scales y step 11: scales x scaling 12: scales y scaling 13: scales ticlength 14: scales x minitics 15: scales y minitics 16: scales x grid 17: scales y grid 18: scales x centered 19: scales y centered 20: scales show x scale 21: scales show y scale 22: plot border
thisSpritethisSprite theStage anotherSprite
Reads the value of an existing property.
costumePropertiestypeOfConfiguration typeOfData costumeProperties lineProperties markerProperties dataProperties scaleOffsets labels ranges scalePropertiesthisSpritethisSprite theStage anotherSpriteresultnot foundname1 hmyProperties
Sets the value of an existing property or inserts it anew.
costumePropertiestypeOfConfiguration typeOfData costumeProperties lineProperties markerProperties dataProperties scaleOffsets labels ranges scalePropertiesthisSpritethisSprite theStage anotherSpritename1 donefalsehmyPropertiesmyProperties
a simple way to set some costume attributes: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for Image position on stage 7: upper offset for Image position on stage 8: front color red 9: front color green 10: front color blue
40030024524524518018018000thisSpritethisSprite theStage anotherSpriteStage
a simple way to set some net attributes: line properties: 1: line style 2: lineWidth 3: line color red 4: line color green 5: lineColor blue
continuouscontinuous dashed dash-dot dot-dot rainbow inverse-rainbow1000thisSpritethisSprite theStage anotherSpritelineProperties
a simple way to set some net attributes: marker properties: 1: marker style 2: marker width 3: marker connected 4: marker color red 5: marker color green 6: marker color blue
squarenone o_circle ._point +_plus x_ex square triangle5000falsethisSpritethisSprite theStage anotherSpritemarkerProperties
Sets some properties for scales.
2212121010thisSpritethisSprite theStage anotherSpritescalePropertiesscaleProperties123456scaleProperties
Sets the labels and textheights of the diagrams of a PlotPad.
thisSpritethisSprite theStage anotherSpriteDiagram Title18x-label16y-label16labels
Sets the distances of the diagram axes to the edges of the Sketchpad.
thisSpritethisSprite theStage anotherSpriteupperOffset13scalePropertiesUPPER OFFSET1labels013scaleProperties0lowerOffset13scalePropertiesLOWER OFFSET19scalePropertiesrightOffset1.54scalePropertiesRIGHT OFFSET.13scaleProperties0leftOffset14scalePropertiesLEFT OFFSET18scaleProperties13scaleProperties0scaleOffsets
Sets the ranges for the axes of the diagrams of a Sketchpad.
-1010-1010false0.1truethisSpritethisSprite theStage anotherSpriterangesranges
Draws the graph of a function given as rigified Snap!-function or coefficient-list of a polynomial.
ringified operator or polynomialthisSpritethisSprite theStage anotherSpritevectorSciS_addGraphToPlotpad(costume,ranges,offsets,lineattributes,aFunction,proc)rangesscaleOffsetslineProperties
Draws the data points of a two-dimensional table with numerical values. With a lot of additions from Rick Hessman. Thanks!
myDatathisSpritethisSprite theStage anotherSpritemyDatamatrix12SciS_addNumericDataplotToPlotpad(costume,ranges,offsets,labels,lineattributes,dataattributes,data)rangesscaleOffsetslabelslinePropertiesmarkerProperties
Draws the data points of a two-dimensional table with numerical values in column 2. Text values should be used to set the x-label.
myDatatruetruethisSpritethisSprite theStage anotherSpritemyDatatableSciS_addMixedDataplotToPlotpad(costume,ranges,offsets,labels,lineattributes,dataattributes,data)rangesscaleOffsetslabelslinePropertiesmarkerPropertiesscalePropertiesscalePropertieswasXscaled?20wasYscaled?212021scaleProperties
Draws a histogram of histogram data.With a lot of additions by Rick Hessman. Thanks!
myData10truethisSpritethisSprite theStage anotherSpritemyDatavector0transposed-vectorminmaxdeltah2resulti1221i1source0.1SciS_addHistogramToPlotpad(costume,ranges,offsets,lineattributes,data,datapointattributes)rangesscaleOffsetslinePropertiesmarkerProperties
Draws and labels the axes of a PlotPad. With lot of additions of Rick Hessman. Thanks!
thisSpritethisSprite theStage anotherSpriteSciS_addAxesAndScalesToPlotpad(costume,scaleattributes,labels,offsets,ranges,plotcolors)scalePropertieslabelsscaleOffsetsrangescostumeProperties
thisSpriteSciS_newcostume(w,h,r,g,b)3costumeProperties4costumeProperties5costumeProperties
Sets the ranges to "pretty" values. Many thanks to Rick Hessman!
thisSpritethisSprite theStage anotherSpritescalePropertiesscalePropertiesrangesrangespretty125get dictionary of pretty values.72192311245631261427pretty346get dictionary of pretty values.821102312246842261527rangesscaleProperties
"Pretty" scaling from Rick Hessman. Many thanks!
-1010620002000Numbers are too big for pretty printing.nintpretty0.0010.0020.0050.010.020.050.10.20.512510205010020050010002000between91341341341341341341places33322211100000000000sign2index1i21dticnintresultdeltanstartstart*scaling is the actual starting value (start is the value displayed next to the tic)stop1stepstep*scaling is the actual stepping value (step is the difference between the tic labels).scalingintervalsprecisionminitics
thisSpritethisSprite theStage anotherSpritemyData0.1myData2dy43ranges1234scalePropertiesscaleProperties7192151111418310436121151scaleProperties
Calculates the ranges of two columns of a table.
Conversion of coordinates.
100xpxp yp x ythisSpritethisSprite theStage anotherSpriteoffsetsscaleOffsetsrangesrangesdiagramWidth1diagramHeight34x0112y0443coordinate1 xpypxy
Obtaining coordinates of a PlotPad by mouse.
costume-coordinatescostume-coordinates graph-coordinatesthisSpritethisSprite theStage anotherSpriteselection1 targetCostumetargetCostumeWidthtargetCostumeHeighttargetXPositiontargetYPositiontargetSizecostume-coordinatescostume coordinates.graph-coordinatescostume coordinates.
400300xycontinuouso_circle000
400300xycontinuous000
00600400continuousnone continuous dashed dash-dot dot-dot rainbow inverse rainbowsquarenone o_circle ._point +_plus x_ex square triangle000
Changes the Snap!-Logo. ;-)
Creates SQL variables and sets some properties.
Establishes connection and sets the corresponding properties. Change parameters if necessary.
connectionhttps://snapextensions.uni-goettingen.de/mysqlquery.php?server=db1&user=snapexuser&password=snap!userconnection&type=connect12ok0115ERROR
Imports the results of an SQL-query to SQLData and sets the corresponding properties.
typeOfDatatable0minValuenotSetmaxValuenotSet
Reports a list of databases on the server and sets the corresponding properties.
dbsconnection&type=getDBs000115ERROR
Selects one of the databases and sets the corresponding properties.
2databasescurrentDatabasedatabasesresultconnection&command=USE currentDatabasetablestablesconnection&command=SHOW TABLES FROM currentDatabase&type=getTables000115ERROR
Reports a list of tables of the chosen database and sets the corresponding properties.
tblsconnection&command=SHOW TABLES FROM currentDatabase&type=getTables000115ERROR
Reads the attributes of the specified table and sets the corresponding properties.
1tables0115ERROR
Selects one of the tables and sets the corresponding properties.
1tables0115ERROR
Generates a simplified SQL query.
* DISTINCTi11result FROM 0result2
Generates an almost complete SQL query.
* DISTINCTASCASC DESC10i11result FROM 0result20result20resultASC
Executes an SQL query.
1:ERRORreplaces "%" with "%25" to prevent trouble with the url-block.resultconnection&type=query&query=&database=currentDatabase
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL predicate.
Returns an SQL value.
Returns an SQL value.
Returns an SQL value.
Returns an SQL value.
Returns an SQL value.
Creates a new empty costume of the specified size and color and sets local properties. If sprite is the stage, the old costume# of stage is stored. So you can draw graphs on maps, for example.
thisSpritethisSprite theStage anotherSprite400300245245245targettheStageStagethisSpriteStagetheStagecostume properties: 1: width 2: height 3: back color red 4: back color green 5: back color blue vertex properties: 1: ranges for random coordinates (xLeft,xRight, yUpper,yLower) 2: minimal radius of a vertex, should be changed is vertices are not growing with number of edges 3: boolean: vertices grow with number of connected edges 4: boolean: vertex content is shown. If there is no content, the vertex number is shown edge properties: 1: line width 2: line color red 3: line color green 4: line color blue 5: boolean: edge is directed 6: boolean: edge has a weight 7: boolean: edge shows weight
thisSpritethisSprite theStage anotherSprite
Reads the value of an existing property.
costumePropertiestypeOfConfiguration typeOfData costumeProperties vertexProperties edgePropertiesthisSpritethisSprite theStage anotherSpriteresultnot foundname1 hmyProperties
Sets the value of an existing property or inserts it anew.
costumePropertiestypeOfConfiguration typeOfData costumeProperties vertexProperties edgePropertiesthisSpritethisSprite theStage anotherSpritename1 donefalsehmyPropertiesmyProperties
a simple way to set some costume attributes. 1: width 2: height 3: back color red 4: back color green 5: back color blue
400300245245245thisSpritethisSprite theStage anotherSpritecostumeProperties
a simple way to set some vertex attributes: 1: ranges for random coordinates (xLeft,xRight, yUpper,yLower) 2: minimal radius of a vertex, should be changed is vertices are not growing with number of edges 3: boolean: vertices grow with number of connected edges 4: boolean: vertex content is shown. If there is no content, the vertex number is shown
3truefalsethisSpritethisSprite theStage anotherSpritevertexProperties1vertexPropertiesThe ranges are maintained.
a simple way to set some edge attributes: 1: line width 2: line color red 3: line color green 4: line color blue 5: boolean: edge is directed 6: boolean: edge has a weight 7: boolean: edge shows weight
1000falsefalsefalsethisSpritethisSprite theStage anotherSpriteedgeProperties
100100thisSpritethisSprite theStage anotherSprite1vertexListvertexList
adds n vertices to the vertexList of a GraphPad: Vertex attributes have the following order: 1: x 2: y 3: size 4: content 5: isMarked 6: colorNr 7: numberOfLinks
1thisSpritethisSprite theStage anotherSpritevertexListSciS_addVerticesToVertexlist(n,vlist,vAttributes)vertexListvertexPropertiesadjacencyMatrixSciS_addVerticesToAdjacencymatrix(n,amatrix)adjacencyMatrix
Moves a vertex to another position measured in Snap! sprite-coordinates
1thisSpritethisSprite theStage anotherSprite100100vertexList
Creates n new edges randomly.
1thisSpritethisSprite theStage anotherSpriteresultSciS_addRandomEdgesToGraph(amatrix,n,lAttributes,vlist)adjacencyMatrixedgePropertiesvertexListadjacencyMatrix1vertexList2
Creates a new edge between two vertices.
12thisSpritethisSprite theStage anotherSprite0vertexList0vertexListadjacencyMatrixXadjacencyMatrixX5edgeProperties
draws the graph on a GraphPad.
thisSpritethisSprite theStage anotherSpriteStageoldCostumeStageSciS_drawGraph(amatrix,vlist,cAttributes,vAttributes,lAttributes,oldCostume)adjacencyMatrixvertexListcostumePropertiesvertexPropertiesedgeProperties
Deletes a vertex.
1thisSpritethisSprite theStage anotherSprite0vertexListvertexListadjacencyMatrix
Deletes an edge.
12thisSpritethisSprite theStage anotherSprite0vertexList0vertexListadjacencyMatrix05edgeProperties
12thisSpritethisSprite theStage anotherSprite0vertexList0vertexList
Sets the weight of an edge.
121thisSpritethisSprite theStage anotherSprite0vertexList0vertexList
thisSpritethisSprite theStage anotherSpritefrom vertex nr
Input for start vertex.
thisSpritethisSprite theStage anotherSpritenew start vertexwidth (1....20)
1thisSpritethisSprite theStage anotherSprite0vertexList
Sets the content of a vertex.
1thisSpritethisSprite theStage anotherSprite0vertexList
Input for a new vertex content.
thisSpritethisSprite theStage anotherSpritevertex number
Tells a vertex to be marked.
1thisSpritethisSprite theStage anotherSprite0vertexList
Deletes a marker.
1thisSpritethisSprite theStage anotherSprite0vertexList
Deletes all markers.
thisSpritethisSprite theStage anotherSpriteitemvertexList
Depth first search in a graph.
1thisSpritethisSprite theStage anotherSprite0vertexList
Breadth first search in a graph.
1thisSpritethisSprite theStage anotherSprite0vertexList
Reports the distance of two vertices.
thisSpritethisSprite theStage anotherSprite120vertexList0vertexList
Shortes path between two vertices, using Dijkstra-method.
12thisSpritethisSprite theStage anotherSprite0vertexList0vertexList
Shortes paths between startVertex and all connected vertices, using Dijkstra-method.
1thisSpritethisSprite theStage anotherSprite0vertexList
Returns the vertexnumber of a vertex near (x|y), if there is one.
10050thisSpritethisSprite theStage anotherSpriteSciS_vertexnumberAtGraph(vlist,cAttributes,vAttributes,x,y)vertexListcostumePropertiesvertexProperties
00thisSpritethisSprite theStage anotherSpritetargetSize10011001
Reports the vertexnumber of the vertex with the specified content. If not found then reports 0.
PeterthisSpritethisSprite theStage anotherSpritenr0itemvertexListFamilyTree
numberXdiagramSpriteDiagramSpriteDiagramSprite400300245245245DiagramSpriteEdges per Node18Number of Edges16Number of Vertices1610trueDiagramSpriteDiagramSprite
spriteName
spriteName
Imports a stored sprite from a file.
new name
Imports stored blocks to another palette. All blocks should be from the same category!
Lookslibrarybegincategory=10end"50oldcat2libraryall""""SciS_importLibrary2(src)
Creates a new empty costume of the specified size and color ans sets local properties for a NeuralNet.
thisSpritethisSprite theStage anotherSprite400300245245245costumeWidthcostumeHeightStagecostume properties: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for NN position on stage 7: upper offset for NN position on stage neural net properties: 1: number of layers 2: layer width 3: width of NN image 4: height of NN image
thisSpritethisSprite theStage anotherSprite
Reads the value of an existing property.
netPropertiestypeOfConfiguration typeOfData costumeProperties netPropertiesthisSpritethisSprite theStage anotherSpriteresultnot foundname1 hmyProperties
Sets the value of an existing property or inserts it anew.
netPropertiestypeOfConfiguration typeOfData costumeProperties netPropertiesthisSpritethisSprite theStage anotherSpritename1 donefalsehmyPropertiesmyProperties
a simple way to set some costume attributes: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for NN position on stage 7: upper offset for NN position on stage
40030024524524500thisSpritethisSprite theStage anotherSpritecostumeProperties
a simple way to set some net attributes: 1: number of layers 2: layer width 3: width of NN image 4: height of NN image
23400300thisSpritethisSprite theStage anotherSpritenetProperties
Reports the output of the nth layer of a neural network with given input.
last1 lastthisSpritethisSprite theStage anotherSpritevector2netProperties
Creates a fully connected neural network of perceptrons. Inputs should be connected to layer 1, outputs to last layer.
23thisSpritethisSprite theStage anotherSpritemyDataone matrix for each layer1myDatapropertiesnetPropertiesnetProperties34typeOfDataweights
Draws the nodes and current status of connections of an NN as new costume.
thisSpritethisSprite theStage anotherSpritenetWidth2netPropertiesSciS_NNshowStatus(cAttributes,nAttributes,weights,outputs,costume,sprite)costumePropertiesnetPropertiesmyData
A block for teaching a neural net.
0.1thisSpritethisSprite theStage anotherSpritewidth2netPropertiesmyDataSciS_NNteach(weights,width,depth,input,output,eta)myData1netProperties
thisSpritethisSprite theStage anotherSprite
creates a temporary or static Sprite.
truenewSprite
Removes the calling sprite.
Reports the row or column number of the row or column with the name entered, or reports an error message. If the the name is a number You can mark this with a # (e.g. #123).
columncolumn rownameSciSnap!Datatable010columnfirstlast1#n0i10i100ERROR: name not found!rowfirstlast1#n0i10i10ERROR: name not found!ERROR: something wrong!
Input dialog for a list of items. Click item by mouse and then ok. Returns the selected item.
thisSpritethisSprite theStage anotherSpritetitlewidth9costume400245245245continuous1000245245245 (click on it)102018truei12530505281218true70301005ok751218trueokfalse70100305
Returns an empty table.
Reports a new table initialized with value.
23result
Reports a table with labeled columns.
20i1rowERROR: labels required!
Reports the copy of a list or an empty list.
Imports table-CSV-data, costume-data, SQL-data or FITS-data to SciSnap!Data.
costume-(RGB)-datatable-(CSV)-data costume-(RGB)-data SQL-(query)-data FITS-datacurrent-costumecurrent-costume filepicker other-sourceFITS-datatable-(CSV)-datacolumns10rows1000hmaxcolumnSciSnap!DatatrueminValuemaxValuecostume-(RGB)-datahminValuemaxValueSQL-(query)-datatypeOfDatatable0columns10rows1000hmaxcolumntrueminValuemaxValue
Reads a file using the filepicker.
Stores a list in a CSV file. JS-code copied from Snap!-code.
SciSnap!Datafilename
Reports randomly distributed points in the form of a rectangle, circle, or ring.
100-100100-100100squaresquare circle ringcirclering
Creates new random data in the specified ranges swaying by a straight.
10-55102
Generates a list of points "near" a given graph.
20-552
Creates the transpose of a table or a list.
01valuevaluetableERROR: data are not transposable!
Adds a row, a column, or column headers to a table.
rowrow column column-headersSciSnap!Datachoice1 tablerowi1column0i1column-headersi11
Reports the row or column of a table identified by number or name, or reports an error message. If the the name is a number You can mark this with a # (e.g. #123).
rowrow columnnumberOrNamefirst last numberOrNameSciSnap!Datatruechoice1 tablerowlast1columnlast11ERROR: something wrong!
Deletes a row or column of a table. identified by number or name, or reports an error message. If the the name is a number You can mark this with a # (e.g. #123).
rowrow columnnumberOrNamefirst last numberOrNameSciSnap!Datatablerowlastcolumnlast11item
Reports the element a position x|y of a table, identified by numbers or names.
numberOrNamenumberOrNameSciSnap!Datatablexcolumnyrow001
Replaces the value at position x|y of a table.
numberOrNamenumberOrNameSciSnap!Datatablexcolumnyrow001
Reports the columns from row startnr to row endnr.
SciSnap!DatanumberOrNamelastlast numberOrNametablelaststartnrrowendnrrowcolNumbersitemSciS_columncopy(data,cols,start,stop)
Reports a subsection of an image or table.
RGB-datatable-data matrix-data list-data RGB-data FITS-dataSciSnap!DatanumberOrNamenumberOrNamenumberOrNamenumberOrNamelist-dataresultdummyvalueindextable-datamatrix-datab1columnb2rowe1columne2rowbeginendSciS_subsection(data,begin,end)RGB-dataFITS-dataRGB-datawidthwidthheightheightFITS-datawidthwidthheightheightbeginendSciS_subsectionImage(data,begin,end,width,height)
Determines the rows of a table with certain properties.
SciSnap!DatanumberOrNameless-thanless-than greater-than equal-to different-fromtablencolumn11op1less-thangreater-thanequal-todifferent-from
counts the appearances of the values of a list.
sortedDatacountedValuesvalue1n0item
returns the entropy of a list of data
Copy of corresponding Snap!-library-block: Reports a new list whose items are the same as in the input list, except that if two or more equal items appear in the input list, only the last one is kept in the result.
SciSnap!Datatable
Normalizes a table by dividing it by the specified value.
SciSnap!Datameanmean max number sum median softmaxchoice1 vector0
Reports a compressed version of a vector or matrix.
SciSnap!Data2isMatrixmatrixvector11resulti11iresultcolumnNr11
Pooling operation with matrices, images and vectors.
maxmax meanSciSnap!Data21typeOfPooling1 matrixvectorFITSRGBmatrixFITSRGBSciS_pooling(data,width,height,typeOfPooling,stride,typeOfData)
Reports a sorted list.
Sorts a list or table.
SciSnap!DatanumberOrNametruetrueisTabletableresult1
Determines a group of properties of a table.
meanmin max number sum meannumberOrNameSciSnap!DatanumberOrNametruetablegroupcolumncolumn11valuecolumncolumn11choice1 copytruecolumn0SciS_groupeddata(aTable,compaircolumn,operation,groupcolumn)
Calculates the ranges, the covariance or the correlation between two columns of a table.
rangesranges covariance correlationnumberOrNamenumberOrNameSciSnap!Datatruetablencolumn11mcolumn11copychoice1 1SciS_propertiesoftable(selection,table,x,y)1
Calculates the parameters of a regression line.
SciSnap!DatamatrixsumX0sumY0numerator0denominator0dummymeanXmeanYdummymb
Determines the next k neighbours of a point in data. The class of the point has to be in column 3.
5SciSnap!Datatablepoint2neighbors3truetruetable-data114
Applies a convolution to a table with FITS, RGB, or table values.
tableimage tableSciSnap!Data100100matrixSciS_convolution(kernel,data,width,height,typeOfData,mIndex,kWidth)
Custering of n-dimensional data with k-means-method. Cluster numbers are attached to the data.
3SciSnap!DatamatrixSciS_k-means-clustering(k,data)
Custering of n-dimensional data with k-means-method. A metric has to be delivered as a ringified term. Cluster numbers are attached to the data.
3SciSnap!Dataringified operatormatrixresultadd cluster number 0 to datadimension1minmaxi1calculate min and max for all columnscentersi1choose k random centerscalculate min and max for all columnsanyChangestruen0anyChangesfalsedummycenter1pointbuild clustersadjust centers
Metric for Strtings.
SaturdaySunday
labels of data: -1 not visited, 0 visited, -2 noise, >0 clusternr
SciSnap!Data505matrix2SciS_DBSCAN(data,r,minMembers)-1
reports a ID3 decision tree constructed on the base of labeled data
0empty datasetcountedValuescolumnlasttrue1only one result --> ready11only one attribut left --> readyinformation gainsi111calculate information gains for all attributesinformation gains2falsetruecompareColumn11take attribute with max information gain as compare criterioncountedValuescolumntruelinksitemrecursive construction of ID3 trees for all other attributesnode11
thisSpritethisSprite theStage anotherSprite
Returns the vertexnumber of a vertex near mouse position, if there is one.
thisSpritethisSprite theStage anotherSpriteSciS_vertexnumberAtGraph(vlist,cAttributes,vAttributes,x,y)vertexListcostumePropertiesvertexProperties
returns the class of a dataset using an ID3-decision-tree
1leaf (unambiguous)1nodei1ERROR: no sensefull data to compare found!
Reports a vector, built by the items.
Returns a new vector of dimension n with random elements.
3110
Returns a matrix formed from the input vectors.
length1resultitem
Returns a new nxm-matrix with random elements.
32110i1
Creates the transpose of a vector or a matrix.
valuevalue
Determines a property of a vector.
minmin max minpos maxpos number sum mean median variance standard-deviation softmaxdatatransposed-vector1choice1 softmaxmedianminmaxnumbersummeanminposmaxposvariancestandard-deviationvariancestandard-deviationERROR: unknown option!
Linear operations with scalars, vectors and matrices.
*+ - * X-*ERROR: illegal operation between numbers!vectormatrixERROR: illegal operation with numbers!vectorvector+-*Xmatrixvector matrix operationERROR: illegal operation with vectors!matrixvectormatrix vector operationmatrixmatrix matrix operation-*ERROR: wrong operation!ERROR: illegal operation
Applies a mapping matrix to an object that is given as a matrix of points.
Soves a linear system of max. 50 equations.
some tests for correct data01transposed-vectormatrixcreates matrix with attached column bsolvedtruen50i1dTry to solve matrixr1rowswap rowshelpnormalize row1k11k1k1diagonalizer1
Reports a list of matrix A in triangle form, the rank of A, column change and column positions.
0Aba copy of A is used to let A unchangedrankrow1columchangefalsecolumn positions11i1search downwardsi1search to the rightc0row1row1row-1transform to diagonal form E
Calculates the coefficients of the interpolation polynomial for a 2xn-matrix of points.
212matrixcreate matrix of powers of x and y-valuesolvedtruen50i1j-12dTry to solve matrixr1rowswap rowshelpnormalize row1k11k1k1diagonaizer1
Calculates the value of a polynomial for input x.
polynomial as list of coefficients11result12i3
Applies an affine transformation to a list of points.
SciSnap!DataoktrueP11P22P33Q11Q22Q33S1221221220ERROR: denominator is zero
Reports a complex number in Cartesian style.
23
Reports a complex number in polar style.
230
Reports a complex number in polar style.
Reports a complex number in Cartesian style.
Reports properties of complex numbers.
real-partabsolute-value real-part imaginary-part phase conjugatereal-partimaginary-partphaseconjugateERROR: unknown operator!
Reports arithmetic results of two complex numbers.
++ - * /complex-numbercomplex-number-polar-stylecomplex-number-polar-style+-*/complexNumberCartesianStyle22333223
Creates a new empty costume of the specified size and color and sets local properties
thisSpritethisSprite theStage anotherSprite400300245245245theStagecostumeWidthcostumeHeighttheStagecostume attributes: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for MathPad position on stage 7: upper offset for MathPad position on stage other attributes: 1: line width 2: draw only ponts, not arrows 3: dimension of coordinate system 4: max. value on scales 5: start point of arrows
thisSpritethisSprite theStage anotherSprite
Reads the value of an existing property.
costumePropertiestypeOfConfiguration typeOfData costumeProperties lineProperties dimension maxValue startPointthisSpritethisSprite theStage anotherSpriteresultnot foundname1 hmyProperties
Sets the value of an existing property or inserts it anew.
costumePropertiestypeOfConfiguration typeOfData costumeProperties lineProperties dimension maxValue startPointthisSpritethisSprite theStage anotherSpritename1 donefalsehmyProperties
a simple way to set some costume attributes: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for MathPad position on stage 7: upper offset for MathPad position on stage
40030024524524500thisSpritethisSprite theStage anotherSpritecostumeProperties
a simple way to set some MathPad attributes: 1: line width 2: draw only ponts, not arrows 3: dimension of coordinate system 4: max. value on scales 5: start point of arrows
1false310000thisSpritethisSprite theStage anotherSpriteoldDimensiondimensionoldMaxValuemaxValuelinePropertiesdimensionmaxValuestartPoint
Draws axes on a MathPad in 2 or 3 dimensions.
thisSpritethisSprite theStage anotherSpriteSciS_mathpadaddaxes(cAttributes,type,maxValue,dimension,costume)costumePropertiestypeOfDatamaxValuedimension
Draws a vector, complex number or object of points from the start point stored in the properties.
vectorvector complex-number line-to object-of25500thisSpritethisSprite theStage anotherSpritefalsedataobject-ofdimension1SciS_mathpadplot(costume,data,r,g,b,maxValue,linewidth,dimension,onlypoints,cAttributes,startpoint,choice)maxValue1linePropertiesdimension2linePropertiescostumePropertiesstartPointcomplex-numberdata23dimensionSciS_mathpadplot(costume,data,r,g,b,maxValue,linewidth,dimension,onlypoints,cAttributes,startpoint,choice)maxValue1linePropertiesdimension2linePropertiescostumePropertiesstartPoint
Returns a root of an equation calculated with Newton's method.
ringified term1epsilon0.00001fi110001000
Reports an element of a sequence.
ringified term1
Returns a list of the n first elements of a sequence.
1ringified termresulti1
Returns a list of secant slopes calculated with the given sequence.
ringified term21/nresulti1
Reports the secant slope "nearby" the given point.
ringified term1epsilon0.00001
Returns a finite sum.
10ringified term10result0i
Returns the integral of a term calculated with n trapezoids.
2ringified term11000result0dxx1
Reports either - data Fourier transformed to frequency-space - "raw" FFT (Fast Forier Transformation)data formatted as SciSnap! complex numbers - or iFFT real data
frequency_spectrumfrequency_spectrum complex_FFTdata iFFT_of_FFTdata100iFFT_of_FFTdataSciS_FFTops(data,freq,choice)
Reports coefficient of the binomial distribution b(N,p,k)=(N choose k)*p^k(1-p)^(N-k)
100.12ERROR: wrong parameter!
Reports binomial distribution B(N,p,k).
1100.1ERROR: wrong parameter!
Reports coefficient of the hypergeometric distribution.
10352ERROR: wrong parameter!
Reports hypergeometric distribution.
11035ERROR: wrong parameter!
Reports coefficient of the Poisson distribution.
0.052ERROR: wrong parameter!
Reports Poisson distribution.
20.05ERROR: wrong parameter!
Reports coefficient of the Pareto distribution.
132
Reports coefficient of the normal distribution.
101
The empty set.
The real (computer-) numbers.
Returns a set by listing the elements, predicates, and defined intervals. The sequence is: set isNumerical list of elements list of intervals predicate.
Creation of a set by a predicate. Intervals and elements should be defined by another block. If possible the predicate is translated to a list of intervals. The sequence is: set isNumerical list of elements list of intervals predicate.
ringified predicatepredicateTreeERROR: pure predicate sets are not supported yet.
Returns a set with one numerical interval. The sequence is: set isNumerical list of elements list of intervals predicate.
-Infinity-Infinity≤ <≤ <InfinityInfinitysettrue
Reports whether "element" is element of "set".
elementset43
Reports the intersection, union, difference, or cross product of two sets.
set1∩ ∪ \ Xset2are these two sets?set\set1set24433m14n1m1compare the mth interval with all intervals of set144Xresultset22item_133
Is set1 subset of set2?
set1set2are these two sets?setinterval4element3Compare elementstrue
Are theses two sets equal?
set1set2set
Reports up to n elements of a set. Numers are natural numbers smaller than maxSetValue in SciSnap!-properties.
10setresult340i1maxSetValue should be close to infinity ;-)resultvalueindexlistclean up1
Reports simple types, sets and lists as string.
i1maxSetValue should be close to infinity ;-)elementsvalueindexlist20item18is first elementtrueitem18ERROR: no simple type!
Converts a string to a list of elements.
1,2,[3,4],{6,7,8..12}]10]0]0}10}0}0find lists
Creates a new empty costume of the specified size and color and sets local properties
thisSpritethisSprite theStage anotherSprite400300245245245costumeWidthcostumeHeightStagecostume properties: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for Image position on stage 7: upper offset for Image position on stage line properties: 1: lineWidth 2: line color red 3: line color green 4: lineColor blue data properties: 1: minValue 2: maxValue 3: columns 4: rows image properties: 1: type (RGB,FITS) 2: imageWidth 3: imageHeight grid colors: list of usable colors: 1:black 2:gray 3:white 4: red 5:yellow 6:magenta 7:green 8:cyan 9:blue
thisSpritethisSprite theStage anotherSprite
Reads the value of an existing property.
costumePropertiestypeOfConfiguration typeOfData costumeProperties lineProperties dataProperties imageProperties gridProperties gridColorsthisSpritethisSprite theStage anotherSpriteresultnot foundname1 hmyProperties
Sets the value of an existing property or inserts it anew.
costumePropertiestypeOfConfiguration typeOfData costumeProperties lineProperties dataProperties imageProperties gridProperties gridColorsthisSpritethisSprite theStage anotherSpritename1 donefalsehmyPropertiesmyProperties
a simple way to set some costume attributes: 1: width 2: height 3: back color red 4: back color green 5: back color blue 6: left offset for Image position on stage 7: upper offset for Image position on stage
40030024524524500thisSpritethisSprite theStage anotherSpriteStage
a simple way to set some net attributes: line properties: 1: line style 2: lineWidth 3: line color red 4: line color green 5: lineColor blue 6: fill color red 6: fill color green 8: fill color blue
continuouscontinuous dashed dash-dot dot-dot1000180180180thisSpritethisSprite theStage anotherSpritelineProperties
a simple way to set some grid attributes: 1: number of horizontal cells 2: number of vertical cells 3: cell width 4: cell height grid data are stored in myData
thisSpritethisSprite theStage anotherSprite400400wh1costumePropertiesws2costumeProperties11gridPropertiesmyData2
Imports costume-data or FITS-data to a data list.
costume(RGB)datacostume(RGB)data FITSDatacurrentCostumecurrentCostume filepicker list with dimensions at topthisSpritethisSprite theStage anotherSpritechoice1 filepickerFITSData6typeOfConfigurationImagePadmyPropertiestypeOfDataFITSmyPropertieslineProperties1000myPropertiesdataProperties16myPropertiesimagePropertiesFITSmyPropertiesgridProperties40404040myPropertiesgridColors000black150150150gray255255255white25500red2552550yellow2550255magenta02550green0255255cyan00255bluemyPropertiesheader5011Stagecostume(RGB)dataw1h211costumeDatacostumePropertiesminmin123maxmax123typeOfConfigurationImagePadmyPropertiestypeOfDataRGBmyPropertieslineProperties1000myPropertiesdataProperties1myPropertiesimagePropertiesRGBmyPropertiesgridProperties40404040myPropertiesgridColors000black150150150gray255255255white25500red2552550yellow2550255magenta02550green0255255cyan00255bluemyPropertiesStage
Generates an image from the FITS or RGB data of the DataSprite in gray or false colors
graygray false-color RGBmyData0255falsethisSpritethisSprite theStage anotherSpritecolor1 sourcemyDatamyDatatypeOfDataFITS1costumePropertiestheStage2costumePropertiestheStage1costumeProperties2costumeProperties1costumeProperties2costumeProperties1costumePropertiestheStage2costumePropertiestheStage1costumeProperties2costumeProperties
Draws a grid on an ImagePad.
myDatathisSpritethisSprite theStage anotherSpritetruemyDatamatrix1gridProperties12gridProperties
Draws a line on present costume using line properties. Attention: JS coordinates are used.
1010100100thisSpritethisSprite theStage anotherSprite
Draws a rectangle on present costume using line properties. Attention: JS coordinates are used.
1010100100thisSpritethisSprite theStage anotherSpriteSciS_drawRectangleOnImagepad(costume,x1,y1,width,height,lineAttributes)lineProperties
Fills a rectangle on present costume using surface properties. Attention: JS coordinates are used.
1010100100thisSpritethisSprite theStage anotherSpriteSciS_fillRectangleOnImagepad(costume,x1,y1,width,height,lineAttributes)lineProperties
Draws a circle on present costume using line properties. Attention: JS coordinates are used.
10010020thisSpritethisSprite theStage anotherSpriteSciS_drawCircleOnImagepad(costume,x,y,radius,lineAttributes)lineProperties
Fills a circle on present costume using surface properties. Attention: JS coordinates are used.
10010020thisSpritethisSprite theStage anotherSpriteSciS_fillCircleOnImagepad(costume,x,y,radius,lineAttributes)lineProperties
Draws a text on present costume using line properties. Attention: JS coordinates are used.
my text1005012truethisSpritethisSprite theStage anotherSpriteSciS_drawTextOnImagepad(costume,x,y,text,height,horizontal,lineAttributes)lineProperties
Draws a list of "point" as "balls". Attention: JS-coordinates are used!
myDatacirclescircles squares5thisSpritethisSprite theStage anotherSpritesourcemyDatamatrix012SciS_drawListOfPoints(costume,data,shape,size,lineAttributes)121lastlineProperties
Sets the RGB value at (x|y) on costume. Attention: JS-coordinates are used!
11thisSpritethisSprite theStage anotherSprite255100301costumeProperties2costumeProperties11
Reports the RGB value at the position (x|y) of the costume. JS-code-snippets copied from Snap!-code. Attention: JS-coordinates are used!
11thisSpritethisSprite theStage anotherSprite1costumeProperties2costumeProperties11
Sets the value at (x|y) in myData. Attention: JS-coordinates are used!
11thisSpritethisSprite theStage anotherSpritetypeOfDataRGBtypeOfDataFITS
Reads the data value at the position (x/y) of an image stored in myData. Attention: JS-coordinates are used!
11thisSpritethisSprite theStage anotherSpritetypeOfDataRGBtypeOfDataFITS
Obtaining data with the mouse from an image or grid stored in myData.
image-valueimage-value costume-coordinates slice-data line-data circle-data brightness cell-valuethisSpritethisSprite theStage anotherSpriteselection1 targetCostumetargetCostumeWidthtargetCostumeHeightStagecostume-coordinatescostume coordinates.line-dataokfalseokfalsexold1yold21212Stageline dataimage-value11image valueslice-dataslice datacircle-datacircle dataokfalseokfalsecontinuous32552000180180180112112continuous1255200018018018012Stagebrightnessbrightnesscell-valuevalue of a grid cell
Applies an affine transformation to a costume.
currentCostumeoktrueP11P22P33Q11Q22Q33S1221221220ERROR: denominator is zero
Reports the brightness of a FITS or RGB image around x|y in a circle with radius r. Attention: JS-coordinates are used!
10010010thisSpritethisSprite theStage anotherSpritedatamyDatatypeOfDataFITStypeOfDataRGB
Fills a grid or a part of a grid with one of the specified values.
thisSpritethisSprite theStage anotherSprite1xMax1yMaxgridPropsgridPropertiesxMaxyMaxmyDataSciS_fillOnImagePadGridRandomlyOnImagePad(xMin,xMax,yMin,yMax,numbers,data)myData
sets the value of a grid cell
thisSpritethisSprite theStage anotherSprite1targetCostumetargetCostumeWidthtargetCostumeHeightStage11myDatatrue
Sets the value of a grid cell an shows the result.
thisSpritethisSprite theStage anotherSprite112truegridPropsgridProperties1112
Reports the Moore- or v.-Neumann-neighborhood of a cell. Order: north,east,south,west
MooreMoore vonNeumannfalse11thisSpritethisSprite theStage anotherSpriteSciS_neighborhoodInGridOnImagePad(data,gridProperties,x,y,isTorus,typeOfNeighborhood)myDatagridProperties
Swaps the cell values of a grid randomly.
thisSpritethisSprite theStage anotherSpritetrue111xMax1yMaxgridPropsgridPropertiesxMaxyMaxSciS_swapCellsOfGridOnImagePad(data,gridProperties,n,isTorus,range,xMin,xMax,yMin,yMax)myDatagridProperties
Counts the surrounding values and changes it if necessary.
thisSpritethisSprite theStage anotherSpritetrueany or numberany22greater-thangreater-than equal-to smaller-than different-from41false51xMax1yMaxgridPropsgridPropertiesxMaxyMaxSciS_changeSurroundingValuesOfGridOnImagePag(data,gridProperties,ifValue,elseValue,surrValue,op,n,isTorus,withNoise,noise,xMin,xMax,yMin,yMax,oldValue)myDatagridProperties1 1
Replaces the cell values of a grid depending on the features of the neighbors.
thisSpritethisSprite theStage anotherSpritetruesumsum min max mean1xMax1yMax1gridPropsgridPropertiesxMaxyMaxSciS_replaceValuesOfGridOnImagePad(data,gridProperties,operation,isTorus,xMin,xMax,yMin,yMax,range)myDatagridProperties1
Combines two grids.
1orand or xor not-and not-or not-xor minus212xMax1111yMaxSciS_combineGridsOnImagePad(grid1,grid2,value1,operator,value2,ifValue,elseValue,xMax,yMax)
Applies a Wolfram Cellular Automaton to a grid.
3031SciS_applyWolframAutomatonToAgridOnImagePad(no,grid,color0,color1)
An image should be loaded as costume of the sprite!
An image of Albategnius should be loaded as costume of the sprite!
Tests the value of a property.
falsetypeOfConfigurationMathPad
Returns the value of an existing global SciSnap!-property or "not found". Items: typeOfData width height minValue maxValue columns rows maxSetValue
minValuetypeOfData width height minValue maxValue columns rows maxSetValue
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/SciSnapExtensions.js b/elements/pl-snap/Snap/libraries/SciSnapExtensions.js new file mode 100644 index 00000000..400d6475 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/SciSnapExtensions.js @@ -0,0 +1,5047 @@ +SnapExtensions.primitives.set( + 'SciS_SetSciSnapLogo()', + function () { + IDE_Morph.prototype.createLogo = function () { + var myself = this; + + if (this.logo) { + this.logo.destroy(); + } + + this.logo = new Morph(); + + this.logo.texture = "data:image/png;base64," + + "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" + + "rkJggg=="; + + this.logo.render = function (ctx) { + var gradient = ctx.createLinearGradient( + 0, + 0, + this.width(), + 0 + ); + gradient.addColorStop(0, 'black'); + gradient.addColorStop(0.5, myself.frameColor.toString()); + ctx.fillStyle = MorphicPreferences.isFlat ? + myself.frameColor.toString() : gradient; + ctx.fillRect(0, 0, this.width(), this.height()); + if (this.cachedTexture) { + this.renderCachedTexture(ctx); + } else if (this.texture) { + this.renderTexture(this.texture, ctx); + } + }; + + this.logo.renderCachedTexture = function (ctx) { + ctx.drawImage( + this.cachedTexture, + 5, + Math.round((this.height() - this.cachedTexture.height) / 2) + ); + this.changed(); + }; + + this.logo.mouseClickLeft = function () { + myself.snapMenu(); + }; + + this.logo.color = BLACK; + this.logo.setExtent(new Point(200, 28)); // dimensions are fixed + this.add(this.logo); + }; + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph); + ide.createLogo(); + ide.createControlBar(); + ide.fixLayout(); + } +); + +SnapExtensions.primitives.set( + 'SciS_addMenuItemForSciSnapManuals()', + function () { + IDE_Morph.prototype.snapMenu = function () { + var menu, + world = this.world(); + + menu = new MenuMorph(this); + menu.addItem('About...', 'aboutSnap'); + menu.addLine(); + menu.addItem( + 'Reference manual', + () => { + var url = this.resourceURL('help', 'SnapManual.pdf'); + window.open(url, 'SnapReferenceManual'); + } + ); + menu.addItem( + 'Snap! website', + () => window.open('https://snap.berkeley.edu/', 'SnapWebsite') + ); + menu.addItem( + 'SciSnap! manual', + () => window.open('https://emu-online.de/ProgrammingWithSciSnap2.pdf', '') + ); + menu.addItem( + 'SciSnap! Handbuch', + () => window.open('https://emu-online.de/ProgrammierenMitSciSnap2.pdf', '') + ); + menu.addItem( + 'Download source', + () => window.open( + 'https://github.com/jmoenig/Snap/releases/latest', + 'SnapSource' + ) + ); + if (world.isDevMode) { + menu.addLine(); + menu.addItem( + 'Switch back to user mode', + 'switchToUserMode', + 'disable deep-Morphic\ncontext menus' + + '\nand show user-friendly ones', + new Color(0, 100, 0) + ); + } else if (world.currentKey === 16) { // shift-click + menu.addLine(); + menu.addItem( + 'Switch to dev mode', + 'switchToDevMode', + 'enable Morphic\ncontext menus\nand inspectors,' + + '\nnot user-friendly!', + new Color(100, 0, 0) + ); + } + menu.popup(world, this.logo.bottomLeft()); + }; + } +); + +SnapExtensions.primitives.set( +//copied from Snap! library + 'SciS_setvalue(which,value)', + function (which, value) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph); + try { + ide.savingPreferences = false; + switch (which) { + case 'Project notes': + ide.projectNotes = value; + break; + case 'Project name': + ide.setProjectName(value); + break; + case 'Language': + ide.setLanguage(value); + break; + case 'Zoom blocks': + if (!isNaN(value)) + ide.setBlocksScale(Math.min(value, 12)); + break; + case 'Stage size': + if ((value instanceof List) && value.length() == 2 + && !isNaN(value.at(1)) && !isNaN(value.at(2))) + ide.setStageExtent(new Point(value.at(1), value.at(2))); + break; + case 'Stage scale': + ide.toggleStageSize(value != 1, Math.max(0.1, value)); + break; + case 'Visible palette': + ide.currentCategory = value.toLowerCase(); + ide.categories.children.forEach(function (each) { + each.refresh(); + }); + ide.refreshPalette(true); + break; + } + ; + } finally { + ide.savingPreferences = true; + } + ; + } +); + +SnapExtensions.primitives.set( + 'SciS_uppercase(txt)', + function (txt) { + return txt.toUpperCase(); + } +); + +SnapExtensions.primitives.set( + 'SciS_lowercase(txt)', + function (txt) { + return txt.toLowerCase(); + } +); + +SnapExtensions.primitives.set( + 'SciS_indexof(sub,txt)', + function (sub, txt) { + return txt.indexOf(sub) + 1; + ; + } +); + +SnapExtensions.primitives.set( + 'SciS_substring(aString,from,to)', + function (aString, from, to) { + from -= 1; + if (to > aString.length) + to = aString.length; + if ((from >= 0) && (from < aString.length) && (to >= from)) + return aString.substring(from, to); + else + return ""; + } +); + +SnapExtensions.primitives.set( + 'SciS_delete(substring,aString,choice)', + function (substring, aString, choice) { + var result = aString, pos = result.indexOf(substring); + if (choice === 'first') + return result.replace(substring, ''); + else { + while (pos > -1) { + result = result.replace(substring, ''); + pos = result.indexOf(substring); + } + return result; + } + } +); + +SnapExtensions.primitives.set( + 'SciS_writeToFile(data,filename)', + function (data, filename) { + var ide = this.parentThatIsA(IDE_Morph); + if (isString(data)) { + ide.saveFileAs(data, 'text/plain;charset=utf-8', filename); + } + } +); + +SnapExtensions.primitives.set( + 'SciS_replace(substring,replacement,aString,choice)', + function (substring, replacement, aString, choice) { + var result = aString, pos = result.indexOf(substring); + if (choice === 'first') + return result.replace(substring, replacement); + else { + while (pos > -1) { + result = result.replace(substring, replacement); + pos = result.indexOf(substring); + } + return result; + } + } +); + +SnapExtensions.primitives.set( + 'SciS_costumecopy(costume)', + function (costume) { + if (typeof (costume) === "object") + return costume.copy(); + else + return "costume required!"; + } +); + +SnapExtensions.primitives.set( + 'SciS_newcostume(w,h,r,g,b)', + function (w, h, r, g, b) { + var newCostume = new Costume(); + newCostume.contents.width = w; + newCostume.contents.height = h; + var ctx = newCostume.contents.getContext('2d'); + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.fillRect(0, 0, w, h); + ctx.strokeRect(0, 0, w, h); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + newCostume.rotationCenter = new Point(w / 2, h / 2); + return newCostume; + } +); + +SnapExtensions.primitives.set( + 'SciS_showmessage(title,message)', + function (title, message) { + this.parentThatIsA(IDE_Morph).inform(title, message); + } +); + +SnapExtensions.primitives.set( + 'SciS_copyOf(theList)', + function (theList) { + function listCopy(item) { + var theCopy; + if (item instanceof List) { + theCopy = new List(); + for (var i = 1; i <= item.length(); i++) + theCopy.add(listCopy(item.at(i))); + } else + theCopy = item; + return theCopy; + } + return listCopy(theList); + } +); + +SnapExtensions.primitives.set( + 'SciS_mathpadaddaxes(cAttributes,type,maxValue,dimension,costume)', + function (cAttributes, type, maxValue, dimension, costume) { + var ctx, costumeWidth, costumeHeight, leftOffset = Number(cAttributes.at(6)), upperOffset = Number(cAttributes.at(7)), + x0, y0, intervals, width = Number(cAttributes.at(8)), height = Number(cAttributes.at(9)); + + function valueTOpixel(v) { + return (v * width) / (2 * maxValue); + } + function pixelTOvalue(p) { + return (2 * maxValue * p) / width; + } + + //set values + ctx = costume.contents.getContext('2d'); + costumeWidth = costume.contents.width; + costumeHeight = costume.contents.height; + x0 = width / 2; + y0 = height / 2; + intervals = 10 * Math.round(width / 500); + + //plot frame + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.strokeRect(leftOffset, upperOffset, width, height); + ctx.closePath(); + ctx.stroke(); + + //plot axes + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.fillStyle = new Color(0, 0, 0).toString(); + ctx.moveTo(leftOffset, upperOffset + y0); + ctx.lineTo(leftOffset + width, upperOffset + y0); + ctx.lineTo(leftOffset + width - 10, upperOffset + y0 - 6); + ctx.lineTo(leftOffset + width - 10, upperOffset + y0 + 6); + ctx.lineTo(leftOffset + width, upperOffset + y0); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + ctx.beginPath(); + if (type === "complex") + ctx.fillText("Re", leftOffset + width - 25, upperOffset + y0 - 15); + else + ctx.fillText("x", leftOffset + width - 15, upperOffset + y0 + 15); + ctx.moveTo(leftOffset + x0, upperOffset + height); + ctx.lineTo(leftOffset + x0, upperOffset); + ctx.lineTo(leftOffset + x0 - 6, upperOffset + 10); + ctx.lineTo(leftOffset + x0 + 6, upperOffset + 10); + ctx.lineTo(leftOffset + x0, upperOffset); + if (dimension > 2) { + ctx.fillText("z", leftOffset + x0 - 15, upperOffset + 15); + ctx.moveTo(leftOffset, upperOffset + y0 + x0 / 2); + ctx.lineTo(leftOffset + width, upperOffset + y0 - x0 / 2); + ctx.lineTo(leftOffset + width - 12, upperOffset + y0 - x0 / 2); + ctx.lineTo(leftOffset + width - 6, upperOffset + y0 - x0 / 2 + 8); + ctx.lineTo(leftOffset + width, upperOffset + y0 - x0 / 2); + ctx.fillText("y", leftOffset + width - 15, upperOffset + y0 - x0 / 2 - 5); + } else { + if (type === "complex") + ctx.fillText("Im", leftOffset + x0 - 25, upperOffset + 15); + else + ctx.fillText("y", leftOffset + x0 + 15, upperOffset + 15); + } + + //drawScales + var dx = 2 * maxValue / intervals, delta = valueTOpixel(dx), xpos = x0, ypos = y0, zpos, text, pos = y0, + zpos, zdelta, w, x, y, fac; + while (xpos >= 0) { + xpos = xpos - delta; + } + while (xpos <= 0) { + xpos = xpos + delta; + } + x = pixelTOvalue(xpos - x0); + while (xpos < width) { + text = x.toPrecision(2); + w = ctx.measureText(text).width; + ctx.moveTo(leftOffset + xpos, upperOffset + pos - 3); + ctx.lineTo(leftOffset + xpos, upperOffset + pos + 3); + if ((xpos < width - 10) && (xpos !== x0)) { + ctx.fillText(text, leftOffset + xpos - w / 2, upperOffset + pos + 15); + } + if (dimension > 2) { + zpos = x0 - (x0 - xpos) * Math.cos(Math.PI / 6) * 0.8; + ctx.moveTo(leftOffset + zpos, upperOffset + pos + (x0 - zpos) / 2 - 3); + ctx.lineTo(leftOffset + zpos, upperOffset + pos + (x0 - zpos) / 2 + 3); + if ((zpos !== x0) && (zpos < width - 10)) { + ctx.fillText(text, leftOffset + zpos - w / 2, upperOffset + pos + (x0 - zpos) / 2 + 15); + } + } + xpos = xpos + delta; + x = pixelTOvalue(xpos - x0); + } + pos = x0; + while (ypos >= 0) { + ypos = ypos - delta; + } + ypos = ypos + delta; + y = pixelTOvalue(y0 - ypos); + while (ypos <= height) { + text = y.toPrecision(2); + w = ctx.measureText(text).width; + ctx.moveTo(leftOffset + pos - 3, upperOffset + ypos); + ctx.lineTo(leftOffset + pos + 3, upperOffset + ypos); + if ((ypos !== y0) && (ypos > 10)) { + ctx.fillText(text, leftOffset + pos + 5, upperOffset + ypos + 3); + } + ypos = ypos + delta; + y = pixelTOvalue(y0 - ypos); + } + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_mathpadplot(costume,data,r,g,b,maxValue,linewidth,dimension,onlypoints,cAttributes,startpoint,choice)', + function (costume, data, r, g, b, maxValue, linewidth, dimension, onlypoints, cAttributes, startpoint, choice) { + function valueTOpixel(v) { + return (v * width) / (2 * maxValue); + } + function pixelTOvalue(p) { + return (2 * maxValue * p) / width; + } + function vectorTOcoordinates(v) { + if (dimension > 2) { + var x = Number(v.at(1)), y = Number(v.at(2)), z = Number(v.at(3)), ypos; + ypos = valueTOpixel(y) * Math.cos(Math.PI / 6) * 0.8; + return new List([valueTOpixel(x) + ypos, valueTOpixel(z) + ypos / 2]); + } else { + var x = Number(v.at(1)), y = Number(v.at(2)); + return new List([valueTOpixel(x), valueTOpixel(y)]); + } + } + + if (choice === 'object-of') { + //variables + var ctx = costume.contents.getContext('2d'), costumeWidth = costume.contents.width, + costumeHeight = costume.contents.height, width = Number(cAttributes.at(8)), + height = Number(cAttributes.at(9)), leftOffset = Number(cAttributes.at(6)), + upperOffset = Number(cAttributes.at(7)), x0 = width / 2, y0 = height / 2, point; + maxValue = Number(maxValue); + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.strokeStyle = new Color(r, g, b).toString(); + ctx.lineWidth = Number(linewidth); + point = vectorTOcoordinates(data.at(1)); + ctx.moveTo(leftOffset + point.at(1) + x0, upperOffset + y0 - point.at(2)); + for (var i = 2; i <= data.length(); i++) { + point = vectorTOcoordinates(data.at(i)); + ctx.lineTo(leftOffset + point.at(1) + x0, upperOffset + y0 - point.at(2)); + } + ctx.closePath(); + ctx.stroke(); + return costume; + } + + //else plot a complex number, line, or vector + //variables + var ctx = costume.contents.getContext('2d'), costumeWidth = costume.contents.width, + costumeHeight = costume.contents.height, width = Number(cAttributes.at(8)), + height = Number(cAttributes.at(9)), leftOffset = Number(cAttributes.at(6)), + upperOffset = Number(cAttributes.at(7)), x0 = width / 2, y0 = height / 2, point, l, + xp, yp, alpha, dl, xe, ye, xs, ys; + maxValue = Number(maxValue); + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.strokeStyle = new Color(r, g, b).toString(); + ctx.lineWidth = Number(linewidth); + point = vectorTOcoordinates(data); + theStartpoint = vectorTOcoordinates(startpoint); + xs = theStartpoint.at(1); + ys = theStartpoint.at(2); + if (onlypoints) { + if (choice === "line-to") { + ctx.moveTo(leftOffset + point.at(1) + x0, upperOffset + y0 - point.at(2)); + ctx.lineTo(leftOffset + point.at(1) + x0 + 1, upperOffset + y0 - point.at(2) + 1); + ctx.closePath(); + ctx.stroke(); + } else { + ctx.moveTo(leftOffset + point.at(1) + xs + x0, upperOffset + y0 - point.at(2) - ys); + ctx.lineTo(leftOffset + point.at(1) + xs + x0 + 1, upperOffset + y0 - point.at(2) - ys + 1); + ctx.closePath(); + ctx.stroke(); + } + } else { + ctx.moveTo(leftOffset + xs + x0, upperOffset + y0 - ys); + if (choice === "line-to") + ctx.lineTo(leftOffset + point.at(1) + x0, upperOffset + y0 - point.at(2)); + else + ctx.lineTo(leftOffset + point.at(1) + xs + x0, upperOffset + y0 - point.at(2) - ys); + ctx.closePath(); + ctx.stroke(); + if ((choice === "vector") || (choice === "complex-number")) { + xp = point.at(1), yp = point.at(2); + l = Math.sqrt(xp * xp + yp * yp); + if (l > 15) { + ctx.beginPath(); + alpha = Math.acos(xp / l); + if (yp < 0) + alpha = -alpha; + xe = xp * (l - 10) / l; + ye = yp * (l - 10) / l; + ctx.moveTo(leftOffset + xp + xs + x0, upperOffset + y0 - yp - ys); + ctx.lineTo(leftOffset + xe - 5 * Math.sin(alpha) + xs + x0, upperOffset + y0 - ye - 5 * Math.cos(alpha) - ys); + ctx.lineTo(leftOffset + xe + 5 * Math.sin(alpha) + xs + x0, upperOffset + y0 - ye + 5 * Math.cos(alpha) - ys); + ctx.lineTo(leftOffset + xp + xs + x0, upperOffset + y0 - yp - ys); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); + } + } + } + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_ispropertypresent(properties,name,value)', + function (properties, name, value) { + var result, props, i, found; + try { + result = this.variables.getVar(properties); + } catch (error) { + result = "null"; + } + if (result === "null") + return false; + props = this.variables.getVar(properties); + i = 1; + found = false; + while (!found && (i <= props.length())) { + found = (props.at(i).at(1) === name) && (props.at(i).at(2) === value); + i++; + } + return found; + } +); + + +SnapExtensions.primitives.set( + 'SciS_extractFITSdata(FITSdata)', + function (FITSdata) { + function strToInt(high, low) { + var left = high.toString(2), right = low.toString(2); + while (left.length < 8) + left = "0" + left; + while (right.length < 8) + right = "0" + right; + var both = left + right, result = 0; + var factor = 1; + for (var i = 15; i >= 0; i--) { + if (both.charAt(i) == '1') + result = result + factor; + factor = factor * 2; + } + return result; + } + + var width = 0, height = 0, numberlength = 0; + minValue = 32768, maxValue = -32769, header = [], pixelvalues = [], + keyword = '', kwvalue = '', indexInLine = 0, i = 0, insideString = false, finished = false, c = ' ', n = 0, + mask = Math.pow(2, 7) - 1; + i = 0; + while ((i < 2880) && (i < FITSdata.length)) { + indexInLine = 1; + keyword = ''; + c = FITSdata.charAt(i); + while ((c != ' ') && (c != '=') && (i < 2880) && (i < FITSdata.length) && (indexInLine <= 80)) { + keyword = keyword + c; + i++; + indexInLine++; + c = FITSdata.charAt(i); + } + while (((c == ' ') || (c == '=')) && (i < 2880) && (i < FITSdata.length) && (indexInLine <= 80)) { + i++; + indexInLine++; + c = FITSdata.charAt(i); + } + kwvalue = ''; + insideString = false; + finished = false; + while (!finished) { + kwvalue = kwvalue + FITSdata.charAt(i); + if (c == "'") + insideString = !insideString; + i++; + indexInLine++; + c = FITSdata.charAt(i); + if (insideString) + finished = (i >= 2880) || (i >= FITSdata.length) || (indexInLine > 80); + else + finished = (c == ' ') || (i >= 2880) || (i >= FITSdata.length) || (indexInLine > 80); + } + if (keyword.length > 0) + header.push(new List([keyword, kwvalue])); + if (keyword == 'NAXIS1') + width = kwvalue; + if (keyword == 'NAXIS2') + height = kwvalue; + if (keyword == 'BITPIX') + numberlength = kwvalue; + while ((i < 2880) && (i < FITSdata.length) && (indexInLine <= 80)) { + i++; + indexInLine++; + } + } + + if (numberlength == 16) { + i = 2880; + while (i < FITSdata.length - 1) { + n = strToInt(FITSdata.charAt(i).charCodeAt(0), FITSdata.charAt(i + 1).charCodeAt(0)); + //n = -(n & mask) + (n & ~mask); + pixelvalues.push(n); + if (n > maxValue) + maxValue = n; + if (n < minValue) + minValue = n; + i = i + 2; + } + return new List([width, height, minValue, maxValue, new List(header), new List(pixelvalues)]); + } else + return 'unsupported number format'; + } +); + +SnapExtensions.primitives.set( + 'SciS_readFileWithFilepicker()', + function () { + var inp = document.createElement('input'), ide = this.parent.parent, result = 0, done = false; + + function userImport() { + + function txtOnlyMsg(ftype, anyway) { + ide.confirm( + localize( + 'Snap! can only import "text" files.\n' + + 'You selected a file of type "' + + ftype + + '".' + ) + '\n\n' + localize('Open anyway?'), + 'Unable to import', + anyway // callback + ); + } + + function readText(aFile) { + var frd = new FileReader(), + ext = aFile.name.split('.').pop().toLowerCase(); + + function isTextFile(aFile) { + // special cases for Windows + // check the file extension for text-like-ness + return aFile.type.indexOf('text') !== -1 || + contains(['txt', 'csv', 'xml', 'json', 'tsv'], ext); + } + + function isType(aFile, string) { + return aFile.type.indexOf(string) !== -1 || (ext === string); + } + + frd.onloadend = function (e) { + done = true; + if (isType(aFile, 'csv')) { + result = Process.prototype.parseCSV(e.target.result); + } else if (isType(aFile, 'json')) { + result = Process.prototype.parseJSON(e.target.result); + } else { + result = e.target.result; + } + }; + + if (isTextFile(aFile)) { + frd.readAsText(aFile); + } else { + txtOnlyMsg( + aFile.type, + function () { + frd.readAsText(aFile); + } + ); + } + } + + document.body.removeChild(inp); + ide.filePicker = null; + if (inp.files.length > 0) { + readText(inp.files[inp.files.length - 1]); + } + } + + if (ide.filePicker) { + document.body.removeChild(ide.filePicker); + ide.filePicker = null; + } + inp.type = 'file'; + inp.style.color = "transparent"; + inp.style.backgroundColor = "transparent"; + inp.style.border = "none"; + inp.style.outline = "none"; + inp.style.position = "absolute"; + inp.style.top = "0px"; + inp.style.left = "0px"; + inp.style.width = "0px"; + inp.style.height = "0px"; + inp.style.display = "none"; + inp.addEventListener( + "change", + userImport, + false + ); + document.body.appendChild(inp); + ide.filePicker = inp; + inp.click(); + return function () { + return new List([done, result]); + }; + } +); + +SnapExtensions.primitives.set( + 'SciS_writetoCSVfile(data,filename)', + function (data, filename) { + var ide = this.parent.parent; + ide.saveFileAs(data.asCSV(), 'text/csv;charset=utf-8', filename); + } +); + +SnapExtensions.primitives.set( + 'SciS_pooling(data,width,height,typeOfPooling,stride,typeOfData)', + function (data, width, height, typeOfPooling, stride, typeOfData) { + function getValue(x, y) { + return data.at((y - 1) * width + x); + } + + var result = [], y, x, max, sum, mean, n, value, row; + width = Number(width); + height = Number(height); + stride = Number(stride); + result.push(Math.ceil(1.0 * width / stride)); + result.push(Math.ceil(1.0 * height / stride)); + + if (typeOfData === "FITS") { + y = 1; + while (y <= height) { + x = 1; + while (x <= width) { + max = 0; + mean = 0; + n = 0; + sum = 0; + for (var i = 0; i < stride; i++) { + for (var j = 0; j < stride; j++) { + if (((x + i) <= width) && ((y + j) <= height)) { + n++; + value = Number(getValue(x + i, y + j)); + sum = sum + value; + if (value > max) + max = value; + } + } + } + if (n > 0) + mean = 1.0 * sum / n; + if (typeOfPooling === "max") + result.push(max); + else + result.push(mean); + x = x + stride; + } + y = y + stride; + } + } + + if (typeOfData === "RGB") { + y = 1; + while (y <= height) { + x = 1; + while (x <= width) { + max = [0, 0, 0, 0]; + mean = [0, 0, 0, 0]; + n = 0; + sum = [0, 0, 0, 0]; + for (var i = 0; i < stride; i++) { + for (var j = 0; j < stride; j++) { + if (((x + i) <= width) && ((y + j) <= height)) { + n++; + value = getValue(x + i, y + j); + for (k = 0; k < 4; k++) { + sum[k] = sum[k] + Number(value.at(k + 1)); + if (value.at(k + 1) > max[k]) + max[k] = value.at(k + 1); + } + } + } + } + if (n > 0) + for (k = 0; k < 4; k++) + mean[k] = 1.0 * sum[k] / n; + if (typeOfPooling === "max") + result.push(new List(max)); + else + result.push(new List(mean)); + x = x + stride; + } + y = y + stride; + } + } + + if (typeOfData === "matrix") { + y = 1; + while (y <= height) { + x = 1; + row = new List(); + while (x <= width) { + max = data.at(y).at(x); + mean = 0; + n = 0; + sum = 0; + for (var i = 0; i < stride; i++) { + for (var j = 0; j < stride; j++) { + if (((x + i) <= width) && ((y + j) <= height)) { + n++; + value = Number(data.at(y + j).at(x + i)); + sum = sum + value; + if (value > max) + max = value; + } + } + } + if (n > 0) + mean = 1.0 * sum / n; + if (typeOfPooling === "max") + row.add(max); + else + row.add(mean); + x = x + stride; + } + result.push(row); + y = y + stride; + } + } + + if (typeOfData === "vector") { + x = 1; + while (x <= width) { + max = data.at(x); + mean = 0; + n = 0; + sum = 0; + for (var i = 0; i < stride; i++) { + if ((x + i) <= width) { + n++; + value = Number(data.at(x + i)); + sum = sum + value; + if (value > max) + max = value; + } + } + if (n > 0) + mean = 1.0 * sum / n; + if (typeOfPooling === "max") + result.push(max); + else + result.push(mean); + x = x + stride; + } + } + + return new List(result); + } +); + +SnapExtensions.primitives.set( + 'SciS_convolution(kernel,data,width,height,typeOfData,mIndex,kWidth)', + function (kernel, data, width, height, typeOfData, mIndex, kWidth) { + function getValue(x, y) { + if (typeOfData === 'FITS') + return (data.at(x + (y - 1) * width)); + if (typeOfData === 'RGB') + return (data.at(x + (y - 1) * width)); + if (typeOfData === 'table') + return (data.at(y).at(x)); + } + + function getKernelValue(x, y) { + return (kernel.at(y).at(x)); + + } + + var result = [], x, y, value, r, g, b, s, row; + width = Number(width); + height = Number(height); + mIndex = Number(mIndex); + kWidth = Number(kWidth); + for (var y = 1; y <= height; y++) { + row = new List(); + for (var x = 1; x <= width; x++) { + if (typeOfData === 'FITS') + value = 0; + if (typeOfData === 'RGB') { + r = 0; + g = 0; + b = 0; + s = 255; + } + ; + if (typeOfData === 'table') + value = 0; + for (var ky = 1; ky <= kWidth; ky++) + for (var kx = 1; kx <= kWidth; kx++) + if ((y - mIndex + ky > 0) && (y - mIndex + ky <= height) && (x - mIndex + kx > 0) && (x - mIndex + kx <= width)) { + if (typeOfData === 'FITS') + value = value + getValue(x - mIndex + kx, y - mIndex + ky) * getKernelValue(kx, ky); + if (typeOfData === 'table') + value = value + getValue(x - mIndex + kx, y - mIndex + ky) * getKernelValue(kx, ky); + if (typeOfData === 'RGB') { + r = r + getValue(x - mIndex + kx, y - mIndex + ky).at(1) * getKernelValue(kx, ky); + g = g + getValue(x - mIndex + kx, y - mIndex + ky).at(2) * getKernelValue(kx, ky); + b = b + getValue(x - mIndex + kx, y - mIndex + ky).at(3) * getKernelValue(kx, ky); + } + } + if (typeOfData === 'FITS') + result.push(value); + if (typeOfData === 'table') + row.add(value); + if (typeOfData === 'RGB') + result.push(new List([r, g, b, s])); + } + if (typeOfData === 'table') + result.push(row); + } + return new List(result); + } +); + + +SnapExtensions.primitives.set( + 'SciS_variance(aList,mean)', + function (aList, mean) { + if (aList.length() === 0) + return 0; + var n = 0, isNumber, c, variance = 0; + var i = 1, k, value; + while (i <= aList.length()) { + value = aList.at(i); + if (typeof (value) === "number") + isNumber = true; + else { + if (typeof (value) === "string") { + isNumber = true; + k = 0; + while ((k < value.length) && isNumber) { + c = value.charAt(k); + if ((c < '0') || (c > '9')) + if ((c !== 'E') && (c !== 'e') && (c !== '+') && (c !== '-') && (c !== '.') && (c !== ',')) + isNumber = false; + k++; + } + } else + isNumber = false; + } + if (isNumber) { + value = Number(value); + variance = Number(variance) + (Number(value) - Number(mean)) * (Number(value) - Number(mean)); + n++; + } + i++; + } + if (n > 0) + variance = variance / n; + else + variance = NaN; + return variance; + } +); + +SnapExtensions.primitives.set( + 'SciS_propertiesoftable(selection,table,x,y)', + function (selection, table, x, y) { + x = Number(x); + y = Number(y); + var xmin, xmax, ymin, ymax, meanx, meany, cov, corr, varx, vary, i, valx, valy, sx, sy; + if (table.contents.length < 1) + return "bad data"; + xmin = Number(table.at(1).at(x)); + xmax = xmin; + ymin = Number(table.at(1).at(y)); + ymax = ymin; + meanx = xmin; + meany = ymin; + i = 2; + while (i <= table.length()) { + valx = Number(table.at(i).at(x)); + valy = Number(table.at(i).at(y)); + if (valx < xmin) + xmin = valx; + if (valx > xmax) + xmax = valx; + if (valy < ymin) + ymin = valy; + if (valy > ymax) + ymax = valy; + meanx = Number(meanx) + valx; + meany = Number(meany) + valy; + i++; + } + meanx = meanx / (i - 1); + meany = meany / (i - 1); + if (selection === "ranges") + return new List([xmin, xmax, ymin, ymax]); + + i = 1; + cov = 0; + corr = 0; + varx = 0; + vary = 0; + while (i <= table.length()) { + valx = Number(table.at(i).at(x)); + valy = Number(table.at(i).at(y)); + cov = Number(cov) + (valx - meanx) * (valy - meany); + varx = Number(varx) + (valx - meanx) * (valx - meanx); + vary = Number(vary) + (valy - meany) * (valy - meany); + i++; + } + + sx = Math.sqrt(varx); + sy = Math.sqrt(vary); + corr = cov / (sx * sy); + cov = cov / (i - 1); + if (selection === "covariance") + return cov; + if (selection === "correlation") + return corr; + return "unknown"; + } +); + + +SnapExtensions.primitives.set( + 'SciS_importCSVdata(data)', + function (data) { + var maxColumns = 0, help; + for (var i = 1; i <= data.length(); i++) + { + if (data.at(i) instanceof List) + if (data.at(i).length() > maxColumns) + maxColumns = data.at(i).length(); + } + for (var i = 1; i <= data.length(); i++) { + if (data.at(i) instanceof List) { + for (var j = data.at(i).length() + 1; j <= maxColumns; j++) + data.at(i).add(); + } else { + help = data.at(i); + data.put(new List(), i); + data.at(i).add(help); + for (var j = data.at(i).length() + 1; j <= maxColumns; j++) + data.at(i).add(); + } + } + return data; + } +); + +SnapExtensions.primitives.set( + 'SciS_groupeddata(aTable,compaircolumn,operation,groupcolumn)', + function (aTable, compaircolumn, operation, groupcolumn) { + compaircolumn = Number(compaircolumn); + groupcolumn = Number(groupcolumn); + var min, max, sum, mean, n, result, i, value, oldgroup, newgroup, stored = false; + + function isNumber(val) { + var ok, k, c; + if (typeof (val) === "number") + ok = true; + else { + if (typeof (val) === "string") { + ok = true; + k = 0; + while ((k < val.length) && ok) { + c = val.charAt(k); + if ((c < '0') || (c > '9')) + if ((c !== 'E') && (c !== 'e') && (c !== '+') && (c !== '-') && (c !== '.') && (c !== ',')) + ok = false; + k++; + } + } else + ok = false; + } + return ok; + } + + result = new List(); + result.add(new List(['value', operation])); + if (aTable.contents.length === 0) + return result; + + newgroup = aTable.at(1).at(groupcolumn); + if (isNumber(newgroup)) + newgroup = Number(newgroup); + oldgroup = newgroup; + value = aTable.at(1).at(compaircolumn); + if (isNumber(value)) { + value = Number(value); + sum = value; + } else + sum = "-"; + min = value; + max = value; + n = 1; + i = 2; + while (i <= aTable.length()) { + stored = false; + newgroup = aTable.at(i).at(groupcolumn); + if (isNumber(newgroup)) + newgroup = Number(newgroup); + value = aTable.at(i).at(compaircolumn); + if (isNumber(value)) + value = Number(value); + if (isNumber(newgroup)) + newgroup = Number(newgroup); + if (newgroup === oldgroup) { + if (min > value) + min = value; + if (max < value) + max = value; + if (isNumber(value) && isNumber(sum)) + sum = Number(sum) + Number(value); + else + sum = "-"; + n++; + } else { + if (operation === 'min') + result.add(new List([oldgroup, min])); + if (operation === 'max') + result.add(new List([oldgroup, max])); + if (operation === 'number') + result.add(new List([oldgroup, n])); + if (operation === 'sum') + result.add(new List([oldgroup, sum])); + if (operation === 'mean') + if (isNumber(sum)) + result.add(new List([oldgroup, 1.0 * sum / n])); + else + result.add(new List([oldgroup, "-"])); + min = value; + max = value; + if (isNumber(value)) + sum = value; + else + sum = "-"; + n = 1; + oldgroup = newgroup; + stored = true; + } + i++; + } + if (!stored) { + if (operation === 'min') + result.add(new List([oldgroup, min])); + if (operation === 'max') + result.add(new List([oldgroup, max])); + if (operation === 'number') + result.add(new List([oldgroup, n])); + if (operation === 'sum') + result.add(new List([oldgroup, sum])); + if (operation === 'mean') + if (isNumber(sum)) + result.add(new List([oldgroup, 1.0 * sum / n])); + else + result.add(new List([oldgroup, "-"])); + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_subsection(data,begin,end)', + function (data, begin, end) { + var x, y, x1 = begin.at(1), y1 = begin.at(2), x2 = end.at(1), y2 = end.at(2), row, result = new List(); + y = y1; + while ((y <= y2) && (y <= data.length())) { + x = x1; + row = new List(); + while ((x <= x2) && (x <= data.at(1).length())) { + row.add(data.at(y).at(x)); + x++; + } + result.add(row); + y++; + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_subsectionImage(data,begin,end,width,height)', + function (data, begin, end, width, height) { + var x, y, x1 = Number(begin.at(1)), y1 = Number(begin.at(2)), x2 = Number(end.at(1)), y2 = Number(end.at(2)), result = new List(); + width = Number(width); + height = Number(height); + y = y1; + while ((y <= y2) && (y <= height)) { + x = x1; + while ((x <= x2) && (x <= width)) { + result.add(data.at((y - 1) * width + x)); + x++; + } + y++; + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_k-means-clustering(k,data)', + function (k, data) { + + function distanceBetween(p1, p2) { + var result = 0; + for (var i = 1; i <= dimension; i++) + result = result + (p1.at(i) - p2.at(i)) * (p1.at(i) - p2.at(i)); + return Math.sqrt(result); + } + + function buildClusters() { + var minDist, dist, nearestCenter; + anyChanges = false; + for (var i = 1; i <= data.length(); i++) { + minDist = 1000000000; + nearestCenter = 0; + for (var n = 1; n <= k; n++) { + dist = distanceBetween(data.at(i), centers.at(n)); + if (dist < minDist) { + nearestCenter = n; + minDist = dist; + } + } + if (data.at(i).at(dimension + 1) != nearestCenter) { + data.at(i).put(nearestCenter, dimension + 1); + anyChanges = true; + } + } + } + + function adjustCenters() { + var sum, n; + for (var i = 1; i <= k; i++) { //for all centers + for (var j = 1; j <= dimension; j++) { //for all dimensions + sum = 0; + n = 0; + for (var m = 1; m <= data.length(); m++) { //for all points + if (data.at(m).at(dimension + 1) === i) { + n++; + sum = sum + data.at(m).at(j); + } + } + if (n > 0) { + centers.at(i).put(1.0 * sum / n, j); + } + } + } + } + + var dimension = data.at(1).length(), minmax = new List(), min, max, value, centers = new List(), center, anyChanges, loops = 0; + k = Number(k); + //add cluster number 0 to data + for (var i = 1; i <= data.length(); i++) { + data.at(i).add(0); + } + //calculate min and max for all columns + for (var i = 1; i <= dimension; i++) { + min = 10000000; + max = -min; + for (var n = 1; n <= data.length(); n++) { + value = Number(data.at(n).at(i)); + if (min > value) { + min = value; + } + if (max < value) { + max = value; + } + } + minmax.add(new List([min, max])); + } + //choose k random centers + for (var i = 1; i <= k; i++) { + center = new List(); + for (var n = 1; n <= dimension; n++) + center.add(Math.random() * (minmax.at(n).at(2) - minmax.at(n).at(1)) + minmax.at(n).at(1)); + center.add(i); + centers.add(center); + } + //run till no changes are made, max 100 loops + anyChanges = true; + loops = 0; + while (anyChanges && (loops < 100)) { + loops++; + buildClusters(); + adjustCenters(); + } + return data; + } +); + +SnapExtensions.primitives.set( + 'SciS_LevenshteinDistance(s1,s2)', + function (s1, s2) { + + function min(vector) { + var m = 10000000, i = 1; + while (i <= vector.length()) { + if (m > vector.at(i)) + m = vector.at(i); + i++; + } + return m; + } + + var lengthS1 = s1.length, lengthS2 = s2.length, D = new List(), line, result; + //construct empty matrix + for (var i = 0; i <= lengthS2; i++) { + line = new List(); + for (var j = 0; j <= lengthS1; j++) + line.add(""); + D.add(line); + } + for (var i = 0; i <= lengthS1; i++) + D.at(1).put(i, i + 1); + for (var i = 0; i <= lengthS2; i++) + D.at(i + 1).put(i, 1); + //fill matrix + for (var i = 2; i <= lengthS2 + 1; i++) { + for (var j = 2; j <= lengthS1 + 1; j++) { + if (s1.charAt(j - 1) === s2.charAt(i - 1)) + D.at(i).put(min(new List([D.at(i - 1).at(j - 1), D.at(i - 1).at(j - 1) + 1, D.at(i - 1).at(j) + 1, D.at(i).at(j - 1) + 1])), j); + else + D.at(i).put(min(new List([D.at(i - 1).at(j - 1) + 1, D.at(i - 1).at(j) + 1, D.at(i).at(j - 1) + 1])), j); + } + } + return D.at(lengthS2 + 1).at(lengthS1 + 1); + } +); + +SnapExtensions.primitives.set( + 'SciS_columncopy(data,cols,start,stop)', + function (data, cols, start, stop) { + var row; + result = new List(); + for (var i = start; i <= stop; i++) { + row = new List(); + for (var n = 1; n <= cols.length(); n++) + row.add(data.at(i).at(cols.at(n))); + result.add(row); + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_DBSCAN(data,r,minMembers)', + function (data, r, minMembers) { + function distance(p1, p2) { + var result = 0; + for (var i = 1; i <= dim; i++) { + result = result + (p1.at(i) - p2.at(i)) * (p1.at(i) - p2.at(i)); + } + ; + return Math.sqrt(result); + } + + function neighboursOf(p) { + var result = new List(); + for (var i = 1; i <= data.length(); i++) { + if ((p != data.at(i)) && (distance(p, data.at(i)) <= r)) + result.add(data.at(i)); + } + return result; + } + + function expand(neighs) { + var p, newNeighbours; + for (var i = 1; i <= neighs.length(); i++) { + p = neighs.at(i); + if (Number(p.at(dim + 1)) === -1) { + p.put(0, dim + 1); //labeled as visited + newNeighbours = neighboursOf(p); + if (newNeighbours.length() >= minMembers) + for (var j = 1; j <= newNeighbours.length(); j++) + if (!neighs.contains(newNeighbours.at(j))) + neighs.add(newNeighbours.at(j)); + if (Number(p.at(dim + 1)) < 1) + p.put(clusterNr, dim + 1); + } + } + } + + var clusterNr = 0, n, point, dim = data.at(1).length() - 1, neighbours; + n = 1; + while (n <= data.length()) { + point = data.at(n); + if (Number(point.at(dim + 1)) === -1) { + point.put(0, dim + 1); //labeled as visited + neighbours = neighboursOf(point); + if (neighbours.length() < minMembers) + point.put(-2, dim + 1); //labeled as noise + else { + clusterNr++; + point.put(clusterNr, dim + 1); + expand(neighbours); + } + } + n++; + } + return data; + } +); + +SnapExtensions.primitives.set( + 'SciS_createVars(varNames,global,proc)', + function (varNames, global, proc) { + var ide = this.parentThatIsA(IDE_Morph); + for (var i = 1; i <= varNames.length(); i++) { + varName = varNames.at(i); + if (global && !proc.homeContext.variables.parentFrame.parentFrame.vars[varName]) + this.addVariable(varName, true); + if (!global && !proc.homeContext.variables.parentFrame.vars[varName]) + this.addVariable(varName, false); + } + ide.flushBlocksCache('variables'); // b/c of inheritance + ide.refreshPalette(); + } +); + +SnapExtensions.primitives.set( + 'SciS_addGraphToPlotpad(costume,ranges,offsets,lineattributes,aFunction,proc)', + function (costume, ranges, offsets, lineattributes, aFunction, proc) { + function xTOxp(x) { + return x0 + (x * diagramWidth / (xRight - xLeft)); + } + function yTOyp(y) { + return y0 - (y * diagramHeight / (yUpper - yLower)); + } + function xpTOx(xp) { + return (xp - x0) * (xRight - xLeft) / diagramWidth; + } + function ypTOy(yp) { + return (y0 - yp) * (yUpper - yLower) / diagramHeight; + } + function round(x, n) { + return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); + } + function randomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); + } + + function myFunction(f, x) { + if (f instanceof List) { + var grade = f.length(), result; + if (grade == 0) + return 0; + else if (grade == 1) + return Number(f.at(1)); + else { + result = Number(f.at(1)) * Number(x) + Number(f.at(2)); + for (var i = 3; i <= grade; i++) + result = result * Number(x) + Number(f.at(i)); + return result; + } + } else + return proc.reportAtomicMap(f, new List([x])).at(1); //copied from Snap!-code + } + + function plotFunction(f, r, g, b, ) { + var xpos, ypos, x, y, xpOld, ypOld, plottedDots = 0, missingDots = 0, style = 1, modus = 1; + //firstLineattribute=lineattributes.at(1).split(" ")[0]; + if (lineattributes.at(1).trim() == 'continuous') + style = 1; + else if (lineattributes.at(1).trim() == 'dashed') + style = 2; + else if (lineattributes.at(1).trim() == 'dash-dot') + style = 3; + else if (lineattributes.at(1).trim() == 'dot-dot') + style = 4; + ctx.beginPath(); + ctx.strokeStyle = new Color(r, g, b).toString(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.lineWidth = lineattributes.at(2); + xpOld = 0; + x = xpTOx(xpOld); + y = myFunction(f, x); + ypOld = yTOyp(y); + xpos = 1; + while (xpos <= diagramWidth) { + x = xpTOx(xpos); + y = myFunction(f, x); + ypos = yTOyp(y); + if (modus > 0) { + ctx.moveTo(xpOld + leftOffset, ypOld + upperOffset); + ctx.lineTo(xpos + leftOffset, ypos + upperOffset); + if (style > 1) + plottedDots++; + } else + missingDots++; + xpOld = xpos; + ypOld = ypos; + xpos = xpos + 1; + if (style == 2) { + if ((modus == 1) && (plottedDots > 3)) { + modus = 0; + plottedDots = 0; + missingDots = 0; + } else if ((modus == 0) && (missingDots > 2)) { + modus = 1; + plottedDots = 0; + missingDots = 0; + } + } + if (style == 3) { + if ((modus == 1) && (plottedDots > 3)) { + modus = 0; + plottedDots = 0; + missingDots = 0; + } else if ((modus == 0) && (missingDots > 0)) { + modus = 2; + plottedDots = 0; + missingDots = 0; + } else if ((modus == 2) && (plottedDots > 0)) { + modus = -1; + plottedDots = 0; + missingDots = 0; + } else if ((modus == -1) && (missingDots > 0)) { + modus = 1; + plottedDots = 0; + missingDots = 0; + } + } + if (style == 4) { + if ((modus == 1) && (plottedDots > 0)) { + modus = 0; + plottedDots = 0; + missingDots = 0; + } else if ((modus == 0) && (missingDots > 0)) { + modus = 1; + plottedDots = 0; + missingDots = 0; + } + } + } + ctx.closePath(); + //ctx.fill(); + ctx.stroke(); + + } + + // to ensure the correct type "Number" to number parameters + var xLeft = Number(ranges.at(1)), xRight = Number(ranges.at(2)), yLower = Number(ranges.at(3)), yUpper = Number(ranges.at(4)), + leftOffset = Number(offsets.at(1)), rightOffset = Number(offsets.at(2)), upperOffset = Number(offsets.at(3)), + lowerOffset = Number(offsets.at(4)); + + var ctx = costume.contents.getContext('2d'); + var rightCostumeEdge = costume.contents.width, lowerCostumeEdge = costume.contents.height, + diagramWidth = rightCostumeEdge - leftOffset - rightOffset, diagramHeight = lowerCostumeEdge - lowerOffset - upperOffset; + var x0 = xLeft / (xLeft - xRight) * diagramWidth, y0 = yUpper / (yUpper - yLower) * diagramHeight; + + function defineClip() { + ctx.beginPath(); + ctx.linewidth = 0; + ctx.strokeStyle = new Color(0, 0, 0); + ctx.rect(leftOffset, upperOffset, diagramWidth, diagramHeight); + ctx.closePath(); + ctx.clip(); + } + + ctx.save(); // SO WE CAN CLIP! + defineClip(); + plotFunction(aFunction, Number(lineattributes.at(3)), Number(lineattributes.at(4)), Number(lineattributes.at(5))); + ctx.restore(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_addNumericDataplotToPlotpad(costume,ranges,offsets,labels,lineattributes,dataattributes,data)', + function (costume, ranges, offsets, labels, lineattributes, dataattributes, data) { + // global variables + + var xLeft = Number(ranges.at(1)), xRight = Number(ranges.at(2)); + var yLower = Number(ranges.at(3)), yUpper = Number(ranges.at(4)); + var upperOffset = Number(offsets.at(3)), lowerOffset = Number(offsets.at(4)); + var leftOffset = Number(offsets.at(1)), rightOffset = Number(offsets.at(2)); + + var ctx = costume.contents.getContext('2d'); + var rightCostumeEdge = costume.contents.width, lowerCostumeEdge = costume.contents.height, + diagramWidth = rightCostumeEdge - leftOffset - rightOffset, diagramHeight = lowerCostumeEdge - lowerOffset - upperOffset; + var x0 = xLeft / (xLeft - xRight) * diagramWidth, y0 = yUpper / (yUpper - yLower) * diagramHeight; + + var lcolor = new Color(lineattributes.at(3), lineattributes.at(4), lineattributes.at(5)).toString(); + var mcolor = new Color(dataattributes.at(4), dataattributes.at(5), dataattributes.at(6)).toString(); + + // functions + + function xTOxp(x) { + return x0 + (x * diagramWidth / (xRight - xLeft)); + } + function yTOyp(y) { + return y0 - (y * diagramHeight / (yUpper - yLower)); + } + function xpTOx(xp) { + return (xp - x0) * (xRight - xLeft) / diagramWidth; + } + function ypTOy(yp) { + return (y0 - yp) * (yUpper - yLower) / diagramHeight; + } + function round(x, n) { + return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); + } + function randomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); + } + + function rainbow(f) { // RAINBOW COLOURS FROM RED (f=0) TO VIOLET (f=1) COURTESY OF + // https://www.instructables.com/id/How-to-Make-Proper-Rainbow-and-Random-Colors-With-/ + var angle = 300. * f, r, g, b; + if (angle < 60.) { + r = 255; + g = Math.floor(angle * 4.25 - 0.01); + b = 0; + } else if (angle < 120.) { + r = Math.floor((120 - angle) * 4.25 - 0.01); + g = 255; + b = 0; + } else if (angle < 180.) { + r = 0; + g = 255; + b = Math.floor((angle - 120) * 4.25 - 0.01); + } else if (angle < 240.) { + r = 0; + g = Math.floor((240 - angle) * 4.25 - 0.01); + b = 255; + } else if (angle < 300.) { + r = Math.floor((angle - 240) * 4.25 - 0.01); + g = 0; + b = 255; + } else { + r = 255; + g = 0; + b = Math.floor((360 - angle) * 4.25 - 0.01); + } + return new Color(r, g, b).toString(); + } + + function plotData() { + var linewidth = lineattributes.at(2), linestyle = 1, datawidth = dataattributes.at(2), datastyle = 1; + var arraydata = data.asArray(), xpos, ypos, xpOld, ypOld, w, i, connected = dataattributes.at(3); + var n = arraydata.length, frac = 0.; + if (lineattributes.at(1).trim() == 'continuous') + linestyle = 1; + else if (lineattributes.at(1).trim() == 'dashed') + linestyle = 2; + else if (lineattributes.at(1).trim() == 'dash-dot') + linestyle = 3; + else if (lineattributes.at(1).trim() == 'dot-dot') + linestyle = 4; + else if (lineattributes.at(1).trim() == 'rainbow') + linestyle = 5; + else if (lineattributes.at(1).trim() == 'inverse-rainbow') + linestyle = 6; + else if (lineattributes.at(1).trim() == 'none') + linestyle = 0; + if (dataattributes.at(1).trim() == 'o circle') + datastyle = 1; + else if (dataattributes.at(1).trim() == 'o') + datastyle = 1; + else if (dataattributes.at(1).trim() == 'circle') + datastyle = 1; + else if (dataattributes.at(1).trim() == '._point') + datastyle = 2; + else if (dataattributes.at(1).trim() == '.') + datastyle = 2; + else if (dataattributes.at(1).trim() == 'point') + datastyle = 2; + else if (dataattributes.at(1).trim() == '*_asterix') + datastyle = 3; + else if (dataattributes.at(1).trim() == '*') + datastyle = 3; + else if (dataattributes.at(1).trim() == 'asterix') + datastyle = 3; + else if (dataattributes.at(1).trim() == '+_plus') + datastyle = 4; + else if (dataattributes.at(1).trim() == '+') + datastyle = 4; + else if (dataattributes.at(1).trim() == 'plus') + datastyle = 4; + else if (dataattributes.at(1).trim() == 'x_ex') + datastyle = 5; + else if (dataattributes.at(1).trim() == 'x') + datastyle = 5; + else if (dataattributes.at(1).trim() == 'ex') + datastyle = 5; + else if (dataattributes.at(1).trim() == 'square') + datastyle = 6; + else if (dataattributes.at(1).trim() == 'triangle') + datastyle = 7; + else if (dataattributes.at(1).trim() == 'none') + datastyle = 0; + ctx.lineWidth = linewidth; + if (linestyle == 2) { + ctx.setLineDash([10, 5]); + } else if (linestyle == 3) { + ctx.setLineDash([10, 2, 1, 2]); + } else if (linestyle == 4) { + ctx.setLineDash([1, 2]); + } else { + ctx.setLineDash([]); + } + + // PLOT LINES + if ((linestyle > 0) && connected) + { + ctx.beginPath(); + ctx.strokeStyle = lcolor; + ctx.fillStyle = lcolor; + if (n > 0) { + xpOld = xTOxp(arraydata[0].at(1)); + ypOld = yTOyp(arraydata[0].at(2)); + } + i = 0; + while (i < n) + { + xpos = xTOxp(arraydata[i].at(1)); + ypos = yTOyp(arraydata[i].at(2)); + if (i > 0) + { + frac = (i + 0.) / (n + 0.); + if (linestyle == 5) + ctx.strokeStyle = rainbow(frac); + ctx.moveTo(xpOld + leftOffset, ypOld + upperOffset); + ctx.lineTo(xpos + leftOffset, ypos + upperOffset); + if (linestyle == 5 || linestyle == 6) { + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + ctx.beginPath(); + } + } + xpOld = xpos; + ypOld = ypos; + i = i + 1; + } + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + ctx.setLineDash([]); + + // PLOT MARKERS + if (datastyle > 0) + { + ctx.strokeStyle = lcolor; + ctx.fillStyle = mcolor; + if (arraydata.length > 0) { + xpOld = xTOxp(arraydata[0].at(1)); + ypOld = yTOyp(arraydata[0].at(2)); + } + i = 0; + while (i < arraydata.length) + { + ctx.beginPath(); + xpos = xTOxp(arraydata[i].at(1)); + ypos = yTOyp(arraydata[i].at(2)); + if (datastyle == 1) + ctx.arc(xpos + leftOffset, ypos + upperOffset, datawidth / 2, 0, 6.28318531); + else if (datastyle == 2) + ctx.arc(xpos + leftOffset, ypos + upperOffset, 2, 0, 6.28318531); + else if (datastyle == 3) + { + ctx.font = "" + 2 * datawidth * 3 + "px sans-serif"; + w = ctx.measureText("*").width; + ctx.fillText("*", xpos + leftOffset - w / 2, ypos + upperOffset + datawidth / 2); + } else if (datastyle == 4) + { + ctx.font = "" + datawidth * 3 + "px sans-serif"; + w = ctx.measureText("+").width; + ctx.fillText("+", xpos + leftOffset - w / 2, ypos + upperOffset + datawidth / 2); + } else if (datastyle == 5) + { + ctx.font = "" + datawidth * 3 + "px sans-serif"; + w = ctx.measureText("X").width; + ctx.fillText("X", xpos + leftOffset - w / 2, ypos + upperOffset + datawidth / 2); + } else if (datastyle == 6) + { + ctx.fillRect(xpos + leftOffset - datawidth / 2, ypos + upperOffset - datawidth / 2, datawidth, datawidth); + ctx.strokeRect(xpos + leftOffset - datawidth / 2, ypos + upperOffset - datawidth / 2, datawidth, datawidth); + } else if (datastyle == 7) + { + ctx.moveTo(xpos + leftOffset, ypos + upperOffset - datawidth / 2); + ctx.lineTo(xpos + leftOffset - datawidth / 2, ypos + upperOffset + datawidth / 2); + ctx.lineTo(xpos + leftOffset + datawidth / 2, ypos + upperOffset + datawidth / 2); + ctx.lineTo(xpos + leftOffset, ypos + upperOffset - datawidth / 2); + } + ctx.closePath(); + ctx.fill(); + ctx.stroke() + xpOld = xpos; + ypOld = ypos; + i = i + 1; + } + } + } + + function defineClip() { + ctx.beginPath(); + ctx.linewidth = 0; + ctx.strokeStyle = new Color(0, 0, 0); + ctx.rect(leftOffset, upperOffset, diagramWidth, diagramHeight); + ctx.closePath(); + ctx.clip(); + } + + ctx.save(); // SO WE CAN CLIP! + defineClip(); + plotData(); + ctx.restore(); + + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_addMixedDataplotToPlotpad(costume,ranges,offsets,labels,lineattributes,dataattributes,data)', + function (costume, ranges, offsets, labels, lineattributes, dataattributes, data) { + function xTOxp(x) { + return x0 + (x * diagramWidth / (xRight - xLeft)); + } + function yTOyp(y) { + return y0 - (y * diagramHeight / (yUpper - yLower)); + } + function xpTOx(xp) { + return (xp - x0) * (xRight - xLeft) / diagramWidth; + } + function ypTOy(yp) { + return (y0 - yp) * (yUpper - yLower) / diagramHeight; + } + function round(x, n) { + return Math.round(x * Math.pow(10, n)) / Math.pow(10, n); + } + function randomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); + } + + function rainbow(f) { // RAINBOW COLOURS FROM RED (f=0) TO VIOLET (f=1) COURTESY OF + //https://www.instructables.com/id/How-to-Make-Proper-Rainbow-and-Random-Colors-With-/ + var angle = 300. * f, r, g, b; + if (angle < 60.) { + r = 255; + g = Math.floor(angle * 4.25 - 0.01); + b = 0; + } else if (angle < 120.) { + r = Math.floor((120 - angle) * 4.25 - 0.01); + g = 255; + b = 0; + } else if (angle < 180.) { + r = 0; + g = 255; + b = Math.floor((angle - 120) * 4.25 - 0.01); + } else if (angle < 240.) { + r = 0; + g = Math.floor((240 - angle) * 4.25 - 0.01); + b = 255; + } else if (angle < 300.) { + r = Math.floor((angle - 240) * 4.25 - 0.01); + g = 0; + b = 255; + } else { + r = 255; + g = 0; + b = Math.floor((360 - angle) * 4.25 - 0.01); + } + return new Color(r, g, b).toString(); + } + + function plotData() { + var i = 0, linewidth = lineattributes.at(2), linestyle = 0, datawidth = dataattributes.at(2), datastyle = 1, dx, x; + var arraydata = data.asArray(), xpos, ypos, xpOld, ypOld, w; + if (lineattributes.at(1).trim() == 'continuous') + linestyle = 1; + else if (lineattributes.at(1).trim() == 'dashed') + linestyle = 2; + else if (lineattributes.at(1).trim() == 'dash-dot') + linestyle = 3; + else if (lineattributes.at(1).trim() == 'dot-dot') + linestyle = 4; + else if (lineattributes.at(1).trim() == 'rainbow') + linestyle = 5; + connected = linestyle > 0; + if (dataattributes.at(1).trim() == 'o circle') + datastyle = 1; + else if (dataattributes.at(1).trim() == '._point') + datastyle = 2; + else if (dataattributes.at(1).trim() == '*_asterix') + datastyle = 3; + else if (dataattributes.at(1).trim() == '+_plus') + datastyle = 4; + else if (dataattributes.at(1).trim() == 'x_ex') + datastyle = 5; + else if (dataattributes.at(1).trim() == 'square') + datastyle = 6; + else if (dataattributes.at(1).trim() == 'triangle') + datastyle = 7; + else if (dataattributes.at(1).trim() == 'none') + datastyle = 8; + else + datastyle = 1; + ctx.strokeStyle = new Color(lineattributes.at(3), lineattributes.at(4), lineattributes.at(5)).toString(); + ctx.fillStyle = new Color(dataattributes.at(4), dataattributes.at(5), dataattributes.at(6)).toString(); + ctx.lineWidth = linewidth; + if (linestyle == 2) { + ctx.setLineDash([10, 10]); + } else if (linestyle == 3) { + ctx.setLineDash([10, 5, 2, 5]); + } else if (linestyle == 4) { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + if (arraydata.length > 0) { + dx = 0.9 * (xRight - xLeft) / (arraydata.length - 1); + x = xLeft + 0.1 * dx; + xpOld = xTOxp(x); + ypOld = yTOyp(arraydata[0].at(2)); + } + while (i < arraydata.length) { + xpos = xTOxp(x); + ypos = yTOyp(arraydata[i].at(2)); + if (connected && i > 0) { + ctx.beginPath(); + if (linestyle == 5) + ctx.strokeStyle = rainbow((i + 0.) / (arraydata.length + 0.)); + ctx.moveTo(xpOld + leftOffset, ypOld + upperOffset); + ctx.lineTo(xpos + leftOffset, ypos + upperOffset); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + ctx.beginPath(); + if (datastyle == 1) { + ctx.arc(xpos + leftOffset, ypos + upperOffset, datawidth / 2, 0, 6.283185307179586476925286766559); + } + if (datastyle == 2) { + ctx.arc(xpos + leftOffset, ypos + upperOffset, 2, 0, 6.283185307179586476925286766559); + } + if (datastyle == 3) { + ctx.font = "" + datawidth + "px sans-serif"; + w = ctx.measureText("*").width; + ctx.fillText("*", xpos + leftOffset - w / 2, ypos + upperOffset + datawidth / 2); + } + if (datastyle == 4) { + ctx.font = "" + datawidth + "px sans-serif"; + w = ctx.measureText("+").width; + ctx.fillText("+", xpos + leftOffset - w / 2, ypos + upperOffset + datawidth / 2); + } + if (datastyle == 5) { + ctx.font = "" + datawidth + "px sans-serif"; + w = ctx.measureText("X").width; + ctx.fillText("X", xpos + leftOffset - w / 2, ypos + upperOffset + datawidth / 2); + } + if (datastyle == 6) { + ctx.fillRect(xpos + leftOffset - datawidth / 2, ypos + upperOffset - datawidth / 2, datawidth, datawidth); + ctx.strokeRect(xpos + leftOffset - datawidth / 2, ypos + upperOffset - datawidth / 2, datawidth, datawidth); + } + if (datastyle == 7) { + ctx.moveTo(xpos + leftOffset, ypos + upperOffset - datawidth / 2); + ctx.lineTo(xpos + leftOffset - datawidth / 2, ypos + upperOffset + datawidth / 2); + ctx.lineTo(xpos + leftOffset + datawidth / 2, ypos + upperOffset + datawidth / 2); + ctx.lineTo(xpos + leftOffset, ypos + upperOffset - datawidth / 2); + } + if (datastyle == 0) { + ctx.moveTo(xpos + leftOffset, ypos + upperOffset); + ctx.lineTo(xpos + leftOffset, ypos + upperOffset + 1); + } + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + xpOld = xpos; + ypOld = ypos; + i = i + 1; + x = x + dx; + } + ctx.setLineDash([]); + } + +// to ensure the correct type "Number" to number parameters + xLeft = Number(ranges.at(1)); + xRight = Number(ranges.at(2)); + yLower = Number(ranges.at(3)); + yUpper = Number(ranges.at(4)); + upperOffset = Number(offsets.at(2)); + lowerOffset = Number(offsets.at(3)); + leftOffset = Number(offsets.at(1)); + + var ctx = costume.contents.getContext('2d'); + var rightCostumeEdge = costume.contents.width, lowerCostumeEdge = costume.contents.height, + diagramWidth = rightCostumeEdge - leftOffset, diagramHeight = lowerCostumeEdge - lowerOffset - upperOffset; + var x0 = xLeft / (xLeft - xRight) * diagramWidth, y0 = yUpper / (yUpper - yLower) * diagramHeight; + + plotData(); + + return costume; + + } +); + +SnapExtensions.primitives.set( + 'SciS_addHistogramToPlotpad(costume,ranges,offsets,lineattributes,data,datapointattributes)', + function (costume, ranges, offsets, lineattributes, data, datapointattributes) { + // functions + + function xTOxp(x) { + return leftOffset + (x - xLeft) * diagramWidth / (xRight - xLeft); + } + function yTOyp(y) { + return upperOffset + (yUpper - y) * diagramHeight / (yUpper - yLower); + } + function xpTOx(xp) { + return xLeft + (xRight - xLeft) * (xp - leftOffset) / diagramWidth; + } + function ypTOy(yp) { + return yUpper - (yUpper - yLower) * (yp - upperOffset) / diagramHeight; + } + + function plotHistogram() { + var linewidth = lineattributes.at(2), linestyle = 1, yZero = yTOyp(0.); + var arraydata = data.asArray(), xp, yp, i, xold; + var n = arraydata.length; + var lcolor = new Color(lineattributes.at(3), lineattributes.at(4), lineattributes.at(5)).toString(); + var x = arraydata[0].at(1); + y = arraydata[0].at(2); + var dx = arraydata[1].at(1) - x; + if (n == 0) + return; + if (lineattributes.at(1).trim() == 'continuous') + linestyle = 1; + else if (lineattributes.at(1).trim() == 'dashed') + linestyle = 2; + else if (lineattributes.at(1).trim() == 'dash-dot') + linestyle = 3; + else if (lineattributes.at(1).trim() == 'dot-dot') + linestyle = 4; + else if (lineattributes.at(1).trim() == 'none') + return; + ctx.lineWidth = linewidth; + if (linestyle == 2) { + ctx.setLineDash([10, 5]); + } else if (linestyle == 3) { + ctx.setLineDash([10, 2, 1, 2]); + } else if (linestyle == 4) { + ctx.setLineDash([1, 2]); + } else { + ctx.setLineDash([]); + } + ctx.beginPath(); + ctx.strokeStyle = lcolor; + ctx.fillStyle = new Color(datapointattributes.at(4), datapointattributes.at(5), datapointattributes.at(6)).toString(); + ; + xp = xTOxp(x - 0.5 * dx); + yp = yTOyp(0.); + ctx.moveTo(xp, yp); + i = 0; + while (i < n) + { + xold = xp; + x = arraydata[i].at(1); + y = arraydata[i].at(2); + yp = yTOyp(y); + ctx.moveTo(xp, yZero); + ctx.lineTo(xp, yp); + xp = xTOxp(x + 0.5 * dx); + ctx.lineTo(xp, yp); + ctx.lineTo(xp, yZero); + ctx.lineTo(xold, yZero); + i = i + 1; + } + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + +// to ensure the correct type "Number" to number parameters + xLeft = Number(ranges.at(1)); + xRight = Number(ranges.at(2)); + yLower = Number(ranges.at(3)); + yUpper = Number(ranges.at(4)); + leftOffset = Number(offsets.at(1)); + rightOffset = Number(offsets.at(2)); + upperOffset = Number(offsets.at(3)); + lowerOffset = Number(offsets.at(4)); + + var ctx = costume.contents.getContext('2d'); + var rightCostumeEdge = costume.contents.width; + var lowerCostumeEdge = costume.contents.height; + var diagramWidth = rightCostumeEdge - leftOffset - rightOffset; + var diagramHeight = lowerCostumeEdge - lowerOffset - upperOffset; + + function defineClip() { + ctx.beginPath(); + ctx.linewidth = 0; + ctx.strokeStyle = new Color(0, 0, 0); + ctx.rect(leftOffset, upperOffset, diagramWidth, diagramHeight); + ctx.closePath(); + ctx.clip(); + } + + ctx.save(); // SO WE CAN CLIP! + defineClip(); + plotHistogram(); + ctx.restore(); + + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_addAxesAndScalesToPlotpad(costume,scaleattributes,labels,offsets,ranges,plotcolors)', + function (costume, scaleattributes, labels, offsets, ranges, plotcolors) { + // global variables + + var ctx = costume.contents.getContext('2d'); + var xLeft = Number(ranges.at(1)), xRight = Number(ranges.at(2)), yLower = Number(ranges.at(3)), yUpper = Number(ranges.at(4)); + var leftOffset = Number(offsets.at(1)), rightOffset = Number(offsets.at(2)); + var upperOffset = Number(offsets.at(3)), lowerOffset = Number(offsets.at(4)); + var xprecision = Number(scaleattributes.at(1)), xtextheight = Number(scaleattributes.at(3)), xIntervals = Number(scaleattributes.at(5)); + var yprecision = Number(scaleattributes.at(2)), ytextheight = Number(scaleattributes.at(4)), yIntervals = Number(scaleattributes.at(6)); + var xstart = Number(scaleattributes.at(7)), xstep = Number(scaleattributes.at(9)), xscaling = Number(scaleattributes.at(11)); + var ystart = Number(scaleattributes.at(8)), ystep = Number(scaleattributes.at(10)), yscaling = Number(scaleattributes.at(12)); + var ticlength = Number(scaleattributes.at(13)); + var xminitic = Number(scaleattributes.at(14)), yminitic = Number(scaleattributes.at(15)); + var xgrid = scaleattributes.at(16), ygrid = scaleattributes.at(17); + var xcentered = scaleattributes.at(18), ycentered = scaleattributes.at(19); + var showXscale = scaleattributes.at(20), showYscale = scaleattributes.at(21); + var border = Number(scaleattributes.at(22)); + var rightCostumeEdge = costume.contents.width, lowerCostumeEdge = costume.contents.height; + + var diagramWidth = rightCostumeEdge - leftOffset - rightOffset, diagramHeight = lowerCostumeEdge - lowerOffset - upperOffset; + + var rback = Number(plotcolors.at(3)), gback = Number(plotcolors.at(4)), bback = Number(plotcolors.at(5)); + var rfront = Number(plotcolors.at(8)), gfront = Number(plotcolors.at(9)), bfront = Number(plotcolors.at(10)); + +// functions + + function xTOxp(x) { + return leftOffset + (x - xLeft) * diagramWidth / (xRight - xLeft); + } // x0+(x*diagramWidth/(xRight-xLeft));} + function yTOyp(y) { + return upperOffset + (yUpper - y) * diagramHeight / (yUpper - yLower); + } // 0-(y*diagramHeight/(yUpper-yLower));} + function xpTOx(xp) { + return xLeft + (xRight - xLeft) * (xp - leftOffset) / diagramWidth; + } // (xp-x0)*(xRight-xLeft)/diagramWidth;} + function ypTOy(yp) { + return yUpper - (yUpper - yLower) * (yp - upperOffset) / diagramHeight; + } // (y0-yp)*(yUpper-yLower)/diagramHeight;} + + var conv = [ + ["Α", "\u0391"], ["Β", "\u0392"], ["Γ", "\u0393"], ["Δ", "\u0394"], ["Ε", "\u0395"], + ["Ζ", "\u0396"], ["Η", "\u0397"], ["Θ", "\u0398"], ["Ι", "\u0399"], ["Κ", "\u039A"], + ["Λ", "\u039B"], ["Μ", "\u039C"], ["Ν", "\u039D"], ["Ξ", "\u039E"], ["Ο", "\u039F"], + ["Π", "\u03A0"], ["Ρ", "\u03A1"], ["Σ", "\u03A2"], ["Τ", "\u03A3"], ["Υ", "\u03A4"], + ["ϒ", "\u03A5"], ["Φ", "\u03A6"], ["Χ", "\u03A7"], ["Ψ", "\u03A8"], ["Ω", "\u03A9"], + ["α", "\u03B1"], ["β", "\u03B2"], ["γ", "\u03B3"], ["δ", "\u03B4"], ["ε", "\u03B5"], + ["ζ", "\u03B6"], ["η", "\u03B7"], ["θ", "\u03B8"], ["ι", "\u03B9"], ["κ", "\u03BA"], + ["λ", "\u03BB"], ["μ", "\u03BC"], ["ν", "\u03BD"], ["ξ", "\u03BE"], ["ο", "\u03BF"], + ["π", "\u03C0"], ["ρ", "\u03C1"], ["ς", "\u03C2"], ["σ", "\u03C3"], ["τ", "\u03C4"], + ["υ", "\u03C5"], ["φ", "\u03C6"], ["χ", "\u03C7"], ["ψ", "\u03C8"], ["ω", "\u03C9"], + ["ϑ", "\u03D1"], ["ϖ", "\u03D6"], ["€", "\u20AC"], ["£", "\xA3"], ["¥", "\xA5"], + ["°", "\xB0"], ["±", "\xB1"], ["²", "\xB2"], ["³", "\xB3"], ["µ", "\xB5"], + ["×", "\xD7"], ["÷", "\xF7"], ["∂", "\u2202"], ["∇", "\u2207"], ["∝", "\u221D"], + ["∞", "\u221E"]]; + + function special(s) { + var a; + for (var i = 0; i < conv.length; i++) { + a = conv[i]; + s = s.replaceAll(a[0], a[1]); + } + return s; + } + + function draw_title() + { + ctx.fillStyle = new Color(rfront, gfront, bfront).toString(); // 0,0,0).toString() + var label = special(labels.at(1)); + var h = Number(labels.at(4)); + if (label.length > 0 && upperOffset > 0) { + ctx.font = "" + labels.at(4) + "px sans-serif"; + var w = ctx.measureText(label).width; + var yl = upperOffset / 2 + 0.4 * h; + if (ticlength < 0) + yl += ticlength / 2; + ctx.fillText(label, leftOffset + diagramWidth / 2 - w / 2, yl); + } + } + + function draw_xlabel() + { + var xl, yl, w; + var label = special(labels.at(2)); + var units = special(labels.at(7)); + var scaling = "" + xscaling.toPrecision(1); + var idx = scaling.indexOf("1e+"); + if (idx > -1) + scaling = scaling.replace("1e+", "10^"); + else { + idx = scaling.indexOf("1e"); + if (idx > -1) + scaling = scaling.replace("1e", "10^"); + } + ctx.fillStyle = new Color(rfront, gfront, bfront).toString(); // 0,0,0).toString() + if (xscaling < 0.99 || xscaling > 1.01) { + label += " / " + scaling; + if (units.length > 0) + label += " " + units; + } else if (units.length > 0) { + label += " [" + units + "]"; + } + ctx.font = "" + labels.at(5) + "px sans-serif"; + w = ctx.measureText(label).width; + if (ycentered) { + xl = leftOffset + diagramWidth - w; + yl = yTOyp(0.) - 1.5 * ticlength; + } else { + xl = leftOffset + diagramWidth / 2 - w / 2; + yl = upperOffset + diagramHeight + 3.2 * xtextheight; + if (ticlength < 0) + yl -= ticlength; + } + ctx.fillText(label, xl, yl); + // ctx.fillText("x,y,w,W="+xl.toFixed(0)+","+yl.toFixed(0)+","+w.toFixed(0)+","+label.length,20,20); + } + + function draw_ylabel(xl) + { + var yl, w; + var label = special(labels.at(3)); + var units = special(labels.at(8)); + var scaling = "" + yscaling.toPrecision(1); + var idx = scaling.indexOf("1e+"); + if (idx > -1) + scaling = scaling.replace("1e+", "10^"); + else { + idx = scaling.indexOf("1e"); + if (idx > -1) + scaling = scaling.replace("1e", "10^"); + } + ctx.fillStyle = new Color(rfront, gfront, bfront).toString(); // 0,0,0).toString() + if (yscaling < 0.99 || yscaling > 1.01) { + label += " / " + scaling; + if (units.length > 0) + label += " " + units; + } else if (units.length > 0) { + label += " [" + units + "]"; + } + ctx.font = "" + labels.at(6) + "px sans-serif"; + w = ctx.measureText(label).width; + if (xcentered) { + xl = xTOxp(0.) + 1.5 * ticlength; + yl = upperOffset + 0.2 * ytextheight; + ctx.fillText(label, xl, yl); + } else { + ctx.rotate(-Math.PI / 2); + yl = xl - ytextheight; + if (ticlength < 0) + yl += ticlength; + ctx.fillText(label, -w / 2 - lowerCostumeEdge / 2, yl); + ctx.rotate(Math.PI / 2); + } + } + + function draw_scales() + { + var w, text, x, y, xs, ys, xl, yl, xpos, ypos, xp, yp, dt, t, n, xtics, ytics, xp1, xp2, yp1, yp2, xpoff, ypoff, xx = leftOffset; + + // X-SCALES + xs = xstart; + x = xs * xscaling; + xp = xTOxp(x); + xpos = xp - leftOffset; + ctx.lineWidth = 1; + ctx.fillStyle = new Color(rfront, gfront, bfront).toString(); + ctx.strokeStyle = new Color(rfront, gfront, bfront).toString(); + ctx.font = "" + xtextheight + "px sans-serif"; + + yp1 = diagramHeight + upperOffset; + yp2 = upperOffset; + ypoff = 0.; + if (ycentered) { + yp1 = yTOyp(0.); + yp2 = yp1; + ypoff = ticlength; + } + dt = xstep * xscaling / (xminitic + 1); + n = 1; + xtics = Math.abs(xTOxp(x + dt) - xTOxp(x)) > 4 && xminitic > 0; + + // X-SCALES + if (showXscale) { + if (xtics) { // MINI-XTICS BEFORE THE FIRST XTIC + while (n <= xminitic) { + t = xTOxp(x - dt * n); + if (t > leftOffset && t < leftOffset + diagramWidth) { + ctx.moveTo(t, yp1 - ticlength / 2); + ctx.lineTo(t, yp1 + ypoff / 2); + if (!xcentered) { + ctx.moveTo(t, yp2 - ypoff / 2); + ctx.lineTo(t, yp2 + ticlength / 2); + } + } + n += 1; + } + } + + if (ycentered) { + yl = yTOyp(0.) + 1.2 * ticlength + xtextheight; + } else { + yl = upperOffset + diagramHeight + xtextheight * 1.3; + } + if (ticlength < 0) + yl -= ticlength; + while (xpos <= diagramWidth) { + if (xpos >= 0) { + text = xs.toFixed(xprecision); + w = ctx.measureText(text).width; + if (ygrid) { + ctx.moveTo(xp, upperOffset); + ctx.lineTo(xp, diagramHeight + upperOffset); + } + ctx.moveTo(xp, yp1 - ticlength); + ctx.lineTo(xp, yp1 + ypoff); + if (!xcentered) { + ctx.moveTo(xp, yp2 - ypoff); + ctx.lineTo(xp, yp2 + ticlength); + } + if (xtics) { + n = 1; + while (n <= xminitic) { + t = xTOxp(x + dt * n); + if (t > leftOffset && t < leftOffset + diagramWidth) { + ctx.moveTo(t, yp1 - ticlength / 2); + ctx.lineTo(t, yp1 + ypoff / 2); + if (!xcentered) { + ctx.moveTo(t, yp2 - ypoff / 2); + ctx.lineTo(t, yp2 + ticlength / 2); + } + } + n += 1; + } + } + if (xp > w && xp < rightCostumeEdge - w) + ctx.fillText(text, xp - w / 2, yl); + } + xs += xstep; + w = xs / xstep; + x = xs * xscaling; + xp = xTOxp(x); + xpos = xp - leftOffset; + } + } + + // Y-SCALES + if (showYscale) { + ctx.font = "" + ytextheight + "px sans-serif"; + ys = ystart; + y = ys * yscaling; + yp = yTOyp(y); + ypos = yp - upperOffset; + + xp1 = leftOffset; + xp2 = leftOffset + diagramWidth; + xpoff = 0; + if (xcentered) { + xp1 = xTOxp(0.); + xp2 = xp1; + xpoff = ticlength; + } + dt = ystep * yscaling / (yminitic + 1); + n = 1; + ytics = Math.abs(yTOyp(y + dt) - yTOyp(y)) > 4 && yminitic > 0; + + if (ytics) { // MINI-YTICS BEFORE THE FIRST YTIC + while (n <= yminitic) { + t = yTOyp(y - dt * n); + if (t > upperOffset && t < upperOffset + diagramHeight) { + ctx.moveTo(xp1 - xpoff / 2, t); + ctx.lineTo(xp1 + ticlength / 2, t); + if (!ycentered) { + ctx.moveTo(xp2 - ticlength / 2, t); + ctx.lineTo(xp2 + xpoff / 2, t); + } + } + n += 1; + } + } + + // ctx.textAlign = "right"; + while (ypos >= 0) { + if (ypos <= diagramHeight) { + text = ys.toFixed(yprecision); + w = ctx.measureText(text).width; + if (xgrid) { + ctx.moveTo(leftOffset, yp); + ctx.lineTo(diagramWidth + leftOffset, yp); + } + ctx.moveTo(xp1 - xpoff, yp); + ctx.lineTo(xp1 + ticlength, yp); + if (!ycentered) { + ctx.moveTo(xp2 - ticlength, yp); + ctx.lineTo(xp2 + xpoff, yp); + } + if (ytics) { + n = 1; + while (n <= yminitic) { + t = yTOyp(y + dt * n); + if (t > upperOffset && t < upperOffset + diagramHeight) { + ctx.moveTo(xp1 - xpoff / 2, t); + ctx.lineTo(xp1 + ticlength / 2, t); + if (!ycentered) { + ctx.moveTo(xp2 - ticlength / 2, t); + ctx.lineTo(xp2 + xpoff / 2, t); + } + } + n += 1; + } + } + if (xcentered) { + xl = xTOxp(0.) - 1.2 * ticlength - w; + } else { + xl = leftOffset - 1.2 * ytextheight - 2 * w / 3; + if (ticlength < 0) + xl += ticlength; + } + if (yp > -w && yp < lowerCostumeEdge + w) { + ctx.fillText(text, xl, yp + ytextheight * 0.4); + if (xl < xx) + xx = xl; + } + } + ys += ystep; + y = ys * yscaling; + yp = yTOyp(y); + ypos = yp - upperOffset; + } + // ctx.textAlign = "center"; + if (xcentered) + xl = leftOffset - 1.2 * ytextheight; + } + return xx; + } + +//clear label regions + + ctx.beginPath(); + ctx.fillStyle = new Color(rback, gback, bback).toString(); + if (border) + ctx.strokeStyle = new Color(rfront, gfront, bfront).toString(); + else + ctx.strokeStyle = new Color(rback, gback, bback).toString(); + ctx.lineWidth = 1; + + ctx.fillRect(0, 0, rightCostumeEdge, upperOffset); // TITLE + ctx.fillRect(0, 0, leftOffset, lowerCostumeEdge); // YLABEL + ctx.fillRect(0, lowerCostumeEdge - lowerOffset + 1, rightCostumeEdge, lowerCostumeEdge); // XLABEL + ctx.strokeRect(0, 0, rightCostumeEdge, lowerCostumeEdge); + ctx.fillRect(rightCostumeEdge - 1, 0, 1, lowerCostumeEdge); + + +//draw labels + + var xx = draw_scales(); + draw_title(); + draw_xlabel(); + draw_ylabel(xx); + +//draw axes box + +// ctx.strokeStyle = new Color(rfront,gfront,bfront).toString(); +// ctx.strokeRect(leftOffset,upperOffset,diagramWidth,diagramHeight); + xp1 = leftOffset; + xp2 = leftOffset + diagramWidth; + yp1 = upperOffset; + yp2 = upperOffset + diagramHeight; + xp = xTOxp(0.); + yp = yTOyp(0.); +// Y-BOX/-AXIS + if (xcentered && xp >= leftOffset && xp <= leftOffset + diagramWidth) { + if (yUpper > yLower) { + ctx.moveTo(xp, yp2); + ctx.lineTo(xp, yp1 - ytextheight); + ctx.lineTo(xp + 0.25 * ytextheight, yp1); + ctx.lineTo(xp - 0.25 * ytextheight, yp1); + ctx.lineTo(xp, yp1 - ytextheight); + } else { + ctx.moveTo(xp, yp1); + ctx.lineTo(xp, yp2 + ytextheight); + ctx.lineTo(xp + 0.25 * ytextheight, yp2); + ctx.lineTo(xp - 0.25 * ytextheight, yp2); + ctx.lineTo(xp, yp2 + ytextheight); + } + } else { + ctx.moveTo(xp1, yp1); + ctx.lineTo(xp1, yp2); + if (!ycentered) { + ctx.moveTo(xp2, yp1); + ctx.lineTo(xp2, yp2); + } + } +// X-BOX/-AXIS + if (ycentered && yp >= upperOffset && yp <= upperOffset + diagramHeight) { + if (xRight > xLeft) { + ctx.moveTo(xp1, yp); + ctx.lineTo(xp2 + xtextheight, yp); + ctx.lineTo(xp2, yp + 0.25 * xtextheight); + ctx.lineTo(xp2, yp - 0.25 * xtextheight); + ctx.lineTo(xp2 + xtextheight, yp); + } else { + ctx.moveTo(xp2, yp); + ctx.lineTo(xp1 - xtextheight, yp); + ctx.lineTo(xp1, yp + 0.25 * ytextheight); + ctx.lineTo(xp1, yp - 0.25 * ytextheight); + ctx.lineTo(xp1 - xtextheight, yp); + } + } else { + if (!xcentered) { + ctx.moveTo(xp1, yp1); + ctx.lineTo(xp2, yp1); + } + ctx.moveTo(xp1, yp2); + ctx.lineTo(xp2, yp2); + } + + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + return costume; + + } +); + +SnapExtensions.primitives.set( + 'SciS_FITSpixelsOnStageForImagePad(data,min,max,gray,log,pixels,cAttributes,iAttributes)', + function (data, min, max, gray, log, pixels, cAttributes, iAttributes) { + var leftOffset = Number(cAttributes.at(6)), upperOffset = Number(cAttributes.at(7)), cWidth = Number(cAttributes.at(1)), + cHeight = Number(cAttributes.at(2)), w = Number(iAttributes.at(2)), h = Number(iAttributes.at(3)), n, value, + interval = (max - min) / 8, x = leftOffset + 1, y = upperOffset; + + for (var i = 1; i <= data.length(); i++) { + value = data.at(i); + n = value; + if (value <= min) + n = min + 1; + if (value > max) + n = max; + if (log) + n = Math.round(Math.log(n - min) / Math.log(max - min) * 255); + else + n = Math.round((n - min) / (max - min) * 255); + if ((x <= cWidth) && (y <= cHeight) && (y <= h + upperOffset)) { + if (gray) + pixels.put(new List([n, n, n, 255]), y * cWidth + x); + else { + if (value <= min) { + pixels.put(new List([0, 0, 0, 255]), y * w + x); + } else if (value < min + interval) + pixels.put(new List([0, 0, n, 255]), y * cWidth + x); + else if (value < min + 2 * interval) + pixels.put(new List([0, n, n, 255]), y * cWidth + x); + else if (value < min + 3 * interval) + pixels.put(new List([n, 0, n, 255]), y * cWidth + x); + else if (value < min + 4 * interval) + pixels.put(new List([0, n, 0, 255]), y * cWidth + x); + else if (value < min + 5 * interval) + pixels.put(new List([n, 0, 0, n]), y * cWidth + x); + else if (value < min + 6 * interval) + pixels.put(new List([n, n / 2, 0, 255]), y * cWidth + x); + else if (value < min + 7 * interval) + pixels.put(new List([n, n, 0, 255]), y * cWidth + x); + else if (value < min + 8 * interval) + pixels.put(new List([n, n, n, 255]), y * cWidth + x); + else + pixels.put(new List([255, 255, 255, 255]), y * cWidth + x); + } + } + x++; + if (x > w + leftOffset) { + x = leftOffset + 1; + y++; + } + } + return pixels; + } +); + +SnapExtensions.primitives.set( + 'SciS_FITSpixelsOnSpriteForImagePad(data,min,max,gray,log,iAttributes)', + function (data, min, max, gray, log, iAttributes) { + var result = [], i = 1, n, value, interval = (max - min) / 8, w = Number(iAttributes.at(2)), h = Number(iAttributes.at(3)); + while ((i <= data.length()) && (i <= w * h)) { + value = data.at(i); + n = value; + if (value <= min) + n = min + 1; + if (value > max) + n = max; + if (log) + n = Math.round(Math.log(n - min) / Math.log(max - min) * 255); + else + n = Math.round((n - min) / (max - min) * 255); + if (gray) + result.push(new List([n, n, n, 255])); + else { // result.push(new List([n,255-n,Math.round(255-n/2),255])); + if (value <= min) { + result.push(new List([0, 0, 0, 255])); + } else if (value < min + interval) + result.push(new List([0, 0, n, 255])); + else if (value < min + 2 * interval) + result.push(new List([0, n, n, 255])); + else if (value < min + 3 * interval) + result.push(new List([n, 0, n, 255])); + else if (value < min + 4 * interval) + result.push(new List([0, n, 0, 255])); + else if (value < min + 5 * interval) + result.push(new List([n, 0, 0, n])); + else if (value < min + 6 * interval) + result.push(new List([n, n / 2, 0, 255])); + else if (value < min + 7 * interval) + result.push(new List([n, n, 0, 255])); + else if (value < min + 8 * interval) + result.push(new List([n, n, n, 255])); + else + result.push(new List([255, 255, 255, 255])); + } + i = i + 1; + } + return new List(result); + } +); + +SnapExtensions.primitives.set( + 'SciS_RGBpixelsOnStageForImagePad(data,min,max,gray,log,pixels,cAttributes,iAttributes)', + function (data, min, max, gray, log, pixels, cAttributes, iAttributes) { + var leftOffset = Number(cAttributes.at(6)), upperOffset = Number(cAttributes.at(7)), cWidth = Number(cAttributes.at(1)), + cHeight = Number(cAttributes.at(2)), w = Number(iAttributes.at(2)), h = Number(iAttributes.at(3)), n, value, + interval = (max - min) / 8, x = leftOffset + 1, y = upperOffset; + + for (var i = 1; i <= data.length(); i++) { + value = (data.at(i).at(1) + data.at(i).at(2) + data.at(i).at(3)) / 3; + n = value; + if (value <= min) + n = min + 1; + if (value > max) + n = max; + if (log) + n = Math.round(Math.log(n - min) / Math.log(max - min) * 255); + else + n = Math.round((n - min) / (max - min) * 255); + if ((x <= cWidth) && (y <= cHeight) && (y <= h + upperOffset)) { + if (gray) + pixels.put(new List([n, n, n, 255]), y * cWidth + x); + else { + if (value <= min) { + pixels.put(new List([0, 0, 0, 255]), y * w + x); + } else if (value < min + interval) + pixels.put(new List([0, 0, n, 255]), y * cWidth + x); + else if (value < min + 2 * interval) + pixels.put(new List([0, n, n, 255]), y * cWidth + x); + else if (value < min + 3 * interval) + pixels.put(new List([n, 0, n, 255]), y * cWidth + x); + else if (value < min + 4 * interval) + pixels.put(new List([0, n, 0, 255]), y * cWidth + x); + else if (value < min + 5 * interval) + pixels.put(new List([n, 0, 0, n]), y * cWidth + x); + else if (value < min + 6 * interval) + pixels.put(new List([n, n / 2, 0, 255]), y * cWidth + x); + else if (value < min + 7 * interval) + pixels.put(new List([n, n, 0, 255]), y * cWidth + x); + else if (value < min + 8 * interval) + pixels.put(new List([n, n, n, 255]), y * cWidth + x); + else + pixels.put(new List([255, 255, 255, 255]), y * cWidth + x); + } + } + x++; + if (x > w + leftOffset) { + x = leftOffset + 1; + y++; + } + } + return pixels; + } +); + +SnapExtensions.primitives.set( + 'SciS_RGBpixelsOnSpriteForImagePad(data,min,max,gray,log)', + function (data, min, max, gray, log) { + var result = [], i = 1, n, value, interval = (max - min) / 8; + while (i <= data.length()) { + value = (data.at(i).at(1) + data.at(i).at(2) + data.at(i).at(3)) / 3; + n = value; + if (value <= min) + n = min + 1; + if (value > max) + n = max; + if (log) + n = Math.round(Math.log(n - min) / Math.log(max - min) * 255); + else + n = Math.round((n - min) / (max - min) * 255); + if (gray) + result.push(new List([n, n, n, 255])); + else { // result.push(new List([n,255-n,Math.round(255-n/2),255])); + if (value <= min) { + result.push(new List([0, 0, 0, 255])); + } else if (value < min + interval) + result.push(new List([0, 0, n, 255])); + else if (value < min + 2 * interval) + result.push(new List([0, n, n, 255])); + else if (value < min + 3 * interval) + result.push(new List([n, 0, n, 255])); + else if (value < min + 4 * interval) + result.push(new List([0, n, 0, 255])); + else if (value < min + 5 * interval) + result.push(new List([n, 0, 0, n])); + else if (value < min + 6 * interval) + result.push(new List([n, n / 2, 0, 255])); + else if (value < min + 7 * interval) + result.push(new List([n, n, 0, 255])); + else if (value < min + 8 * interval) + result.push(new List([n, n, n, 255])); + else + result.push(new List([255, 255, 255, 255])); + } + i = i + 1; + } + return new List(result); + } +); + +SnapExtensions.primitives.set( + 'SciS_drawLineOnImagepad(costume,x1,y1,x2,y2,lineAttributes)', + function (costume, x1, y1, x2, y2, lineAttributes) { + x1 = Number(x1); + y1 = Number(y1); + x2 = Number(x2); + y2 = Number(y2); + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + r = Number(lineAttributes.at(3)), + g = Number(lineAttributes.at(4)), + b = Number(lineAttributes.at(5)); + if (style == 'dashed') { + ctx.setLineDash([10, 10]); + } else if (style == 'dash-dot') { + ctx.setLineDash([10, 5, 2, 5]); + } else if (style == 'dot-dot') { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + ctx.beginPath(); + ctx.lineWidth = w; + ctx.strokeStyle = new Color(r, g, b).toString(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.closePath(); + ctx.stroke(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_drawRectangleOnImagepad(costume,x1,y1,width,height,lineAttributes)', + function (costume, x1, y1, width, height, lineAttributes) { + x1 = Number(x1); + y1 = Number(y1); + width = Number(width); + height = Number(height); + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + r = Number(lineAttributes.at(3)), + g = Number(lineAttributes.at(4)), + b = Number(lineAttributes.at(5)); + if (style == 'dashed') { + ctx.setLineDash([10, 10]); + } else if (style == 'dash-dot') { + ctx.setLineDash([10, 5, 2, 5]); + } else if (style == 'dot-dot') { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + ctx.beginPath(); + ctx.lineWidth = w; + ctx.strokeStyle = new Color(r, g, b).toString(); + ctx.strokeRect(x1, y1, width, height); + ctx.closePath(); + ctx.stroke(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_fillRectangleOnImagepad(costume,x1,y1,width,height,lineAttributes)', + function (costume, x1, y1, width, height, lineAttributes) { + x1 = Number(x1); + y1 = Number(y1); + width = Number(width); + height = Number(height); + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + r = Number(lineAttributes.at(6)), + g = Number(lineAttributes.at(7)), + b = Number(lineAttributes.at(8)); + if (style == 'dashed') { + ctx.setLineDash([10, 10]); + } else if (style == 'dash-dot') { + ctx.setLineDash([10, 5, 2, 5]); + } else if (style == 'dot-dot') { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + ctx.beginPath(); + ctx.lineWidth = width; + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.fillRect(x1, y1, width, height); + ctx.closePath(); + ctx.fill(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_drawCircleOnImagepad(costume,x,y,radius,lineAttributes)', + function (costume, x, y, radius, lineAttributes) { + x = Number(x); + y = Number(y); + radius = Number(radius); + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + r = Number(lineAttributes.at(3)), + g = Number(lineAttributes.at(4)), + b = Number(lineAttributes.at(5)); + if (style == 'dashed') { + ctx.setLineDash([10, 10]); + } else if (style == 'dash-dot') { + ctx.setLineDash([10, 5, 2, 5]); + } else if (style == 'dot-dot') { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + ctx.beginPath(); + ctx.lineWidth = w; + ctx.strokeStyle = new Color(r, g, b).toString(); + ctx.arc(x, y, radius, 0, 6.283185307179586476925286766559); + ctx.closePath(); + ctx.stroke(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_fillCircleOnImagepad(costume,x,y,radius,lineAttributes)', + function (costume, x, y, radius, lineAttributes) { + x = Number(x); + y = Number(y); + radius = Number(radius); + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + r = Number(lineAttributes.at(6)), + g = Number(lineAttributes.at(7)), + b = Number(lineAttributes.at(8)); + if (style == 'dashed') { + ctx.setLineDash([10, 10]); + } else if (style == 'dash-dot') { + ctx.setLineDash([10, 5, 2, 5]); + } else if (style == 'dot-dot') { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.arc(x, y, radius, 0, 6.283185307179586476925286766559); + ctx.closePath(); + ctx.fill(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_drawTextOnImagepad(costume,x,y,text,height,horizontal,lineAttributes)', + function (costume, x, y, text, height, horizontal, lineAttributes) { + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + r = Number(lineAttributes.at(3)), + g = Number(lineAttributes.at(4)), + b = Number(lineAttributes.at(5)); + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.font = "" + height + "px sans-serif"; + if (horizontal) + ctx.fillText(text, x, y); + else { + ctx.rotate(-Math.PI / 2); + ctx.fillText(text, -y, x); + ctx.rotate(Math.PI / 2); + } + ctx.closePath(); + ctx.fill(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_BrightnessOnImage(data,xpos,ypos,r,width,height,typeOfData)', + function (data, xpos, ypos, r, width, height, typeOfData) { + + function imageValue(x, y) { + if ((x > width) || (x < 1) || (y > height) || (y < 1)) + return 0; + else + return data.at(x + (y - 1) * width); + } + + var value, sumOfValues = 0, points = 0, y = ypos - r, x; + + if (typeOfData == 'FITS') { + sumOfValues = 0; + while ((y <= ypos + r) && (y <= height)) { + x = xpos - r; + while ((x <= xpos + r) && (x <= width)) { + if (r > Math.sqrt((xpos - x) * (xpos - x) + (ypos - y) * ypos - y)) { + sumOfValues = sumOfValues + imageValue(Math.round(x), Math.round(y)); + points++; + } + x++; + } + y++; + } + return new List([sumOfValues, points]); + } else { + sumOfValues = [0, 0, 0]; + while ((y <= ypos + r) && (y <= height)) { + x = xpos - r; + while ((x <= xpos + r) && (x <= width)) { + if (r > Math.sqrt((xpos - x) * (xpos - x) + (ypos - y) * ypos - y)) { + value = imageValue(Math.round(x), Math.round(y)); + sumOfValues = [sumOfValues[0] + value.at(1), sumOfValues[1] + value.at(2), + sumOfValues[2] + value.at(3)]; + points++; + } + x++; + } + y++; + } + } + return new List([new List(sumOfValues), points]); + } +); + +SnapExtensions.primitives.set( + 'SciS_affineTransformation(a11,a12,a13,a21,a22,a23,w,h,data,typeOfData)', + function (a11, a12, a13, a21, a22, a23, w, h, data, typeOfData) { + var x, y, xnew, ynew, value, newdata = []; + for (var i = 1; i <= data.contents.length; i++) + if (typeOfData == 'FITS') + newdata.push(0); + else + newdata.push(new List([0, 0, 0, 255])); + for (var y = 1; y <= h; y++) + for (var x = 1; x <= w; x++) { + value = data.at(x + (y - 1) * w); + xnew = Math.round(a11 * x + a12 * y + a13); + ynew = Math.round(a21 * x + a22 * y + a23); + if ((xnew > 0) && (xnew <= w) && (ynew > 0) && (ynew <= h)) + newdata[xnew - 1 + (ynew - 1) * w - 1] = value; + } + return new List(newdata); + } +); + +SnapExtensions.primitives.set( + 'SciS_brightnessAround(data,xpos,ypos,r,width,height,typeOfData)', + function (data, xpos, ypos, r, width, height, typeOfData) { + + function imageValue(x, y) { + if ((x > width) || (x < 1) || (y > height) || (y < 1)) + return 0; + else if (typeOfData == 'FITS') + return data.at(x + (y - 1) * width); + else { + h = data.at(x + (y - 1) * width); + return(h.at(1) + h.at(2) + h.at(3)) / 3; + } + } + + var xpos = Number(xpos), ypos = Number(ypos), r = Number(r), width = Number(width), height = Number(height), + value, sumOfValues, points, x, y, h; + + sumOfValues = 0; + points = 0; + y = ypos - r; + if (y < 1) + y = 1; + while ((y <= ypos + r) && (y <= height)) { + x = xpos - r; + if (x < 1) + x = 1; + while ((x <= xpos + r) && (x <= width)) { + if (r > Math.sqrt((xpos - x) * (xpos - x) + (ypos - y) * ypos - y)) { + sumOfValues = sumOfValues + imageValue(Math.round(x), Math.round(y)); + points++; + } + x++; + } + y++; + } + return new List([sumOfValues, points]); + } +); + +SnapExtensions.primitives.set( + 'SciS_drawListOfPoints(costume,data,shape,size,lineAttributes)', + function (costume, data, shape, size, lineAttributes) { + size = Number(size); + var ctx = costume.contents.getContext('2d'), + style = lineAttributes.at(1).trim(), + w = Number(lineAttributes.at(2)), + ro = Number(lineAttributes.at(3)), + go = Number(lineAttributes.at(4)), + bo = Number(lineAttributes.at(5)), + r = Number(lineAttributes.at(6)), + g = Number(lineAttributes.at(7)), + b = Number(lineAttributes.at(8)); + if (style == 'dashed') { + ctx.setLineDash([10, 10]); + } else if (style == 'dash-dot') { + ctx.setLineDash([10, 5, 2, 5]); + } else if (style == 'dot-dot') { + ctx.setLineDash([2, 5]); + } else { + ctx.setLineDash([]); + } + for (var i = 1; i <= data.length(); i++) { + if (shape === "circles") { + ctx.beginPath(); + ctx.strokeStyle = new Color(ro, go, bo).toString(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.arc(data.at(i).at(1), data.at(i).at(2), size, 0, 6.283185307179586476925286766559); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + if (shape === "squares") { + ctx.beginPath(); + ctx.strokeStyle = new Color(ro, go, bo).toString(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.fillRect(data.at(i).at(1) - size, data.at(i).at(2) - size, 2 * size, 2 * size); + ctx.strokeRect(data.at(i).at(1) - size, data.at(i).at(2) - size, 2 * size, 2 * size); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); + } + } + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_addVerticesToVertexlist(n,vlist,vAttributes)', + function (n, vlist, vAttributes) { + function rn(a, b) { + return Math.round((b - a) * Math.random() + a); + } + + n = Number(n); + ranges = vAttributes.at(1); + size = vAttributes.at(2); + for (var i = 1; i <= n; i++) { + //x,y,size,content,isMarked,colorNr,numberOfLinks + vlist.add(new List([rn(ranges.at(1), ranges.at(2)), rn(ranges.at(3), ranges.at(4)), size, "", false, rn(1, 10), 0])); + } + return vlist; + } +); + +SnapExtensions.primitives.set( + 'SciS_addVerticesToAdjacencymatrix(n,amatrix)', + function (n, amatrix) { + n = Number(n); + var w, row; + if (amatrix.length() === 0) + w = 0; + else + w = amatrix.at(1).length(); + for (var i = 1; i <= n; i++) { + row = new List(); + for (var j = 1; j <= w; j++) + row.add("X"); + amatrix.add(row); + } + for (var i = 1; i <= amatrix.length(); i++) { + for (var j = 1; j <= n; j++) { + amatrix.at(i).add("X"); + } + } + return amatrix; + } +); + +SnapExtensions.primitives.set( + 'SciS_addRandomEdgesToGraph(amatrix,n,lAttributes,vlist)', + function (amatrix, n, lAttributes, vlist) { + var v1 = 0, v2 = 0, i, length = vlist.length(), found, w, k, + x1, y1, x2, y2, result, withWeights = lAttributes.at(6), directedEdges = lAttributes.at(5); + if (length > 1) { + n = Number(n); + k = 1; + while (k <= n) { + do { + v1 = Math.floor(Math.random() * length) + 1; + } while (v1 > length); + i = 1; + found = false; + while (!found && (i < 100)) { + do { + v2 = Math.floor(Math.random() * length) + 1; + } while (v2 > length); + found = (v1 !== v2) && (amatrix.at(v1).at(v2) === "X"); + i++; + } + if (found) { + if (withWeights) { //takes the distance/10 as weight in the beginning + x1 = vlist.at(v1).at(1); + y1 = vlist.at(v1).at(2); + x2 = vlist.at(v2).at(1); + y2 = vlist.at(v2).at(2); + w = Math.round(Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / 10); + } else + w = 1; + amatrix.at(v1).put(w, v2); + vlist.at(v1).put(vlist.at(v1).at(7) + 1, 7); + if (!directedEdges) { + amatrix.at(v2).put(w, v1); + vlist.at(v2).put(vlist.at(v2).at(7) + 1, 7); + } + vlist.at(v2).put(vlist.at(v1).at(6), 6); + } + k++; + } + } + result = new List(); + result.add(amatrix); + result.add(vlist); + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_drawGraph(amatrix,vlist,cAttributes,vAttributes,lAttributes,oldCostume)', + function (amatrix, vlist, cAttributes, vAttributes, lAttributes, oldCostume) { + var costume = new Costume(), ctx = costume.contents.getContext('2d'), c, row, anz, + w = Number(cAttributes.at(1)), h = Number(cAttributes.at(2)), v1, v2, x1, y1, x2, y2, n = amatrix.length(), label, textheight, + weight, directed, marked, showWeights, xp, yp, alpha, l, dx, dy, dl, size, minsize = Number(vAttributes.at(2)), growing = vAttributes.at(3); +//create new costume or take old one + //create new costume or take old one + if (oldCostume === "null") { + costume.contents.width = w; + costume.contents.height = h; + ctx.beginPath(); + ctx.fillStyle = new Color(cAttributes.at(3), cAttributes.at(4), cAttributes.at(5)).toString(); + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.fillRect(0, 0, w, h); + ctx.strokeRect(0, 0, w, h); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + costume.rotationCenter = new Point(w / 2, h / 2); + } else { + costume = oldCostume; + ctx = costume.contents.getContext('2d'); + } + +//count edges per vertex an set size per vertex + for (var i = 1; i <= amatrix.length(); i++) { + anz = 0; + row = amatrix.at(i); + for (var j = 1; j <= row.length(); j++) + if (row.at(j) !== "X") + anz++; + vlist.at(i).put(anz, 7); + if (growing) + vlist.at(i).put(minsize + 2 * vlist.at(i).at(7), 3); + //else vlist.at(i).put(minsize,3); + } + +//draw edges + ctx.lineWidth = lAttributes.at(1); + ctx.strokeStyle = new Color(lAttributes.at(2), lAttributes.at(3), lAttributes.at(4)).toString(); + ctx.fillStyle = new Color(lAttributes.at(2), lAttributes.at(3), lAttributes.at(4)).toString(); + directed = lAttributes.at(5); + showWeights = lAttributes.at(7); + v1 = 1; + while (v1 <= n) { + v2 = 1; + while (v2 <= n) { + weight = amatrix.at(v1).at(v2); + if (weight != "X") { + x1 = vlist.at(v1).at(1); + y1 = vlist.at(v1).at(2); + x2 = vlist.at(v2).at(1); + y2 = vlist.at(v2).at(2); + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.closePath(); + ctx.stroke(); + if (directed) { + xp = x2 - x1; + yp = y2 - y1; + size = vlist.at(v2).at(3); + l = Math.sqrt(xp * xp + yp * yp); + if (l > 15) { + ctx.beginPath(); + alpha = Math.acos(Math.abs(xp) / l); + if (!vAttributes.at(4)) + l = l - size; + else { + if (vlist.at(v2).at(4).length === 0) + label = "VertexNr: " + v2; + else + label = vlist.at(v2).at(4); + textheight = Number(2 * vAttributes.at(2)) + 3 * Number(vlist.at(v2).at(7)); + ctx.font = "" + textheight + "px sans-serif"; + w = ctx.measureText(label).width + 20; + h = textheight + 10; + if (x1 === x2) + l = l - h / 2; + else if (y1 === y2) + l = l - w / 2; + else { + dx = w / 2; + dl = Math.abs(l * dx / xp); + dy = Math.abs(dl * Math.sin(alpha)); + if (dy > h / 2) + dl = h / 2 / Math.sin(alpha); + l = l - dl; + } + } + dx = 5 * Math.sin(alpha); + dy = 5 * Math.cos(alpha); + if (xp >= 0) + if (yp >= 0) {//right-down + x2 = x1 + l * Math.cos(alpha); + y2 = y1 + l * Math.sin(alpha); + ctx.moveTo(x2, y2); + ctx.lineTo(x1 + (l - 10) * Math.cos(alpha) + dx, y1 + (l - 10) * Math.sin(alpha) - dy); + ctx.lineTo(x1 + (l - 10) * Math.cos(alpha) - dx, y1 + (l - 10) * Math.sin(alpha) + dy); + } else {//right-up + x2 = x1 + l * Math.cos(alpha); + y2 = y1 - l * Math.sin(alpha); + ctx.moveTo(x2, y2); + ctx.lineTo(x1 + (l - 10) * Math.cos(alpha) - dx, y1 - (l - 10) * Math.sin(alpha) - dy); + ctx.lineTo(x1 + (l - 10) * Math.cos(alpha) + dx, y1 - (l - 10) * Math.sin(alpha) + dy); + } + else if (yp >= 0) {//left-down + x2 = x1 - l * Math.cos(alpha); + y2 = y1 + l * Math.sin(alpha); + ctx.moveTo(x2, y2); + ctx.lineTo(x1 - (l - 10) * Math.cos(alpha) + dx, y1 + (l - 10) * Math.sin(alpha) + dy); + ctx.lineTo(x1 - (l - 10) * Math.cos(alpha) - dx, y1 + (l - 10) * Math.sin(alpha) - dy); + } else {//left-up + x2 = x1 - l * Math.cos(alpha); + y2 = y1 - l * Math.sin(alpha); + ctx.moveTo(x2, y2); + ctx.lineTo(x1 - (l - 10) * Math.cos(alpha) + dx, y1 - (l - 10) * Math.sin(alpha) - dy); + ctx.lineTo(x1 - (l - 10) * Math.cos(alpha) - dx, y1 - (l - 10) * Math.sin(alpha) + dy); + } + ctx.lineTo(x2, y2); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); + } + } + } + if (showWeights) { + ctx.font = "" + 12 + "px sans-serif"; + ctx.beginPath(); + if (weight != "X") + ctx.fillText("" + weight, (x1 + x2) / 2, (y1 + y2) / 2 - 2); + ctx.closePath(); + ctx.fill(); + } + v2++; + } + v1++; + } + +//color connected vertices in same color + var connectedVertices, row, color, processedVertices = new List(); + for (var vNr = 1; vNr <= vlist.length(); vNr++) { + if (!(processedVertices.contains(vNr))) { + color = Math.round(9 * Math.random() + 1); + connectedVertices = new List(); + connectedVertices.add(vNr); + while (connectedVertices.length() > 0) { + v1 = connectedVertices.at(1); + processedVertices.add(v1); + connectedVertices.remove(1); + vlist.at(v1).put(color, 6); + row = amatrix.at(v1); + for (var i = 1; i <= row.length(); i++) + if ((row.at(i) != "X") && (connectedVertices.indexOf(i) < 1) && (processedVertices.indexOf(i) < 1)) + connectedVertices.add(i); + } + } + } + +//draw vertices + ctx.lineWidth = 1; + ctx.strokeStyle = new Color(0, 0, 0).toString(); + for (var i = 1; i <= vlist.length(); i++) { + marked = vlist.at(i).at(5); + if (!vAttributes.at(4)) { + if (marked) { + ctx.beginPath(); + ctx.fillStyle = new Color(255, 0, 0).toString(); + ctx.strokeStyle = new Color(255, 0, 0).toString(); + ctx.arc(vlist.at(i).at(1), vlist.at(i).at(2), vlist.at(i).at(3) + 3, 0, 6.283185307179586476925286766559); + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + ctx.beginPath(); + c = vlist.at(i).at(6); + if (c === 1) + ctx.fillStyle = new Color(0, 0, 255).toString(); + else if (c === 2) + ctx.fillStyle = new Color(0, 155, 255).toString(); + else if (c === 3) + ctx.fillStyle = new Color(255, 0, 255).toString(); + else if (c === 4) + ctx.fillStyle = new Color(255, 0, 0).toString(); + else if (c === 5) + ctx.fillStyle = new Color(0, 255, 0).toString(); + else if (c === 6) + ctx.fillStyle = new Color(0, 255, 155).toString(); + else if (c === 7) + ctx.fillStyle = new Color(255, 255, 0).toString(); + else if (c === 8) + ctx.fillStyle = new Color(0, 0, 0).toString(); + else if (c === 9) + ctx.fillStyle = new Color(255, 255, 255).toString(); + else + ctx.fillStyle = new Color(155, 155, 155).toString(); + ctx.arc(vlist.at(i).at(1), vlist.at(i).at(2), vlist.at(i).at(3), 0, 6.283185307179586476925286766559); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } else { + if (vlist.at(i).at(4).length === 0) + label = "#" + i; + else + label = vlist.at(i).at(4); + ctx.beginPath(); + if (vAttributes.at(3)) + textheight = Number(2 * vAttributes.at(2)) + 3 * Number(vlist.at(i).at(7)); + else + textheight = Number(2 * vAttributes.at(2)); + ctx.font = "" + textheight + "px sans-serif"; + w = ctx.measureText(label).width + 20; + h = textheight + 10; + ctx.fillStyle = new Color(255, 255, 255).toString(); + if (marked) + ctx.strokeStyle = new Color(255, 0, 0).toString(); + else + ctx.strokeStyle = new Color(0, 0, 0).toString(); + x1 = vlist.at(i).at(1) - w / 2; + y1 = vlist.at(i).at(2) - h / 2; + ctx.fillRect(x1, y1, w, h); + ctx.strokeRect(x1 + 1, y1 + 1, w - 3, h - 2); + if (marked) + ctx.fillStyle = new Color(255, 0, 0).toString(); + else + ctx.fillStyle = new Color(0, 0, 0).toString(); + ctx.textAlign = "center"; + ctx.textBaseline = "center"; + ctx.fillText(label, x1 + w / 2, y1 + h - 7); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + } + } + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_depthFirstSearch(amatrix,vlist,cont,n)', + function (amatrix, vlist, cont, n) { + function depthFirstSearch(content, nr) { + var nextVertices = new List(), found, vertexNr, result; + vlist.at(nr).put(true, 5); //mark vertex + if (vlist.at(nr).at(4) === content) + return new List([true, "" + content + " found in vertex " + nr]); //content is found! + else { + for (var i = 1; i <= vlist.length(); i++) { + if ((amatrix.at(nr).at(i) != "X") && (!vlist.at(i).at(5))) + nextVertices.add(i); + for (var j = 1; j <= nextVertices.length(); j++) + vlist.at(j).put(false, 5); + found = false; + while ((nextVertices.length() > 0) && !found) { + vertexNr = nextVertices.at(1); + nextVertices.remove(1); + result = depthFirstSearch(content, vertexNr); + found = result.at(1); + if (found) + return result; + } + } + return new List([false, "" + content + " not found!"]); + } + } + +//delete all markers +//for(var i=1;i<=vlist.length();i++) vlist.at(i).put(false,5); + return depthFirstSearch(cont, n); + + } +); + +SnapExtensions.primitives.set( + 'SciS_breadthFirstSearch(amatrix,vlist,cont,n)', + function (amatrix, vlist, cont, n) { + function breadthFirstSearch(content, nr) { + var nextVertices = new List([n]), vertexNr; + while (nextVertices.length() > 0) { + vertexNr = nextVertices.at(1); + nextVertices.remove(1); + vlist.at(vertexNr).put(true, 5); //mark vertex + if (vlist.at(vertexNr).at(4) === content) + return new List([true, "" + content + " found in vertex " + vertexNr]); //content is found! + else { + for (var i = 1; i <= amatrix.length(); i++) { + if ((amatrix.at(vertexNr).at(i) != "X") && (!vlist.at(i).at(5))) + nextVertices.add(i); + } + } + } + return new List([false, "" + content + " not found!"]); + } + +//for(var i=1;i<=vlist.length();i++) vlist.at(i).put(false,5); //delete all markers + return breadthFirstSearch(cont, n); + + } +); + +SnapExtensions.primitives.set( + 'SciS_shortestPath(amatrix,start,end)', + function (amatrix, start, end) { + var completedVertices = new List(), distances = new List(), openTuples = new List(), result, actualTuple, actualDistance, i, j, k; + openTuples.add(new List([start, 0, ""])); //initialization + while (openTuples.length() > 0) { //use all connected vertices + actualTuple = openTuples.at(1); //take the first tuple in openTuples and delete it from list, add it to completedVertices and the new distance to distances + openTuples.remove(1); + completedVertices.add(actualTuple.at(1)); + distances.add(new List([actualTuple.at(1), actualTuple.at(2)])); + for (var i = 1; i <= amatrix.length(); i++) { //add a new "message" for every connected vertex to openTuples + if (!completedVertices.contains(i) && (amatrix.at(actualTuple.at(1)).at(i) != "X")) { + actualDistance = amatrix.at(actualTuple.at(1)).at(i) + actualTuple.at(2); + openTuples.add(new List([i, actualDistance, actualTuple.at(1)])); + for (var j = 1; j <= distances.length(); j++) { //relaxation + if (distances.at(j).at(1) === i) + if (actualDistance < distances.at(j).at(2)) + distances.put(new List([i, actualDistance]), j); + } + } + } + openTuples = new List(openTuples.asArray().sort(function (a, b) { + return a.at(2) - b.at(2); + })); //sort openTuples by distances + i = 1; + while (i < openTuples.length()) { //delete doubles + k = openTuples.at(i).at(1); + j = i + 1; + while (j <= openTuples.length()) + if (openTuples.at(j).at(1) === k) + openTuples.remove(j); + else + j++; + i++; + } + } + result = -1; + for (var i = 1; i <= distances.length(); i++) //look for the distance to endvertex + if (distances.at(i).at(1) === end) + result = distances.at(i).at(2); + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_allShortestPaths(amatrix,start)', + function (amatrix, start) { + var completedVertices = new List(), distances = new List(), openTuples = new List(), result, actualTuple, actualDistance, i, j, k; + openTuples.add(new List([start, 0, ""])); //initialization + while (openTuples.length() > 0) { //use all connected vertices + actualTuple = openTuples.at(1); //take the first tuple in openTuples and delete it from list, add it to completedVertices and the new distance to distances + openTuples.remove(1); + completedVertices.add(actualTuple.at(1)); + distances.add(new List([actualTuple.at(1), actualTuple.at(2)])); + for (var i = 1; i <= amatrix.length(); i++) { //add a new "message" for every connected vertex to openTuples + if (!completedVertices.contains(i) && (amatrix.at(actualTuple.at(1)).at(i) != "X")) { + actualDistance = amatrix.at(actualTuple.at(1)).at(i) + actualTuple.at(2); + openTuples.add(new List([i, actualDistance, actualTuple.at(1)])); + for (var j = 1; j <= distances.length(); j++) { //relaxation + if (distances.at(j).at(1) === i) + if (actualDistance < distances.at(j).at(2)) + distances.put(new List([i, actualDistance]), j); + } + } + } + openTuples = new List(openTuples.asArray().sort(function (a, b) { + return a.at(2) - b.at(2); + })); //sort openTuples by distances + i = 1; + while (i < openTuples.length()) { //delete doubles + k = openTuples.at(i).at(1); + j = i + 1; + while (j <= openTuples.length()) + if (openTuples.at(j).at(1) === k) + openTuples.remove(j); + else + j++; + i++; + } + } + return new List(distances.asArray().sort(function (a, b) { + return a.at(1) - b.at(1); + })); //sort distances by vertexnumber + } +); + +SnapExtensions.primitives.set( + 'SciS_vertexnumberAtGraph(vlist,cAttributes,vAttributes,x,y)', + function (vlist, cAttributes, vAttributes, x, y) { + var costumeWidth, costumeHeight, vertexWidth, vertexHeight, showContent, + xpos, ypos, size, xVertex, yVertex, i, label, textheight, w, h, ctx, help; + help = new Costume(); + help.contents.width = 10; + help.contents.height = 10;//only for text-measurement + ctx = help.contents.getContext('2d'); + costumeWidth = Number(cAttributes.at(1)); + costumeHeight = Number(cAttributes.at(2)); + xPos = Math.round(costumeWidth / 2 + Number(x)); + yPos = Math.round(costumeHeight / 2 - Number(y)); + showContent = vAttributes.at(4); + i = 1; + while (i <= vlist.length()) { + xVertex = vlist.at(i).at(1); + yVertex = vlist.at(i).at(2); + size = vlist.at(i).at(3); + if (showContent) { + if (vlist.at(i).at(4).length === 0) + label = "VertexNr: " + i; + else + label = vlist.at(i).at(4); + textheight = Number(2 * vAttributes.at(2)) + 3 * Number(vlist.at(i).at(7)); + ctx.font = "" + textheight + "px sans-serif"; + w = ctx.measureText(label).width + 20; + h = textheight + 10; + if ((xPos >= xVertex - w / 2) && (xPos <= xVertex + w / 2) && (yPos >= yVertex - h / 2) && (yPos <= yVertex + h / 2)) + return i; + } else { + if (Math.sqrt((xPos - xVertex) * (xPos - xVertex) + (yPos - yVertex) * (yPos - yVertex)) <= size) + return i; + } + i++; + } + return("no vertex at this position!"); + } +); + +SnapExtensions.primitives.set( + 'SciS_createDuplicate(sprite,spriteName)', + function (sprite, spriteName) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph), + duplicate = sprite.fullCopy(); + duplicate.isDown = false; + duplicate.setPosition(world.hand.position()); + duplicate.appearIn(ide); + duplicate.keepWithin(stage); + duplicate.isDown = sprite.isDown; + duplicate.name = spriteName; + ide.selectSprite(duplicate); + ide.recordUnsavedChanges(); + ide.createCorral(); + ide.fixLayout(); + } +); + +SnapExtensions.primitives.set( + 'SciS_createPermanentClone(sprite,spriteName)', + function (sprite, spriteName) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph), + clone = sprite.fullCopy(true), + hats = clone.allHatBlocksFor('__clone__init__'); + clone.isDown = false; + clone.appearIn(ide); + if (hats.length) + clone.initClone(hats); + else { + clone.setPosition(world.hand.position()); + clone.keepWithin(stage); + } + clone.isDown = sprite.isDown; + clone.name = spriteName; + ide.selectSprite(clone); + ide.recordUnsavedChanges(); + ide.createCorral(); + ide.fixLayout(); + } +); + +SnapExtensions.primitives.set( + 'SciS_importSprite1()', + function (txt) { + var inp = document.createElement('input'), + ide = this.parent.parent, result = 0, done = false; + + function userImport() { + + function txtOnlyMsg(ftype, anyway) { + ide.confirm( + localize( + 'Snap! can only import "text" files.\n' + + 'You selected a file of type "' + + ftype + + '".' + ) + '\n\n' + localize('Open anyway?'), + 'Unable to import', + anyway // callback + ); + } + + function readText(aFile) { + var frd = new FileReader(), + ext = aFile.name.split('.').pop().toLowerCase(); + + function isTextFile(aFile) { + // special cases for Windows + // check the file extension for text-like-ness + return aFile.type.indexOf('text') !== -1 || + contains(['txt', 'csv', 'xml', 'json', 'tsv'], ext); + } + + function isType(aFile, string) { + return aFile.type.indexOf(string) !== -1 || (ext === string); + } + + frd.onloadend = function (e) { + done = true; + if (isType(aFile, 'csv')) { + result = Process.prototype.parseCSV(e.target.result); + } else if (isType(aFile, 'json')) { + result = Process.prototype.parseJSON(e.target.result); + } else { + result = e.target.result; + } + }; + + if (isTextFile(aFile)) { + frd.readAsText(aFile); + } else { + txtOnlyMsg( + aFile.type, + function () { + frd.readAsText(aFile); + } + ); + } + } + + document.body.removeChild(inp); + ide.filePicker = null; + if (inp.files.length > 0) { + readText(inp.files[inp.files.length - 1]); + } + } + + if (ide.filePicker) { + document.body.removeChild(ide.filePicker); + ide.filePicker = null; + } + inp.type = 'file'; + inp.style.color = "transparent"; + inp.style.backgroundColor = "transparent"; + inp.style.border = "none"; + inp.style.outline = "none"; + inp.style.position = "absolute"; + inp.style.top = "0px"; + inp.style.left = "0px"; + inp.style.width = "0px"; + inp.style.height = "0px"; + inp.style.display = "none"; + inp.addEventListener( + "change", + userImport, + false + ); + document.body.appendChild(inp); + ide.filePicker = inp; + inp.click(); + return function () { + return new List([done, result]); + }; + } +); + +SnapExtensions.primitives.set( + 'SciS_importSprite2(data)', + function (data) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph), + thisObj = this, + cats = SpriteMorph.prototype.categories, + colors = SpriteMorph.prototype.blockColor, + i = 0, index = -1; + ide.openSpritesString(data); + } +); + +SnapExtensions.primitives.set( + 'SciS_changeSpritenameTo(newName)', + function (newName) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph), + thisObj = this; + ide.spriteBar.nameField.setContents(newName); + ide.spriteBar.nameField.fixLayout(); + ide.createCorral(); + ide.fixLayout(); + } +); + +SnapExtensions.primitives.set( + 'SciS_importLibrary1(catName)', + function (catName) { + var cats = SpriteMorph.prototype.categories, i = 0, index = -1; + i = 0; //is category visible? + while ((i < cats.length) && (index < 0)) { + if (cats[i].toLowerCase() === catName) + index = i; + i += 1; + } + if (index === -1) + return false; + else + return true; + } +); + +SnapExtensions.primitives.set( + 'SciS_importLibrary2(src)', + function (src) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + world = stage.parentThatIsA(WorldMorph); + ide.openBlocksString(src); + } +); + +SnapExtensions.primitives.set( + 'SciS_NNoutput(weights,width,depth,n,input)', + function (weights, width, depth, n, input) { + var inp = new List(), layerNr = 1, layer, output, sum; + for (var i = 1; i <= input.length(); i++) + inp.add(input.at(i)); + if ((n === "last") || (n > depth)) + n = Number(depth); + else + n = Number(n); + while (layerNr <= n) { + inp.add(0.1); + layer = weights.at(layerNr); + output = new List(); + for (var i = 1; i <= layer.length(); i++) { + sum = 0; + for (var j = 1; j <= inp.length(); j++) + sum = sum + layer.at(i).at(j) * inp.at(j); + output.add(sum); + } + inp = new List(); + for (var i = 1; i <= output.length(); i++) + inp.add(1.0 / (1 + Math.exp(-output.at(i)))); + layerNr++; + } + return inp; + } +); + +SnapExtensions.primitives.set( + 'SciS_NNshowStatus(cAttributes,nAttributes,weights,outputs,costume,sprite)', + function (cAttributes, nAttributes, weights, outputs, costume, sprite) { + var newCostume, ctx, costumeWidth, costumeHeight, netWidth, netHeight, layerWidth, depth, dx, dy, x, y, x1, y1, colorcode, + leftOffset = cAttributes.at(6), upperOffset = cAttributes.at(7); + + netWidth = Number(nAttributes.at(3)); + netHeight = Number(nAttributes.at(4)); + layerWidth = Number(nAttributes.at(2)); + depth = Number(nAttributes.at(1)); + r = Number(cAttributes.at(3)); + g = Number(cAttributes.at(4)); + b = Number(cAttributes.at(5)); + + if (sprite === "theStage") { + ctx = costume.contents.getContext('2d'); + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.fillRect(leftOffset, upperOffset, netWidth, netHeight); + ctx.strokeRect(leftOffset, upperOffset, netWidth, netHeight); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + } else { + //new costume + costumeWidth = Number(cAttributes.at(1)); + costumeHeight = Number(cAttributes.at(2)); + newCostume = new Costume(); + newCostume.contents.width = costumeWidth; + newCostume.contents.height = costumeHeight; + ctx = newCostume.contents.getContext('2d'); + ctx.beginPath(); + ctx.fillStyle = new Color(r, g, b).toString(); + ctx.strokeStyle = new Color(0, 0, 0).toString(); + ctx.fillRect(0, 0, costumeWidth, costumeHeight); + ctx.strokeRect(leftOffset, upperOffset, netWidth, netHeight); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + newCostume.rotationCenter = new Point(costumeWidth / 2, costumeHeight / 2); + } + +//draw frame + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(leftOffset + netWidth - 15, upperOffset + netHeight - 20); + ctx.lineTo(leftOffset + netWidth - 15, upperOffset + 40); + ctx.lineTo(leftOffset + netWidth - 20, upperOffset + 40); + ctx.lineTo(leftOffset + netWidth - 15, upperOffset + 20); + ctx.lineTo(leftOffset + netWidth - 10, upperOffset + 40); + ctx.lineTo(leftOffset + netWidth - 15, upperOffset + 40); + ctx.closePath(); + ctx.stroke(); + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.moveTo(leftOffset + netWidth - 30, upperOffset + 1); + ctx.lineTo(leftOffset + netWidth - 30, upperOffset + netHeight - 1); + ctx.closePath(); + ctx.stroke(); + + + +//draw connections + if (layerWidth > 1) + dx = 1.0 * (netWidth - 50) / (layerWidth - 1); + else + dx = 1.0 * (netWidth - 15) / 2; + if (depth > 1) + dy = 1.0 * netHeight / depth; + else + dy = 1.0 * netHeight / 2; + ctx.lineWidth = 1; + for (var layer = 1; layer <= depth; layer++) { + for (var i = 1; i <= layerWidth; i++) { + x = 10 + (i - 1) * dx; + if (layer == depth) + y = 3; + else + y = netHeight - layer * dy; + for (var n = 1; n <= layerWidth; n++) { + ctx.beginPath(); + x1 = 10 + (n - 1) * dx; + if (layer == 1) + y1 = netHeight - 3; + else + y1 = netHeight - (layer - 1) * dy; + colorcode = Math.round(255 * weights.at(layer).at(i).at(n)); + if (colorcode < 0) + ctx.strokeStyle = new Color(-colorcode, 0, 0).toString(); + else + ctx.strokeStyle = new Color(0, colorcode, 0).toString(); + ctx.moveTo(leftOffset + x, upperOffset + y); + ctx.lineTo(leftOffset + x1, upperOffset + y1); + ctx.closePath(); + ctx.stroke(); + } + } + } + +//draw connectors + if (layerWidth > 1) + dx = 1.0 * (netWidth - 50) / (layerWidth - 1); + else + dx = 1.0 * (netWidth - 15) / 2; + if (depth > 1) + dy = 1.0 * (netHeight - 30) / (depth - 1); + else + dy = 1.0 * (netHeight - 15) / 2; + ctx.lineWidth = 1; + for (var i = 0; i < layerWidth; i++) { + ctx.beginPath(); + x = 5 + i * dx; + y = 1; + colorcode = Math.round(255 * outputs.at(depth + 1).at(i + 1)); + if (colorcode < 0) + ctx.fillStyle = new Color(-colorcode, 0, 0).toString(); + else + ctx.fillStyle = new Color(0, colorcode, 0).toString(); + ctx.strokeRect(leftOffset + x, upperOffset + y, 10, 5); + ctx.fillRect(leftOffset + x, upperOffset + y, 10, 5); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); + y = netHeight - 6; + colorcode = Math.round(255 * outputs.at(1).at(i + 1)); + if (colorcode < 0) + ctx.fillStyle = new Color(-colorcode, 0, 0).toString(); + else + ctx.fillStyle = new Color(0, colorcode, 0).toString(); + ctx.strokeRect(leftOffset + x, upperOffset + y, 10, 5); + ctx.fillRect(leftOffset + x, upperOffset + y, 10, 5); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); + } + +//draw inner layers + if (layerWidth > 1) + dx = 1.0 * (netWidth - 50) / (layerWidth - 1); + else + dx = 1.0 * (netWidth - 15) / 2; + if (depth > 1) + dy = 1.0 * netHeight / depth; + else + dy = 1.0 * netHeight / 2; + for (var layer = 2; layer <= depth; layer++) { + for (var i = 0; i < layerWidth; i++) { + ctx.beginPath(); + x = 10 + i * dx; + y = netHeight - (layer - 1) * dy; + colorcode = Math.round(255 * outputs.at(layer).at(i + 1)); + if (colorcode < 0) + ctx.fillStyle = new Color(-colorcode, 0, 0).toString(); + else + ctx.fillStyle = new Color(0, colorcode, 0).toString(); + ctx.arc(leftOffset + x, upperOffset + y, 5, 0, 6.283185307179586476925286766559); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); + } + } + if (sprite === "theStage") + return costume; + else + return newCostume; + } +); + +SnapExtensions.primitives.set( + 'SciS_NNteach(weights,width,depth,input,output,eta)', + function (weights, width, depth, input, output, eta) { + + function NNoutput(n, input) { + var inp = new List(), layerNr = 1, layer, out, sum; + for (var i = 1; i <= input.length(); i++) + inp.add(input.at(i)); + n = Number(n); + while (layerNr <= n) { + inp.add(0.1); + layer = weights.at(layerNr); + out = new List(); + for (var i = 1; i <= layer.length(); i++) { + sum = 0; + for (var j = 1; j <= inp.length(); j++) + sum = sum + layer.at(i).at(j) * inp.at(j); + out.add(sum); + } + inp = new List(); + for (var i = 1; i <= output.length(); i++) + inp.add(1.0 / (1 + Math.exp(-output.at(i)))); + layerNr++; + } + return inp; + } + + var lNr = depth, currentLayer, currentOutput, delta, h, previousDelta; + while (lNr >= 1) { + currentLayer = weights.at(lNr); + currentOutput = NNoutput(lNr, input); + if (lNr === 1) + nextOutput = input; + else + nextOutput = NNoutput(lNr - 1, input); + if (lNr === depth) { + delta = new List(); + for (var i = 1; i <= width; i++) { + h = currentOutput.at(i) * (1 - currentOutput.at(i)) * (currentOutput.at(i) - output.at(i)); + delta.add(h); + for (var n = 1; n <= width; n++) + currentLayer.at(i).put(currentLayer.at(i).at(n) - eta * h * nextOutput.at(n), n); + } + previousDelta = delta; + } else { + delta = new List(); + for (var i = 1; i <= width; i++) { + h = 0; + for (var k = 1; k <= width; k++) + h = h + previousDelta.at(k) * weights.at(lNr + 1).at(i).at(k); + h = h * currentOutput.at(i) * (1 - currentOutput.at(i)); + delta.add(h); + for (var n = 1; n <= width; n++) + currentLayer.at(i).put(currentLayer.at(i).at(n) - eta * h * nextOutput.at(n), n); + } + previousDelta = delta; + } + lNr--; + } + return weights; + } +); + +SnapExtensions.primitives.set( + 'SciS_createNewSprite()', + function () { + this.parent.parent.addNewSprite(); + } +); + +SnapExtensions.primitives.set( + 'SciS_removeThisSprite()', + function () { + this.parent.parent.removeSprite(this); + } +); + +SnapExtensions.primitives.set( + 'SciS_expandReinforcementTable(rifTable,pixel,xLeft,xRight,yUpper,yLower,value)', + function (rifTable, pixel, xLeft, xRight, yUpper, yLower, value) { + var red, green, blue, newColor; + if (xLeft < 1) { + xLeft = 1; + } + if (xRight > 40) { + xRight = 40; + } + if (yUpper < 1) { + yUpper = 1; + } + if (yLower > 30) { + yLower = 30; + } + for (var y = yUpper; y <= yLower; y++) { + for (var x = xLeft; x <= xRight; x++) { + red = 0; + green = 0; + blue = 0; + for (var dx = -3; dx <= 3; dx++) { + for (var dy = -3; dy <= 3; dy++) { + newColor = pixel.at(401 * (10 * y - 5 + dy - 1) + 10 * x - 5 + dx); + red = red + newColor.at(1); + green = green + newColor.at(2); + blue = blue + newColor.at(3); + } + } + red = red / 49; + green = green / 49; + blue = blue / 49; + if (!((red > 80) && (red < 110) && (green > 200) && (blue < 30))) { + rifTable.at(y).put(value, x); + } + } + } + return rifTable; + } +); + +SnapExtensions.primitives.set( + 'SciS_brightness(data,xpos,ypos,r,width,height,typeOfData)', + function (data, xpos, ypos, r, width, height, typeOfData) { + + function imageValue(x, y) { + if ((x > width) || (x < 1) || (y > height) || (y < 1)) + return 0; + else + return data.at(x + (y - 1) * width); + } + + var value, sumOfValues = 0, points = 0, y = ypos - r, x; + + if (typeOfData == 'FITS') { + sumOfValues = 0; + while ((y <= ypos + r) && (y <= height)) { + x = xpos - r; + while ((x <= xpos + r) && (x <= width)) { + if (r > Math.sqrt((xpos - x) * (xpos - x) + (ypos - y) * ypos - y)) { + sumOfValues = sumOfValues + imageValue(Math.round(x), Math.round(y)); + points++; + } + x++; + } + y++; + } + return new List([sumOfValues, points]); + } else { + sumOfValues = [0, 0, 0]; + while ((y <= ypos + r) && (y <= height)) { + x = xpos - r; + while ((x <= xpos + r) && (x <= width)) { + if (r > Math.sqrt((xpos - x) * (xpos - x) + (ypos - y) * ypos - y)) { + value = imageValue(Math.round(x), Math.round(y)); + sumOfValues = [sumOfValues[0] + value.at(1), sumOfValues[1] + value.at(2), + sumOfValues[2] + value.at(3)]; + points++; + } + x++; + } + y++; + } + } + return new List([new List(sumOfValues), points]); + } +); + +SnapExtensions.primitives.set( + 'SciS_isVector(data)', + function (data) { + var result = true; + i = 1; + while (result && (i <= data.length())) + { + row = data.at(i); + if (!(row instanceof List)) + result = false; + else if (row.length() != 1) + result = false; + else if (Number.isNaN(row.at(1))) + result = false; + i++; + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_isMatrix(data)', + function (data) { + var result = true, row, i, j, width; + i = 1; + while (result && (i <= data.length())) + { + row = data.at(i); + if (!(row instanceof List)) + result = false; + else + { + if (i == 1) + width = row.length(); + if (width < 1) + result = false; + if (row.length() != width) + result = false; + else + { + j = 1; + while (result && (j <= row.length())) + { + if (Number.isNaN(row.at(j))) + result = false; + j++; + } + } + } + i++; + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_isTable(data)', + function (data) { + var result = true, row, i, width; + i = 1; + while (result && (i <= data.length())) + { + row = data.at(i); + if (!(row instanceof List)) + result = false; + else + { + if (i == 1) + width = row.length(); + if (row.length() != width) + result = false; + } + i++; + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_FFTops(data,freq,choice)', + function (data, freq, choice) { + function newComplex(re, im) { + return [re, im]; + } + function addComplex(c1, c2) { + return newComplex(c1[0] + c2[0], c1[1] + c2[1]); + } + function subComplex(c1, c2) { + return newComplex(c1[0] - c2[0], c1[1] - c2[1]); + } + function mulComplex(c1, c2) { + return newComplex(c1[0] * c2[0] - c1[1] * c2[1], c1[0] * c2[1] + c1[1] * c2[0]); + } + function absComplex(c) { + return Math.sqrt(c[0] * c[0] + c[1] * c[1]); + } + function complexToPolar(c) { + return newComplex(absComplex(c), Math.atan(c[1] / c[0])); + } + function polarToComplex(c) { + return newComplex(c[0] * Math.cos(c[1]), c[0] * Math.sin(c[1])); + } + + function FFT(d) { + var n = d.length, nDIV2 = n / 2, even = [], odd = [], result = [], evenPart, oddPart; + if (n <= 1) + return d; + for (var i = 0; i < n; i++) { + result.push(0); + } + for (var i = 0; i < nDIV2; i++) { + even.push(d[2 * i]); + odd.push(d[2 * i + 1]); + } + evenPart = FFT(even); + oddPart = FFT(odd); + f = -2 * Math.PI / n; + for (var k = 0; k < nDIV2; k++) { + g = mulComplex(newComplex(Math.cos(f * k), Math.sin(f * k)), oddPart[k]); + result[k] = addComplex(evenPart[k], g); + result[k + nDIV2] = subComplex(evenPart[k], g); + } + return result; + } + + var rData = [], cData = [], N = 0, result, maxLength = data.length(), n; + + if (choice === "frequency_spectrum") { + rData = data.asArray(); + //complete data up to length 2^N + while (Math.pow(2, N) < rData.length) { + N++; + } + while (rData.length < Math.pow(2, N)) { + rData.push(0); + } + //convert to complex numbers + for (var i = 0; i < rData.length; i++) { + cData.push([Number(rData[i]), Number(0)]); + } + //calculate FFT + result = FFT(cData); + //shorten to length of original data + while (result.length > maxLength) { + result.pop(); + } + //calculate normalized FFT data + n = cData.length; + for (var i = 0; i < result.length; i++) { + result[i] = [1.0 * i / n * freq, 2 * absComplex(result[i]) / maxLength]; + } + result[0][1] = result[0][1] / 2; + //convert to List + for (var i = 0; i < result.length; i++) { + result[i] = new List(result[i]); + } + return new List(result); + } + + + if (choice === 'complex_FFTdata') { + rData = data.asArray(); + //complete data up to length 2^N + while (Math.pow(2, N) < rData.length) { + N++; + } + while (rData.length < Math.pow(2, N)) { + rData.push(0); + } + //convert to complex numbers + for (var i = 0; i < rData.length; i++) { + cData.push([Number(rData[i]), Number(0)]); + } + //calculate FFT + result = FFT(cData); + //use SciSnap! format for complex numbers + for (var i = 0; i < result.length; i++) { + result[i] = ["complexNumberCartesianStyle", result[i][0], result[i][1]]; + } + //shorten to length of original data + while (result.length > maxLength) { + result.pop(); + } + //convert to List + for (var i = 0; i < result.length; i++) { + result[i] = new List(result[i]); + } + return new List(result); + } + + + if (choice === 'iFFT_of_FFTdata') { + //convert data to conjugate complex array + for (var i = 1; i <= data.length(); i++) { + rData.push([data.at(i).at(1), -data.at(i).at(2)]); + } + //complete data up to length 2^N + while (Math.pow(2, N) < rData.length) { + N++; + } + while (rData.length < Math.pow(2, N)) { + rData.push([0, 0]); + } + //calculate FFT + result = FFT(rData); + n = result.length; + for (var i = 0; i < n; i++) { + result[i] = result[i][0] / n; + } + //shorten to length of original data + while (result.length > maxLength) { + result.pop(); + } + //convert to List + return new List(result); + } + + return "ERROR: incorrect selection!"; + + } +); + +SnapExtensions.primitives.set( + 'SciS_addGridToImagePad(costume,gridProperties,colors,withLines,data)', + function (costume, gridProperties, colors, withLines, data) { + var ctx = costume.contents.getContext('2d'), + xMax = Number(gridProperties.at(1)), + yMax = Number(gridProperties.at(2)), + cellWidth = Number(gridProperties.at(3)), + cellHeight = Number(gridProperties.at(4)), + maxColors = colors.length(), + d; + ctx.lineWidth = 1; + ctx.strokeStyle = new Color(0, 0, 0).toString(); + for (var x = 1; x <= xMax; x++) { + for (var y = 1; y <= yMax; y++) { + ctx.beginPath(); + d = data.at(y).at(x); + if (d > maxColors) + d = maxColors; + if (d < 1) + d = 1; + ctx.fillStyle = new Color(colors.at(d).at(1), colors.at(d).at(2), colors.at(d).at(3)).toString(); + ctx.fillRect((x - 1) * cellWidth, (y - 1) * cellHeight, cellWidth, cellHeight); + ctx.closePath(); + ctx.fill(); + } + } + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(xMax * cellWidth, 0); + ctx.lineTo(xMax * cellWidth, yMax * cellHeight); + ctx.lineTo(0, yMax * cellHeight); + ctx.lineTo(0, 0); + ctx.closePath(); + ctx.stroke(); + if (!withLines) + return costume; + ctx.beginPath(); + ctx.lineWidth = 1; + ctx.strokeStyle = new Color(0, 0, 0).toString(); + for (var y = 0; y <= yMax; y++) { + ctx.moveTo(0, cellHeight * y); + ctx.lineTo(cellWidth * xMax, cellHeight * y); + } + for (var x = 0; x <= xMax; x++) { + ctx.moveTo(cellWidth * x, 0); + ctx.lineTo(cellWidth * x, cellHeight * yMax); + } + ctx.closePath(); + ctx.stroke(); + return costume; + } +); + +SnapExtensions.primitives.set( + 'SciS_fillOnImagePadGridRandomlyOnImagePad(xMin,xMax,yMin,yMax,numbers,data)', + function (xMin, xMax, yMin, yMax, numbers, data) { + var result, maxNumber = numbers.length(), h; + + function listCopy(item) { + var theCopy; + if (item instanceof List) { + theCopy = new List(); + for (var i = 1; i <= item.length(); i++) + theCopy.add(listCopy(item.at(i))); + } else + theCopy = item; + return theCopy; + } + + function myRandom(min, max) { + if (max < min) { + var h = max; + max = min; + min = h; + } + return Math.floor(Math.random() * (Number(max) - Number(min)) + Number(min) + 0.5); + } + + result = listCopy(data); + xMin = Math.abs(xMin); + xMax = Math.abs(xMax); + yMin = Math.abs(yMin); + yMax = Math.abs(yMax); + if (xMin > xMax) { + h = xMin; + xMin = xMax; + xMax = h; + } + if (yMin > yMax) { + h = yMin; + yMin = yMax; + yMax = h; + } + for (var y = yMin; y <= yMax; y++) + for (var x = xMin; x <= xMax; x++) + result.at(y).put(numbers.at(myRandom(1, maxNumber)), x); + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_neighborhoodInGridOnImagePad(data,gridProperties,x,y,isTorus,typeOfNeighborhood)', + function (data, gridProperties, x, y, isTorus, typeOfNeighborhood) { + var xMax = Number(gridProperties.at(1)), + yMax = Number(gridProperties.at(2)), + result = [], xg, yg; + if ((x < 1) || (x > xMax) || (y < 1) || (y > yMax)) + return "ERROR: index out of bounds!"; + for (var xp = x - 1; xp <= x + 1; xp++) { + for (var yp = y - 1; yp <= y + 1; yp++) { + xg = xp; + yg = yp; + if (xp < 1) { + if (isTorus) { + xg = xMax; + } else { + xg = 0; + } + } + if (xp > xMax) { + if (isTorus) { + xg = 1; + } else { + xg = 0; + } + } + if (yp < 1) { + if (isTorus) { + yg = yMax; + } else { + yg = 0; + } + } + if (yp > yMax) { + if (isTorus) { + yg = 1; + } else { + yg = 0; + } + } + if ((xg > 0) && (yg > 0)) { + result.push(data.at(yg).at(xg)); + } else { + result.push(""); + } + } + } + if (typeOfNeighborhood === "Moore") + return new List([result[3], result[6], result[7], result[8], result[5], result[2], result[1], result[0]]); + else + return new List([result[3], result[7], result[5], result[1], ]); + } +); + +SnapExtensions.primitives.set( + 'SciS_swapCellsOfGridOnImagePad(data,gridProperties,n,isTorus,range,xMin,xMax,yMin,yMax)', + function (data, gridProperties, n, isTorus, range, xMin, xMax, yMin, yMax) { + var result, rnd; + + function listCopy(item) { + var theCopy; + if (item instanceof List) { + theCopy = new List(); + for (var i = 1; i <= item.length(); i++) + theCopy.add(listCopy(item.at(i))); + } else + theCopy = item; + return theCopy; + } + + function myRandom(min, max) { + if (max < min) { + var h = max; + max = min; + min = h; + } + return Math.floor(Math.random() * (Number(max) - Number(min)) + Number(min) + 0.5); + } + + function swap(x, y) { + var xNew, yNew; + if (isTorus) { + xNew = x + myRandom(-range, range); + yNew = y + myRandom(-range, range); + if (xNew < 1) + xNew = xMax; + if (xNew > xMax) + xNew = 1; + if (yNew < 1) + yNew = yMax; + if (yNew > yMax) + yNew = 1; + } else { + do { + xNew = x + myRandom(-range, range); + } while ((xNew < 1) || (xNew > xMax)); + do { + yNew = y + myRandom(-range, range); + } while ((yNew < 1) || (yNew > yMax)); + } + result.at(y).put(data.at(yNew).at(xNew), x); + result.at(yNew).put(data.at(y).at(x), xNew); + } + + data = listCopy(data); + result = listCopy(data); + xMin = Math.abs(xMin); + xMax = Math.abs(xMax); + yMin = Math.abs(yMin); + yMax = Math.abs(yMax); + if (xMin > xMax) { + h = xMin; + xMin = xMax; + xMax = h; + } + if (yMin > yMax) { + h = yMin; + yMin = yMax; + yMax = h; + } + + for (i = 1; i <= n; i++) { + rnd = myRandom(1, 8); + if (rnd === 1) { + for (var x = xMin; x <= xMax; x++) + for (var y = yMin; y <= yMax; y++) + swap(x, y); + } + if (rnd === 2) { + for (var x = xMin; x <= xMax; x++) + for (var y = yMax; y >= yMin; y--) + swap(x, y); + } + if (rnd === 3) { + for (var x = xMax; x >= xMin; x--) + for (var y = yMin; y <= yMax; y++) + swap(x, y); + } + if (rnd === 4) { + for (var x = xMax; x >= xMin; x--) + for (var y = yMax; y >= yMin; y--) + swap(x, y); + } + if (rnd === 5) { + for (var y = yMin; y <= yMax; y++) + for (var x = xMin; x <= xMax; x++) + swap(x, y); + } + if (rnd === 6) { + for (var y = yMax; y >= yMin; y--) + for (var x = xMin; x <= xMax; x++) + swap(x, y); + } + if (rnd === 7) { + for (var y = yMin; y <= yMax; y++) + for (var x = xMax; x >= xMin; x--) + swap(x, y); + } + if (rnd === 8) { + for (var y = yMax; y >= yMin; y--) + for (var x = xMax; x >= xMin; x--) + swap(x, y); + } + data = result; + result = listCopy(data); + } + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_changeSurroundingValuesOfGridOnImagePag(data,gridProperties,ifValue,elseValue,surrValue,op,n,isTorus,withNoise,noise,xMin,xMax,yMin,yMax,oldValue)', + function (data, gridProperties, ifValue, elseValue, surrValue, op, n, isTorus, withNoise, noise, xMin, xMax, yMin, yMax, oldValue) { + var result; + + function listCopy(item) { + var theCopy; + if (item instanceof List) { + theCopy = new List(); + for (var i = 1; i <= item.length(); i++) + theCopy.add(listCopy(item.at(i))); + } else + theCopy = item; + return theCopy; + } + + function myRandom(min, max) { + if (max < min) { + var h = max; + max = min; + min = h; + } + return Math.floor(Math.random() * (Number(max) - Number(min)) + Number(min) + 0.5); + } + + function actWith(x, y) { + var xg, yg, res = 0, ok, val; + if ((oldValue === 0) || (data.at(y).at(x) === oldValue)) { + for (var xp = x - 1; xp <= x + 1; xp++) { + for (var yp = y - 1; yp <= y + 1; yp++) { + xg = xp; + yg = yp; + if (xp < 1) { + if (isTorus) { + xg = xMax; + } else { + xg = 0; + } + } + if (xp > xMax) { + if (isTorus) { + xg = 1; + } else { + xg = 0; + } + } + if (yp < 1) { + if (isTorus) { + yg = yMax; + } else { + yg = 0; + } + } + if (yp > yMax) { + if (isTorus) { + yg = 1; + } else { + yg = 0; + } + } + if ((xg > 0) && (yg > 0) && (data.at(yg).at(xg) === surrValue)) + res++; + } + } + if((oldValue!==0)&&(data.at(y).at(x)===surrValue)) res--; + ok = false; + if ((op === "greater-than") && (res > n)) + ok = true; + if ((op === "equal-to") && (res == n)) + ok = true; + if ((op === "smaller-than") && (res < n)) + ok = true; + if ((op === "different-from") && (res !== n)) + ok = true; + if (ok) + result.at(y).put(ifValue, x); + else + result.at(y).put(elseValue, x); + if (withNoise) { + if (Math.random() * 100 <= noise) + if (Math.random() <= 0.5) + result.at(y).put(ifValue, x); + else + result.at(y).put(elseValue, x); + } + } + } + + result = listCopy(data); + xMin = Math.abs(xMin); + xMax = Math.abs(xMax); + yMin = Math.abs(yMin); + yMax = Math.abs(yMax); + if (xMin > xMax) { + h = xMin; + xMin = xMax; + xMax = h; + } + if (yMin > yMax) { + h = yMin; + yMin = yMax; + yMax = h; + } + if (oldValue === "any") + oldValue = 0; + oldValue = Number(oldValue); + for (var x = xMin; x <= xMax; x++) + for (var y = yMin; y <= yMax; y++) + actWith(x, y); + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_replaceValuesOfGridOnImagePad(data,gridProperties,operation,isTorus,xMin,xMax,yMin,yMax,range)', + function (data, gridProperties, operation, isTorus, xMin, xMax, yMin, yMax,range) { + var result; + + function listCopy(item) { + var theCopy; + if (item instanceof List) { + theCopy = new List(); + for (var i = 1; i <= item.length(); i++) + theCopy.add(listCopy(item.at(i))); + } else + theCopy = item; + return theCopy; + } + + function actWith(x, y) { + var xg, yg,sum=0, max=-100000, min=100000, n=0, z; + for (var xp = x - range; xp <= x + range; xp++) { + for (var yp = y - range; yp <= y + range; yp++) { + xg = xp; + yg = yp; + if (xp < 1) { + if (isTorus) { + xg = xMax+xp; + } else { + xg = 0; + } + } + if (xp > xMax) { + if (isTorus) { + xg = xp-xMax; + } else { + xg = 0; + } + } + if (yp < 1) { + if (isTorus) { + yg = yMax+yp; + } else { + yg = 0; + } + } + if (yp > yMax) { + if (isTorus) { + yg = yp-yMax; + } else { + yg = 0; + } + } + if ((xg > 0) && (yg > 0)) { + z = data.at(yg).at(xg); + sum = sum + z; + n++; + if (z > max) + max = z; + if (z < min) + min = z; + } + } + } + if (operation === "sum") + result.at(y).put(sum, x); + if (operation === "min") + result.at(y).put(min, x); + if (operation === "max") + result.at(y).put(max, x); + if (operation === "mean") + if (n > 0) + result.at(y).put(1.0 * sum / n, x); + else + result.at(y).put("", x); + } + + + result = listCopy(data); + xMin = Math.abs(xMin); + xMax = Math.abs(xMax); + yMin = Math.abs(yMin); + yMax = Math.abs(yMax); + range=Number(range); + if (xMin > xMax) { + h = xMin; + xMin = xMax; + xMax = h; + } + if (yMin > yMax) { + h = yMin; + yMin = yMax; + yMax = h; + } + for (var x = xMin; x <= xMax; x++) + for (var y = yMin; y <= yMax; y++) + actWith(x, y); + return result; + } +); + +SnapExtensions.primitives.set( + 'SciS_combineGridsOnImagePad(grid1,grid2,value1,operator,value2,ifValue,elseValue,xMax,yMax)', + function (grid1, grid2, value1, operator, value2, ifValue, elseValue, xMax, yMax) { + var result = new List(), row, ok, ok1, ok2; + for (var y = 1; y <= yMax; y++) { + row = new List(); + for (var x = 1; x <= xMax; x++) { + ok1 = grid1.at(y).at(x) === value1; + ok2 = grid2.at(y).at(x) === value2; + ok = false; + if ((operator === "and") && (ok1 && ok2)) + ok = true; + if ((operator === "or") && (ok1 || ok2)) + ok = true; + if ((operator === "xor") && ((ok1 && !ok2) || (!ok1 && ok2))) + ok = true; + if ((operator === "not-and") && (!(ok1 && ok2))) + ok = true; + if ((operator === "not-or") && (!(ok1 || ok2))) + ok = true; + if ((operator === "not-xor") && (!((ok1 && !ok2) || (!ok1 && ok2)))) + ok = true; + if (operator === "minus") + if (ok2) + ok = false; + else + ok = ok1; + if (ok) + row.add(ifValue); + else + row.add(elseValue); + } + result.add(row); + } + return result; + + } +); + +SnapExtensions.primitives.set( + 'SciS_applyWolframAutomatonToAgridOnImagePad(no,grid,color0,color1)', + function (no, grid, color0, color1) { + var WolframData, gridWidth = grid.at(1).length(), lineData = new List(), lineLength, result; + + function numberToBits(n) { + var result = [0, 0, 0, 0, 0, 0, 0, 0], bit; + for (var i = 7; i >= 0; i--) { + bit = Math.floor(1.0 * n / Math.pow(2, i)); + result[i] = bit; + n = n - bit * Math.pow(2, i); + } + return result; + } + + no = Number(no); + color0 = Number(color0); + color1 = Number(color1); + if ((no > 255) || (no < 0)) + return "ERROR: number out of range!"; + WolframData = new List(numberToBits(no)); + for (var i = 1; i <= 3 * gridWidth; i++) + lineData.add(color0); + for (var i = gridWidth + 1; i <= 2 * gridWidth; i++) + lineData.put(grid.at(1).at(i - gridWidth), i); + lineLength = lineData.length(); + for (var y = 1; y < grid.length(); y++) { + result = new List(); + for (var i = 1; i <= lineLength; i++) { + if (i === 1) { + if (lineData.at(1) === color1) + n = 2; + else + n = 0; + if (lineData.at(2) === color1) + n++; + } else if (i === lineLength) { + if (lineData.at(i - 1) === color1) + n = 4; + else + n = 0; + if (lineData.at(i) === color1) + n = n + 2; + } else { + if (lineData.at(i - 1) === color1) + n = 4; + else + n = 0; + if (lineData.at(i) === color1) + n = n + 2; + if (lineData.at(i + 1) === color1) + n++; + } + if (WolframData.at(n + 1) === 1) { + result.add(color1); + if ((i > gridWidth) && (i <= 2 * gridWidth)) + grid.at(y + 1).put(color1, i - gridWidth); + } else { + result.add(color0); + if ((i > gridWidth) && (i <= 2 * gridWidth)) + grid.at(y + 1).put(color0, i - gridWidth); + } + } + lineData = result; + } + return grid; + } +); + + + +/* + SnapExtensions.primitives.set( + 'SciS_empty(txt)', + function (txt) { + + } + ); + + */ + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/libraries/TuneScope.xml b/elements/pl-snap/Snap/libraries/TuneScope.xml new file mode 100644 index 00000000..e90450e9 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope.xml @@ -0,0 +1 @@ +This block turns on (show) the watcher view on stage (if it was not already activated) of the variable with the given name (slot input). It can only access to the closest variable scope (if there different variables with the same name in different scopes) following the order 'script' -> 'sprite' -> 'global'. No errors if that variable does not exist.
ca:mostra la variable _ es:mostrar variable _ pt:mostra a variável _ de:zeige var _ §_getVarNamesDict
This block sets the given value (last input) to the variable named with the name givent (var input). It looks for that variable following the scope order 'script' -> 'sprite' -> 'global' (the first match it finds). If that variable does not exist (in any scope) an error happens, stopping their script. You can check it before using the "does var (name) exists?" block.
ca:assigna a _ el valor _ es:asignar a _ el valor _ pt:altera _ para _ de:setze var _ auf _ §_getVarNamesDict
This block creates new variables on the selected scope: global (for all sprites), sprite (for this sprite only) or script (only for that blocks stack) with the names given (in 'names' list). If there is already a variable with that name in that scope, it does nothing: no errors and no overwrites.
pt:cria as variáveis _ _ ca:crea les _ variables _ es:crear las _ variables _ de:erstellen _ var _ globalglobal sprite script
Sets the global instrument used for playing notes.
PianoPiano Brass={ French Horn Trumpet Tuba } Strings={ Banjo Bass, Acoustic Bass, Electric (Finger) Cello Guitar, Acoustic Guitar, Electric Harp Koto Sitar Violin } Woodwinds={ Bassoon Clarinet Flute Oboe Saxophone Shakuhachi } Drums={ Cabasa Snare Drum Bass Drum Closed Hi-Hat Open Hi-Hat Mid Tom High Tom Crash Cymbal } Other={ Accordion Marimba Organ Vibraphone }
Sets the global volume to the selected percentage.
50
Sets the default volume of the selected instrument to the specified percentage.
PianoPiano Brass={ French Horn Trumpet Tuba } Strings={ Banjo Bass, Acoustic Bass, Electric (Finger) Cello Guitar, Acoustic Guitar, Electric Harp Koto Sitar Violin } Woodwinds={ Bassoon Clarinet Flute Oboe Saxophone Shakuhachi } Drums={ Cabasa Snare Drum Bass Drum Closed Hi-Hat Open Hi-Hat Mid Tom High Tom Crash Cymbal } Other={ Accordion Marimba Organ Vibraphone }50
Plays the selected note for the specified musical duration. This block waits for the selected note to finish playing before moving to the next block. Notes may be entered as Scientific Pitch Notation (eg. C4) or as MIDI numbers. Note durations may be entered as duration names (eg. half, quarter, etc...) or as numerical values (eg. .5, .25, etc...)
C3 D3 E3 F3 G3 A3 B3 C4 D4 E4 F4 G4 A4 B4 Sharps={ C#3 D#3 E#3 F#3 G#3 A#3 B#3 C#4 D#4 E#4 F#4 G#4 A#4 B#4 } Flats={ Cb3 Db3 Eb3 Fb3 Gb3 Ab3 Bb3 Cb4 Db4 Eb4 Fb4 Gb4 Ab4 Bb4 }Whole Half Quarter Eighth Sixteenth Thirtysecond Dotted Notes={ Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth } Triplet Notes={ Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet }
Plays the selected note for the specified musical duration. Notes may be entered as Scientific Pitch Notation (eg. C4) or as MIDI numbers. Note durations may be entered as duration names (eg. half, quarter, etc...) or as numerical values (eg. .5, .25, etc...)
C3 D3 E3 F3 G3 A3 B3 C4 D4 E4 F4 G4 A4 B4 Sharps={ C#3 D#3 E#3 F#3 G#3 A#3 B#3 C#4 D#4 E#4 F#4 G#4 A#4 B#4 } Flats={ Cb3 Db3 Eb3 Fb3 Gb3 Ab3 Bb3 Cb4 Db4 Eb4 Fb4 Gb4 Ab4 Bb4 }Whole Half Quarter Eighth Sixteenth Thirtysecond Dotted Notes={ Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth } Triplet Notes={ Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet }
Plays a list of notes simultaneously for the specified musical duration. Chords must be entered as a list. Durations may be entered as duration names (eg. half, quarter, etc...) or as numerical values (eg. .5, .25, etc...)
Whole Half Quarter Eighth Sixteenth Thirtysecond Dotted Notes={ Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth } Triplet Notes={ Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet }
Waits for the selected musical duration. Durations may be entered as duration names (eg. half, quarter, etc...) or as numerical values (eg. .5, .25, etc...)
Whole Half Quarter Eighth Sixteenth Thirtysecond Dotted Notes={ Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth } Triplet Notes={ Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet }
Each note duration is assigned a numerical value, with a whole note equalling "1". Dotted Notes are equal to the named note plus half of the named note's duration. Triplet notes are equal in duration to two of the named notes divided by three. Multiplying the numerical value of a note duration by 4*(60 / tempo) adjusts the note durations to match the current tempo.
QuarterWhole Half Quarter Eighth Sixteenth Thirtysecond Dotted Notes={ Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth } Triplet Notes={ Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet }
Reports all notes in a specified scale using the provided note and octave number as the starting note of the scale. To add additional scales to the "Types" script variable, create a list with the name of the scale as the first item and the steps between each note of the scale as the second item.
ChromaticChromatic Major MinorC40 1 2 3 4 5 6 7
Reports "#" or "b" of the input scientific pitch notation contains either.
Reports the note in a specific position within a major or minor musical scale. (e.g., The third note in a C Major scale starting in the fourth octave is E4.)
11 2 3 4 5 6 7MajorMajor MinorC40 1 2 3 4 5 6 7
Reports the distance in steps between two notes in the selected scale. (e.g., In the C Major scale, there are two intervals between C4 and E4.) If one or more of the selected notes is not in the selected scale, the block reports nothing. Notes must be entered as scientific pitch notation (eg. C4).
C4G4MajorMajor MinorC
Chromatic Major Minor
Reports the notes comprising a major or minor chord, using the specified note and octave as the root note of the chord.
MajorMajor MinorC4
This block finds the notes in a specified chord along the selected scale. Roman numerals differentiate chord positions from octave numbers (e.g., the Roman numeral “I” reports the notes of the first chord in the sequence). Upper case Roman numerals represent major chords within the scale. Lower case Roman numerals represent minor chords within the scale.
MajorMajor MinorC40 1 2 3 4 5 6 7II ii iii IV V vi vii°Major145367Major236145Major72
Converts roman numerals to arabic numerals using an association table.
Reports the notes of a diminished chord, given the starting note and octave of the chord.
This block reports a chord and appends an additional note.
May be paired with a musical duration to insert a rest into a sequence of chords.
This block reports a series of beats that tell the drum when to play. Beats are represented as an “X,” which can be typed into the block. Beats can be added or subtracted using the arrows on the right of the block.
This block reports a drum pattern, assigns a drum to it, and sets the duration value of each item in the pattern. Different drums can be selected from the drop-down menu. Beat durations can be selected from the drop-down menu or entered directly.
Snare DrumBass Drum Snare Drum Crash Cymbal Cabasa Toms={ High Tom Mid Tom } Hi-Hats={ Closed Hi-hat Open Hi-hat }EighthQuarter Eighth Sixteenth11 2 3 4 8 12 16 24 LoopLoop
This block is used to group sequences of notes and chords into measures. Each note or chord in the measure is paired with a note duration. The pairs are entered into the block using a list.
This code block groups measures together. This can be helpful for separating groups of measures that repeat in various places throughout a song, like verses and choruses. This block works with both notes and chords. To add measures to a section, put the measures into a list.
This code block specifies the type of track to be played and assigns it an instrument. Both the track type and instrument are set using drop-down menus. This block accepts notes or chords paired with corresponding durations. This block also allows for the creation of note or chord loops that will repeat for the whole duration of the song. Both types of loops may be selected from the track drop-down menu. For a loop to play, it must have an accompanying track that is not a loop.
MelodyMelody Chords Loops={ Loop-Melody Loop-Chords }PianoPiano Brass={ French Horn Trumpet Tuba } Strings={ Banjo Bass, Acoustic Bass, Electric (Finger) Cello Guitar, Acoustic Guitar, Electric Guitar, Overdrive Harp Koto Sitar Violin } Woodwinds={ Bassoon Clarinet Flute Oboe Saxophone Shakuhachi } Drums={ Cabasa Snare Drum Bass Drum Closed Hi-Hat Open Hi-Hat Mid Tom High Tom Crash Cymbal } Other={ Accordion Marimba Music Box Organ Vibraphone }
This block is used to play multiple music tracks. In most cases, several tracks with musical instruments are played in parallel.
4/44/4 3/4 5/4 7/4 6/8 9/8 12/8
This block determines if the combined durations of notes or chords within a measure are correct. The combined duration of notes within a measure must equal the number of beats specified by the time signature. When reading time signatures, the bottom number determines which note gets counted as a beat, and the top number determines how many beats are in a measure. For example, in 4/4 time, quarter notes are counted as beats and there are four quarter notes in a measure. In 6/8 time, the eighth note counted as the beat, and there are six eighth notes in a measure. The Beats in Measure reports the discrepancy between the number of actual beats in a measure versus the required number of beats. If name durations are not entered correctly, the block reports nothing.
4/44/4 3/4 2/4 6/8 5/4 7/4 9/8 12/8Actual2 of beats
The Note Duration Value block reports the numerical value of the input duration name. Inputing a list of duration names outputs a list of values.
QuarterWhole Half Quarter Eighth Sixteenth Thirtysecond Dotted Notes={ Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth } Triplet Notes={ Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet }
C4C3 D3 E3 F3 G3 A3 B3 C4 D4 E4 F4 G4 A4 B4 Sharps={ C#3 D#3 E#3 F#3 G#3 A#3 B#3 C#4 D#4 E#4 F#4 G#4 A#4 B#4 } Flats={ Cb3 Db3 Eb3 Fb3 Gb3 Ab3 Bb3 Cb4 Db4 Eb4 Fb4 Gb4 Ab4 Bb4 }QuarterWhole Half Quarter Eighth Sixteenth Thirtysecond Dotted Whole Dotted Half Dotted Quarter Dotted Eighth Dotted Sixteenth Dotted Thirtysecond Whole Triplet Half Triplet Quarter Triplet Eighth Triplet Sixteenth Triplet Thirty Second Triplet
This block assigns a number, frequency, and amplitude to a tone.
11 2 3 4 50.5.1 .2 .3 .4 .5 .6 .7 .8 .9
This block turns the specified tone on or off. This block will play a sine wave.
11 2 3 4 5
This block turns off all the tones currently playing.
Passes through the signal from a MIDI controller, allowing the user to play the controller using the assigned instrument. The name of the MIDI controller must be input exactly as it appears on the user's computer.
MPK mini 3MPK mini 3 MPK mini play MPK Mini Mk II M-audio Keystation 49esPianoPiano Brass={ French Horn Trumpet Tuba } Strings={ Banjo Bass, Acoustic Bass, Electric (Finger) Cello Guitar, Acoustic Guitar, Electric Guitar, Overdrive Harp Koto Sitar Violin } Woodwinds={ Bassoon Clarinet Flute Oboe Saxophone Shakuhachi } Drums={ Cabasa Snare Drum Bass Drum Closed Hi-Hat Open Hi-Hat Mid Tom High Tom Crash Cymbal } Other={ Accordion Marimba Music Box Organ Vibraphone }
Reports the corresponding note (in scientific pitch notation) for the specified MIDI number, matching the use of sharps and flats to the input scientific pitch notation.
60§_pianoKeyboardMenuSharpsSharps Flats
Reports the midi number of the specified note. The note should be entered using scientific pitch notation (e.g., "C4").
Extracts the note name from the provided scientific pitch notation. (e.g., An input of "C4" produces an output of "C".)
Association list for note names and their corresponding MIDI numbers in the first octave. Used to convert note names to MIDI.
The second input is an "association list," a list of two-item lists. Each of those smaller lists has a "key" as its first item and a "value" as its second. ASSOC reports the first key-value pair in the association list whose key matches the first input.
ca:associació _ _
Extracts the octave number from the provided scientific pitch notation. (e.g., An input of "C4" produces an output of "4".)
3
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0020_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0020_JCLive_sf2_file.js new file mode 100644 index 00000000..6bcbd31f --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0020_JCLive_sf2_file.js @@ -0,0 +1,260 @@ +console.log('load _tone_0020_JCLive_sf2_file'); +var _tone_0020_JCLive_sf2_file={ + zones:[ + { + midi:2 + ,originalPitch:2272 + ,keyRangeLow:0 + ,keyRangeHigh:28 + ,loopStart:6394 + ,loopEnd:14339 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.12233333 + //_tone.GD_BOS_B0 + } + ,{ + midi:2 + ,originalPitch:2662 + ,keyRangeLow:29 + ,keyRangeHigh:34 + ,loopStart:9402 + ,loopEnd:16558 + ,coarseTune:-2 + ,fineTune:-41 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.04145833 + //_tone.GD_BOS_F1_BL + } + ,{ + midi:2 + ,originalPitch:3555 + ,keyRangeLow:35 + ,keyRangeHigh:40 + ,loopStart:7915 + ,loopEnd:14455 + ,coarseTune:-2 + ,fineTune:-57 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.02720833 + //_tone.GD_BOS_D2 + } + ,{ + midi:2 + ,originalPitch:4276 + ,keyRangeLow:41 + ,keyRangeHigh:45 + ,loopStart:11153 + ,loopEnd:19163 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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gKoS++NAUBqyk5ogGSpTtxvLsdqKf6TE4mCBCJNxDeVQbIqocQkKskj2v1hH3DAeT62K3cNxkDiiNgP2KiI+DOYHcvwf+cuFTYiaNkxYQOwpsxT65nuOMb8feF/eky5a2cP6J6TYc5k3821iD+xlo/OEKjgvrKj9agZEysZXiLdYIZgPdFh3ERabKmTBlFGAOGtG9CuXLtTqlEVouB2ryw++y4hYzAtcclzXXOyHz682etUc6tpUful+GKzfllMhXjhEV1XiAAGM//OUxPM77BqShtPXcXe4AMJGkNpoAuoBo5hKot3XYHMlbxI0ioFkxEPAwte7X4TMFQNFlsi0xpiIjjq2DxbS26UKWakGyp8QOge/kAKcyUMMcgCQUTW07IIkL3x4wQXnSUkVuSZceaUCISKum4F6Db20peSoeHvwA89PJ2uX6mq7xYVJ2ozxqF1hbNIcJBIXTMwg7NmM/uth8p5lBOHXrfixVc/Ou5WEA8v7uZ/85v6DCnZm0CctQ/LqkMyCduwJyu3eQboX8wwllHjt0I2zapzP4Ms7t19/nf/Oncn69eEVP3/bm7GOeN7XLkpv7rT3//OkxOZE/CqN51rIAfZ9+sd09r9/M2+3981/ctbwy3qxST27tJDuN/8O4fhzPueNLnT7q/lz/537r0MDQDdxj3p4rG5qttwxiMGNyQNZefAANaGYWCJgU8GLQ+EBEABkzrGjJa2No6g24KjBQLMEAk4OdDWlpMslQ3HHzLBDMChowmAi7xnRsmiAgZdJBjEQGLBOYmBJhgApGlkTAAFUqMCioBGIxsczFBRMIg5E4ZAhioQGHBFA2My7KAkDDwCEMxYNTG5eMeO0xyJTBYTCBc5QCEhhQMA0BILQ/xaReIzo0TPQOMRhdtTAoKCwlMZgMxeB1VwgCGFgMCA4BRfuzjHlzF/lomBA6TBRl6gxgABmDyIYPFAMFQVBBhgAF/kH//PkxOVxBDqm/5zhEACg8gApMEFY0fYTEmdLDNJXa7uki1hGtREQgRKpx4Af5BUeA6JixJSIAyYFAZQAzBgEDAQgMLPvsuZwXJf36WSQzDstiMMp7LSe+YpnZWCVue+UeDgOCgGYaBgAAizE62BoJwwAK0N4/yRCtCmaY7suTKo1TVXZYa+z/RqrDLWX2f7HHLLdWs6MM2K9LKmYuDIH7TELMIUGBwCWjVjLaFpA4AGDwKBgGn2gosItQDAtItk7eRvsa3jEZVGqatKrX/utDT/SmM0taGmtU+Mabi6Mgz+mmZTe7l8qrd/KldJMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxPQAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.03245834 + //_tone.GD_BOS_C2 + } + ,{ + midi:2 + ,originalPitch:4700 + ,keyRangeLow:46 + ,keyRangeHigh:50 + ,loopStart:13127 + ,loopEnd:20179 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.04287500 + //_tone.GD_BOS_B2_15 + } + ,{ + midi:2 + ,originalPitch:5300 + ,keyRangeLow:51 + ,keyRangeHigh:54 + ,loopStart:20520 + ,loopEnd:28942 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.04375000 + //_tone.GD_BOS_F3 + } + ,{ + midi:2 + ,originalPitch:5600 + ,keyRangeLow:55 + ,keyRangeHigh:58 + ,loopStart:28332 + ,loopEnd:35859 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.02175000 + //_tone.GD_BOS_G_3_1 + } + ,{ + midi:2 + ,originalPitch:5900 + ,keyRangeLow:59 + ,keyRangeHigh:62 + ,loopStart:29533 + ,loopEnd:35767 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.03383333 + //_tone.GD_BOS_B3_15 + } + ,{ + midi:2 + ,originalPitch:6155 + ,keyRangeLow:63 + ,keyRangeHigh:66 + ,loopStart:27736 + ,loopEnd:35356 + ,coarseTune:-3 + ,fineTune:46 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.01145833 + //_tone.GD_BOS_E4_15 + } + ,{ + midi:2 + ,originalPitch:6761 + ,keyRangeLow:67 + ,keyRangeHigh:70 + ,loopStart:25809 + ,loopEnd:33572 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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M1ZIGd7qialrMs0rL938LBM3lZZ7GZTav7jxTt9lsZik/c6O5Nl/OJpOyV0pfPM1+tJVVV50bHZR5BJqZZ0KS4gJ+lW6mpv21ojsOxalAEAABsAW3t8Ils5F7FPGLb+NVGcy5Lseq5ai//OUxNkvRCJ/HtTbTH9QzgGc7+7cDUsMiM8Awb9WcpbTf+eJWFkI8MdV22YpojooRSwmhHNV6lkcCS4R8Yq/DOAom660AhoIsmXyAjw/LY2t/NS2Q4VStjkuMoA7+pAjzFQp4e863dQrg9MxwncpIIoeLjQZZZPfJUclOl+TSF/7EqXtmsNlu/OJbHdGP5maI2ZalIoPRrVMh2u6qzvPd1oMsam+6tm+paiZ16YAIAEJwB6a30oWVpnVDBl18HCNGfGlMWltrnY598WhUfP3uUXbyGYu+e+91q0Dw5GLqHAorWFK34cKGVFRQIYOCDQ2//OExP8uvCZ7HtUjRBd6HqTJgB6AFBhug/wgJBpSPXWZBEqIKLTIgN59ah2J/lBRDyR9cyeGqPyymkNUT4i1ahTjR2kvl2tuoEh5NF5b7Bkjt+I601pxiChrVIga7J9Caa7aR4K7Kz9T7oZY2MhDzELuQZQt6cG9r1dG2bz6hTPWxQAQAAnEp99vhcGPKAc47dd/65lcoA3Hi+Vj6GbhA1Bnrmr0OQwKDAedAw4gaCCYfcnzQwGcAcKBEzBuMwIs//OExPct/CZ7HtUVVCeAsAAULD2wIwgDA4FmY55XpoIk2IRgDEwGpAsgqakECYBoWFHK+nrIGCY8BpYMgM4MoOwuXWaEXQ+gRxOChy1eyVM3SDE7Ju+xtPB4TRkEEyJjwgxmcZi2tJuYDdQMUyPPexYIOaX/IxJBH7qdAYPW5mQJBv1H3d0tOSi2dldSK6nXdaZJWvdpYaut3TTFym6a66tJ/tRHh1NygAdQcQggcgdDwbqaDoZg6aQOCmAALmND//OUxPI2PCKDH1mgACXmYuacenxwhgQGYUWyZHk5pWMJnTKhcxYpZ4m2aHIYJC40hhQBmDAmYeF4EA6BAkCJyjLmbRyGB8xULDBIeHguxSomi1FhzAjAQQDAoY5NJqU8Fm4sqqMAEwcEzBQDZNALAYwvkyAMDRUXEgSDAIYCLQsAACGDD4UDAMlSv1W6OvytJW555MECcCBg1kZzDQFjb+N1dF5UBUpdlhsSq2ZrLtWqDgWoMmKYNCpgsDmQAiBjeluIQAzprUpdlcrSnGpv5lr9//+YBC6TYCDr6rUcNU5VCSVhQAV3py0LKYCi2WXv//O0xPxaE+JbH5vgBLY/EYl///////+6s+ggL+prmAgAAAcCQDAQWCrNYeWgwZMeHpVDWP4zTtOVVpYzrL/1//////////7hpWMQkDjvu9rHJCsBBEsEQFGgkux/G/h6GC9SUE5Kv+rlWhrGlpa0qpoBd2M5dyq3qZVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxNYAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.03437500 + //_tone.GD_BOS_G_4_1 + } + ,{ + midi:2 + ,originalPitch:7058 + ,keyRangeLow:71 + ,keyRangeHigh:75 + ,loopStart:29418 + ,loopEnd:36345 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.01962500 + //_tone.GD_BOS_B4_15 + } + ,{ + midi:2 + ,originalPitch:7556 + ,keyRangeLow:76 + ,keyRangeHigh:82 + ,loopStart:27197 + ,loopEnd:32689 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.05275000 + //_tone.GD_BOS_E5_15 + } + ,{ + midi:2 + ,originalPitch:8354 + ,keyRangeLow:83 + ,keyRangeHigh:89 + ,loopStart:9330 + ,loopEnd:14864 + ,coarseTune:-3 + ,fineTune:39 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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JmaJqPGR0B4x4TY4cUvS71s9A8ktQ+fZ0RygdM+319X5keMtYuY0SDRIdNcq9IMVisaCI8DDhWrtzaqAFBh2nDpVwTIdeaAxYWdmWqRZrkegxmbp0DQLeN6WSubc//OExO8ydBpy/tzRfTtjIiAQGDQABuElgSA4N3kTKJNEio0QqFhNDjC+EMQGqaVomJNjkCAgTCgBQ9IgaEEa1lrN5kQAOWRPyMPoMXDilJhABQRFgNUE4yCCHX/84vQJk4AKKAEBwLlBg4WMfI2wwOG8jmJFovlExHAWECwT6JZPspErk2QcQoAYFgMMBEQuO9BBnup9SmSW6KmVPLUcpG4EAOJTN1JprezJMtqNK5eLpmQ8QSNGZlmZFw0cBQLX//OkxNg/LCJm91ioAXW11Zi6K00EJYJ8zWpFO6aCSRUHwtlvZVR0yJE4xcHafPQUqEXMypys0CACtgJGA0yN1WmqEJsQqbcFghmMGeTL96VsnM6FDSA4yizPS1wMbGFApoKeaOcnUrh211uSmajxPLZM9lMGhgwUSTBQCOoWQvSr6lOM4kOE6hcPmCRoLEdBxgQOBaDRh4OhwAGiQOAJEYwAB1SAIMAgCpBkwHCAoYPDIIUBEfG1pcXwMALIWVF21HmfGFQoghch9nZfqAoWn8WxMdnkaRuDmRWCFcmEEGCg/RMfTALxlgAhYFCwSZT3LfOy+oYXJZcS7e387TNUMbEQwaAVjNWex23YYaDQgFQ+kk8NFT7+7SOKIzEuzO6z//PUxO5ozDpy/5vhIPTUc1/ojKmkTBkUWES8XHGmZOSmCyZgjXF3oIDAARFgbLoZoMorNt2XsOg8xeHHChyvIZTaaiEAmMQxOxCIKbBYAiygSHk1+Nx623USBzEmOKwsnVIqkjOXJUGa7Loi7TystZ7i6JigCQixQWuxxoUXyr4yyxqYfCXTt5rYqDDA5RWs30slEjQ8ULdtxICVDNxZ9GEI7vE+smWEQ5F0lxqDNdi1VnUYaa90gmodgd1oRE5TPOoqiFl0cUA0/l2yoVBEESVJEKhUBIiEyoVDNEQawiFQqDTXiqHQKgFgbHSDUGoqLCwdA2a5FRVlWoaRUVaVACjg6FhocizMLC1yKg1ZTahskVHgpAAgtNKFhY6uSRU2A6BUaULHXKrySuzDQUitkioquwsLLDarBQtTM0rTFLDNf/+q1AsLKzXK0ULUULCzaioq0rUNcreqrUCwsrNeuzUzHNaioq0rUNet8qtQLCyw161t8M1ySK3Krxf/qtQULUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//OExO0vfDpm/8lAAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.00725000 + //_tone.GD_BOS_D6_FI + } + ,{ + midi:2 + ,originalPitch:9097 + ,keyRangeLow:90 + ,keyRangeHigh:92 + ,loopStart:9286 + ,loopEnd:16246 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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jncyQildd7rQq2IYmXHqlIu4igpcCZlVu18bzJMxSWeJpgAIOkLxzvpdslVImIv1mqxEaKOKSN74EbG1VZanKTZZ+Z7Nr7EhzD+Qw0dAOYAIC5gEgpGCaEwYSANhhYiOmZa6+ZJgKJg+gOmA6AyGAjp8F7GSM4ciDomyuQxya7IJHWl0+3V/3cj0nwj0olTWlNBEAAt0lADMCMC8wSwxzFzDlMUQFABAMJCoPw20V056KzEYr1m2fJoUbeOQYQC72Nd/ZyxSw3jL5be5Ui6maXQMBTJgbQMAAtpQ5+1WvPDFuHo64MMymGmgvC5DrwzWZ8wGBu4y3lyx//PExNtT3Do3B1jwAI3q1vDFhEdkithgDAKw3I+/zXOa2+0bZ070TbnEa8wsFOOvCWvvM/6vo5CK7usJtwl8HAh9uqjr4QTqUpCAwAmLy+vqmx/7++51anbPcL+td1hUo95U+eVvtju92bGu40W8sr/MMp/nMcrFa9lj3G9rWsbmSoiKh5h4hwqAh1+P5hYMhgDD0XQgjjCw6Ta6B6ujFwGDIMtTfh3TH5fd4mKYeGSwpHHkgmxBU88wIkAzMA+AiDAegCQwTIKDMKcBhTA0QkDeNZM8AABxgGQBgJAcBhxQ5mY0IJMGiOs0xlPqYpTRGDHCMBLAEW3T3TXuGS3hRhiew2CYEeBFGCKBLphhQbDP0tW5dLbs3chOtQOAjAGgKcwTYF3MF4BeTACgIkwSgG5MI2Ci6ut1cNg0AlKAHSLsgcx334MHaDTzCWgKAwl8LSMAQAMjA9QVYwT8ECMAvAlseZZb1k6LT0ACW6fb2iMABcFaJgS4EYYDOAlGAYgQ//PUxP5zq+JzH534RMYEuAsGAFANJgEICgYBqABmAqAQJgCIBB/////+Xrdhd7T7yK7Cl6NfZ4rAhKEABCYBoAcqOmAGAD5gFABiBAB0wCoAfL8AwATMAYABQqAMAQAN////////QmPkuxdEsSEZatddD0qbrhRXde2lepgYAOAIWEJxgA4AYocYAGABJXJ7FrnbQnK1ggAHcJRv//////////4ure5ziLvf5dC31MG8iywjaMgZpL2GPa19ejI23L+x1YVYsArFgVpLasifWMI9VGVKmjy7mvNyZdANTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxNIAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.01358333 + //_tone.GD_BOS_G6_7 + } + ,{ + midi:2 + ,originalPitch:9547 + ,keyRangeLow:93 + ,keyRangeHigh:99 + ,loopStart:4491 + ,loopEnd:4583 + ,coarseTune:-1 + ,fineTune:53 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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RI5PrszWcvGpiZDtBH5ubLTYzoGaR4/Z57HoUbovbKZvvM1zzycyDr6RKBvplDwv9M3ym8WhENDkT//xf/9t3yzciciYbURTFKendzD43xTX1rWFi3i5dQDzNdfCeqwsydqHpUzp+r7Sm+YbSwzFXefqHnZn//OExP427DqKXsyXyHN+dU1M/1qIv7FaWMwU/0azrZ0tmi0fCNFQpEDaGDxsqixVRRrRSSMkqlMomSKk6ySZdQMdLWiiXTZJNkky6aok0KCEckTa3/rrrapFdaJ4yrSSWanXS6q60ZiXS6RYvgKJB5mJ09SSMyIltNqnOck960Q33tmprOtY01arxY7nOiIdX2PwMgZOnXOPOt27n//WpqXZS6bJTkkjjnxTN6yvEO2WatO4ma6aqXcAO1rJhuMw//OUxNUyPCqHHsUXPeQzhiDOGWO5SS6Vswhh2F2KAMQdzscYAhISITEWI8l2IQ5GH8chyHIhyxSOAsIhIpKSxyJTEYhh2BAESxrHa/L72edPT09Pn+eeeebvv/L8vp4bctrbO3Ll9TOnt5555/+9555591hK2RtBc+vnn3//+55597nnXr17ef388902887ee88Kf+/hj/4WNWMofjbOC6g4q1933/p6fu86elr18+/nnnnnb73/7nnnnnnn+edvPPPPu87d7tvf/+913xYjB2+4Ya3nnn3//eeef56/Xc69e/T5/vPuedu3nY73POvT//OUxO89zDqLH1jIAOeXdb5Xzt191cYPYLYKYIcAcJx6PRUMRwDXyDJiwYJRg/z3UR2AhKhj/NGqC80HAjEMf8yU+MVAzJikwAXIhVCV/+z4AghIXmRoSA0xkYMmfzFjv//4uuV0lMgaABCCYERmEH5rAicD6f//5hg2JABgIFS6ZkbXiG8gY8oAEEBgWATb///8CBKQBgIQ/r7KVJUl5lvQUnM3dJZ9v////a4XCdl4lzMBZKlsyl3nCYFAbdJVVT2Uq//////qRqIw7BUZoKeNPSl64VvD8YCiU8+sps1Zn///////+Ro7I8uYplDN//O0xNpKQ9qPH5rYYYbk4MCtKfWdfZ9YFnXCfafqVtzVbOaps5qtn//////////8BNxSFbxW1aq+ms0USdFpq+ms0T7Oiy1ozKYTEtZbmq3a1bPWvrVs9ZbmqxZMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxPQAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.00529167 + //_tone.GD_BOS_C7C_EQ1 + } + ,{ + midi:2 + ,originalPitch:10400 + ,keyRangeLow:100 + ,keyRangeHigh:103 + ,loopStart:11288 + ,loopEnd:11488 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.00541667 + //_tone.GD_BOS_G_61 + } + ,{ + midi:2 + ,originalPitch:10600 + ,keyRangeLow:104 + ,keyRangeHigh:127 + ,loopStart:8350 + ,loopEnd:8596 + ,coarseTune:0 + ,fineTune:25 + ,sampleRate:24000 + ,ahdsr:true + ,file:'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' + ,anchor:0.00745833 + //_tone.GD_BOS_B_61 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0100_SBLive_sf2.js b/elements/pl-snap/Snap/libraries/TuneScope/0100_SBLive_sf2.js new file mode 100644 index 00000000..6774d6e5 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0100_SBLive_sf2.js @@ -0,0 +1,75 @@ +console.log('load _tone_0100_SBLive_sf2'); +var _tone_0100_SBLive_sf2={ + zones:[ + { + midi:10 + ,originalPitch:8900 + ,keyRangeLow:0 + ,keyRangeHigh:70 + ,loopStart:5822 + ,loopEnd:6101 + ,coarseTune:0 + ,fineTune:-28 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Music_Box_C5 + } + ,{ + midi:10 + ,originalPitch:8900 + ,keyRangeLow:71 + ,keyRangeHigh:79 + ,loopStart:5822 + ,loopEnd:6101 + ,coarseTune:0 + ,fineTune:-28 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Music_Box_C5 + } + ,{ + midi:10 + ,originalPitch:8900 + ,keyRangeLow:80 + ,keyRangeHigh:88 + ,loopStart:5822 + ,loopEnd:6101 + ,coarseTune:0 + ,fineTune:-28 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Music_Box_C5 + } + ,{ + midi:10 + ,originalPitch:8900 + ,keyRangeLow:89 + ,keyRangeHigh:97 + ,loopStart:5822 + ,loopEnd:6101 + ,coarseTune:0 + ,fineTune:-28 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Music_Box_C5 + } + ,{ + midi:10 + ,originalPitch:10600 + ,keyRangeLow:98 + ,keyRangeHigh:108 + ,loopStart:1652 + ,loopEnd:1664 + ,coarseTune:0 + ,fineTune:29 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Vibes_D6 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0110_GeneralUserGS_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0110_GeneralUserGS_sf2_file.js new file mode 100644 index 00000000..b885fabb --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0110_GeneralUserGS_sf2_file.js @@ -0,0 +1,95 @@ +console.log('load _tone_0110_GeneralUserGS_sf2_file'); +var _tone_0110_GeneralUserGS_sf2_file={ + zones:[ + { + midi:11 + ,originalPitch:4600 + ,keyRangeLow:0 + ,keyRangeHigh:48 + ,loopStart:11683 + ,loopEnd:11936 + ,coarseTune:0 + ,fineTune:-25 + ,sampleRate:30000 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAANAAAbbAAmJiYmJiYmOzs7Ozs7OztNTU1NTU1NTWJiYmJiYmJ0dHR0dHR0dISEhISEhISElpaWlpaWlqmpqampqampu7u7u7u7u7vOzs7Ozs7O4ODg4ODg4OD6+vr6+vr6+v////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAZJAAAAAAAAG2z2ofroAAAA//u4xAAACYRTa1QzACV+wqprO8BJwBAAAp2bfSIiIhO/ERAAACyZNOz7v3d3dkyaZAgQIIAgsEAx4Pg/1AgAwfPp+XD//xAD4Pg++Jz6gw//wfB//+TBAEP4IAgGP//5d4AAABAAAACSpOa+hhIDhggHwOTowhAQwYaUFAoY1AYYVCgZewMZhiOagqwZYgiYEgcEAcYKBaYIBeZOCmPAMYpGRKGTLBOIwWAguedDhhMiAAGgQDmAwUYNDgKILEQCBQQbmYKDoCTAwNDuQCQe8bCjERjWqsOmTdRNVQL+tpBUOPs5cUWCjSrHEmW6Qa2dHRMBnb5vpCsG4mHR2Dh65N92L8tRfIDqHAuColceu8pSlmwa1DU0/NLHrVMNChKCBnsh1C6bU6n8iYevM/NimYri2CxnnxmSQpYCjEXimKahvdz1vbtmBQO/N7v7ub1+PthEgZCud/8sd0rcHJuwDDy/olJYZlve2Ydq1KUkAC3r7dWbJ94//5ZO3l2t7/Qr7jrq+zww5/YjP5/ZsuzATlOVKYr+dnVeMrYRKnse/lfpt8zrfqVcn4/WsgEGhgGsf/f5e5vn8/HvP1sYBrULy+0AAQC9MUEJZr4Iz+ZBgyYMWGOgxyeGYoHF4kFQ4QgBKRtHRjox4hKBiD4E3wGVACti4ThIkkaCyByCHByQGp3A4QIJDmoGB90DiBBR2mJsRNR06mnTWpRoWidPEaBACAAcEpD0fOsdopOxspFA+m+XhCExRUXDZ0kUiwfL8yMg5YkUkjZjg2h5XU3f9qykGEhsrpN///9Zwc1I2+eUhRJA2/M0e59HpooFopCeiskg663VW6k1K0Xqa6CtJGkhdBNaCaJDDkyqrIqNkGwSLlRPOZopAhozhQBFR+mVDIYdC5MSzEwPJDKYwAx/b1EJDDCGTGQwCDRUCF+DCoKEYqBQHMEANW4dOJ0kBCQFAgFLwp7GBQApjLXHdZTIcBJjGYmMgW4LrJfKxUkJ5PS0KABS2GZOmrLo1Wppb2QzNFH6KR5X5erYY8Jr8O1cj8hgjKVZyi1E+2IzlBVBTZ0xgcCQ9uvP65S58NymOc6ZRAAKXZg0zC1JOsmo22WtSlzIpTM1DTgfAu3umizLYyUy0DF0VoU1VsxYBRRoePVrOFs3//uYxM+CmmH/Tn26ACSHRCgpyePVGZdAPmMN0WyzHV2vbnrcpwlN6phP5KA6yxzsY5Wsf3+Oq+dTf6s591jcp79PRV52K4VIpduYS3C278ggKvGqlLef5YI+0mpFRZ28O1tWfq573+PN2a0BMCwEFpNxIDAAtnBBUPAlLZYwVBDwnS5SIxYKgMwEA31XLDz1LkbhLkhQKawFHk+H8tww6jB33Q4TkNp5GSAgVhWBKChgm3uW0VMtiX1LS0sNZy6ircwo6tiUa7efYxCAIPs/vO72r+94V9WvoNVd1RoE0tTG9y/a3s1NyfMCJEoAvisgcN2caA3zVLWmg6aStRkigRUGlBFUqtJSFk1Hm1zJzKvUggRofAx++gRIsjFcxD9TWhpI3zuG2Rd4u8hzQ8PqHNaHXVrye2d2h/uNK3pSaPBjQPmsLOL2896wpaQ1LBi1i4xWE1iYx6FLs+11TpjIAAFAALR3iwLmFA4HIwFjQKgUEASC4iBMlAA50Z4xJFMKgQLAsHAgRAGHAcjysMzVH1oAAM8yzBBpySb2xmJv88qarQWTkABGLpDAAAGb3IxHJnlzLkKaFHqdYGKVv3RfezpucpbNvBuIeY8sq/L8N1MrXcZuxq7Xp8rzYhYu5N2pfTXu87VkMPSOTUoiPoqaVuvZoCUSHrVuls3t5V+583e7cwwmxQN1andWN2sMsquO8Ldru8Xr59Xi4rrQrt3WtU8sRgTlcGZu+MYpXc97y1l3v0iySuNjp3jLD6NWPi14//uIxOqAHnX9SU5F/qxDRKgp3L7stI0tY2Imv9wXk7C+cW2Oqqv7t0ldwrZfYitsa0a8ErnWG6PCj038TQZ923ufVJNqABAYBCXudV5hYwBroM5gMDQCBQiAECgYJAAdKrOYDjEjgDgGa4oMj+nW6zXV1F6R04zB0BEA7MpLqNKo0aBzsxwGACQFGm7M2Z6eklipnaGQBoIIrQ5h992afPLKcs5501LjNGAYD2sd/93v8x58zr5ZcIdtFgKEFCXxvMsBp3ZYiSvIzsQaWi5VUR6rkZG1q8SBakFipZ+4v57KYWUsbDSC3OTHNeRk0zMSmhuGPvECmv95rYY2o+/97+zh+mOm969bJIKkl9x0bV/g3KTcsc5dlTU8qOta6p4dyWB5s83FBopaRLU9mmxQUJup4NzPpi0HNatJFGC+KOQeCowCAASjnMLgbMG5GNTS9BwJO6FwSMRAdZgezJUVCLVcRAIoOhggWt1k5cECACBASMEDpMZAQZi6mNNStDfUiAR7k9UfjGAWigY28fxu7LYnUrTNxQVWiGLj/fGZc6L3cl8OT96NOzGo7SwWSAldmom8DR3Xln40e8mZlRyuP1MLtgXQCKqjlICFe1ODO4quJt3J9nrnEtMZX5t/O81v4WWNztGvPvMBpzC+6fWYDbf7i3gb1ncv//uYxNmCH7oNQU69POwqRGep16edj6vjclysu4WznONt7PXTy+L0rJuakZsNybVteM1CaaeShcWU5JykWlOLNJk0sgtsWGlLbR4DqJvqQFJ2JuQgXVbIDBhCqTMMLnoyZyOX22MRuhGKyGoAAAwABdpzB4ETEs5Do8SQcIxaRDmHEuvg6XHEwFFYUA2JN5B8VdddqlKh8CCIXwMkCzW8h2kty2Gkx2+h8tAYajsGApA9uUSilhnurhAAVK/UgbDjTV07rrVbNUa0CLgAtmv8yjNg/1zL9+eDf45TZmyjM7+MUWGGS+yYXhvXtcp2fOoWsa1hd6SJU6jTSoiNlGZxiuadySmUc2HqI76XQrLahsVAmWL8lcwvE6TVqaikTakF93wgxt7uw89hWxZaqSCU8zwapDaU3yKSmuWJkD7fI0x1USNPC10/vJ2V7XcQrqeDKptHJ7eqvYqvLbtoAKAsO7XrdMOTNOWQkMFwJBQAOKYjA8sOchBaYACWKAAzd1HLay6V+kJAFYIIglHlMT4h2il0qVM2MupAbXhEAYJGtEWGtWpdMTGdfEZARWuKzi+Ms+Mag/G9Vk+6DXKnOopW+/3TTsv7r/+3S02VXfa6QGq2md393qmULMHOeOcV83rF56tb53zTKJGacvp8DUcuuIq3x9fkGw+09z9/Wva+1GvXOhMYn11H7mQnvM91+jvPPr4S0y+6UdFGFuYYtqO8T3PW6elsny6lhJ5ZwWVQxcol6Z2A6mkgVNIxdXdezVUd//uIxOqCHhonQU69OOOvxGh11hvVXeNc9odDpt0AAEAKhJr63mG4BGB7WmlI3F+y+CEwwXD1fhx6VRg2JQBAaBpFPtdicFwhWV+0eAhDUHG3mKemXBSCIBXTXqRAGYRAQRAXFcqeZt3e3bINAtXz00TnUVXjRr+Pd81lL7+/pBYNZNXzzxLw0ueWOP1/JylKrgP1f0cINmbQnZzsLYIY7Dl0pOYv0NmoG24VonXjXdFfb1s3WFLvNSfWytna01Wg+VmeyxvNqr2ry2yXa5pJoc3Ed1stv+kzRlbqacw3s/lgRAc9YnXq6WYQmbJWxxzOmKtIibT2aRg4mzI3upJ3DJgoEjDQAAwQqE1PrOYHhIYMNKaYD0YDAOoESgWYLiAhucXIaYLCSBgLfeVw++r/wzIEOtCOJgexaCyeBK0mlcpLxNgdYLDjJrGWSvKkwq3MpZKxAbTggvNlOdJdapDmsLe8cKPV6zJAwXLtd/qpr/6z+/TWq9iQ5V7kyvLO1WeuxW/d82RrHxPxOykQKK4FTxHA8w3cU4ShGl15x+IIZvbSXRMW4+9Y8nbm/NnJw9ZvlBbN8J4lJWM4Vs06jl7PN+78hXhW38ql/KrlWTYuLqmtUnCFdyiVrhJZXs1Zm1prFlobsl0WpMJdDPxzY7cGwX3BKgABARaJ//t4xO2AHPINQ66w3Ku3wuh13SX9m/reSAMYiFic6BkJByDgaU0MWAVLKHCawGDogKagkAHZjcrgRaMUUXTnGNBOF2GTUiy3fWY4oCJeGVM/KkatMopNX6mcXuQaZRwc7AdtJ6IRizFkmZZDkAuLH5XD+EDTEyCAMa+XLCQu9amLusPudw+/rbBdYfDWeWOHiFKhaICAOzYJXNEcxWYOupGDDUFCdR2LvRo6GHKeyHUS4eHyqIMfoZajdINORx9LdtJG2jP60xjpUoSWS49lNRuLFL/HlCaJPE61A1CBoTnwsHFh4i2LaED/ESh9WghRSMp0LcOxjI6jzHu0AgI8HGYn9JzEYATEpEDsIQRITAAATgGQYCiEATix4zDISzAcFJYoJGEqTBwBnBSFSlZGKB8LALDREBNE/7uUjpiwLO9STwOCweAdsDeuDFYGUOls7MDoKOv2efe9/UP35hqNVeS2mhdqGcKiBeHe9yVu7/563vCZ7hnhjpqXavYF5n+unSS0DbYuphkdrl+63RSngbVsW9ijscUdEkxvnrutfDbEOhtzUS/Pubfaa1TvnW8I//uIxNAAHX4XQ67lD+vMRGg11hvNJNl6Qo6KZ3DMy/47myz9pd1xOy5X+r+v0oQKbSNuwuxepSKA1yINFByCEzDnIAXIdy7djyy3yIKUR5Tt3cyLAADbEqu1+s5hQImAt0cYP4EBSmqVJkAeDAIPY9oxaKAuCygALscdsY8BGWtRaquslEwYB0lFiwS9M/KYqPUi1lkQVtFKanlVPEWe3Jl/BM4vJtHOcyXR19RyLT7UVl0ov0kNQ9JM3dNOoHrfGJkYLupPdr0kr7GMrlnHVddHKXB5qlJqr4rEhwg9Ryl2lCSxR7Ucw8fJBMmjxQcQyyQzSL2MUpbGRY/SpqKSMtRpLK3cKriLRkX7dz08kG/NWtcTKd9J2jW1Y+ffihmWwdhBYoWPKE8IfUkQNWzBYcinEjm0LQajH+MmLNpiHAAAihMz29ZOYHhmYZxUbjlWYIggWjFQUMHBnGQHN6KvMJgvMEgCHgGi1NBZQC7bNG4r2Fbhscukl3B7ab5gZptdym7mCqqGRz+UtghOzt+bKqsMYT89X6ztFUeiiq5JMsJPsDTbp3m1SBBNF+FjTcs/3M432l5NKwYX0B/JsSJwjXQNrkKUFiLDLc4LtYUUabemnOyqOlGbRvRbsYtNwbWfLqJiN97Xk2r9qOJZGFyyCGUU1vq9bk5q//uIxNIAHWIHQ65hEavVQ2f13KW9duGJ5aV5KV7U899iUmI3mSk21JnlO3M6xHoRLayB50klRLEockgaIJLMwSnCdhpRpNK7mgdd0xKOLJplVQAA0RNL7dbOEFOYjmUdxhuNCs0Qt2Y/hkg0awzgYWg4PB2UAS3eZjbawS+XsfHGC8mtoRP/PP/DTYSrDUbjpkyxeXuRJXeZ0ofL59gZyaP5XlNP7Vi67RAoem/sByice6Bm2gyS3JonfK6tLKajw7+1JN1pFR2qCFWKl6ldKm7Wf+lx188eQ4NtAGUTvnwlz+YpJ4TK6fg83UYcpiijcovSkvDnbT1remQda2ScrSr9W3x9cXmRCVp1D1L3hfx2a37ZgtHvvkuY/etYvvRisMYaSIuSSgULyECVrGsRgmXpjSn+NXCL0WY+LyHuMAAAIKhEV7X+3l7jCcyziMMAwIw4CIyY6AMWAFMxn7AwqmCQJsjicveKBHXaxg1NuREEaCNkDQ49GVnQUYHAzhLWBCgRQVduyiIumsJhejg4CTu02FXXZgqANLquF+PzG7GM3fjoOAizNXeX4ApcPsV98oa13K9RYV3Ft7v0FfuuZplASKUktPiPiZhm5oh65ESNMUegeYKPG5pg5G9OKiUMUTzbLy2ndy1l2nlvPlmSK03LsrMyJumK//uIxNMAHZYbQa7gz+udQmi90yPdS20mr/3dQ1prMPnF/huujsqzGrlRw7wF6GkxNJbnJFkR2+azOtbDbiT1mB7yTgAARRPr9dbeYLAoYEv2ajkkWTJgAEIBGMopg0DjJ+qAwWiqAT3S+up0yWeUYgp5mFlFTjpMTsVuOu95umReBpYRdkwrhNDbE6T8ID70tbgZcRNE/1AsFTcd4RiI0Tj9SrKbk0plerDtBceUS69y8/+cqyl3NoeMKattxUGTza5mz8WfZHT+otZ+vWea/Go2LTWl3PddgXzWPqOxSzR+sbM3RUdh3J2hYSavg/HWqS93TWXbuZNYc+9L0e/mvO27a1HD/ve5M3YtSDKwrbf1yxLu1y7iOw0HVflT55R/sQ1zUVMho5ezloWZZahYmGYJcqAzBDYsAgYQW2f77XmCQFGDjUmrw+AIDQgIiqDZgOKhVAswclkeFgwLA8MDCgn1OrbxNQeiRkIx6TzJc2HPjkhpBpNytQgQ8OwRGMYdeJkm/oRHVa0tvPHdypWBqEy2kpak7ckc9SSuPhUkvqyi/nDHxG7DN23S1aSzci9yXR1vLVJVrVcsd3BRBijntyrJupijR4dFyUWzmrZhJA8os2OSXGHjhi0RRYiuShZQjSLoOOgqSTG7i6cc5whjaq7G0KJTm1aj//uIxNqAHpoPQa7ljeu/w6h13CH9vi4Ph6dzTYoX2qYU6FoXvyYHMEzyj2KEjKeT6uaFpdlLVMZEEuNtEqZGM1RKjxlNAAEHHle10k4GBoxoS0/SEgw6AUOEIAAIZUCmDAQMeuEMTQNKoJMyeaWsKI3kMlTsaakO7HrCpl3uiyFateOCw4tC7wyimdOih1/nTadvCAwpVPC3Zlm8+lRcsjkOclkMROVQ9fiVgHVnYejdbKA5HF61ydtLSJJ1F60gdVRGQysQptqXJCpGk4vf5zfhRRVstTUshHH3LZyhSrLl2ItbsdZ8VX+FpmZ5bl4wWe4mu/uX8QX1k6/U3nkbWsbHVJoPC54qxkMtNPYxUXa49JQrUQ8fZiWb1kiI1RVHTDZAfkJRpWnSi2qUYlUULU1U1xjNq5rzUa+QTaACAEBQhZP/9ZyIPzEA+jtQQxYSEuKxlCAYhAMzFpkwiA4wEAyOUtaChsyyCYbYLBA1t0KwUdpVK47+U5dCOwimuNNks3KpmUwzdszAWAqGfnb92llahrzW5XdisOwmbh6W4Uw06rSRiitzFqU8lFqn6paMrNsrjQoRKj7ZMt3son4bLTmtKCLkFQUVdM45AbWtdZec8UUpKC/fRlpQhhJC4gP7qWVqBzPztNZ7Sg9Heyje3/qz4Xe/fO5b//uIxNmAHvIjPa7hLeu7Q+g93CW9m3urq9RPVJUlk0GzkrVp+83Ja0Enxb1tQ9JdZop+yURRVZnOZipYlFFDsPXQ1H5F3fvcVQAAAAgGWP/62YxaEoxifI0YO0aH8eAQEAWYxCcYCiKZoS0YQiKYOgmCQDWvTOgYKgYMgUBgfeinKp2wKwqSlsjbR+XaeF7JfYgOcl8vmqeAne7Z4Kkk92zj+Nd6GDSuloZRKLsO09TTdXNi1JLolahmthZwpZVfuUktq5U2Fl+dSm9S1MLN/PHDWdvWeFbeOs8LdXHl7eeMo1awsVsLmeOF7f3c8cM+Z8udv2db/7mVyr+Wrln+Yf3eesO7woNWqvN6tXKlzut61hvLmXP7V1zHPXKndXKnb/MPzsfjlWww+z+Xbda5hlvKW45/l/Mc+95Wt03e7x7f3juxj3LV3iBHFzdIDYD6FYD0LyTg6JRiOBQKAY1qLeGDWAbRwZ2QWagEvqGADACpKAJGD9i95h24UAYwh6ImzXVX5gAoAqFAAMFBaBgYIDifn8hSG/IhS7IHHMEII8VAqMLwwc1hlM6a6YKACxgSANGAKBWYyrqhkPoRGfCLRU10HAPDQNRgSAKGAWBGZVyQpjLFXmMEIAYvIXn//gYAkoArMBQAwqgFCAAUWATMCUB4wVglTAIC//uoxNeAIH4LQfXcAC5VvmX/P+CAkMBsGYwkQWjBQDf////BwC4AAGVtEgEQgActggmUtMDoIUMDVMFkIYwJQSjARAjGgSWgGA2BJ/////mAaACXPKoBDQUWEAbTEwnUWHHAB0jUkQuAEpU27EYZj0r//////9hM0xyDm4xJ+lhZbJ29bZ6astj01apd/Vxyu1f////////iUshx/6CROgsHANMzh2Gf23nZYp3ZiUqtxmU3Ke7Drcn2hTSX1lkPf//////////7EWbMQeC6utl6yIBXqwdORlTBUr2HswexcKg65KaGXqjz9LxaS+S5n2j8sqOUsluLeqVNKh93VUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxMIDwAABpBwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.06756666 + //_tone.Vibraphone_A_2 + } + ,{ + midi:11 + ,originalPitch:5300 + ,keyRangeLow:49 + ,keyRangeHigh:56 + ,loopStart:6629 + ,loopEnd:6799 + ,coarseTune:0 + ,fineTune:-14 + ,sampleRate:30000 + ,ahdsr:true + ,file:'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' + ,anchor:0.04556667 + //_tone.Vibraphone_F3 + } + ,{ + midi:11 + ,originalPitch:6200 + ,keyRangeLow:57 + ,keyRangeHigh:65 + ,loopStart:6876 + ,loopEnd:6977 + ,coarseTune:0 + ,fineTune:-17 + ,sampleRate:30000 + ,ahdsr:true + ,file:'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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tYxM4D2lEPT12XgCgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.00083333 + //_tone.Vibraphone_D4 + } + ,{ + midi:11 + ,originalPitch:7000 + ,keyRangeLow:66 + ,keyRangeHigh:73 + ,loopStart:5264 + ,loopEnd:5454 + ,coarseTune:0 + ,fineTune:-24 + ,sampleRate:30000 + ,ahdsr:true + ,file:'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LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxMIDwAABpBwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04320000 + //_tone.Vibraphone_A_4 + } + ,{ + midi:11 + ,originalPitch:8400 + ,keyRangeLow:74 + ,keyRangeHigh:87 + ,loopStart:3889 + ,loopEnd:3946 + ,coarseTune:0 + ,fineTune:-6 + ,sampleRate:30000 + ,ahdsr:true + ,file:'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/SlrLOZVLs/////3v9f//+zARANMAkAlBcFAAIAGkoYF1EDDAZARMAcBEHAF//uIxOMAPyX1O/nvEIgAADSDgAAEmAwAQYCgAgcAQWTL53y34NABLp5Uz7RF2WsxJ3n+mZbUqxlwX2cphz6uS7u2JSf/QlmKVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.03646667 + //_tone.Vibraphone_C6 + } + ,{ + midi:11 + ,originalPitch:8300 + ,keyRangeLow:88 + ,keyRangeHigh:114 + ,loopStart:10628 + ,loopEnd:10688 + ,coarseTune:0 + ,fineTune:-16 + ,sampleRate:30000 + ,ahdsr:true + ,file:'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' + ,anchor:0.01483333 + //_tone.Vibraphone_B6 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0121_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0121_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..2e2ec5bb --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0121_FluidR3_GM_sf2_file.js @@ -0,0 +1,95 @@ +console.log('load _tone_0121_FluidR3_GM_sf2_file'); +var _tone_0121_FluidR3_GM_sf2_file={ + zones:[ + { + midi:12 + ,originalPitch:4800 + ,keyRangeLow:0 + ,keyRangeHigh:53 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.09385487 + //_tone.Marimba_C_4_L_ + } + ,{ + midi:12 + ,originalPitch:6000 + ,keyRangeLow:54 + ,keyRangeHigh:65 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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qyRBg4URVFDasEFwE2h1kOGophNZaj7OEfI55ZGvzMuoftM10vfLYyZZUNvJbM6XV//kzs/jT2OWLPlVS7PyY//LNaWVWkpZlcoe3+4mJRu48VUo08JXsK0wehcK6TwdRKYj6NCcWFiyw2aNGzf5MkVY/9f1lf/7cMT+gBNNLQ+sJM/CgCghtYSOOUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1DE8wBUTgkLrKRvwHyC4KDHhB1VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04716553 + //_tone.Marimba_C_5_L_ + } + ,{ + midi:12 + ,originalPitch:6600 + ,keyRangeLow:66 + ,keyRangeHigh:71 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAABCAABWFQALEBAUGBgcICAkKCgsMDA1ODg8QEBESUlMUFBVWFhcYGBkaGhsb29zd3d6fn6BhYWJjIyQkJSYmJyfn6OmpqqurrG1tbm8vMDDw8fKys7R0dTY2Nzg4OTo6Ozw8PP39/v+/v8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAVOAAAAAAAAVhXZafA9AAAAAAD/+9DEAAAI4GNYdJSAJBKv6c87wEkABGzeEIWjFYrbIABgDBMn1RAgQN0QAgGCTF0aBjJo0be+c5znOfURo29BAECgIOwQwfy4PvD/8oH5Q59QIBiJHF//+XP8EAAjGFBtv/XfCotmBoNGx1wGEgRnMZ7mGIXA4RzE8mjAYLTLoLgQGZgmIxgYAIOCgwGEciEAwaGoyUkjCBBO0s0wKGTWjmMcAExIEgEOS4gMJkuaoZUBYcRUcWXMjbkCAMYhCiGSWgKMY0Am2S3MEDMAAxbzKaSwYeAbH4NiVIEQYu2zV8rrTYdcGGH9xZVI5RZtzbBqeloYGgJqhQC4Fl1PGtrISxil/WN5MZsNzVPf5WpqtbVmavr0x3+eOuZL6qXa0VuU1PZZ0jjFrW7Vizl++BwCb6W+2WkrZ5brjQCk9Xm7Oc93GlkUNW6GllM9l//zX3FUZp3p+5GoXzD/5X+pd9xoUgCQAAAIk/mklwIA5hYLJg3LZEw4KAZoLGGUMEeBy1lA4DlUkIxIBwMDmwDHClAxQHwDgyRQOSC0ciSZKjnkVJskS6YDuGfOGZuVTEtoEBGsAIOwMKgAW5FQ5puYpV1s591pVU0E216qTny8XjR1ukyCKP6Js91pMvZJ6VbrQdS6JiXSeS/9FBfUtBZnb3e6aibZbGsKFTQaDTP87pYBMADTt/BoHmAAMmAQAGD4jmw2into0mLgOCQbpWAwBxYB3QT7CwAhQB03RAAyGxhCDxvuKgCDdOBnQ6AI0Hztxxx28mcpRCmlSJ/KbGvXiMMx5ymYggIQwO2zU2nwnq9SsxLldZ7+sWWuoMOS+va2K0zNBawzpHsaFD1TdoV/je/SJ1JzTsO73Qrbp4bwgjS4qNCS1l/9cIDT1Xx4okNH8XKDWWj5q76+P6PNu9Wt6gPXAGABANzT0wDABzARAUMCAB0wYwgjJQWoNRcKgwaAHxoCooAFJAHEB5gAgIKzv2YaBQYAjDgJMVAswsrzpEaMHAcFA6MjIXMDAKHW8jMZh2dfaWwLLmnRWpl3mWUPtLEYHHinANrGVXpvuokaWGrmfEa2L3gw4lcXrmSsStEmSZINColdrifMeNTOJ8/y6lkz//4P//uAxPEBE5FNR13agCLJrGe1169Uq9afmaO5/GZ8yvXF39T//7/bJfj//WD8MaJ/mmO30x6akeVnYh/xTdZsQAeLACIsm3A8AqFgJgoBiKBdGAzDAYA4iQVfihQwp0S7m8DGfBvJHxsODAByQZMzAwARgOYNMBQKCf2AoAwobRokQWSiJqSxDyAMMbcwQOl0xI8XKK1BQTFrWXUEp08Uy06jl1JmJBE0nWcVnTVEvkeMuLsZE8ZIpLqT/6Cj6lnXrWViMNmWzGWkTkmWWgis07NQKQ003Rs7OKwbNs2eg/T1gADCAKA8v/AYDeYJQEBgOgKmC8DQZM6sxpsBRGdxGYmAwKC4qEzBQEFQG0SlEjwtsLhgw+BjCpAB8PEh0r15hQABhhhF+bpK1VEvF4nB0GqzNCisckohIgRkiqqs9IkdOlhAm0DidZoXWXWnyy9jIZgOmNHapKtdvXn1n1JEMfMS8OUaJsekVmZwszb/+4DE9YAXoUk3T3Hr4ocnpzXtVKVJFCtBt0lnDcUZVTV2H0VNNtRsg9lOfWsAcAGBb9cDADAQMCABkwPwRDCsDbM9WRs3/hMTDJA+AwQpQBsFAEjADAcMBQBlBFGQh9qfAQ9AQtAibNHRYCAtL5eJKODBwLiUpzqU0/CMJe5sWheVLzvNzD9lQIDwi+9vLff1O1z3IYzf+oH9ryCH9Ko/WgGByFoVT1ZFXYxiX+/nrlVE+elQ4KzPSM011eiuP/zUNV/Llhs4z/vyfAcOR+Z/o37wZgpLxQAExAAQI/pQYAoCgUAzIAbgCLOYVHCpg3DshZBAUamFh42AaI5MNF/sFDHQBAoZVGYcGzBwiO0LMIHC/4FC4iAyDgbmUQxvkYkiKUVmzD3LUbCfimAJQGMUBP3RoJrdhP2ZUvvqJzaI8+TC3UcKi86CyxOpj9pWbs6Jaca5i9ZgeGtOcZl1zX//rGxf1rFVdaLO8wBi3P/7gMTyABSBTTevckXipifl6e4lfeoAkHkHPzQLAEGBSAaYIQFxhbhgmhxFicAojZt4kGUxGYkDQkMTCINBAAQRzoCgaHpgcOGGQYYXHB7MxhBGWrDyVYc0nnhyUJPNdoCIkVCATdBFQhQrFGiCGEqBmG/H8yIVaUXZ7UWT2sZM8qkMxWofSS80MDdBkTyK4+D7OiQx0501PGp04RBJNiHFYnS2xgaff//qLX9xaR6ai6dklmyNNS5mFpUENAT9kBgQAPmBeBcYLAMJhsicGmFd8dBYwhwYvmWQkUDEKEALAkCgILAV3zUwOb8mIphoAmAE2ZOoAUBbKpMKkExiEHfpKi2nllgX+ICKeoTI8t4BItPkiAyDzyeJ1aI890D2dGB1x36i8Way8bFrpGpqbLQHcbmabFPZ6GolkEFo0DbNbruXFdlrVVdNFxmJF1qRvUOAX29c1RPLjY76AhkleFAwBIAtAoC4QgYpgDAS//twxPcAEtU9L69xpeKUqeWp7ki90YLGunGAQhjhhKcpgsMxg+Fph6D4sKhQEZEBKwxmmEYgAgwrCUeBcweGA5uQsw4ABHNgAiFExwBJrtbi2nksi3uMYPVR0MGzA/ANg8tCmA3qcWoXZQtF2e5KNxcD6ywnkeerk8TxLmxPMaqSUXjMzScgKCS3qreho0HrXOIVI//8yHu31CmG2sIFZPcqACMGkJ+qAoAGMB4AQwTwMzDQDKNMWVA4+hLjfpRMwCQxaGxUbmBA4YBB4oBI2aQCwiBpiMaGORAYdKB9VEgopJIsmUIGni1CL11EocukGPhhjiaKhSBsWFQFtpumFyj7SiPCmjdPcyfUXW3LNUfL9FVNNVSzNlmKJ8ydNt011u7sxQZ00KmUo2//5mPVWhTOC1EhR61Lq//7gMTrABP9QyjvcaXqeSWknf7MvK3Wo6tIB9Pb6QGAuAsYEQEpgjgoGFcIiZ9NHJw3Com1SgZEBosFxgKGCwsYCBIjAFIaFCr3lYYBQlCh/IIcOAdhTZRgYGMgW/jtw+OACGJeHSGQXyDgUnQFLFovHlgE1WQQWkA+CddZMBvKS4Z6SLVFM+th9CnltNZMikk7kySSrOdnXc0PMmWXZ6LLRSSOqUggggy0SaPGZfpGSkUTyl0qleleN0i1qG6JNkja5qf+bkYXABIHF6+tgwAUAYCwB6MARBgCoNqYJ4iJmAfhI5hxQGDyGYMD1OGBMeCiebimjgwIAIYhEZeswkLj6ynDCYt9xRCNjHoHda9pjEtviBUQTRDU1LD8UzNoBmyiDimACZcrFMHCkS7BntFkyGunMgyMZJqMiA8WgibJpmBimg6zAwUqZE4Sp6iumfWYTiaKlUyNRTTqfUX3UuprVVPURotiKlemLs1r//uAxPeCE3VTKU9yBeK5peUp7ki946XGoEAVa/+jCUICArMD4CIwqwoTP4eBN5cPE2gPjJodMQBQaFpg0FlqEEdEZzC4gBZjUaGRxQYTIx3NCg4bMFjTLiJjPfLKjGmm3DVYbkvsiZBbgrEbga48qHwW4ttH0O9ZWTDPy2zItTclQ9c8pzEgSVhThxPdFaRk3bRWXS46JgpMmDqFI6s0TSHYYprRUo2Vkdsta7Lem9ZgNFnb5RP2SQgqACEHJT6NAwJAJTA1A0MF4G8w4xXjTy0wOmUbQxEgbzBdAaHgMRACIYAQCpgFgHBQAd3zCuA0V2HHgxcBwspTKdYIQa0aiC49Msg5x5ZSLaWbYefJdqheGsWPybd/hgoH3uSNnoGAlL3lMrVjr1G7eu/hv/qhFqESanDbH4SJ9j0m0oo1JxtBxjkemoNdZW1lsc+TyA+lDmWyu6x2wyea/dLZuSIXu4mvgoM9fNWBgXIAAED/+3DE/oIVGS8nT/IF4oIlpTXuSLwObm9jBgEAQhcEYVBzMA4XYxAe0DDkHwMOokwQODBYTMOg8eEBMA1GHKM8iULBgxmRwEAzBwcPTHMSHi/3YJBeYkA0pqYM+aBeIVIMcFuSnQstK5QdIDunlQZwAoTRNQ+xYrRWSv1dhzKNjbYZ0q0EzqRmkggV0k0GTUo+aLWgYliipFnUrMlE2mbUFKkWZ0ql0qlOjYvEK/XywPWp7RlAgvpAMgolPo2B4BYwLgCDBLArMMgLI0lYQjjMEKN5kUy0HjFIZGReYGFRgUMigCpzQgsL6mIQwYrCRhkuHk1mAiElay4s6NOBqMDzaUyvKqokRoucC/BsWFQNFy+Xge5baP5OT0Vkk6DL5wPlnzheLRJm6I5ZP9VN1nC2kiidTTUiaorS//uAxOuAFfEvI09xbeKUJWT17ki8TNVKSeuuzTApqenY826mXqU2gmNq9bVucNOHQ3B7v1CqABIHmb1tAwHQHDAoAtME8GAwwBOTRFvrORAYs3SYDJgVHg2KBowKDgAAxCBLBpEao5gpIGNgSOIk0TKguCWMN3EAwMrAtrkP062HUti2F0YQZRSSxS5aSPQBmc6MoGSgAUTKjo6QuIZFVMM5E1psizmJYJMpHTspmhmdFIiNkklMmybsST5qfdnWtqTumyTto82W3QmaFnWgp3+olTLqVamef+Cd9u9oIALFAeb/9jBgBgLCIDkRAwGAiKGYg2dph8jXmA4DkYA4FZgGAPQaBgKxICxf8VMGICALAOGBeCmKgGmAUAMYvAJpEBg1J3Rmgzw41ZyWw1GebNtWeE9qZpez93HzKB/UbiAYTY78w0HVvJTtcdLvDnO55pdXvz1LLXKzMLO8+tbK+Ix3MW/ULUkRbx00Sqj/+4DE7QAUYS0lT3JF6qAlpGnuSL0/JL1C9KyqselT8exIEKru68S7V2ChbkoAiDzW/kQGgGTAvAFMDIBQwkwdzOAX9NrcLs1oKjIITMMAwoEJhEIgwBJb0Rl0Qq2mFwQYdBBgkjHF0eDg812mQRDyfg+WVFOle1jVhTTdlmQZ4kWbgBs80LwKGfaRhdlZY1RJ2ZFKjI8T2X7Fgl2VD/F+5skkpBBRfWsvoppILNEutdJb7KRKaRkjqQeeqfSQPvpqQlghCL8nFOnk6gAzD7n+jYMA4A8wFwHDAyBFMIcO4zHJMjbDEqOkRTMQoaCSQkMEDTBwZG2HzZCpAOaIAGYApKunF6xdeAMRGKgaGgeHKRhSFtgR+kSxCpl5EPnJZM3RAD1mK4ioSI6ksfQds6bRuhp7JsWE2WP4YoLZkYHSENWYpC5FUWsmmkbJun1r1rW7sprPdBEtotVtSZvar8sHe2tzA+jQ2wasmERMgP/7gMTzgBTZLSevZRGidiMk6e5IvCYWa/0aBgCAOioIAVBtMB4WQxW+ODFAHcMCsIEwDgNDANATMBsBMWA4IgD1wO0YNoGooAYYBYF4iADCAIDGoBDIgQFvu4VcTEGoZRYZ8oRZanXmLWss0vZ+go8wNN36koFib3eV3O5lnBaWX5Vrd+58yt2pjn2F/b6zNLm/U7WIVRY+6qTXNymiupWFjqdSj0VVjjSXtnpN+ONBgWT+OUDA/HvgmjF6ACIHlSxEgSAaAQLBgzgXmIAF4a4cnx11CVHOSiZ4FBjkRkI9MACgAhcUBUNmnisFgCY9DhkMPGH0cerhJiUEIKrGAgfB0QYrI7qjyZlUghfI4mmI1Qd42I5KAzKCiPFqAVsrIqGuTSZacsipIIyPassBqljF1E4zIiVomRmgo3RRNE0jFK70zdk2dFSlp6nc66VF1s2l1sk6vfZZsyuqiRyA9ThtKiBVV2z+1agACggJ//twxP0AFB0vJU9uReKepaRp7KI0279EgYBoBhgKANmBeCAYPwc5l0x4mycJCc2iGWBZQHjgwYGEAABSOsGslqxwMoA4xGVM6nELZug+4iDgVEvw19/0lEIJeKULaiiaE0iLLLRkygG+eUBrha8ZqUP40FGsjxistZqeZZkKWJ9Z0lSJ0zpqIeXEEVKPWRd2Qc0J8uKpG1IyZKyNazCktDoVtt61tdrKW3qu7tuj7IurqdZonUAFBgJq9/WwAQEhwDMRAeGAWG+YaUmZiIiXmWlGBLmMNMxAScOSNvOm6NDhgxc8whcKAEDhwJCgVGkRUIQoG7MjFxaBNCsSyRTU6KwyKVzFFwLDFpmwLAE89YxFIx/FXVLzUEhvo6icY+ofQ4kXTl00ZBVSCCqZgkbzecXooJovd1rZJf/7gMTqgBWZLR1PckXij6qkde3IvCLptfp9dXvavqOC4w7saIL5FAYQ+m/WkBYA0FAjmB0AoYUYOpnjLsm6uFueMVGjiZlw4NIhiYmDARGecNfN2cgoqMVADCVg/W3Awk12mFQ4Mm4VOVIMT5piZWOkiRotQlykcF8m5gM8DY2bMfH4WF86MXqzjjOl4yKRoT5OmCjY6dUVkVOgdZFNTU0GUzLQSK1PtsrTQ3R0l6mWut7ps7HmWrQTLi10FoHLOQV6QHMPu32MgwEAEzAbAiMCQDcwaQxjKGgENXEQA4A5MhBhYJJSgwIFMDAFbY2aQWInmYAwOORVBOvoi7cMYioCHP0LllSVKRwJJIwJ6YLEJy0t1hUcsisgbgX0DolwpdbrTE11OlQTEuNEmQNDqRYMSfOKMVquztRvQWtqCaJItVXc3FYVBNgHhkkCBhw8RiBhqv6NlTiAChAD2XqkQYAADJCB4CQZzAkFUMWf//twxO4AErEnJ69qpSJuJWQp7cS9aYx3ByDZ+zIMjMnzUpQyoNI1uO0d+GMFgrDMYVBQhBdBJh6uJ3B0WhUDSuksSpT16T+3SHsbPWI0eGeyYT8+timxe79x896/3u//x1n+4LlNqrTO/2UTuVJjcl9/HueGNBhhSV886fX3yoiQkotCWnIw6ssGkmGrImj6g6yldjN11dfJqgAzB7V1aIQODgKDA7ARMKIGozz1iDdeCqMMcCcwRgDjAbANJAGQoA8DQEUOFcwVgPkxTOwgzkWMHXD1cEBBy7XKEAyCoiBb+480Dl/1HoTKN3E7tZWqo8QYcuwUoHl+q7nb1qSNC3z8ud7s1OYIDIDpky5Pw3kG7YyU0TrOvCs3KZcrrXyY+5M+m6TTu//PnubiSdMpFlInCyVOFIb/qP/7gMTngBKY3SNPbkXiaZij9e1wpABALo2IgAwJwKjA0BDMF0IQw3BoTTD+nOlIg8xCQijBYApIgHiwBUYBYCRgDADg0AiKGEyDupmYkAgkJTAaLPM0Qw2CVAGdgQJGlACrxr8NswRo6tSdWukzL8toC7Nr6gYL8N0DxhACt87Bsx8tuRpb03cw3du41Cjx45qFwEjlC5Iq7rOz7wt/c8NdPygr0sy/d3us0anXG8cczrcmFIbFwwEWzgGwHFXSOAsDY16AhbcL8Ufb///1VWADBgL4/q0QYA4ExUBVCgIxgNh8mJRSKYv4qJgSAqGASA6YBACiwJgMgDhAGDbzpgeAWDoeGC2YoFJgYBhJkHhC2z+lgMAIA0Efn3AVZJ5RmgR3c3mxSj/8Q4Qc/cpIgJZy+q5trmGLUs6PDLPGvobbQMNTswBTKYe9zxpawhJ06bdaT282rj0qrRu6X//h+pu+A0YF7hYxJKRtb//3//uAxPuAE9kbH09szeLloyLp7iG8IAEF27YiAGAMhgK5giAIGFyDSaIS45wahZmHABUYKYCpgRAJBgGhgBgBo2DIAMsMF8E9WEBMRloYYO3Hl8JgoA1m0KjwKk4GvaqM1tUMtRlTjkFDUQnTlfdYHE/d0zYkd9flMNBy7qUNTp/z12az7c1I0OTRY0OARMUYMp+aWIZ2LOkePWKaZi9Tv5eaeH+/pKv4iOLhxgmokyJe9Vy/s0ev+V0qAADEAPj1aIBgHAJmAuBAYGAJ5hAiGGXhSwbT4qhhOApmBWAkHAAiMCQwEACTANAER5f8yoTDAINMrCgHGECkk42wAcF3Eupzhy2e+xhm0HUppEtEs9YXR0DxWby0Ahx/0srDgdP8zkk77yUH4JpoyVlQ7S0pca2fYkY3ZKNXNO91WxvNxKfLrrfMts5UVK99U92zmJfVfTu5dzFQrLGf8IG2ebxHpflrML6/YwAGKBPZ9Uj/+3DE+wATxRkhr3EN4pEjY2ntobyDAEAjIATgaCCYDQdhiVzbGMgKEYE4KJgEAOGAGAKYBIBoYCYNANt5GjGYxLASBA7MPBkwMCzkAMHg630UHQqCgdTv5GLZMAZ2/kyKNX7uluQfSX8wEL+8jURFgRZ7uPQPszcIwSN3sOmxdqlZ8yOuNzRh8QyMd02Mhjo60pU1Vzn1d/1P/13FPt9x7o3dc0zn4PX1rrzU6qsz+KaE9kAzC93sQADg4SQDNwc5hQM41Iw27AiDuRs0AIMXCSAREQ0Fw1JTpoSIrkFOxm4gAVg4G/LLMNdoUHQMuQ7TY0yrLOHX+52ZmC80xWyrmPBnNNZQ8BgfejuqYoC6Wm5QNnn57v/aw7OfdtQ/F87+EdgXG7W5/71dx/+44Y1r/c+7y53m65oE//uAxOuAFXUrG69xa+KUo2P17i19BKF5oOWLYtXDZeSClLkNWAXBBb2S4rv7n9+LAAGav0wkKMOGTJUA2jjMoeQE1ehJTQJCMQA0eARKFDCYaMIA1Sq8Y9H6AsxUFB4SgkanB0kGBN3IuwQeSryRenqL8+QXIDsc1dQ50sxY2YZB/6rT5ECqPDKhe7kxg2J+q1S5KOW5ixFs7vaa79yvvG3jrO3nyphjhYuferY4483/efzeuf/6x3UFRE9CVNVba1b2eNx9xc/pxRn//////65AAsMC+T6IgAUBIhA1BgIBgOh0mJZNGY54nZqpxiTZiCSlICLhxBp9Ea5kmUCCpigpgQJnGBILBl1oZJAoChLSQ3L4ZSYk9JSvDL8bmmuT3/XAQI3yleEuhS5YSWMWKtlfD91b9Pyru7XhmvVztZb5cjnzc/Z5vPmGssOc1ru/tQOdGCY0fE4RUJqXKkA5rczeX7lud7QwJ29gwBH/+4DE7wFUJNUbTftiIoKco3W/cEQWBDAwIhg3gYmV4aGasILZxAYZaAmMBAQQGHiIWBFl2DKzFqIspGRggXPjPZFOaI9IRAIL56LhEjNdssCEz7xy/RJfgHPu0ZcDd1v81dQ9lkl/B1FtNPBXV4FIVH7jl853e6rB+M+L93xjOYedWtTOtfX+tecEQ00SVpQH7B8VYAuSFW6a0W/+rpVVAAUEAfrsaIBgCADmASAkYDQG5grhkGRJAYaX4gRtR2YuEA4JBpgYoDmHgS5ZeZcdA0HMuICghBJGfu5CQfAmbvFD9J5zUlXrgs0E8F1a0QztFEzSA0xkjUvg4jdCQwdqzaKGIO7UmSNj5OqapN2U5fpG1NaC079BS1KXanXWcZRgmbOtaFBWktqlOjZ6C+gboTC0oTIe035T6u12rAHuaMgAwBAKRQFoAglmBUIQYu9bhkXCzGOS6YQERgkEmDQqJBxC9kkaMZkMlBRhAf/7cMT6AlK4wx2va4UiQZwjte28tFmJAuYIEZzggCQlZtCBUKgYhS9QMCLErEbXguxoO4MJDI0C7wA/iYYjNAMG19cwl+s9DcS+G59AjTRaXraXTjqu7T6zuW1M/4kNh4eAwhaOcfCJ5Q5byggGRek+1SHDRqLGniBhQs//7k6Hf//SQAUEAXb2aIAQAkRAgA4EcwbgJDK3L2NVAFA4kJAyoZKJigyODQjDVsZmRGTFRp6MzDBGfGNyaez6xIgEwcOUuNXNSZ1AURtP4WlVrGNhAL2quBDaXtI05kipLc2KXgyQ+8iwZdsj27nZ5ElZd4z8419U+funxbdtRtBIRkCwGMMCcAC4wUFBM1yWB2esMkL+hCtVunFaEKIAdFAnc9ZABgDgFGAYAyYCYFRghBVmN+4CaAAbpqr/+3DE+IETkRsbr25F4nmWYynuPLRcYcChwMIyQxEWMSC2VWDHy8VBzMCgWGAaJntqg0DwJI2clDBIELY8joyurA9W+0aqJn/4VdrzxgPc/rBPvsb9JQKVvirNEdv4niM+L6jQns00C4wgGDZ8DCoMNSePmZ1rxk1nKFne9LEKK3VWLI+/+qogBQUCeTRkACEAQdAfAgHRgShsmKtI+Y9IlJmCQYWMmKEAUAzFQcHEDj0pkBsFQYx4vMyHzAiE/o+EhF3oZIAwHHtJG5XAK9J8eTYL0iTucSEIC2bzoDpNjwzocgdSWSpekyXh9MUSgmo+SZ1Jz6Bdz5mmTRstjrsjrQdCpV1oJqqX10LIJVnndnRUmzdT6efkk2rLlVWNZc9dKO5BxP17G/////0EAFggTyeBgUoXhFA///twxO0AEvDRG69t5aI/FKN17by0aMy9C8zXLBNOYCDMQExwKARIYiJhYGUXsGSn7qFYiECQjRhmhUWkvSUWBwvTVcWerdkVnFDgoXKqakcaQ9zxEYLvVHHC9NjO1Mwiq7tlu2Eej1LO29YU9JWnsccLvb9Tm/nqXVWp/Mefu1b7f1y1r8vv/+V3ueFooJCQKoWLwMPMlkRcu1KwylB1puGCpsJylp1vwG6o3///7CAFRAH49EQAYUHmIjxixmaXfGPA90aHofBrhuYiEFoQKUGRBpjYQw2NmPHQXBzHiAvwBRE/1QGhN5KdYIib5FRabKzXU5Lx0AjT6ymqvm/3/EAJv71xUednWEJ/DOSPx2U02UZtU+dfC1XnrWU5VpJRc5r+fzeeOssf/uudzw5zX9/DLG44PxCEz//7gMTrAFStDxmvbgXimpvi9a9sRIiAjh7LxV7GIIrbAhU0lgBBtRPcpGec5s1cnG0ej/9eA/m1ZAAMATEQGwNAtMBoLIxF3sDHOD2OfsxEDHHMlEMsFi3Ulxp3pLGgmbRYAGzxkAWBXWohkDDjaXyykbG0GzXuOU9luP6dC3qzkh/Z1AzcU3K9Bm0R7Oa4z7GZ+X1q12zfnKStT5azsxqpDdm9nv/uYd7r+c53dn65BgegI/EYOWvLJPyDHPuF42a/efKtbYZnydywrtqVYAeNBnu+iIAYMVrCzZ+DG2bEHsgOA82HIDMiRwWMIBGRaJ5jlTTBK+aMAQnDCU2wTMkJBqKlWpyC2zXss6eQWKXCFYa3tAhnnFZgeC45dgiT9t5x6c3KcN6529Iq+6+dNa/OhpatNLda3zHDn3g8g8qLGgKOKMSwgeLuQKuJsQlZz9f1L7Oz5NAC44C632IAGFEGKLmFMGm8mJyqaZYw//uAxPEBFTTbF637YiJlGKMp7OykUJmY4BgUDCQyYGGiBiAOyq8YmYjISY8VIBC951JEk3IJ5eI8aUUXjcdZp9a93WN/bSbusqYkA8r2MqL137Or8Ly/UFXpu9KZP3Kpf5czwr4XrdPrLDPPPKzj2rbxy5zefb/8y/XOavC0HxEkAB5r0WsGWuyD2PFmkrYvZbqur11vrYAJTgNr/GiADQEguBuFgHDARCDMN5eMxcwtzAYAkAIApgOATAgAUwDwBQgBR37JiBcW6MkHTMBcKCZxBklzGqqigkS2H/i74tpC9V8NXPqNg1nulGQK1hFHhFQC3j7YZqmDg8QYocWPQlHha5wnYM6Gm1D5Suv91mlaITDCYydUkSsaSOgRZUcLjx7WsOopbcrObPZ+hgCQQDfXyIgBACkQXDwMGHoAm2StnsoLhBMBwRmFQJGEAFGAYDoIHr4YM6wQSdg5MSmjNUXQr7KoJleqt9hMJk//+3DE+4ARCLUdrPdCImIaY3WvbESFr5FhWutforNTQiF2dz9hA29l8zCcKEScmQshKZga3ufuNtOfK3VVPLxbW/R+v9eYY3I9v+YogEipqrJgUm5gq0wVWSb31N7KOfr19iogF48C+31oAAQAEwAQCjACAbMCUHoxJlUDK1CiNGLzCQRAKARoyIFMTAGs05hxoFRcyRCIAJMM60YRbk2aiw8Z33WChMnd9vbPW6c0Y0WWMBWheZdCNvqQJDUxK4ZjWjRlDDqwyS2Z8bWZaWkeUiNutYzNff+9zfH1jwPmJqJjOcRUBouDwaquIuGdgQZ2xMiG03toS1SGX0tpsR/////7GAFTgbtvGSAIgBREBAFQGzASB+MOtbQxdgsDNowAEMOHMKVBUgONupLjFsUERqjJsi4UKn6b//twxP0AErDbG69sa+I2nGN13Rl8J8xadT3Eo0jZHhGya2rjEm4j4SJxpt6CM1tGbx9Yc9Io8YSxBZ56vYbC4t0V77wb0hO5c3vf0tSfOPaHnPfhoOQkVLKWJjJRiRqHMSNPGxOJQmAzmHK4kSoiUMfm55/r9dWAB4YK/byIgAoEhoOSYDwwXDW8+jt4CBIexYEDA8A0OJICw6BMGeCAUWEBWsBSioQNBBdihjhVIqpXcOM/U9Ymq+dWnwxgO9U5xYLutZJMzONWYw7arVK9LdyncalWyV84Yh3MmF0eSNWPZbZxJM24xhKVfo64NRcngIWSTQE3ccvkYk09/3fmUACVygAXb6IgAyZgzC8CkjMZTDlSDMjgIc002MKCSywqQGLiRiwSyqiMLPSqMmNJAVDF7nHgyiNFaf/7cMT9ABQI3RmvbeWiW5djNe08tGBHhSin6FRttL1NrHGe5ekP91fWFxuT7hID86e9GnnnL9XP7uN69hSX+Z5fu/Ywy7ev3wqKiQ8J2HWXiISISbKMBQLgiKms81sWaRWuGYHhN8gUlhRW7zWbV//////pYQJoFgJfv7ESAuCQNDsQAgYGjGZIc2Z7jScVBhknFYYQpzpmwBG+AxRdxrAmwKKCn444tNVXwNYzjnz1VHg0kv5drqE+rgV67KyN44o1bMhjSRWD6gTwfWLBgsNa7tiDX/MS1fJJqb5+L3vb338YjreJS5iKMBspUWJWHjVybFB8LIPHnTilemAC8UK+32IgBACjQVEwACQjmlxXnNYAi7g0WchxsGGm6FjIL4FzWIBF4csSEHNe/lfZUIUBwzVE+d1h9M//+3DE8wARCO8bruht4mMT4z2vbETlisdN+hBcXhaGo8+az3njK+E9qsNzxi1bN5aQcTbjw7e1LanrmHT/VIFfq9M6+vjxyQUFDQYOgmJgmfKiRaHxA5WFWH3tvw0r/Z12KmAJRwHt80AAYoiZFIYAuZ/oYgyjhkxhNGTDZaYGAJgpEDikIDn9pwQQCMVMGPgCFKcgdKTZk1tJ4aG7X5R27ldqWtTFW66t+3dsKm7KKq+EJ8bvP1DvXqi1ugu2piXwNLaCmuc1rDK5INWrM7c7j+Pct4czwv5a3fEIHqEq0hcEhKOSx5gOBEWEwwXCLgbHB4SsPmHCNpMAuFGmGXxEsUNodHQBcTFLvuu/X9H9n93ALr4V3/jIABAFJgCAwCEAswBgUjCrQWMTAHYzqEAAjDhTClQhAJA2//twxPSAEQjLHe7l5aIjmqN13Ly0WS4wcVE42As2hUUFm+VNNl0tcsejUbJANlxmgPITyWRDSVKq7uEaLbRq0BLQ424YtEj2G/o2vdvZXCZ9D29g+02MWpeu9b/zG1u28Xrre/67zXz+4F1BNL3aJ02pU6PFGYCeTepE+/EMZov2+qpQAFg4A1//kRABQJCwapZjwaGhI7BIeDwnjwAGDYFoCR0JCEE2qeCGiCQ4o8BWiQEaZK/leUEo0HAq9TCC4Opa9qNyuxnbtzdNhaYNfpqlKr3PDGUObXC6OEokBQOS1HedsXsV/V6Zfm8vclsPhnqXpnqPmbHKgEGyosapEoQYsKF7nOa0ehy9sWU6OtezoR+9AAnYoAn/1bIAMDQQMDglBoGGBwqmXf7m5A5mHIWGAQCmAYGGAf/7cMT9gBXcvxWte2IiVZqjNe08tIcAIMChLWrwNYihELPDFlGTDfJcU7LhwKHKJ2RU6+2gSCko4nA9mmwllPdn6ZHGO56Hixh4TUNUuIoskx6mURltapOHmEu/IIeHKgcxlVNzHc3xS1yPqtHpJKCpJAnYlQs1ZQDAqC0Oi172yeOe7tUxhuKf///V3//qYANHNwGN/40QBGBQNC0UAAwBDcyExEzpFMwwDAwJA0wEAhBKaI4QY7+IUuXUAwTiHGAzich2tuUESth367YX0r8/Gp3l5o0gr1ettrbIXLWrGhc9JNyhagikrZVbN6M1Nzu2T2+eEZi337Wt27GOtktt6x4kcD1ABSs+uhNr90kxkyeFbdC0I/v0rxBuXD+38aABgkAYOFooAkrCs0CFETCsbwGkzaGNRAz/+3DE7QASGN8b7ujL4n0cov3dITwyUGGx4CsZcg6yQ64gAO6F+LeJIUEE2KfNWeHKdnLPRtuld2Ti4+3gXFUBiSHCubuRFW3JKHzqxmw9Nz+x/aJn5pBs0tH8H7dnuv/y181r+1Y7qXd+vuXEhNzWamTbE0Cu5pBDLATai5rOxuRqUABWOANbvYgADBQHzBsNgoBZgWKRlR8xtmOBgkB6QwgAUwTCIIDEIA5dtGFBIHQVKodGC4LLGIjrXFOy8lBAIDu1LsjKVYoVcYj4a1iM6fvlU7hxyoIKpl96Z7O1YetenThCrp/Z/NEq2uCe8lrTxn0aSV1uC+nX+a/X7lpmxQ+bHKcItfL88KEwiXcUFwkIk6xdRYNA0FhZa6XyDBwopGQNP///7Ov/XUwAaMcCSb/RkACgEgQJ//twxOcAEVjfG+7laeIuHSM13LC8kEZgAGRkPdBnIJh32mMUYooFXDIBIN3J4dta0egZ6IjBZzVO7TUsiJorcTB7uOJpIOKVbGK7htdsqcfTLoWqPEgw1Q2TQ2qsVg9bau/lxaqsa6QKeLmn9Js1tiLw80VBsiMS08DIZdCIJJRQBnQaxUbAlDmP8T96HpWANe/01WEBeEkFbf6REgDA4MFqeREMTWoYI34RjpMHKeKAiFQkFapocwKgB6oiXS2DeNimcoIUQdFL6So2OlwrLPGUI8lh6I5wRGSHwmBYHtiCwBDhhVCklkEHvX0w54Mm5Jgmbgc7k33W1m2jV8jZtxky8Xta9TM/M/fc9fK68ffF39pK3zyOxGZABUWWQ1+n6bxK4gb0lAr//0wVBowWDURgAYABqYpxif/7gMTtgBUtFxXuvHNiLxajPdy8tJwBqb7Bd0vMOnGycbgbtWRmsGFmDkbKzlC9b3Yw8MIg5iW28mi16lk6IJPMqEkyrCQGTayNAETI83rM4Ls4Oiow+Vtr7SW2v1U2Wm5RtPJ3hiKfzJlM7os7/PzuKdXC7/tm0AkdnJQRTNBEXrW9QgcRWeBpf6+i2hCBBHk5Io//sRAEIIAEOUEBgCGJi1EZliGZ3VGSSbUAAJNk0DKRvEgYTOB8p5IjBZrWOzW3ZKxrErpVstarm646PlI88uvfFgA1tYdHfnY6n3roThdpkW1FdebgS03bPM295j/Ym+2gn52/7M2jvRnZ7u/pzKQCz4FEDmqNNNmkjI/vH0MWly2IcT66qPrYQBnCASPf4yADBABCB8iyPD4DaEpt5NgnGbwxqHGOWOAUOBUDL6HOiTNLIO5GBLfkBQRbLJ+Xs9a5iPiskMoEUJQRQQhVyAeD4wToiFZnjMA0//tgxP6AUd1DG+5lBeI8HeN93KS8IVnoEAkFyInlXY1FcUbUoQWl6hOealNKsg+KUYtiQq8ykuQLGl1jzRG8H5QOKCijg0E1AQt3sFdqrWMSlTXjbXMq/2f9n/uqUASYSRRvv7EQAAApgGCSRoNCIxOjgzbDQ1isChAsdNK6DEIcOdmfHVyDYFOGVFLmB5Nvr18qig4PaiuIUMWg8iF1H5KZhhEL2rYqTWLI1EZpuBUxINaSoItI02zjY6eThqJeUxIvZ+dr7OE104pRnUrnbLEqncYVXqmnBt5IihwqDQRAAUWLTINDFvaLWBRT8obSrFdz6U6HACWEchbb5sgAkAUABcke//twxOeAEajjG+7lheJkGWL9zKS8BAmMcZsM1A8NdMtIZY5gsmwEDk3Ivjmr/j3IGtGETM4dmVYw0UB30E1yqyGYn1e2LWZJnDkwsaOmidsnYXKJWDrqMJxlJNuKsYIpR1XfWW0jZnTH373bJ0E0697UM/3Y22DAlAd4KqCCbUxwtShTAuDEVnyYQDKEPNviiVovndP/9HzX/fZ/dWIAaEkCbb9sgAwOAAgYjwGDiaArOTvkonW4aoraiqBUFapgO3EAh1ujz7MDqHgTPBfY0FfOEjjLkXDXVLipPSPKIzM5OHAoWMuMMqjETkpycnXFcvLmG3t7Ppe/TemZ8uJd+8wfeZpy/IOzrTMQYDyQ4bDJBzjQiQHlk2mjJlxNLxXXS8aJBhKLst4T7nzRV3///tYQSHWBNdvogP/7gMTmABMQ6Rnu6SWiXJxi/dyktADA8EjBAKRCAhgEIZirRJnkIJs2QADiEYCVCDwsFXdIApJL6mFLGTDJpHVBtCsyogBo+Y6k0wrg0NxZID4gBsWgYaQEpVQAryYFixGQOQJ1udCKEZEiXQKObxl6aBHq2rS87hkOpUN+TzZ+t3blC88N2vs7qcVYx3LixxcRgEcCwSCSWg4kbhF7Umhy72jEOvaY7HRhDo+q3/8ckgR5WTJ9/5CQB0KGCSGIAAYFG5lLimnRKdDxiimkoYCJonmUA5d4K4QMTunECQHmBs+tzcpKwrJi8lmEmTjyLnql685yi1VBAJAjWsHx1H7QTNFjE1Ji5Auhj/e2mHUYcq5J9K7TrDsqKS8gTeq4m6ps1DLf81u+p6p0T6DwGZcGztuzFTQ4VQwx7k0I0yUEAtBuKL/9GQAYYA5i8BIWhA6NJBYjPRWFlXgoQGBAkYDBZUAUF+KBlchgUAsX//twxPoAEnDVF+5lhaKNoOK93SS0ZAY0A7yX6q2BIO2L0blooZB14DCdGCShsnOMEbQlLg8Sk7ZYTxJ0EEzLabkp23sGY0k2nNtnaVNQjoFRDxiBoKCD8KsddEJpWSDK7f9U/P7z5mfKU57TODH4JKmsQBmdNCJt7bbWU//RkwV4Wid7/60QDDwpMOkgLAkwGTDE2cNHiA4qQaIm2YYgsiX6d2XiOxDiZbRvnKrH+G31mfLCyQ80usCpO+n912mxF5oB5uivHsdWROF0QkMzejRsjq4OWyuQMMJGhNAlUXw5DbpbZ9jNjCdet2bewf5Zm3X89nKs2N+suvbJkYgWUYN1sTJEAHeUTZi1Fndrcwyr///90GBNCwRtvu2QASgcwAJAuBzBxIMn6g00IjBYFSIMEgcEhUHBAv/7cMTwgBHdCxnuZWWiXCfi/cSObN+7FGDBfPFA0BQlJAKWBFHbmLdiIB9UUw2yhiCZp6SMNJKLU4TNyHxMkr2UZZIC3YK3rpDaFnY3OtnkfOq/nWVC8ikUUgmzlwaEkJxTV60qxzMidv1yjfcy1/bIziWsf5F7eZwMcQKqQV1sTeBvRS/d3///9KalcwJ2SBN9vmwAAECgcKRoBA4imdw+PhEo6SgNENuq+mivhsLrM+MMdXb6ANWEZ2HjJgumC2TRQmmKjEWhQVqLqaOqCEEj7UA0SptilFhbE2j8G08UbnPMlbqjUbXqHd7yUbkpGLd/78v10raqbASVrBIaUEZqXF1XKljIREZa4g1DLm3lizGOde4dub2f9X7dq+mUBphoJ2//sRAMMhowsOQqDDAxXMP2MzgFzFL/+3DE74ASzQcZ7mUlomypov3EjnQwBAHKgwjQU2S5f6wYE7ISzwGCWCO0GBqWHiVdDyM9+1h/brPoVb2oSrT9WZPMd50LY96iuGNGlRKn0q+sTa+I+aqnaX1d1Pa63quScIcK6GuvpYeiYzqXyW9UCgwRJc4ysKkHLSCoBWacLIeCirElUKdPfXRy1MWVoQOIaDR//qyQBGFjB47ZAFQiY2npncJmUIkWaSRhEhAapHL2YNEDlZAkSVAwvBJanW6kxHA+KEQqQdYAYCRIZezjSRc4IjFMDYriKHZZpx6HD2xFoloHEknB4PoqLJLOOnThVpNZQlKGtzbbRFvc0vNUsVb/zaHVpXdDh7RZBqK6mpQLtDwD1W79fr//83BgUOcEzb7NkAGCAYGNkaQcbGyEw3lFBSq8xgEM//twxOiAEkDdF+5lJaJNGqM9zLD8MHET26SXxEDrAA0DcN/AM0wju14CR7efrlLljawdqT1K98pAMT0Tr0btqQo4Y6vH65BjbfrdD6eyDvJpSV79DPoIDKGViMnuxEfkTws6s+v9/v/msO295cr1KJAMWLBpM2JDdL7hryx21eL/0qMFeHk2fb+skgwwJTDJGQQg0ZGFJsZbCBhAMoJlFy3xflXzk1TA44gkBAoBBZPYxiB36s0ZIBGM0kt3GDmeFT2vEeRI9Hx11ZaSv7QcrRJGNwc4LtmV+WSa0jUyv5rRYF7XvqJd6EQHuHodeO3SQ/hlJezX8ieucn/mW5zOk5ZFaSbVDkgvpZOcWAg4xK6HILPoW6AcO0Ijb7RkAKLhQEBUCmECIY5mhnYIGWGkQa55gvpIMvdiXv/7cMTngBHNExnuZQWiJibi/bYOZGBXKyIwOJJCzJufe5itoeLtQ4v9qFepgbheMTpPGhjQQN9ZA1y5o3K1C3E5MNll1TKbJ5N8VZdt2Xrevd+Sx9L26aRPVNiYNAUwMD4Og8LCEQtePATlIYDYTSFksE9DDBxIzRtt456EKTmEf//pZQKHWCRtv4yAErg4BDhIzIHNTKxuBJnmOAp9ORRRpL0VAas+CAty4YCVYR29Fx4q245W3JNbGz8POUh5sg4TExgls/RakP5E4yH2xwhLR+Lry/sfprVGLXzqwbP3pCbAQIDRg0FkCoIAVYQYZPieEIVPqaBwINQh0VgoAgogw0IGVpbo2JG9FFp7/2f///sggVneDhvvoiADAoOAAbUOEAfMHy8yoETBoURtbAu6Gm1bayYGHsf/+3DE7YASVU8Z7jxzYkmY4v3MsLRQ2BwCRmMWgt+sZUOBEMAWGqK/Z1DNtDnLYjMNokQ+2qOExCaQDKaMmogQPmrVxm5tMSPMz7oqwlDxRdMu1STbLZzhCbqDpqXnSIzP872cekSQvNoVP+ev+fKeuvyJmFa1/YNiEoYi7r22/uqGBpZoSX/9kIAS2BoWABIyVtMs+zYQkzIeMJAzWYNQdpb8O3wG0Q+TEJQlgEz4obqWREiUKyabv25iMUMrWjLohghRIgmHxubYPAWD2vKw8UpxXtqTKCqxFHcgjmwhpXqNT6DJLOgtjE1U9Rs4UWPEhcuVWDQ+0rJoFnCpgMOQw4FsVOHiOBnbFOXD6Bi5kgp91/9tbKCw7OTv//GQAsKjkJApkoIZ8TDZsPwlBYYYFEG5tkbHaCkb//twxO0AEeivF+3lhaJJKmL9xI7ckLBzM4Lgwdf3HSYXCRNoSRIMDOjREoH0CAhUWLikVwjRyRKSQGRUCIeTBaJ8HKJhXI+vUg+3KWm1mG+e0or4/KnsbhTGijwARY6KnJkVQ+4EWDRY3BJDljXuErzqybyJ0S/TpgYA1qU35P////p1VaQHd4dZj/+xEAwQTMHKEGQqWGBbBmYIYkRiEAX2zdmsKabKzEzCnZMy4VAjLRt+qWOI6DQbDpMOyYM0ZOMVy1sxZPGfLa4votfhM/lOfWehOE1y0Y3WQHLnVvkdnqa4xBEw3HexlFz3ZK9+JxJRwOdJyhEg2iDejS+32dqNt0v6t+niqqJ4I3b5MWX1gJW1tMj/////0yYRMTLQ+/+iJC0wsCNLCgYYnMAZwPmMygjHDBqLOP/7cMTuABKMxRft5SfiSxji/byktHHdiybGbhl+FmkoJyzQ/hdUeZfSfGuftBelptodOrr1ao9S778NzBc8q1Menh+v5tedQOHJvGPK9Klo4kjXMUWelZ214stkdJ/WQitQCDxs8CUFyChUUQXLJOGD4sxYwqROkwXQtp+Mp/rq+xCGBoiYWG2+kZIL5BAUSBGkDmpOj90avFAgt+qRVZ6UpouZdY8TR3ReUbEtmtWYkLI7d3c6hmk6daIfJlq7MsJsTnaEqSDXIzdKk7SiJREnd7FuO6j8YSOVPYxqOxaYZjB1Mqear9a+KR2JhdhpnIGa8H1an5ca2nafpw3KGTTBlwIJBEgra/bbWpVPLE4UHd5hXff6Mkgs8CA0QggMRTAdky4FMRIgsAtIZFJ2atOfIxQne1ayOQ7/+3DE7AASvSkZ7bBzoiwY4328sLSAGRjb9VZpmZfq2uZPuahoW4pXD0hHKo8PX3RqO1RWOkafWNzux7ao/OiS1XGjrm67MvUhvLu4MpAdKkGFg5Ih5vZgZmdzDH+aa5mZwjmZ10OIDeNzU1KFTjRmv1Q+3pj5dFIulgeUK6f7v///1XUIh4dnjb6REiIKro2GCkpikqCnc/HjLDAQAUBZfIH3vmChmzRvUPzped+9TsBpOIRY1FlJzEJlmE6gwelusITayqNYTVNCwYKrFmC13ppVvGrbZvIp3Gcqbdq93Isctic/VTpO28tXw21/mx90tYZUyDLWAcIsEyQcULPGvIhUAEAodcLP6b31dW1MODw0Ojtv9WQAg6HCgwibU0aZEP2g8aTGxYIYAg/9M2WXGMKyxsMMy0mw//twxO2AEZk9Ge0kc+JgqmL9tg5sPl2kgkeCWGJVcBpQhQQkCiJURk6WxNtlwoiJtipariJBKYUbkuRo0KgM0qmh1VRI0jgaVpUtqPSZm2bFQ27VNT5krViBUJgJgq1QNgwzJtHrDZV8NJOkQGQBkSyGlW69vl7////1KpYJh4hYff6REgtSDQ4UBQShAycAxsbW4hMfcWKU9Iodi5jhaZcupO41UYevQpuwsbS0nzmSm8k9NMUWUCp8GUNOKNBx5sPAQUKm53mrsmmedGhM62qOL0PKJLoLXVoVnNmahtiKjtXjxntJ1BAmpBEBkgw9wMniBKVCawhC8+FT7kUnE/eToP1vAO7y7w2/9aJD/rkAI80Vox/gIuGfFl2EfyQbSQeoBLgUppW0jIyHNqud/VdVBrca8ovppv/7cMTtABF09Rnt5SWiQhxi/aSabBJPcjqZAzyEVIkQokuhFaIMRFKROhambdASiFc+9XW9uZ7srpOQynxGWtMIW7Ak85AQQFkCCLiySGRkZ6mPWfBE4GC4OqBxSGLJArS4U3b56m+nXvqXBpioWI//sSITCL8oVGwSZ6JHyPVLhTDICGvRFmT6G+FKoDhEOj5Mh+UT5QNGg82ubkfODaBWPbGXSVsuxqCT4s4FH45qJZy5Iyx1ogMeyDQZBfqHiD2lI0po5x0NeQWxbbS4lDCw0QawIhk4KGIjAlR04pRKFBIckTv9vF6fpdgmFmIeN/rESGHKGoNBYzEMCDh0xEmHAF4E5tccZ5DFAWOwMuodEDMSt9scHjYNXFCFEgmqUhlQG1RCNLmrHBWYdbEdHCBICRmAMXATdYX/+3DE8IARDPEZ7eTFoiSgoz2kjmwUTTIRQQSgQlCaKJU0dfRo3fFJLfKLh9/2Ix6SZpnbe37S75uVmc8UEQcSQQTirHA6iNUYHXW7mWIydlKOumcJZ4d3j/+skCgbmDARk3JjOIRfOMkMqJXY4LW5h33IM0KXvJIRUM92HnwuM9ahbickeuLcETmxEyLpB8j4WRDK2LFhESNpiVEdYOUOMvRg4giSsoyk4tiK1kZlG2zF6l5eRlN7sNIE56o9zJ3D3k+CFZYBS0NbJrbH9n9t3/BlKf6rwn3f+7M699uf7HXYHZoZma76wkhhrJk+TIgDKFh8cLVSIG2joX5qDY+WV1ZpWkhmh1Z76reWV3ObbyU6gsqujFQpj3qoCRhcHIkhqKkLbLINhNVFKKUE1hxvi7aGloQUkvTl//tgxPmAD/jLG+yk0qIzIeM9tJpcGWn2eYgu1MmPevG5TWLFhq5GC1W9pmCaggZXf4rpTh5XMrVCOt5aqBvcIbBdy73XVKqq///rdQl2h3htv5CQHRWCUVEY8FoAHDxiRSKgzxvfLJ6di5e73Pf4dAAKQwZyNXiIEvp6iPykkUXtHNNNtj0sfebI04CBE0TCJ5NM0gAOhLwFjUlcs3Dbmj55sswZhrUmEcbTLzTQza7d84WZFTqX+BTPklECLhCODrxCWelpB88xpKRdDCsnpzd9A9TOEQ0Ozvf9IiRTuwXPMgyMTeDpBpSICAI/rvjF99JUX9pnYnVOzShJPvroOrKI9mGo//twxOsAEbi3F+1lJ6o5KuL9pI504eU0ajSNUG1SU2Ly06DxdkWG3mBRVxURMM6lfpldFBkkhM7XpVhA+THZNadtdzJRN3o6WlWEw9AoR1KsZ9MoldS4ZGqLWU++cfMkQMYQ3ckVxIgD19qse5okS9h83R0d3/dTvmgHVIY2Xfa1th1mmgosbo+ZtGNpQ7ETCYHjNSu0iBTChM4dnX1Gkk7fkrtO/jboOXZN1FAQICgIPTFbgshOtm02MigFZl7RCjPmqbX2NIylvUnqBdlAWuy1RbuLCJGpnVrPnNNlGivYzujI8ZYVhakUKdqJMxn0FlqDYEBGBjwSBIiEh3bc71/cn19T9vrN/a5Xpm+mGCGaHh333sRIZcyFRIYPit0OCgUQorUp6azq2j7LYVJxkMDUsNcrR9cU+v/7cMTvABEc9RftpHOiU6ni/aSOdAsTTl8hSCLBhWabydNpYppchhcG0chc69EeL2ibZbOSFk4IFIJHyEGIGMkpf2DWlI1Annx8zF1kNKALBEaJw4xDBjAGWcaQLhQsOaLCWfPtQpemz7W9+mqGCHd3V22+jRIaQw9OQAlzCSxJ2ZgQXHa4u136S7GF3S+HL8BgZdC8x4HzFw2sRZJZGyhpGTRtzCIG0VMsEfQlUk8u00C5aKNWIXU3qg3BAndV1wbizU6QRSjqlzRhJDwRnohYkUSM3+Dp5P9qknEqb90I9s9C8ShASPPjL9exbLmWtv//+3/0xAPDO6Q++9iJBMSupH01xjCKIyh6Fq7yChFDlduNrMaisZHiJ36WNy2JpyaIS78000kkMBiBcIFvqY/YFHLIGD/KxmH/+3DE8gASmS8T7SRzggocIz2kmmSoikSJXNQdCCR6zNUaAqDHiOMp1lWfY1bImBs/Gpvf9yJP55l08zQz3Q7E5KVIjgJB4TCXTMrq72a27pcIZ3hnj/+xEglBpzJKiqYckIVBYGtKq57eSqxNs2suvDzRhCDpvaih0TGyEohN9UqsJ20JdDZc+y1ORFqNddNF8DxZXnSQeJ2GSBNKZIhVihNbzA0ZsR4MwAUHJsFzjk+NECl5AP4R+7Aqj3jCvl3dO2aR7w8rNsMP67d9d/9W//w6sA8K7I7XbSEAdhwu+ZBgYOIJNAMbSIXOIgtFXqVGSU85YlYYGv1FxADCBJcXNqwTRYsiDCE8xMbZEB0heSYG12hA4eSeSTEFnwXD08KUTpQXTaVKRnErtLRmybNtEa0iFYZLIfjo//tgxPgAEQVJF+0kcWH7qKM9kw5sJMTTKGh4M30ShzQOhMYZL5QBoLgiKoFoLguIAMWUXJS4pUkMgw0EADJMck2t/+yzVZ7/6IkIZoV3bf2xIl+nJL5HZ4FKTtHzLVl9q1VqUrfd3xpI2SE2nLEbLu0sgwyeQnbGgwKnAhMyquUVNMoF0RIGC4UgBwUlYOVBoqNww8jfTW0+wRNsg9BLHoDZBRd6XO48VhcO5a0Ekc2Uqv9qPRRNqtKXBCNdW1G1bzR77v189vWR5zadtbJ9lFXoQXz00eeFCR3dt/XEBKs7y8b7WNEvszNO4UrJdVLRGMzHLluai05Vl1qsnsFEY45mkKPy//twxOyAEFzbGe0kcaponqK9pI48FlHClN51EioGkZw1rBIoWiNiilIjRBRMMWRDkxxSAFIizLKk9AYHSIgmnlNdwjCKE5jjkIQMnlX2QYCwmaCnIkEzI18aCeZfJZiTVqEbNVR97Lbf2S8r/ZvGLlIYKJLGDglKiywKp4yODDhCoZ//6/0f0VkHdmdXfb+tEi9Ky6hk0gyUaTDhF1vJEIvZqztabs0svHhqbhKFUZhpE8NPTwiZbKiALRT59CKDIXJ5A+Bla0kCryOSpmAhQKqLMoUI+SNszQTacuSdZWcIpKMopzFc1bacAjpSYHAMWokBhBAAWpVxvjhyytFuIi9BziKHaWHZc1fgVcWhRgIaRJrUAHyKhiiqUOS539TPTTZY3/13fTcPbrNttZY2asNOKWWMDCfw9f/7cMTwABKFaRnsJNEiayljPZSaHFRmikkZqP7VszdilglPj8zKNmMWyKFiO2JCqTSEnMpI5MCIGkmVThs0fsTC9TC/6S08hNVCZ5pyFxGoYEmkKDJkpEsaTHCbdkVFmbtG1vXhM0201buP8w+LQuDFY00W8+VNXa7M8yzzeIqWb/5pPeUbFg6pa5BrUkERiQM+K7li91Yw3V40u8V+3lvKoYYHZ3aGffexolrrSnpLARJEwZYF4MaezF47P2qT6zMC4NaVpXBtFkVg2hbaxFBYDkZ2LiVTVZGVyjUC5CfSKabRCuSAR0m4lKWUQxskHitpal12Rw1HVKVIzIei4PPSKQuFEYLphBMmtKS0WpcPDwkU8otJs+ndRUCoLCUYoLh1wFsAl4YUQLmN9xJKyA8s3//0f/+n2uj/+4DE6oAT7VUX7KRx4nmrInWEmiC2RyWyuRpHCo18v4YOwtQjnKH/p9WMrt7fcMEDpqrCbLYXcUns3ImVvUdQkqrDzJGQLzEKFJ5d5fVrpbGYdhopOD0i6BuTD5tsKSLLyTbTQMGG0RSpI5kY4dagGOQHA2REKcqZ4QlJ0MrN6HS+CjMhiajAEn9hmU+Q3mVUG5+mTaZ5h8QMLPDccX+qFVOryxn/lm9f9/b5+/zff8fgGAPEVvb7tbRm45LdLI0hDziv8kKAWkeR4ze3ZjtftvPtf46mZeqQkyzFYtIoJeieTKpkbkhSOjRBKZbjMYJG1IQw3FpCLvTEaEWGhIvB7Y5WQtF7fkqk09EfC2WKtg+zAF6d9OZD/DM7XDbBXzz0JfvsWVsqc/NVrmxM2TbWxN4fzmvpUtehF0+H0jlIa0ABWxhwZcPG2PTW67CYFFlqhgksjNSGIoGeM3Ftt+21kaIFaGWxECSr9pskt//7cMT3gBK9IRnspNGikqyh9ZSOObk9WkztyCxUvQUo/liwUan3LkJxwjIgykQmXuMEAfQpynAgHUmRLABy5PBTB6YjaTEFk2QBkA1JKbhbTWgnk5n1VGmFZEG08ETQ7YTzMNQLJrSfKZ2i7Lb0WVsmZuyz/fiVlDRo82UFwItiwYijDTppKTDgMBWYsp5d/6f7K3t36MfUyjWquFlt1122sbEti7iI9hS5EdkkXsSWxlat2qWrnOjSovLc6uV+A0gSQpVSmtPObwlK3kyFebvGqwejoyeYdjcvhOYQ6m9mjtlsmoAvZWr0Jc/SFmC3VYcNqH6ZoziMmetWDYZcrA9eJvq3Q4bQ2RyZ7iitnEVWXKH3TtJdk2kUqIKZBo091bPSrCKlqtLpxbFjwwVLORrLUTFDnyVmiiX/+4DE7AAUOVkPrCTRQl2lorWEmhwVFy2y62NI2aaBVTBQRNpfs9rvfx+xTVOSlSFee6JCHhxfcah0KJKR5xRU4rBAuwbRIpWMoUKJSifYLEKjrMmVmVxMeI2BWjTmjSR+Yfbffi1rcqI14vQzAqYO5VXQFoEJae51zHPjjpkTnTOqaqR3BBWBHIOdPBUUEDlc/PrRC85x6fGhld7xO7/uiT9Nf/62N5hkp/53v6rjd3M+u1H/nbRpa9btta2zdr1WjFiTrOzar16KxZrWtc5WYLWtt3iBZhWq0SWgJliGSIQx1fuYDxeDBxiJRG40j5WiGzenauptMyVk0ky08EIsYSErwBo5Wi+xK6lTim5W3LJZdr3dYyQxzo9ofB2GmaSWox4Y0oG1iNwg7WrYiZfC0eUG7nf9XR/pxN27b1U27LJZZGkh3UrWEAOA1IfcTOHllS0vGebq4VcByHkNLFyJJBk0hBrMWUdJVQecR//7cMT7ABOpURGsMHPChafh9YSOORLQsLkohREzUhyO6oQBA1nmWeszmH0ZDukYhkOk5ilV2J5BBUXPiDf0ax3mml7aVvVNjG4ntyZ17LeI+vKmaEFR65b8uDZXHVuuxPY+x7XvrZ68B4l54K+r9/+F9lf26lj4WkEx/7afU4W7hv9pePoVccakktuljSFbmTumCiRiwqra5vWesaudmY1spY3NCQP0jUrYquYhNFBK5F1yM+qWRBMLNTv3ajD7OrRSNjjaBKVqnFkF8qoTVptGu5WF4kk6rnHaGN9pQZJYGpleo30yDvnjF5le3doLnJre68aN9Hdt/QgLV3Pal1b1XOdoOedzkhhKNrUisfrLAA6iph12ArVqCNtyS2WRIjXcWylSbqwVVLVqGEM712gM3K3vTXWeSUX/+3DE7YAQ4UMTrCRxgoErIbWXmKkHTKMi1ISAUiJxGh1CwIxykDCMoA/IpMoipCe4QFH0BnkCZxswwSF2x6RhqSucopIjmPu98lt1+fKOOm5frGrGwuul0U9bEKMS7tNz9+vX33nasf+0kZv3L6X+7dFP6aS/2f3oHJubUFf+u8He8n2nd3oHlJ90MxizjKp/tq/FUVTTrltkjSGtTjvhSpMNyLfMNYd/nOVp9vq1ZiclVqRtCkjwlEb6JjIgKqpoplVFikBciOVhldgs0tFEQVys1VLlZyBkixJC2Vg80ogGy5qpQi1CSAWiEO4ohIhGGBFAbLBqwjmsFWJTBKRgjrMktQN2K6IHgdQaG+GBs79fzST2+9zIzYXf2Z87GW////t/uyZvDK+1oG8Q7e7e6L/82j6qLakb//uAxOuAEk1ND6ykz8J8qqG1hJj5kkl0sbaGVvfQYojdIafdjmVfD9W6OvNXCeoxgtJCPdZNqgZIREVFmWaXeotcLWq1WpMAfIkOOI0zzuphnKOYu/Zd32KJZ81PNyndqqecfGejGw7UefU3tIVmw52rq7m4uUkUU9ufDt9bHAnA40cXaZkNHetyRZDB1tulMmtE3hNJhSm5JTbErGjfMrSXNoVMuNSy3WxokVKxgJwO5fS7ppfKaVemJSgkTkj4dRIyhOOzaZKiUuJyRAheQWXEcEDlC7FLp1caViJW1zjMGFhiK6GBbzdE7V+UYThewhhLc7lkPW1T4wpryanGubIPagmFAu0sMSBwyBQZHPHCijbBcYxne0qskpqB8Jv1OaVSy2XSJ3H3B9YosFrDqTNG215kF6nOkG3JZpI2gti6RQDDugc9T09VoVCU/u61FN8F6lGDqI3ZHMzYCVECcFTRM2ISJIs+jNdyc2f/+3DE/oAUWUENrCRxykMnofWEmbjS1dR5oqSL595O5zkinizny8TO0u8LbHonbNWai+1mJ2Uoy/KDuXuSbGJUin/WPOtM7b9v80jaROddrOrd00psEkjUYHGV44jK0NIl1tNSOlhmzQnYowpOwyNxy2xtIfvLALlIsxKUb+Yu36ae3rC6VbUWXzVbhUlcYu1jyNTDkpI2WWwixJUsKkA2b5ATk64RRr1ritLTYRKpm7yaQTSEkIGJQQglQMdDGwOU6kSC0GhUMGY9QdmlfI83NQYoxLVsMUKk8c60NbahUKDuDGmv1bq5OHL3/Zs7SazvRquRs75jdr/dV5KD9Eu3uM+yl57KoIf/pSpxuOTWyJILcmidApERqhUmXC+k6DtQTQLXuokyuEcW04soNEYDtGBMSkSiHRGR//twxPaAEljlDaTJIgIyqSH1RJmwDmWqs5t4jICRNksySuPvPkCafSQqptTQOQyTSgwujLtyWSnGpLqaq1c8lHl6qSEk3biSyXSv0dZLHpmaClKmMyDNlEHRlCkUGPN0sc+p46IyJsruPVCB8q1maXrE9brR4fonDPOPpk2nG45LZIkRKEZALkaggKHvGpXNFG4yb6raU3QxJdiMyN8qgpYSJiNlEydC4ndAYDn5fve4kzbMInFaVkhBKSTrpI9WJYPjLWoS2xISXJDIpsalt1jjxQ619niNijRCX75vn8Urpg6B0FzG+RjxStwnFBVlT5KP5o+ilRi+o6hr05Q4g2sy6OXcw+SabSTUlsrjKBI1rMWi1Y+PGy5F5/aQZznR7orMTIvBcLI9ElmqtGWJCQEjIBdmaTVyVf/7cMT4gBOxVQ2sJG/KWSshtTSOOMi+y6K824NYk0mWaRWrn/VUXdB7N8q1qMrM5VDtmZcv7H8vUZtvi8MM8WXDDxXGC1vkNBVRLu5KREx0SAVCty1ofLCyfyWkJDpKRZRPes6LVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+3DE8IARaUkNpJh6ggeq4bRkj1BVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQxNYDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.05260771 + //_tone.Marimba_F_5_L_ + } + ,{ + midi:12 + ,originalPitch:7200 + ,keyRangeLow:72 + ,keyRangeHigh:77 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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ZY5VTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7YMT6gA+xKRnsJNUh859idYYNuFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UMT1AFCVLRXsJHUgowTgbYwYlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.04142857 + //_tone.Marimba_C_6_L_ + } + ,{ + midi:12 + ,originalPitch:7800 + ,keyRangeLow:78 + ,keyRangeHigh:83 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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D2+0e//7YMT5ABG9NxOsMG/CDSFidQSZuAM5wQvNT1pJ+e9mRlnWatpOpPN9uZ3w6EfaSpWihYrzy3al21kpz2IHMv0fI2MXpm05Ja7bq20hvOzzncOv8Orc3LG7SMrB4RqsmpxqasiVghXX080R2pih/LLwE5LKAwQWWOwW2cTaFZvzWoaxDyDmDInfRXzF9PU3zJWVQSIIqohpR04pzpkRjaug3Abg5Fcyqw+PkmzFNsgYaQMPFUYvDsQo0hy84pdx89RYpUyr1p2k2IqKoYgyuuuuyySSza/WNoTturwYdn7iWk8VxzPTWqxL2lngqNqFmkBi1nOPweVUnCYePhcLg0ZpPtMKjf/7cMToABE1HRGspG3CGKmiNRSOOM1ELhQgggLQNnCZBydG5jSRJaP6p3yySmQkllM+7E+lz9n1i5kGuWpkeZQK6BwSWE3sCaAUTlQkEHhsHhS9nf5fCn0fQ3/oSrfS5E30WVVRqOOy262NIWy9g4tn7G9u+Zc2+F27y+bk0qypKCInxmT0KCE1jR25tAygJSckmNIF7WiRl1q11rsYwjcQCZdlAmjmUIe9lpuBFba+Uu+SV0BYpVcxE0UOswSuvfmaPykupi1YtXpN1mMlLOSnVfxCg8cerilKh1rn2IXYpyrQ1oHuFLpEwl2wbpLqbAxy26iSW3XX3/22MbjbrY9CUNIuhtYjpyRrM9AwK0enx9Ah5UBxq0UUsTKc2iiiieHAEskNEBT7nrShUrrDa6JMex3AZ8aChjb/+3DE8gAReUkPrCRtwguiYjT0jjgLiQYSugKxrhUqspVcyDMfrD1WKsBgmKkVueoVBUjBVhL//pVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tgxPyAEgFRD6ekccGiJCK0Yw34VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQxNYDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.02795918 + //_tone.Marimba_F_6_L_ + } + ,{ + midi:12 + ,originalPitch:8400 + ,keyRangeLow:84 + ,keyRangeHigh:108 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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UjEgVAVAT0EZEBKDh6sy9G3WRJTwq47pNIts8tcsFfFiQs9NICiIK3WxLJVNWsBVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+3DE9gARrR0RrCTNwhAjInU0mbhVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//swxP8D0e0FC6wwbcAAAD/AAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02142857 + //_tone.Marimba_C_7_L_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0180_Chaos_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0180_Chaos_sf2_file.js new file mode 100644 index 00000000..a6c57e7a --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0180_Chaos_sf2_file.js @@ -0,0 +1,110 @@ +console.log('load _tone_0180_Chaos_sf2_file'); +var _tone_0180_Chaos_sf2_file={ + zones:[ + { + midi:18 + ,originalPitch:6700 + ,keyRangeLow:0 + ,keyRangeHigh:43 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ,{ + midi:18 + ,originalPitch:6700 + ,keyRangeLow:44 + ,keyRangeHigh:55 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ,{ + midi:18 + ,originalPitch:6700 + ,keyRangeLow:56 + ,keyRangeHigh:64 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ,{ + midi:18 + ,originalPitch:6700 + ,keyRangeLow:65 + ,keyRangeHigh:72 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ,{ + midi:18 + ,originalPitch:6700 + ,keyRangeLow:73 + ,keyRangeHigh:83 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ,{ + midi:18 + ,originalPitch:6700 + ,keyRangeLow:84 + ,keyRangeHigh:96 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ,{ + midi:18 + ,originalPitch:6700 + ,keyRangeLow:97 + ,keyRangeHigh:127 + ,loopStart:4133 + ,loopEnd:41553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.01605442 + //_tone.Rotary_Org_SC88P + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0230_Aspirin_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0230_Aspirin_sf2_file.js new file mode 100644 index 00000000..c5f0acc3 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0230_Aspirin_sf2_file.js @@ -0,0 +1,140 @@ +console.log('load _tone_0230_Aspirin_sf2_file'); +var _tone_0230_Aspirin_sf2_file={ + zones:[ + { + midi:23 + ,originalPitch:6600 + ,keyRangeLow:0 + ,keyRangeHigh:52 + ,loopStart:897 + ,loopEnd:1016 + ,coarseTune:0 + ,fineTune:-1 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGAwCpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamp//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJALAAAAAAAAABgPBkULxAAAAAAD/+9DEAAALqAFdtAAALGc9qfc5okAAgNKSTba6/h4e0AODw8PHugADkYeHh70AAIgAYeHh4eAAAAI/8w8PEf/gYeH////ow8PDx7v/8z//YAAAAAjD//wAAEejDw8PHsAAAAAYeP/wAAAABX+h48AAAAAAAAABAQECjyKUjNbyDJgyBUIYEAJi2JsoMVGAOHJjcLgkJGYwoIBAYYAwVDosLzLS+IQEYLHA8PSYmtAHOAQ4BzMhFFvH7LgHcIEjgOGlDAEqS86ljUKV7izYFCqjaYPKmSqTedgkOzNiYLhpJwVbnAQKIgbQWGTkbhyE3JBDlSfjUcoZP8NwuvOv/BWNB+8OvhYid3DPCXuZT547vztLTUk5TUVm7hamv5lcpLPKs/Yqyu3bnZBbp5iRy+MWdYcry6ljFHbv00rxymsaeclsoq0lBvXf7nvLefd1OVM/1rf/zeP6+7lfxw7/N73jvLmeeFq72ksV69W9llT0u86n/veH/v///zyxnLle3bw5V7OWCfQi0NICM20QQQIAySNTR/y67yMmui+g3QFwAEMo4RamOOABVVwuIBZ1IGVqPdmOEs5IyCgUareypDiLQAQ5hJFCZJrIQIDBaQr+LIvSwTYEmw4BYrTZTeplUK0J7mX0kLFotPWoi7uDtU8poK9lwJTJnyguieORU0zIeSqhqtIvX68+8bbwPOWOUdDWuy2rhTS79RKkwmP7H3TYhKZZDsawh+tnGd8ptWqvd5Z28v5newlkjrP/JH8wkH2aHdLUxyz7S0GNNnRYY3sN/rH6285VM3ZXKae3Oz0xSyjKX0kuu5VeY6zy3hV12tfXb/8PG/Z/7eqgCQCQBwCQBgDgUBAAAAAADol+kDdMtzwMTFFQNRUKfA0yDUAwroZ8DBQAkDDuFDwM3TbQNHjuwNIQ4vwMTICgMBIJgLAvAwOAv/wMCQOQJBMAwYhMAwIg6AsGr/wMDQOwMAAHwDgegYFwdAEgWAwOgE//AWAOIQhyoW6I4SkKF//0iiaENKBfJozKv//5DS4RYhxXHNHJJYZYcol////FmkNJEWcQ4iQs0hpERjikRIckxLv////5SYvFFzFAxOOZJl0mTQmiaNyK//ugxNuAHaGZW1mcgANWOiT/LWIAkyWiBE0WyAkyVRylTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02138322 + //_tone.Accordion_Gb2 + } + ,{ + midi:23 + ,originalPitch:5800 + ,keyRangeLow:0 + ,keyRangeHigh:70 + ,loopStart:6242 + ,loopEnd:6930 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:32000 + ,ahdsr:false + ,file:'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botLy02L1aBxbnlubl6tBBR9Ko6zCFhwFSKVRChnAyQyZVVEdVstbrlf9HQ4//t4xN8AGBYnaeypO2OqwS1+tTAFZMXYhBZuNABx9PgFkwwvgMSzGIAMUmA2PjTC9sKwk3xhABgIEmkxaY5GTXxo6IgZMEMmbEpBVHIPiAaYYCQBVUwfCNQ+GCy+hEGcAOBEQRE9kA0GF2pdAAnjOhWIDA1/oUXtjyQpgBACBL0EJB6iJcYtYh2HigMPvPCnPbE4V11I820DwBI3Se+B18NeFARQML2pWF+i/AhAILpQoTH/V4l5Bb+P5BuDW1hoFbVKt8azayysHFiEzH0WQoGclabzNUcC3TY3r9WZnrMEyKcjNuHYhKaagbvRyJwHWrs+l7ElgGvxV80t+t6KBJEuJhcqhxxZfGG9fuYnHnuaeekrUdJMNNakxuO1Wm0EtdyPRt5ofiEupX8TUWYwFgaF5e58HEY21uVrocxnEPP84EP4QxG6flPaztU0/cpLc9ZtT1K3azJobjtNFcaD8KljOxHb8zLbWKY7mMViLS3HjUe01htIOvSGUO3G7UBwS14oGpYhEOOWWqU0TJbE8aRCjqDmeMSHIcoozWW1CSQagKgKg1FRUVFQ6FhY5mZr//uYxNaAL+IdY/nNAELgOev3noABgWFg6BsLCxxRIqKioqtCwNjYFhY65VblVVVUkWFhYWFmZm2ZmbVblVWmDoGwqKqqkioqKizfqqqzMzMzMtezMzEioqDUVFVhqhmvVVb1Vf4KFhYWFjr1JFRU1dmX/1VdSRUVVVlhYWFjmvn/ZmYpV/+GVRUVFTQUG/4oKFBQUN/IKCgoFBRXwQUFTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxMIDwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.10612500 + //_tone.FanHarmonica_A_2 + } + ,{ + midi:23 + ,originalPitch:7800 + ,keyRangeLow:53 + ,keyRangeHigh:70 + ,loopStart:727 + ,loopEnd:787 + ,coarseTune:0 + ,fineTune:14 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAFmgC1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAOlAAAAAAAABZqc4kozAAAAAAD/+9DEAAAL/ANjtBAALEE7a383skBoAAKyy7bXbjPLh/A8PPH/4AAACcPf+AAAAAgPDw8PDAAA/QeeHh4YAAAAAB4eHh6QAADJA8//SADv8PDw8PDAAAAAAPDw8PSAAAACA8PDw9IAABn///gAAAA7///4AADvIALEwAAAAALKhUDgGmiZtYEWTByeYItFvzAiYAFBnw4Soh8gcCQMFWphgKACoIDTFTGkMgDzBgKEmMlLJgcRV2JmEACfBgQCAzNHERggZIw87a7GuepYCDoiIIfa2YaRuTWU0lvGuWEv2L2YkhA5Dnc2lBapH4nJ+ettzXfqCXu9sqnNv3kpK8rzuTEObzw+srY1D93/xYO2avLoEhumlkD4fSswh2qztp9a3U94P965FrCzT65U3lvU3/Zq6/dJXiEH09JFLc3dhi/ulqfGMd5XuVbmGFf6t/tq/jdp941rN+p9S1Z1GKLOf/B5Obx/Kn/HC9v9fzmP61/Ofr/////////sf91YeU4MfQtN1ap4ggdBUCcAcAZySMEgBsOAwmCAQjmYGBSYZC6ZJvYeBxYYbniYajaBAHaUbYfabnYOYzhGYIkMsZQI0GGISToiHVwGRIBjMU2DN5NzAgKzLUSDBwAFzBYAwUApq/wBo29hpyN7RjD4DwwL81BWlOt5mcW5h8L5gGMBgGO5gAIyLfFYxoYGlLGi2M0FABcgAA6YBAqj4rAYAhKYVBAX4CADBQFy6IxW7En+EAImAwJlgBgoF5gUE4cDHy+DZ+uVANl+X1qbGrSs2f5nIXAoGgEquVAAcgYApl8OKzsQn8GL/WhqrKYzrtVDJuYyASNzH1AVyvAqi4D6RmX3GYw7aWw68brWrtamtVqam3plL1JuqUv42V9ZyXdjOan4m19YV/6d6Jy4sJU5XcSmq0vN43KtLZ1ur+LInClbdnCkqymBQ/LK08+sMx6xrLDPnLd/uefd77hvtjn2MPww5vXf1l//r/1//vn///+//18spiDRXBjEflM7DUqmW5OFH2fOFG4MiU/S40zcXZmGe0xBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uQxN6AMV5BYfnekUAAADSDgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.01700680 + //_tone.Accordion_Gb3 + } + ,{ + midi:23 + ,originalPitch:8500 + ,keyRangeLow:71 + ,keyRangeHigh:79 + ,loopStart:653 + ,loopEnd:692 + ,coarseTune:0 + ,fineTune:-32 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGAwCpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamp//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAQEAAAAAAAABgNT7zyGAAAAAAD/+9DEAAAKMANZtBAALNTFKf85skD7fgAuy263fj8Ace+AAGYAGBmAeHh4e8AAAAADw/+hgB///h4etAAAAADx//qAACMA8PD///w/w8PD/wAAB3///4AACGw8PD0gAAAAj//qQAAEShEwACJDAQAAGy9MwIAggcm3TM0gJ/jPYSRxaSMBalMHAd+woIxYJA5EGueeJA0KxMzKCUBDPG4BAATAyZsEIUg0Hb0zljIhtFsGwYYvxfJbCODV3oFRc2ltmM4eNKVgcGR3O7aOOEFwTySpQFmtr6P0ZvmPFEUm5m3GpI79fJIhPRxUkLFVOMxIVZNF5RGcM4XHZdYja6GXz9BJqj6lQIWNYncrdBUuV6K3k9BZxqNmnpDCwF7tRMDA9rnvonJz8Mo72p+Wt44x53LEYx7Dbt91zSiiFlf/oZF39dw3vXNcxxzz/eecU/duvL8bF+cp693Ovv9/KbX8zicn5+88quVnWrnNdz/ust8/+63+//L4pZwhiKUkQoZXet0/a2VFrmH8w/v7+9O/9y9e/6s7/Pu1ztlapIU4AmVGU3E2c0DwEAoGAMAsAFjAFwEEx2M24Mt9B332l7rEQA2ZYEfEmPvEtM6w1HFS4xX8ngMUiTDXigMSAGkzDJdkL8zJ4LshmkfwaAAAgAyMoBMXDGtSYYwEIhto3agl+JJFTAAQAIwhQrUMN/I2DL0R1oyfRRNlGqaZMABAAIZi+LXjHnC5Uw6gfSMS7HAzAMAwcxmQWthmgp+1WzQJE4+mNiYK+HyGCYhMRhHYEYYQIGfmCRA6JgUwIhrX/v43S0bi8vS8wNMCXMAJACTAkAK8UAzCoAPGA2gNhgBQFP////8At2jdLaqPrLK5gNwHiYHIAhmBXgmxgG4CEYCMBKmABAWRgAAAeMgFBgH4B5//////GWVPju5uZvd/RgCgC2YEIAxmAPgUBgEgC2YCUAGmAGgFAUACQMAKp/AYANMAnAJv//////+C56xny3Y1vv01jCuYCQBgmAoATZgLQAkYCOAZGAIgDxgAABiCADgAgDxgFYA0OADqVZgFgBKYBSBEGAVgLBgFYAH//////////r//98//////////////FgBw//ugxNOAP/YJa/n/jQAAADSDgAAEEgAWBgEICkYBeArGAEgF5gBwBYYACAWGAjgFxgDADaYAsAkmAjABJgHIDkYA+AiGANgBZgDgAK7oFADCgADVMBAA8QABCTxgC4AkBADUEAC5gEAAKYAuAjVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.01514739 + //_tone.Accordion_D4 + } + ,{ + midi:23 + ,originalPitch:7600 + ,keyRangeLow:71 + ,keyRangeHigh:78 + ,loopStart:4027 + ,loopEnd:4650 + ,coarseTune:0 + ,fineTune:-20 + ,sampleRate:32000 + ,ahdsr:false + ,file:'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' + ,anchor:0.03900000 + //_tone.FanHarmonica_E4 + } + ,{ + midi:23 + ,originalPitch:8100 + ,keyRangeLow:79 + ,keyRangeHigh:88 + ,loopStart:10792 + ,loopEnd:13751 + ,coarseTune:0 + ,fineTune:-1 + ,sampleRate:30000 + ,ahdsr:false + ,file:'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' + ,anchor:0.05036667 + //_tone.FanHarmonica_A4 + } + ,{ + midi:23 + ,originalPitch:9300 + ,keyRangeLow:80 + ,keyRangeHigh:84 + ,loopStart:468 + ,loopEnd:493 + ,coarseTune:0 + ,fineTune:-2 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAEyQDU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJATLAAAAAAAABMkN2O2dAAAAAAD/+9DEAAANDANj9BAALUXDqz83wkBHeJpkASleuu3GvAAAAf/IBkcP4AP8PDwwAAPgB///gAAACA8PDw9IAGf4eHh4eGAAAACA8PDw9IAGfoPDw8PDAAAABAeHh4eGAAAAAAeHh4eGAAAACA8PDw8MAAAAAA8PDw9IAAAAY2rtdVlwAADAQAALDG1jW2YaqEI/GZjg0EiSoZCQmSjxesDV5qIibBJHH3BhY8YidGEGwOrTZjk82hIAYZYTBgQLnGaGYBCplobmRABnRGUGKZZE5ggDGCwIBg0TAGbsOuvClhLwAwLF21DyQACgRAwfWvU1cN9HgmBED3uhQJiQMZfKa0oVTAoBedt5PDitoGCBmsTqDwNQx1KQSBzBoRar47hcASzljdcwgFmSXWvzcw2ELgBW9wOc+vWlj8WesnhinUBCoCMDi0w2L11P3GozF5GzgDAZd0zawwqxWN2s8Me9v3KqcgOBFnLncojD0mf+Bmc0n54YSvUU3vWGrFXPuWW/XekBzDD927trX85gulTGCKsVk8OSxyovPxiG31drHvdb5VyrXMccdf////////+YQBLO//fY5OZ/rn8uc////z//jL60meOvxmrasGexy/38k0IAJ51Ly7AphDiXFOCZE1ISOGeQnxzFyWoKtVqQKE5VOCkaef68zrzOf/yRIkZ7VXmZmZnHmWrXNIgyCukSndQNPEvgqt0qGyuCr8qd//EXUHODUOxKdEvgqGhEDKpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tQxLoDzCSRZfzzACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.01086168 + //_tone.Accordion_Bb4 + } + ,{ + midi:23 + ,originalPitch:9300 + ,keyRangeLow:85 + ,keyRangeHigh:127 + ,loopStart:519 + ,loopEnd:544 + ,coarseTune:0 + ,fineTune:-2 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAEyQDU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJASYAAAAAAAABMmmBoSBAAAAAAD/+9DEAAALhANrtBAALJ86rD8zskDf6SwAubW3aj8A88AAACAZHH/gH+Hh6QAAAD/6Hh4Z/wBA////+AAB4eHh4YAf+AeHh7///94eHh4YAAAAAB4eHh6wAAAAAHh4eHhgAAAAB/////yB4eHh6QAABBTFM6u4AIqZiqBakny/2TwOOYiB2xrM5DjmQIRzOjHAw6ZBQwGBAOsguyZSZ0XHdBDhlC4IgU4OBWUacRhBhAFcRHoWA4bNTCRoILht4+jxpj1KGXFtAULmHACsAOIwMBw3Dm6YwAKhnL7ZjASjnA9LG7eUobNMRaxQAwIDgzDFp7oloiYZWIxCLXZbLJbOWspfnFy3bF7DqJUFpErEJC1mCbqRangCtOxXHW96pX7pOcUviDqF3wMFmQCQ8DsAbSdl2N2zTSqmpsbNrLlJyzY/72mXy/B33/l9C7cPzsb///9a13f5Vq9XnP/DnLs/flHLdqpF4Em4fdzkvhL7PxMPpDkufSlyytY0tXVbLv///////////UnygtDF38Egg8zF1h8uaS4o91IlIAAAAAUfIfh/CTC3BHjSJ0TpDRwoTIniDFuHqHqNFxRQtwOYJEOJ2nVcrk8hyiVz628PlchyHIchxzIdRPGkdTNdhVqtfPrWt81rb1rXVmJXPde1rPnz6tdfFrPn1df///5rWta1r/WC9exaxKCoKurBUFTuVBUGtYSBoO8GgaPVA0DR7iIGeDQKgq6Knf/////8tUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxNUD0tTpVdz3gAAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.01206349 + //_tone.Accordion_D5 + } + ,{ + midi:23 + ,originalPitch:9500 + ,keyRangeLow:89 + ,keyRangeHigh:127 + ,loopStart:11475 + ,loopEnd:11520 + ,coarseTune:0 + ,fineTune:-21 + ,sampleRate:30000 + ,ahdsr:false + ,file:'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' + ,anchor:0.04466667 + //_tone.FanHarmonica_B5 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0241_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0241_JCLive_sf2_file.js new file mode 100644 index 00000000..4df0723c --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0241_JCLive_sf2_file.js @@ -0,0 +1,125 @@ +console.log('load _tone_0241_JCLive_sf2_file'); +var _tone_0241_JCLive_sf2_file={ + zones:[ + { + midi:24 + ,originalPitch:4000 + ,keyRangeLow:0 + ,keyRangeHigh:40 + ,loopStart:108072 + ,loopEnd:109424 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:true + ,file:'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' + ,anchor:0.06728346 + //_tone.N_Gtr_E1_Hard_L1_R_ + } + ,{ + midi:24 + ,originalPitch:4300 + ,keyRangeLow:41 + ,keyRangeHigh:45 + ,loopStart:74384 + ,loopEnd:75523 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//OEwAAAAAAAAAAAAFhpbmcAAAAPAAAAdAAAe0gABgkMDxETGBsdICMlKi0vMTQ2Oz1AQkRHS05QUlRXWV1fYmRmaG1vcnR2eHx+gYOFh4uOkJKUlpicnqCipKerra+xs7W5u72/wcPIyszNz9LU2Nrb3d/i5ujq7O7w9Pb4+vz/AAAAAExhdmM1Ni42MAAAAAAAAAAAAAAAACQAAAAAAAAAAHtIXj7zkwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//OkxAAPqAahf0EAADCFJoWGfjPz6gfeXiMPqDAgD/qBAEHS4flHZQP1h8u/UH//Lh8vU75Twx/h/8QQxkP//8Hwf+nrBAMeJwfg+gCeBAgGAQCBCyAzdKjKYbDpjcjjZsMPIk9/xh4JkQLMmCUxmeQ5sGBRuEABgBgM0GOhAY3D48NF/t2UsMItFpwPCiEmQmzBBUBDLHtRMTiMSPBSkDJxYMLMw4QDsKpH1fmVsHKGLLkGW9QCoHoxpwpsteoYhyabu+ZhhpYBNyujodoxjgqApBVlqbqttNDbsQZH7WkezFAExV0JkNSyScLhkwphiwFmVY8uUMuuXcYr/3GfSm3nHZNe/Fac726ylYS/y7MXf3ftTNBFpPWnJTKbG4W9//O0xNRQVBqpv5zQJS/MqktNjfn5uzTU9A/3HfdOOXpHQwzGrtLcvfT6xzaU7tSCY7ZjtJ9e1lhZ7qpB1qMy+Ly2gt7gnU7Z5nTya1/JZh3+3P39L2zuthf5FKs1jhTvzO/ard3+rtrVzLHjhUeNXGO0FN+H/c1USi9qCBL4NMGASUxGx+jAQBDMW9Xkw7guTCSC7MGsAkZAIMEwBIRgLkQUoQFkKAgkQWCElCYwwkAfTyEQCICBIfkwMgCXvEQAIsAcjyPjAYDNsVDjywYtocxfSSxxeQtpQQoJouACTtPW6qjY0+krNZOneu4VImaElvQobDgQXGGILtZCwBWKCZ3FLV9RgOPKEyUEMkTuY6pWYQZDwwFFgUuaHLXCXpHE05DKJ+e7S/z////6rcabtTn3vu8xs4ym9lbyq2d/zeqbmrX7xfbWFrU1rK/+O9xX//O0xNVN5DJ0D97QAXy9KoVLqa7DOPef/blLnNQNTfLMpdKso9fxs6zu/ayuy2Vcz/da1b33Krv9SWldG7PZfz/1357Cvcs35JTz0vqVf5r7u8Od3T36mdNucp616nuVZ+nqVafPPPLfLeF21YlZegBeYCQJpg3EMHU0haYFQURteBphC85g+CvmNOBAYCAF5gyhQiMBYwTCcDC44MTEMplA0ARGR0wDBBzCFeBgAAtKXwNKnomBLQwcbhCIDCZtFQcZDcgMBCbYGwDDjEgVBgPAOlMtBF+g1IuQwr9cDcm0GDp3FTQAINSzECVEgRXT3o1BgtjGrYVHH9XJslhM5DJZvogHLvEJcTerRM2eqgQsTGSYKFXYgDAwCLQkFE1E50EYQEQ3MaMi6nTC5dLlP63//+8JiclOdPQ4OXnK56u++b707usPdhYSDGIQJK3H//PUxOBsVDpYBvc0dHwREgW4zhpUC/CoeeGgeJ2ZWweo0SRKONmrsD2gwGBF2KKObZcyB0fIi/fUj0+5+ALzhyt4maRCP3Sz7F3ofiPq7jDY23qRSCF0UTpupJWv3+V43UigIGKaMrR/BQo1RICJhqimEYggvwRgTGhWXM4dBzR4OIgwVJrBmHEDS0wBxI8GBwg1CTYswgGhsp4v+36YCARPoUAhg96xoAw4xKtPIEAgEidY1SBRQLl2bFRMUVBgIaBoPBFip6NgUtXOv8iGkJMs0pyTFS8xhTq/kVk1KgAgCAE5gEABmB6BsaLIZJgjgsGM+UsYTgGBifIR2dAwqxPg3cQbWFVMExYkKgT4IAJnxwgvrVNBmwm5KFUzpEdsE1pc04ui/sDyIDSjTa8EDbDYJ+5ZeADKyhD7JhL2spDtpGWEysekExJatZs0kprkfus4ThfRic08zHIaROfaWL+lsD2YJpJG5uPaX+Zf////8fsqrwJnhyQz27m8KOizpI1lb+nxwptsXym4OoI19inmatSBrUVvRy7U7TO5StEkNC3GKStybT8yyQ4xWtf///PExNFTDDp5VvayKFSXrctwkUueStQXKG9egCe3asyfsz2btZ97Q2eVXJf6PtbdFswsE6zU5dH3ofOVR21KmsILNaTpQ1X0tJTNwWHIsPyw9isng5rMEydwWW0UcXcqFXKyGwrhTyZcvF0QsAFQlRr/3SspZxGnSU1VyoeoCzhhzDmgvy3BmVUBBYQkXfpZ2VCIfOScgoFmJ7qUo6JwueTBmRUbQpKocsWCktY2xi1WankyrVyTQRaKrM/NXMbBhLUir+9YzCNvbHqsy4YusH3If/Ydf+nhaXThVPrK5QnLAzXkjtu1Uzxpc/1///+VdUPl/pl0z2pP67jRGD8hNZLtNh8Dpg6aOC/azGrJu1i2rGuT6NDtht0D9jut2NeL+XZO1pNxO7XcdtHl5Mi5yl2v5Qf7+WnDTXj6f/76RvG4r5POX6e+NZ//LosqWouc4wu4Vf/724412uOxAAFAC7klGAGDD8aivIqIDszkNkggwUSQ4ANNMXgBc5iIthBX//OExPc0xCqmPtvS/SQRA4lruEYIX8OhBUDC0Dq4iAPuW5iLgIAMoLzYaKAL1im02pRfDtjKHUKNKQip03anFJDUoQIim8Q6dMx9bw5YXDuEtYXbi3JuVMRtsuKP1pycYMvxv//5+QjNRHQR+mKhMYkKbtUdSzZ5bWT755KDHqqsmcY+dZ5bW8pDaEGithe6EtWnz2Jxd8M1esdalU1ZZMVMLuOvFV2bHJNitWtazh09tpa/qrasrrWtszWpWJ3r//OkxNc9JCKF/uPZNV3WVNWmvoqr2Z00nVq2szVbXpOjo6W9MzO1ds9g5QQAK39wMBCYPoDZqYjmGD+FQZj62xivBGGBWHuYYADThGF0AcCAHjB8FkMJcBYLgSCxAaQajDOg4B8rA4KoDICBEkwNAugMdAbJgAASAAECbqTKgGsplRS63Yxw5MkkUKDJIdNGw4qnib5p2ALWMMSe5bVdrYtLUKrQ8NDouTBzoQfP3tQzpfTV2jpM8W3ZbutSItKoqd79ySJz8Un7n2f1///eYzSkqZuBMlS1bMA2eawkk9uu2PrQI/t7BZkTjetutS32vXp7mo8LflwIr3jqcrLZ9Vrz0nt7MrmqpTVcqWwMKSUjrCxdq27afoqy0zssxNO9//OkxPVGG8pkvvZZGQ1Wu178+rKQfmI+d95DXCUbV/qVKpZT1xq36AbjZ969s2+kKgCR25gTYGgYI8HJmQzCoBg0gVGYhChsmEmAzJi6qp0gDpgSH5rCnpgCSxprzhqcOBimfpy+KRg6ApgGEyShhmoJi4BoWAABNimaMS6V5hkKY4DjE+Z/XK3moOxELEgGVxCOoBPFhTG6cWBSqnmHAz8hETLiEVpxGNG2ibJgoXMUV0RAQqWjgS+wjTlfDocaeUuMKiUYQ9ezSKXjgUTB5eUiMrRKBs3WELcw6xdisQdCWO0oa/zLW0mpidykP///r7sUuIvIlVbWMds5VeRLnKuVNvXZVnqmgyD849IuY6qS3Lmf/3//HL7lt6nmx/PH//O0xO9RZCJIFv92MXz/5vLv/hYv44zVbCVX89Y1sbnLNXOzYv1tYU/4Y3+1fy7dq6v5YZU2+9q97lfrYYWr2GN+tXxyqWuayo9S3uE3et/KexKhrdsXrVTdJl2vbr9wok9YigCu/5ggBHmBwbEbhyvpgth4HCkacaaoMxhvB+jyZhgnAoGA0LEYFAE5idlDmK8BqYF4rZh2goCwA5gHAJpIGBMHeYLIBYWBUMCwClVQwBAhHqBgMYCA7MBQA0DFyEQHJgvgFDwEoXARB819DuFUFzbZykEBEIuga4UXrxALXoQgzRoIbAqVkrGSsOMFR7u/wyuEgCM5p0Thu20FaEomVO9LBItJkJsQbBLF3/GgUqVXkN5+akrYzcgdp/YhjUz1////9LgzKBsf3vn63cvajVLXlu+d3y7WbaHqDne44YZc2TEkyQDwhHFWcC4W//OkxOxLpCZMFvaRHRDkk4dVVHlGVbPEjYSm+iWTMYVYb443KGGDj7FbKhd4kdaPJs8mGSWYh6nJNXBE4pQhN3UEF+I6GPwPIr4YbGON4loAC7+8wkgHTFNC7PwkZcxcxwjXX4oMoYY4wLQyzMyBIMFED8xLhT0vTEqN3MRkEMwJhkTDmBYS5BQHaE0wUAZA4SoZA4MKcBFj5idLvIIwmGNYEpgwwq2VGOkqLAMdGYcyXWNBg0kBRjKGGAQMkQHLVho0HI6/qWDikS0Za0Bb8CFASZYLIaugCJhQ/AsrW9EQLl7UpfYZ9mvpKJBElFdUcU+3ifDdGyz+7VuVtFkNG5GMSv67//yzNbH2D05DtarrNPDSSWEbZVX1dxdRcXxF//O0xNBKdCpIHvcY3VzaRnN74dq6lRsnD65c9RYXfZUvr8hPM6YGL78X8vXOQVfi05mswV3Vm2itTIvtk/NKbfs2eml92s7uXnenM/Pvsy28nt6z3qsUtsMEVcraGa/8/Co9W9WCjgAJ9rjAfwQYwYgRzM6YLYDCTAscxj9BRMSIBuzAkQVYxBIBPMBSACTCdwNwwH8CwMHcDiDB8wHIwHQFtMKeASgEAkkQCIFwA0wAQGEMAJAHDABQEkwOkAkQjMWjEQDmAwuGMoABAxAcQzDECDCY0AwChwZQUYCf5g4LyJI8wZQeAXEIwaA14EzpdHEDSqEgNCtRowSBZmTRmPCgRGFYAOyVANEg9GQYMFQjZ0X0aEoDA8tXfSxRAmIwDIgUeEgACBn/Y21qKQrmVi4ou3sUbHUu2/v///6u7nIIU1v5itG1qZQGyZeSAhmQ//O0xOlQpDpAHv9S3JOqJExPsoJQUTvIsaussrtzO6dZlrMXaaUklGUjWldSjA/GGb+5yr0jOrZCr2bvOo5nrOwxnr3n+z2upFTLyWe/tTRYQrt4nLSh+ZjENO7m26zHFY9qeWXxKgAL9tjCGDJMDBIA1crXzBPCoOGA580hwNTDcHMMxIB8wKgYjJgB6MEIIYxVz0jE0BaMBAAweU5DAITAhAKSDMFUIowkAAguDmYCAGjGzKqPmDCh4UBAi7Aq+EQPMwlcIDpUJIOLKNhnYfiEJmSJmAQWSjYyKA2lAIEyqGFGGXBC6aePFtjqaatJCHgUNHdEI3XqsOYrBj3oIpAsFHrUcrQOq9I1GuJtinYg61+AKPPUamlswjUNdj+X8///qXtpjYZNZU9xXBSJyYrEuao64cRmJ020G5pUpFZLHQWu2Wzz56ggVUbplTLq//OkxOlKbDJEHvcS3OrRPuXWxZ1whLMRVfilSKNyT979nXXUup9N01nKROeGZs1D8Y7c4oFUXuXeSsJGrYpLEpcwnUayW16U83a74rNdAC//3HhJTFHFtPZFTQxsRPDMHseMD4SwwIB7jJ6ALMBkFsxkxJUlTFjKHMWAEckEwMb4EcIAEMAwAQQACGBaGeYLgAYUAZMLYABVhglA5IyCMFomAVKByTyQWFJlIOiwLFBSCgjwibaHYx0jhY7KJFZffsHB6yh5OFgDggGOiYgBMNkgFUIQaJirSl1VXpKhhMgVGedU77qB52VN8yCISnHHHnK2WPcI82Fq1O4uFDSUmPP/eUvx5aq2tU3Ma8zZlN6PRauAYbSadjsJ8Fqyiznx//O0xNJIdCpIHvcM/SRlHC26iTCDyg46SYJ9Xl2mVy0L0k7WmcvZ0DqbaWGCJJCS/rG60V+kxTFWln+e/8Z5LK2EVTmu+RO4OcraG17AlEm91dkiZ1xeaiY6WhJdAB3+uMG8NQxlDsz8WXAMlwcE1RZDTPKDfMHU0wymgWzBECCMFIhIwGQTTFKP7MT0IEwJiGjCECLBgCRgTgTmAQAMYFAl5glgJmAYDIYaAEZfg3mjS4MlWDEg4E8AN2R0WNJlEHBEPtgRnMqOE3DS5AxwEBpOAsqHwxJxHQpf7KAFCsoMTAGTK2pAIzjTbYbiTB60AYH3HdkS5Ke7M2H9dZMqH5ZL6SURON7/D6ldsry6rV9973f/9jsfQ4tjZdRuqjBaBehIcNFCQyOUPaEwcnkSYYPR5YoaMYOagk8cIqB0UYIIWD6HEMzIJIQconMWVJa6//OkxPNJlDJAHvbQ3C5gqpNGFyUx1w5JSxS8eNIaqZmdVdS24dEchYjGq5ZY5A7NO4anNGFtFIyPRF3F6NKoWpUAK/fYwig2yFOQykJITBjCoNgJLEydQdTCAN6MVYCswOQLTHaHVMCMHIxcjNjGRA4Bg4RjfgygYAIoARSJMFIAoaEzEARhgdgctKMHYIpgYBASMFgAAwJwChZCoHAriAK191eJnCAIbJym2YOuNZRV+YUFLihnFlM1PkIQ0I2Nlgc0BKQeEEJMHBY8OElRQEHWofSeyc6HamfwM+aq7VpA+sZh6eu7/aVokQ1IFAlvj7+1/OTJk5vMZb7jajBUoBrBIiVHe8aEYQ2HaEsTBCIlTmlmEyE0YXEszVhU4vQ///OkxN9FrDpAHvaNEMpTwVlQsga5ItFynI9F2w1K9hiDQ3uaWkcZXmDqo7fjTqBMutJsJ2lzlSfjZvOZluqNyo5T/2XqAD3/uMIIBYxfyQz85QeMf0JQySX1jDZCmMCA6IwHQYTBQALMs0N4wHQUjGFOwMVoFgwXwyjKtAXHgTgQAiAQBTAIEEMDcAowAwKjD9AHKAAjB1B9Z2BASTB8AFAGaAdBKU0KAKAIYEIOtmpgTXRh5CA8QFoOdHBREpRwDuDIGZ+APcCC2nVWKA0gDxobdp/HeiJgwA/sthLi38MMJNA6wrX6Xmsv7//zedfuTf1ICi1m5j3+3Kbd+7pQS/Sc7U1h23lnxKyyRJJq/0KonXJmEMLP79jNFkiBaLbN//O0xNtJNBpAHvbS/UCZxOpI8eSuOwSG18LLu6bHYaiuTIDiNIm8GkKaW9KSVXdT/jm3m7m2le2n4wSUvIb7lLVMW1boG7NNI+rO/n+wQwy78cMwTcQmAC3/2MIcLIxejKz4Ac4MgASMyY09zFqBVMEM6gxTwUTAbCEMtoNIwXgbzGrMpMZoEkwaQrzKhAiDiOBA4JAcxqojLQEMFl02aHkazPxua0CU6YmBZiYFif4GiyZrCJMHBGGCIIlUCmMgcwYxoLBIpF4ShWtmkcHSmWDgNMSAh/QCHHnxQtUNJh/PBcIUS2AMFZZGbMav4VMFmA8GRodqPj61x7DhBgkQPLjcjde1szEhchH93F8noeY04mHLLyBVdnSQbSeQuWymrBUVNSXScwkmpvRFN0VB9VcfYhChofNpOLrPNZOzaZ5BYz3vNDyCpx67k1UFHzD6//OkxPlH3DpAHvcWnJ3b15N7+L+t1Q7Tz8O7s6xCV0EH1ah5j7ORcrS5Zju3Mph9j7evFQA79rTCCElMCFiwzFNtTAfGGNJQqQwyQUDAkQiMyMDcwYwyzKVJjMHEI8xlkmzGZBhJCJTI7CECoAqTBUAEMnsMOfojW5kAkJomq0CpSYVbpE5jA78MdQUZAhnA0lYLJQsLEgqAIVFqshh9bAoOCgoAyldhHmNy6WqUGRAexAWEK4VZmIqqCRKzaiog14WH8NQ5Wu6rTerUyyJ9YandYZ/U3/rtFIbIYkxL+WrZ+a6fXm9QRNH5t9asR4vxdj3deiZt76HJyshcfW0WZfZbtlFDEJ+2pslz0id6tbbSNcsadiP2MiOuMpUxxVb///OkxOxHxDI4HvcYvS9fim+0ivX7uWpNtrB2fltmGcmcdtNeriyDYc3t5qPmaTE47mfRi+5l3Petfr2tv50FZQBfrrTAOAE4wckNpNPdIUDCUQG8xFMLYMFyAHzAOw6AxCsBLMCMApjAKQtAmAazBqg94weECAMA4CiTAZAJwwAQARBQBsW0ACYmE4DmBwkmlwIDQCmVhACEBTBocRpOjD0ADmUBTDUBDBUmllNaDBke4wzBZBUw9G8FDCKiIOgLFwwEp6YpUQjDUB3OMHQVhZACTzkgEI5Yo5KMKNlQAKk1h+VBQfueXzSVMN759bn+qOix+VrDCDI7B5+DZlFjYrStlMnc+CUU48QuVmmVWIObko1KEJ0yltrP2c5JtVi8//O0xOBJxDo4Hv9SvBhDNY0nkEs1dDOE4+XnUnyuV6wvsEeOfdMSXQUtPYSSqcp5O9k9uF1kanOK+ee7TrSdf/xabOepSh6llNymnkG45ndGpQbTAn/++MNkJoxdCtz9WUWMegTcxHGUTEzCRMB8lAzpQHTBtAjMj4d0wKgDDFVMqMR4FwKDDmPACcWZLYrCmeAYtvmDJB3gqmYcGeyoyouA02Ir8yGyHAsxFbSRSPGkVuJEuLnMeWw4fJRwMb58eAaV/H6HQMwkGiZiARPkIFAybyIktWFb2GBIJm43KO9rU/o8IRDZlWlhWoi0oRJRHRKSpgchkjlfHIjbttmC/nBSJu2ZRgUTVvYaeTRkXFmFXOR6nbUaQNtIMXnPGySaCLa6ysEWVij55U1vKp5mxl7xPMyNL7VpXK4Vcah7VXUnKCT62KrEZz8VFVPCHU/8//OkxPxEPCJAHvbSnS9m+SDIwXlSnnmsylVr3fVdS+QKGAJ/9tjALEDMG1UIzd62TChHcM/B6QxXw8jAMF0NI8BEwHgTTOlDIMBsK0xeTSzFyBRMA4IkHLWDQULjl5zCjyBxyJEUYZGbMjSwuKoAMAKooQ5iYQi/gKCCY0ECTYyHw4ityMFgtVYwwbgcJoaIltFna27bbJ6hh4cQDAuKOUt5kRQIJyV0TAi7cat3tfrXV1yk1taw6cra8hLmR7GK5+A6kebJjs+X3KVWeYRvKUV5OmlNKVsnq62UlFz7VFndPFUZx7Gy47K5XRO65+97zljil1jcVr73Xfamt45o7FdbA1R2N7K1jj6PdT2dWYtZ2jrUau9Fet2RTlV15mzW//OkxP5HPDo8HvcYnFepb73y90Ot6MH7Nfn3bO49sF3qddFa7ksTKqbV9+8Df/W0wgQYjFXNPPrl0QxlQhTVrJ4GmKTCLAqNJMBIwEwnjNiFYMDQLsxVjYTFVBjMFQQYylgOwMYJLO8ZfUDUwYSeHvg6NRy5iX8MZxjCRIVwjJMEsBBnJEhQOmY8MTxioUuwy1MFjwQioOdovL3nUdnyACMKB5SqZ9b5QBumPBMTYe7zd1TT85qe5/8HKBYdahqSJtgrZZhMKkskHkieSZPEttTWGE2kN7Mg9IpkrcmIGlkaZuXjLUQng3B+ziw5RJFCWN5NeUMpdhisjGLkP+sbGP8IZOPVhSUsqO1b9Up2u+qXGlPsKq4Tjtzh09hOllrd//OUxPRBw8o8HvbSnX/aVwrF5r+0hNf5jApteaRTakUC//bUwXkC6MHiC8zSehaQwmIHbMHgLtTBawUUwDMEfJimYwHUDdMInC3TAeQAowagOQMG1ASDAUgfowcABvAwWLiIACMOyLBxomB4mmcIQDQBmWQSOGYHlMY0AgYShoLhOLC+YSDakmIA3dV3BoWSoAJgiWZdklCdBNAKaUuYbGE0hoX2dAIKYeUoKAGT3a7L0RG/eErAKil2Fn9c8heQoEvZIywfiiRAEEYjZYKzIFpLqoEi/E+LICpps81lt1NMwywjSoemHYAwiMzkOquK//O0xNBItBI4Hv9Snck14z/ig+ukzc0Z3WlomSmLJUu3nhBczCN2uWam1k4Rhqycrhp1ec3zns6kwpk5Tu57OLltxOcqlJZ0JX7Zhs45Ksv1LKufS6U42ll05zyKFe6VBu+11MHERkwr1qjRnu1MScgQ1uoxjNBEcMFgok08wKjCQCQMVsvowNAPzFzOuMWADYwMSLDCPB9CoAk2ioYBxhguKRJgxo8J1ojDLrA9tAlqZ3mJPmFNzrjBCkPHTBQNs4ZOkTUDBUOUJCWxmoblKBEdCK5i4RYRCTiW2k27CazfTsppJ7DH9//B8RtbORPdNLwbhM7E6WRI8mUYT00iioQRD8jAuw0tc5NqoTLF5hCxFLZGlU8KXkU43r4Gm924GHmyFCuuMr61JvcmdbkyzLZZnbn5JNbu1U5Shd5CV9i7UrUzNqvkywtBQwom2vKL//OkxPBDlDo4HvbSnNOpqNMbmVLZ407FPUZXcZpRu7lGqlFD+slKamTktFUC/a60wL0CEMFfD4TQCyGQwZ0AGMYnGyjDkgKgwKENJMQVAaDAuQBkw3oIrMB+AlzBVw1cwX4BlMBbBuDCSQGEwBsAEMAQACWcmOAeLNYwgQTbAGRpBVIegwaoTPgJMTAU/ICAwqmRRaRAkqgdNlu5hMBFQAGAVYkY8pEgJCW+ju3qvExcgUFBl+V7t9YIgXTJ0QJBbr28+/z97iNKsBI4xLLMW3WpcL6e2d1AYKh4oRvWbLmLabu0MVEbovi+CLa720VlxxyNqKrSM4qk1NAu3DKhFpnHtX+avN20U6vMSSU5HJEnkjtr9HqeNwjVzczk4sQc//OkxPRHU/o4Hv8Svdk82Yp2qm3VRhP3Dbqmp2nWVvlV7H1LJSueVkFI0lXf5ratELA3nyGFVQNvbbDBlQMgwiYK/NVgFfjC3Ah0wPk1/MEwBeTAURDcBD2RgFQE+YnWAeGBMgTpg8AeOYMaAwmANgSgCGsxZCAQGXnMU0gE/GFJR8Q+hAPwacpjf+PB4F2jUtcsAhpRGTBS5S9S+ChQVVNLTw5pIRwIbagQCy5jDRyEGCwG9RfOBkOK32eFAFHn3ooi1yjv43u566uS6AxCRI0SMLErmmULYhicirBZY4hKaToUG6TLkSxHJATrMKffLdVYmuzTfSVPfrrXBt6ya15LbqOIt6zDEjbCj8SUpKlt1esRNZLWvOT4EasNhBS4//OkxOlFZCI0Hv7SnSfmlOWN3sc+R2vsPJaTJzwnArVx93s2lqrwq5MTi7FIdr5c8vcjkJbvZIgw9Q99rtTApEJMNNV4207STFbGUNdpG4zowkjCGRhMoMIAwOgxjOeH2CApDFqNGMVMFQwCxJTKDBMMJgEwsFEczDqGHjQIzoBRbKhKcIzmBliNLcxSCj44RBw6MKlZhlWfoBkBrbMTIMIC44JEvZpCrKGo4yIoH8rIAZFJA3yj0NV7dluBdG/TVbVnm+UaK8uo3YrLprPl3E5efo+oJjB6SN6heSc7M0RI5UobtnvRlmPeSxZVGWPOUWJoQOpMzq4ynrXjktWhc/TDq2E1Vnr7LCe8apNi23TR7R21qVve2kgk6dWzOCyi//OkxOZDjDo4HvcSnGgb+SYwijNim2qd/57OTE0D55JDm0y/aSU+NwnsMWhHZTTqWXXigakqB9uttMJMKYxbUnz//o8McsDA0zZejI8D8ME9RMxJQejCfEHMak2sYB4MU034xdAfjA5IbMWsIYwBwDUN0RjLUsHVJiKEe6HjQEA1JNczw9N1CSxym04xCIgVzXiwNXLPQMfKpGLQQsbFQeFj94AgFpIaqJ3lyuBYTmodkrRkLJ2tn8Wtd1z9/uIwA/Met4QjDk3MSiZ03Jk6XI6Coo6aouKOrx8DXizLQ1eolkzQlIs39NyaToy6ZLSzbMo2ZxV/cQpkjMZaGspZPWbYml1lxtw1PHl/LEb2TS06JpnduYbJvdIwhvRraq92//OkxOpBTDo0HvbMvHDW3tKE5p1WgivY2XlDSp1BCYtBSfdg+WicndULeyyQwVsDEMJsCXzXahAAw1wGjMMpKmzC3gQUwGMV/ME6AGDAtgKYwtsO4MAQAezBUQ/k2qFEwNlU0eH4tyIAeUoCxXoKmBInmdYOIRmYAJjIAGEBDApJzC4WzjgHh4UDDoYF7CoLp4y4SDCMGGYSCQUCEACgfmLCQNX7lx9SYNJ0wJABz4VIokTAhqiZEtVlNp37AqPh6jOTQ/o0hYpso+RrZSuwrJvJo5E/F1eykV/9tbV1nKL3YMvafo19c3Gndt8/WC0rnG33m8T5/LafBpbpaNmvvdatYocgza7O/r2x6umaRU3dq1R7KZdnnenchjzM7eq+//OkxPdFjDowHv9YfPT865Bn0uprfOcW07ZWW/V8UVrzN69bezbNX/u+bReqFvskkMHYUMxLWkjpB1bMcUV41jhuwEzcYWyw5lfBWGEiBEagREZgwASmPAd6YyoKpgzDSmVICUTAmjoF6WJgWACiQQwoEmIAPH9O1EBEAGF+xtooWNo6jZCgQa+AiQIKlryPAKAL6hQvFiEvuNNVORFluUvqtghAaAIHH5lfcEadI5wtJOH3NnItqNRe9YnruN6U73yX5Xbt6vnUhnt6gm5mkbpaituxDGki3c51I+kAck47Tem/TOy02+Rh3svLuCrYxPqIGGuqnOKznj93gba9rN+G5Cfe7a964mXp6Te2rd3ygl11a9mkIQxldFu7bKOo//OkxPNCpDIwHvbM3OtUubHvcRbUPlurcinVjROudJtQi9QUqh99fbB0LIxR0tT5fn+McUD0yEWtjBTB+MDhFMzcANDBCDNNJ0N0wjwqDGKNMMWEFowaASQEsgDgSTAfAYVVMBHgDA4wMQzYgSQpNEA9vTBLQMPBQxCUD5IvHicZMIo0BxgVr/iCA6AQKPxoBkAREgVPCwPrS2JRsoH0PGBwH78UtHDsAo4AABAIEJdsDcuE0NeK2JHUp3hr1aO3ZwvWo9VIAfKitEWFYgVJjZ6JO3FYzqaBpHSbE0BmU5dCmilCC2TPKMXiNtO5HF4QhNhCJSgLoleCMEHIcio0tFNodE00bZFbUqnc2KYmvN61sN3UdTm/H5qnQbCZx145//OkxPtHhCY0HvcSvSZiSrZ04MzjNWdyZtfx/SlkrZ2sSSh9jLfKW1/v/y5/vk2kD/21tMCNAbjBvgTc0ZoI0MJqAnTB2QzcwZIAjMATDDTD0ACYwFADSMLWCSjAbAGgwSEKmMEmAMAQCEGEQAGYkCAI1lxhJ0TFIEKDqAVXhuYJgF1ApCByHOhkkxzDWJvCoNpBvW1FrRlBUJAw4FoGUilkVZ5L1Z0ToBQSQ0+EseOA5RDb8QYwa93HXM+YkBBiropoLABKooiElISDjCgU0giHSMXU4VeWeqDEjC8UhcAWbWMlyB67GLLYgZRuyb1sBGNtkYH6idw0uoguXkqtu3MJRH/d61B3ydeb3OXl9kN10r8ahLxVbMJuZsHtrtHz//OkxPBBFCI4Hv7MnWYutzKleotGPS+xNzN15z7UnRKmahP99dTCkDFMM9CI30YoTEZDcMbYTEwfQAjBOIPM74CQwZwlTADJvMAICIwyydzdRDEd0NsFNOwWHzPjAYvDA6VSoYAC8SMtBGDDAY9BTNMLCs50MAMITBZRa6WAOTAJ6Ez30MQjIeBDCSgSVGVy2GoGaS+UC0MJl95sq/8uyNwQxhkWUpm0LiyjbjDJVCs0yigfpOm3ppQiibJMzcxX4alTdKUgj0SlsntWmFyvgjMzYihyR1mDOVvkm4psqQGdlc2TbM1Iqe92pLtK3KebK+17ml6vMbrcrzrZyhFV7T5Md6soLTTVZgrO3JpyqXjPb1KVbKco3LNxesyO+9z1//OUxP5AxCI8HvcSfQlMwcNYE/+31MEwIow0TrTnFf8MTkLswvxDjB/AhMFIS8z6AFTCOBAMmEh4DA/GIcQ+Yd4H4MFyMNcFFBoaOVhAQcoAxCYG8grBjURCHTDY8aCRR4OibS6hkhkyZJUrA4fWEbqSMLosIHiWQLUzgGep3DrtvRWKlKozviYClbXdT8TIg5QURB0DpWOFUXuIgKmzFqGrsWSHqYHNhcPpTqMnSSJNSBt4TqH9Fubs2cxx2JkNR1/Rzw2qqaC6j16v0WVkmJGh0yRt0ws+LTjfSnQ5RcJnu1NF9cLytrLhqvEZq+9y//OkxN48hAI8HvbMmc7Uc/L/mfc92nKlraue4gsbJPQRF/3ttMAvASDBqAI80QwB+MI4AJTAMATUwEMADMAWAKzElgB4wD8BQMPeA9zAQAJwwOAKsMDvAMjACQQQwgEAnDAcYbBrdzBQSEhMDQqAp8tcy8DUnxEmyI3mGyUdJIYcGjHIBVgbiTAdpJflrRiQbEQOGAIPAmZQD3KOWviRAuZKADMUPJQoVS4CoLjjxRy8cWaUYSCVBKHgQHC4sTYiSeEosUSSa4hoHitDjBo4lyoIjFwb3anloDSgLgbYfjBDH2SFx44tbZSWIp9KSZlh6SlOp1UVZ8wcLqVdKsLLPR6UkjYGETOw6eRVnplHmMto8d2UManmGnV3iuB6KjMx//OUxP9ERDo4Hv8QmHdDflRsWg25ZKWlzIjPOa3k1wnfb7WmF4F6YcJ7xxOvymJCIEYZhPRgeAmGBsIcZ5wCpgABNmY2JOYG4Qxh+jxGHUBYYHIBYCPqDBsxQSYGOoCAQdSTHRB2zRxRc5jRWDncCuZ3K4XHMwHVf0ihboJNxgx8KXAOgUEvGvCjrzyjrdnQYM/WdtRxm3frxbKjv37HN0V1MwCEmrHEygCEkXrXdOaiTudG4RY1657xmaxpcyXELecyLFkvqCg/RXRKyhqO3r+XQuM3lHTZUFxbXt0xRHbPQQik9vLyVAcBnPe6Nj+v//OkxNE8G4o8PvbMnVbVDR6vdpXdtzP4b6ZGoSWO7ScXPFgBCRAx1sWAVZMVV++ssMGYMYw6U1zrzpKMT0SUyOR4TEQBzMDApA0lAUzCCD6Mjot4wTgCzEhL/MQwD8wRxKzIVA0JhGShdqRMJhIeCIlmggY00zEI05jDhSByXMLH06cViISmJzAvyLu0z9jElMGC1lpVAQsD7Efk8xGJe11+HmidPBY6AmWdvzNmliuOO5Vc1uPGhwocHRLTBLMywm1h3ljuYkWPi6DJHagEn2agZK6LJxCYU5kHUdvkSow5Mq8eqQxcojTNtHrLiJRQrE6S+W7/K8v816nlwS1/iHgvHhetq3d4zDC3roxu+O2vjSkbBSp53/3d875wveft//OUxPM/FAo0HvcMnTs9FuXAA/uGwdU363WQwDUBCMIUACDVRARswsAChMGcEvTBgwIUwDoOkMSQAJTAowKswZgNhMAnAVjBUgqs66HTA3/ONmohApgcZOwATiEA0wAAgVhURDOIsLcGA1wY7AhghEHREGNBQCnd+WFqcvAgNnhGBFxxYrC9RQ6mbI/cQksfXK+cQxjlFl1c8TnEUE4nabTETIPkjUB49BcVJWhyS5Ij5A2QsMzd5oT/nJzFTqhiZbdfspOXRt8ijCTT23RX3lkTb0K2skaOxUeVMI0cIlVkMVSfqs9RusjkUzjy0rIk//OkxNlCy/owHv8SfZfb+9rylGacIPWlFL1G45TElLrV4whk4P93HNyOb23SPMw6W7uZDUfX/k3CoGkbpqKKqh/vtrTDGDVMRdBw6Z4dTFvFMMeJIww5QfDBIMsMpoEciEMMwMcwwUwYDCWKIMMcEowGhjTDOBQLumGCMIMGJwwrFEAzQRdw0Yja4Ye5GBBBhbkfqrgIWMkNE+l4sWgBNmbZTXUXHg6mZ/ZuYV1/11NqlXucCZ4R5s0qrU8jwwq1P1UPHFdYKCpVZRqJMrvpLTsTK1IpKkj4FnpGVm1yhlEMogtOMopFJa2lBWOwIFTtRgVxOHyOY7UFop5a/2cE45HG2Fz7LHK3sLKJKbc7y+zGEIF5wpTqQlC9y06jN915//OkxOBALBo4HvbSndw8apTP4bOcdWbT9y9qxhKUYfrbOodec7nHUrlNIUl0zV/99tTAOCUMIM7E3Q32jCjC7MmUVoxlgGzAdMoMZQC8wGQcDMeAJMEwC4xFRgDDYAgEAdJjMATKCmAyAA4YALh4GGS4z0DixnYs8YXDB6IBJqfafF6wUlua3dWqlleA4KOogRadxkXKa8+MkbuumKy7synjjejkJp4HlMxqfv97nR2o/V5du3JZZr6cwLNoHRgUjA0hNbuG4UyzbVLTB3NNsnJyBEZoQmZuKgtG/Q+UTZf751SRSLbel9dEDAZIjb+4J1BjUvCrJXftHMNtGsnXpdQpWUka74W1pvrrdGNc9NlTmZCD9/FevkbWHXbtGPMN//OUxPI+RCI8HvbMvY05+6WBcdUL32tthgKYBQYN8BbGj7BIJhKwFqODRZgLIGCYAWIlGBhAN5gG4F6YZyDumArgDZgb4W2YFkAfjQCCLCdI0SDSrAgJUB4gUKDxpb5qxTIyVTNcAzDIE9ByAQKZkNrXUbUKpnFdkxUph1O1gjpKY5y2uz1Fl2X8kUF2E30ualFafO9LKTdaK9t3EIqLiyatjgogTKkCk9R2kzQUeTsx5CZgnKU9mSqzWQh9p6FJ1XKCcFYN3CHfMtm7b5eWKWjvq1NnyQ/F0fVP0lSUHJ9q+6uxKMGKSycfv7WeEKQ7//OkxNxBZCY0Pv7SnUxGc41CtYvqX1WH9RROj15K+qseSgml7105+87H+V6lUrjKG5Lf+1zwVZvdbJDBCATUwbcW0NAjLfzCewZgxIYS0MLjAgjAehTgwZ8BhMCwBAjBXA4gKgPZgqARWYL6AmmAtAvxhWQCyYiAxlMBp6GGxqUFwKk8zCHHXM5kKIAlXiAAmFCYesKIKHBjUzJ8LbIgWxtdUXMaAceCy2SIKQYmNJO1rVM90otVndFAWlG7UCu2zqMQ7L5VlNU0soQfCi6h8UhwcZVJiFulostY5M7FDV4mjYIDzkCxEyJID6uj8zyyazUkbNTXRymiVrO2V1dUhSpylFulJEla0kaE5rDDKTcWUmSK2qtO6rb1NbVI+Tcl//OkxOlHNDIsHv8SnZfKuGxuMYVi7c5YlblYZPJQjKT47qGeVePmutGC+H5s+VWaV3II56tMxLpRubd3JaNRIaGf/7XUwBwqDB/QfNsuMgwoQcTJTScMYIDowTTUDHvARMHcE0x4iLSECgwVCajCNAqMA4WQw0gRUBhlAi7ByuzsUWmwCQyb5C3ElkkW4wuw9+FMIRS4vOJxNYlkkMC4fzErBYSbffyyvPzek7Y3Xqv1SuWv6ckFearSjdWt0IqJE4ybnMMlorEiZ2b+ik5EWMIUYea6NuM9MM2oYEjj6RRCzHULt9lJq3AzO27QkeI5z1Xyqro5Npo9UkDmZ1O4dVBJWow2pfzh/2cqtkt56lKmansp20SRjNLM2iTKhFO3//OkxN8/VDI4HvaSnWyhBL+S0moTIH5Ol9ml6UsracdvZfNdss+RjDdpOhUe2SNMwOEAqMLgCAjcrBTUw/oERMOVKSzCfAR0wNUX6MVJAxTAigFkxfUIwMB/APzCOwn4weQAUMBTC0DBcQJ8wPA4wnFOMmFwPjRbGBgAjzaqhMjxeTHHhJEjyMMRFOJQ6DBeMPCGVe5BECYjAJVNKkwbG0MAlQIIB12ofpZRL5mLw05V3Vv78MPJDimzxMNjbWIVAkpoIdcXJWz0WWlh8dUgHyhqwscOiEiomjg0iV3bt6+3dyVSk6RpG5FJqBJSB8ZlyI+9dEjUUEkF67vmqIGfbU0dEyHF5HozlOU2obSvaWx0PavdB+xmypGkNZFuqrw2//OkxPRHXDIkHv9SnXdmnxu9jSleUpwq177Gzx9JxVzrwk023mbjcVFEobc5KTjJKMGK1bU46n3H8wbIIxMN3J/jfz0/sxOEIaMjkD5SgtiMCmG8jJnwE0wEsHMMjACbDBFgb8wdca9MGSA+TArQx4xMcCvMrgoxgbBCBzFT8AxuMGJI2QQVBDayHLpGSGoY9A5h66mspsYIEJpc2iwVCoCFhPGwMQoUZYCZENyEMFl1zNtarzSaYsJV1M1lkMxZnlMAQEHCtZI6AXWc9ZzDZ5RWuzZ9zwbSYODk6yRglUSDhgakOzBQLkg+E46h9nng1HbOd6iJch4LFmoYbUvfCXzdiDMnTOPGDuGV1HLBrMNex29R5kMxOO6RFkdFjOLt//OkxOlFHDIYGv8Qnfqhv0kzZdvTUdLrUI7sVEvUcMN5pIiPWJ2a/RZhnMUbNdxKrLXczV3MUNjVAAr//11pgShTGC2gmavMTBhDgqmGKpsYFQJxgXjQAJ0swSwozHpHXMEcD0w8g7zDjADMAEBgmPjJgDgAAnA5gEYFAQEYmMRgd9jGoaWAHSRUKAgEgkoBJWHoHj1utOxIGhCXMIBQCaeXzac6DktxfKmn8LtuIPPNVOQxI56gi/LNb7OFHJqCNRXGk1Xl2tORko+jSCkcYxMow84LQpia0+fNiwSZIm1oIeUWiFMW6QyDoLcqgst9Z7/KfIfL26ys652HtZZcZJadmWQNLNxNOTzs1q7ZM4dGPjKunSg1my2rveqvKdsd//OkxOc/dDo4fvcMvCz1HbCNZVozkGTuZ5XjcqDP0+tnapTxe+1skGgUowhIIKNUKE3zC+AAMw6kPdMKUARzAzQT4xakAPMB2ApjAxQxQdAQzAVg2owHEBgMArBRzCgQEYxUFMVNHOMZQR5lLfBpW0I1ZBZwYyqGCAgrWGCRpYADMyBYlDPS7CBSUBabBhMBStWC/P4VO00Qs1KIkAmqUFm00HOfq3q0t5Txp7xGRhoKScf1AvK2Gy7zV0aDen8SJidaCLayLUk8oVpDQsqJpLu16qIoCqNO6bTmXVcmkt52ifWI+Rss5A4hq4ZVTmbzUPV3YYnTX6xTWmYzhl2zcZUzOrjTE5yTXq4xkl9UldbfdPXpZGpQWazzTevSKiRa//OUxPxC7CIsHv7SnR5ZsNhusv9JqKprzpcYhSp//7WQwkguTFVOSPQt0kxzwYjJOP5MS8C8Qg+mi6A8YPICZlHDtmCQCCYi4XRiDAIGBOLuYfIJReMwIgCZYOArqxiMCkwPQAnfMDUChsKA4MBMMAkBoIIvJgEzASArfvcWlkjttypXDVqxjNnD7vbuONqlX00386B4tQPOI2kZ4h0WwnBzh+wbq0sTKY+vS5YurO4LytibXwEvD/ruRIK9c2tdTJ3zqJr4KO1qs3rsn3wLmrxa1Rv6ct5ehPHZ886tpRI6YrFjvcfXmCEA09yZQxIC//OkxNM/dDo0HvMHdNhQjoyTd83DUlNjnje2cZd4BwnpGSE5KtIzGczPNiqHwWL6aKbItf4dMcoAr79rLDAvDgMFNUE1Ua+jChCxMTpJQxOQOjANHRDpdzAmBrM78I4wTQoQSW6YHQGIUGzMLQFZIUMzRExwEOnCB2bAc1k3CmAxR+DvpBzOzqVvHWkNxJg9PNtLEZdWpTtG6VSzCzv51wG1RGoIjBckcJ2BXoeFDSvi/FydiETJhTvXmmmNidSZAdK3EuSHjLaakGtq0KV60jvoUUNtEJV7LkyNASo2IyWMw1dSsdNPFITrEWrTX7O9A3As9LNThPEk8ZjGl7jJ8J4/MvGV3V1dZg1bU4bNLUMsiveqSQrz66skoT2Pac3B//OkxOg/LDowXvaSlF751taorOacqlcISqp/b37cvkptZQALv/tbYYLICJi9DxH6ojiZDwNRkWiiGLEB4YN5P5nPgmAEIYywhQjA4BXMRoF0oHuMDIRUxpgLBIRHjR2QIlDQkkSJbDZjLyDQ4rltTBic+4SEhEwETbVYBq8GwmGjBBiRRNqLs0teUfWnUI4c7IkJVhSgbphsUqiosURzW0wwi4oUGTRBA5BcQDx1d1uARMPF3CuJKmbdBtRA2p0GF18VRJMLzTgpHFEUsVpuLuggXM1s5qTjKn6+9VglO7nFmGz1nOnFOmcvKczd63i0cls5ydU/a8mIRueMMTuGQlVJJShCGRn7rUpN+v2obeyjPX+OXWSl9+wv3qVxq36q//OUxP4/TDo0fvbSlAANtv9rYYSQU5iomcHp+0aY3oORhWGgmBYAWYCJgJmKgiGCqFKYl5DpgLgIGCATEYD4HRgVAhgpBwaKg6PLwK0KCA4oOMBgQ0yOuOwya2SSj4TVyAoBDy8mhRirODStTz6qMSukrVKtq3NrHSsUuDW0k3ysiOjKkoiibSKKiGyVaOCE0VfyYnI5E9OILMHjcESrzXYQnfOYVRpERG34Z1osTKIs7qyS3i9ldGzFqWtIeSpRbXyzqP0u23KMcVmn51Cr9+bSGM13O/flpXOs3b+TtWr1f3a15Vy3xWjkJZDIsTyX//OUxOM8U7I0fvaSlemdQPHqvnadH/so5KJD6gC++2tkMDkOQwHVFTN7qmMH0RsxTg3jEdALCx45lQgKGDsDMYyZLBgFAmjw+RiFABmAEHkZDQGIsCGHCjMDCSMIORGgGTh7tGVlztpMi0sYWVH0lYcFJswAh0hcZfyGzEh952RDwpANF9Fn+qJrlNZp69SUWGFnONrKJkSRkaFyIPo0IhxFLTJGvW0RSjCaZVAwbs24guUYtoMcgkzFeMdMoVRPJAhTGcW6zpsb4F8igMYljKAj9vmkglFSdOUdO2LvpoK9QlDG3TJU0G3LMWhsJynJ//OkxNQ/jCIwXvbSmbWgQ3DbrLjGVZGHf1N8tZ8Kh4xVrVayNTy6z4n6mrXnOb1Zyz3c71/Fk9UAv/tbZDARwC8wY4J4NB6FizCIgLIwQcIaMBAAZDAMRDMwT8B8EgPY72XExSE0xUp0wBFEwIZI0iFUEAQYDhCqoKCeg+FQEFkDW8YTBPFzA4UCYMguKpkuIyRZcm8kpZfSllQhCKBqAWAWVtmwr4Y2FhZQi6gNlRMhkGJlY68VlTR6qW7GHUEbLqWo7KGNR3UfGyelb3XqPvNQ3rR85ebumTROwrua1dqxz4P2W/aa+A5gn2rrnq5RdK7OvBjWJ8j/a4euXhu890a1tYzfWI6Q7+fDrduYz7RdrMbrtvrPy7Rrr7en7fL///OkxOhBXBIwXv9YXXvkzj0zHW1OvW/Vy//F/utZdjvtWvZSD2qisEMragANv99ZIYWgW5jEmnH5e1aY/4VQjC3MIwCQwEEOTBIBMMBgI8zNQYTBVAKMU4HAPCZgzPGiyasgKgpvAcER4ZDItMygJ5zD4iYUIDYVgQwQPTZAwQhS+h1DtS0b7ykRg1WF82jMoYDK3KpYavHgmkWJGiVfYF1EzggQrFmuRCU+JVUZOwQEaAkPY20gXZbRlckUVSScuZQJdD1RUXcTEg8CSiiM38+0hXWbhKImptG9CtM7bdxi+HQOZyEjOsymulNRFJlRFO5o4f1rfpaVeUZ1PYlZT2HglHw7MNlcLhU49O4MZKc3y2PuE5bOCWyarrbKoM7j//OUxPVARDowfvcSeK/e6zflCsj5e/1O/AAZ/9tZYYF4cRgCJ9mNLTQYCYkIAE9MAQEEwCD8zHEA6MEIKQySBrjBEA8C5QBjASGIZwenGYQBjBwTdsKDoICwwRTBQMhkwsJWGGDyIHEQCEg1MO0KI/LBkAP09KljvQcsaJP3Kc6mqTs/dbS1M7u0sCQKQmVSESzNoHE4YYOqDRdeibWBESCxh6wfOE1OghSQh9WUqK99o3Moaif6tIYJLopCyKUFcJEM0YkURQhWzaQJOUXrcudqrFULVKyX1aLEoIWEtrwqHlDsQyVOdkF+6N5KeqxZ//OkxNdAdDYwfvcSfIUbQQq1WbVhOFwg+TUPc004Rt2My31dQuXktFBG6azYXOf+Lz+Qyd21iUYA///rZDAXA9MXQqw/gF7zH+B2MBUJcwewKDACOlMt4FIwYQkTA/IjMBADww3QxwMPaYH4NRkSgBlYqYWFJhgkkDgAKC4Z2NBMXJHFAw2GLhgKcdCZpJQ7k3B1JMqGrKqaZU5pKL6bKvPRZx56rjMblTxqBZZCIDJKGh9AgcthCjQTNE7JowpAojMNssYcTJSyRojUMsvq0bCPNB03BtEgQKMNISJA2fedbZbhdoX1eZJHK2ErXgvqpvfSC0sTfJvECNOq3zqqctFrYQuUp6szOoScx15TRS8dfBrd20vXjce1vlXnkt1r//OkxOg/vBIwXvbSmVN85ek0o+FRjc0sT/x9MQaTqDkhOdItD/v7bYYVASJiolLHqipKY3oVRhiCyGCqCAYJRX5mNAOGDIBEY3YzhQAUYOBBpjcQmFUqfJBg8CxoaxoQgEaAowFAUuXyMDBt4SEhixBC4dNNiJWNlEgtLhepm/L1Nbc61jj+8cCMBjxLhZHMGhABk0nTkZZE0QKMPYRparNZyR8gbehJiVE3aW2ww7FGXolSzEmCBZpVsbdnZ/ZhD9FX6FvYvrNPRdOe3sKjqkpwQsublPZQqGJTn/GcGshCWzp9NT8H3UGoWfk3iKK88ilT62M9lAqkp45u0t98V/VVX3ZZG9+bieyhcq/Zrm2qwsgXAAn++uthgahcGBMh//OUxPw8A/o0PvcSebmHpGEYHAdJhlhiGFUAqYDRCZnRAUGAuBYZPgU5gMAtGHIG4YYYCw6JmYkoHSD5EirkpdlpC2GBcEGBLSMLVUMQo7PMuUtc6Uy9qEEOFOOlm2FC6SVreeFbBYSim2G+8gDyNAmxLveKSSC7R8grSOTyHdKqkSc04GRQeHyrTC6JqSep2xWbBHrc27RKXVQzPPYxhCTe6xUNiunBNERwpeDlWYZCbjyNHHt/YMOyK7nN+O9zcGqmzvU9bCd9HK3fUoXOKtYxk44klGX7HrHMPv5WLyY118K0Yo9V8q5goZ89CgAA//OUxO87G7Y0fvaSlYvutsjMBBAWTBjg0g0HgcxMIiAgjA2QtMwCAATMAiBnwgo0MAEAmTv9CzD0uDG2djG4UCF0zCQYiQBTBYCFVSABV3gkJjHMAXPMCAlk4WE0MHcGAkZpBGPABCMK7ixrOZHQXp1gS+E8LAyz9sDbyJW/Wo0aINMhUKH1C+E5YeEIlFl4spEofk8lWVhCaNsojQSS0Vndw3NBRCm09qcJNUrWptynUoCPZOgekjVmhOJttSVqaTUVGu5dqc2GSropLwknL+GomU/4Td7+1ilZi8agh2NzuRd0MpiVxS+TuOp3tyjO//OkxOU/09Isnv9SXXLN60Y3U9irGM8hKUtqr/duCNX2PWhickHpagAJv9rbIYSwTZjClGH4ioiZBYQBjTAiGI6BEYPwEIKkFMFoJA75yDGwmN00E2kAxignahknyYDAsMJkJrA0FgprOcCQ5Nl/BJHAkdGTR2saRzU3hS0kAGAAdQNjRVmovGpvuqY+ZWIA+y0QHWycCkbIqeuSsQQ4VH8RHnIWAkjbRFF9NilRt0SRS5SP0kgpenig0peImRql+0VsUr5OiJq5TbRTWxldZ178ncsQJNzd27RwqNKW3udJmGNs5H4yipuSGdN7sVGYR7SkpNVdvrwr+DMnVezjd5VVVQlWpz2N19+L5Ta9Ol6S2U/+71lJrAgHxFUACb/b//OUxPg83BIwfvcSXUkhhAhlGCskuZaEyRgyBimD+XIJB0GBQJ4Ao+TBFBPMLIdUwBwSDCIIHMIMB0wMgjTHwACIgGSEAqHBwA6aJQMzANAOgEAAMyICApCQHwFALMLMAZJtiNHS25p96MmAGVomyIHQaXlCOmDqo8wVIYA2iRauRlQyNEAWHSgiaIliVBItrC2Q1bZtZTnLJNQ7bbDo7RpUmTaTE26xI80Ue28ZUSRqlmVlki19C9mWNSvx1gghsQaI514gZlmamCNH1IzHyRt9jjCkN21AQsFKjl4AjEljoIOg3YGolqTYSO58NnFF//OUxOc81BIwfvJHOS6i9zuspsotkCjiyJUAG//f/WGDOB+YdxJx0kKFmKkCUYmowZhcAGigzxmTAPlYIB5GCGKycaIiRo8EGJCcA3KTAhKeCioAmSCIJgoyQkQgyVDBIIgAIhSYSED6vRVypa7sxEDAGclzqOVhHpRH9VxCwyUWa6poPoSUlZtzRBKqQoTbDi506kgZJlESrUp5sFU2DMYOtrNOlmo9JW24ojKcGxs/Rs7E67fCas4qpIllysT7Dujpvag3iLZLtl1HdNJE2vFoxU68KTkxSVwV1WeJ4gLz2shquU+vDJ/GPdW/FryC//OkxNY7I6I4fvcSXZtJSXyqThH23pqaaty0kPNz8tQYfDcVBAAn+21thgGBBmMCRQfdKIZkHggGM0SmYiIDpgxF0GcQBOVQWDKKAvMDAGIwxx0DRgSCkeOwC8WABZ6DC64sAUMBJewcIgquQwGNiIuAIABlNTxUzoss60/MLIpbLHZDCaS1yz4InmUkZMgIxAIy98VIiLWDRPKaFEsfgLth9ckXazJqIFCdrVagpJHu4wkSwQmFknSX6MwdKFGEmlcZpuSN8yY6rFa5bFlmXnifGVlVEkLcmuVfvOZk9YpzbKkE/Lb2PTbjNXXamlLEDEMn8IG7i2zk4S26qGnoMnZIVW2FJ19YgnCFzi6G4kju8286ZFyXTyhFAAt9skbR//OUxPw9c8oxHvcSeYpomhhXNLmxVtEYVgl5iLJbBgw5glKVGiUEeIQmzMrGHMFECwxTyZzEABLMAciYwdgdRwIZAi14VfqBiCgbIm+gBRN6Z9KGmB3gYWmvJJGLVrMqe6CGp2ZCCorHidhOCzQmaWbIVxoSg8Arc1sMBFGKyBMmTWD8pJH0+lCka6MNit7KkoVDFWKVUWqM3DssWuWUUbebQLW9uQhb1YnOLKMG0KIkw2zFErXxWbMUcratVglgjkMLFmUtyT3Zs5+CzbcpwgrCK3TVkpkl+hU6kaW2WQlS2Xs05yrxtjyxSko0vU68//OUxOk9q9YkfvaSkb3e1lWmJJ4t09JNftrSADv920kZhtg8mKccQfDD3ZjpBrGROEQDipDAZQ4MkYE0wPAgDgncGAOaM5Zq0bhe+HNSSX+GgnDRgIBjQTGRYZFAsPBQKrJEJhIhiXSJrklE3KXWYIXzpYpYF1u1rGFzIYWMY0V5XIQnrVtl0KHx6WdhbSquvEvyJ6j50XPRp40uHfUxjlJyfQM3qp1fWOUyda4/raxpIiYabSFZ3WDXorIUtnDCzO21ubvRqjFGrNtwe9HS89m3lm8DH1Zu+9br49DatL2rGzvuxrci3tpZqLIt2Nye//OkxNU8Y+IsfvcYVX9x2kovtffvOT0E/nV6+z/Ze/wSMUcXII5jGqVaAC2//ssZgcg3mLiOMfXpsYkfGYaBk5gvgjmA8fMYVQHZgbgVnFMuYJGxlzaGhw0YLWR7kGkwHIgq9IUEzTlAyhbvcMgx/zABVSrKg7MCixurs3cpb8vjFfDBs8vr8jM5ZzVDbLKEigRK0QMsgQogXJ0BEGCdkkHiU7AYtCtIrFY1JQXHLVJY+VqutRqTbBIvVkdIhmK4mXpJul2U88LcfhB8Ctznrvl/H18xmPqq2lMlUZvgx8U2ZlZhdDroMdva2ajR4rBPJSnPfk5W6XlcYx6/fHIbNqdeKUUsX5yjXBSfwIP0jZ5/71JVAAGN/trbDD3DGMIR//OUxPY6S5IwfvcSXQ5NT6NIwlAxzFQHUMN8BUQH4GH2DWEBAGQOH4EAdGHWKoasCRjMan0wERBtpTvgUJCQQEYlAROd8KAmNgAOhhLBgLCJgrS1qld+zWt1lLHYnWDOG0+BZiv17zsrUeceSj+LmiMmOHFN3FJ415zBLzF+SIhWZN8mU2XMJT19iJqFluinl94amkxxpMepT8irV4xafWPLYz7EONIyvPqbFZW++67nL4W2GYO/IXJXc1Rfa+KMh6jFv+kMPb/xzCs+Ozr677ue+y3WDYOfv222ae01bco50sW3llbc+zze33I7TlPx//OUxO8/lDownvcYeOzctWv/SmuTk7m65HNd6BUEAHf3a2yGFuDWYgxnR2pOCmMQGgYtZCxhiAdGBydAY+4EJgRgmGRsBgYGQJphbjhmD4AyYE4dZi1gTA5tBBBYzKNAFiUBmS0VCeoRMDcRUsPKuAG51Hh7JKSuBQG1mGoT8xXkNuZpy4pNJztIVsvlAnmZNoEIrfCMoTX7SdziuvhKTTXVxJYs6CGkbETCTQxS7c1HZcF0iZTYybYqlqPJdWaCEHbT04TVo++tRss4s5ZqTMFak1Ly+eVdz2V8gkgYtpjGnyUc6ZWU3KpH8vM3Njn///OkxNM80/oxHvZSldypTpTJbvalr+mnD3JvcuGzjXycLfK4RhBMCTzBki/Z1QAgAPvr9rIYEILZi2i0HzeVaHHXGAiTeYKwH4NNMMuMDkwFwZz0cpMejk09EwyrhSgmjRsOgMs+14GCVWNE0SVixCys+QkgHBYEhQ0KC17OTCnxfOb7iqq8u3Nh2K0z/SOI3yFc6syS3KZQTYCTicuID7zD9YqNNLrbBGpLfFu0vHF7fjb2O0Ki5EDJdIzNtpKayaEhT0y02l5pSPQRrQTiV6RMSuKrECPFOUSqLCyKs2LS82bVTRKs02y3O5eLKJmk1pwj1lvBnrNujeVP5kpfY+E4XW1kG98FbWneXe7u/Y7kc++O6qxY4MH4EnQ0jKoE//OUxPI8O+oxvvcSXQAt+vtkZh6iAGGYlSbd0uxhmCFmKICCYYIKJgQmaGgaCKYIAORgvDdAEDEwOiEDBpAwMAYW8w0ARDAA1HGVmEIDw8URHCCxJeUSHZg8sHVJ6UzL0eKNR1zpaqylw1XbFhPNCbQOEqUVm111C5OOqF1AwOnZki6LohCwYUiTJEOSYILnquoPXRyvcIUlV3CRpyg4KjQeTkIQvK1qRE25l2dXTOqlGaeT/F29TS0ww2pIpCBSn4oqzMswcgWtH52rs4J+ezvxiywnSs4yQNUtb9YlGSKrjOLmNj6lCE43Ve5LsQqm//OUxOQ97AotHvaSkZqGfXeOZUU+nWf7/UJYrSlaS7bdACAA2//2spgvg9mFwXIcgDGJiJBfGEuNoYDgGxgejgETbZgpgRnIpiYSE5r1XGkgMFlydCCgcCWuMfGREzQhDgKAcqHADSICigghQJmUgg6qhspuvfJHj5hjgOkSiNkm1BEP3WSUaE2lIMRDLy+sDZlgOURrlkayKMpzxCWkXejHpkjSNE0jivaySxecMNyJMX1nWpLTJmorug+BfooSUgwYIZUgmjbQSUL1PrmsuFbORqkS59likmPcNk1uKX/TWLuW6tKyxBHZ19uCz4uh//OkxM88dDI1vvcSWXKXzMheTrK+X5Ze7txrIe9U8o9Sb24ZGV7kJ6w6DlXIO3QlAAt+3tkYIAUzBjwTg0AMIlMIRABDAWwUEOAzTAIQWIxNUAfMAUAGzmUujCclTEmCTDwLTBgByt8hYCESogWvGgZEIFDxXs2IQCkxgCF5MGIgBwx0BNii+JFJWLRBr064dqxwMEqYlRwcy0hLzKGZiVouiJViB4CmltgkToTjZ49MlXNvVTLvaaS9IUJhZogOKpEjLJpoakm2IgGifhrD7ilikaFeMZMqyKcShBlhCU62pQi0nNh5F5XFKalZDU2JQhDdQzZy9nONatFNbZMSQzVR5CXqOSmnnj5rSgytKdQ68GHt5To+oeEvbGVGUPmf//OUxPA+nAosfv9SWX36le/ybtxeHKCqAAm/+1shhrhpGGYi6b3kfRh5B+mEoHeYDoHIkEGBptjATBmMlgKAwHgeTDaCJNkgsxY0D2QhDAonqvAZHLpiEIgpNLTLcs9EZJe4LigyGHWVTOeTF4bhywySe1Ij0rOCjSSQEsjrBA9nhQTnm1CwhbegFIlKxBg2Fm5B4dcRkSs6ezODLDKFiyNyxgkYWNXB6K7Vc+Bg6lBcnHJotNETXnAhInnOhG9IRl8buC7HhlXClFyFm0QrtC9JhOaNHCCWROkj0OfV8fNib2UlnwgkUQsVCsryp96///OkxNg+jDIsfvcSdW3M42hnHzvy6ewkxmyffr5BAziCrhsMjc53BmW/PKtlJHNVADAA//21sZgag0mF8aIcnDiZiRBbGCWHkFQKDBPFNNB0BwwQwczo9bMHhkxRvDEISMCRY2oMTCAGHg0+oQBR4JCIRofN1Tej4IEI8EwuBzMoAbZOHWTbY3M1jTlZgMoUILjQOizlTASg+h0VgEJhFpKRELjA0WQoWwXIKKgwb6rc12ERAzLwIGqP7i62CNgq2kdKPu4H5KJSuBBqMlTRqqNzTiWLk6yavVVUTlX3GVkp5c7PwV09CLEOlBFkISM3U0Un31WZrJqqyRykvO162WeTHudXrrT3NqoVP3m/7cY4ykwxGOXoTqO57+iWb6o6//OUxPA8M5oxvvcSWZUAMAHf/7W2GBcB6YkIQx3+homMKAQYBwKKNxgFjjmbCAEYEwHRlekGDieaJGAOjJgeDGPRWWaEgQ1URCBkwoBRYsRtquKSA8ExwNmFAdLGh7dKnsV6drs53BM9N9NmE5EpKsRKph5BIRgUh0+49bBO56ME8YITwrEwjaNsk5NJpZNCgmIn0UPLRTyrVijjLFrJveQSSisrHqkC3dVRx8U3HpL/7G3MXGN2pFZvZeu5OWTro8hiJ6sVrvPF8Y1V9f7OMPCSuwjGW5ieOyOZmznC0811TtjMlGX95T9g1eJufWn9//OUxOI5o7o1vvcSWY3zAe61BAG++1lkZhRhkGHEhCcPUPRiKBwmBkB8YDwA5gdmImeOCEYMIB5juCkmBIDaYFA8ZgAAZmAmIsYrIFoOAWVzaAoBg0AIhMDgkWkpPNEIALiIBJTQFBsrUdmbfZeEqZVSw1Ukb47Eo6P1+xplcBrJeiZFliErUJTCVC94uWgjqxX2iuiPWltKRAQtqUcp6SRs9R77CCpSc3nWcTQtog/Xn01qUzwmyN3DwBNegEgBp1YKMPKpEalp3No0pNlZyiiL4umOMb4yVPQVsL3MQq99t4l8IyjFbrXux6rJ2+7+//OUxN47w+ItHvMNLeZzZ1n/zu/x0z+LBTf2jWOWBAC/+1ksZgPhImGUescq0DJiXBwGFCBgYJgGhgcnXmYiCEYAAKZk2gSGBaBeYfABxQLeYAIMAYceRPKUOkCb0KSSAxg4cUNdAK3M8HYjHZgJ0sHQX5LoryZ3xqeFJalNyAXnQqiUewMogbBOwoCCFAs5VCiLnUzZR/WfBEeIRdHZhdZpJeq5dqzjKalzZi47ZNLFrMyWalLz3xQvxBazSSvr1copmcl1tf+3qKfTuL01p69e7ySzGeaN1oFUTmGuxHbT1qOJRk+G5OMdqqraljuz//OkxNI7Q8otHvZSlXVpximnt4999vdtupfc9tbIH9TDPei7wIcCjwQA9v7rI2YLwF5i7glH4mBMY84ApgxCdhAWQWP7Mi8EowBgZDIQEAAQPJgIDrGAYBIYDIQZjTgHCQCaCtABAIR4AchASAwKb3LK2FwChoBxoQsHExZW+mZk2sjpZhLx/JMMS0L1S6A7jMzOFEuLzBKUuHdj91ocTp0wF0J0usRKq7HUvICAZ0a5frVH4EKViyzvLWVEBqlKsO1v+ezA/kCxxuqdyFyiSC0twoWuUgem/zr1o0bM5+319u1o/eYm1Vg2gbIiJ1YxRqyBgxqJPCw2X3OzNTn6m7dU5+5TzOQtumcmdtMmL89Xwl4Giwr9ACAK//+tkhg2//OUxPg7xBotHvMHPYURhmGrm/c28YgAUJg5BvFAIxgBnMmGWBkYHIMphfi0uSYNYK4mQGJ8p+ZEYSAydRcECw0BOWPNUdZvGR0BHiUkKRCRL5SKqzVHYdioFQPt9pkFQ2+9qbp7C6waHSqIGcBHFWiBIrI0ZRidYjZYVAINEU3iZfNW1QYc22yekUSJHtT3E0ELOMwTbyRCkwnF6qjNzlKbcVr7Vy1lFvYuSklIberz68+5OCbOQjFtLPPzk2rt29jd8sSZ+7PN7eVs1MZ2Fb7/S2KU8+eUOzJip3eXX3HwhJPM87+zvqVP+tqopfel//OUxOw77DoxvvbSeC2d99IAMAA4/u1tkMBAJcwpDyjgogbMRIN4w2xBDCMBABKGJhkAmGBwBUcvyggDpnDYmHwiIJmYRFwjCKnDExUVJIEIXAwiZ+sFsqClClMEObigr2ymmeyS34fBwEU3jlE0V9HgZUyahmQRJioeiiJBLObCuwRi4pehq8Tn00osTpAymgGmBDLrKTT4fl0CkUFWLRaWn0Lm6aQkG4yMVPJmmG2Yw6qUDsa0lTizKet/HsXj0svbhtYtFjUCJ/YqCjFInwVzEOtt2sgxCgxIgUUvfv2OKZVTzPUvC+5Jq4MXqdSg//OkxN89RCIt3vcSXfk6U53mxZyTXvfkYZkn7mWhgo+oE8IEAL3/axtmA6AFZgy4CSaECCqGEVgGZgBQSKYA2AEmAYCQ5hHQDEDgF46MQ8wmDYz8KIy/A4wiT00WDQwIANNqAjAcAxoHRwEwMHjDWivqVQpKAbIQoMKgdfRsfbVJuI4OE72wAJlh8FRo1jEGWsXicE5sEAoE/3iJAJIIyE6C5ARipghRRPMJwTiaXjO5IotLG4pkaypo1ZaSMyZabS1CqH3wkpBDghehnCTChUq8wo+JmTXVZdVJr1OWLIv0/kPs8q57DbvLu2/LwnBe/OXbi3KUkqvZ3qlS/nU5+epXsm7+KW3uPnJOGRm2zGWRXzYR35cF8S8+h/SS1QQA//OUxP0+m/opHv9SWRo/+2skMEELYw3DJzg6ZgMPIKswzgXgMIeYCBjZk/ALGAcCWZCYLZgQgnDAqRgMAMGAYEKYpQBRMArDRdwqARv/gUAmRV6KN6SIBoLgBAIJtzl/T2yAOa9BIpy8BQyf4dh4GYNjwUN3dORmsTHRIXRHvK5aIr8ViwhQmpwgnx648tDnIED4NiXJ45JBMoZU2YTLCyiUweYaW9ImFYktk9vlkzU03kihkE0cLs+dOnfrkkNJFxMFoHvpUt5rWMRiiifjtvRbLd0ua87W9s2G8vl5Oz/EXZVbd1FfWtVNlF5u8qrR//OUxOU8BCYxPvMNEfnh21sztNZknVGwAAEAAaP/9rbDAwCHME4uA1cGHTCYC2MHcZIwQgQDAMJhMrwCYwFAUDnUMMUBQyugzNABAgkA5dMIAYEgdfSKKWYoAhIEyx7qALAhTkhBpikCPuzTmp2Yf13ZLUlUDQRP0Lx2ZXRICQxY3h9VZCjQMUSC+3ZIdrSN0ERMNno4uUqJRGksjZs2qwxZhlDbUoQVlUeTyJ7ei2EV4oF5M2yqzkcNwQRVUnSmdLWujy50lkovtmUcZu5zzqxmxFKa9Mfblcql4TuWw3oslHxyN1s7dVT8Iu6dTRQt//OkxNg8FCI2fvcSXC2erLdz/H7617c9u9utqEo/MntT343JhZUAIATfXa2RmB0B2YqYT57qj5GOWCiYR44pguAMmB0TGaBwEhgXgumFtaFSMZwt5kUNmFGscmE4QFEI39EAgRjLAKCAnL3ShgsCB7BAETHwGazFLGb5TOdyQamBkUI3jhgRWhIiUNhRsCyGKJdOdi6aNkwhYSQNWohtGwtqzDaIgqKMmkTFJptweXWU213pESGUE6k5Z8iic0OPUX2UmO418tzCxM2nrGzVgQxhRCvLMg7Ff4n0T22+krs/eQ2DpyyeMtes89nGTUFp3rSnYSQ31usnfyCpTFvJVvcuE33f6qt5V+crb1cxHVMq1QAgBdv/7JGYSIYhh/G1//OUxPo606ItvvcSWZzhNmGJYGCYdAk5hQgfmCAL6AorTBiAgPg2gw+XjTzGEocYAhxlIVl1C9TVAKFiYA2iYtwa28cEIKSYEQIMjAF7XT5dld6G6d0pXZRJBxoCGUYjnUZxOmy5whPkC83CnT0CMPEr03kQXNl2xSPyWJdGkUYtF1dZBcUIA4SmLl1lWkJ5cbfO6bRNTtbJ7etqzu1TkHNMLPiQvuFyfS0NS3KSguldRmpPbe6cZK1eQS1OKCdKxns6Yty0cjkITd4azuSxrFayONXOc29pfIUu1CDq3HMBqY134+imwCWoj/ClAAFA//OUxPE7Y7ItvvcSWRNvvpG2YKwRZgzIVG19HaYbwjBgOFTGAyDAYGgT5qPASGAyBYZZwPZgjBFGDaLwYLABBgDiQGGKBiAgRkfEVAqAaNACCoBYcBc5USf9W8SAIEYDhgXgGyNiGWrInohPgW3hAsV8O6GDSGflJPyZeWUxYZ9Wdrj5Yc8oal9YdtmjVFUolZZE0qGKDe7R+X10J62OrTTdG75dmr75wuawtK2+X8hid26BIlrnGY1J0e9EqMkKr9brdkwqyC0+mZNsjjWlVXVxdYneTORH+d/RmbXM99PIpN5pnwCcp5c+Inc8NsVU//OUxOY9G7oqXvMNGSRmNQlrSx4kQ0Lq2q7iigAgBd/trHIYQwDpiah+np2UIY0IGph5hLmEoASYHAfhouAPgAF8yNw6zApBUMHcN8wdAATAXCeMTcA8SAeQVXIVAG50lALQMkbz0YVALSZVXBwR0HrV1jiwmD6xOVacN5BQaRCckQC9cVD4oMMhYQkTK6Jtdt+kqWOMtKFmFHbU1jMDVCVAHy1sk8Tz4CSySKyRDQYMmAaxM1VFG3M43iDCFIm0WUxZR5sq+0Xe3aDVF1qbEj1qrYy27/vH7FZvK+nRsms9+6R3fMeX3dbnGnoO1tOn//OkxNQ7jCItvvJNFTSLIQ8FMyLwoteZaM8qNZjcpnx4hqajK2mL1QQBP9trZGYQ4QRiIGAnP0xoYpwaJg+D1mB6CiYFQ8xoOAVmCYEMcQ1xgYVGNI+ZBBosEiljhwGWLKy1Jb9hZMQWGKUP2KBNrJAEzBQKqrj3lGbuVqWVPtvLK5Xl9efRlTApKv4jQHyTTBaLJySQ8FKDqJAKo4iDPiixUdiyzRko3k5TcQnif09nUiNutamXXciWuaVQ1O4sLYjLTUKFm4H1Ep3FJKkS05naniH3CKWKsa2p6ipU4Jzjt2wh2Vyaf5ZDY5qX7Ts35Cdzla8kvtXG4T/8ajXzfn25+N5NqS4IyDgwC74+Q+BWAAEAASN9bZIzA+B5MCo6//OUxPg6O8otHvcSXWNNJ7Ex8PIygaQx9CYwun4+sAUw9Ec0QasLjUYhGgYxgYBShNJwQCAzi9kkBBbyHAIB2UF67CBEeAeECxGwmCsM3G8K9EoDwLgaXJQZPjZ0+ugWJKBRgmHKksUD5UmieppBKKx+CRw/FGxGMlkaLNztyag9OS7KlMbm7bLthKbDV2hUPGi5MjZUaZfiuqV1mdhvkhjLfVSuDTfuS/xWMTWrfF88d8pNxjCbOwlmpX0ov2m67MXwZuqzsQbV122x2J+7h2Q8mDaQXQ7rGVjpuck/HIC1ACAF93tkbZhxAZGKqLKf//OUxPI4u5IufvdSHSmaUY5IF5hmiFGEEAaYGByRm4AygoMwyixNDA5BSMJESYwXAHDADETMJ8DABAJwC74zCQiMgYNkSPjSF9C4hmAq+ClIyy3EYBe+tBsTryZwLETi9qUXJmlwlmp3G3bhMplGMjh2pj3lPYjVyNu3RU0olk1XjcoCHP+Jy6NCWSMKhlgyCB5FyJEzTyQzKOydWsqWIbE9c6lZLWLaDLST+FSbRmqPadlj7vzg9nq1R8j7lbrW7ZjELW922pYvb/LlrjWuGzazmfPR5WnsVKfbqu+X8jdLNPxvgzsujOysBMoAAQAB//OUxPI7a9opvvYMvWN9vbZDBgBeMNgoU4zk6jEUB/MC8YMwJAORGYgZAAGYhBUMioEwwIgADB9C/DgoRUMkwWAHB0mWjQbPygFoxQ0/Sm9MSlMWfofvfp3+/Es7M/+qslhqRxiPUzlQLdvSid+R25dHJuVSm3JKluZlUv4dmrZKSl4RWSVayHqkkBNAZ+pBJ5CrGCp0IBEywCONTRTduWbMLjnas8cFzYHkYhJUGsHjCELUkNQKIe9x3Y0gdOX+jNuSLmyfm8BnN6CM+f0nQTnMvR3JxbKrXxnf34iTd+IF1tV5XprNLz7lszfltszl//OUxOc7NCoyfvZMnTvd0VqIHgQBb9bbZGYDwXJgmH6GiJD2YJwcBhtBHGEiAkAEIjF+A9MCMI8yBxlTBHAYMCgQ8HBdmAsF6YlQCQQzBUYKsNOqmHPMyaDHh1BLAkVMU6AWtb+OtNkkMt2ykwlE1RFTY8gZHx4nTLYmsSqamIUYGQQISqbOEvK0ffTD+RNionRSmOKtDZ+PgZNbJe1JwQKVEpBnSDKm0pclEVsl14ohdlRH4xRQTtlZd0V011unCZSKwfx8JyRzmRJUxNpPr2lPWEW3GSuJJ5aeuRIrg5ArWJKO7fvtQ9Z1l0sUzbZt//OkxN09PCopHvZSkdjmj0vNjZ1eTy7y4R2eTq6jvhuy37rptwQA/vdbI2YTgCxirjHntGeIY4oEZgVixIOmAIh0YEYLJg1BEGAAQEhGYBghBgsgEGAoA+PFsDwDpZ9XJf1HIgABLoVU16yfxEAijyEBENRW5S331ULxXZ4jE0SVI8DsaEe5YdcjdTFYfzJeJsZsGKkvHA0rbvr17iZ1aerDN2Js3udDwdrlOHJ+pVsy4/ei08Y6LTYoySmPl9tCy1qTROwosWakX6UGRQP0o8w6CwyCd4dfwwnblPBvqEZL8lxcXZrS1wUjWMfEL52M0xUZRb331qU3xonsrmNFT53DNzMjtDUW/ovHlp07v2dzxfiFADABeP//9bDAWB4M//OUxPs7pCIpHvMNFTGHvN8w/gz8HUxdK0xECMwVsIzzB8w7Ac1WRcWAAxlIwIGQLCYBmdKAFLawGIgGgaUjQEwcrZI1M2gFQDDBAA4g7fOGhddQIJEhcHAiD5EsWJFHK0RoIxH5wDTxSQkyNzw/g4mTidfERUmttlfAPZPHCeS3Lp5FgleoUQtJr9xpqLBJNyNAW4pRE+xdFGnCxZdttx4lVVklCcm45KSqt9Cm6DTsgjUQdZJuqhHE19qEe3so4rFPzpZmd6s0+dVsps+UF2dyr8cQaUryWlt/xbnLbuMfHL3b86j/f9+XuUepnVwA//OUxO87hBo13vdSHQEAF/u10kZhuBZmAIcQZVDmZhcVRjwKZEIxg3pxxyHpgsGJz2OhhiGZjKa5hsB4wYhksDpgEATvhUACUEmOJ6EQOvImHYHQFjaIQGFeFutf0QEsJCZiw8GQAilInBMgHxMDDCiyQrB6y5VttZ2quJ0cyTkrzpcftmZQjQuPIyONqJPNwiQoJqyk3NDaz549l+XhtiRSbMD6baEqqGmFCqbEFZNqQmtO3S8Z36nHcjOCUCD7K+tF3rvvfLISyUau2cyWeEXL1V4/Z+GMPY96rGUvKH+2qzOORn7kcGMYYwMom15l//OUxOQ5w4ouXvdSHV93wwAwBt9ttJIYGwDhh6i9nPOY8YnIHpgIBDAIDsAlEGUOAqOAzGPkGcYCwIpgJA9mahJJaGQi4XBlJNGC4ClaWABQN2i/FKSA8Bofgomh91P1D9I+M5AsUiNPcjdNT26HVaXxSLQmevy/FZ6YNYlBAOQBKJaSDiIOocJIkTSrww4se4TVFk1IpmJOUYfC0fzTydXeEOSQgS2oJ48OgaZKLFsVLZeJa+v+xRb1f07clKN3EXuTmjfWzWd+d9zPD8+o/Tjf+zVHz94rF5mN67tERWZrNLmvLGNlR9dXFV03dhzN//OUxOA4G+4xvvbMfUoAAUABY/12skKoNxiDEsnRgksarDyYyguYdAmYiy8ergqYljyaHtGYSguYGGsAhaC5NGZoEjwZEAJkwCjoKtnbkHBu9BfNw1sqTHABCA8lkTw6eJcOGkTCoVAoEDwOiU4DaImFBRRCSxHAqoQDx0hJ5ISiVrkAk2EkDekgfkQrUgMD6JnE62speKPVtLIZOLMjfU+kNw1ZdtCiEa92mn1b2ZZDBda+XUPLLyWcvtvnsFirU968KQQytS6iUJTYa/2SWLIfP7Ps/H5dx2EPLK2198ksWTy7yUUlNWy2ZSZu9ufz//OUxOI8dCoufvdSHeJJp5sM8Yyz+vNrVZSUD2YAMAb/7fXWGEcCeVChjEaVdMGB4DgBBgEGDafHaYCmEgWGY6dEocmJotEw0GA4PBzJkwHImsna6pJeI8CUWWpEnAXGwgIB2o93eqCiNGJkRZATpoRSMMCcqqafaRkMaqSVao+WQRVqMmkLEFHOjL3I3k4oLUXg+WKoCNotZhEl2VtNKCJVSCRSac6SmfYyLMtapJjdUIIQqaU45vhXVjF802qUxWvtqxtmTFsk2Mc1SGB1Wa/xWLUpT7lJ43KKc9hXykoNVNOU8uqZi50l8fPDaLSW//OUxNM3U5o1vvdSHZPFlNxP+/9ifmgqBAG/v1skhhkADmHeNSdT56BitgjkADIYAeYDoawKemAQSxkUCAmBECyYFIaJgSABmAeCKBh+hYAtcDRxgBqnKoBrDqdtoeIQDGpofAIDOLPJrZUEsqlhWVGh8ucNIC82Wq6GAoP1podM3XSeJneSNtqhIjUlCuokdNgoW9BIiDcGHESGKROh1MugJ0Ruko5yF7Jxc2GNi4aumxTG2g523ZUHdCen9prmPdWV87+4Vd1eZkzdG+ol9sqoRN1CrQxZZdMi867TfbcY6mPxOaf1repYHiMtrZCU//OUxNg5RCItHvMNEbYf+7f03/Ogr9G1C5IAAQAb//7XSGBmDoYYg5JxtHNGJICyYCIEaZJhmIoPqcRiacJiKYXh2YmB2TDuOkSZCgUztVwcAZe5MxN8mBSlTE2MgMuxiYODqGpbl2XsulUpgSzlg6mS7JMERSyPuIAPcSUio0+BVB0my42cDyKSi6FglRqVxDqAlMoFx14hEKNRCT59Q7DrStVyjotM67UWIuqsQ62rHyXbnGEYrAbzPrsRnccqjXUm3Tn0Zkt223ketrkVpUnCCqC2mJqoIKnRySjlW5qT7U4ff456+RqKc41/uTtu//OkxNY7bCoyXvdSPd2qvllXt7lQ9s/5LI/Y1K/LJRrKm5QmrQABABt9tdpIYSQTohMsMDps0wLLwwiKIEBYYYqufRhEYDDQbVKEYWCSYEGMYCgESluYBA0FAHnvCoEpcrsCAtbkXXfhVYrAIsACCgUjLFvrDSyV0pPMz+pdQUL8TnpKXNjepWOGVyNOy6tWafqnyxXIWzh4vnK6hmpswdOZG3l7RKCn5Ujr7DOPwvWevL8LzKdpuLYvPocPYI3brE69av4wcWPrzhDOV7Y8H11ifGLXcX2suUpTtr/tC/WVjPR3/cp1asRXhWZNax71ZvkGbBDHEtteZYzavtQ/Z3J2ONiYnFi/Hr5TGLTlq+5f61if91zZenmpttqTOfGu//OUxPs+vDIuXvdYHQAwAFj7bW2QwvgTDDlHTOflAgxSQWzAtAvDAOTAdHxM0kB4wUQYyqNGQgWmA6AsGA0AwJUwpAFAUAymzGhgBGB0phYAWQNWdoVABR8SMEgVX5lGPpHTq5wecehqWlIoXCG+zYmL6IiWTVKlCVuo69qESp9bzzUuesOmGjLakyiolKvZXMOdE6ZoQx0SN1O9fIJjy9lVomYUWBHzEmypOu6arMo7TUnPTKo29tOkEnIj6CzG3t8O3Zhz0yiCKPlUDPIk0HIoJycyANWtlfDcQ7uqqet+W5ks0pdVKMx8vJZAxmX3//OUxOM71Dot3vMNFMR0pGK+Ib2mHff3OeoAAQAb7fa2RmBUA4YeA+Z0GHSGJ4CuFA0QSAOYFpOJlmgCGBkAQY0YphgEghmA4FWghMAADUOHUIgRC7y2kFELiUAAOAPg156ElAPd8qgDIZxx+ecLA8ryoBde4Slr5i0IZsx9V67yo5AWOOzw3zrpHWDErXVokROP0684LpqnIy8yCAbMZSmDGFE0LTEqg5+ayRciIffyujlvg46iJJhybPcIOViDe8dG0UzChUHlpSa85BghVI/v7TtiCUPH7V9TiYLqq/1011998nTvD1s46crf0vDk//OUxNY6JA4uXvMNEUvvk4hWzH2ouP32fb/uqcHWVzoAAQAb/7/2yGCoCuYCZYRh+rYmEZJGKRXGCYXGAtFm8ohGE4KG+QsmEwNkRQCwtmAgTBjEiwQKyxEZAiG54WBamQkPaVQFXFFysHZ6B+8BJIcsUKwUXXCdH2AWLJHiQdFbpDC7ADprC6JhcuIrIFFIa2kfxEUsQUYbHULkWtF4mUye1VZkxRCREPkQRlIpCAzJzKFODNwe8SDY3ZdqFNsMnTSudKLXyUcdGaOS0qneXO29YtTEOsvypWqu/W1FaV11SSblcWnRj4W67gl88d8v//OkxNA7jCoyXvdSHbV2x5ZFmowprJL3k9ZQT3fP1GVbe/VIxxu5z3VibVUAAQAf///62mDYAgYWo15wQnhGgogmJomBwugmqTTsGAuLptyXo8GRhIQylQMHAyGAcBA40piLPnUh1OuDFN4MVwt9D1P6Vx7fEYJLowTFiLFjBQF0JGXIEAaUTH4vERiIamcPL9Ams2ZE6YnJaOsCdl5GgQpygd0nkwQT5AybRtuFoU2eFBpwlNQkwuXNIyJ4jJVSNpphQs2trKSIkRUqPwt2KSYyCBBM6Iifcir0TKA6vBtnFoQVkm1b1mvjFJMSZde7tdpVhfoKUc1k98Uo1q+yTk18hCpkxIvLY+K6ay06bljSvjJ6Stq0hkreykzCEYb2//OUxPQ9bDoyXvdSHOSaADAG9+2skhgmA6GIAMac+RjhqwMZhekoGBEwBx0xdCgwqGYzcW4wgA0CgeBhZGSqMDAZBoFSyABGAruDIArAQfOUg4BDQ2skQgTkV5zAKAdAFGxgMQIx8qJTBGexghm4TopGBOgMEI4wIiqEn1CkVeth4ov0HpeUTPWcqgUeiZXiSMCWlDLDCFtolXbgnaPag9m7dWpVM91ULnkmJJSjKmqXWYilHcxDLpRb7OwqDZf3/i1wglPNnCCW4puM3K95ScZ0rCGxllXt35alXvHU1CU15drIeCaca8W5XM1GalQj//OUxOE6jDYtvvdSHE7+8nmKzqv77VUAAcAXfa2ONmF4GeYLJtRk6uOmH5ZGURIGM4nGA3LmfQsGKIomijRmCACGJBQhUARUrjJcDzCsFjC8ERILAoA73rhFgMmWRzAqBjpINAQAYg0+tRAbMkhkBw8bR2yNiQVuLnjQWHKQDZKRKMoSVEH20CFYLEy6CJGOPVUXWIJvWc2xsyHUl1iJfpzjNVqjxP7R8lRot0gOT6kKaS5TKrN6sNfuz2Py8pFvh5a3P3dMxnUFpZPEsir1GMqUKjk+1eQYWu0mpIowWxDHFE6bvv3Vq2r7eXL5Vr+5//OUxNk7HAIqXvdSHUq8pT36zKEvKfq/WXHu1ALw3cLKAAEAASNt9pYzBuBUMLkgM4qUUDQcUzDU0gMGBg1cJs4CACH03rNwwVAoxWCQmEYLiQDm3JgvWBdVQxEpRYaAGKF/ILX0rSw4aEN5oC55cZI9U1UAxVAeJZgcgXcIumuDhwcnyFdojSy3oeoiehD2HBEbaSNhIFycFBSjUZpDEnOU5yC+QbSCahw6QoFCFLIqDMk23vRo2CDCDIrlqOMzbZM9Kd0k1ctQUxlP1P71tWWnaU10lM3G5L1BpJlvF05pPdHl1WmP4qY0rN/v/Kj9//OkxM85244ufvdSHanGUMSZd6bRhwyGmMp4T47ALA4W3c+PKpUAAQAXe62yRgwEQxDhizsYL+NcBfMjUrMSgHJbvOsA+AInHLApGHwXAAfAcBhgSD4lBxEGYYDIJANn0qLACMXlCw63W6tWQ/FgWYs8tLeBUNBNVOahhkS2nJhIisByQjOk4qvFkCirLEUERlppEOlwEcQmWYQM0w4pdYYmzBveQqlCtplBQw63qyIJIUmEbLas0UECNCd1GmQknqkkDJ8lYu051kquM9ZSmrGLKkcanGpOmyTQ1uSantS3MLQZghjVwdSfQKWtjMMlleMkzsmlFZ/FP5sQixBb7JVXZXks7EdnC9v5HMlS2d0qx0WwWgABwAGn7f6yQwsA//OUxPo7rBIqXvdSHVEwMSejJ5U3ME8HowdABTBJAWMCAd8ycAFjAHBZMTUPcwCQMCoBaTASA0GUwlQBA4EcOA4UNbZzWlNStQZJm5vqwESAklsfxxfmIxWenYvMv+4rS38ib+wM/snrHWAycVo8VIFCjM22G2kTaBAP2zGyBmHUXYRGJSpQPRQBtE8+iZkH5ImEGvxtC0gmyiIfiS9tJwmuheozCSiSaLUsQYLWDEEjARADiGFDIQZGQXiDMO9chot0Wm8LjU0Y0Q/RTzI7KfKwk1xVXkVXCjBKilT7SFcVxO1EyMQPEdmSsz26AAFA//OUxO46pAYyfvJHVRvv/rZIRBcGFePicAKMRoKHZgAfSJxhow4bEBicKRgasQwDhg0LY0A4qT5huBABAULAG3NF9zE/yIEn+f2aJABX8vAOCG883cwbIXyOskPEmkLA+QLTJF4DiwrWUIk3A2KNYmiRkqiIIAcTkCEUKamgsqyKGmLKkaJpqyQlEJ7zPUm59Q6UlEDLkbkpzhBRiWXGCKpY+J5uHeT0lBSrWYVlUlW2J6mh5aSK0BSPk65wjGE05wWUi9Fe6r7h6neqXHWKzFavbShDE/aqF32/TWRixanjW5Nm0m8+z9VqUenuubXn//OUxOY69DIuXvdSHVO7rKktHgQBd/9tZIYPQixh9DWnIAMUYjALBgVARmDkBGYKInICZEMAsA0xghDRCBcYCQGQCA3MA0KMwYgLDAgAAeSZXau9Dm3KoipQM5WckoBnsHnc+S2Ds6j6XJitQXY5RympLIFgq5NUj+vpnr6kulEid3kDVJ+Ab1/KX0Uom7lNKM6fPKzcpIdq8v031O37lzGvR9ivcrN3lu3SzeOGPzEmu8tyznyz7FTGvfmZBVyrUm8ZN+Vb7d+mr196x5rme6KN0VyzuZ7V5/Oa3zuEv3h3DHvLmVvVbl29/Pta7d3v//OkxN1DpDItH17AAA5q7rD/t/vf4Z3u471zuHLPNW8d5XscstZ53c6vb/Od1+NTuv3qvldy1nvu+Ve3sayKRhSt1mtrlrRAMqUTQz7gnDFnd5MOwNsylkGTMpEVMWAlswdQUTLDBjMVkKwyMBXDFvAHBIUpd8wTAehYDIAgxGA4AABgwYCwADGBAxiDbEdwGuBgZgaBUuBhRg4iagNOUkUQWbkFFxjTNSLGaZbNCgUSusgIcuFmxmBW5Mql80OGKNmMRQZACIDwTQlBz6zIulw0QLpmibk0XBsFcXALYkRAaF2Z92Tc0MDpcMEjxE0jjkTIuQUg4272Uk6N1LQ00760mRNyuiktaDJGhUUzrqruyt6v2b/QQos6di+mC5pF//OUxOE8SyI0fZ6gAHl9VjksRUYU/fcUKOMKmwHVAwVEptGjzmj6eTwdCwNDL2FvGVWLxGBYQA0BzCItzLQdi0TchEAQVAAw6EEKgGYBgEWaXOsAdCMb5QZQFYUqBIBcz7t0CxAzBoywAoLtJgRKpeMqrzHmidHCOHTTlnjKBFNYq3FMVQH91dXTtyzcnw4OZtmcF6bMjMsNSFlU2uWU1KGrq6DiJl0JpRZqAw6FMiBNQaaU06hbksZnUe//1+sgcUoTHFjMEgcUL7GQLGWBBCtrTDsY8yqIzsqiO9Zb1r/8LBgEcM+NSbXQZEiY8OXr//PExNJXC+KKX53SDBkCY0iBj48Qd2MzLstZ+ItZlV+GYl///////+CQ4GNmWCMFSvMgMARBagWBGKFA4giUAAwKKAZGyKXZVo1DWpU/2OEqqy3lWM//////////+nQYUChvFy94CBoVsFLVhgMOCNHSvAQhSzEuAWYTUaUWcL0P7dhl2crsMyqXbmn+jVaGnaxrP9M2aypMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//MUxOgAAANIAcAAAKqqqqqqqqqqqqqq' + ,anchor:0.10396717 + //_tone.N_Gtr_1_G1_HardL1_R_ + } + ,{ + midi:24 + ,originalPitch:4800 + ,keyRangeLow:46 + ,keyRangeHigh:51 + ,loopStart:82284 + ,loopEnd:83350 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27778 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//OEwAAAAAAAAAAAAFhpbmcAAAAPAAAAgAAAhEgABggLERQWGR4gIycqLC4yNDc7PT9BRkhKTlBSVFhaXF5iZGZqbG5wdHZ4fH1/gYWHiY2PkZKWmJqcoKGjp6mqrbCytLe5u73BwsTHysvN0dPV1trc3uHj5efq7O7y8/X3+/7/AAAAAExhdmM1Ni42MAAAAAAAAAAAAAAAACQAAAAAAAAAAIRIQ1j7ZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//OkxAAN+AK6X0AAAITIgFW6hI1WGInD8Tg/LggcWD+CAA8Pl1AhyhzWfVDFQYEjv/B94fyfw/y5//8Mco7///+UdKQwYBI8GAoEAgCAYDIhUsUdMBg8GicGk0wnJTIIYT7aeYbAgcWjTx6MJiAEAheojCBhwLqxGGAEz1AWXcEk3EVtPtwBLm6ksMqB35lKxx2FShPsuGYFZK9I2uN0kMOO2vNwJ93AsAAAgaiORsMpH/yd9uEZjzG4+t5isTUyCxrBwN0ow7s5i5cAxKzQtOKoKb3uqtKNDzw3MbjK+whoQkjAFv486motLYvR5SKPrscek260Ot0h6GRoAvlEWeJwsClmGFPSX7djGj5Ou9SV4jAkVitLKoJpZan7LYNj//O0xNtRjDrWX5zIKJAsVhWcTou4z1WM2obguaqx+/has2+/VhmXXNynK3ql3uly/WT6tgi8mq0j9U9ySSWkr5Vvz//+nq1JXVqU+OGeVjPt7tm7vDVfGpKpXlZhqUyzLcq1KaXc/QSvKe1TS3Lk9Vq3e4/jWwpu1Q1+AAuY2JZtxgmZUcZhLBjJrHYE6HGEGjU14wVlMhGAQ1xU4XBmQ6CDBbHDB/ijahVaJASPChiLjB06BnpMeCWNFzE0k9mmmDgg4DBzH1GH2GTw0DgNBkIQREREzHFnak4cHdqVFo2CtJCgUWLOUIyhiwiYScxhwrazsDU8BAQur9HkwS9B5dRghIl2d6GWuR8vKgLhlYEGC0rozJms2ZUxLKX5WnvhlEVpPoZCMAxfcMybUPMXgJqdzFsM7VjL/Zbxzqy2z2VTeNW1l379LKY3zsO6rWsL//O0xNdOTDaIB9zQAPKs7NXLm8JqXV4lFolXgGK0tnmPN2avOa7uJUeWsf7/3Kbep7nzNNupTVoaf69+NyXZf3GlwpYzZ1l+OMM1pTDtFPX6amlPfuU1PdpL+WP6pqa1jzX7paWYi3/VrWt0uP1eKgDOYHwEpgSg/GNSkuaKQlRgyBomB2YQbrZdJENsYVQTpp6kYGEqAuYEoAZgQhEp+AYAQwHwgQADaLAeGLAJ2GITjQIiRRg8gHsyAQCoOF5GgFAYCSYAgKTGSAAwMF5L4Ifmisyiwl0akKYQ20BoEL5b1rRg1IAZdJ6ioKNdBmcMBAc4AayIOrbM5ARaKnZkgXiwDjj6jT6hIhTAGUCcANCpj0hLDy1kzPS+pi5DA4zSEEJEFHNAQZfJxhkhM7pQQES+AUBgKIyXY4BTCQpIhW5aIA0Dr6DoOAL+skZ7GwIE//PExOBZlDpcBvcZHNeBbFVVSswEBRkSERmTtoXNrRcBCzKIU8POK4VJTPzIezVqlgBvr+2TZ3ojIf3WsJptLq+sueaXRe7nzabQEonE5sQtmWqnPY0v1bCBVZMzr361M/D01jxGv1utrdl7TM2/Z2ZmbWpaz1tqtOnPMUMBUdI1r6mrvVpfY9iosXT2tfZ9brKnKgnOUBOGCKCOZVxHhyHAfmG8FOYTqRZxLp9GKCECYHgwBufD1GFEDmYKAA5gvBhBwFRgEgSGEcBqYBYHpgIhHmJ0qEY54UBgVAPjoIxhVgDEwA5gAA8GGwA2HAChAGIQQiYAAAIwCAYWYOaA4kAKMJEgwMAiIQIjA7HqBoEjPzKCQeEmgmKtwttF7SF8MVR4aBicLYSBxABGviahyOxk7QNA00ZRQAsSZoYXKEcK00GCZ0Qeiw/5QRJaAYHNZghI8TCCyWEWQoAmxfYa2oaMKMDAl3ELYZSZRoqgJjAaUIbY2YQfTFYGjc86dcHP//PExOxbxDJQBvbXPbIIC8TfuCrGDQARgwlHMNpn9lMOGChsYcNptK8UbgWNRrLHDHc25t+vDtF2U0tn7O6t6NcR2h6vjrVN3LL9f+9Z0X5VieapHz9OdOkeJrTYuJNPROHptrv9rqRAVKCr7u4vv4v+ur++6rrQaaHs6gSs2XXQcuSy5Y35r3SVtOrxbbQo015gfAKGAiBSYPpzhy1ENmEEGqYuCPJ8oIyGNUD6YiY8ZtSrXmHSFMRCcmB6GuYAAEYkAsYPIqBgsBbGD6CWY+athlOBFGBeACYBwTA8J810UDcMI4AEIAqBIRRgOg3mACAUYAYJpgbheJlrpMF4kMDAkmAYA2YiY1JhEAMlkjEZSBwQgMwGOiabCgFMMnQXH48AhAYDTw8VgL/jRIYi4Kbg0MUdjCcOMXgaDjBYyNsAV2SEFGVx2qZKePuEjcYLWICKK0jBghFj0rMONYygK16IoMxVgMCmgMAq9SUBjQ9GhM0dmBEEoDWEoZXDkvlA//PExPBfpDJIBvcfNTQc0xZzdFps1aEGHpuMYrxRQ8UBnw8SpvTxPVTMhyGwHm4JfRjPy2qGkZUuUJli/xms/1anWuPCrPH/puWaZ7LeSfagVIrrM2Rm6m5YPnjxMxtu48KBm/f1xjG8xoVlbTd9ZtaFnNsa3nNbXzX2z/rUXMb6WrYpdpbGGJDhyYYYdW3wI1591ruO6i4kaspq+txgdAgDgapgO1SGJwWaYE4nZh4MYHQs52YhwYRihDWGKA+kYSwEphwguGCQGEYBIARAAaYL4sJgSBNGA2FoZOKX5nEBKmDaBYYEgYhhRgPCgAZKIAYKQDpCAAYCoBxirgACwL4cBSYgwOYsBYPABkJHgsAMYA4BJi0B0goTMOANMLn8HA1xjAgwHsEOAkwyQTjIaLZmAz0bBVqCYQA8ySMEMmfmBzWsG3Qw2nAUhHeC4rNHAV+iUImXRsv9RVAEo+kyYwCYsP1oEgBKCcu0xujxI3svXs861h4LGPAG46HESECT//PExORcZDZEBvcTOE6MopqVxaCj+iloXC69YtyZuo7iQ6htzeTz+igBlspd+caLGXfnpPXmn7tWKWKSitHaaC5NLrk0Gj03FRETiEEBOfFTxKJ9taUidIukUhqrbR1nHYasrHZ2ylzlpw7G79j9qPu8VzcqoVexR3kvlSq/1vqmQS7EmtUNWgNJSc5GgbQlYfwheMySN1JfNTr/7mBMA8YHwI5gNJDHD6PCBgVzHJMSPYUwMxjwrDErDBNZRgMIENMEUDswkQfSIAQFAXmFoAAYPoKpgwBBGGgxqYgoXZgAAPFQLwwLQCl4ioeRglgHjwCogOZgkvICy3RsMJjwKLOmN+W4AyJjOe4C4USPMUA8OH7DTAxGGqUVACMocySJIEMEjk5GZAUG2SGXhesuCjFgkKAG5oFExMpXeHSSDha4yQo0lG9fWHXZiZYKCa1glARQGpCYoQQYQqeAX5WKCR6PARm7R0IJHd5KpUp+7uzErSwsLyym6BO9M6DZDWuR//O0xOVU3DpIBvcY/KXdW6BtWhHCEmH5NZYuiMmVXmUl0rMMVjc+NiNfVh9YxVbDShepu/x0UHqOMuId2n2Xo/1NsDU+0en7dL1jh/pev+9lab0F5grSavW+XWM63d1Lz1LSuh+dftHLjzLWstNVu59erWNW11HacxyytQ3bcwHgHDBGA7MoUm47VQZzCpEmMMFVs2a2FDDXEdMTwEE4bTjjD7ApMLoAcwmgZmnF2DBZEAMAQJcwOgTzI6DKMv8CIHBUmAuGEHAKMTAIXQCGfYaYQB4SPENCwHTHxWWFFQAZ21TpmAAiaBgZlgBlsgseC8TugwtDUqSXERnM0AZgBgApm+CsLAVlxlMFPhDBicIL0bqYLH4cfZEKEESC8jIAYFwfBkzbhyCyIDkwMlQ4AEsnAMMnVYSN1ZM35gATkQDaa5bQMaapdrVu/92ooFD2//O0xNRQDDpIDvcS/HhZjzd2LZRXHvaXXZfT0VyBOy60daKgWhSUk7bO+RbuJ9uJLCh+lNS2rhBV2yYRf4y+c5yOQS7MqmxWJf4zU1/HyV96+1KSlGO9iEpVRzcuCf9fNpSNssrwZtvWkKakmOUq5aarGY7O8SpCvioAttuYHgA5grBCGJs66c3JGhicg2GN4VmfYBKhj3AWGF+McdAgwRiHAUBcEIwawYTAFAMMAABkwZxGQEFyYHYUJhLNEGHyGMYBgEpgEhkDQYixgKC0TETjwFxUQxoY6rYFAIZCLrECwATXO3IgAg+auWoGT6NAKMw8UHGIDoLSohAIgDIlSWsmACcbUOYcAB0Aix5krCTAgbaDBZgA1hgVtjAnHjfGkdjEoCdfOnmo+KCmHXpL7NXl5ggvDQJdCVYyZNAeDbqPO1HDCt39//N8m7u3HxuM//O0xNZQfDpEFvcS/C3esSD8q3f/cihei7jojzUzBcIMTsyyy9A+cTJJNKVYrOSkDSzP7GzgrsNp8Yw2KscU2Ba+dpZE5DzH8sSVr3OGb5318izWyWqfb6kKfcZSzET808jYH6wyfwkXJCO0xg6r/rajvaFVS0EU579eYPQJZgMhjGSjAmYEJghgSiBmFUv8apTPphdBtGIGSOb1azJhZhAGEGACYJQEhgDADmAKAcLCeGA6FQHBXGRGW0ZZwFQsEWDAhg6AMsMDhsDdoWExhMmHFRuHAq8Z1EzJ4ANrXYSCQhCQpUAuDCAAkh9UNeIVNwY5knSURGSAe2ohNgk0lEVoISmvNuIACyaPiASkQHh0gAosZp6Jg4WUT22HDayhwX9Yh6BoJMFj9WGV25pwhgQK6gB43lvXv/+/93dpQAJURC6WX//49Jqc7UxmHVpt//O0xNdLdDpEBvcS3KykzfV5TBNFjqtKpRliFt7CIUJqoVbhPZZU8peK8aXzv2/GouxDTUrje9PfOqh7j05ecal3Y74l5/6zSkNLptLokL5GkZZDIyfQtSLd9wY/RIoP8r3sRQAN//zBeAnMD8FYyQFFzdSGaMNgF0xVRlDqxE7MWMAMxQhdDHIWCMEQIUIBLAwbUNICDBFCqKgHAiBkMRE+0xeAcTAdAWIADBYNh7QaCmYMIAS6QuB+YRYGjjxUICMc2Ajp/FPkv6b3ChiytYOMCgmg4Qog07L5EI4BkOjKpkmVIW5CgHDM8MilaeGAcmD4zFR4ijMNF2az1zshmkUqfuc1dMMInzqY14FR6cyJfj/////36sXji7WjAANjVeN2K9Tvft/q3aqTVJmzuVu+7cza1Y1S288ssPzsrW2U65hI8luXpF+Y5U4/2mzM//OkxOxI/DpMHvbNHJXhtLucm/FOUXNFTMrmmeqRPzCE6fll7ZWvB/yEdt5NcvlTVBaCI2kwB3fLps1enIzkIVk187nYAPbXmDcAGYNYAhg5gjnh4C+YgwXxhOrNmbOwUYH4Qpiqhgmq0z2YAgHRhOAJmF4BGpcMgImBGHqYBIQpgqAaGL4ieY94NJgNADGAaBeUCetOLASJgHgEAoA0wBgUzDYA+CAHQuAAYHoGrDmZmHEJA96Q5hXBNhANaJhgLEzC6QqA89MpQOKNKHwqSHKnLBmymQiEARQsCLTXCBgoTDVCnYGA0pgEmAoGiMsnpU+NDXqQmAjASeVOv8dttVV7lvHn/zv/+tc+jpxIKzuV+c7z+c1q5UiUvijG0FmD//O0xNtOdDJEFvbRObZnmgS52i/s9f7Ld9pKFrItTx5jCcqRGHxA4mn2q7yyUh5HOOgVH10zoJJdxdWql2XqBrvXMcS7I8pEaIhaqqk3EQw80aUcHoExLRxawIQvLSeIzOHQs/IqJw+yZYnGAAl+3MDgCAwFwoTIwauOVojEwOgaDF4FpPSINgxeAczDcCROKc/Iw1wMDAyAoMI0DgugpeYSgJBgUgzmAwDSY3RnhkpguGB8A6YDoNYCERQBAgIkwRABGLgAEow4gNwwBQRgEmAmB4zttDb8XdIhBhjGKEIEcEweEyIOyocIQ8WoiFROBkFAAFHpr8TI1vYBijSPBJHLYYFQs60RTSb6ZZjHq9Wz/IrLrs1PRgRBiee3tLSpL7qd3/eb7//e7y7UgESBmMtx/8sP/X52MMKfT4jwAo4ze7+PMdUW/td3cMWyA8Mx//O0xORL9DpEHvcNHDxM8M5gggEnlIn2WUmqKLYmS3y5rUysohJaCDyzl1u66KFVRCKfW2K74n27y5vpLw1FFu9WsapYjCyHRJGYepAs9dppPFQyOlq8i0IAH/f8wGAGAQDaYc7Whg1kbgUFswKEljFET7MDwNIwaxJDgCD0MQABMwpwBDBOBbTjMAAAYwZQpjBGA8MDsE0wl0KjC6ByFQDxCEGAghWBAwE8ODwL1GACCwYQIHaulqGCkAWx12jvOh8UJposyEHr5mAE8NzhAWDxlVHSlByDBRNNSKGuqJFAHQcjlWUofNpIpiGbMtpeb5y7BHavZDHQaDvxWmnwlyzXPy/HWfN/r/lPbcqcGCEGWaQ99rHWGVWtnS81avzDdWgRbczjy/lM26LOmqdxzvz9xEvD8fhj0RzI0jsw20lqWZAuZdEt6kuHPMZ0ZNzC//OkxPdJJDpIHvbNHM5EraLi5P9y70Ux11WckxxWWxaL0Vr8thQSyKjZSrmpQlOi2eaNlaJs163GRRoIDf/cGASGBkD6YUq5RwcjhmCWCsYk4Kh1ZgyGKCBWYIIxZsWoYmF6AIYFgG5gzg8IOuGYC4c5gBAsGBCBgYv4apj+AIhAMRgBBOrFkAoHlcszQwEXPfGka1ZDTwt5qp2e6/D/msFosbv4FhBe1IQEhMTXSoLjSxQl3TfBNmjn3r1uegmZVMUBGVyTWrdr//7trdbc9iAASGZbhR0i5pFc7r8f///7rz1MmyDGwn2kDs17dI3MvVWQRYJF9hNq/UDiFvqwVgfs0URyTRRJEd96TSSBtqlF5rY0ygROYnVKbcWpF06j//OkxOVEzDpIHvbS3FXlJWU5T2LLsuvm7snNat5Qq4z/9KQ+Lwl07H8tB9mskwntuWml5Y3FrHxbrpbVBM3+3LABQ0FKYnIdp0pgBmGKEoYGCJphHJDGACFaYjAyRkULPGBACeYLQBRg4A8pXM3MHoE4MCTMB4FQwLz6zBYBvCoAgMCVIkd/RgYDREaEQYvmSJDSU3wATTMGnRZDUk/jDZ5OSqAQBq0jKg4TDUrfEaUYyQCQODaDGXSj353Lx0FabWszmWWX/r8e/vcteAQh9yGrdiR4WO57x13mXP9kqnZIvM3TQx1tUiTAVLBNlzaRLU003FbDK+YbvbVwE7IeKTbttnt+1uUVFY+PmJfNhIvWuY7Y9cvG1iEzlmJ4YlJl//OkxORA9DpIHvbM3Pim3D/ezdeN2NjUQ8lkGX5wjhGjYtyewdlp7W78OIapCO3+3MA4A8wPAZjFjXFOLkhQw7wYTF8BqOygQ0xiAfjGfEVNIBhswVghjAHAMMDsICdaQYNYXhgGAwmBcAGYvgypj4gAjQKgjB5EqeHwspAq9ZKGCov+IWp3GeEcIU6On0WOo8mixokQv2WClebWCqUEw8+6DQcG0pKRJMM/ZkmbetpXT8VVtdWzFJzuuc////xzh19gSFRuO00Ub2UTtjWOfN6wyvfXp9QNXFljJXy86Se9tAcIQzsjSmPXdB2XHkOJJzXvV9LKGUEbRIFFyCdpI7fHXZlzXg6Ucep255sdyae/KSkvO41KGJswW3YZKEK8//OkxPNFNDpEHvbS3OvUZRy17dCWz1dmRIytG4EFF7tsqxTFfGX61BJzCk72K8EJ3/e4wTgTzANDEMOST0w7jIDAMEhMClToyXVazBlBaMS4KU45UUjCrAXGg4zABCjTwLAB5gHiPmA0BmBQaTD6Q0MVcHwwEAFRgDcJA5cMOACDQgSIXgz5ZXk/RRhN8rOdBuNuzcDdo8bxUwwGLt3SA2KBd90OQYLwwOjxoIvLYCIhKVV1wS2FVZ6gjcCfUx1v8b1r6bsBREwgHsPnygtA7dD+bNUtzGaZnsMDi4irzuFdrtfZpCkretEKMIMqXl6T9SMu0cJuVZiyYGPxfzXXNaResWsXptOtMDCyGKsZwlq6w965ZSOryytV1qJLNdT7//OkxPFHxDpAHvbY2FprSlrc291qtWy+5MvN9WuT8zLmN/eqhhs+Yahi2GGhzFa9WPnMvHe7FZfTTWME/W20wiAVzCFDAMPqGU9TCyjF+BlMg8QU/QR4DHjA0MAUiQ8ehfDFWCZMCMAcCBxCwB4gAOMLYLowFQijBPAnMbFBAyKAWDArANMBoB4ew6zRVGGSQSCgkYbJR1kWhg6BgLMfDRpKihrOJuwOAIzGuC+D6GBSoLAFLUlJxMB2Yq1iRbQNCoRA1aY/CX1m6RHu8VeZEEoVtvT35O1lmAlR8lLRSCQjXf51IoWnR7dPsTcUTJVfbK1nVixa0n1KzB621DDKse1+YkpdqKNuuW2OrDF+gVWgTx0aeymWtLnxXnUtdtSC//OkxOVIXDo4HvcY0B+j9GL3dfQIn25o3s3YvreZrWrWkvPQW7erat+imktNUjyXundgpSsNOgpXkvNXmbxW5+0XsMvdf2fZcsoO//XYaCNAQWZkJA0HnYDyYfAVxImWZtyfBggBemEuOibtaeJiEgxGFUAuYBASaHEgAIMJEIQwHgTDAFBQMU0u8xtATzAnAUMBIFQDfyVoBRgzDSBEK6c6hF2xgAMOJXIZ2bVeOGoqKuIsG1zCSEiAciqXSNnAhASYWdosGZKMQTTbzmW5CZcoAYNIkNXlIYqMJtI3yXAP8eXPD2tRQsvOMLpRXraKoUAugo/AqqeXPmECqyMPqcHLZksikhiqK2qZxqZlmNShCpMTahJZ1oGcYb2NRigZ//OkxNZEXDZAHvbS0ISjX2/cJ1k7fZe8T+pTvvgvcWa7N3GEZdKf2eWldbkK1nM8ITheMkakE8XnFfKdL51E6lkY+EGoJwjiVQ//rrTA+AuMEkJ0wmI0jx0LrMJQDwxihoD4YJLARjBiyEZGbZEUYUQIpgug0GA4FQFQFhCBaYFwsJgbg0mCQCsYfSXJidg/hQBILBgG0gjDQCQDauCg0wxzP4PgwJVeayEKjqm/8rOHCHlkiLnBMMPRYHlAyYOo3IRhqmEcChCPdK4JVYwq0so/X7r65Zz5lapotLPltHCXhTIoaaBYaqtcmqS3Lb9F9XX0kpabIh4wsESKKKR1Eo2qyokqcPI8QhOD0pwnBEOMtI1qYy+mmytuQOvP5CfX//O0xNdHLCI4HvbS3ajnyS0FUTa5RA3e2gIUlpMvU7MNjCoRN45O2X5lQgtkEG3UYJ3Pzlb7hzEp6mtd+uo58FNknLfT5N5GWfJMMT1pzMIAUDoPfWyUwKgYDAmEPMLTLoxmUFxkCcwk2cjYRa9ME0UIyIxszbelNMK4GwwrwMTCHDNAwCJgCgIGF4KIYIYO5gYAvmQcRYZUoHRgmAEmAiIMGApe4jEoOyxECzAxUObFUMBgyATKwQR5V+Z8byNaswVSgYAG2MDEISCSYg4KEkLQqCwwYKGiADAZOupEYVY521lKLPaHPWVNlN9v01uvqdj2CPtBaH0aPSQVAuoWyihO2lIhmNid5CD8bpautEUSR3Cq5S5rzg3co7IkS20mMjJ5dZZpRVOLc02Ocu05ptUjZWU8fOm/tWzTMGMapdKc559tuJu5Y6otrzaWnL5N//OkxP1H5Do0HvcS2Hl960sp0KnWUnOk8ahoouPtSmVcluySejckjUpRKNv28q06F321tMAYEQwSAoTGfcmO2EmkwkwqDE/H9O0knQxfQwzGIArORtKAw+wWzBSAZMEAKJc5ZgwvwNjBgAYMCsFUwHUGjAWB0QxBIXA8sMqGU8HbQcNAFmNvSV3L4EIy2jPzRYNoLXTM18t7GjAQ5XjWyQAeS29JEGv+QDREW4Suc3vlapDdXK9fqS6xqOSfOUV+XbG6jzfqmvXn9s8oZVSSjt2/a3OG41CxGEIkxChEqxHKpCxqhMKEliBaCruahqQOLOYtXY02lOOoaKF3cso5XmBKxHSmHQ6NVVDLWqsRz34+Wfq3g4mNkGsQPlJNI4b1//OkxPBCdCo8HvbQ3XQWq4GYuPeWZlSVx7eIF+yIMTu9XpklxhsGF/222MAIBQwZgDTFzAfD4wjETCCMLJAM0ZkFDCWA1MHEWw4vAzjDWADMDQAgLn0vkKAcx8/QqRDD4UOgmwPmIkRhg2CSclgyVwgVSItebFAiz26mHQY/TSTIRcn54OQo8CoZGQq0GA1FIavShyGTlUKFp7mPO99z2IrT3+pwY0LEQhkK5LkFKiFASEwpOIqySChZE6TLEWMSMtYqjluEaPJVtPYYxjIlSztnbn3WSkigh3w3w80o7BJyNNSpxQJbTU44jgtNpSF/YyFGxpiKKaCvBU/T1YyYy6h9hUcR5NpO/qbOr6na/2CqsDkYORpxrSsEpSmlvc3K//OUxPlAfDpAHvcSfJzPnd7KML1rpRd7rbjA+AbMFAKQxVXpTpZKOMRUKkxbiKDpOJ/MVYEYw/SLTfZVBMNcJqwYFAPAGAFMAUA4wYBBjA7AMMAwFIwfzpzCwBpBIBQVAmF/E2S4wiAHCRiuMPl2vkUYVzuwcG2/0bNrqQUpy/KvoEKoJUFt8M1akjhsfC+Zc1jM4V8buHf7rdBct3LVyxdp7kUvYS7sdp+2sLNqnpr8is09S7h6c+j2ySE2gkmSvpCSBYQ/TDgaDV0aWGwYmk7abC8qLD0RQlUSzM8so7TvdNu3FEFSklH7d6lpxOJT//OkxNpAtDo8HvaM3HeybOm0F6W9b9U7mfsZG1TZD7FvSt2Sj5SiDU9b3LC67k+hR6PfKKLxH++19MGgD8wIwujASgrMPgtIwOA5TCHPINME80wmwXDEoGIMlhhAwgAbzB1AGMullWZHk0WCzDhFKBocKy51EDiQoMFhMocLNhAPxJALVAAHEqAiy4RgcCrwl5i4lRVmojNa0ZpymtVCUDLhpYaZOy4VAoGH0ppO7546diuq08nBCSYoHTBM3syxBIRsICVluHRzjbVpqfKTtaSAuMCNU65eaphWElWHTySir8fFdyu/LibT2kmJIo1cZQfWvvX61JKtzZZG/Ha+1GOeMWfe3OX272Oez6Knx2+tNPENTqSqbU0ikpIYWi1E//OUxOo+k55AHvcSfWNStIZBchfaRTiGjaRctSVVG//22MHoDUwVQgDFaYrOYgegw8ACzEfHXOFMi4IHKMRUM00YlpzAoAQMCgCUwXATIbR3MGALMwAQHxgD0wuijjDxA+MAoA8wBQTwe1YMFkIuoZMOLjWIXYaWCRDP7Br5e3vNM0LpMVlVyiJQChE7DbnyoqCQ4Q7MIvWMerD1pdGtyFbTPPU8EbtI5ShFZKx7R2/8UywerH6WV2hod20fWtPv5lukELd3zrTvXvjXFVQ5Z/kFNlKs+5tb1Ybc9xDVUcfWaw9i1vH+3m6u/mdVuK+e//OkxNJB/BJAHvaY0eY5E3L8P2btl7W386Ks0y06z9tpZh365MFbVnq91ZZa61Jhcyj972tW9ObpSvf3beLqwcHuBBv9ttgcHyYMoAZi+BmHswDeYewRxgfH4mucgEYLQa5iTAgnDyggHDxmEEAEYJIG60SQBQwAg+gICUYEICphxk6GIsBgWTJQjQcyw8ukrcmXAkYBYOpJ7AcavRJzOFCuvQzUUQsdp/X7h1aRWAWXjllKvEaLZZFced5Ry6ksTWvrfzO7LauepRbs0OLaSy5KbViSWaszdvbxrQ1bp5vVIlIUlHEuo+RPrDhl86pSNnRJiK0HSWiicibn+si6rkKOKGbQGcikISvFseIPS3S1vcnlmnYCZhumoW3TqjCV//OkxN1CRDo8HvbM3E+jScpn80yrXbvmORXzN1rq2y/Rm4LIploFnkVKP05SDzBvxCqKTmpIKyi2G+sltMIQCgwSQqzGwlKPRgx8wtAKDE2LwO1o38xbgyjDbHKO94VgSLcMJkD4yGAgBAcAgNMtSzMNA6MDRQNUa3NohBMKwKMBDVR/dwUC4MS1PEZDExnDZQdeAKEuUxkxRG101LzBgb2HxgqAhjCGerhnlZx4AKdPQiCWGI39HnxYQOSUFTWjOzL0iKAiFzJETixCkzTChcjZIFG4a5AwKoWzimJiRpQ00Z2KhRS2lLpFi9xTWYi6EPK4o1MVQSlJd1oaVWjSsMPxqMKJGvaGc43KVJUu1CW2yonA9VTtLWU4p7RS8n4p//OkxOdEHCo0HvdSfToKYo+Guqckrqo49aWXutThDIM42zmakgLKJwXWUQKNVappuaBDjUI81Vv9tbjBAA0MAQKcwP5AjEtLnMBYAQwlzdjXNODMJ0EIwkR6TcPTdMMUEAwEwHwgQYOAVDAGzCOB3MEEC0wIAKDCGKxMKMEFcggCDFr8MjEAJIqRCxU7g57WxiIBB9k2k5kTdDFSFNmip9tpAV2kl0AqEPIQFkiYw1OpU33GZr3srmOcq7UitazqR6p6SzGnvjdamu3oTT26eQV7k9KM92KZX6JTscYWQLOPuNJiC+4BFnHkcQAJwHpxtQNIQp1I6cPulHU7YOhhummiWT5kI+92pc8uXf+IO2NozMR3/Z+5G79iEPpT7i6j//OkxOlCJDo8HvaM3DbVHPPp0omJanLWtAq7kY5ILa5Pn6prsVkLL7KpCUS1G/212MCADgwUgiTEja+OoMj0wnQqDDJJtN/srAxBQgzFoHOMj5nowQgjQ4CgMYqXSAgwm8BAJzBAlOBR45+GAcMSoSwxRxoUKAYHYeFAkZKB8GTQAAMmfQxeS7TXTEoLFgAocMAtvpy7yafFTiDlUhIR09z73PK4wlpMzFdAX0jQEw+fbkhXIpmxMSvJTEp2wo3BGSzI9IzE4oSZhG9CqRrrQMXT/SyJcrGsqTLL18g90k118lBnFFUdEuTayEt6BFHXZ5T3dWjCON0xHtQjNOEvkqReMGY21tovNSdbERU2UUpV9XusVKLSPyhtMNrNNoXK//OUxPNBBCI8HvcSfTvu4SxVL+FRlLv7zdSQ3FsICN//tsYCQBA0FyYvIO527gHGH2CoYZBbpp6FiCQvpighjmiMp2YFgKQ0DqYEIAFtL0wUQkQMCgYBIEpgLkpGA4BsrehqNp29KkASHteEI43otnUYIgTE2XmafXZIZYexefAARb9LXx1VjlE3caPdk2eeHEK7zvO7PyXUnzJ8ePm9wcXJzPUHJ5A5xWokQ0sjxPSZOhyWuchqydbIqOaiaairacqxQztQnKCmQdnQUkndKRRNsypA6FJb1qpucZtdukfqSmNaiTirUcZhlMTalmQ7//OkxNI+RDJAPvaS0RlM7mx2o7tuZTqEks7GK/zphrMvfFbM+X5Sy4ylmxn8gtHrVKFJjDv9drjA8AdMEYJAxKW4TmpJaMOcKUw/CVDc8KJGhhTDUCdOBE3wwsQCjARAAMKBVbjFzPQtMOi4wSDjeoBAZVJhUYGFA0voFEI+FjPOCEHmYQEoURAl/HMbEYVJsEKbmAxRALMQSAJ3WOFzdBLiADqoV5DnlrqDWY7BOKGaAgPw0TKWKlzmUSmjKEFzSRs2+JHNNpO8WcuszBhOMjtDi8kkOm0kl62U6lbabKnaxWNeth1YUnJ6JfpKtWhTXZjZW20lcUZgvqOKcDiJ7BSOuRtuhHZxxuLiSHy7lVTVyLmPuN5c5wjO4Sqvn8F2//OkxOxA1Do8HvcSfCUyRODXm3upuTUjUo34M7ExCSUXRylW1QCO/+u2MFYDkwDQpAo9eYZhSRgUBcmESV4adZU5g7hEGBOJMbswnBhwAaiwYRgRgHQ8oYYFYTzZAoBEYEZEZgaAWoIgYCUHA1MFEYDRMEO6owA6YEABUMMnj8qlYMA4eNQwRgFs0lTR4E7hnrceMhrAaenkvz+6ol1Omp1mzp5ew/DFe/q0Ktl5SPGK046YiYJj5xCu30gNwHRFIpp5EAgQo0qQwZTDLO0mMZesRvTK3Xx4j5VTlpukllPJ9+H/ww0iDHTL7DLgx3lJNF7/0liTa0kiu8HfEjkM2LyjsfezxaScjEFvJ2q6SHyOyGSu2VbnF01aXKTEnm5W//OUxPs+vDpAXvMNTACe/2utMIID8wZQoDFkdjO2glYxFAETEfJ7N4MtAw6QZzCLHnNylVMw8wNjBwA7MRAlM0RgMxawwoPwwSm9nqCy2NBAQoQMDS6S+w83nLR8M+AFyFfNDqUANH7LWeooufYwylF+cwxrQQ+jQGVwLT3MLCxg5PMPHDouJECzh0NauFxwyfs0+ZuSX0FDVHMWLXOd4rqk7zVFj19XRtrKxPtMZLvZRj1NKaz65T+QXaO961KTSHquUjb2abWtrUyBfG3z1XlkR/DEtmxbx661nbxMHDPHDd2a5WCOtIqObMqa/Tbo//OkxONBvCI4XvcYfXA5Ot3hjr7cFKP3cyseLm35daqh71at35mv1Y16buZkTywcEQDW/2+2CAxR4LIxjAXjyiBPMOgFYwRiwTV+KwMGQHcxIBljGAX+MC4EcwGAKBQDkHoZMXAcBQFjoUmNUNGQ4VAIARCOAsCESIQNHiqiw6ERADsYfxER+KYgCqrToInOoubtyWkvwDHJxVAmBF6anyv7Y1TyB5tx+8uhAkaRyQjjDYQKTNbMkQkbh6G8jImGEL5HVb1yblEUJv3pGWpZNcwsXpVluSz0ijmI9dFBpCGq7T0Q0qklrH0nbRQN4uF8wxk7RXce0kpGUkkM+pmRZqDlLnLwg3k8J8fPZYizV/J+9lOckL2pMII7MkYpEaaY//OUxO9AjDo8XvdSfNpWC817xmKB+pQ7qfFOaKeVu6kqCt9tbIYNgFBglhWmLJEkeIhaZhhAOGGkWIb7RkZiLBhGOWJWbKzi5hJA/DwS4IG6d4oCjNqiMWEIw+ATdO8OLBgmAwqcBJEVBUggZRJ1FlgVC2+pgEA1vRQUHccsPfdi2tW5LjXjt5yRkDJ/x9Nicd7csMDqyMjJWG0L2EAr0lH0CgZJRAdYdElxbYoXMwTGBBMygfBqMHl2siXWFNimPSRm2kEIjS8cXJ8ZqfRj87ZigV2f2NoWl6zEKyaSUllOymibNbC9u5R69p4UgtA9//OkxM8/RBo0PvcSfXW4qYPecK1uEcz1scu57rnM7Lyxr7mRh9hLPWd1y2FUntZCMoRqW38j9b8uwfAAjv9trTA2BAMAgMELzGGHCZGYCQKBhTlaGvGU2YZYFZiSBMnFeb4YaoE4CATMXkBIBGcQsMZAg6LjUvtNjCsDBolEA8nH2JSKEC5Q0YEZi0IMhXWkU1afC4qguy8mGqvaaO2N5R260YmDcufnCiy2qaahNbWA9GBdIVapB4E5AeXkOQTsZYMzXOIhPFGvb7bJ0c8YN9qK8YMKolalNE3sz+DaHqyKGW3cU7NSGLSnghWSlLVZZra0m4TnKNoceypDdWsu33wrHLK7akNVb+XBX5cH1ccz3uSnLMfcoYtlvrc35vT9//OUxOU+NDo4XvcSfDMpb21nx3wnaV7B8K3d+arBLaWqAJf/ba0wBgNjBIB7MR9lw5myFzCbCUMHEhc1iyPjCLAJEYuBvrDfGGUCG2Yw4O0+p0yYVDEIVMGAYz1mTSoZRYLbkSVoSQdoGMMBARMlABIluxMFdwwFg3Ov07VjUxh8ln7nI7WkYsFqat+OvOrMnTBI9c5BTjzhwVwpF0ahaMIkq3WPIyIdTUWacgagXpw4Ulra7NxVjBVPZs7NLW6FbSFCs0h2Tkl5KIoXcGy8pJoGWVUBeo7K7hKcV0Sk0qxuZS1+xb0oTlilpxU1hKac//OkxM895Do8XvcSfFTy2V7s7fPdjnuMWs3FIZmWzSW1D/Y7mtYj2rT9qyv7P3HprZ6hfxSqAPffbW0AALCQeBjZgLgO6IxMQQjDiKbNYonwwuARzDfHjNlNUUw0QdjBiAFEBOU1UUMqlQwsEREITW1cNvh4ICpgMcg5KtOEA5DihaEAKMjAVvEaAwDw/JwuGpUwEvfA83bkmL4xTXvit0UCMZZA1yVw5ynXLExBg2wQmSVpNGpJI2oYSeJFnvYER9fRpaGJKRIESjoLoe9y0ycw/o3Jki2eKJlZCdUNLtxNizjSmIhAk7H7qqrMZiXJxk9TDKF+W9aLL7SZvZpSShHMVaWz7JBj98ECVSbTyd0k1OFXBX7iU/DTlxYdPJzZ//OkxOpArCo4XvcSfY+SWIJzu1FsXyqyTb7yCbtlUp0p0r9pD9Wfax2QwMgMzBIDSMaeWU9hzODE5DhMRQwQ3ZDOTDKAyMXwfQwyoRjB6BhMGkDowDQdS/woACYBQcZgCAHGAmA+YNpSxhEAeAUAMLg+gbi0QGOw2Yq4Kojek07kEYhCOhHQYnn1bhoQ28MLzefHPmvoU+SEKlDBTv15vLCLXXsoIbnH8fCAJTWlU9VgK7y9E9SiQy+jtX6fsplVJHdU0on5+3SVWkCay0BjCjJytOpSVKRJYdsFC6dNKqPnAUzCtbO0Pu1Zs7t1971EXUxikDh1nOhptvkUKMQ26rSDqLym97Jf9Fz4Tuja00rPr5jZBcTKrM0xZzPT+Ic3//OUxPpBjCowHvaM3alMpVZKGY6oRdLDR6p//224wLARzARCqMBKB0wUCujAeCvMHUjY0ryFTBRCGMR0Kk09E1zBsAgMDEBEdA0ayqsYFwLxgDgOBUAo6GjPGBSICGFtsLOUdSaYU0L5gp6lbH01XZiwyFTcAl/ohDS0IvU7n3O7GWkvLctbtfuYtZVc6uMQsW91NZz01NzU19SGK1AReSd0pUj2FkUiZsOk4fFQDkVYgTgtDEFJpvhpUEba5xJmptjZbEIJVdoUlhmv4vZiF0bfzOUn33Ps496zGENlnb2X5+tX6DE834BXWM9Oti/L//OkxNY73Co8HvbMvRfa2VfbUvaC7UhFJVLdqN02+U3WvbqkbpJVv+11tMDwDswWwijFQb9OmwjQw8AETDRIPNR8kwwvwlTEMCTODktAw5wFzBUAFMAcCF2XiME0AoAAAgABgwBB9zAPAjTuFAXRJm+pICF3iiAVImCJMZciL09CMDZVMFUPL6qiz8Vt7z7zUee2zcpKW7cpJVQzMQuy2OUkAZXb3cp+BcKbGzYwlJ5EwRnPUV9pMcGQyQ9oYiCEyR5bLazFQZtmPFwBl5Sn01KGRYqU0XeKBV9xSTGqo83bSOIVyU8a1H1NdFft+VTYhGilFomaqGc61VWStoJV5Zlk8a7YvJhqy515jJU6XcyW7ulm69u2+c3sjo90Vf/9//OUxPk9pCI4HvaM2XXUwIABTBVAEBRYp3cALmGoBcYFg8ZoyDeEwcBgIisG5AQEYXgDYjAUMsAi8SHExxlBpCCgEpLRN6QtKhaUK6RI4NCzyy6dKzCKxW9FvGQahhtVSL3mfwdXlueeP07Sn3ryKZnKOiWJSFAcW8Wn6iQ4SEqpw2TKk6KnxSaQLwJZm5wkoiQcrSTa3QpwJ8lXWVKFXXIfhfkrLOSQhuXkfPSOrSXk2tDY20jVf/pvTTrQ1jq2M98pV/ktqMJbbWpSnkYS24U+Pxx1Em0osZ6cLbtKkWwuEvkFKi1PrJ5qm1Kftb7c//OUxOU7lCI8HvbSfap1G8//pKJR8FUAGbe22SGAAA4YH4R5ijPkHckUyYWgEBg0ESGrYS+YSwGhiEkImxeu2YXIPgwASYJ4C5ZEVACMB4JJYIGgSmBMQwYF4FheFBKRBP3RgD4SBlYsMAICgAq/reMMtIAAC/tpB8aplbW4v7Syf6XCarMfk+UjsXPKNzZxllGjbgWtaaQnFDJ8RkqT2GZ2lEPbFJJ5iOLmILSYXZ7ackPbZpS9nvTQQit2uymXYII+bSMs2kMGoCDUEYgxfmJLFAMlcIIhg1GtpmIqHRZRWUYmDq9j1AiOxUohthyU//OkxNk9hDo0fvJHcKxgZMvVkBWkaNQgKhSvKbsIL1D3zEE48GGJ3NxdAAu8utbZgSgwAQTER6TAFFswIgkDDPLANs0p8xAQHTH2IiMQ2NwwRgqTBVAKMD4CgOACThM/jsxoMA4dG84AcqAQcIjBAyGms9o4ZDDABQFAoCDSvL9QLPSh/i8yrovB1Pg0h+pBJ5iT1ZqUuiyaklDtXoOik7NSm1Svffe5+MrHYZQeRZFNlhIm5CtE3C1WDmk0dJTGDPwfEclDAkdZUeLa1paVqED1yyJRTB1YtI09leJE3JAeYJ0DSS9TiityrsXt+uZ/VaqEqW1PGLxrJsKLRqXxS67LMdYTghxula3pzqCeQjGPUhfll5cc2V7W1NjNljWT//OUxPZAa/IsfvcSnUsktBzYAjB+nHa3MgAd/rbLIYGoLhg9BymMzHEedpeJh9hiGCiTSa2JQxgrgLGL6EqbvzMJhCAXGBIAyYE4CrW2dmCkD2EAdBYCowbyFTCKAzBwBQABWDAgmqkoKyK6oTAAARMAsAKikVf0opcitbg+KhPYJdaqz0grl5ieMKjlQciWKIXj8iHks9UsLWic5XiUWcW3g4tR9pMYbZZowvvoXpZqyaYRIbS0GUeomDgxSVGkHCilFCEmCSFViQSk5iH3mtRc7po+2z5jju2o+rSCrLIQ2LOuWa6rU3D2cBTC0nwu//OkxNc/fCowfvMNFTfGrLfFFbl29IvTv7ciQ+nzpy1GtiKMqR9SzGS4HWm7ePqPQpkMuwAd/vbbaYBYCBg1AOmMuCkebIBpiJgZGFUOWaHA3BgvA7mFgGGb5ZBhhpgEFAQhgVAEOSwYLBAAUA0WAIMHgQ0wmQA0KB0FAOACfUqgZDwG6gKJocCRYgedoY8wCze3Y8sk3NvWp82VQMJlJ5xcudxr0skk1JxBY+WKrIzk/epdxqC55U88qVLi8q2UqIFaFnLxM1FGylJsnZR2t0BNtbGIpNAl75cQuTs1JGzMD56P2KSY9bVj5lOl9Oo7odWmSZQEW6CzGw1Tnwj8SxvaZFsdJeRGHS9Z6SXKVZ9iku3fYR2baTlW6o1B+xbW//OUxOw83Do4fvMNMJYdm+9f9qJKAE3+2tkpgHAPmCcEkYsLu52dlEGHiFOYXQ/xowEVmEkD4YC4yxwpF1GIIBOYL4DxjEGopFxTI5HMKAsqBk0FbjTocQNFTERAld4jExQglV0ORhIDw+20bfZkRgALxxkWFNLJDLYEws6qwNSxJoEHQ1B1NO0BhAhKIgALStY4WyA6TNt49CcepU3o2kDJyUamiIZnGD6k2OvN6Iq226DCOd14b7hKF714SmxrpPpWPUircoRWNxNrtMbBlQ3TcMnmJT2p+lX+qn888zEpRQ5uPvZJ7u+lZXt+WdSN//OkxNs+vDo0fvcSfPr1L7f99CxHYo5QdlrzgwtiNBW6zZiO+kl1v7pBeK6nAAKPtrrbTA+A/MAcLQRRGmDaW0YBgT5gxjaGfmMWYK4FxhhjRmj6naYQYIAWAdMAgARIlaxgcAUgkAgCgBmCmKUYNABiw5UA8K4ExRCUR/NDQeDv6N5aaHYCMER5cIc7eaG7kN3bNNXnqDJ7LV+telEqrT03njupJLM/2OXcd36k7ZrblFFknDSBHE1mHqfAPIiLtnWj8foorauaQLPpwE55R1Q+kKZECTxix4lpKdivDFZisQa6RozfJT0btPK4tFfb+J8XEntM/IljX20TWO50OyFFm79aT3yrjc9wWqKhPyROi2ZN3a9s9ol6dOSNFA9R//OUxPM8tBo4nvZM2QAL9ZZW2YQwLphBhiGO1POfAhlBimAxmHeRyajJQhhyhOmOwPcZK8FgyEyYCwBgCBORyUoMB8KYRATA0BgwwRQzDyAXDAAioA8LBUMFVELBhOUCQBRIGNvohNRKJAgAeeg2vd2OJzjquJhaPgOAbPn341o5mq89hOioY+V3mH1jGFShZxhmDnoHHsfO7ZAzNNqu7GVMn/1Pl+s9Ayho2GKJYJT6xrz112PxTDSUJp+cvyNZ0LB/RfL0a1SqP3td6BmnxprEN9s4sJGehVRNRWsQtSjSuHHkZwb6Fe2GyUiqrGZH//OUxOM8tBosfvMHPY6mbCiO34fOxuNZByBm/CUAL/7XSSGCEAmNBlmNQFSA8SDEEAcMBoaE0LhbjCOA4MUEFk2iE5zCIA6QNMcAmkZCYjMIiAoABhijKmPQum0IwGTHFl4VAo0d3kTLCBA/Lf545mBQZLpVGLGuUsXtwrcMy6tMKX2Pi9DS0qr8QEDazGkYeNx1WJsqJZQaNCmaRdUkiJ3GT0rs4a2lJu2eyjdpyQ0+R18CZrDdvbbJ1ctNRRlCim5JAvTqdtVfaxLcycU31KrjCDTfjDMXjKbS0YR8V4yyP3VuzHK++eapF3Tndt1v//OkxNM75BI0fvcSfYVOobKTvvyo1GCk98kG0nmeFVfhkZ/WW9gxbI8VAB31uskZgCATGCeFSYvEDB5DFZmHcCoYFA2xoSDwmCMB2YZQkZzCjqGHuAkrAaaIEQCjULUhio6YEBnSNgfTAoFAJ+EOqaIXHxpmbIoYGMrNYhYsQCFgGXxvX0jlQzNSh/7vyiLPqgs2CZgd/H6vG1yU6fKHiZ05If6gnFlAdxOEMozLGUbD5LEdS04oWxVA3AbIFgvJZFo8tTe0wdwsrDqRWcw2k36bUaX6V+1LbvKUdJo+onBlKmoyjHXK5P7kI7J3UR/3Wz84ulG1YQ9bKp6yrK41dJTyr2tfcPGLrepeX2FeqaZjC4P6+0HfOT1qAD33ttth//OUxPY728IwfvbSfYBoIRgABoiKWgw1DEwIDQYNYrhnsilmDGBoYIQzxu/GeGG8CaYIoABgSANo5J8GBSC0GAMAUBUQDDCEBxDEQgjg4CGHQaBKNATOwMADFl6RmtanvLyh6lmt2FaGTy5RhaqaWiSYQlBYwbocMtKbSweybusCk1aSacJlxlVxWW0OzwtOmtAo2jqcV6Y2X3d6ZYLDUJTgEMwtOUUSlao3ocoExRI0uEErRPSQZqPRJEcyiDn7amBbvSOsX0OtW3QY6uyZT4lndxPL30zO0gvRdBe0zm7l/58rJmCkTI09r1/e778s//OUxOk8RDo0fvMNLPkoX8+5LXTrAE//21shgXgjGCoFCYnLuB0qk0mF+EcYBYy5mfjWGBaBGYbo0ZoNqzmEuCYYHwEJjZYglhswFzCggXqOBQh9EJgscUVdtNC5G6VFLCZOl0v7lSMB7Vjt+fpYA1fdGPyG0JwyKUahoiEI6uSMEZGhFZREPzhIPlhQTcoQAgYUcSMTLwgygSe43Ebmit6+x8pJvG4zWSdIxC1VCBpNok1yxgo3VwFKUrmgTWkrHFm7nr+pBhyjG+cXrn8t5aVIVIXS/nJhCexj7aaX9QggjKrnU4RqEltyE/KoTTu9//OkxNs9bCI0fvbSeYQabavYwnd0lKGpZGM8y490IZtx91coOhkh3QADnf/XW0wHwEDBaAHMW8LY78wFzD7AaMIoSkzEBDjA4BNMQAQYyMU/gCBmBADjAWApYFIzAoAWEgFhEAQYDolpgXAHt8IgNx4Cdbg6AiJAGOqqqhlCItVw0LKTGJcYCYBLAAKAtDuJdQDNnyUeTLDxmRRGLCkcRIQzaNggm0cFJGhbkhIiZAULj+mliryM+WkWL6ng1R1YY1n2F4Jm8JunqaVZJ1nqyq06DPYqE5NOJnFoGgo4pP1Mp6VhJqrEYZRNK0y2a7zqRyrOh9MrNaNnSmMn6f+2YlvaKKrnb3edrGHp7tbT2OhIl9v5hsXV3ebn1XOlAEt9//OUxPg9NDo4nvJNFNpJIAQHTBUCIMZV8M8OSpjEJCtMKIbgzHh2zCWCgMV8FE3TE2TC6A8CAbzFzxry5DNUAKBqFBv2aDzdGEYJRpnZwQBIsWtZZYTBq9eZd2zm9KI/S5pU8H242wkcJELGF6DYpIhgV8QtBQHlxpT6lvNk62NGUG6YF0BVggQ0iiRNtn02EEGDq6SNoTCcYG0BikGXst88uuk1aKUVVUZadz8G4Zk2blcEDNWYn0bM+6cYSQyKb7+XNdbz68npssfIpN3k9xi63wcxWnr1SUYzlsbSnJq98JV4Trc1a6ikt6OVGcsg//OUxOY77CYwfvbSdfhC5LfNYTXoOhoA3/+7W2GA8CGYCYaQgkZMTUwAGBLmCaJ8Zn4h5g2gSmE0IOb4YbAsMkYAQAZCBala4YoC+IAByUAcwTBGDBdAGa7EB4Ft3EPR4BinRkGgBb7/Y3djeadI189UiWXkJOuIr4cxuG+zv3b5fPJ8qOrn2GeCn6IpSv/HRjuKzSLDt/OgUflVKi7uyDOYeceMs7TcUmYClrElH2kauuEpg5ABqiRWRF/kTjDCn0yWdB+vDy+LxHZ8MIytT2GMqYNNTVFGIK1y0peUNQqTZwqX068LzC/mPDUp8W0Q//OkxNk8NCI0fvPNEXpMXOwh0YlnrxkoZ3MrStatnu9+Ds+FCgDvv9vtqYFgG5glhGGIUymcUxAhhZAgmC+H6ZDYjwkDkYJwrhroF8GFIB2YAYAAIKEIoIMWMB0EQlmd5AKoHQCwgTG01EyIdfBNIWA9xm/QMmXLPT0iqYteppuJSKGZiqmithMXUVqQoQ2StIGSYh4jMtuIxWIooVECpO3Jl6rJM/UDmkZ1bdJWIO/Ijc3UmcpM085kEROIBUVVJCKapkwy0s9F2jT1/JRE1iHqwivMkXk2RKOR1RtzF36nBEpsX6jXh05NIYznNOC2RSYUhk1/2IrLtpbaS6ckCCeyRsunezXWtO4xhkbyF9DLN8v1ZXcVV8HUi7JqAD3///OUxPs95A44fvbSefrbIYBADJgugJGNYIOelwEBh+ACCEPkzFg4B4KEw7xhzMnUrMHEFgwJABxQlLqo3BiUW4LAIarim1AalwgLhYueNpw0Guow8OJofmrtePNUpLl7fQqhXCjy1FlgICQIhFgbmuJSBAIwuJC04kolbYkKhUQEJ1SMFsFA+Ij7Q+CaKBONya6FH+0g0lMvZnYfaVbxp6U01pqnEm1UbukxWrLXOCb6lHvL2ZitrVJrSVSnibGJQZvUD9lkprLZtOp0k8lG61qObAjR/YZKSqctvLWlrrjfV8IqJSzWpXG/qsp9S5X9//OUxOY9NDo0fvbSdPdbOVRnUEpSjeRqc/5rQglP9rrLYFwEjBDBtMTJmg6eCGzC+BCMAkRIyOBKQuBKYjwgBmFqYGAaB6YCIBgjDjclDTCBBAoLAgGMUQExmC2tlUcIPO2s4iBKvBQGgQBQy3u3cgwFAmo6d/C27sjsT9p5rksKhtAUJEDa6ALKbcxVUMJLb1ALItjJp6xgmdO8InnFGmk+mww3Z8KGuldZBN1FHnmlXppwUpEkrI91XUlPoE5QTWYxWp5L+SH16tqeb01q2N6wh+SukmZkEvLWbns0aBZMinO4VkajkKMWh7KdZu0a//OkxNQ8jDo0fvcSeJLN4vjmGOilJOde5W//fu+N5GeXtQ63Xb2ryX8OvdUB3f7bWymAOBQCAoQa9sYpRQZgJAwGBqFAZPoUJgOgfGGWAEawRi4GDwCALxky58UAjhBtRM41gTfIARGqIhDXmJXo8AgodFlEfl8bi4ORVngkk90KLqlScmb0jQBkHRW9cuhbJnMbCwVZMSUjCK6BkkwqXXJ0bS9Wmba0o11zU+NG0lFamTaa9oVz+xvoEFzUVQRuaDQ0nHzZYaxU3CVsMNug90Z7FtJ0MmptXewpHKeuZqEmlpyyspOexTmq5WcWfHy86z7stVXrZ/MuXnmteXg/M8U7u6POX6svCLqbxWmqV8cY1SgAtWoBvf/XWyGCKBkY//OUxPQ6XBo4fvaSdTEEeYkLiRyxkqmFeEQBBPTHdFIMDcGcwdg/QdyeYZIBBgdADkhgyl+jJQ0SBAqDg3+AgY3oqRExgzplzX8l+M3Yq1qda1NEQTFPu54wPPPnNRLkvpVwOZHg2I2SUFROKgjNCyRFyfCAoQlmeziAeMaeOwQqGdR5azQgjCBaLEFWVbNdRpnx8bWqEyeCF82EKAinKoQnY8iR+NT2rcvGvJf2hYa1F82N981oQ7VtIJPYtqclrkpLdKuhBKbNTO1tVOofEN7fzem3exnKLob2Ln/kelLFNjOrx76YrzvP78Kk/fLE//OUxO07jBo0fvbSeYhVAm/3+1tpg3gCGCYAOYq4ih2UgbmHWAIYOgUZkdA/GCIAAYIQoBqGGEGEcBGYB4BhIBOnU+pgHAQoJkvgUEWLBWsWUOIgMH0Tmb/2lCwBdHEZbDrSAwCJ/GDw49NmQSiJNaj1+w/g08KC01GzZMRSPokKHWmlViAVVJc5Msf1Rt8nRWMylFY6F4l0kjTMY4JcqZCnUZqQSOqtLogKWUmLwQPPpIYTLSYO4Ugf6QoRKrQpS96Lxs21FWiklPNulIy12zY60VlbFG9PGLQhz5RvKnut81DEkrabn3L1Oty4Z1LK//OUxOE8RCY4fvJNUUT1LP3vnpuhWXHmvHurVw8BrX26RtmGiBiYKwUhjGwDnqiVkYioTZhCC5GPQMKYOQKBijjwmXazKYM4NxIAqDATDACABLJFQGhH4LACGAGJ2YAwA5cwhAZKAXV2KBEwBdM2FJrPuT8zSzXtgSe7fyll995ZYlD0GDgMCREVNW24sHxgy9EdRGe47CnFy44oQTkiihS0nZiwiPKnTdvXezAleWSZUUQjLapskDyJrWrSXtebesL620jyUNhKH2FII0xFzTG5vKs1FtYrW7pnXeAkcFCAmCedKPHasKIlCIsLUw6b//OkxNM7m/IsfvJHWaZyORw0lM9c+JHocNLgrWkDEI1IZuHSh50XJMoAh3/21ttMJEDcEhBGBy7yYzJOQNBxMDcKQyHwdTBRAZMOoLAzA0FDAZAxSGManaxFDHly1Lam4bk5acGTJQomneRL8uCNWGGMoVuWcvYxoxbql0RiFxESJDKFQoVJWROqmMxFYcVRh5FsBWsxZA0jZEbeT7k5Jxat7mEDnF2CUnQyko25ic5JU+MILmVVlKU6k077Oz7S0YbDcWfKnJR1NHNhaEXsSqCBrI+Mk8pjrVktgpiUYwSU6U5uyHgzkIOXtZdnuY5mEFJyuV1urQjW6l55C0vKEmNnVyqCPIvmvK6VUktHU+zctxKg/TUDV43/221MIcCc//OUxPc7HCI4nvaSdMDMF4w0lTzbUG0MHwDkwMQmzD1CsJAHjCXAsNKwjUMDMgcwFgCnCnzBAN41tmHSgGImQlgZgVeSHcSLo65okE91P09VdMPUsUk0pg6OSSMUcdq016rupXpae1TyqnvSGbv17soxpULaRoQakkQTSmmNUsUOWmeVJgWSOqLcyAABZH+A1wiWhwzlBnIQgYbb/haGTKCrIQ8YWlM31Tickcjwaccpa0ZUlsx4DTTqMQOm1HpSRktFO3lGfpXZayckVlghfOP+LeF6dqf0gEj5A15CMGfcO+FiyVAaZaEDRo+/22tM//OUxO05c5Y8nvbMnSvALMEsAQxVhMTrOA8HhrDADB1MhgGgwBgMTA4DnNb8LcwnQEBIDkz4VcCiQjQF5G+NTiHuhIPFUosnTQZ2l1BdxY8Yp8pfbanF8Incp7AOoKBOQqD5FJg1R9EaDa2RabYbJz6S7AesBWicUJEMpomEiVAgaW9LTTTFR8QdAgmdjGbESZipySWgzIwrZpmDZC5UnrXMpLqIuwtOqkV9t4VVn5G2EMnMoL9tyDN0eexJPZS15dEqpNZApGExd7Losp+7pjHe/JryqrukEbhLtpzdBVilZt5OUOS/E63MjcPCtlB2//OUxOo8XBI4nvaSdWud2hQRiHUKAW+91bkhiFgIGCCEOYszVx26EYmGwCYYDYdBioCHkICxhFDJGtMgMYVQIpgbgHAoEQuUgFMAMDlaBCAEYFoXYGB9aaIwKSICNmEboI3cJgFrESyyBsMoGx0RDYFnC8xQRLAiPuMkaAwYXgiRnJkoibOW4t2ZKOdhptMb1NGyvQf5RE2whRMisXY6bk0SqcFpornRddEpGmaoTPn1zxCDGd5S6Uci+XuhcOkyg1Fg1u2+o4gg1BCmEBRIlMaDWCXij/kRxGzu54YOqDzYcIikOP4IrQoHGBOZaimo//OUxNs4/B4wfvJHGWOmpk0KMIzJ4QA4bf/ayUw4QLhwIkwDHKjHCJdMAoFQwJwKjekOzAMDDLlBzRP/TDELgIBJMHSwL3CwWBwDvIYODyJB+whbZEDbdJ+9PQYxKvZ11yH6gGENOrcIWkYfphNstRLbTCRE0kQHSRoqVJUlEJrZJQHxLAiR6lNtGdJE2ka+tJLD0mXpUTtsxMMRTkh5BZPFCvrTUGVv+022ORQJzmogppuFPxdXfcKxqKUGdjPLQznDdal3bOt+6t43e1CVXKoMwrJS2e5fq0tjf+/PPaytnHPOpNe4zfppdrHLV5MN//OUxNo5pBo4nvdSPTOaldwYruTTpNNOglUAaX///11MM8CYwKAeTDJU4NoMaswdwVgYFuYU4XhgNgdmFwDkZaZlRgVgPoaBwDDcJIAQGGsspMBoEwOBKjLdigBeCM96ir2W8r8djD2Suldl3JagTQEJ1hGLlizmSUnbLmkZKICQseSPJYzOyyiZDTTmWCY2wgIYESjGXKZqR+Ey5RFCGXfw1BNVWSa6TKtLTtc10OMTHY26dEew/AFaSjuBKKUn66kBh9Hsg0NEIOSpq5nS2QzQxRC2EQEFBgwsF7XoSkFJ1SICGpCAYs2I2CI8HZwn//OUxNY49CI8nvJHOUqqimCvC9aVjIyBcVdZA///+1mph1gHGCsAyYnoqh01gpg4Z4wYgPzG2AcMEwDYwpwTDUYIBAQeBQAGDgB3GckhAlfx1zAHCCAQFD/BYA4rAJeCvq7B0dd+IQxMEkXk54lWXG5EQRAghPD49peBQyg2RRr3oTk5XFd5o77SfAWV+IKVO4cQn6xguVbLRfPkac/Wpbvy6rj2CjzzbjdMstpkLXwl2D/rC9WKqyrUN01+aSdCXjT2Sujbo7UcLg3el/GTuzLah9aNY661y4+Lx9vmpEtK0mxz3rYizoUz6Blubp60//OkxNU6w/44fvMNHUyqpKmewVtj/KrtekLmWYwQMiBNELEBSY//+ttMM8AMwKgZDENThOKUZgwrwTTAuDCMIYLkIABBAeJqdiSmEKAsWtTUS9nwEAYgGYUYEYFYkDKieFAGh4AppUuc2q38Xv0s5m48BQy7kvgGnSWMkiAnQwgMGiSKaRIsyQutQmKSXWaRonlaEoUCSmtmS+qMxVHjQg9CuSis1UM3F1VV8QFydVAQ0qq/EmkI133ZdV00ETGlY9WK9kwOE42whXRIv0GuceJK1PTtqXM6/txdPbp+Zpswo+28zpZ+aqpxrQx9QlaNw5VSTyjqcD35Rk9ojUnesQf+PrvEfUtvntfzV6oFf/222yGHKB2MBtGBjIaZVpgh//OUxP06XDo4nvJNOIAIRJgWg/GRqCqYG4CxhNC4GmAgAYTQJJgRgDCQB6mzTTALAEUBIAABEFij+MAEjoFCP1I40ZkED5VO1dAGBUWElkDwcTSC4hbAsViE+o3JZMiDciyAUoBOiAUIRNyxginImaWmmTKHVG22UEYQU5CZjJqD1jzc8ZRJSwoLfCLISqfFsxg33OYgkwkUS06UghdFH/GlB0z1LeiDnCXEzeUq2iiuhReuJWhCfxi2StCInGqOkggxtMm2KiYLzE0mb9iveFs03ZM+LbNrnTbVOZe55ktPH1r2LyltAe3+utrhhfge//OUxPY7PDowfvJNHJgvhUGIs82clxNhheAumByGKYQYaQUAYMPETEwP03TArA8MA4AseAwUFZ2IgI0/6IDAuBARRdEwCQEFIzbwRG08dPJMqey1x/nufqXzkEocA+lVCL9CsO50n4dT5CKYcIaDGV0GFcyGlD4yeYo06Z6ft8883VFTlqWzqHehXj+7Ud3EOOCjeqXCsfFY4YXQL1vJ1XtMNZsDDn3P7Suot3ndcK8atPTOcpR6jdGGqssSU4UOUKNJWylewxLUcWagClmIrt5w2NnabKoxvGG1FOz/z7aUGiS9+452p7lzy58H9Dal//OUxOw9NDYwfvMNPJ7b1bbv+nPvMQLv/7dbKYSoB5grgCGK8NidvwNxhtAAmAyBaY+AFAyByYagNRntnRGCKA+WUBQDSlDRAIAlGk0xQIhIZ3miLciMsm5cr1925TUvpSUPqCZIKSECgpEQwwSpCAkgZPtmB+LDC6oobMh0EVMAdVEsqjWKKj+FRSeRlstQcsiZzHMKZIz2jDY6DQWJsoCwgErBDMJAqEwQ5eTQdDGC3ErVkzWKB6k8nBy7NNNJJ2xiZtwi3Ow1RJJqsrsUf9TEOtktey+7Qkf7d1Z79WRnWuKl5zV/CmlcUfjFoyVT//OUxNo5zDo0fvJNEBV9Hbz4+YhbtsVHmOiqAFh9/ttrDB9AEMCEDcxAklDh2GDMKACQwHQkDBOCrMAIC4wdwajTYF9Hg5BIC4yg2Xw4VgoqMPNUYpEQRRImNiFS12MxeKXZ5/L8DW6zuvROsLBUVE+jSk2DpM0LbFU+QkrQLyMzIGUcSYkcG2xS9QmmE5L7qPUZHkowyjGk6ODAlgWlaUJKEOoFm4ZcoaonKE1vNEkWVXlt4ue7qu3KJQWc2o2j1lmVEEtbehhOMIKpNThJ5ZXxShqFKakfBEstiBTYRlac8pbfCmta2qhF2zuqmnXp//OUxNU5G6I4nvZSdYy6pvyVhqkM3oxYstzseLUC//f7XWmEWBIBQfQA10ZGhGZgPAxGBKAWAjEjAnAlCgbZpXiymECAYYCwA5kySsLzAQS5ycgX0l2WJCIKUDZiln+tfhcIlFq/m5k3YjVW8TEA2jJGiCciyNA3B4pg3AzmtwQH5klwZMI2KEE0QbNK5MwzNCdlJgRrk4gQr5e2ikksdZpAJHQencvFETm1YZLY4hyMmV9IVg+3iTpa+sTTtpJqVvh/B8nsfGGV2KPpl4JoFSZ11DJFmkWtYwmnHtKeVP8urJLcTqC9YhS9rTXyOdfw//OkxNM6JBI4fvaSddlGT/mSwlhJKEVOtf60cqoPwS9ERnUBWI/++ttMIMB4wMAZTCvUGNd8Z0wYQTDAOCXMCUI4vuYMQbxlQFRGCEA+DQADOLcqUjBzhw4ZkY9WtksFiwsEQhz6qIAgkGzCF4MowdKCV5khchZPsjQiTF0BgQsazbECrZeLawgmMLJmkkC8TXanSGddD8qUiNCrCJQpBJVujW5PBozKMM0dUYm2ovCM/NaC8mN59WSV+NZcVo7BOLLoXX+w2c0894tUI+vOVwVxqGJ/dlDpTty13V45K8r/IXfS+QhWMx/80thaC4SXrIQ2ds5tfYLYmuxk/Tq2lQQ4fX3XW0wmwCDBCAlMSsZg5vwZzC/AEAwVpEWaYIQC//OExP03E+48nvZSbUYW4Y5hQG5g0DQuqFQjiw0GB3daOYKkHEiwBJSoGKKKMhGgUUqPJFJPhmeRgMIgFHRATmxswP4WMFUYjYJF1oI/l3KmjpLGZxxsSDLduaVSQIGaRbrFxUusVhKRZSeskGMpJQG3Gk2UUZ+ULjNeFzvqwVdPx2lbYbTagk3GSJl101h1WclpOqM5/LnJOdalWM5HEf95VSzWfNVyWRlLZTpr4o3FfXwg3sqlTNK5/OVbGpLS//OUxNM4bBY4nvaScftR21I7ngklq7Wx+rSW0gRN9/9rdIYUYBpgcAgGI6nucv40hhYgkmBYFsDApzADATMLoCwz9zJDBFAVTGICr/SIwxFgS9zIwg5g3NN9ErqlStUTKhQxoWAXkfXKKOrRRyU25SjErsTXieJwuDTSYmPo1DQoOBQrNQ+QS1EwaImrOoJoG04yZpGyzkqMsstNsRJYo0SzPPmTO2XCyK3NIMd2G3TdqTGkDPqKnvIt7VpQX10G6krZPrU1HpIGZTlFN2eCpGgjutCE+jMIiq9oaapJhVlSE4TjezrLjvzJbKEr6K3R//OkxNQ7PAo1HvaSdZ5Pe3OeyuUY7alw1mHueM7W3V+lrKoniCcO///a2SmECBaBAkDBfdtMssm4wEQazANA4MaMBsKgfGDaEIamglYKEFKAHxwBJ53JBo50mYGPihjFRZlZQChUTgdcS0R70yZvotjDzJqShppHDdDBkqgqL1ZPdps5ZJpW/mGoaqUtmtjUj8l3FaYs8IABZw2wcfNnHj+65ClHSlgRMRR5pYPLqhvbiSNW30owrEfLIJnnmIqKtR6JVP8pGOSIuvEhRK6ppoqLO6z5R1cwpWu1Ial9d/PylXtqi5KzZrGbCLKZ5Vrzk02dPXanjKMRZm3Su1udZuUs9dwgT0xr7AVvW2kqBm1/1skhg6gZmCGEoYcTpJwe//OUxPo5zDo0fvaMnBMRhQAwmBaE+YBQXxgAgTmAKI6aupE5hOgPGBIAWMgJoCWTLbh+KGAMC6JALsukTF5ulgG2gjBoAD61N798guE05VlKIfDBKatKOUIUcbriQ7RLTsvLvE4eBLUDuYi+AploZkNKvfXXWH1ky1dVZUuJFh5QtHrr+w7SB++3L5b2lGNaUpMkC6Sw0L16UGo4dWJWlNFttyYjpeOdiTjloYep1c7KQt3g1CPOybpe5DzHmNZ7hRbW3Ge2KhL+mzOzS9RUOUf3hX9S254QZvCK20x+/hkEi6aZiXfKLgM4jb6220wS//OUxPU7NDowfvMNGEAUwOwIDE4HBOWoG4wtgCyYCYWLRgEwcg5DJeLqMEICEwBwCEhFbqKrZfUwCAHB4CqGmoEQCcQa/AsONxFgIKSE1N0y95ROS6erCWFEjWiPT9caHqiqyntx7rjTLq9yuHLK7zQq3TGJwdqXTubRDJWUgSDViZpEjR2lPmmrWzrLVC0ZUz/vZ5LM96g6OCM9FZeFGoN3xBbTcVtaaZhTMc3ylIKXMZk/O+E4Um2fJQWJ3Cuif++KroZVE3vfTPTkLh5QJHFJprjCo1Iqngrcj/9iFZud1v8SJgnv/vZpKYKIABgZ//OUxOs39Bo4nvMNLYIph9ILHBMKiYTADRgKg7BUIUGAQGE6E+YmBkYwBIttE9+YlFX0pRCCMrxeYoAAnFLZfee1ngsAjMSv9yyMQ5+8LYpE4fe8bRkThxpoQH4kxI023FceSTESTpFh602VmpnjCT2xkgVqKFolEyDI6hxZPMVVuSOVlpbrlcQ/xlcp6k6fktLdXrY75anpuK0Y0bMFGmtMxuFU9FFWZ5GSQpKU4ti+/725gpYkZfM1rSmZWvxscuxDyh0ILxZG5ea6NsNQrwQZUxI4tQZYf/66SwwcwLBAECYKjjxl8ErmBYDUYEIF//OUxO407B44fvJHPSYtoFhgagcmFgAsZ+ZWRgqgMo0KXTzkozxp/jmEjqquSiRnQVThVCsCSuHRwAxC9FXYYHD04yx1pcPF0SAVmyRkGUZM0akhT4kkjwVpgmHE6QGiRaFh8dFRdgjHSjkXLKHTDZHhFm6lzd4vlLGFt0j8HvNeKdJCcyio30++4yddvkqan/6ThBSof0lLay7ctCX3U5VWJ5GMo151V3OONX8jKXy4KQxuoxVknBPv323GZWHjVp5rcJLx2o+M/5z3ZS6nUmsq4bMaAKQVDG3tkkbhhUgmGCEEOYmcExxnlRmFaEcY//OUxP05I+40nvYSdREHaYAgYBgKALGDuGobLgZ4CFFCACi+K146gMbor0gBzVvpRGAknjmvRmsPZND1Q/kfAKUrWiPEbGkJaQHB5TI2DHS6cGVT3fjqudNIaP4iyIk4HSKcmBnJNPja2DOFHFiUSH4ou+5MoU+WnjqIQI24KSyJPrVugbOm2WCESDJCUpO8OliZNSZcJSoiyBqEbrZu+e+WlLQcpue+bW2RidOq9Zd/Z2a/OiOZ/K6z6p5RrKpIxI7HxLIPSpZ5Hwj4ZqupzzlWamSIqgJ4j/77W0wVwEAgIkxEx6jkTCLMKUA4ICRF//OUxPs4DDosfvMNDIlUDAcmBWGeZ145JgwgPAoAlDo9kjVWpGWBgBo0BkuRBETAMW5BZ4qisV+FzRdydyFx4PitrQIoiemiECBUuhGWIlCxCJEU00BEQ42AQaZRhgwiUNJG3jho7k5mEUYHysG42k5olWZYR36ypyGCVhBIVwWqwwoxsoeJhRqnvnFzk16CaOSc8MfpBKi3PKPAzJRLjXRwspNlJxKGdIt6Mgt3JXlSWg6TerN2nuF32m+YumK6Tn3DGtb9BGylrmcrbnPvI5NfEdLJPLRsUmcAaH/92tlCAdzAuBGMQlGk5HRdjCzB//OUxP05u/44nvJNOTTAiCeMC0JFKYwgA5DIIM0MEYCUBATBcAlizKUP69oRAjF0mEX0kd857Y2OxWki9HArNnRldajjayTABYLggGz4cWkHAYSQPkbQmWSITIrEEOSnAyzhlJAPka50arbq7dLQ1nUdJ1lYLQvuis2P1hmBLNmWRooNSxBMsyUTUzIBBlVL5NTYu/81larustSSXMeW23JGsxVYmVR68hymxTEcQTxs+QQl5lcPCTwzWxTvsYzPCnc4rxFWs1SJOObMoVOPSJ/NtdynsFrlBQ999rZJIDQJwQE0YH76ZnNlMGBeDWYA//OUxPk4ZDo0nvJNLKBUYyIA4UAuMMsLcyFDuzAKAiTLMAAAhxWiJEPE8xgIgMDwELvO6q2tKru5epxLKaVyk5CEur4B6YZYPyycoxALacVKXIPTFl59hNeEc9aOW1wlOmA7ol9TdteSSeeGwVbH9AN4B9xBj3R1BqBjpKNG46u6SBwI0QR3SaHRyH5n+llr1UoPae1nhOmLIG6nLX6E1EP2RvVl7FJG8I8GoXieNhJDDHuD6qPU/KjxF0crvflWfUWxOJ8FPzJMm6bUs7ZbrLtL9mBaotUPb72yyOGBwCKYKIWRiKQFnCcUgYVwNJgU//OUxPo4FAowfvMNEYSZgnBVGAqCCDhjTUfL0MHUA0rASMAcAHTfJhMajAJBJKAFYFWFdWB4KwryBy7MahyE4O8cAlO+RDNMdIA8B0PXMJGqj8ytOlRaJJ7TMuxi/im0tZHm5hWjsTh01BReeQFkqLkb7y7M6b++jhivA1jr+0lpzoGcYeK7z62E889g53IHn/gKUBG2926OIHQW06RZRhNtcD0rCthaaK4KrHL5tqcnmGkW0zFPHxcKdtM+6zfD3h9p8r9sy5ag9HJZheEqLTmpPQdu8Ze2x257RQlOVQWJn/77a0wFgCzA1AMMPgf0//OUxPw6lDosfvMNHOL4JIwoAAzALAIMSIAkwBgEDApCGJn6AwL0IAOKIsue28reygwTEjtq9cse5rzaPAnIy9icQtw1BTWIZpYvJJK3aGoYyjEWrOmhd0kZNNYocC75DUzdtMlWTzVGEROq6yM/VPS1sjUirmMMwkuWggMKqRqTUkaEXTQtkafm5fotTUIGVZfDK660evJN0nlcn12oKypLzUOxMTWWbtuVLoUWqyWzTC0ZHb2OUqMwxirgolD2tSy3lmeWZmUZ+vVp6eKXNvYzZV3cqeNQVWxmoyjGvOtvwhm9afvNZQR4f/7bbUIA//OUxPQ69DY4nvYSeDDAxAvMQA5w31hKTCOAOMCkFoEgul4zArC7My8d0wTQFEcQgTOXGwbLDII4PCfmA7VSWNOljFWvwVKIPpBAI0QXA4VBc6ISSAoaiojoMLoWBSdBpHFwkT1EeEZCUswqnxTJMwjmanZZSdYSNoESCSickDRolTTNaqjPpFrXJ2Y1PUNPVc9cmgj1EzJJPObSpNydyvRFW+5bjnJ7K4vtHzMK16mPaRrmGIQp+bmIbi5E12CeGtVeJWzzPWRbmd7aBJ0ZQrcmuxUlGGZ1e1DIMe44lKn9XanOqzWN0Q1fagOIf//a//OUxOs5XBI4nvYScclCoCwNB1MEhcwy6B6zAYBYMBsBkw/QGjAhAPMHwLgxNirjAeAjSKYi7z6zz8TwqA0syQV3fvSyvlDEhlWdM/sy/VWKwuKSccDdAFXZVJWhliBIOl5omEh6ydKWpQOkPLMISPoVCHEJhHBRRLFpJIJnbSMObN2ylhv2xpJbk2lrLvM2a2Z6kUJrQZOQpatt6/jhx0fXrrqXWpRTnIhzY+LscQsKuhElBJrKWbxKM1nabOUOLLa2X8nDBGvd1g5QhRTYBBWlXIVootjUnQip5YU6AZiP9rrZDAFA0MDQJEwq2CjX//OUxOg1ZDo4nvJHPOR7TB1BKMCAIcUBwMAwAowmwcTIkLrMAICBIWGJmObbtUMAMAkmARY0p2ozq9nu82sdf+1Ml4qonC44Oiwn2olHVkLlChHRapMyrxgwP5idnkxDwlgjs4mXrObXplh06s7oHrxXXpLoayBZftdalMzA1VQ+64txnMtvr87MlBgrVdNqLqWzL+WiTC0lPpzprJj8OycsgyAJmmjtim6TPRZNbr0mxngnOpQrYpF4Z7uTjaeM0m8/s+3mobd5z1vuu7qiu3V/mc9U/6l8Z3X40rUAh3391ktMAoBAwTAOzEZJaOZs//OUxPU4XCI0nvMNHS1MLkBQwSgASYhkwBgJzBoAdM9ccgMCfSwZs/Euhx05AMAWz8AOIojez/pVBgTTmh0TB/0kS6fnRwfLUtQ5LN9VQDxqs/QyRgsgKgkChzwYkTAJCgDIsECyA94Ki9YGVl/TsPILYuUSgwjkZSVpEgSPONg/bTzE01wrbTRZinXMlZecov98h7ptmpjam2ialyvzu4x90NuXv852fKg85aCNYbJz7/Es7nP3+3L4pXLQQKZ5fdZCDp8MqEa9ve3R5N7cqX2do1UAd4++2tsHgjTBCBGMQk8k4uxRDChA5MCwIIwM//OExPY2VDo0nvMM7MHMwDgLjAfCWNB4HYBBsiwD0lhpwYUtFspMAKTAJvythoVmn/NrL8SH5VtGGkzwmDYEAwCAUFB8NiUziROebLhkibXI5zXQwfB6kxOCJ5GAmNGEJcoqhZbRk+OgutZgYFSbYqya8z6helorKdRggthKPWg3BWea4WJyBZd6BtE2sYU57knop2Y7iCjbMO4S5MFMW265+eDUplk02NQTj1bmIJ2zcrk4yxu66BLDUrRy9Lqj//OkxM85M8I0nvJNHaYc/bz7mPWszwVdes8AJdI4sBk/jpkS//W2W2GEgBCFgnDBRdFP+5mMMxrMAQmGpuJgHMTTzPjaLMYQeMBADQGuS/zCW5MxIAavyB8Fh2QzcarS17YdsRm2KAVA8hOiFsFkIGg2IQOOqkyFGwTzFYZxeZ1JqDKgJE6vgUEU4PXWMr3baqxjbQN0nIllBKChtLrNVRxMvSqq0EdqfT02HMu6azp6/F1J1i/RKqNP6JHDvY1ErFpGyrK2kcYvURsmiOLayFRN0KpmUfMrSKcpIVESrW828taTCD5iolbOJKzQSuUrna9Pltz2f9sVKq8Y1Lwltx2V+eS2EvJmMFFbC3//+9tphOARmBeC8YTi75rNDtGD//OUxP06BDowfvdSHCAomBOB6YFAKBgJgBmEIFoYWhcRgIAQpVOM06KqLXIog8ixk/jA4JiuWJNLwknCGTBJDrVaxt0hmV3IaKj41MCvU89YXKl09KKVSyeHqU/ck2MB3HI/oc0VlWzOqKE6NAXpnBLgwxTr0RaYoT1pJhZLOBxoeTRhAYAhg4WmeNdMwJBaCaOV3MOmtwq0rHm0k9Pl41KIoIy8FMYpHOQ+uhlJnuec+lJ66k9TouYk5NBP2nTl58xKy4ZoXysiakvEWZNvMF3mqQtJStg862PpA9lE0f7LbpIEZ439tkkMMABUwSQA//OUxPg6rDo0fvMM+IxQi1TqQDSMNAAkFAfGJAA2YBwExhPgxmVoXmYEACjRy2MdkKq7w0BYAhbjBkYUcgF5a/JZI7EQf+GLMtfuGa8MTLQYs2r/P+4DYo8hFoabElIiqYNIdpybBAhPmJNkSwsySrAOiLLqzWlhrzYbyLDK6d6uWbu6PLoXRlbC9zkswppCksdRaiEJhLS+ZskRYSKBqvsqEpwYQzAhh1LYF4XcjNYpoiojEbqZwbaAqCMBMhQ3GxT1nNiMdGtcnen6OoSsMHrs5qYlOiTYzPei2z4Diy4VBFpd/99bZAEKIYGII5h7//OUxPA4HCIwnvJHVRxhxFCZmFYBQYEoHAWA/MBcCEwZALTOxFkCAo1PAYAKHYWvR/2ogQANIN9KjUJdIoht2GLto/85G2zpdMJHVRA2iERtGCiIsfECGBU+I5GjiInoikrEtVoLV3jkkZok7NoyOi4SKikzr4UtIhRrorVhhybclxsyq7dPqzMQoyBp67cjvXclXPG4YojhhxkxZlx9z1ypQ68fDpd0aY6UdpZItAwRaLUvCrdGmZshJNHzj+mxtxHup4VFfJx/ObXMNt1Rxs+Ohb2SzLrG2SIAMpiZ//12lMHwBoQg5mC0rEZlQ3pg//OUxPI268o1PvJNGUwIBgJgKmF2AMW2GQijNIC6ME4AlEYsq50tMAMApiLwjoCyV0NQIAgDETFLFIVAKiIIC4/J77BqEg4nYkAVEYkj+aH4iLDFOoQ0w6xp8dpGfI0dRPOyomaZXPnkKT7QGG1OIUr3aduxVWOpHVhTLeDT52JeMGfors03S5pmtngk0iSR/ZAxI+x5MrHYrvRBEWkA5Nzw7vQ4rY1inj4adC6gcWmdzijk+aU2n58loRR1vmV39z51kiu239zJecMVle3mlae9ay5xly+8qrij5P1VB2hvbdHIzC2A6MDQKUww3fjb//OUxPk5jCY53vMM+QSeTCBByMBoJkGA/GAIAOYMYfZmsl3mDKBMYCABJjRJ2hK2sodpbVC9b2lxYOZ4nA6EbZZDkkrvu15yWjPu/rMKkOQzX1vtA8sooZVLaCQwZSwMkuyhh5RRKwQB2eaRowoAKIw+0IPCyDmEEQWcB5cgTICGHJCiI8EEDFpgSAtKLXXjm5lBSRe9ckIstiScu17TmMlsfG+7BsVM1pxXPSmbzSbrg5BHvDnYvMk6gTTJOpiLp2nE4YplVym0buutZu/b3DXi/OPJvQiU4oxy7oWaygAheIj/77a0wdgDDA0A/MPU//OUxPU4264snvYMfZGN8kKUwiwDgUDCPCiAIAEwYggBCSkAAC0vmsvtSuwyCBGtto6L6oBG9bHBcBCsQGxALVIRcfrSyaQkEc7XB5CCMGtElLKCS20tMVMb8REg1K42WLGBmdsIaEYoR1E4xl4I4IDh/cpUvs0jaXRrYVzz0Rzq6Cz6JMbCxVJpXnezJKUjPkzHPmjUhKiOMba0yCw5Y1U81MlEzjugd1GmEUjFqTTBE0iEIlbaMlyz+Jcua7eZL3Gm2+1WW+qxWHeU9eGVRmCd67yJqddF0cO7vrvsufGpVQQR4j7+220OEtMCwBQw//OUxPQ5TDY53vMM/PM004XRIDCVA3MCoGIwIwUTAMAiMIUD8yfCQTAoAKRTjkllckpHyKgB7L35hkDwlEWTsdEO7BaK47A2IokCApHMDINjFDYuXTElSibJRPHtlflnlTi5Ey0mvzo8Or1x0yYFdYqQnbPO9G6nqdrlo8uH57iR5aRMsYaxJlGH7GFWogcUgiNmQka57qdbuvMWWRToG0G+8wzmY9aYCGxznQLG6NsmqSJcspRDKmEY+fG10cOnFdF08koi3tXF13XEMjORrWVqqlk5eGf3K/tmWZGmygq7QyKLfG9YWgRfv95JHIYc//OUxPE6LDo1PvMM3EBiAAiDCHexNOUn4wRQbywBAHD5mA6BCYNQM5pLimDQaZEAavaHdTjE2UooIxU6W4sAfRtciUBxpuMTbg/z0zcN5u1GeyOtBMjjb/SzKA5TQXLUBQ3JZrte/L7NHb5VtPRWj8Pw/ZpsqWzSyOhm6W9OYs6zsRhTtBJi6TWh+ObNc4s0mqFE5MK1SSFwsLSMq7WXzsI9kaQLrYITlh3kt7swmqSajFHl1u4+85BNGXqMuUKZoT85RqK2prJQxwzXMbCcAd3FvXaS7pApbHc/uHBVYs4scUSd5B/W3oKswx03s2/M//OUxOs7RDotHvGZtFGfBA2eP99dZTCiApMBUHwwklqzTSHcMFYEkwAwITACAcEIBwwE0ZrAihgrADhwASarvWI0wGGyQA6TQG9KecQmNWaOdeyVX5bL78N3YnnUhx/qFpsYi0PYS+vllHJTSQLeoZ6WSyfs0tPEKWoODc4imemeAacSiF6IzBZqc2YfVzCWLJk66gU3DkGInSuDUAlA6LXLtZQIglAIgOnksOTcFIDtMxOiLrLMou1BAIeSuDGzxtCkC4JJolfDDoe2bCSa8K+vdluz40evfb7cVN5fo7E324xjBIEljeHqVRlEbNSt//OUxOE6/DI1PvGTmTzuRHE4xqG+3TfTBA3h/9fZJTCOAXME8Dow8isTiIDSMKABkSA+CBYUBhglhYmQeRmYGoCSKKTbwyKHWQQ8x5WiI5pBxyOZ1XntObAMw7xsxEwjAgyIBKiWaJwUJCJGDCHBlUB0Q+3FAIYhVub29PIGFRoghiFKazRNUW59OMkb90yw3hw+jHxIfp5Zem0psQnp4459lqbdk1J72fpyRzNeXe2U3et0q8xs7F6fXKnwVH/bbqY+xy/tY7HNjzjz4xonq860ZL07f3Ml73rEYjEbdFVvpAXLxMT6T300cyEApmUD//OUxNg1tBo1PvJNGXiPfrbJBYRwwMQRzEYOOOVoScwsAHjA1A2MAoC8wEQDzCMCYMLMtARALl3lSO1Lb7hRgsAIxTUGFYAcihj67/wMwSfrxwlCkMTMaV44h+Xz4ZdCW1N77jLKQUs1tdLRcYs5zhSPSXAtgdOlLjr3+bOHUJ2ZHa9944Ly3m0WIzbWGIjNbrv3WT8vns0BzLZMQYNQIBvA4x9iBxl0YAblRVsn5RjoSFklGmHbWu/s8uyO2vsR146bUe+6Vfhd1ulbra7bz2xjI/fmN8RS7SQa7jMNdDPKGNvqNMbSvvat9sce2gSS//OUxOQ4bCYwnvMNGR4/+12tMFYBIAgqmDMnoZsAy5gTAfAIBsSEKRcMFkAsyPBqQcBxA654/fmI/Bzet9LFhlYqbd6lCslllerdJxOVrS8dnwNDShTDotCGlfP/cYVIR+drHfWoKwxaQHF6HBJUMr8dFNbf/uikUtTNQPLKEFmWnaDcyjKdA0iSlYXSdGXXRZVUeyeYcyzmL005NE5B7HEpPVy2oPsFRdLLrYFl1nqqe1MnnlLefuS66w+JzLoqltMUyOJIw5DaKg6kTSX8cvUblkyzp1/vKgpuf7NfcOxPXhygHqoAI/f/22yOGDkB//OUxOU2lBI5PvMM9UGBYDOYVrJxqJkHmDCCsYCgLpgAgnAkCcwTAXTPFCwEgsiYAkQAATkizf+Xt0mKSVO8ySBofnVaEqOS2VUwSOtc4iKZIPDs5ZCglLYTzeHtEJJcZH5QmLcltI0ZF+IYiTJaUemmPpS4aIYmLMBsCecwQUdUnPlBRxWfSSCTtQoh8PJsLJylZsQyZZBsy8J7klMa1NePimc0wpL/HOm6bD5yGKaqQ/3S6jxzqRfcyuZ9Zm1raOzNr3fyoa+za38wmxqmbUfl5TIRft85cYaPIAcKACR4hv9tbZTBkAQMD4BMw9Ss//OUxO02tBoxvvMM8Y4OQxzCrAcCAXSYOUDAICAJQy9hPDBGAHDAAk05demnrcmULNfRUzgtzicvdQAoIgwDMR4msYC5s8dVmoQIOlMgRa8RETYkfqltsk6UhGS2hYULKIDSjpoqgqqo9Gd8+RJVDecaSGMistiaHacsbI2P9c2zAKX0kiTM6PL1rk8cdp9IY+kdp9hI6e6kinb6WkeXn20zDlbS00RnvLmlThSGa9Ztl+vPMfYymt150D3yu1Me365eRSr1KFRJJrdUNnk19YszMimlFjIAAUlaJ//u1kEg2TAqAmMPUt04Cw6jCPAp//OUxPU29Do13vJM/DAmA4MAcC8wCAAjBVChMZciMwHwFkErWuX3VeipDbiQRLkfXPh6R2mBFPqJ1RPEJkjFkQB8Oh1D6Hj8TooR6P1h6dRn1KlQ4ZLTTRJXG5XWPabNQRHRytPIEyVhalPJhOV5gw6cLiukR+mFKZ8xAfcQPCUmRBNGorJGtB3SNFY5I3TiNpEFuHQai6AjdB0FCiaAkvpqQdcppU3djIVLoiskx8LQSwxLUvhmGmfa2ujW485cFVjzcvrZqnc/7ntHOZrLeo1k7untvsMzzqYquJUAN7/f3W2SGEwBaYBAQxg/uOmp//OUxPw6HCI2fvMM+YkvGCmDKQgQDwqZgGgGmEkEYYqZeA6A2XiZnFYEl8rghrNG8TvLQZU+kspDoHSkXyqcDmGwNh3uWSaXXFbaOps6neI9gatPljEBMVQ4TQkgrDiyo51NnHPL5fjK9i27mxuIBw7GywV4X0FdBjz0VN3UNEflT18VbO11eolUQxIgvpnIeEh5fRC5HqNJkjbVSB8nUmeCiikGgxIPiLZ5wUROMpGDfzXulED0SGE8SLwklBFBO7TpsrayG/rFZ0zlIGez7hLdxPW2plHvfd11Jl5C6x6gvxEAKbb/3SNuGDkB+YEY//OUxPY6NDItvvMM/UQYSDipqyEiGDIC6AgKwKAYYAAFBhAgDmbARCYIwAC/3VY9SSZ+KF4oel7wooQFN0EKdJ168RgrZUD9s2X1cFARPh1aARzx2YkR00TWuN+IR+PIitrCBGxLmVWInkfrGIslhw6VxIvYiKa7ljKqrTK7q5vXXJEjWUvdpbTKulfmIFW3mco/bGG6uAs3DrYpWoTd2YXIpsquFogoCigyXrUwlwOwoEcuIoNUOCJvFfDCWr0GrlkLeD4pdwg1FI8opCIOzWQEKZGAIHcnDj6+EVUAAZYd3/uu1tMBgA8wNQPjDoK9//OUxPA3FDotvvMHHDfoDKMI4BsSA6CA5DADALMCwFczFwMhYIpbrrO7fWGaI7DYp2AW6q5VgbtGZKVii8y22ehQPAoIz5+QEDkxpCU2LQKWSOftQtwXETX6LofNncc7ZuzGrVvrm26tO2NIOLDrMrrNFMgjTAtrMnkvBpFlEaCUeaMCDj1IEjl2b9iEOmkREMogRsoiYShAzFkIgVQVoOfhQejSPwGzxcsg1u5qR1MnaVuX50gObn/B7RO0m822zKDaujW2vEePtJeu+9ukiU9IaRWVJV4rS26TPwUAAR5h4/+31tdUwMwBTDyKWN9Y//OUxPY4pCo2fvMM+TNMJwBQwHQAjAeATL5GAkEgZTArBgdAFhgATLXejLU2QsuJgAh4AhS8vqyNtdsddyN08RdyKzUmoaWNSyCvlj/RaW0lPDbzkkS9GgVRE6bxgKiuKQggsRLoNJKBxQQEgQISo80kpJVfDiPVcIUlGJKLuaOKpxQET1pwXJkLjCNV5A2Q2zr4vVTRZFAaeLKWcVR6mibyyGmLGkdLTtyHyYQqL/1GRL3+WbyZFMujiY4vXuYpcVrNlzJedRR5l9w59/NSQ/6ZlVisPNyt6dxL7nRLRNct8M0q62b5GOcHqgAxZ4jf//OUxPY8DDI2fvJNWf2ttAwURgCgpmCgksZxAv5gaAZGASAWHBDMAMDsHcw9xxTAZAGSta9DsSfmknkP890orqnsmJYcslUmHUnQTMsWIKEbDW7AsJKW3rS7VHQ5SKPEiyw4SrndXMsdq9I+eK415j8RxC58pj9beFWtJJu2xx2FLTX61bemJEtJGWd6+hQS4KWkHvEzMIsTpDXrubGJWbNS2KWfE8/3d+c6LF+3SNtu3jddKS9eO6LnHPmZR1NZ//vdrLjCvrqzzykHysdjrSRdiuipp1FXc6UuASDSdgA3tv/9rbIYXoDhgNAymDOw//OUxOg1tAo53vMM3TGimPaYJYLgEBJFQNBUB8wcgajFvJQMAMAdMhksSiLzN2jhEAAi1KcIfkUZuxwtmpMiHslNLDtQOkBeOjEtLiQYElelLB6Xn0G0Z8mqWCCRiaX9Cps577n0K6fZO1JZ5cUaQtYWlzqyGqJIcuaW8RPKncpdJcnLILpmzowSFlpXRBuSYNEW5Me4CgrQgMrnmExSkdiEQMYjPLcwOJGUljxjOWYRA6AXlEni4+7GuSf00DIr9Fgh3MkeTa09KVNSMPqKKfXq4l6KiW4tIaWcljLiWYZYvJqAvQABDt9v/7bKYdYB//OUxPQ6LBIxvvMQ/YYHAF5iRmdHFWHuYVoCQYDiNA4mAkAkJBhGXEMSBgZFJrG7Ovi7bdyUASpV0IzhBPCTYm3cH5kvi9KXkpPK49tnBMJhwnLZgc1iMWmHRKYjKwgxrT4rczw0JMJDJ4eLpeH1IkKK5AhLEo8scMME8sJDaPstObJ7WHyYMZ2oILGWxxOob8hb3xv0icr4LasLUtE66UWIm3ppo+5OZRrrW0lTb4MqQnKaHTqVGosN4yvJecG7jCFN72oXNO4xxvypJ+QelGeXbnYnUmEOJzrq43Xt0JJXNH782o4SxajKd5S1KgAB//OUxO46zDoyXvMS2FFeI//2tlHhtzAwAeMNkls3owzDCVARMB4BIAgGodTAOBhMtkBsFA7MFdWBY1MQXHBIAtA2XVqC1Vry53sZBMxr4g8EWtUEjkQcEx8yFCwAj6YCwRCFT0gZEgpIrFa4JkoNjiQ5jSKIVZFnIYIRKjXLpqUI4vbhRgYSaT8HnGmU5r4VRTUYxHNbBMMGZzQoY4UbaOqNy1KSx6GGHQW0QyfTaDHPZPTyGYlJxfyDyjKfXo9Tu1HR0T0WLJkrNZBoLljCrbfG+6to01sKxVP/lmsgddk/JWGrSjU6tddIqB2Myb7t//OUxOU51DI2fvJNOUnEqgABDd3jfb620w3wFxEDcYM6hJoSjSGCOCaYAwCRgggBiEAAwEghDI2FmMDYAcMAChp+odjUCOUghityYdqEwDTQFJIXG6aBY/E3hsarVKcCyQNDYEicLKTWFFIjCyg2zyyaKx8uiEwrONzUaKLbdICbvmiOUWQqyxQ2+BGm2pgpfy5WRUGGJEL1CBb6UgQh5ogZWgzMgQ8XgFtmFbVeCRRm0sClNkLU236LSmJplMT0hNwzzAHLASC4x+bCb+cmM+sUTyHVSJWKPnM6PsxNPIPwx9fYJ7S6VNcubjc1luzu//OUxOA5FDI2fvJNNW/7qpYqADaWiP/drbTDjAjMBcFwwXFKTN4GiMCwDVAE+wUACME0IEwtR8zALAMU1YbAsShmepYar2YQzEsZRxKBiRzF3ch5sSJV8jQ9KFgYFpuiH49SsJWK9YY4+3c7mXTbY8b4j+eLGgMMCqYe3btM71sQInsx0pApyFcZNOdhoUOAyiEAVA53xOyoGWYCyEaqjSZBR6P0Fl8PguIUtzAmfNfmpI/SNMcNJvJKsvbhKIJVh+NSPWc1nIxj+diEy+Y+poZCHNJlEEJsE3EHczEKYpVcKNL2Ead6xSEIk6w/pbUm//OUxN44pCI13vPMvTTXUBDaAAEWId/rbJLDDZAYMFcKswgUGzgYF+MaoQgweANDBWAWMAoCIwxgqDHZIWMDADQwJADFoSV+4XD1EzCzN1tzbsvpGDko3LJcHEtBAJsJHOV5ZTNUOEtESgePHMwK6xDOHFmFtsuxqNePOjj06fPIIsupjuvWoT3nllZ1NjuJuJEudYigxGtorW1qlpTGmJpOP1qt2z8V9oz15p3tZburD9f7f5dPXy/S5X4YvvMN9hjyrtcpv7/5BeWepbHt9ljqTnOZldh+kLj1OnMXOtNU/b0XxfuRTPuR02ltb3Mt//OUxN45rAoyf15gAVybZRne7v3gNQAAAUqEdUdTeJ6/V6JQ4AzEZFcPDYBYwbRjAFBaYMJDRmrBJmCgb4ZogUxgEhYBhgpgng2mHQGKYgALYsDcYggEZgmgMmRmDCYJgGih5gIHTrDqZPOd3Mm6tZpoi7D8tf/CRxDADDgJGTIQc1pGpc5fD9LSxi7O5HLPBpAUZodGnMhsBJM0kfp2VvfK5q3HsrJmZKYqAwsx0ZMXGQcR0tNIfpIxdsU9BnWkGZigQowxMx4aMUEg4QTD+5ctVc5vVDMz9eKymmww4sAXoMdEzDQlGtYcEgIcBmKB//PExNpX1DpHH57ZAFrv5d7hz8e4b/WdfL9ZczwBQI8gCADAAQOAAEHp90hhIKYGCoVo+a7+vxvf+XP59nPH//n813X95jv5S08BAiABglM0hkhaNMOFsTUDYOgAZZ+O/vWNcuY833/7+VrHnf//////////////4uxdjqMvn7Cx13wPDlWXrEZxAkvpIou9ncLVCgCwCAaAWAVwvEwuFggFAMkQwMSGs1BtYD/g0FMDFjWkcyJL/zEwYtcX4YP/g3lBIIBoYBGiUQwlwMIbAzBMCQkPRDkhzxnB1eAQDAxRMBIQAoEJvIkOSQEoEr8L5AAgAMGEDkROIYSIaWi8XjEjvw5ELhQyyTRTDkQ/YmjdqRRMf4WHCPiaEJgblByIZZIILNQTWiZGSziX/DLoWgikhcQvRNwZGDVxASoH7COXWtS1t1K//FAjMyiISjlC5i2UiBCthySClAhoyv////+IVIcRIdI5QoIXMYoDHDki5RmVGIs0coXMQaZDLExB//OUxO06u4qDH5uhQE1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//MUxOUAAANIAcAAAKqqqqqqqqqqqqqq' + ,anchor:0.06051552 + //_tone.N_Gtr_1_C2_HardL1_R_ + } + ,{ + midi:24 + ,originalPitch:5400 + ,keyRangeLow:52 + ,keyRangeHigh:56 + ,loopStart:91483 + ,loopEnd:92687 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:true + ,file:'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' + ,anchor:0.02257182 + //_tone.N_Gtr_1_F_2_HarL1_R_ + } + ,{ + midi:24 + ,originalPitch:5900 + ,keyRangeLow:57 + ,keyRangeHigh:62 + ,loopStart:52608 + ,loopEnd:53961 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:true + ,file:'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' + ,anchor:0.01288790 + //_tone.N_Gtr_1_B2_HardL1_R_ + } + ,{ + midi:24 + ,originalPitch:6500 + ,keyRangeLow:63 + ,keyRangeHigh:68 + ,loopStart:72549 + ,loopEnd:73745 + ,coarseTune:0 + ,fineTune:1 + ,sampleRate:27778 + ,ahdsr:true + ,file:'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' + ,anchor:0.01018792 + //_tone.N_Gtr_1_F3_HardL1_R_ + } + ,{ + midi:24 + ,originalPitch:7200 + ,keyRangeLow:69 + ,keyRangeHigh:75 + ,loopStart:43791 + ,loopEnd:45175 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:true + ,file:'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' + ,anchor:0.00309598 + //_tone.N_Gtr_1_C4_HardL1_R_ + } + ,{ + midi:24 + ,originalPitch:7800 + ,keyRangeLow:76 + ,keyRangeHigh:91 + ,loopStart:47695 + ,loopEnd:48334 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:true + ,file:'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' + ,anchor:0.01004392 + //_tone.N_Gtr_1_F_4_HarL1_R_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0260_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0260_JCLive_sf2_file.js new file mode 100644 index 00000000..4712cfb9 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0260_JCLive_sf2_file.js @@ -0,0 +1,380 @@ +console.log('load _tone_0260_JCLive_sf2_file'); +var _tone_0260_JCLive_sf2_file={ + zones:[ + { + midi:26 + ,originalPitch:4000 + ,keyRangeLow:0 + ,keyRangeHigh:40 + ,loopStart:51244 + ,loopEnd:51779 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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bgpTAcBbMGgDEwMwhv///////////xkAwwMQNjAPAFMAUBYhAjMDwEEwEAOSsCwwOwZDADAsMDsB7//////////////zAIBDX2YDQFosBaYAgDYEASMDcEQwCwMAgFowKgVQQA6YGAD4hAsaaYBYEX///////////////////5gOgEGAOA8YBYApgYAjmAMBWYFgAZgOglCEBAwJwHhUBcv8CAHTAiAbMAYCMHASGBaCMYAYEhgVgFGAgB+OACmA4BCAAAgIAOSgKGBOBQYA4Eg8BuYFAJNMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.01548753 + //_tone.Jazz_Guitar_E11 + } + ,{ + midi:26 + ,originalPitch:4200 + ,keyRangeLow:41 + ,keyRangeHigh:41 + ,loopStart:62836 + ,loopEnd:63312 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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f4/tAtWlaw67pbP38319fH+Id/aTWq6vHp741851bcu9UvPmbZqD6GHUM6SVAAAjjKJlKrkkAwEAgENTtGbDO9gtYyFBszMscAYTBtgmswCYDKMMbBRRIBiMEpBgjAZQCgwJQAWHQCoMAuizBYAMDALAAQwN4CEEYBG6RCLFkmR3nBgjLusVEAEwAYaWJxn5mlfA5uE1RMz4cwCcFLUoS//7gMT0ABalny/vaYPq/S9mPrzwBTINDprGpDiMyaEatAvMiel/ElVUCwEFLJgIuvw5rEAljdHijkaJonyFQlGsGsBVCoEumEHWBFAlEA1g4UQGqJL7NcaBAeznnbwxvMsV52KOpE4uc9eRoDazTinRVmcNKndv7/Lut7xh+u87b2YvA8olhnyJaoywgibmILAJQWBRkgj65a/H88LWdStYjjuOpXlj8R+fo5KZQUhJMeDHkhgyIGPkAUx4N/jHh0iv7r8M7+OX3dfX+LwPjK4vKLFmOQJAlqWRSuAiA0fAAoFGB0AYoBApigidIGFjRgEiQUTQZMSBxq65byxy12tXyv4XtY/3n67l/PtYzcvgfOXxeprlBLIpqWQ5X/cll8Xxl8Xw++zuLOI37gNMiTXLzOIq77eOG48Ra/RtfkTuN+6DiQ01ycpwlwmAdwdQdg9FYQAAAAANmHX5DoevLcLAAaEP+ZFBnuGNyEYK//vQxOWANLJBN7n9JAa8uiO/P+IAtz/f5jvqsIbpTA2JUkoAF/mf3L8eKtZSVTX/81rw9zQvgWN2EZakmpd/+bj1npi1iYGY8y6cGEicAwzHoL//8yLFOTbIXpMvYPIylFAzSIDJiNjPGz///mVyikYRAPJiXlGGa6eIYbJFBltlCay3rLv///5hEgDmDmHoYb4DRhvC5mBGBEYKAa5iUCq/////////5gLAwmEQD2TA4mBUDWYMQApguhTGAIASYCoLRhEhQf///////////mAeCUYOIMwQDMYEILRgqgDGCQEWYAYBRgEAlmDsEeYAwH5gwAt//////////////+YGAAJgNAomCYASYHYPBgBAGgED4wawgjADA0MFUFAwLwBjAXBIMEkAowMAazADAMCgG////////////////////5gxA9gAC0wTATTAuAPMBQEUwRADzApBgMAIBEZAuMF0HYCgTGCOCQYGICRgJghGCGAgYEQLJgBgJFgCswWAdQQBGYIQI5gZANmAgCCYIgCpgOgpGAIAqMATGCuDokxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.01793651 + //_tone.Jazz_Guitar_Gb11 + } + ,{ + midi:26 + ,originalPitch:4200 + ,keyRangeLow:42 + ,keyRangeHigh:42 + ,loopStart:62836 + ,loopEnd:63312 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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f4/tAtWlaw67pbP38319fH+Id/aTWq6vHp741851bcu9UvPmbZqD6GHUM6SVAAAjjKJlKrkkAwEAgENTtGbDO9gtYyFBszMscAYTBtgmswCYDKMMbBRRIBiMEpBgjAZQCgwJQAWHQCoMAuizBYAMDALAAQwN4CEEYBG6RCLFkmR3nBgjLusVEAEwAYaWJxn5mlfA5uE1RMz4cwCcFLUoS//7gMT0ABalny/vaYPq/S9mPrzwBTINDprGpDiMyaEatAvMiel/ElVUCwEFLJgIuvw5rEAljdHijkaJonyFQlGsGsBVCoEumEHWBFAlEA1g4UQGqJL7NcaBAeznnbwxvMsV52KOpE4uc9eRoDazTinRVmcNKndv7/Lut7xh+u87b2YvA8olhnyJaoywgibmILAJQWBRkgj65a/H88LWdStYjjuOpXlj8R+fo5KZQUhJMeDHkhgyIGPkAUx4N/jHh0iv7r8M7+OX3dfX+LwPjK4vKLFmOQJAlqWRSuAiA0fAAoFGB0AYoBApigidIGFjRgEiQUTQZMSBxq65byxy12tXyv4XtY/3n67l/PtYzcvgfOXxeprlBLIpqWQ5X/cll8Xxl8Xw++zuLOI37gNMiTXLzOIq77eOG48Ra/RtfkTuN+6DiQ01ycpwlwmAdwdQdg9FYQAAAAANmHX5DoevLcLAAaEP+ZFBnuGNyEYK//vQxOWANLJBN7n9JAa8uiO/P+IAtz/f5jvqsIbpTA2JUkoAF/mf3L8eKtZSVTX/81rw9zQvgWN2EZakmpd/+bj1npi1iYGY8y6cGEicAwzHoL//8yLFOTbIXpMvYPIylFAzSIDJiNjPGz///mVyikYRAPJiXlGGa6eIYbJFBltlCay3rLv///5hEgDmDmHoYb4DRhvC5mBGBEYKAa5iUCq/////////5gLAwmEQD2TA4mBUDWYMQApguhTGAIASYCoLRhEhQf///////////mAeCUYOIMwQDMYEILRgqgDGCQEWYAYBRgEAlmDsEeYAwH5gwAt//////////////+YGAAJgNAomCYASYHYPBgBAGgED4wawgjADA0MFUFAwLwBjAXBIMEkAowMAazADAMCgG////////////////////5gxA9gAC0wTATTAuAPMBQEUwRADzApBgMAIBEZAuMF0HYCgTGCOCQYGICRgJghGCGAgYEQLJgBgJFgCswWAdQQBGYIQI5gZANmAgCCYIgCpgOgpGAIAqMATGCuDokxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.01793651 + //_tone.Jazz_Guitar_Gb11 + } + ,{ + midi:26 + ,originalPitch:4500 + ,keyRangeLow:43 + ,keyRangeHigh:44 + ,loopStart:47945 + ,loopEnd:48345 + ,coarseTune:0 + ,fineTune:-1 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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LmCIBiANsPBcII8Jv/90Kq1syAfIOwnw+QhCDh8hVGbEeEV//9aCWkpbJO1ZPjgOk+OwpkHJApkHJAmyJlQh/////tq3bpXtb6vN2TN2M02TN1l9OOXDw9OPDwHP/fbJpa3MkcZVG1hnACxJumx5oGckgUBb5/0vS7pcldrEWugeXhKAKJJNMT1b7K0xPVrte2q1atr02ZWnK13rNLlta16ctata17Gly5bWtZs0uXLa1nLLly6tem1ly6wrwoKCXQgoKNyCgoJ8KCgp0IKChmQUFBXhQUFHQgoKOyCgo7woKG/CCgr6goKfFClMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5DE/IAnYiMt+eoCCkMY57ewwAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.04473923 + //_tone.Jazz_Guitar_A11 + } + ,{ + midi:26 + ,originalPitch:4500 + ,keyRangeLow:45 + ,keyRangeHigh:45 + ,loopStart:47945 + ,loopEnd:48345 + ,coarseTune:0 + ,fineTune:-1 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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LmCIBiANsPBcII8Jv/90Kq1syAfIOwnw+QhCDh8hVGbEeEV//9aCWkpbJO1ZPjgOk+OwpkHJApkHJAmyJlQh/////tq3bpXtb6vN2TN2M02TN1l9OOXDw9OPDwHP/fbJpa3MkcZVG1hnACxJumx5oGckgUBb5/0vS7pcldrEWugeXhKAKJJNMT1b7K0xPVrte2q1atr02ZWnK13rNLlta16ctata17Gly5bWtZs0uXLa1nLLly6tem1ly6wrwoKCXQgoKNyCgoJ8KCgp0IKChmQUFBXhQUFHQgoKOyCgo7woKG/CCgr6goKfFClMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5DE/IAnYiMt+eoCCkMY57ewwAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.04473923 + //_tone.Jazz_Guitar_A11 + } + ,{ + midi:26 + ,originalPitch:4800 + ,keyRangeLow:46 + ,keyRangeHigh:47 + ,loopStart:79603 + ,loopEnd:79940 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.02818594 + //_tone.Jazz_Guitar_C2 + } + ,{ + midi:26 + ,originalPitch:4800 + ,keyRangeLow:48 + ,keyRangeHigh:48 + ,loopStart:79603 + ,loopEnd:79940 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.02818594 + //_tone.Jazz_Guitar_C2 + } + ,{ + midi:26 + ,originalPitch:5000 + ,keyRangeLow:49 + ,keyRangeHigh:49 + ,loopStart:79342 + ,loopEnd:79642 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.01945578 + //_tone.Jazz_Guitar_D21 + } + ,{ + midi:26 + ,originalPitch:5000 + ,keyRangeLow:50 + ,keyRangeHigh:51 + ,loopStart:79342 + ,loopEnd:79642 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.01945578 + //_tone.Jazz_Guitar_D21 + } + ,{ + midi:26 + ,originalPitch:5300 + ,keyRangeLow:52 + ,keyRangeHigh:53 + ,loopStart:76203 + ,loopEnd:76455 + ,coarseTune:0 + ,fineTune:-1 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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wimhmAo1WNWqxqsaNSY1JiDGpMaksarGq1Y1WGpqTGpMcNSY1IMBBoFFgwosKLFhTDRYoaKGjRQ0EKFSRUkwVJFSbCVElSokqLJMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxOUD0WD9Q+wkcSgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.01333333 + //_tone.Jazz_Guitar_F2 + } + ,{ + midi:26 + ,originalPitch:5500 + ,keyRangeLow:54 + ,keyRangeHigh:54 + ,loopStart:71766 + ,loopEnd:71991 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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mANs30bt4LXlFYpFE3iD+A4UQKQvPyaJJw0dG6AvLSexikebWMbR+5wWS44TSw423N5ns60juxRQ/Q2jcf/FqmN6yyD/+4DE6gBVgTkrr2WFYrcqJXXXojW04vttKVrC3d5xxty0e7t77l+rfKt0DhkOBaHHsGAFc6aRP5OVQr/44AEKlYVvHDCaDAMMQJ40JCAzFLDhMG8CoxIgpzA5AhMD8EVBGcHGohqcciDXmWERX8FBofphjA0x11rHa+5ZlnATBDFYqFIrFQ8bXM0j+eKQcxzagp9VmWW9Rmmh6jLhAeMDA8ZHjAzsavV6HlzP8/1WoEMVigQxDEMQxQBhg5w1YasNWLmJuJuOMTAcAuBOCcFwLYTgMAJGLmQssZO1ea51nOoKvX6rQ8/0Wh7gcisVisUCsVisQ9DznOc5znQ80zrNA0DkLYaBoGgaBoIeh6Hoeh6Hoeh6jQxQIYhiGJxOIYoEPV6jV6vV6vV6vVjxkYHjx48bIb/N75+9/3zDh3vO8gPKPHjxggM7+7a/UBAAAEYeHh4eYAaYRz0AEldVhCKb9kjCwUEDjj3jkklimP/7kMTpABRRESmvaYXkbLSlaew87ewcZxdItciaAiVBAKEhVTLmWNAzKnWybiAQCAQCROJEiRIkSJEiJEiRIkSJEiSJEiRIkSJEjSJGZmZmqqiW5++VVHEiRKZNIkSJEiRJEiRIkSJEgYiRIgoBAIBCQUkSJEiRIkSJESJEiRIkSJEkSJEiRIkSOmZmZmZqv///+1VVVUzMyajJEKCgoKCQUFBQUKCgoKCQUFBQUKVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7YMTQA9WxVzntZMOoAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.01106576 + //_tone.Jazz_Guitar_G2 + } + ,{ + midi:26 + ,originalPitch:5500 + ,keyRangeLow:55 + ,keyRangeHigh:55 + ,loopStart:71766 + ,loopEnd:71991 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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mANs30bt4LXlFYpFE3iD+A4UQKQvPyaJJw0dG6AvLSexikebWMbR+5wWS44TSw423N5ns60juxRQ/Q2jcf/FqmN6yyD/+4DE6gBVgTkrr2WFYrcqJXXXojW04vttKVrC3d5xxty0e7t77l+rfKt0DhkOBaHHsGAFc6aRP5OVQr/44AEKlYVvHDCaDAMMQJ40JCAzFLDhMG8CoxIgpzA5AhMD8EVBGcHGohqcciDXmWERX8FBofphjA0x11rHa+5ZlnATBDFYqFIrFQ8bXM0j+eKQcxzagp9VmWW9Rmmh6jLhAeMDA8ZHjAzsavV6HlzP8/1WoEMVigQxDEMQxQBhg5w1YasNWLmJuJuOMTAcAuBOCcFwLYTgMAJGLmQssZO1ea51nOoKvX6rQ8/0Wh7gcisVisUCsVisQ9DznOc5znQ80zrNA0DkLYaBoGgaBoIeh6Hoeh6Hoeh6jQxQIYhiGJxOIYoEPV6jV6vV6vV6vVjxkYHjx48bIb/N75+9/3zDh3vO8gPKPHjxggM7+7a/UBAAAEYeHh4eYAaYRz0AEldVhCKb9kjCwUEDjj3jkklimP/7kMTpABRRESmvaYXkbLSlaew87ewcZxdItciaAiVBAKEhVTLmWNAzKnWybiAQCAQCROJEiRIkSJEiJEiRIkSJEiSJEiRIkSJEjSJGZmZmqqiW5++VVHEiRKZNIkSJEiRJEiRIkSJEgYiRIgoBAIBCQUkSJEiRIkSJESJEiRIkSJEkSJEiRIkSOmZmZmZqv///+1VVVUzMyajJEKCgoKCQUFBQUKCgoKCQUFBQUKVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7YMTQA9WxVzntZMOoAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.01106576 + //_tone.Jazz_Guitar_G2 + } + ,{ + midi:26 + ,originalPitch:5800 + ,keyRangeLow:56 + ,keyRangeHigh:57 + ,loopStart:70743 + ,loopEnd:70932 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.01147392 + //_tone.Jazz_Guitar_Bb2 + } + ,{ + midi:26 + ,originalPitch:5800 + ,keyRangeLow:58 + ,keyRangeHigh:58 + ,loopStart:70743 + ,loopEnd:70932 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.01147392 + //_tone.Jazz_Guitar_Bb2 + } + ,{ + midi:26 + ,originalPitch:6000 + ,keyRangeLow:59 + ,keyRangeHigh:60 + ,loopStart:72172 + ,loopEnd:72340 + ,coarseTune:0 + ,fineTune:-3 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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Ul2nJpLbefaosyxcKVBVnl2332BiUgio/gmAZIeY10DMQZGMcbMWmM6TZu+A6ejmcAEQF+pWoPSiopBCNA6o1psPp0GatcnOT4rLUheKiDCiOGjFc5FZSP/qr4W7e2leJywRgXcH8cXEkLN8cbiWdlXyj+YiWayLJJ4HxrPJgXRhqRy3PdN5k5SaFpfkI6KxcjaaDzHlOk9eHW9aczw39yx+lF+m8LjxLRO3Om7v5c7cnMEz8Y6qwQtbukl99tpRBMmvmzSNzFGjJBzd2AM7MIqMCEMAIDJZcAuurAykv8slxn7XTDR6PwMQqQnIWmTk4fs4eD8tMVxJPSs+yysV1PVz1TmCIrkQ+XVtpVCnWRBQlx8homedvTbLEEziIUQJmcJswsGRXlTsHxiYYwtsTMukVHxK0FsbOxRJSzLm1HlG1CZ7G+HOpP/7gMTzgBUpozPtPM/ir7HmfaYaNYuDW7xSz1bpE1V1WbnptO+bDt9iJ1EMupVukozptrdE5GyQADkfCM01k0oYjUYXOXEk5OwjhExNm5Yx9xzHdzNaJg1OKQ/IdcIcRCcOQZyiSzgYQDC40FZdnLY1ALPm6Ou6rtPW7jfLtWk0Zr7yPM7sBSuQxo4sxMaSNjdInHoLROLtE4uNk40uFyFQEEwyAhY0LEgKK1kTIsRGEgKFDQ8iAmGRmpA8VJD4CFzOPaap/mrHsSEiLqBRD2f8VRgIXM//+KcWTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//uAxPSAFaWDL60w0aqjkyC1zRlwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:0.01031746 + //_tone.Jazz_Guitar_C3 + } + ,{ + midi:26 + ,originalPitch:6300 + ,keyRangeLow:61 + ,keyRangeHigh:64 + ,loopStart:65689 + ,loopEnd:65830 + ,coarseTune:0 + ,fineTune:-6 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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+tKqtLjVlP///////9PK7d6vblljGpSWLYIwkDQiPKEv9APrB8aBDggBOD7wfOFVnYiPCLBWdlj1TEFNRVVVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5DE6AAXYU0v9cwAK7qrZb85oABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xDE1gPAAAGkHAAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.01004535 + //_tone.Jazz_Guitar_Eb3 + } + ,{ + midi:26 + ,originalPitch:6600 + ,keyRangeLow:65 + ,keyRangeHigh:65 + ,loopStart:63613 + ,loopEnd:63732 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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NQzq1NYaw1aMsNYa0mpNSaOTUmpLDVnJqaw1jq0NYaw1pNSakzOTUmpLHVqTV1hrHUNEspJLNUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//swxPgD0dWPK4wYcygAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.01564626 + //_tone.Jazz_Guitar_Gb3 + } + ,{ + midi:26 + ,originalPitch:6600 + ,keyRangeLow:66 + ,keyRangeHigh:66 + ,loopStart:63613 + ,loopEnd:63732 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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NQzq1NYaw1aMsNYa0mpNSaOTUmpLDVnJqaw1jq0NYaw1pNSakzOTUmpLHVqTV1hrHUNEspJLNUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//swxPgD0dWPK4wYcygAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.01564626 + //_tone.Jazz_Guitar_Gb3 + } + ,{ + midi:26 + ,originalPitch:6700 + ,keyRangeLow:67 + ,keyRangeHigh:67 + ,loopStart:60827 + ,loopEnd:60939 + ,coarseTune:0 + ,fineTune:-4 + ,sampleRate:44100 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAA2AABWQQALEBAWFhsbICAlJSswMDQ0OTk+PkNDSUlOU1NXV1xcYWFmZmtrcHR0eXl+foKChoaLj4+UlJiYnZ2hoaWlqq6usrK2tru7v7/Dw8fMzNDQ1NTY2Nzc4eHl6ent7fLy9vb7+/8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAAVkHmXGKyAAAAAAD/+9DEAAAQBFlIdPYALHMfpU890AAAF23cehGIsScHOEjHGtFsBzhhmXCOQ0DoVkTCoDQCAHCxCZk8SCYeQiGCYHy2VAAwDjvGwsWUMgABk4A7Mf0/eAAP//wADP9OH/4YAAAAAB4eHh4YAAAAIDw8PD0gAAfIHh4eHhgAAAAAHh4eHhgAAAAAHh4eHpAAAABAeHh4/QAAFmjiSABg5lUHK1FoYpJk5r0i3GR0F+ZH3PplaDpGFgdsZ3QrRkxIxmH+VOaF5qhiYDBGJAEiYBwvxmChHmEiGyZyIShn9+B2YZJnvax4sThpXLZ6YL5ocUBg+ZB2Qshq6oRnGnR2O8pik+ZmclJvXDxiYphl2fhg+KwcbBiPFw1DBAAIoBBiK4RsQBgMG8FDyYhj0YmA6YIAEpEeCEwyNuXMtW0gSHTehaJZVAR5BAAhEDI0CVIzKHREFSJ6gLfpE1AuEhEF5YBRnKB1MxF+H+jTuyCK1WZ43qWe5GmYvPTUrR6emnq25bZ+13Wf5V991yt+sssu2uiVLAuwPGVGXBNEOhAx22L79nR8KlbFsPCUsFQVCh4S9P/v0gCAAAAN//EYAAQmVgMGA8xFKzv6eMvigMBw0AwMFDawEQGrtS9AAHMhEpB55hHIYhAxonQFAOHKjKjKgYKFABQSDVofqGKQamMFC4P5IE8R4AS9CykgpqQ0niJFJMyAJCYsknTGXDbmRvqMhZ5k7qFrHlFp0iH9Gir1fS8zW1VvX9alpVqs10+p+7Jm66+qpdFDWiXl+p326KuxNAIAYAP/xgkF5QMAABcwbEgxA6c4yXwwwE8xJBYBDEYNnAZfp2YCgkXpnxwFjF1E2BM5XKIwqMKIsMDwKWFjSQhiCSwCFRKhVJYMQK2YwAayhw05DAUezKgKUOEOwMIALMMAmZSKAW7Q5QHERBcYquYBMETmxfG/qg3IO6QFBZMqqNBDWqRRbWstb1+vuaVJsTnFG8kSsP46vePZfCaGELbKrNZOTUIRgQFQGVtpNU0nPZpjqrFJAuMSpek0C3jbqd/vyfnfxOXHAPkuO94GRqAAAAACAH98YEQBYYGeYFgBhgbgPGHkTeboQZhhEAPiEBADAWGB//uQxMiBE21BR13KgCM9rqb12icdaDKZh4aAYE+EAIM6GQEzBnFoQRsKRuAAFZixkRmCkAGhUzUsAMxa3QEUWqIJk3QppTGoTeiG3wJGWYnEKPzIZEX0MWBtyEPsnQMuiIaAEj1SJ7K0W88oBav//iBQDU7uaWFY/zPJ2Iz//3vPtRgiz+/BM78LkzVgwgt0brENWLF2j8Traams0q1AzamrP2ky67zvyDGJytbnTqyjOvHl0I3WutVuy62mvbtY+epX5/KR/3tdacet98/r9mbMdxMAAF/+HAAjADAqMBABIwLwHTC+I+NgoOkwdgIioAeAgeTA4DLMcoQowLgCwCAIsCKAGG3oqX8biw0DAI9AsChPp4uEu8ykQQgzohrZeMwFPzWYHa5bmwIdQiZpdQJaZERG5v2RzrZTFhNdup3aDby63q5Lv59cuZnh8wCQ7Vrc8DO0z/zOK4DHJ+NfnMSzFk01c4kxdbu2/l09s7Sp0/HOy7C4+jSKqMNQLfivA2hHts9xiJFC0zjSPZaXUdpjH5V69ux6/beehZnsaC92//ugxNkBnJ2dM69xkatNrma17jG9xIO0wM1/aqAACAAICf/8YB4EBgtgXBYAoVBbMBZCIxphpzAUBEMCkCEwDQBDAaC2MeYQEwLgBg4BtgABADMScMYIAXZxLizB494BiMW+4pCAgsykPoo1Fl5gR+gMFtAvwGAAiaNACMTY3CKoNMVCaAU+GDN2BJOcrHV1ptPrWcrcz/3QiED4fx8B0BSz+TMpaF3/5z/kgGEpwg2DCvbxQStVTIzODfVudbgfCAkfr02Iv+GsjJRElDd4lkzUl3huGmYsGd1N6S689bpVRKWpsX0cclPy3y9vMJMofvWE5/dHvACABAVv/gMAUYDgA4VAEMBYDcwcSzjQvEVMEsBSHDAZAIMCsHIyBQjwUC8YAQAosAMJAGmIsCSPAKPfHguEzdWXMOgNnD9tAMkhMeMCWi2n3AiXDwm3lHNiIKGLQAulTp6X5MBBN4lBnFfUwKK21pscnitf+dFT6z+SkIC7j70FrkoO4R1ssMc/8//+XpuUtk/OduGe66BERPd1EpJYdFkb9mqI72cT0/uRMsV4xWTi59mktvVp0dbnsHVsMUtEhAY58oD2q6PVvt++eUtxylWkABgACADf/GA6AkJBOhgCYYD4YY4MpspgdAIRMwSgADAQALEIbJh5iXGAKAq6iepgCgFGJuBWPAJM1ZCSgRGBGQoF//uQxPcAG1FrNa9xL+s+qGbp7iX9wDFH2eDoFMFNcwqA1A3fvGAiyPpNqE/iSiYIDCA1ncZfoEgBnZIA3ejRh4CMWs5cgq9/6fCRf/7S1z38EJpvLr7svfLn/l3/cBxwfXUnitaNB6bEWxQWQY+skg+Jo7OsY5NknXLEuI8NE5StUTEKZdne0MSV3JQtcl49XapfuVTLqbPI17k/Hcbn+JACAE31buOgEGAGAuYBgMhhHo/mo2OcYMoHI0BYQAPmB8BiZmwCwQEypNVg4ASYsAZQQA6sZL4CAUmIaSmYHAB6Gy7S8RnpHDTKEIFGAGwYwkDBu5JMwfLBGGChIMdgLTP0B8qR0q0pjkNLgo+bePP/929f3d0uFh/HqUrxw7umgX/+9z/4ljv1Klt8v31f6vVAqEWsPtwKsqbPvXScR6gZWVTFJFtSYbM2y9lAejq+9RZm4QUXdBqKJqbepVse/bnscr3f+7t36pJa8lv4UFClgAAAAAIT32pll5lVgETg28YLidZmgDxGQCWY/Bxj0DGG4wadvJg0OBgBmB0GG9Y+//uQxOeAGelnNa9xEas9L+YN7iY1WiYisUwKDD1FcBymSxV2FgcY9lhkAIBQBLEV8YUVQHmyoYGfxL8xEAZRJdQCg57A7NCYsHcP83prE//M1yyPC12IGAgLd3tjSXak7l+uwZp/fws73/vPje5+7sdyy3Y+3lc12Yzlcjm6HGip6tyOxSN36HP5resOWubo93IrzPL61vCxhWqWcNb+78xXsZar/hVzpq9ekpce/+XbNO+I4xcSEO6Fmb6K0G+JkgAECf31AAAJgHgAGAgAGYFIDxhoD7m0YFcYQQC5gAgFAoBAwKwRzKHB+IgewwARxhgA8wTBGEyYKhSIh4kbDSIWfHEqTMqnElqOAJJaCDAz2ORgRgsu4lKAh2gOcR/ncAADpWGONARgsbTW9aZ9Y/7jxUnM8ICAwCoOZtiFQI62Few1JWvvMpH3f2Bgw66DzZRmaNJNqp55Jzb3I2/bO4ReVXa5MxWXnooT70D0E0cp6ttbCU1PmQtJfMldLrw8txlKTYaFAvCC5zOsUADLoxDAAAAw3v9WgGAOBCWQMBsC//uQxN4BG3lXMa17gitAquZp7iX8cwsimDX4ENMHACgYAPAwPJgYBkmMkIYYEwBZgAgBLAlUBIwShD0JD70AXB5z6sgYvtAfYVBJj6CmPQWW7UXWACk0Ncg5wY9AYiAREelanhtLYLIVHKeV4RUSura/6OQf9ZVdTjncaYFC2V/cYwYBBTmY345GXW7hutrfoDdpeh6npfrFrCDTRKlSexBtBKKiKojNMegw8ZcoMFDxyooymhjmYUWeTz5ok2L2u3HvbzWhQ+ar/HZ13TYPd/49k1AAAIAL7YYCIFBgLAukgFQXB3MBJYAxjCLzAWBmMDUDMwEwCjAuDaMowTkwRADgwBteAVAVMQMSYIAjWYykkAqMNUmowDgEGBwks8aCdgRAhCCxECxGACXXGKQ8o7BDcxARDBIMX2pRAI6EhGJ3tEADcp4jDwUbbHWKjef/2Gcf78fSCqd+SLXfLPucZnP/7P//CGXTouQqitvJQSLFGJxZsc47nmQQOMAx2uS+ZrFuqN9mc9xWoN5KqJjLn0dFXuUX6jd27T0eAbqIKXvP//ugxM4BGc1XM09xD+tLquX17ho1z37GsbzqoAAIAARS3+pgTgTGBMBqWmMBgDcwkzNDUFEtMF0BqWGBGAYYGIRRkVhXgIF4CABoXFkDECCHJgFGrs6EQZMl88wQB2fMzEQGMgvAxsCi3DYG5AWTGeAU1+kmyqMDIgAVy99K740RoebJ28RFd7b+8nIke/9jEn7l2CSIAV+ZQQnXKe37tV8ufrv/8CeW4ru7lFNkQNlNgxlCE8u1DkPylG24g9oNH1BwsSt05ZCkFWM3Mx2PuRlXVKmNpmtrgyogkeGn2UvyV377Rq8mHeKYACAv7WCQCwCAtKAMzBAAEMQcN84UQaDC5ALMGYAwwGgFTADETMXcXYwEQH2gNxQJmLyA4LATLVVKYBCxz7iGPwIlaoMCAGZxcIQ5RQECEAL0MKyw5MBk+5NMA0CB1QDBCsFOjIlEAOeNP+MwWYcBMX1z3Kyz/GLZXf/AWAcx3kkQBt9VtTLzQ7zmFn8PWjSbr1iPwahiOJY+hRxop7aw59oBQfUaldJ0JUV7Pynm72NosrHXrG3MJtdPOIoFsJRPq276drPZLC10Dru3+OrAABAABhz7WCIDcwHAZAqAmYDALxhJpNmoiOkYMYHYQBwFgITA+BXMxgFABBIkwBZMASFABzFiBuDgEXebYOAp5VUjyZRjWIDQWZaipkUIg0Cq//uQxPeBGc1XM69xD+s5p+Xp7hn9LqwGF1YEshWuQwABR+BpyqBl9tI0OLjQXYl0GAELUmeXy3L9VVHb9XdS0AgJN3vgJJ5UcrrbXU2+WOdP+eSAMsRBxijw+OiUQVINN4zXGyW5BRKj33HuSVY+jt9ZrNGuW5wrWjRtUWVOZJMLAjD2dq/886O+5P/+9Q36tdaABAAg19tDACARMAsBgAANmAODIYMSfpm9D1GCICWYIYBRgdgAGAiIoBRczABAcBwBLLAuAcYjYZ5fKMvwBQKd6bIOP6sDxiMAGVmcELohAKMtQweBh9sqcy14AufTHQNa0+VGKAAMJMIfOloRGG6XLn5d/9WZFXz3MGAQDj3d9Bqgr0laafPv/lr/TBYQMSNzETidGejbwr0rEEK9t6AqI5sWii+FObgFZe9OD7YnFWpF0cVCdRBhI5j09c3Eu9zrJFlmyy3pN6oQaLonKsQCAAAEZvraYHQGpghgXAYAkwQQJjDQH1NrYKgwhgFzANAIMAQAYwRQKzKNBMIgfhIARgwgANMI4NxgNI9IoEjb//uQxO8AGeEtL69xD+s1KuXp7hn89uAwsh+ZL6GRV4YuASGCynxMBmMHkVe07KiQ4mOwKrqS2yEBGEwDajuVYwEFpF9zGIY97cnopVxylggA1PrkAs7Vpi9WFMhaFnSWb1/PWlqzWjI9wVw/QOxyXQpA/Z1TnubRlPv122GyYaNirpo35R1Uz5rNCNPT9n7TfbDadNR3ZVu3++2vXb3F4UAAASe+2qPhgOgHmAgAAYEYGphcFTGw8IaYOQEgoASDgeTAoDTMTIRQwGgCwKAEsCQgIAEONckjcIcC5iLUlgAwBTJomMU6HG1ZCcywoBV4C6rjUVsKE0Ih6knFpmRhBSn3oznTCIJb2/jhTTmefKGQ/zb4Iu67uIrDtMuwJLWjsks18pBZuaHBR92F6G2mkY1i7QgW9BHVyhQuE6eObQeqXA6L9z4tKYazewymgtm3FIGnKRFU0TDof/V/jCtkXqqIxOye5p+1DLf1sRuIADQuBEFwezAkWqMcwjcwGgZjAtAzAIABgcBYGWMH6YJgBAsA+3AQgLmEuIUJADscUFBI//uQxOaBGYVTMa9wz+sdKuY17iH9cNleww+Blyt0L7mVFSY3AYhALCWUhWRm0Aa5U45ZgAEiWOKwDRzRIHQIBH9bjlaDhC+fMMW79/WohXxsVYmFQF93thSt/68hqZN7z9a13ygnHQ8CIKh1CRR6MIZwualitHlChQqLqLOSHZHI7hupfOeIgu05SDu4pneZg6K5Onf23Rx27cTy0QtfVV3Nx/A/PvivbmAARd/thgKgPGAkBaYA4CxgSAumGWjgbTI0Zg/gYLnMD0BowQQ4DJzEZMDkAwGAApnAgAQxAAxSYBBvmTGAAOdRm4OOKlzOUERiBaBBWYyzllZBMzJQLgLF2wIOjSICf+d24JQXIpJKl4weEJy3+pNI/zyoJ6W2PjpaWb+xEl8I/UEC0zcHtypaWR372KJMeVnA6lGixLkXoKJookRyBAII1gGQNTcgqjq3qfygx/dLPRKKdPNXObrozB1nRJNNC4ume3dHI8NbNFvr1ebT8vcvmudLzeaAAAAwAAFV3+1MFsCowkgNUWw4FwwzQbzafA0MIsAEwRgB//uQxOKBGaWLLG9xD+tXL+Wp7hn9jACABMAsLcxew+DAVAPDgBXpMAEAMw7QQkopDCVJg4jAmBPZpA7EDLz4MOFoM+bmItky8BgCvKxxIMVAC4qgzDSEWMME5hr8grmCDNfLnH2tf93tazSVaoKCprdW4IwB0ZrcOOxA+sa8i/PMaCIfy0NmVhb7BPVa+1g0QYHtRKGdZsrYxiMGQ0ZmHwmXnMLI09nTmtTU7zkm4m0WjeSlGbPbw9s2aeg8jUta6ZLQAAgABFN/LRwBEwCgSDAHAbMBQFAwkUFTTnGSMF8DEHAmGAEA+YGAPplABHGBsAKgTFgAWKGI4AIkzfdsKAQ4i5ggiNPdhRMCoEMBs07TYQY1TToBcSn4OlIDGgMCMDPyksRFqeU9Px4Lhq1um5KKTX/M37dnk0LAnWdq7qAM3siEOsXo9ax+kzEQZSnnDhkQwvToMODw6ciB4dCNVHRhONEQuRo559NO24Ttr5iOFsuGvYyFa6MepswuJbmiS7tuN+2qOXV0iqiT8xOhzMDagAgAVPf6QwBACTAJAQMA//uQxNcAGeVTMe9s0as9sSX17iH9IBEwAQbDBOVFMwof4wOgTTA7AECAagSIQYcQsIoAwYAAAKGhgAgDGJOD6k1MNiHQya0x5gcAv5Mv2YyDosS1V2kxswMrwV/16Rd/AuNiJyEwpZNJkPy7zzu0/slAoVitq7uJ95345ly9lXJgHrmNxmbFXouSNrsaypsLMzK7ivRp6h+goKiopwYKiodDxco8aeaE1kwgqUcVVHCctnY1yqE+TClCjVu5qmyK2p+3fC0z2Y/MWdTpY010xyyHa0jr0ee+VOtseTa2QBAGmAaAQYCAB5gbgZGHcV2b3wehhPASmBCAgQgFGB+A4ZdYAIKCeEgFFdAwAsw2gwFq0rMRUMGCtACQA4NOo0VEAoFeeV7zBhBHyGxSLwwoMEMkwYBHDsFQAhA1X2nPF8jEwYdaksWWUR2pTXXTkFqco4BFgBX1QxwYAK/oAjztP69lrtvDOk0lTpeIRolh987D8DHbSDOg/Ledu6QjIiVpxsbPeNu7+Q9rVGv5K13eJnNY1158f7iJ/dbb9WDZk9yY//ugxM2CGplVLU9xD+stKuWN7hn9lwCd4DzAAAB5b9bEkDAfANMAQAYwMwMzDmLEN4YRkwlAJhQAUHBKmBAH6YTQphgFAHgkApRUZAUMGkOV0qNiQMBpr+lgoauNQw4REoaHi+HwixgofCY2U9F4cFQqCi6VQAmjCngKBK7wWATK6g8O29o3btT8tys1YEm6axTQYAgXDErmXSTojcxTy53YRb1bzs52BUTjxzuGiJmDWHi9KomLkXoU1cUIIYYiHDBrvNyo50PWSoPG0ZTtypcuci5xly1kRTXscaeiepTGA2dIYsD0VpSxUTKwAAHtn+sMBkDgwEgjxAA0CQVTAyR0Mj4bUwIATDAXAlWEMDAEoyUAdwwHQoAPcAZANMdwnHkD8o/H0QQshOrDzVRRZbrR13iAEcC5JtbVEQi7Rw4KVgWVGBoPsLAxJ1TGhFg89RV2tzWMa44WXZyt0u5LJiW0YCB2Rn7sX7taT3sxVieYetC1A1FDZxqFuuHPWfNn+Wsr4M69oZbe5cqt09lKfRm7dun72p3vd9Y8+C19mcnNt+0pB8NPYk3jIZ5LbW1Ha2zjqoIDNX6yAUAAwAABwKAQYDAKphPorGreMyYMIGwGAHMDcBYwKQ4DGdEdMB0AwRAEpNAwBIwpgwVQReB0UDhpiGiY0OTPcDhoRDNpbcWZBZuGlwM/tNNj//uQxPgBGklXLU9xD+MdKuX17bG9gNJg2LAZucib9MZ6GTO8/wVCV745qKUfcLklyw3doWw9v9ibJJBNQp1YAt29WrH0+yj/irCZLg0TqoPxhxTwoxCz6CyDQAEImyM3Lx9SOpkTpeF/x3NLnNtsb5rqt5vdqP3yqevCrp+3WWJ9tGdmLw0Xy4AQAO3vtYYBYABgPAIhAGREDoYeoPAl9eBhUzBKAKQEmBGFSZE4dRgVgFgoAlvgaAeYeoQSedI+ghBJsKFgoTu5DbPAuUGeSilZkQuow+BH3oK6io0BmTq4eGI0c6+GoiFwvHe168av/Yysa1v6Jh13l9scBts7T9M9v2aahtY7mODQuQRRrjxjjw6keo0YQaPWFDNRUqLsIQiCGPF6LcuqPZKPVHIJGyH48aWqDDD91rM7m1pEMGU1QsDWY6YpZ2WkeOa+Oa2+3vSKWMazgAAYAAKc+1gjABMBICYVAVMBwE4wqT7TWzGCMHMDMDA0GAcBCYFgWJkYBpGBYAaLADAoBECAAGIoBWmZJW6kgQMa0xLSDZVLQwNk//uQxPEAGR1fLO9wz+s4M6Wp7iH9wcbpNPAFWoZKAUPxivALkWb+dLEsIzatggEX+asTE5v/j1etji9DSanYzHXpouSeA6PHL8N87nCK6ZrFqdBbnmJs1HkbHqMXCVtybYRD7w7Vo5dJJFu5lGIUkgqn3VRO4X1y7XhPx1T9ZLY8/48YhLAPFRS9O/kfwuMYAAgAA02/9oAAcCgkVANFREMFu9NQliMDAtBwXFAVDBKGiBogAAgoAIYAhgWAhmKDbH5iAhgDNJ5S6Muxj4oSwzlXjAVdgzcjdjJbajDJIElMrVC0x57kQCoPO9u4yWk7lSwHUoLNhz0FnglFDejzvSuFu/RxbUzhf+zpRlJFB9f3dbp1VKDpF2kyeQuNFdsZmckmLOOjodDPB63QtrjsN/nxryzXe5c55ZF3QxTKxZvqtnZP/jy1fPXyQMAAAH7vkaMB4CUwKQIjAQAVME8FoxPEezncGYMNQEkwRwJDARAYMF8JgzoQpzBrAOFgMEijAAAVMUYMYiAFj65QCDDnUqBxmX7D1coDI8I27vG7hg9L//uQxOuAGKlPLa9wz+ruquY13Zn9BJgW/JtEIdUxX6WqdpIgtavQIBbYx4BGAAQTBZ3X+WHdZh8xLexSciGWLRUkavYfyiE4/T1sjZNF605ru87AuCnD5BZwhCE4XLFhUDDmHHvSMpsHyknsafD0zq0E3UyWaNt4aHskWUXJWakm3lV4OIicMugd3+etcTtFcd7PH89P3g2l/sYYAKCgRwEBwYG4FJh+EVHAwG6YUACiZIkEiYBAe5g+ilEAB4jAIVlGQEjCXDJYNnAyeIOIfKASGhSGVEJA067aiocHFPCx6W3yoLiQ+kElbNQWPATDQwQcVQExEgTlplKohDENyyR8iUvqb+KKcyvlLG3Ui0blUC1o5ele6P6luD1l5ykmaifSk/1J/sTDlRYR22UJkkLyaBguKnZKSmSlPGPF0WVJ42vH3eKXflW3bm/WZ/vniXO3qa0GhwYz/302v/1hlYADprSxl9iABsLgOGAqD2YPi4xovEdmCgDUYDIHIsBQYKAARmQAUjwWg8BU1wVAVMFPx45Q/gNAJxBwhBDa5PyB//uQxPEDGwU7J09xD+shKiVN7aY1AMkxGIk4Jgc2gr6ttRUxADxo5gIBL4WwBQKTA5YVRNoHmAgDb+zuV1s792Gc7UviEqZJnWiNCSGhSA8JN423o4Ig9FKk6T4Wxpx8isWhGYQQ9HPFS110OsXtUHDEEViMkYJUYYOXUVUdjIScktWcei06WMo4ajTRL1f1ulfC43ZewShWpEAA0d/shgBgBGAEAmIQFjAMBZMHNDI0FRiTBBA4MAkAUwLQDjAPDQMMcQ0AgFJ/tCFAEZgWLuXYLGAMZ3gRdiG5RXVnaDYoHRC6HB0Vh6ltvIVi1OZWWNwyPCmDXKiDwA0CT9LEKGWTV6uyuc56zoV0hVkkQVQgkhPE51lvTB3UYYm/Uu+ZbR/G3KLI0OzSJY9WVcdG86Vz6nNvr+S32v1+zv07un4pY2aTPP27fjfxHHEMW0w3bWDkzegWr2vwthtpgAAIAArc/tZgNgDGBgAyNAPGB8ASYe4whvzgzlYU5ggADMnMC8G0ycwojA3ABBwBYMKgk2aplrwU8RIDQvOy/sSlOiqA//uQxOaBGMV3KO9xDeMGp6Wp7jF9bt2aekhXICTsqvVxwGCxKZesh21FAUBXPlDqQ2FwDXs1eUvOaWL68raWEDnYDEFiJ0T5gb917T9mstQ5hjXS+vtRM4exkQ4OCSsiPEhM9Vq9IJhVL7hcss+a5nXrViKa02Gdm79qufDVjIOte97/kDfVYyY821IbR/65fEud9XKEn61ay9IAFAQP13+1LhmAoAsYA4BJgOAZGD+SqaMIcRgogKhAJhgCAGmAYEOYkAVBgFACoDjBgEACh0RyySbiKZRqk8LATTaaqh6993KPjjiXDkmWyQWWMq1d7DUJxMVu+pbe6BAKnvSiXwRVsYpGl0Ma5MQd1lYVy2uIozQB+/brXVH7DbuiWy9W0N8zXn3XnLnDD6+mUS8pbef6C99frNW8r/ZDF/Pd8HbV9mlYVs2+bM/Weavb+2mVm0GKV1G5WKs/JvoDPeT5tsAIAHyn1jMAIBMwCQFhQA8UBkCqgJgrjvCgIICAqCANzAGCiMeoOkwGgAkCxYEEwGDwsPAN9H2SFNmm0eGrfSGX//uQxOiAGUVXK69xi+sXKuY17bF9CAAMem9vuFkyDle/FPZJQ4JCQAAHU4uUHDJUyebTrIJAK9WaxaTMdiT9Si7LMo9Q0jtJODAPF4xZHmBytYs+1WVi59ZZg7aoVFSy6hVZfasPvITUfWZVEInr+gXI6bK+n9srWvYp+uTanaxSabbNfzJi5vb7LXzFnRkgjqKZ8u2OHl3HYELiagAAa2f6wwGAGzAdAwAABpgMgWGEMWKaWAfBgsAPmA+AIYBIABgQg0GNKEGYEoABMQqDAQFOyPlaZ+y25zhyRDcCW5QQhTaUliVhZLFsuKU9gdAiI0TYadACZKRD/yhx4MVzG93qZt4lzNGIBTY+gJAJEjSCcgfWBkcsxm7HM3IW6oRdanTnaOlkZNGBCau4skBlqIrHqc7JXL+04yNSS1dZDCskpDXSzLnL+8q2Up5iKGLJZcamYOuIqhtTMNuUk2U1VZAAAGTf2jRRJgKzAEAEMEkA8w4g+jdqBtBwkD9kwNJAGGYkIhhgBgBlQCaqMhB2dCmtSytCYdDtBwo/djYFAUoZ//uQxOaBGRFPK09xi+MKqqX17aV8JKJeCCkbS3km8IsPLqOHJlOMMDGaOo/9VdWN6muwxnv9m9c3YiFVMzGSFJESDIejO0r89m3qNGtyBo2YOSXMdFOUHpN6nJyRuEDIq1dDaPVdtdApT5TZSQkDa6jbcdaKfp5isaqPuEIebmbGUKHUZO3zjHbLb1/YAB27/rFViEFQIBBgaIJjR0x/MspiEHRgKDJEFJhgE5wUFg8MokFThCCmfVTOZVHiEDMu9VM5jGhHCNm9PdrAgKIxqDu1EOYsQqWIrOdFFBl+yutOsBls7drRPH92WUbutK87WAuo2xaHg5tx0aWP3c6BDzeZssWZCvjotTxRwrzxMso7TuLkGr351ba2oTDS3PgiV2XvNHPM5V/KWuupOUlz779+mWJtu7E7s3jsz5KQDSlEKLXzFDf89BqAEAgADN362GB4JGAgOhcDAAJZiD9h02uJheJxg+CZg+BAVLYU8SAGRvbYYDDKLF4I7BJKAGbdiKUM5XwUAFYDE47EgolCXc8tqwSg66U4mY0Cnbpwlf9G//uQxOaBFxFHK09tK+ryKuWp3bF96AhQ7VDHqClW61bm1B+s6pwIxAHp0ZpyNVe9He/ft4MWa8vlw6u69sV/YebMW+m2t5f7LoK9aYK1Z9bDEzFbMtm/dpy9M3vynu2+Yvc6L39VJwN0wbTNFqH0P3JXVkuJcmoAIQAA8m+1hgLgIGAsBmEALGA8AKYS40hqQg+hwYwYBgJADGBaA6Y3oFAkB+WZYkOiJu8EzughpPU3eRFgmXVY8OkDkVL0SFF4McpTWzLACpNHJyLT5qa5LCPhKlh5ZufuwLMWK66aJelCIcKKE4iOA2QJisMkiJhILM4up47KE/DWC+XS5ubcUJeavWSXgnGulBe3qL3cI5cnmV5zncX3N1eK+xj5wjOMLhLIpSXV0DeEOfbwGR1k3Ovw1Jhv8tAIAFTv1jTiMBQAgQgDmB0B4YX5OJskh6GECA+AghDAUAZMAwMs35AjAwVgZOUKAw3IdUKH3jq7jZw2Ihc9silpgcAlYEgiYgwlRxZqG5qlWBKA+7UNxVli4YKYC3ZkOKUdsgtzVi0TdWm6//uQxPIAFzE/La7tier+KSX17aV9LHUZkDE4KhBGlgYzRadRPxecse8c0xZ9Tjov9LxxRl1cxR2JfSFYVTdesP07OPRnb/bFnUbZ1/Fl5utsxBR/qezTOc2evb6wv7T5pbXJw6yCt2adr2OWMzoW1QCBAAB5b/rAAB5gSFAJAkLB4YL6WbApwYGhqXKCADMBhENghtEgkLdjQMEwPmXYDJNyzJyDJUTh4EJHSPuKBC49PXlAqLAkIGerdETAE1dzHkfRCfE1nyg2H4faFJ80S1qwV6r/XGiEt8PVUAmqTaFEovEfw7FMGQQ1doFoFviJFIuTaQMotM5DUSBE6rJVwRWazW1VeomoWdXXDtNGLb5Tw+Z/+77r0BaVMZ8lQeQNS/P83vx1L6CgABgADy7/amBgGmA4KF1TAsJDFKaTxQ1jDIFwMEQOBIwRGI0JIEDBENA6mMAAJMkgkVpo6i8zFgjUk6TPJAAozN0MwIwsFh0p+bfBiyhFEpUsLUb5WH6rUIdPew3tNmEwafst3jNBjn7GOUok9VIqiPm2qeewtwrM//uAxPuAGLVXK09xierhqiX11hsVotArGjsFdwQnx0HdhAsIFAjkAujsgKi1DOUNFQVueCzUK1NCDDLxiYHQE174mJRRZHS3fvRjkzJ/u+tuIzCAAAABJL9bAUAKYDoAxMBKVgYmFYCaUW4CwaLhEwGgJB9MUcLIIAbSMeshAAMJUHtWKMxFDoYEYcy8JvUwIwJHcpMuBcAwoDEg+zbU6o2708stuVIpNK4ecKdk0xKJJIsKfWeMrs261aetU8nfSGba/7UMvNly9Z/HazUyMpqPM+jkSXJ4xMgvXZy3R2DIMkiJokSBgRHCPbJo3DYaBj0sjCg4uOd8AjFMFcuuRMzXypaUj//yM/gglWrIIBAAiOT/6lQCDAUN0XjB8RzFKKDyQ0TGIQACDY8DpgwG5qIJAsFoOA6DiECzCocH9pppVEwhKFXNNjiXfSxlE1SiEByIhZ7HsSkA4FlSdanwYXg5de0eKvYeu5VUwiv/+5DE6IAWzVcxrrx26ugyZbXjD8wzwRgV6quS8srex1bXJr9bGeiJxyDYaa5B8w6jN6GED0lPfC5WG0gvJIVD0juNraW9VrwzG5eNvRh7LVKA1uR8UcI+sVhf//xmkxCAEBAAB2X/WmAYIAgFSoBwiDswJxI0HR8Ah4YMgiAgaGCEMiCxLOIB4UOAcYJEW+EzGV5GNQ/DQDRWtJREDLj0+6UZCMeH3Le6k46S+sVdXN0BB3lqal327b11lawKpbQRIAqPLZq0a35zoXPlGcXfQRh14SxRCrl5HpvR+PREEjDC5CDZx+dZTOLvva7Vz03mjqny24v798debmVv+7txD1T1We82lpuuiLSQNdU5oAAIAALc9kZgVgSGBwCGNAFGBUBWYXZaBsXh4mD2AUHAWAoCIwMQGDJdARKAagAApFDoic/fKDwRKmWnplJQYvNOxowYQJgqPzMyMrYZA0260Rg30L1CgtIqKCWsULjZOcNnbyh1eYRHRg5K+MggeHkrHmuuRx39/X1rmGayFVtPh2bI2PihmsVXEdX6Usqbj+b/+4DE9gAVYUsxrqTW6ruu5fXWGt2MzFDRuP99naTe+a1W1+5jr90d/21MbcmctkFZh7PZj1+9p0zvGs70P5yvSo9rQCAApL9rE+gMBARATmBQAUYSopJqHhBGDGAOCgYDCgcKUJl2gMBMcZiFgQ6ZdTUje2tnJLo8Jw5TxAKjjJJRNTZVRxoFrY1LsvbXcREj7KESoiFLJDNyCYrWtkkOtisyTI40eIXMkwTYYaqspAscceRmpspqiZaTcGKZRzRItRlYzYUNIX43lNk2Su5WtSJTMrsW2hrTDi+STqDflccfOeXtTjCrlbME/o335WyxtXJ78ahFAxWAECAAFW37Wo6kIDIEQIFRhfW5wqgBhGErPC95gUCBr0FpMFBesmBAeBcyhAxUcU2vgxVJpJCX1JkGgSxWpNUJIG4cCdJXx7KkI4eWDs4jfThEjIo4FZkezCMrlc+XKX2BmZLjspjQYDymVnxRaio8xaujUP/7gMT1ABf5VymvbYtq1irlqe2k/VkLKLWsm55Yw2WYxl6RPan1KgqEM1ipVh6OItKv9L3buoNrU7OffC73GnH/DSVuvfxCa+fbnbh2ZqrG1+05//rHv7n6ZcIQDAAEk3+1AgBhcEAsBpgSFxhhIJxUZRiIGZhWAwcCxgOMhlCQ4GAoOA1kRZ0yCBZcM9TMbMBCfeOtyuFgLaHK93SAIx4M7GfxqckE9GJbKrk5S5NBtXpdRcmf3jFMcjfWoyyo4nREkAlTsmVqy/WJzJbnaLYbfVeznUxuGWk79anz+xWnF0U0ohCKZqtUmgWDgBPeqfXMeVM7WBWExKjNmLQQZydI/hMRmuca58z9+5lMOoIAADAAEa2/7UwiBkxdCZ1DCcADGQsz7oJAcPKww0AABDU0RFQaBMCAAyMZAoxnEdm1mqwowkJRg1L2aEAGL+u0s+IgdIhXnLecw1GBH5gJdcSdSvKuAmTsZchYSNnR//uQxOYAFyWjL66w1uLONCY11g9c+crlDXpymcElYelwpnrLVYqfaBffMpnuSx9Ig4iChcZIQuYfbk2WhGJEeIQYvb2NNndJmD0p0yNjhBrOcZqsqTaU0juELiqQnMul9Zv55+JiI1S4V6SvmCcKAACAEK5frZNAkC0MAMMA8BswbCHDQADPMEIBgVAFEhyYcMp0JCBAtBwCkxKBTJSGcWVSpYEzujxoCxahmAKChIINwjkjQGlCSvZ4V0CQkhMJYNiGGwZj+fB+ksW6UQ8ZeWQl66Q8QEba9YIQ4lNI9WVDzdOdlk7XsehuTBzi6yWBzq3mqE/aVMUHrHG361r6fnnrZ/0drmbtM2G1oHu7azfdZntejZ2HW/vtM2H+i08cQ6Ua8Mhtd64ezFXAIAgADWX/WmA4FAwC0BRAEZJKRgwbIUD4wbBdAcDBUMuh3CAAXvmgQEA1yS7jDxjUDCLUhtTIqCL85ZaFAKJhWotYyVRiULtiTiqyu7PPCEJFXUJJ/Uus/G9eCKrl3tTLDEOvGBbWm/T9Pv0pJO+GqtJkU1vU//uAxPWAFxGfMe6xGKruquW17jD8zvP1kxR7lHGHIrCMtjMnIM2/pRHLRM1nq3o4t+7W9Y9NDRjfz58qaj+Rv8LJ50Kinln4KNQqsAAAGTvsjMAUAAwAgHQCAAYCgDpg+lAGiGG2YJYBCTBgIgAGBCCIY3IKocCEoCxIqgBmDWE0xOYrOQYU4Jg8ApA8slYCAJRbhuhmBQD4SBejNNaW2iSsuVUzW1bXCbxpEY0/yaNH8d3lMLDjNS0y6poJmqhFLiEVl8KysdLlUuVl5cx+UdR7Atqs+l/S9eV01+nKsyZUWqnBZPyyoi1ydYu1GYlmN0L5UlMM/hSEgmX7PaLz4aj9e5kbUnfxyAAQACrk+1YQBcYIACCzzA2AIMIMJM0gwOgMFeDgVAEASVQhzZbQQgrqNHEAMcktqwQ/WZmbRJojyynjhAQQ9yzQFQ8BRFG+6HQFUL0MjyhhgDN6F2iAVlmCZJhE+qkQjBpuemT/+5DE5wAViU8xrrDYqvIp5WnmDyWJFQI3apAXPZUb7VrBldiKkVH9xlJrtyRoJXb6cjPEq8LVvsmsajFuMH4g/e8iOpV5rXG1ZVPvy9yOr5Fep1VWpBNoSlVgepFyntU4OpfXViExAAHdL/tCECxCEBgSBZgEGxhrGZymZxiGFIYCBYB8w4B0WqwWCEWAcoA0MA8yVA5WuQUqnRg+TzgTesU4luTFyoOhUHCRG6SnIAHjb/vLKmrOwz1rVkSz8OB1RHo5k8dTi+UYjZXwr5edBAAEeh9U1hRb8/FVhmmuciHjt20ClIi3KgC5kYu6zCR5wNzWTgubXr/42p0kHaoPz0y/jhZLYs2/ORDpow/iT7fp3KuWsTvy1nO/KuqgACAADS3/WAgFx0FkiQSEhhBLZs0axggCYQCwcDQBGwz2TLhAIRT2MCBzkBpZsnrMJMNm2I2tTZAJzfbdgZFho0p7ub1wPRtEdS61+GmWRSACK1Gq6JK8koxhgkL0BZOieerU4zNlzKE9Frjn3vezDk409qilbxXunXT/RokKOMvOOMT/+4DE+IAWlU8tr20p4uGq5fXWGxWweRa0xAnq45ev1w4+asU/fr7ecxFN5//dpPdM7kPNz7mwBT1PvLMWLD7HrsXzcTo5mAAgCRLf9tTAwGTDMMjA4EzDUKjGJET5ITgEOKQydBgOCppyGBWB6AB9x0BDHET2nUtVuRiIOSXUVl3UACtVDQ4CoBFAiT/7iMLRatZkuh0NZcn7HCY1THosRoSl28jOeWpd7vKe5YClb0c8eGu55o9iONLWxK4RidUkjjwKnS5b9YUuy8gk9DRqI/pTLYTU+vLZnOdhL9iJqB+5tpp22Tj66cwqEJ04mlus077P8ZWHv2b6+vtY1qa2GsQACAGHZvrI+RgyGKehg2DJjUwh+MSZh4BSS4kamINZ6UcGCJf6lKoKZ8/OzWpn9NzNSIFi1LQCocyycoKcLgZMsyLtrGBisdHNSUpQY1RyXmjg/LTBdL1YVOvKvjd+ExEI7B4QxDHlCoxGcP/7kMTuABadSy+u7Ynq7LJl9dea3KFbjl/PZgeXY/13vXvZ1L323KKTfrHsLUS1fGuvXMmta51+drO1vNbJ6890BGU7octKvHDlpOzWIqf+XRMFQf+7atyBAQAgAQEs3+sMKQ8CwdhYEiUQzAynjQY9zAoNjBUE0ijAQTjRwcwgHCYDmSwIGCQsAV+Q+bkPkwPAludLVtWqZYjoSRIPcMZjJSV18SkfLNoAmg49x8aDmsL1rTh+9ctt2WOLy+IgMzkoIizDSLDyKBROUxUsq93276+1H9C82y1Az6xtQ289nQr7Otw71MPGZiceefmlWrazRZX75HTaTi/M/oYwXKnBFDkx/7NPmlc3Dc5S2hyEABgACWz62GA4CBYFUrjA4LTEeHjucuzCsCI2BgaMDxMNKxjDgaBgdCUQmTs8GDyjFuh1dyNEvsVy+svz3SkpkeQ9/8JDwIDcAyWCMBMGQYQEjBUNidkgV1kOkc3CFlpYLEwoF9UMTrd87QCmLlzzUkL2mMmqjmgXSTRy1/Ry25L7S6mL/0tfj9qHphmOLXLIZf/7gMT8ABXhIy2u7Yfq26hlvd2xba0c86dvaYlJeqjJpm2ZpoIO20izmOvEEyehSOfSarGAA9bgwBigHTC8DgMQo0bwD/4MJMMDwuyFxrMsySAoAsdVODAGMhhHUhI6ZjZg8S7O6lWgUMhWONUqg+PBDFrEodpRCXcirMG4QmFT0K89Wm6UtXXxMLFGmUFVia68dAJGDwzL+n6uHLVdcVoakwMwzbwFQTBeV7nQWTO0JIJLvJ6JcsVsRG3jFuTyGRtqQ3Fz33J3Ed1Fnw0TpfplqWvE83j+Yx24bpx/8UfdeugSIARdrv9YDQBGQsGANMDAyMOXHOZykMMQRFgMEQCmCQWmkwQCQKkQDjwElYBgJAlOZyyz4wEIByquV5h1FrV0qAuAhHhp8YpBJMAkJIKBADIRQ3jWj8WSeJKNSXMdWMpeM3HDln3SEYAPhNx8TiU1A4oVNZq32ZSgyXz6TdNS7PUegcBBmmOFWTpi//uAxPUBVg1NLa7pK2q0qiW11hsVYyzTZtCUbP17jm+i2u7tJV3hqeOJBilp5nk3uxef1/7P/eHbmc7kGBQEBLL9rAACIhCgZA0wBDwwGiEzoMIwiEMwvAoeBILi4YKEGmUYYGm8YIifg0zWerOibfKr2NWKdP293WyQeRD6Svq3FRAVmCoQzENlykYlgtZTz1jMWRrUfSbttFfqh4vFd6rorR5fruuxu4+utV68Lufi2PX6d1chaVPv1T3fjqe07v15/8osyu8+w5FjKuX82mV7INr0d+9+F5hcFkH3F8e+5dxIpvHDglXMGBgQB277SGAgCmFIVFqTCkJDExMzwIYDEIDS0wIAYxJAc0jAAeB4IEQ+OhjtxXGxsxo6CpPJqE9xHj/5mh6UJqLPOrLRGS4fNHl5DwSUHwveEqNxHOCETopmsneIANguKiFcGELaTPe7IsRmmSdWL8XnlJPhOKCa1N4ii5pJm6+Itbj/+4DE8gAWRSEvrrDW6rUoJfXdMWwxarrTtucJXuz/brnaVqgPp7RtcimV4ozr/4HbtualFPf7PQ5ggEB0Wy+2RoBgVgMhANhghgZmDcJwaBgOpgwAFI6jQHJgEA7mEUFEWtQylpYADMDwHx9bnYcPmMJgDnwnqgS4Ig/jfkw0onW8u0MmiMQi0ul1dx7cDQNEIu/nOTE3bmcca9PSx+3cpKKXQ40Cf5lGKXC9hnTY4CAfIHKAZ6IEw46SZPUK0+EYK5hMDYjR5jXVY9Imf4ehjQr1VG6nD0hnMndp89fG2mxu7O/Kb7D509mG8NDf/621jOyO3BcwheggGAkL7v9YYDCiwIFAAqNzBW4OLJ8wsLDBoPhowAHjbAzGgYVgGIkoICxPjmeUBmMhyzeWZ8Vn3+eQ4CCYLc1+FE3sLnBY4iofp2Rmcm90xJJzTMudQ7T3iwoDnDRg/0y6gqJ9PaeHfcxMn4e1PKzckxdFk//7gMTuABT1IS+u6Stq+7Jlde0Z/ZiUrApdgeWd3FFnmDZUXXQzITXSRTRSnzEO0ZGO+5ZWNt1G5ff+1QWm2Sl1K81ddkGAwGBLd9bDCIcBA1JAcYIGJi3kH90+ZNFxd8HAowGRDYpdL1F9VAiUHmOSg79jFsRhcxOQ+9zqglH+8iQEEQOnct4zrYekszC2KlZgFbGdq3d4MSJHvZrkvVGwYb5cwFZMdKLb1Visl/F4kCKedNRXmD9csykXmG9sefXYhCqnNlnW6bu0/1jgc523PuCq6p9qvYJtXhqXcXRsDrcIVIWeCFjdoHYSJMwQIAA5bv9qYGgMECQRAEGCaYjiUddgGPD+HBgy0LnJz6kimx1d4MBjTiltLdp4RCqwzrem7Tn80WAoWBpn8L7VrleA1HhGbO+W6qjqri0z+X5S8s7Sw/EUymvjBgfr6920l5Ow7e2c9P32jv66+5PPy8y2uZjcmsXvsw5C/vY7//uAxOaAFJVVMa481uKhKeX1x5rcvWihp8TE2Ym25P8xLO7XstXWqzDd53//GGeufgt0Mofpfdk5bQhX7NwACIIACEm+/tgKA8RBoimCAQMO1zObSCMMwHFgYCwCmBwfmfQbBwGotIkjQBmOIAMfosX2MIhOZNZv2VV5Dh+BVA4MBR35mw7LJX6go9gTNUSUv0JHrmI2NUbCGWVJvrMCdN0fubO/WIBaMtEIrW+81yJHSIoRRprrC9j1OUgyj4ENBKYKOHZ0GEKHoE24TZZsZSVyw5XWoplbWHThX+mlKl+DXaRro5bRGBnAEi5bHrktteRAKAAJbftYBAmBBEmKIxUIvmZEWRgonmNwQTCh2cdjmsgCAU0AAFPYQaDaylptz63bV7NkM/veBCEKAmt7r3kyJSZUgHcGS5g0NFHIkmElYEZLFdJAqbNj4XQECBicO6+1kyL5Ok51rPvrzUrqQNZqkfRaL12440qk+1L/+4DE7AAVFVExru2H6ssqpf3XotyvM2p9iTMlVPOUE7pG3m+5OqcVMzqXbogudCrN7qjLRzMHkh9ocF0ZAsMAITTfWwwEBMwfEIAAyYMhkYmLyd3D4YgAqAgKC4DGHoSGmoAjQRCwx3xkMeWK62N6NnEAq12O6UUi2f6GQxQc3h2rdJhkkNEKwriuSshcVsEYPhH6z0zyCaAvZWQ2AQmD48KgaSiVPWQsL5Zo9ZqWVBGlTc0aHM1WTd4vPYwh1bUVYrMlKNxU8HVJFcJZsL127kqq8S8u1CWWtsVGcykqSEKmWSAuBkAdLa7ImYMAADACUSzfawHAaYThOIAGMKQDMTCOO7AtDhQjo0DIUFEwWHBcpfauQASYTCdGdYwAYThkzSX2cFAhoBIxEqqYZQCl/Dt2fjKas7Vlm7EgYDlqHAbbzae21NHw6tPLh8px9K1XyqptozMlLZEgLjABCUN2HmKol2RjZVAjBbKgVv/7gMTqABRtRy+uaSfivarltd0lbEBAmDBRg2LF2Hw4YJ0M1FDoZEDQbgotmzwqUEQodiA17HvWt8vxoHidc/RHAFAgAhx36xmBIHGAABlwBCEJhdIxwMa5hQFxgiB66DDAQDVALxYMEgoZJQEAg6wBT3GqmBw2uXrd1DvLcMtjoCkwQ01zmU+uQzmBaeGi1YMzy5k48UkPYYpxQym5xmywlEgqI2HXGaLHLRSsmCL4i3j8TT/vuRLH3JpdzZOMNDBbbj9wsWgdULVHFODdNlAAvrVCooErk5W5wzwhPhCLjQfAYbcjey2IWLZJQOPV7DAgEBv2/uoKExAJQqBDAQ9MH4I6GgzE4kAQTCAEDR4Z1KqYSDKQxCEzFY4h/CzAQIIUqks1NoayPPfpTkwB5jevUZZOGTw5aW3MTRfAUyWJx0kXtw7ZQ/h8Y1OXCeXRQjbTFnL0vddd7q5KIRnzUmX9VRSSCBN1mhs5xRNJ//uAxOyAFZlLL+68duq2KKV11g7sEuis33E/MT237La3nvVbvKecl15FbNZe61JmIJHafH2fxX96X0vU7ZPlQAFAIss3+0FgGBwcmB4AGCwEmIpQHZ4TlAriQKPyBQvM0xIDgDGhKV5giB2E7eT9+GTQu21psaiLmHN7LAMOSwLKaJwoGICOkJyQTVhdCYQNIRlLo7TolnpMynowCoeCwTMEnSNLPehxqGwnUpLdaSqTWqxbZ3T7ONqiU+2b1Gm9WhTBae7dpTyEkpLw+9hzO0qps8yOLN7sM3pTQXGUGI40wx664SLjQ8gbm2IokgEAQAMPLd/rDCMEQIJReUwKBgw7SM51GQw1AMSCAv6YABuZmCQEAKlkiKjGGGU2e9yXGGAKNSk1akS7k2GV0qAGCgjUCV3IkhGCls1Mlhk7MRgsPf9dp6d0bvlFLixIzj5SLIOuE4wOzaCvPb16JGIsuvavl8aZc5Yoh/oDdGb/+4DE6wAU9VExrjDW6rmq5fXdJWwfTqOOR3g146hdQdIcd1FAbWB1MOEB4UXAqVGStUrSLTEGqD5jQKz1IpefYaSvI7JDoEBgAF2T3VmAAcgAPDAkFRURArLZkSbAjB8MAooFxhcO+g0AiSrIAsAnBEDQbVuMGkgCtFHerkgDT59xJAceC9bzvzuidPU4GFOThk2KVigx25Wy0zGaA4khWEAiDQNTMInUvm5hD5IBSQiRUrKSSSAzyeScfppqpe7jBPY1BM4226qRssqIWokxDJGss2Vr4vCcexGT5G34zctjas0acrpsU4oVPa8VS04tLFrCDBRJL/a0vTAMCkVTAEEDEZzzsYnjFYLTBEDEijA8JjTsMQwJhoxD46KPDLfr8njNo5ZvOayWI2evZ4OASgfJrmr06XBFWLiYqGZcP4ErKqBl/kzT52w+nosq0Sy+LCqeltgpki+sLG7S1h2sgYStNKN6Z7D16kKqD//7gMTsABYZVy/usHdis6pldd2k/Gn1ySp42dDVx/WEpHlpvdx29prkFVl5f5e595rLmzDNaRNbHEzaXMrX7Qc9rT/yovQ/dD7Xx5qi/rQYAAGAAwdm+tgECEDDeRByYVgKYoBYeTAWPC5IB46Iqpr/DcywCrkAszk6rhdfAxcaHK/6UWSsiD+T5f0rC8y1M3nxKq0Xl8eQjyyvb2xL+8GXKjFV1qv62OAlDYZFpWGK2hU6Jmklp5ff7fEea3fLPLt+72ns89+2vqdTV089RFPX/omLPbNr7NqMVl6b9k1Xzf7NQd7WQo+2YKI5UwDJpyv/Pm72I3skt4TVtAMwQANntr/9TCYKDimYDABgcomGqMeKOJjoYGCwqUAESJglnSgEBgOZySgwGDek7lHRGMZTc7igLRgfCOSoRBAoG2tYRPkLgGrKMJlmlmNge3ylLkT7cBi3B1nzc5oWIbjSUzcuvVg+07nQs1t2fark//uQxOkAFnVVK07pi2qvKWW93TD9xS73wbWeQ2H+Rc6uasmKl1loHMbYJsn8otE4nBQjy0ug0T1Nm1WFRBcl00xW23xR+4lDgDCbGTb/Z5bcb0/QQEABMtn1kMNhoRkUKBwGD0wb7Dg6tMFigweAwcKCtY5PVSohCpVDJc28CB7FmGjLNHW53a8YvnvIkAEwqdz+U5gmcJSoHjC6oqCJK2uSEoPMa2UOjAnUKJD6InKwEQyuygN7cvNn0ELVYWrqwMn+nXXi/Yp5boQ3w7ZmNqqtL3XWhv1Jd8It43KSeX1jBnhz5HueJIrOU5Kp1JNf3Qdx/tRrN9LIEiAMR6b+6GBoCCwkqFmCQGmH5uHOoeiQ1CQISgwHCMzbCYWANAapMtQYjA29lvtkwfAtzZdS0yCCj3vJFwSA5yaK7DcXVL6LWTNUnfIxXWHJ+/GthrSzDf7BjiZwrAdFcY/lUtNtON1XXwVmVQZfZiAFu1Bx7GHDYwLJVC8IZZ9pptF+q3GLdyuxe/b1zGz5WTT3s7iyoT1CumCLU4otdh4COTH5tD5Q//twxP8AFf1XMe4w2SqUI+W1zST9BAGABDzO/awwfAQqhkNB+YRBkYemWc4iADhrFggQkggPTIwUkAJEBwcBpEC4kUzzXsKcID1z72/ZFYw/SLwKAhJNrL7q0qOohwi7QUDCpihDNOjJdpScJw2dHpxcgE4DHRwPqih3S9OxImkjXchtHUMlLSUyaec/KXTkHT11/LlioX8ZOKpqmGfHRTyTdeHdV+HbsjkkuXYDhVv+01nSPAHm6/5rt+NqggQQYAIVLN9ZBUKmCgIFACIB0YN65wtTGJyOBhMJA8GEo2IU0BhCAUfAADzLgQgXu4AMLiJ5JXUqpb0XPwJQIRAjLVPH/AME2ZgHYZQCUTj9CFIVCRe1U6UNxlIZXbIHAZmJKWcZMEEqRJFIVzDSUmUmQJWoi8lz+jYfTv/7gMTmgBT5Sy+usNbioiil/dSa3S7LsJrUDiKNlJ5UO9H3a0uvX9RUbZzw+bk/Jr66DRWT8uS3gJePUKrCoUeuwem7MMCgRqbb/6hQBmERsFgyYHHRhacnajIY0EphEDK6AIcNRilA4mDMPDoGMXh+Xb7JRAI6edtXUJsD293kORQDLFT6m3SS8jP2lccIMEpUEisBSibraXkZ8aG77pWgwtrR1cjfg5avozjpU01JbOaxN3YwkWbaCVWjmwkskeSRgEnbGp9e05x1mlkcVKkypoNBKN0uN2Cr63w33T+NiUKjfl+L9Y/5nXMqlyhGoPlppgIAQAN1v//tRYUmVQ6KAYyGEDFAnCeoLGWSJ4lUSmQR019LSuOAMwQIqu9x4KBqmq99fCrpTapGPkwEz18zlEBiGgEGWAs0VB0UF3kN/Wk1dDTEEaIWVHiEdsS84Jn2jbaqOK7ckn7VMT1Lx+TSpfqK0u1/atz1o5oP//uAxOoAFVlVLe4k1uK5LuY1xhrdJzM6tz7N9axposUVsKyx8TQspirnCMOdlH0sECGPPHhorP0UgEYEAIbe2/thg8jAUFAYsGDRyYolh+w0mNAwAQOHB0xYIzaQEIgSlc+qHYKDmUZ2pSYTDsCxL5hKqWarUqHcmEsH4fT2o0rdFxkoajOjNxhXEl9ahKoHT+hmUFcEZODAD0EFSnGjue39bwqKQzQICU7pfJBJ407kgXJMLR6pAhIPF9iIaK4LrUl4WEZog93ufaeuZ6rZfKQVN8XPeHWo/pn816Jy9PMN1chAKBC97ftoYDBgXDIJAhUE47kDHaJGSIYlCaAIdHxVLLRBCAUQhUOmJxZF8OTwCHD3UWXEd8f1tWcmBvKfUCy+5KqWMM9vw3TkkiFMsxxrwaPQIULq9XHY9fXqY0AY4WG41nW2dzqUeg/LF/Pb5OEqqJjsiiCkLPg9ByfQSc/Sie21r41GjFNl3Lv/+4DE6YATzVUz7iR3YqMp5f3GIt1Z6c4WbaXt42DjDn5x1FC4IVkF11vD8cI2qUk0UxBYoFNnt/1hgeBhhMCaCYwAAcwrQQ4NE8ME4eARL4x8TPPBiIDDgFIMAAhoAq9l/OkBR1CJPIKZL2fz36f48Eu43WFv+4bSU9RERAedricRXHYSFanOrDtX0FV1Vr56FR4eKcUrMfnqytSuNQSjmb3c79qnaTwMJuderVp61nUCndesVMbapvR0rE5McOZfuvWkM7kXNTa9rMS70z7lWO3IQ6Uw7j8U/r/yEav2rqrQEDAMd2XW1gIGjAYDgUAJhoDhiaSZ4mGAQSY0IhaUGCqY6DkX9FgKBQCjQRCRpNnsVImYOBLA8h1YVkv/+aBYsBSk3fkbarjVLD5orFMdGTxgumAoQoyuVTaq3mydDYtn33L5NLCEbcSnoKROsrqwls3qsPXq7k0qZqyMDS1rTUpNmmJshJrlE0VvU//7gMTxgBT5TS+uMNiiuaml9d2w/TZhjCYrkZenQ5IwzIKnrZMrJmJ02qlROw52SuU1zyz4hIkr4XwwQQUAYZLN9tBGIwQQjDIPBguMH105+djHIrVmSTBAkNXCtOBLdWAQAMyECITljHgaIqSDa9ZQ7HDvVUSYJ0eVaOxtMWoLJzw55aquaE+HEq6Xe9DtFrb9YE5aORVcxor2y9bRmYrLnuyVarFUnEEEi+cVLdSsTITBkznLM6eUfAe3ijCqPUSk7dRVCZWp1HJFF7tIsiiyCepGnmZJhgbteq89rsZVyEAgGSnt/9iGIhEgYCQqIjB1jONHYxwPTD4STWAIoNIjsv0LAWjJQEYtEMu/UdEIhpXwtzqh+G+ewkoAcsuayxjLMSovvlFkxCAtmg6ME0dHyy7fyrkSHVuNKcjIsGCvSn83mt4OZd+8p0ztd34G8oy1jdGY2LtLVpxOnVoPiXvLHqPFlNduKKDdgeWO//uAxPIAFhFVK66w1uKWqqX9xhrco6tUf/6CadNp5DrXTihVBkDjrw1BRfNftRYmbrqvvvyEAAAwBWMkv1kMEAVEhjMFgdMNQAMSi7O6AsDBRfAiAkRh+ZRi8kmgkiw4BJggIUt+zEjBQIHmjD7V14qc6nZQnKVgHS55Smu+fML10ZWYsbygHeXMpONz7s/5jHXYh7DK6pssGl70W4zugUnQmi4UTW82gW5I+DXSwjMIWq7RRvCwTcITnYUddo+ZAjisVatfvuHfIZDzKmrG+OY/mcz1cdcb5oYvBDWiJ/oXWqTVoQEQUAVFLZ/bACDAUANeQBA8w0Pw5CFcwsAouuPASYIBGZoA8RASaJSJo68YW8o32dBWb5OtIfYBL7eEwgwUHX/vWpMjEMVT8AiIBURQJCtLguxjDeEqAKIEiLRpGKvEJrxyGbWy5knpJyzSU59r0bcsyuIk0T4oJEV0R80k0xJYWix82Wrbm/7/+4DE8oAVoV8vrjB3qrksZX3WGt0pCfz0tUt3O6E4NL4emr7VhBHBWrAdHcf0kdJ/knV88y+eoMDAFAFGT+/7QwaCjAotMABQZG4imxlA0gARGFQKpsWBYYeILSEx2BCNJ7xL8OU4RWR0V3jMu//tEKFT0z85SnBhVxUiJ1TYiTAkVRBMDwm3EixkkTHCdNCOrUG9FRATNsRg+d+3QVdFKCu74RfZd6ptKFKIyBQ1GiNdpabDTPluOT3wrPKlchJyr9tNJeaf1BGrSlnurjO/FMgDQCihBfZdS+2tTPAqMBhrrvbqYTAxi4BiwPMJD8xDFjzZXARSVoMDggyGACjBotgI0oCARB6FxTPOYMNCcZ3ai8X//61QOGX61uow+nJgT23zFQJoRgjOBXTQ1Ga0HHXIaE80ROREIBAZBoqhDrdOfqUMWZtG0hIpIX7FteUt2pK11Iym03cJ3ed8K2OSupxu5Jetx1S3wknJff/7gMTwgBVpTS3u5StqlymmPcwlbHdBU0C73Snk6breOIcQciYsDxSaviJTVPgxGXMADAcdxz2xiQXBgIGD4JCweGLIFnnoADQ1jQUFoQsMJh0QSE0rDggCDiQvGe/Cs9Yib07R6aiUB7d/qiQ8JUTgZxUEAgArhiioPCgEJB4wkyEMbLRaSY1MdgXeSWkUJATA2JyRUpkm0UkNM7JphkGiFDqjEze69akXVJreag2SOXLtag6NuZFFlFWsKTm1ikql4ObhCFSuG9m9ttvJdnMfs59Jh5nVUEp5V7C1PLk0/usqsuxGMB1Zrv9YDQaHAUCA8wMJjDcZO2l4ySH2GAYDmDBUayCaUBZNSwRAMxkApN3c0CAxTQ61eLKKZZY5KzCwIfvCB4zmsDROQ4QI9MokQRE6+iMiPEScNHW4xECgQKEoGANiMPIA4y9hrrS1ZMrdQQLpkYgHtEiakmIOcETkH1F9YmBoW+sdKqt2//uAxPQAFWlHL65lK2rNqmU13SVtEuxcyg0Gvddz0p9Z+0vzXil762O1OxjsK2tF0DFxAlS0VByEIBgZJR76xigJBIkEYJEYwMAfk3MsDCAxMJgYSBRgUnGpzaDgMGCzCHY/757VaIm++8rDojDyf3/dvJvExv0lZ/rtz3/Kro/PnPPjpZdVQuZx2nGt2kTyEvXgYNxJCFWUBSuhhjuVXqoXNQLD96FEuaRawtWPlq7xKPWteQ8rC3G+zDaI9j/dhYfk9ajfvDHjvUXxWdj5ffua6f73XrQ/eLI7PAYUtg+DxqryM9XbKv7pibfwABgXlOTy1mAASmGoOoWGF4hGIiLnZwqGEwAr4RgBIcmboqDwFlmIUMAKYJB9O/jLgcKDZ3spo2p0wSAMWmrWRhossr3tnS1CURlhgzQuUPRLy5ZHG7rBEtAyljWrVAgBKposLb7T9bwdJ2/nLcgqysq8ue2zMmtVee/CiLZLuQj/+4DE8IAVgVkvriTW4s+pZTXMsW0dKOoUUYVM4wkWS3IMSCmFFM6xg0gowiUZEphuqoLGDgkcVET4IWQQaqAk0LYO7BAQFbll9tgKFMwSEww2Cgw0DIwoHY4KFUw2DIHBYPAoKBiZUBoCgkAgALoBgFAQL2JyN42dnkC6GKSy3Isd5x1kYsizuzAW5VE5Xejksq3Ig6tNIKWvVt2K8zzdyxuvP0V+cmYzK3XdyVSmHsc8KTWNel+mv56kP8uaq0WuY7y1lS9z+xP7rY4Z6pOdytW9485jllbztax7n/P/DuW+Y/v+/hvHV/V29+8P3+f22aLYMZ/sDgDteE+e7XtrcQAAAACXbq5KnAKBAEADCOAONc0c0wMxUzJ4svMJgIswfRIDOQBCMGoxExKx1zKPKsMTsRIwOAbx4FcxsQFDAJDhMQEFowUgNR4DAwHEzDAPMiRs1CEQUHTDIcQJNgNDAcxQHDGhUNqlswqTTP/7kMTsgBXhVymusRci9ylltruABQIDARAHiIYeBzkioAMSg4wSBgADWKBgiMCggYAogAiXSBTX6Vz1JwyW4YggRQcHhEHBUwMDR0FSZ9l0MpiMTAgACgCfRCtM91C67T08VRFwk7cMNX8+6rw/MWZ23SCAANcQuUiXBTuRD1jzm/uWsJBQ09HYrw/UsP+xVzlAmesggBq7Qft5X/3Tc3h9nK9OV8+/Ry/B2YCgObk0nf6AYAqSP+8y7Ywtbzr38LG717tJSV789unv1KnM71LWm7ti/TVamrdilrVfraz7+72Gu4Zc/+91hhX3lzeU7RV86+87dJljqcnM9d3R26n442LF3tDdsW6arcuW7FLWu1bFu1S3K2dizWq1cLaE3lSZDUcaAEYjfQxgLXAcTPzMVVhbYdMBQAoSfTIUiaRcyYw+hMAEFSMqiSTeZOT13LayttCtW9jR0uxcuttZaXO0tb9ZOT2609dy0srbTWszZp7ml1trjS52bWmas1mtey01WnmxEeBrBp2VcCuCv+W/yqpMQU1FMy45OS41qqqqqv/7kMT8AC6eQSW57hIB0Rsit7DAAKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.00770975 + //_tone.Jazz_Guitar_G31 + } + ,{ + midi:26 + ,originalPitch:6700 + ,keyRangeLow:68 + ,keyRangeHigh:68 + ,loopStart:60827 + ,loopEnd:60939 + ,coarseTune:0 + ,fineTune:-4 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.00770975 + //_tone.Jazz_Guitar_G31 + } + ,{ + midi:26 + ,originalPitch:7100 + ,keyRangeLow:69 + ,keyRangeHigh:71 + ,loopStart:60940 + ,loopEnd:61029 + ,coarseTune:0 + ,fineTune:-3 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.00374150 + //_tone.Jazz_Guitar_B3 + } + ,{ + midi:26 + ,originalPitch:7300 + ,keyRangeLow:72 + ,keyRangeHigh:73 + ,loopStart:61635 + ,loopEnd:61714 + ,coarseTune:0 + ,fineTune:-9 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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428j9v07sPNagGay3rH6tLhM1dTP6//////////1rPDl/DHLGrrPeGfedyx1lvDXcPrbrU2c1W3c/8auEzV1M463l9atnNJMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//twxO8AJjYJRfntlgAAADSDgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.00448980 + //_tone.Jazz_Guitar_Db4 + } + ,{ + midi:26 + ,originalPitch:7600 + ,keyRangeLow:74 + ,keyRangeHigh:74 + ,loopStart:61479 + ,loopEnd:61545 + ,coarseTune:0 + ,fineTune:-20 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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Ty/1zAAuL0gl/z2yQJSpTMFL8pNlrFVEZ+4flnl/e75//9u/hvncL38yxt2+PEpsv1Otnatjc1SsuWoyRY7AFzMN/9Z/+95fr/1++b/nNfrWt7z33l78MOdz5nnz734WP5/M7//P0csjczNXp2fjFBQ5S6il9eYuy2ellJK6kqpZ9ZcjKohkiDJHGMhtEu80TOR2qAExjErlBoyiCDOmirROEqYWFsUUNhZYB/K6LCfRp4L2L8Yta28vXsaC9i4tuC93WDFrqz59XFvWvhPtWta3rWu/rFrZevbVe11i1rf+tdYfPq2tb51//a1t5gvd5rr2+a/Na1+IT6uLbzX2fata1vWDF3nXtbMF7uta69rW/+a6xCfata3zX//FrbzBe7O/qPf//9P+VUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxPQD1PmhLZ2HgCAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.00727891 + //_tone.Jazz_Guitar_E4 + } + ,{ + midi:26 + ,originalPitch:7600 + ,keyRangeLow:75 + ,keyRangeHigh:78 + ,loopStart:61479 + ,loopEnd:61545 + ,coarseTune:0 + ,fineTune:-20 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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Ty/1zAAuL0gl/z2yQJSpTMFL8pNlrFVEZ+4flnl/e75//9u/hvncL38yxt2+PEpsv1Otnatjc1SsuWoyRY7AFzMN/9Z/+95fr/1++b/nNfrWt7z33l78MOdz5nnz734WP5/M7//P0csjczNXp2fjFBQ5S6il9eYuy2ellJK6kqpZ9ZcjKohkiDJHGMhtEu80TOR2qAExjErlBoyiCDOmirROEqYWFsUUNhZYB/K6LCfRp4L2L8Yta28vXsaC9i4tuC93WDFrqz59XFvWvhPtWta3rWu/rFrZevbVe11i1rf+tdYfPq2tb51//a1t5gvd5rr2+a/Na1+IT6uLbzX2fata1vWDF3nXtbMF7uta69rW/+a6xCfata3zX//FrbzBe7O/qPf//9P+VUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxPQD1PmhLZ2HgCAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.00727891 + //_tone.Jazz_Guitar_E4 + } + ,{ + midi:26 + ,originalPitch:7600 + ,keyRangeLow:79 + ,keyRangeHigh:96 + ,loopStart:61479 + ,loopEnd:61545 + ,coarseTune:0 + ,fineTune:-20 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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Ty/1zAAuL0gl/z2yQJSpTMFL8pNlrFVEZ+4flnl/e75//9u/hvncL38yxt2+PEpsv1Otnatjc1SsuWoyRY7AFzMN/9Z/+95fr/1++b/nNfrWt7z33l78MOdz5nnz734WP5/M7//P0csjczNXp2fjFBQ5S6il9eYuy2ellJK6kqpZ9ZcjKohkiDJHGMhtEu80TOR2qAExjErlBoyiCDOmirROEqYWFsUUNhZYB/K6LCfRp4L2L8Yta28vXsaC9i4tuC93WDFrqz59XFvWvhPtWta3rWu/rFrZevbVe11i1rf+tdYfPq2tb51//a1t5gvd5rr2+a/Na1+IT6uLbzX2fata1vWDF3nXtbMF7uta69rW/+a6xCfata3zX//FrbzBe7O/qPf//9P+VUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tQxPQD1PmhLZ2HgCAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.00727891 + //_tone.Jazz_Guitar_E4 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0291_LesPaul_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0291_LesPaul_sf2_file.js new file mode 100644 index 00000000..a1207a5d --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0291_LesPaul_sf2_file.js @@ -0,0 +1,365 @@ +console.log('load _tone_0291_LesPaul_sf2_file'); +var _tone_0291_LesPaul_sf2_file={ + zones:[ + { + midi:29 + ,originalPitch:3900 + ,keyRangeLow:24 + ,keyRangeHigh:39 + ,loopStart:105620 + ,loopEnd:107111 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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qqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sYxMIDwAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:2.67558622 + //_tone.Paul6DS2_1c + } + ,{ + midi:29 + ,originalPitch:4000 + ,keyRangeLow:40 + ,keyRangeHigh:40 + ,loopStart:115945 + ,loopEnd:117354 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:3.03510356 + //_tone.Paul6E2_2c + } + ,{ + midi:29 + ,originalPitch:4100 + ,keyRangeLow:41 + ,keyRangeHigh:42 + ,loopStart:121208 + ,loopEnd:122537 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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hgyODCpCOaOS722STphCMjIPmySJINT5DBqYnvNGRkaUDYPmkVFRWxUGorTCwscUHQNjpFTSgbByK0UDY4kFICpw0VFVgoWFlgo5pJDkPbFRU2GtRVm5VYKFjahmskVFWlVqGKOpmbVV5VahtRVr1WoFhZYZm1FRW1FVqGZtmuVqGVa2uSRVtVXYWFqhmuVVdVXa+WZta2Fl4ZuSRVpVa2YWooWO1VdSVpmskVa9VqBYGxsMzaioraioqENyG0xBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//s4xNoD1x4RS7zEACgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.92313790 + //_tone.Paul6F2_1c + } + ,{ + midi:29 + ,originalPitch:4300 + ,keyRangeLow:43 + ,keyRangeHigh:44 + ,loopStart:108644 + ,loopEnd:109829 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//soxMsDyzyrAz2GACgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04927586 + //_tone.Paul6G2_2c + } + ,{ + midi:29 + ,originalPitch:4500 + ,keyRangeLow:45 + ,keyRangeHigh:46 + ,loopStart:94471 + ,loopEnd:96055 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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alZbwDAGIQUMHBBJhAGAZMKhTMHAABAimFwsmCgIGAgw//////+hWHAgCgTJgCIgNDgHDAGEgBKACBQBFxUri0xggE4EAIGBqYGBCFgEBAamAwLjABAwLQIBKLwWCFL3////////zAQEQuABgSCQoBpKBQJAwhA0KAUMgMCQFAADIgAoAzAIAk+BIBwgCGRDAD1GtLJYE81xDJt1lFzmvjoAFzmtjICf//////////48BokDwsBgGBEDAUX5MBgHBoBCIAwQApKBAXAMgAMtIAQDTXIgMHgTMCwMEQCkAAIZNzGQCVuetDk+0dZ9EZ2lYDGFgU5XgQ4uDGJXTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxMIDwAABpBwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:3.02234483 + //_tone.Paul6A2_2c + } + ,{ + midi:29 + ,originalPitch:4700 + ,keyRangeLow:47 + ,keyRangeHigh:48 + ,loopStart:73800 + ,loopEnd:74742 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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jYcRgoLDCJTMNisAHpW8ycgwUTxGngUSgshDgYvMimkwafC05hIGmBwyZLJ4ckRVmkAGHAUaLA5ioLGpjOYNEJp0GmQAAgTDCgSi5GcCEYze//uoxOgDpvYVOm7tEe4UROcOu8AETQgPmAA2y8gB6pTDJsEn4gGHksCQWYKDCdBgJGjoJMIggWBgqIRYlhAHNIgZWswyCZIDhIYRAZg4gAY5gUYjgAHAKYQDTQAuHoLBwMTjGQAUBFfYQAoZCBRGCgDQmh49K/oAWLTw/1+pBHpNqj7KaeVYYYc+vhha+5Tsbk1WvTy7C5hKrH2Kj552+yjuGde/+H5fvDl7+//6z/uOuSLeNJEPobc3a3OZxHsxhUt1+VK+7Wd39azt/fwz/KH383unl9NcpJZL5m5KqSUXonG2kXsJfT2bEBRi3lMVKSfrz8vpObv51qlJSU8/UpLFB2B4J3F2FmB2Go1MDQgGAMEgJ8wQgLDL6aLNxoiOI0RgJAshAEpwu78GdWs9DThEQNZgBAKGJyqaaxxb8rlhgGgCBAEpkoGCmNWjtVuAUAWJgkAYx3SMzBoCVMEQRPP/LLmAqA0FwCDANARM8BZszNEfzB7QGMANfv8bmaKZgLAKqkW+YCQAaRZjAFMmOwFqYmhKpihCzmMaU4YPB+f/+9bMAEAJXRCAOHABIQDQAa+WfGIoNiRCyGNsbCY+ReJhUEPGImQWYOQkJi7Cl//71v/jaxkNUP3341iAoFZOYIwFhgqAvmDiGgIREzAoCHMLwJcGhQBQCQwmQojAIDf//////9jblJ0NUa6nW0dylLG4OCutu4IArMFQEcwAwaguBAYJoIBgCA1gwCcwTgPzAPByMAEC4wTQNDAQBpAgFP////////sOSsXgylOtebSlLGQNJUvYG3JajAG6rXMB4BMwAQNAuAcYD4BxgBAahQBEwHACzAFAwC4BxgOgEGAIBmFAETAaAHMAcDAKgIGA2AIYAwGP//////////+gnTuL0IJEnS/aEtPxChFRP9CtCWn4iIg4m+kmiukokgDAETAYADMAkC4GgIGAyAAY//uIxOcAP43zS/nvBoAAADSDgAAEBAGIMATAQFpgEgWA0BADAVGAUBaDAEQMBaYBYFgJASBQFRgFAWggBMHAUmAaBcpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.47286206 + //_tone.Paul5B2_2c + } + ,{ + midi:29 + ,originalPitch:4900 + ,keyRangeLow:49 + ,keyRangeHigh:50 + ,loopStart:75275 + ,loopEnd:76115 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sYxLEDwAABpBwAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.49155173 + //_tone.Paul5CS3_2c + } + ,{ + midi:29 + ,originalPitch:5100 + ,keyRangeLow:51 + ,keyRangeHigh:52 + ,loopStart:89842 + ,loopEnd:91338 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.10313793 + //_tone.Paul5DS3_3c + } + ,{ + midi:29 + ,originalPitch:5300 + ,keyRangeLow:53 + ,keyRangeHigh:54 + ,loopStart:87977 + ,loopEnd:88645 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.86213791 + //_tone.Paul5F3_1c + } + ,{ + midi:29 + ,originalPitch:5500 + ,keyRangeLow:55 + ,keyRangeHigh:56 + ,loopStart:99342 + ,loopEnd:99936 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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1qst5VZA0tY223nr0lmH+jM+xCEshlMrepaiA97ncQfZPgoGpu/bS0i23gFQNg8tpaspjO6WM/VjOW5Tl2rR02cQ/72P/3707zmud/1+l7y6aECq6G4cAHpV2W8e1x0ADNKdMRglVYj8blUuqyqHrU0/0arQ0/1yNQ1qVRrVamqENCMzNUQTc1YWAYiBIVEy4BQy8hDLKyJpUUrNIosSSNAOzLEiWmkdmWJVppHZnGrTSOmkUc9VvrXNRw4lhxLXnDiWHEq841ekq741eq159VlVszlEsqtlHDiWVWzOUSn+mwgX//wV3guIqFiaCsDQVKb/Tdf+NUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxOSDzs0RG/yTAAgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04286207 + //_tone.Paul4G3_3c + } + ,{ + midi:29 + ,originalPitch:5700 + ,keyRangeLow:57 + ,keyRangeHigh:58 + ,loopStart:57136 + ,loopEnd:58192 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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T7bApZAwXAowXA5PsGgUTAWYGBHKwIBZgkCoWAswQAMdAQvLnEcYtjY787Xq//uoxMAAP/4dPbnegELXHiCrn4AAWLlannK6wj5M4eRy16N3YPDK75OzuTtcaGyhgjkAUBIKRORSVWSuS1cJu4EANuqEldKqqvS813Xb38wx/X37eOdv//XHqUEqp0P6pup5TNa7c11wwle+CdDJkxG0VI+TX4yvos8zJB6FrSakFABvqUlsVgUFWyMBcgEgE8SQym1vd/y1wgAMRpEKQq7CaJoqltFtENMl0xFuJ0ZUww5dz9R1yYdoHanZU/0PS7tWUxnOloGVKmTCfcGBMg2rhQJkKBiqWxBTJAMg9CWBIrKDONbhlrLk9qxml5lll//+8frRqNYRJ2nKd6emWssRo3ZZy7t6tTd//xxxx/LLmWX448ypuZWj3LB0qdBVR4SlQV8q4GiwdzwiPSWRKnQVdwVco9W4RKDviKCqzqVnRKd8NFjwifLQ7UxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.01827586 + //_tone.Paul3A3_1c + } + ,{ + midi:29 + ,originalPitch:5900 + ,keyRangeLow:59 + ,keyRangeHigh:60 + ,loopStart:65092 + ,loopEnd:66033 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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S1YwKA4LgW2ZeYKCcqgaYJAKCAGMCgPZgnu09PFexgiF5gQF5hkBZg2JRgSEQsEZgUB5gACZfwRgCy2RxCbv3W5QKzZ65pprpM9Zk5rUF1rkYEnK/bbq2MvVtXilaFwGQyZ29kFKbCIBUbWmOtXatB8v5TxvDjuT2UvobzIKlHWa47jS4MZc3rL3/fSq4sDuRBTowpdqDSlTV0vXZaUkqqq1FOZwoNeB4mnITbWvwz5a5nnWys48vZ/3nquT4UHZ63JtG8Ye0hdy6Vds3XY1trLvOJDj70DAX0feAXFT2aVA7u3nKUNYDAkPdhluz7SJ2QAEfqgAP/zCGIXquRCUTgFhIlppFE4lhyVmkZOJQSJWRIonBUAwVppFFjp7VVc1FyJHCRKnI6CsBXVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxNADxzilBTwTACgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.03079310 + //_tone.Paul3B3_2c + } + ,{ + midi:29 + ,originalPitch:6100 + ,keyRangeLow:61 + ,keyRangeHigh:62 + ,loopStart:47031 + ,loopEnd:47870 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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/9r/////13/7di3fuwHP5frJ7bHMILuc1upB+f4TU7+/u3uf/KPPtaprmu9s/uU9x5rtDO/nftYfh8etdzzwv/r5Tn/7oiMBSNUABAAWEAAAAAAAVj5SweCM30IMQiMaB4YY9D0YVw6Ztg6PAEZvEUlYa1C0ZDhySjcRAQSjUPBYIx0AwsGGhpgSuFw8wNQDDowoqNWCmtJzmKFaMgODzPygiOgSCmt3JnAkZAABTYOCMCAlMcBSrxGzzBuIMYqIGWbhggCZSIhZ/PPEy9ZkYIGNZjgeY4IGmrhbQwcBBIUYErBZiOSXWIA6DNcPUMhJVMHLxalMNBywIAKPMpfDAhIwsLCzKHNIOEBwNM1CDCm8DLoKGjDWUHSgEBDIwUOgCEEhkrHlOyYHTSVA5MfeYRhS/gMZLoXcstGFpURfgwAMFQAxQPL4KYqdkwgqdTBGFVJzFixG/KZM+0AOcxuXvHTt471qkqfGYIqRmfiTfrCMUbOyhgj5sgcSFuA7jzvVF2iZRjH6mcCQbTv3GHMswfUYu+0hhuWUVuURWA4Ph2nd/snUwTAYuqROhqawisDV1yLUb5hjBHmZQwTvOf3f813HvNc1///wHbp7cvl/M6ekpN0lJzeFjf4LeL2IKNCL+I+Osg4mo/yRCvGxJgN4vhQSUp0ULroolvasEFRy4iAE//uYxNuANZYdObndgALOrmq3koAFCRMuAUAoAQAky4BQAgZDI6IgBAKg1BqDUVFRUGoNW1JFQaioNQanSKg1D0PaKDoVFVXKFgbA2NgWFmtSRVtVUVFRUVZRUVFTTVokOQah6bBQsHQqtcMzMqqpKrWpIqKiq7Mqipq1syqqrXDKqqtcMqqq17KpJqrwyqqrXDKqqtcMqioqrgoFBRUIJBQVwUCgpsIJBQXgUCgrgoJBTYQUCuyCgl2QUFGwgpVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.05727586 + //_tone.Paul3CS4_2c + } + ,{ + midi:29 + ,originalPitch:6300 + ,keyRangeLow:63 + ,keyRangeHigh:64 + ,loopStart:36335 + ,loopEnd:37082 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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HUQABmAWBEHALo4K5eZ9DBmCFDADTA5BEMCIKVDiEAMmBKCsYFYKhgNgGkIHX//////pgwW5EQhu5J0xaz9SGH5WAQDkN0lEJyri9r+rDCIAlOVsCTqVP////////rsVXjTXoo/jUm4QBCmBPC9jK3/c1nrqRuAXFVWZVDbZHCg+GaWGl4sBgSn///////////47g11xZG8rdoXKmtccaXxh2mU0EUfmLu5EX5aVDU3JIlIn1pZU8MRnI12MtyhqbepMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVV//t4xOMANOHzOfnvBgAAADSDgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.03206896 + //_tone.Paul2DS4_6c + } + ,{ + midi:29 + ,originalPitch:6500 + ,keyRangeLow:65 + ,keyRangeHigh:66 + ,loopStart:38001 + ,loopEnd:38667 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.02820690 + //_tone.Paul2F4_3c + } + ,{ + midi:29 + ,originalPitch:6700 + ,keyRangeLow:67 + ,keyRangeHigh:68 + ,loopStart:19711 + ,loopEnd:20305 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.06434483 + //_tone.Paul2G4_1c + } + ,{ + midi:29 + ,originalPitch:6900 + ,keyRangeLow:69 + ,keyRangeHigh:70 + ,loopStart:26025 + ,loopEnd:26553 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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1mva7Yy5TpIIZtCRHQwaghQhPYugPQEMUQoQnsXQHoTGKI4JHr/qxlEjNaRiSHrbRyH8qgiDU1aEoCR6VgbDtGtEk94HgAQWJ4FgbA2BagdA2D4aSKh7ZIqK1AsHQfLFyKmwHQNjShZpWihZdmbUVFbJFRVYDoGwNjYbUVXavZmZvZrlRUVFbJFTaYWFhZWZtVFTbVV2YWaoZtVVeVXhmaoZuVVblV4ZmqGblVW5VahmaoZr1VblVrZmqGa9VW5Va2ZqhmvVVuVWtmOYCngouKKyCmAp4KLigtVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tIxMkD1kXnT/zEAAgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04010345 + //_tone.Paul1A4_3c + } + ,{ + midi:29 + ,originalPitch:7100 + ,keyRangeLow:71 + ,keyRangeHigh:72 + ,loopStart:29133 + ,loopEnd:29955 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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CAEQAMt0ycGAF3kjUcaOAolPVcaZ0YZpHRfWimZmdlQCCDXWvpcI3pJrTLLq/MBgEu3FzA4BYs4gQA2xMEb9cjaITTAgFRMBAHDAKIQUDAGs//uIxOgAP84dSfnOEMAAADSDgAAEQwCCmuiEBAYDLBGAQInGFwACgEouXuX8mjWqvFDVt4oao5qatVccojKcIjKb0zVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.03693103 + //_tone.Paul1B4_1c + } + ,{ + midi:29 + ,originalPitch:7300 + ,keyRangeLow:73 + ,keyRangeHigh:75 + ,loopStart:32065 + ,loopEnd:32484 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.01913793 + //_tone.Paul1CS5_2c + } + ,{ + midi:29 + ,originalPitch:7600 + ,keyRangeLow:76 + ,keyRangeHigh:77 + ,loopStart:20736 + ,loopEnd:21529 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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a80YynyEzawmtMzJfc1FBZTLVQGCwNhidjLcppmI2LWWzAFADEQBpglAPGDOAuBgATANADMAsCQiAWcB9zDDCKMD4B8wtxFjCDCJMDUGQwFQazDADjMBYEcwRAJTAWAj1r/////Z3O0jB24J0NKUssJWNlUmkKIgATAIAJMAYAkEAKmAwAGYAIERe0ZASMCsDYCgNGBKAkQAHhUAD////////wwANwER1oMkcB9Vds9ZuuxNlExWBORM1BdNswAgA1VU+U0oCa8vGunKpqmiuACgEN2LZL+///////////yI//uIxNcAPQXzMfnvAkAAADSDgAAEAUAgCrjLbsCLoKmSsa2oQj209L9rSCi6kUJ1Kx8WDrSbcty3FTWCJTBTOnShacsAsRjkMxBQKAmvTdVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02582759 + //_tone.Paul1E5_2c + } + ,{ + midi:29 + ,originalPitch:7800 + ,keyRangeLow:78 + ,keyRangeHigh:79 + ,loopStart:13579 + ,loopEnd:14323 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.02406896 + //_tone.Paul1FS5_5c + } + ,{ + midi:29 + ,originalPitch:8000 + ,keyRangeLow:80 + ,keyRangeHigh:81 + ,loopStart:12788 + ,loopEnd:13346 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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WAqmAQB8YKYGhgXgxGBiBOYNgQZgKAdmBAAAYFoGldT3f/F8v57R6LNlr+2qOGJQ3j7v2+8TcSBm5NOgFwXYBIASE5GoKACwShJaC0n/5C88/5Z/mnoo//3Erw488YgZrE4yx62DwC31Sfxp4YYdEqeMui+hdZeSdSwNp0Wu1ZS4PJ/ef759/C539cw53u+zbzu40NcjTGUQ//uYxNiAPAIdQfnvAIHaFiCrk4AAl+3kt078PWwdwV11ldwUyy6uVdKlLHQaAJBSXy6nSa9DzIlrJGvswkCAArxQVhihJu5dWQACoIgiS5KVxshFKGNIhUKsIacqHu1aWlx7VlL+v7Dswypd0OzTtOU/z/S6mzfZTJIZQZp02hiYCmQLTwQU1LNAy+MOJzFsi40gZUy6PqYqCwIhkWaeQt0YQF2nmcFyXJh2vDLkxXCVS4CnncsegqVBVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02079310 + //_tone.Paul1GS5_2c + } + ,{ + midi:29 + ,originalPitch:8200 + ,keyRangeLow:82 + ,keyRangeHigh:83 + ,loopStart:23361 + ,loopEnd:24695 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.00334483 + //_tone.Paul1AS5_2c + } + ,{ + midi:29 + ,originalPitch:8400 + ,keyRangeLow:84 + ,keyRangeHigh:101 + ,loopStart:30297 + ,loopEnd:30656 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:29000 + ,ahdsr:false + ,file:'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' + ,anchor:0.00548276 + //_tone.Paul1C6_1c + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0320_GeneralUserGS_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0320_GeneralUserGS_sf2_file.js new file mode 100644 index 00000000..778e21ff --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0320_GeneralUserGS_sf2_file.js @@ -0,0 +1,20 @@ +console.log('load _tone_0320_GeneralUserGS_sf2_file'); +var _tone_0320_GeneralUserGS_sf2_file={ + zones:[ + { + midi:32 + ,originalPitch:3600 + ,keyRangeLow:0 + ,keyRangeHigh:42 + ,loopStart:13135 + ,loopEnd:13812 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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w4jKpBNUcCP8/DdHapJe3WajL1O3Xhl/2y13Ihth8PrkYY/rV3rdNBx4qfPeWp69b7QYzt7V2QwRS0lqSVpqRSq/Dks4/lppcPv29kMSiOx2NP5TUrR6KJ27UxPV9V7F6XS3U79jG1GatJcsWcc8LktlUUryqnpLtSks7m/ysQxVht7KGlrf3/uw9jNSyX5V6TUVtz+dJYsTdagl0xO4yu/LLFIAAsKqIhuOy6zgFAbmUdWsdOMbdIAkQcfMIDEkIWAluTCBzCAS0KDq7V2rtASAmAfB6HUO4dw7iUampqdNTU1NTU2NjY85xsbGzWta1rWtcbOc5zkj//ugxPcAMyZBJ/n9AAKZNGf/tLAEZFrWta1qLnO/c5zWta1rWouc7/ck1rWta1E1c6/3Oc1rW1/LnOc5znJNa1rWta1znOc5xsbNb+1qJq51//t///c5znONjZtfLWmpq51/uc5qNUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04242630 + //_tone.Acoustic_Bass_C3 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0350_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0350_JCLive_sf2_file.js new file mode 100644 index 00000000..af0c98bc --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0350_JCLive_sf2_file.js @@ -0,0 +1,65 @@ +console.log('load _tone_0350_JCLive_sf2_file'); +var _tone_0350_JCLive_sf2_file={ + zones:[ + { + midi:35 + ,originalPitch:4800 + ,keyRangeLow:0 + ,keyRangeHigh:48 + ,loopStart:27070 + ,loopEnd:27736 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:0.03727891 + //_tone.Fretless_C3 + } + ,{ + midi:35 + ,originalPitch:6000 + ,keyRangeLow:49 + ,keyRangeHigh:60 + ,loopStart:54082 + ,loopEnd:112128 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xDE1QPCPB0HHJAAIAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.00446712 + //_tone.Fretless_C4 + } + ,{ + midi:35 + ,originalPitch:6300 + ,keyRangeLow:61 + ,keyRangeHigh:63 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:0.00639456 + //_tone.Fretless_Eb4 + } + ,{ + midi:35 + ,originalPitch:6600 + ,keyRangeLow:64 + ,keyRangeHigh:127 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:0.00689342 + //_tone.Fretless_Gb4 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0400_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0400_JCLive_sf2_file.js new file mode 100644 index 00000000..de83da51 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0400_JCLive_sf2_file.js @@ -0,0 +1,260 @@ +console.log('load _tone_0400_JCLive_sf2_file'); +var _tone_0400_JCLive_sf2_file={ + zones:[ + { + midi:40 + ,originalPitch:5600 + ,keyRangeLow:21 + ,keyRangeHigh:58 + ,loopStart:28850 + ,loopEnd:34081 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:0.03985168 + //_tone.Arco_Violin_G_1_ + } + ,{ + midi:40 + ,originalPitch:6000 + ,keyRangeLow:59 + ,keyRangeHigh:62 + ,loopStart:31741 + ,loopEnd:36639 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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RyNEwFr4au2Ijf1ObEW/UZQ0VenBFbDFbRLOKOqkjm5oPjvmiKvHLWkJ0zYWNbNYtuOJMB9q+Yn47U5fMJutqe8bLNSfnRvH1rDjzB7ziClG//OkxNE7fCqKBuLf7Rf9F6DbeswIt9w9Sk2vF3iDArd5mrbTTPnGXGcfoAAAaAWpub4DAoYSQdhWwwQiNEOWb2mVqDrnMz7zHAMumzth7Ky9A0psTh+Nw2o6EYav5uvBAgINrFd7E4nF2AF2RM9ncP72j+EO1rVd/iYpVWWy+ZuwcWcb+jlXzCt40rSWPicbQBU3/hDDE5u3byjE3FLFjdiSQz3X9uS23362NhoVHvteomvKMtYSlulNhrt168M/yi0fpcMa09TxjCIUErpZXRf3XM4rjrf4Rv9dywxz7l/NY/rHfI1umwqVIZyqfhYiE/3n///+/z7zX/uP8zy+3MXdY54Uju427O9RzVy7vvbPMN4ff1zHm8tY0v5x+Q4a//OUxPZBVCqON1vIAbW60jxx+hxu55Y65lRRwtXAAAJZvMFJt70DKUGr4eOJgs1GRBUY0IhokCjDhB2vMUKE1SKAg3GpUAIBudsIxiQdHPkqY9EBxIMIR0yCWMqJjBBY6CDOWERgUPVKhomNDREoSReMaPzRmcIIzJ5E08QNPVjFgIwA4MbAjJBQeVjaoE0MJL8g0nTUFVxVxj4uDSIiBzFwASFCUUafGxphGRtZrvP43UeTSoMt8qnFgYIEQSIgEmA6VK5fSFkQUnKVg40sYmHWjpdSFKldgXDUxVVyYJl69oySAFCIhhWNPOlX2tTK//PUxNNklDp9D5zYAAN3S1cDKIYN61mHW3SnYQ09C6DmXSN42gQwzRu8HSSKzLXsmLLQgVfaMLP6KDIOgmWPq19QKMJ2s1cmPLkd2AYcZWq+X27j6YutOwF3Dclv3b8Up22rPTxYWtQ00e7M28Z9qL4Vo68z+NXom5Rid3JLE/2SvPEFvNyjNK8tK9FTGXMBm4fi8oyhqKUUFyuHE+1ZFrum/804srcvFr2LLYQ3KD4/IYam56FOczh133fyIU159H0maRyou/9iifuH1YATQdM2/wpiVC3CbCbEKQpiP00Vk3gjwC0AtAQgkSEooSYHMIcS5+SkW0Dy8kiSYutGQlLaNLj57Tkxe05WmJ6tW1tLNa1xpdzS5cuPrnJiueaXLlz3za36tWu41Wq1atOTGtbTtWVq05OV1tqtWrVpiue+Z2ta2suta0zMzNay0dGS3pqytWrVttWrVq2ta2ta1rTO2suta1rWrXpta1mq1rWtZmZrWta1qza1rWmZmzS5cueta0zlrWXLlwKCuhBIKCgoKN6CgoMFBT+qTEFNRTMuOTkuNaqqqqqqqqqqqqqq//OUxOMzW6qI/89gAaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.08078335 + //_tone.Arco_Violin_C2_ + } + ,{ + midi:40 + ,originalPitch:6400 + ,keyRangeLow:63 + ,keyRangeHigh:66 + ,loopStart:31752 + ,loopEnd:37084 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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+gak6RNNKdJrpIk4bprTUPxaQsoppPUbE+gowOLK6aCKTk+mkm5sbHnMXNjc//uIxNkAHKYfU+09OOvYRGr+tTAFnFOxdL5gbMYl0vrMkWRMUjKs3LRukeNTEi84xoYrSSUkTxfSvN1K5vKqAAAICJTUsDmKO3srOAiu5ooTGXIKvcwwZA4xmIGIY4Hhj16B2LABcB2KEBaNxjMxSNig7MGph6DEegEU5nLoGWwVLh6UBQMYKOhlaDQMKOZsA8YWTixYYPmg5lEB2GUJhWGZyCmZHQGcDRC0SwjBhwaJjDC1AGYcZiQ+QqSwBg4gHEwoMDymZKLIOkCyFwkClg8XhY6kwFMR4EIS1KMaAVnmBhKFoKFRoRMSICYCEAUzYvawMRiEEmJi0FgEGaSMALTEi4YMCBWpReYfSkZ6yVmMYKgpOTPKWsos8txPtMNJiNYTmDOrpb93E0Z+HZiKU8fm4u+NC9kApUTL9VJXVtbsQ5DaNz/X4TyWVJBWjck7hTOlhRzcPTD7xx2M4FzbyMTT8UKttNFMH9rMid9YOvI4S68imWvyl3nbtS9/qN65A70/RW6SmgadfyTQJHYGbG8GEelMSxd7OHIJbPGaJiseRvf5YFpTaw+5MOzVmAm1ZhGpA5DBLT8u9RQ1LmBQzTSCGpqgjsRe2mfR1qZYWYh8AQgAAAAsuXooSYHMDmEyMpBkpOUlRBh6i5LSJElBSgZSXN5bSclx//uYxNyAMjodOnnNgAN7P2g3nvAFOlli0YTlLaXFQwBvAXgFocLASoTYTYlzmX0elRXi4fRpU6hrNK9eva6/xa2YL169e23V69essJXK1691CYlczPq4fPn11KrVbGgsL2L7WtXX/ta1tYs+tmC9e2zWtfaE+rX+0J8xK6Liz58+fWt8Qnz59uC9jWtv5q9e2tv5q9evX1vV69evXtvWC9rWuvWta/5161rr//1rWvxZ9Wtfa1rWrXXta1rVr8WfPnz7UIKCgrIKfFBgqkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.12716800 + //_tone.Arco_Violin_E2_ + } + ,{ + midi:40 + ,originalPitch:6800 + ,keyRangeLow:67 + ,keyRangeHigh:67 + ,loopStart:31674 + ,loopEnd:37668 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAjAABCzAAPDxUVFRwcHCQkJCoqKjIyMjg4QEBAR0dHTk5OVVVVXFxcYmJiampxcXF4eHh+fn6GhoaNjY2UlJSbm6KioqmpqbCwsLe3t76+vsXFxc3N1NTU3Nzc4uLi6enp8PDw+/v7//8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAAQsy9gESfAAAA//u4xAAACbAbY1QwACSJwqsrM4ABgAAgAAJOfruBgYs0AwMW4Pg+XB8H4gB8Hw+8uD4Pvgg6H/BAHwfPwTB+UBAHwfP/8EATB8H3+D4OAg78CAgCAY//0FAQd2//8EAQBAEIQAAaACAAGQ0Iz/xpwaIJiAKINQgSsKkMIAjwaoX7MgdcqWwwUKFhUgGCJqpZJVhDwyzCC/izKyg6lakHpGkKrtObq0qBHujwchsy8mxPvEIDYi7D8u01OGko3yhhsbxM9pHiYNHVBIu5UNRpxrc1XpGhwdSq+ahD8re2MtkeJ/mpwE9bXpycpZQ4zr2qSeaXYvTk3FJHLrunCj8uoX9i05czvxGK48s2Mcfp7FLQRF/puep6+NLTVNXb1HKKefpO6s9/7FJayub7l9iKVZvPU9Xs8q9p+9yuQXjDsQkMMVJdrB45R27rLU5Jq9FhL7GHeXItazsynVreeVrPHD9cw/33nudp7Vepawtdpvxy1Z/ediWZc5R3ZjLeFeGqW/azKBzwgMAJgAAFPi5La4yluCn3ji9WXu/fxqsnnoBxw9gOQDy47SZ8MhApDtNzejQ3MnISOCwlpOt7CkEc3O7baftO2GqBpmjXuUY955MsanLzY1hVtNQdL6ZBZ2y6zkPU67///9sH7h67oTmK929zeOfp7s67iXnVHsd3xx///w+2bD0nXy80VplRDFIjZ7/+P////mrqe3xv2S+3VLOVxZVbGauT9ILGAKLfHyvLseVSWe/LJHjVwiXfsUwwOL0mNOP7afVctOGW5ye8IJUJu8j7irhhLapH6qRZjlBVtYWHErtXn8yzYXKhvzneV25WUxIziz2qNi452Ngng3yi950+adVTfxRmReKNW8oZCUJRN6qi1Z7RouaYvfTLO5pbwm9lKUvAjpr1VsyzZSvCIkfcCFksYq9edbdvqGx7EdhKU0DGSRRWIhA9LtUTCjr5JblGddtXJP5n/jkPX/YpNy8YDIncliSuiQlikbq1S/lKur3TlP+68K+VD6l6KogRAgNTAAFkycjiYZyxn0DMyb3jtPn+vGCw8ITFrSlMZTcEgjHCoju1GaLQwHHf3tcqY1J3TSml+QR5Vb3Rgdl+Bb7+dQm8NdL4rPS49x6KQM3tgIA7pdvUkUkYdGIE//toxO2AlGHvb72VgCNhRGz1p6Y9zO4MgvWuPHypohsRZvxcVhCRp6IVrvL+mbQmxUi6bQMURT9o/Whtbtrsl35psyuEN6KtvuHTlLJVuNGmdWm2Q86uXxlAidpjMFqbXOsVh/6vtL4A3dgztyJffN+3dOTvZiLbNHWMhJjl0rWkEYUxxO4biFVvtmEeejn/n3+37zjzlL5Pik7gMGQaMTl5OIpV3NQZlEqypy3oXCpRQdvAdFEwiR2yQEmwj+kEZEnGspqzbnQKHgXLHGjzlzb35uCC9liWEIB1st15DmZSgsqzskX2AWBV4r6cuBOaRq60pAhRiSv5DSVyIB+sUJjQ1VnMLszYWnV8qJ3Grq2KO4Uj7ea0VUa33VuNaBGkgUfmcgaah128Q5VWzjOoMf1zmWOYV/WuFRCVFM43LlT79baq3uq638yNFfnf8SLFvRz3R++tNBzooX+os+okJDJt1z8Xtb/H//uIxNkAHE4fZ+09k2u0w609p6L9oe0Kj0PHS6j5FARFaGopIDw50qYUEG+0VYlv4HCKP1FFADAGAGm5RtJOGFLMsfFNVPcyQwMIiEIhzoMqULjCbIwx/1VkJzpEQEwyyzjEJBHaMHLUu+ZSFHB8UEZkyzw1WSTS/IKIB7Z+9uSiJDAgeswipuOyt0hRYsTHCvhSISiI3I8b1Tr0Fs0zb16GKemay5dHl8NaWDKgWgmbtjGxDiHbtmmmM/Ga8HGIUNsk3vOkNDlZoGNYRZQQb11iE1lCzWn/rBgVxv8zHStbpVHlMhab9LmDnO6ZR3ri8fo45eVd1OTZD0/3WuO0jwkvJ9w2nHXcMub47pZ7ockeF8X/JACDhEyYQ6oIBc6WRwIGq4qksutle8TWCIclI0CCk3yPi8CQCJFBGt1soKHAIpUJFRE7YFIQZ0alfvCurlZSGAAjilSpJuvCc45E3YoZRG+sgDMb0Yo61FaQDyz/+t7Tk988ZrducCAihCxQVe4kocBd/vPzR7n6ulmaw6EohWYoCzHQsdrqH8g7nY1jzZJVcxGxFekKgGoZBu2seQnar3EmCgLUFpsmXE/YbC5tVLEi8ta+M8QBJ3tjemWf8pkJPc6ih/7yo3JsTXK+OX19OIaqltV2/4ZBWg9x1DEVzn29A8LG//uIxOKAHvINWe09fkuEQex9lq+VIqyRVgyY2nyxIf3vmIYqcJU+4IpOUXdnQSBBJReJ3OjFkyAesC7yjZkCQUEmLGBgGQs+RDCpQyB8wRZiDM39eAFEzOhn7paDldbZlmo1bg63jNV3aKF9NhM0zzNzFB48Qs9xmIi6KCSxhjn3owBIgOPbv0wwDcOzN4Y6laYief3mLiykFxUudYkQuC9Jkwuw51aMxJj+tAeqWpj4AVYrPRRKgoA9LdNzo6A8lr0VniIrTQOHzjLrUkVIvzFQnD+snGtuxeS+rpGtmw2g8i3I3GY6l+nCZwFVYxnBRB9q/+QMqpWpNt17G5IirGy6oCgITyj6kTOb/izYrczyHc/g+gUzGIBGQk7cTTcgILhhP9tZYFS5hwJtVaPzM12AUiZD4B0b4yjbk10OoOMPza/c25RIgHm1nK7tYoqBLUStazWmJS92giAJYbV63FYBoDJl5di7/3ZIIhw0Q5k84YgtBoqqiAIw5rHUEgYjMvKpIogrRHVqOl4RS+5gUXulWsyr1mQLQNilMtxoHn9QmReSrWXycUNrj8TiA9RrEcXFmBgs0JAAex51OcYyHgutSlmh/dLkc2fQOs1kOJhqqcoDeOtrUz8RFHzSQnS9lHq2MIyoEonM3NFhN1kB5SsLpl9TlgMx//t4xOeAHVYPX+01POt8wet9pqtgOAFMGcpeXDEASyb40kuBCouiIU5MJn7FcLHBdvDM3nDawIiUfhyjutXIMC/BsVPhAMTjyHMaDEoy7l36wVY1H9/zBup3JP50XO+gHJk73bGJgWcKmvZcgm01mt8Rm4PePmLBSZRvot9+VEt2c6rqOXyf/H8Ou8bxmwLdo/z/HQXz/iUjdNf+akX/H9UPr/81hR/n68gtkbfxrwE1X//y7+rVvq1aU9sJTUTVH+KuoWsbvpEP831vTXW3/xKdd8apBrEZs43m8FYzGgU3YfC1mmc57+Bqkfe1Jb6zq1YE2s0+D1gBgK8BtJ4j4sKVFAzuu5KwvGZTJhDqmkm6ARZETV7KQtaVnMEQi6v4f2viXnVdf1L12M1EK8XLWXbwU0YmgQAzEqgX+k0PvZC1gCIxIKlW7qSkol1cPUqWAR43Zssg3lLa0mMTUQjEfGbz0hoZFIKknaOkYK7rdEkqugZpzq0USUBvpo70URrmyjjJKJgNsMXQWyQzj2Xx2PdajOSST61By6mupRPkiltWh61Ew3zhfR3omerYwJFD//uIxNAAHJofYe1h72tmw6x9nUZcTzG/mdCknjqSZdcwO1Ofk2I+11KKB9Ouqbsl2MzVNU6T8wRAV9yMu8ei5FwYHScfmoBCRggbwwLhuYHUhdp/6mdWJJ6pIY/v8ZoxBNM7meUmiowDB0SW3KquveUHig4U9s1E5a2UkQGnK3MIHk/LZWGalYyptzYXChgKcqX+Yt3FRjV8O8rziZcfy1hVm27hhKxhj/a60yN6iYRnvqKzZSnqKgV4wW+xKJ3UtQsCClrrHs/yUJb0EBmSrRSMhyAsjNlKW4yWfrJM18WupGH43qmj2n+64y1sWc4tbLlrd4Oby2x9+3ix9Vxnw3CtbZ/Yo+YUO8Md54va9wGj+ztxXBv36mQWyBKhpBppTj7mQsPA0AtmlZjpkIproAoZcmeAXQGySKpOwG0YkUDwvxljPX7oGW/etZQ9WgQNbOX7s7d8yPl/N4344SGBXp/Ol7ncQ5RT9Xvl5egNPO2rOWnhFoXsvRaIgYRrHUAUYtDQ0WyDBcCValULAlErLrNn0VOIwHPNWdSiTIbtoQQouqS0CKSq2QegZFH0BrGStVUnB6QUlTjsNUPOpX2WPYvPW06NqNa0mMC6zsgtaaDoNTSQ900DJbU0yWRUumo1JJTFjKJoayxE8y2KdXlxaW2eZlLOgCpP//t4xOIAHHXzZ+01/qt6RGx9nDW9UYQhQQrAKJnJyvjBRfLP3+ekwRhDEGlVQ45OiYUyRJaPHCs+gXGAIHIqu+6mxQqq/DsZn2+GWAGquNTSqK1ahnQLWMvqU7PAlwFAI0VyyNMVWcWRgFPCzk1PkwN53oJKDpyG9SITGSLIXOmQyZco3Yc4iLovqGia6lLE/E0WkGU50cTaCiwGMUEFqUmNcqfMC0ftdMbqLp1pFkelt3KzfMaXj0PCXeLXw1wMR/nyKmtM79n23+q4o/mjb9PS8dnvmnrEiWzvty1BrDgLtlGgooOa7rJJ67vSy1WFv7w/9c+ksVeUbUJQAjZKJvI1uY6OLAdsclbAICJqBRUNoxv/UkooRAiEwwBg+cffQLiwgtnvvPkgANP1v5XAD/oND0K3DFPavWh5yzXeqmUmMiaCBsjrwFlixsACEsc9/quEG297rn5NiXTfx4k5UCwFs+50EdHms6+TxKinatQgJr9y6hskTR4kmtdlnTI8vOA3B4KSUqociTPUsvkBqmk8bjM/44CP3rdf0q9iZ4fWbpfG5J9tsxNUFnQoQEUc//uIxM4AHGolX+1N+WONxOw9pq+cbTqNZUuJ0B3vc41zAhY6ub1mMZlAA4xQOHZUHgk22uzhk3bax9OHNj7YvR1BiBcSAsAIu8iSepkHDYZjz7mdEBg8RlwMQT0+mABgPBJqu3lWrDgEOAxWCr3cqUzIeK9/LGvQhySdmsnuj73jytasWs1sk2xU+29/fdYzKxWzZ9Tl0AEAZDqVl8E4SvQMxOHtWTANR48jashkfQoCdDybpizMjzXkikTjfqFgkap5wDsGUe7qd0iK+yliAh7bbIVFEaljPTkxBcao+YaVqtqeSZ/VNc1S+4s7BzbBUYK3NVqFyDW7GG8ItZLySvZPbDB2kIswyfmJwh+kyeQAIITUnqB3Knl99pEO1rvdMasvjYsnuEKBiYIEBATE7nYtJBpJlrEpYTPCaQBhjPZrOYFVwQsmLn5SRVEqApM9eGWF8HUFv3s7EPwsqGAEJlkrrXc4ZJEyUf/3UFmINkSupyP0u66iinGsd9jhgwsr7z/22FSyQZa8igFkzqtICcExB36IgyGdTYeJCfXPh9Gt/+S3MZt8lDr/6HogYn5kejSP9AT378xBMW/fRofn/z9f/N/8uHfNR1jwo+4fk4dCr17kpJR2Xw+CoyTY6px3pzOr0hoTHj6havZk0/3A21DHY2q9fZmZ//uIxNwAHKYnX+01euOGROu9pb+k40Xfqw2tX4tnFNW3mkk6XmS0AYQUm2y7ycJ40JYhfai0o1psWrFn22y/ihxQIz42BuzSAEFCHNFBV/DOoY0Ra7++zxKKGi9/HKplwQoWDTv71tP4mdUmo/rURhbq9ww1bBhcaL5XceVYJCgW3ztM1CLj6ieYwNxBQFA2+ICN9VcaiXf1DEb0UR4v6A0M/cLYU3+UUPcYAtrRXEGH9SGnGY0tyaaIe5cQ7iiU/ivYjDH8tEXmYiWkJV3d6e7iJlzYirslHb66ePjUd8lIBjH9VrF/Ut0SY9qAHqP1GnQDUTAUQHyuNUGjBbKnaA3UQHg5KZ4aJIXEl0EhYMUHMMrVDJHQMWCkrt0VrJ6zFKUI6me6tpW4eVX7uo25q5zGIQ5K5UtoK8MPCHU7edf/2MB047Pe8mmYhxrPWucoSqWfjWGe4hKVXW+brY6GQMU/9azc4Pem0vDBNXqMD1alrSICm0Dg+jITss4bi3MFajg7kW8vEL0CcG0UGqqSLFeiXj30keZs8Wqf89hkT/nulaIjn3z8acp3z3Xme6lKLE8DOtulm/36hyRR9hWOVRrA5t079hyrNp6Nk2h5mv66jrFrlS1gliFiBEhMGcnF0PAJFMxUhQAw8iANkoSTh/kwIlCLy788//t4xOoAGVINZe01fOOaROu9prPU/7MhzInhilPlV3NDiBQFzvNXmFhj3LE1jbekVcv65legxbBIZV7Fb3LQWIKF721oRJgTDOi0xDuEImxsm4ISABcNUrPHELVaLuYlYdDVmaPUQ6fQU5P3OrNQRosQ3c8KyltQJULqRkXqXHn6kRilqlpOxEH+t9IybfRFp+ZdV6yLm8VAfItu5pgW7PbI6229ztr/rZBefMoppqSi/nMSSYg+49CiQ/AlCeGtakw2rfuXNSxGeeTZPVTzGnMGASwEAHivRTGXGgYE2WlwM2qBw45BUHGHCl8sBxorVWsoAhKghhzBuwsK/P+VBVIta3rOvZUfZLyfrVc2wmCLotyatMzNM3xjAMswo8vyCqhX1Pz8/fQMF5c/vbo6VWbh2pP21TIh0m7+NPEk0Kt/f6uyAL61VSZgf91mz2zogpKuumbEgHPVqUSQVAlUkbGRmSy3sgfGQbaa2J4ZklLqUVpqSWpx8Mfrfet0knukksbqmSZMdg3UlLZAbX+VnlLtQJsP9va6jbm7evnmLY3maRC7GX62aS81S30Xqaz1//uIxN8AG3IhX+y1eyudRCt9prPdvshpqpZuYZcAMVtKLEnG9PW+CoBkMbumII2TCpgg3K+1RUeRVy5WnYKKpTJC7c/KPR0FqJkSLVaGJYKrH1QuQxeGL0HAWS7oB7HaOKkoR9U/u5h2IoTmKX8OU8w24Yafx/8aYua59FhWo0BzL1rL4lRst9YuFFSKSS0BYM9U6P57vQFqfVrqDirZ1GYcRhfY6i/mILJqJgXB2DAgTy1M6iTC7G6dA5D8Wu1dZrWp6Jm1uZkavTciFq/OFqqXLrKuhMCk7McWZmakENzhBmZgg6w/GykGdzQydS1IJl1lp6BgbNFz1QogNhSpNoKcnMulwFiti54BELlCQEU3qqVXy4s1uCW6JFgwICEyzeu/KAZSpxhjGoq+RUTaRV0123niKSqQwy/ckJXQERS7llFlMisLTb/6wmBGur/Wu83AZtiOdbx5XoYS1PHu9fAAcLT18OaxXwNKpUgBpLOj1GI78jASt1CgJl6BPEJZnoIT6kCNfEuYVgJE7e3PkCfq3TCZrX38nfmdhMqOPIvH+UD71s1SUl1xp3XHNHnW9js3PrxewwHbVSi4rAjH1Z7JiTZ8xDHHLip/X5Dj1T0wlhNwRQFACcpt2DkFYZiBaAyBQEQYSyPcjwiYUfD13IpWnwAi6RDi//t4xO8AG9IfYe1hreNWw2w9lS/Nx1rn9pXAXcgSy3qtSt1FiLO+VYcowQANY81qVRslLDkbGF/mFOrC2fn9wiZKux7md7uoBDgIOv2Ocsq3Of3+47SUULzv5/+TplviAf6kT9jxLGi+MxivlAFRZdUoIAek21Rk3lQnjVvPPT0b+c/dS7M2zCGdnrJjp6MYJYsmnpQqSnHox9iSWBAxTcW7nq+8PkrBtu+SZqxxpW++8tvG8zaZs3vSkrlC3W1I9S0wlAEkBYgAK8pU8aMh2rDkTA3wu8Yb67JjGmBBRFdZ/GVThVPJvoNiFmXXINAMrb4bsZ5PsNg2L9ZnUqcckFDtX+fmNw0FxyCEmHrYZ61gOBQNjnmAAHCH0ryPF+VbNL4sJEH5gHCNkENaZBn9Y2zH5TLSflkjCjbWNVR9b1j4Dgjzr3HPQZl1j7PaTTqEMPDvZ3dPY4pplGIr2//mk/MsVTsdH92qLXJc26RE1XYmG/Pq+7rDdWe+uvIVzWXOs+4om99gPVvL+tI+hklRUtLD9G/ty0+rN+rCtee6et+plStQdwchBxEAO8rswT5S//t4xOIAGqInX+yp/uOBROu9mTNcinpVeIzAyUwgE73kzjgVeMl54V6VJuYICwhizJf/GGjgMVdj3kPSpVc1R4GsWHNiQoCa7TDJB+UyzsyAk/pBcjN3N9yJGxvppCiBJwnSdCiGMOE3UqwsxhCa6mUTg0lxz/JApPfH0oKfx2rS1LGcgJPeYj2MFa4Hw2JG2dG5bVVjkNTR0rAwjxMmWnLsolik0zg70bMrY2S5IazBgbn1JPBb5dRILFAfQMXxlU0x3u9y73v5+pteLnPVF4ED70upLQZp52MdbueLrWHO8bGN9frmTcD1V0GDifEqEMUHECcAIAADnJsdIZiodR3WxHWeCmjBBbbvZSAUx4lvvUSQmtsHAjUMgj2P50gHyll/5qdrhYAxjJbrud1fAm4r/Puq+IXgQV3ncwziI4FRdy7vwKVd7nv8Z1Pq1+FMmyDTQq//oFAUUav1RFM+87/qUsLXz8Hx5v8aPVoga+cVNqNNrO+O4JREkgfbWuIt9/fQ9wzVthRyAnlM83aaKzV3H1fTW7tWmN7ebh/62U44L+1iUdO99jLvn9KsMYmf//uIxNSAHTIfXey1+yvCROs9l7OcrZrH6y59p/rMXipKw/M27SndFA1oeL6wnI1H30tG+cqFXVvNR8dz+m4gn6p3fulfO09ipxRVCBkIu8jGYCwdB6HIQrOCEwXTiq4aWO78yFDIYnpLdXjXyUgYwnFmi3af5kFJd6+CJ9oRDONsVcyfjH5QUZkfAHf3uqCToQMgebiFaxBKKspwxrLoIIkufZqRQC95fS1sOUtCqgOoW136hxE5ZpwZYuoVZsXfYoiEo403eoixBFalkYHEkTLSSVEmSIIdZdH0uc2ZTBBIZvUQZgkkPFs9pCLc/Bz9tIw32uNR2joQs6dqhBEh0uOLFNvjizZFCH+8kw04jSpqlKi+VYjHIlrEAdD2fYdvexnUNg82J5zqRlXDV0j8wiENSBEEgF8pK6DAxhgDPIfiBiiJmiRgw4CZrOomqBQuTUr+U7ATNyoEMeCuyS3+o4Y0JYz18qacFzQQ7eaW0tLEEyzDCyslZ7jvJfgc0nNYYY0AEBU1netWk3y7Fn8P1EiyKhd7Nkx+G0BppsuYlYpEs+sxJEOBvczd22Sf6xNDzXpl4ThV0TMmgkBiryojINUpY4mVWYokU33UgXRMka3UnICvWb9J1Hr1JHUh7rWqiw7S2+mXSQQUzO51JmZazFQQ3lKxIrXA//uIxNkAHPonX+1NeuOmxGt9pr+lw+xFb15NRaRIGUKGEjM/F7wouYVL+V80Y1T56o3G3So+QcYVUygAZAmKYfInm4OlKqpthHLGeiqACMdsBckbCc+KTUelRIwdhdBd52s+IUzV/W3k8ked81TJXFpH3KgMY5Xt/f/ignRdtfayxlQysszevTBujJt8f2BlCrp7uDaHKBNPbVlnYxPbRbfWXwL898jMfoqDzpMBsHKZ6BdnT5U4MAtr1MC/fmmi9urKZ88PX+g1v1TVGRS9mmsC4cWqYp5dWY0xAZLmnrZTmbRR+dR2dyDnugrEjtRVDQ5mZ5Mz9DRobqcg/LsvKMqLsBxAIgPj9yZAI5Aam41/gKet4ZM6ueU5TIXfj6uRvK6a+GOAkSPSrfP/4Ul6VnaLstfGpABigdzGhs3mMGLGU0u/9U4gCouW/sc+ZQaSh7u5wkwAfOl0QKQIfpnRKgCVNHRrIoJcgOrWSwsHtpEk/rMiareYCwIP1DEd63UTxlIvsmSD9SyK3uq3pkVJfpkP9DV0Cx+gYB0RRW2iz6dRqfZGmue+gcuUpmrqw1t73tgXU2yxzgkHs92x6X6TSHJo3ttlqTkRPT5iwwFCRwkwKcndxMoBoCdkbwOUI0mEP3A3hNiJ8mPpN262IwidwUO5f9mCgY8P//t4xOGAGSYhX+y9WmMqQ6v9prNtZXss61M8QQ9MXpFczaIADh4uk59l/i+g9zIKmeeUGq7aDlnj4O0UM1v/EE2Jte+8ZLYdW9ZxaYXDXx/Kd6hrJjVJiyiUgfFIyWje9Nl0KE96h77tUPgX1Sm3Wa/MyQRbXPosmuiP4c5lUGUPQ2vzA7WrUSaUwdAxGWFxvVUYs2qTCWWtVJNNFvSMkTzKQMD5mzKUYDwPpmCNMcAejZqqJIJKZJSjc2d1VJmSTGLtDqDZiJgMYASS5NptALG7kauHQGYxwXsbL2zfEgSbKi3ZuPuhwFAanf3+JcJQrm7UM4QWMj4UErv1pWdKIkFZv61WJFGH5fTX9UJZ17+/UYgnid0kePwXkRJNeZivC29li8GZPv1kRN6SK1FMdpVStTc4yk6QY4LnNUE60A+pdWaoOgIWECkw6bqKZWTd65Glpl2UWTRmdGiQxKvWcIRFktRukpSqighd0Z4SUlnU1jqFdUwZKquv7rW8jQqXgLO87hVypjUXnu58J8QJ/SJWnuy2iYxmG9g+NSu4uqzaepEtQIMGcDZBKZfHtuAM//t4xOUAG6YjYey9uqt+xGu9mD9tAg49A8QlYdSFhQybZxc3JBg8cUU4tK1xHuIGBGiSKR7y5ZjRxaIHVdfR2EdyKJ7ohUsUL4A8lNe/jrscIHC4lPnLMtvUSDNS/DepeKMprY6t72qghLnv/8tKBt/lvVyujIv7Vv/xutCoud3hiwNxefz9czx/6mVVpzQpHYy5i2N07fd15a9AWNfmml/cNwXDs9n3LuTm3z2S213DUB96tl5BHe/2Hq+JkQdGvVoicSsbEOTJ91T3ZmeT4re/fD9ibDpq/aQW9p5zTQElE0NhvLhEBJOqW2nNWVtnktFrZij1KxUW4uROzCDJSUoSAE5ynWtJC9cAz9kPMBUhgEOjy3LDLKG1IvKMqtAVRwEhONEhugyfw0eB5SfsS5+IdRNOCBvZXGbtaHzxbj3d/bvGKALi9+arbtF+prP3mgEMX2p1CWDYNkakSgLQXl6jAMhE4ghyPLp71ERW3plX3MBkTBa0qQ4Dc1UtJMfgRImnM3rMisktamTY47ZHqMl0MZMdqRimpzMtGqm2LzprpGQ5h1B7yPEemaCbJmBE//uIxNQAHmonW+1lc+OaxOu9mLNsCeN1JosZG7JKoKRQWneo+7H3lg1erPVZIzDNqUXAoMoYK/3q772/Ln/+VlY/eP+3IlgZYJUHEwSAALfIoFloToMthqAjPiwceM8NQlS+5BIhVmbRorPXTcvoEQ4TnWxntQWFYbq4bqTcnCxgzw+WT8svP4VSJmCCljy2pmmaOSp1h7mF+39URgGgazYzEICSnnXohbhKHXx+BSRt6ZgBkkZA/rFmn9ITpJvIrN5EKCj3cTpRTRdagEwJkbmSNTkbXrvmfoWuq06eRB2HrbvcCS+au3la7Zn2idl217wL2pT4koNbhzpUNbb8S5k1/sm2uaunSTbZA9rkljU2D+M7M2yeoo3HZYwoq98vRGpxx7MZEmqeoQqQAEAx3j7myuoRkmxM6JAJgnxiwpyWKTM7SPuZYWRL6SfjbVHuEQ8FOJ2U1t/oxBrLn/UtEIZOq/Z3a6noNXXft87uaMcSDh2P0tL9RCNRD+/umGhy3//W8WxuFY/vo3igl+NyyC3MFJv9QUHb6x2s4ra//Xvf/HkRk72FAyuxPEdAjxWdMA0gJRnvAgWiGo1OG9/SkY35/WjejVazhhFf8pQhO5ufO2vSZ3iATYNZpUkjNIjXsWOkL1r7elJG/WCk3O9trdssnp01jYXT//uIxNiAG/YbW+01euu9ROu9p7OU27lmyc9A5/E0PjxzMrLKyvzrTUcfU7JOIbWrWa7BPUCXAiECAA07ymnMQgBwMeT7fQxAScABClC0a5HhSISSkPdyrNRQOJsWuflwwy4O5/1OP8RUY38MK62gkOD5dvWcoMMZJi3nUwyqQ9IcM96fhModrNNcjJNnGm89fJXP/8xRO3Gmv8Q2lV4pvDaSVj1XOs2mkxnFl4uu64zvpNz9c5gpEJx5r+uHzr/49lin1u13LMe+8YRSxin+G57vGt/stsY3enLA8xSsJqHkwwI+Nv1csP87ruRV1nvCveBExn11R/etmv67+d96jiZ3ZcXJFoUZ7f1iOadNZs9+2/LLo5ntZrsRewO4CAAiCWkuV1ZhYBHp0GTS4euFom3UGZxnEAu8JKQ/qz3jVEN7VXn8pjMWeTn0tNFqQWZrS2vjUVTEbS3pDax7HSRkO072Ic5JHU5vv8khLA3tn7P5L5SkbNf/u6VfU9j3f6VVYhWvfv5lzRFKUtNw6DckgrJhudoskZBAAqzSp00hFJJNWXRuGQaKdN0iVSuusxb0TF1JquXR3vQXQGZJfqKTNRuWkBF1KYdoTg8nzxWtBa6zqFOtak1K+b9u3Scif5SYUc0oUUXxEEIXtupecruNPzztXF2L8cVh//t4xOKAHNYnX+y9m2N6RGu9lqfdKg1ghSBUOAIppcoB98goMyCapQcQPQKoQmM5VU4yhTLmoDjyHYhYkEFVca8sD2iLCfsV5JPiI4HAWa9fdalBCsOUvd/XWEKPJzC5+44h2ezP/ubFUHFyq/+VKMF3qblMvBFimptElwbK91OLJ2UtcwNn9YsSH1HD4IMzQTpngW0hutJR0QoPmylpDuPOvZE00K1ki+0yHaQ01IssyIKTKrkVm7Jj1SVuwwwtKVCifZ35NN/2/QO2+25JON3zmwgjp+2ukUlmH79o7Krc5/VQ2eDdaWpOYKQwlRqKJSXK4Wi+CDVM3tYAiQNHM4KUlr5sECyshjyHVcp2GdSGvxrWfm9fyjoMSqRy3cia4iCsd4PJoGsX9P8k+VlrX56kpYFGAEyixB8/lZMaZX7l/PuuELG5FS6y+mAgR599z5NSZJvvOaylqt1H//93MLf1HhluVE6uUGINAhzdXIgTcx6qJJJ6sJnqUGdnqoyE8yZQXg2M9TTgqJbmhYer0A0889DSwFHS6iq5vQ9L0r+pyH1upVskzX7U4vgwtE4w//uIxM0AGmIbYey1fStpQ6v9pTPcyeA2LFdnKEJ2Y8mcT3v2/1FZi6pPcJVxUkaCDafI9KjJCzzS4rwLFBxBngs1vx1lAXYJre4QBcbEK0nK1F7HcLFsZnFm5zKxGoGFWAiujllLOcgowoi/Max/HFO4mzk+/y5fAhLQ7G88LKHNXV+tvvzLbz2XfxvBO/3Khn18qlgNNf7ySPxlLr4BDZLoo0D+GR5lznCaHp/ew4MKiOWCGPs93LyGv+VASDP/agSaruHG3/2g+LqdUE4622Q8PgmmuqYNjvr01ofHET//SVs3fvvhFalxkUoNRvkQBVDKpxkHmv63xWufazwdhPYXUAUEYABQXF4GoEHBbP3I2YNWpWNJRI1ZylIFPjxXP5Fm3IAExazAtvW6WDzPBB61JtVammdJLReP0d/4gYMc53P1jZEIUtln9LU3KhUo32P71NkotX/O8119FOKPXpNE4JdnrWIGJkaqbYWBSrXYxHCjT5RPeZCxDfPLQeZBdkK00FhUyhQRdTlFPzAuIeokGf2JiSk9RIa+ZkJLssScgslpnQ5yamoS+XVItmZRW3rd/U7N0+DlyS54dQCk2zi7RMwDSHzkzyNC1OrfJlbYLqILtaHxGjo8MKkEMwjKDKvKffBRa8Gw3boMSHETNEIkWE3ILHNw//t4xOeAGtIPYeytPStkROu9pqekNe4FPV+PkhBkjw1Xyx3JBhqGM/tQxgo+CwJbEuW6jPjKdL102G8H3GGwNHSYRvtaPseezP8rrRDUQTWxuZ60SANgnu61CmXro1g0jKTXqMA5qDJaYYR+QnGYaCE1bKJ4bRLNv4Ih1b7ysE07PHNxd/A8HZ5reNbbvuB3nbcyPPRX2gOheuWYLgTF6L2NKw/IqSdOEgyUWao1QkAPUeHdJG9/vXRrRZcmbmtqCgPhnZeUoGLA9MNIp1oun2uN0ZWbLXnkPdbDQvT0CTEQAGSASnyeDbBwMx4eOwhsAoZBA4xghPOR2X+ATQodSafv4ethYTOgx/T0mXFr9tbuY0ZgjQdhkMrx1xeZpySBOpj+M0CCAKjU+ctvZL7RoajzeoZUAUps43mVHIbPr4yfBxxcfFDDEeUeZvjK24VT/KwdJzfwm3/gK1hoPvnJBNpbmni9j/9NZ3+obrR1LAQDNXq3Ac3tZUySKbPEjcddW+1SHbb7g0HSW7XzBBNZd+oTpiPqqv+FaY42aecYKo9pE8HY0ts2VJaogntJ5x4J//uIxN0AHNInX+y1fGORxGu9p69NYenaO9M+epSJTJaMNWtyDR0cQIIHAwQACJfKSMxktIWX1W7m+oAxwg5mkom3oAvh2yNVT4/eJIIHYvw2HWWV4TYq95XeqRGHAgli1FNZ5FgccBU2hNrnbC4hYDH8MNqyqnhPcuXoKKE5H3vMMWsQ1W7q3RRpO9/zjJDcbMY16mKpHX+erT7cN5pi876f4+D8ytnVdBMaSbHIggSs2vzPrnEg6Puxge03GcCZqHTWJTViqhQYj1mxCo016xCsopElgR5aOweuotOKqf8/7HLAN+0VWHAScgOadw0etlI4aF8Xvgg+DrU2goMvIOgPhzjh9AdQYVEAI1OcnLteBjtIPog+pRxAk3OO6lIFOE1TWe3mukpgvWVP9TXbMSP83mx7upMCOb7X+azyYyfjt5Zy/6iSKePPy/4jAff/lxpYO80PW7mWDvsuk17/hdnCyW/q4gcUr77+DmVD/0rCYjWg7zP6qydbpSBAFvNEgVQzTGLq42iRvx/D6+lCWp7Ow2Y+9rA+j5PXRSTGOruSXX/KRCUyKcYSyOogqq1/qCEdE60Pb9OiZ+JTMXQ5/K4JDkHxdoD+s5tOsTrzbHxFdtnII6o6tVUMULgBQABIDSnKx3UOwkFgiy3YFMzthzbojEgGP1ID//t4xOkAG9InW+y9HGNPQqv9h6+NAhsaTxilttyvAEkPP5FS8/UfMQahHf1M0QIHrgvWq0shtRw0gx3YGs67dMyZYnW+/rskTygfHnezYYIhjPl7Hay1F7f8/PcQOs3+FwHVFgSb3o9ToWr5rSCKW6pmvwxMLl9RMkxHAaMW9+vtfj6+pGZKT73/bOdf6wTJYm1nNT9Qi2PqdvM+fX+Yq7vX51thVkT/1BeTVSgkKhXUCGBh4763+tH5J+GRbfs6/YvXbJMywqnGUB5H5ExZVEDiCE5QmSg3d5XVQ7B2TpYxCPvwkeDFLDAgAGkg45ysbsaMQCmcRhYokaAIK1aDe5aCiA91DtfefFHy+VPcxy7iYLsm//txEcKTPnaCmu0sNBITJrWHaRo5jViYcYsPvT2I8mVL+/yvBAYUjDT6s5cR1QHSPDusRTecP8buOVUU//omoVJ/aU1Tzpr67Amsffu9EVNcuNaPm4cXX6egcJM/LWB6LYiLUBKHbbJiDgJKfTZQD6OXxXTyw/Xxi1af4KwRDldNx6LGXb1DYd7+HpPJRZudErLxxsg+9/syos1a//uIxN0AHfInW+09POOVxOv9l6+MlEqkn0cXkwBHPvvlhNJi30166zGVwjUze1U4LHK6BVEIy08rybDAiIVThthsoMgVDAckBx6l26AqSINRmapOw6IAxqCiu6/HIBEa59WUwOOqNmvW70amk7zMKRbos8PslUIfHv9m72m5pLvfrdvCqSsjSm92c6ynYGMln87UrRRbmOssc5lZk/+9/pYIaFdo5RCvfNhyz2zrHJEmI580x5IwCVLPYUEEMiQe51SSNtycux/IIv+PVQnnYiCCu+43OIe/7eCSv9tk0ErrtEmJvbK1rHkBm/p2iLbbtmXRN1FtHYdq57Kyydm2yG5QXdIII1xK3ZUa9WpeYnKv9ppQnqYxWwBJm6kTFuUhcAMSbmz1VloOTGDNpdL0hrdwlSEQDfsgpE9BGFMqTkUcp+5v4JTyIZb5XpqzUwcrnqWtGX/YiZgSCnTu0fJWsggKmhBV7ch5t9TBAlxXu77moKNFcO/rsYbZbmXNMSgPPySGDNvSLgyelNSQbrSHaaL6mGwaz1ekSBIk1u40INr75KHM/2PGqvjg0OxzLjYPFddwYr3Ptyjp6NGAERa5i+Uj4cth+3sHQX1XBqbh6liS8pqr9PizZGalz6Ha7i6mh8i0ny4MObUnJQ/0znsn1Eu5VNE21S1R//t4xOQAHKYdYezBfiuAQ6w9pq+MhwBwFAAFGcntvgIIMjXK0CsLcPyMpp6yPOgGdiMTKmbs9YhIBVhoHY733KhMadkuWOV6TEDJhjY2KOzdgoCVsk3+tyogUH0kOrNnrPArxpnbnnhHoLHGzavRQLlQ4z+/FmV9v7Zqbr23/wYC3v7vqITuv/8RPpqubUrVikvAvSA1I3X1mlk9m18ZxGm+vm9Str75+HzhT3pdeU/3nOuyz/5/bFT85k91fEtu/rRNQY2qYqrvvdPpvWZry034WNXv6MCiifxa2boV7Q2p5Bm7u8CDcp4WNfGD8Tc8TVc2SkucXp2Nx3HsXCjCkABAEwAMZyaT3/WNE3JmQ6sxkTGuXxSZUgVSKWKPCx9YgQNAuKd1+qEtmv/mdSXwKSphzMJn8KacSOIrB8VxrNBajxIgES85Kr+T0EJbFe6yxoBghpWeuf74pzWP3mmBdLb/+T5BXZ/xjkqtvOMUX2Tf/xZSuOvT5MMpxwngxRCgHMdahVNaObgc50vnlIm20mapcWZvofJbZyctter2UkugeMpmZ1vHpmZbI9J+L5K8//uIxM6AHTojW+zh+CvQROt9l7OUC34ZssKbsxubcRx9Y2e0+LMWV2tH4d6elCRsdZiG8qKNw88V86Jc44JpAP4rRXwhNZ9/dHsnJbVPVEC1at1ytnE+QIcAABrRBkvH5czKHAIO4GwDHGnmKyWZZzlKQamPUy7v/gm8RJX7ut8pysZGK98mmaQYdBxcagrtLGYIMt5EjX67EBVoBcS/N9P1B65X73j+VQEgJQ9x5+9l0bOvqNxAz662iPEimvmAXm3TFibt8lka6aAXA0NTF1HDIPTGy0pMGFMVupc0N0GukHcWhLO7mDGpYkgth6AJsCAka7sTyXOPVUQSOtPI4OwsNHaOND4OpSIoJxAPobGWDU05VLdD94qCBfeUtRSPISwnCJS3ksSAFWFSKEBZTuCUQqu2X49BQ4uYNMCgwaIARnJrvTCgAUFcx548ZkKSiTAHXev6j4gggoTYqpphgheBkRw9WtVKexXggdaO5X1QuXLAqXB2t3orLJ+nTcGoKas/rdJKQCPDLN7kSprKiY8Oe6purnHgYLe3PXM+PG3C/e/me04qbD8K+kBGW7OXPbJDBo1pWNX60eksXBkDxc3XUI8ex5OgxsSxa6nROkJtdYhUUdTk5O1JSwhSRd08Z3Z/GUbu/4x5Uz2Tdw/rLPQLdY6ZpVbS//uIxNEAHGonX+y1HOOtROt9prPU/PUrNv+nTctWy9LT8dXbZCJpOR/aPXRGMn6TrRUcrmdJwTcxyYK3t3f9WsOlO2O2AjIECAY5xc5eXoMBHqLXFQCZKEYMYYOCUMW8+mAgEoFY0+4atiMiLV5PQXtagkyKditrledeQZYhH6nmsqSZYUYsI1uXczqVzBES7dJhR27zMYEp8eZWZWNE7Wu8/26yC9/+52IU40/quBb3LE+/lHxGjHzaCNpo//7y28eSxRNDtzcIGEmQbbRuu6m6eLXav67a8y5pVJluc9/Xhp53N4eoIPsmiqx8Zb0lb4tnByKr1/yIdbix5jYaurrxL5m/cQHPsb1NLYyrcO6uulJthVlKDUCwcJWU8n0R5h0l9gF4ZKTky1XN1+dwW3s0ukuIZMEAQKKChfIvPDGChEC7F3gMcVNEAMMFc/f1Fdq1R+HNf0lChhK3S/+sTNEKX/5EYFCwNTSW7vW30HRp5xg8ChFuz2CBQUPDqfPG910GRWM91XAU4Lo1KarbAYgmOc/8znCXf8B+Gl7ze+T9gOOrU2uCGfOt/wtz/4sLucKkdUrENk6nCL92iJpTQKyf9beVx4kEfk8zEkn+uBRIRvXLQTWd/kpbv6cX3NdKlsM9j0eGVdQZ988S6LvuXshzlHEe0Txy//uIxNsAHiojW+09POOFRGt9p69cDw3Fpk09nmEJZQg2LKqROnHNHtrTlU2YhL2QXLUeUHgDEwACAanK4rRgBFtbDeUwlMTXoS1YGSZVRmcOfl9XLWA4aDnIZfa1Y3QGa7l+u643Zdf9zotEAIOhgJ+bVXUdMF9POxyv3UFMWvdwxzfUzEcb3cMeKpCRkX/ncJqDqmv/KUpUtvvPW9UEDJvzIY6v0/jFC4EqUETVjEPJcP0aA9hkIdjpMSau4m55fdpOLKOX6hyFZ5/TNiU30/Mtk2Oe6dKmM/8+mHd56ufi5xiv5W5Yq5m0ev9Z7ZTL+rqptxh2a2serVfvstqzEnqodo2lROuzN1iI/2/vTW1N/MrC6WwcsAIAIkBwzlNnAYekghIb1Wc5jgFCIVGSuLquIGx6Ox77v46YWDHpJy7r8axmOSDf9uXhkdFS/Vv2KFmBxXiwMis16kTFpA1ephAe/6kI3nKn52iopc53WG4KVhlmP6xcb9a6+m56IlF1j7YywQouo+2JSBd48XO25Tx8wLQHpcw5HF9Liz4hjV6TPISCQnFM7rIo66pBa25Ox9/GsQokltWwryOx87311THp6wlv/uYwg/Odj6cpGPW2bHbf5/59F7rU3lzdnLNlam3ozEw7FkX5gVLGP3H1scvWhxrdn5d8//uIxOMAHFYnW+y1nmO2ROt9l7Oc6eh3Zc+lOrK92qpdY5MQgwQBCZfI7NgGiFzKGL0egQEUOCzYvawzZiTJ8NtzfocCggEMBc49vDvAEPaj39W8CqBVhnLmfd0xlT0N02OtyhQIiTS/Ozh3Fobm94gZogRA5d1KVNhBIkVakS6XOpMiwzC75iK8X1K1koLOR8xLh+qtMoiUTJ1qUUywVLUWLo0FdRwjEl01lxMva15saNdUwE/u1VRDU/mKGugkWG1qnR2egsmGfdkj1WtK/XKR5OZ1oIq6/FA4uRdaKBgqgMY2azxSrX6b8Dl9/6S1FjlVD1gd4FBEkBBGcpx9mIOGUCWLVCBobDC2ANAculAppHHSZ0M6z0USAUk5V13VczA5Xh+6+CfoYXh/46QLKAiIqE91Xji7TOCx+WY+9INffvWa1zcL7G7VTUMdKncph74UDVJiggXBQQ7k0luiXhJ69FYtL+nP75wpGbW+ucIR7eZzzv+ygdfN72jtj+2UDD+9hmA4PzG+iDLq/uUfdCb3kLU38h/ZUTsULH929Iu6vg9FT9pSJ1FTh87bD7VTpMlBE6vEjuPCMMUol9wRzqXT2O6Y1A6wdKaqOjxitzCSaIEBucnVzeFKtRZzZgFegpoOcAIMpvXwoQTXYY1gUEIkzXqPNmew//t4xOwAGmojX+1Bm2thQ+u9mC9Vy+ZeI8Rkupb23DNK002yKWzL61MmSAHV1Pza3zq7gimcwtZ4ZJMqFczTQLAvQXCM2xWBSJ9k1pLIcSPXKYpNF+ZlkW7XnByH91v9IrFo3NGRJsYwndKowIq7L0iUIknW546W1WXWbiimDGakiGCd0bLROjmpUqTk2QZa21Tx7lluzcex+tnDTcdbUP5Ja3M7IXr3xol2ar9Wkxhxj14PtY9FUbAOmUy+IOF2/jynnrcVISoRX2G1AEJ0g2mZx+BmNRQMFaQ9mYYuYKKlHQubrCAwPErPalHVGTIBOSv+6kLvh2h/Htr5bqjgBTilm6LPGVmQVjwG1hdwglbY0Dy52/uPCoqtv8+1QCXDBtq5Tbxe8aR2uYb11NpT3cf3VWmWSlk5vD5xgglTMjWThrbrQNT+9RmClmqK9MSKrNYKwsMHaiZjcpnQU6qlXPaAJrX8bAoL7v8rP/XwWXz8olT6uYTEQh/+SDUm76VWf8SfP3U958dy8ONoinV0cMkE9PUJZiA0iuyLyQfjne9yDvnMTp25d0xQxAdCRhFG//t4xOOAHAIfX+zFeyt7w+v9pq/NKcfgYCg1DRn03sWUmWFBBBleV2CCVwapUhLYZUqykKBTPCYOt/uhUcFJAkgr2PpoGIVhqHtBKMO+BVm0/98lRkKB0VnCOzd9/C1anFrH+QGVI3OpN8/2iocLHN8yp1D43lj3clGT0+eWOZffVjif68AaELf383S9vrGmwdiif73mQTwhyxXGdxh64No2vlrUTqtYW2zxcZ39ubg+tjGT8EBtiufAPG9/r4XGrYp9x085U3ukpssOpMYzlVTUr9Q2XGs0plvmn3bHu1btCgYpGzG9r9ejvu9vM2E1mmtFZ96zfXlv6b9MXpmN93gXiVC0CoAFRIAAGpyZTpQZOmNRq0NOwdfAKICimDZzgCHEyST8diYawoYY8RCm4RmadovqeGOEOX+xuNfViEJYxIGJU794124GSEuL3/zggLslf2/z37GBILjh9IxAdhVspdIS8ZMhHbLgcsST3U4fUyWd5Gk8jbUMuYfMTJ9Jx8C4SWSUdnQxORIlnZJaI0iLG6akJeLrXNKn1IyiVC0lRNiNDHyErSN0B1Eip61G//uIxNGAHtInXe1l9SOyROt9qKdkBFaDZUHDcW8xmRpEtC25ZPMnLoYNujUbjn3bkQpxTTSJxllF5PTXDTVuk9CE+qpTdzNKztLtM+G96wx5f57YJhoxtQSkElIBycitlAlYWsjD+NhNQIyjjRXXq9NPAZUfCaaS20oSECwgF4DaHEdlw2vuwl4diKl9/9zb/o8EWdPQ2s7iShxiLctb7T5mCuPLSOn1R10jpfY5bqRhIwWBt5ax57ssBlP6/T0QPRZ73nXT6k/9/8IYps9b/6F5t///nHuf/6qRqix7azzaW/FeQb1vbwbzy5rnLVbv653KvUx7lcbLS1qHH4ba2XSkXP1yIPrO/fxzuv9Uu852pEJd2xr//PPHf/3Pt7nMbFJTZdy//z3j+v7rtrD9YX6K/lvK9yxnWtfu5EKK9cz1nNw9rH8cNYXO5ZZYxzLtXToCUNAEOAgAAAABAsFwQTASuAQgsER4QACDz8MiD2M6U9MQAyMMhsDgfMD2xMuhEMJkFEj7MFgjJiTMCDQMhhYMAxAEJwjoHmM4rGEIimqBJkQukE8GIwYM/MJQ+DjQMbwnMSWZNbAuMGBzNDwWQJmJCJCIGjDYJGOBAhGFYFGMRdmBQOGEy+mJYMmBZBmEo7IrgwV3VC4DCAASgpGjl7ISZXC+YcgU//uoxNGAH9IbXfWcgC+Lw6l3O9IIYBEeZCB4ieBhkFSGHggbMKgqrEjoLDcnaSiYFwBeJSlz4KGgmaIMEQY0gIXQMKwxMGQBFgGGgfMAwNMGBUQJiMEFyJTmB4AM3KoGrgJQeMFA1QhEYAkwCQWLBhHIZb59jFsLCQCDAABVCEES/kKAEB4CBMwJBcwmATqDquXiUsm5dftvTXT2HghbxkXxy7apJ2a376mA4jgYAzBsKTDYIDCAKiYKBoAwIAQGBgwpA0wzCEwXAcwGBh4yoAqzH8hvkVi0GclrwarVaR/n+Wgq2SoxTDCKSga3jC5bUrZwzSDoFAoEEfA4EE627K8QDoD17qtpZGmAmIoBAFqOv5AL/x2QQ8wWTvzBEle69TTFiBZ9/bO7zxRCS4x+B7tiXyZ7Y3HcalqWMH5LGHqBuWryc6xBlDTF103uWud52WVK6oiJo2VACCQW3F+OYtxpGkrlcJsXE4W5XK5DlchyHApAVBqb5INQWjwdAAgAQFQ9BaKkiwNgVALALNfLCwNgbB8LCwNgbGwULCwsLCwsKr6qKioq2pIqKioqHIsLMzXKqzMzMzMqqqqqq18qoqKioszMzMzL7MzMUqqqqqqzfyqqzMzMwsLK74QUCgoKCgz+goKFBQUFBJv8CgUFBQUGO//hBQUFBIr//EFBQUGG//5BQUFBIqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//tYxL4D1olHW7z0ACgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.05488000 + //_tone.Arco_Violin_G_2_ + } + ,{ + midi:40 + ,originalPitch:6800 + ,keyRangeLow:68 + ,keyRangeHigh:70 + ,loopStart:31674 + ,loopEnd:37668 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.05488000 + //_tone.Arco_Violin_G_2_ + } + ,{ + midi:40 + ,originalPitch:7200 + ,keyRangeLow:71 + ,keyRangeHigh:71 + ,loopStart:37588 + ,loopEnd:43724 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAoAABFDAANDRQUGhoaICAnJyctLTIyMjk5Pz8/RUVLS0tQUFdXV11dY2NjaGhvb291dXp6en9/hYWFjIySkpKYmJ+fn6Wlq6ursbG4uLi+vsTExMvL0tLS2Nje3t7k5Ovr6/Hx+Pj4//8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAARQwiTUxRAAAA//uoxAAABxAXYbQwACRowiv3MYIBpAAADIASJr/d3c9AMDB8PwTD5Q5qBA5+oEAx8P9YPh+IAff/9Hg+D4f//g+H////+CAIO///gMH64CAQESqEQoCQ0InpPhfgnhig5YiA1cKqC0GACZUQQe+GA5zAEw15OoFHIT1fJyDpYdbxFJ8519l8rachUMldpZcWsOK90le6faA7KmzsMxadFHqanALvNel77rNVpRUdhdbdXvkz6Qcsi1EJ2IVpDRQqE16eZqxmMQ5a+fsTnzF2h3H56/S0lWzJaeel256xqkrSXUBRSW1I3IqCU0lPjKt8q6zjEDv/lKM7lW/Wwv8jsUpJ2OfUxy1+HJvm949pq9y1+fa24rZkV3tfT/yq7jYmrHcr+V6dz3ao56mp9c3j+p+mvShsMpt1KWUX6/0tW/b7fray58TfiLS7KzT4416tNOSi5Es+YYdh6Ifatatw192hil+zsrrqpxIhIAEgACE3xNlguNWOSuDsrwsKqKeyn4fh3LFwUgSFiw/bQXwXG2PsSniiWLMY6AsNtBiFUfJKltWiJcdu81uVECQTCc4XFZWvuEvh/Su0PftKxRK+v4qhpiOySdNllX/ul3a1PMaS+8atUR3wn9a1Gz//z831/crpH9dV6Kp9V/3/46JFaer4kuWdmWh7M6uSZTjjRM1yupFWqgZGKIS0UpeUrbF+HRkAg+tBmNCCn40ekMvsrtmXXvy1g8x2OstZHMyEsA2VQ1K5LIIcFpHsSPb85lfpFJGOUFYsBghK66mPkCwmmN43S1gsARGPbzWbV0LvKvqwnUS/aoiU/ed6fEikps46H54vVd1F8BjFxfvn+8cmLpdm7M6sahSO1vvs1shkrLXXYzt2LSdO3aVXsra21WoalVYsar2fVkhFjrVmbWWoK45ct+8Uy4OjMWSzLo9wORHU3huyr913u7UJ0WTZcnl+//uIxLQAE13/bf2UACOdQiy9p7KdX424MyHEy8nnfWZg5wSn1F69a37jlEQV2pNVn3YGRARma045yMBx70+aYrAtycFhhikhNQbeBY28UQoZYjo1+r8Ev06VLSiICZ4IxyLR2Vat7TeCpKQVZA612V01YgCSHmFaGnh5BrSjNC4pG78qgu7ycJQjmUtXXL0z8RVgq6+t4xFDjg2z9f0RSa9ntKTwG01paRbUzNiq3q0ur4qdJ4ZmpntkFiPbTf4mKddpkSm8vbZhJGQ6KW97O5u1tdAdFIJLVRWOdGrataC2bWioSdBt6KImpGWu90zEhourWcJIP5apZkm1ieXk6naxiMA6loOpR0eppQVU6jIvmM4df4IFQAVHLrG7yMzFDMuA1VKis+ipzKrGpJfSdkFb5ESBQLI/l7ZW91tfBRTS2PyzkshbIYa8VuQ/Kq0PJ84isCl+c5Sv807F6KpxkXX4ishktqfbIIThqiT3auESrTKjiGM7EbGpbXpH7MRUmHvX6/O/pDg9v15N5SMkiViTz4mz7qcr/nws+lEDfesQtSxFw0btrVaSsAiP//zcNjejZ42ei0UoINqHn0UGSe7dCpL25gFQa8w5YYjkn7KYLF9clBdE6ZnHMUA5nWTApGO9bGFRz9ELP5ajam9gAiADVopMFQbI//t4xOQAHIIRZe09vKNhwiy9l6vNXRQUYEK8CwscgtDUBrk45NKqKmqxCXkooiAQNuHoBpaOFEKoAmXmgWJWK8O2lUjXClJSyAG1rwE91OSih5XvHG7ezs3iIzRbpO6v17C0ygZbwrWcbdl0xonP9xws2s7g4icbeWWu7wYVF/4eXJih9HkmZqSZjVQJwFMmkyRsaxBBkK108Ju350aha/zQITq/Hpy60j8Nz9mZVHg6qptjTSc0gD81e9RLEx7o1H/3FQmU5KTgqBr/IBRV1VaKa3z1G3JJ6ABGAACCSIDo2wsgIsXCbggmlDWxxARkFD3epHVZpHF9Q0ZUaNNYVqX1pH3rtD1+X5/rUNRejAzqa2+FjOepqxYFETPuP34Gu07GjIhZ6juQNO5VmQmVRpIyq3e/uWyqDEAKnly5tNxAAU0NRug6VSIn4Js/UyaaBYEoy+6KYwQ6/XCiU78jFUb/xEL/MBq/oz/zB5/MCiM+zDQLLrd1lBMq1kQjESHx7qc0xqfZwnCha5xOC4BXQ+nFsnnutjx4MydZzZp41f6qVl+ECFEDQqNIGYnF4pMs//t4xNMAGa4RXe01XmMpxGq9pquI4w5ikTeh0yLFMhndSWu9WtywdfpZ7G7ZsTs6SAiMi3FqGkz1xsa05/9a3bzmiBAaSz1u7r68wMCW+2ZmU52o8BuW//Hvd44OoiLS21ugjDoBHptfrJAOLa6KIn5uetUth/C3FOtHqGkwb8rGo//JYpv+bDhf8wJI//kj/KlnuvhQehvu/+CbfLHVnx7NR96vOWpF//waqkb6rg0Ng2+L4Hg8nb/ioLitevrpHJXnT9SAjACAxAAuYe431MCUK5KRM+z8hLn1llrmcxZ9X5mGtuqZY6NS6KvO5SN982AE0mTUeO7FnshNAwdSnqN3hhoz7S0zaRVC5OSLd7dWPBAeDufllZRIEB1OGVQS+HFE0cUn0RThmiFb6hyTJfamREn2+ofJJFf9YfEQ9X5MEC/rHscX+IEoHNRPwSnEPc/70R6b1O6wJTpl99bzYob/5BHFW91FyITCf9/3J2vvpx81H1nV7hBnQxX/6HWOUYlkXwNTTrfjzZqK2N8+LU90BUIAItEAmYm56nCNLxJk0sXOFBjN4NANeVDD1SUS//t4xNSAF4oRY+y1fOMxwqq9qa9ZuIociZbevy1fniUwwQ41j+9S7TZDNZbNnetV49QvSF8S6c1ja7Zp7+DB5fc7My34/gAYIo3rizw7CbJbyODaiF+tQ6i1r6hrDNv7SiLgS/RDAItzr+Ryjf8skSHCv6iBEULf6yoYfr2+oZ4qf/aPiR/ru3Ce6j5bQUsNLb79UdidRfc0O48bcxEQNoaFBds3vBJA2SztfvcTLJVf8InAz1v7oDKQoUloAd5R50BgZaiu0x/1bF7nOPlAGU47ktyhkUQKweXK/a9iXsiFl0/z/65OMBGGNTOVjCPwbLIbMQHB4utlU3H52JKqGcKTtXVNb+7DAJKj0yX63zLGqsKkzZx/BuFz+RRs/qG9P+O9v1DDBLv+VEP+dGl3/yIF3zz5Az9/qrF5fb/e2w9zx/qFQgDz4+LJI0X/1bQscrqquCUR+vp8wPpLZTtri8jhpcNiNURRQJks+7UNmOuJ6ZnRvECPlQViFVh0RDvK52JdRD+wxuIK3qqhr4iROrFpTS5VaERJMm7lXpLcOv6z0LDQm5vL5dnBBix09bDu//t4xN2AGBYPXezNeyMBQiw9pq+UPL80SCDz2etX4u/1UYoNJ+E2uTtjn0KhQuBzv/nlnmjnL9L8wCpAJxNSvLwNSH2TDmkNX1CWlz+TSQf9xNW/WdE4b6jQYxcaugudHoymryicP+pbDlOatzgzCflxdS7qLxDdatEwIhqtaSnqODFJd/ZAxFc+mpBTosPElLupZ1yYLyndFSnSJY06qKBOH8N9tfpAVhNWyaQK+Ky70EaxC54QCTbMElDiiIWRV/NNmJRnUlQ0ryyF4S6ilkDvESARiRG8k5YqRNrN14hIhJiOGLncNVqRYxggBLdfnfu0pCDAEBY9zVffawREB/C06/HIE4kK31Dmg5naqiO9vzp8hf5fHn+oOf7Cj9SAZDT89B//R2/uN/1Yq2eilCIJIXb9zyYeA0O6JmEAtGMqGJkgiEfRTCUCUxlejoaQ2qfNMEpeqTVFHMtlPVUPMQIAAAAABiYcNGAYAgYAE7UuWRzhhOJ5xqtpgKAyEl2oRNugXfCwHGBqjmPIJwZAsim+SRy2BBnpm0mzsV3/nlEk5B4lYl05Tv++r1ggEdBG//toxOqAGVIRYe1lrerfwmt9uatQ/lvV2HpyZFRhsXDBpTPSezZuQEZVcMJYKxpsrF+8OjgS+V5bvX8f1Hi9gRRjGeH75yAwUFkfO61lk5CvyIllzfcMrruJN/v+dvnBZgQYhuz0nTE2AGdFd2nTok4QupTLRYYj22m4zs6HWYEUYyCPQMTY0ILr93DMlbYyYcSCupJZoUKfpqONtZjhFE4QRU62TMiAm9FmSSEIU1qWkgyzw3MtnqqKq31v7oDIAEujTLX4vEurESzYSwuWMrBgA30gLDVhqWYzybHZMEDIp853ffpIqhiZ4lKa1mtAL9zhe8BbxY9B0vq2rWEygmJn8Wx1hrLKPhjOQ93lhkooh7QPkfRf3AeUeUtTMRwDhFPbx8iFj6vlIskl688OBvuiMYft6kSo/VmIx5r/MEf6kf7MSP9ZHb5traA4YN375OFY7afF1qHlC2P4qCYTVuZiNMD52Nbf//uIxNKAHy4TRc7pscMBwmt9qa9g5IBGZXz0qH5efi6kllvxLPebJphlb6UXUAVO7CAZSZcvJFgIIFQcGBTto8FwzADEwgOZjQXZnUzHxAMEQdZ7ep61eHhgGGoR8v59Zfj6iITMuqigIo5idSkyEIwRvVWTJks2DDgLJD30kyifMTo/AMIAvY6lukwf8MHH0PsDbyDt86JL/Okof/ODGEB/QFgkv+PgLFn3isRH/Um36DhL/Vvx8IyL36BApv4QAEi7dtBELrZ2VDA819LKFTn61GhQ031CAHIxtvG41La7uLN9mCIIAtkYARxRx2IAABGgoCZ4HDCt7JDmggwXFOZzG6kXCpSNX//X354QtjKr3+lOsY4wdtkOhumIscl+so/E7c+XYFwU5nvPLW4JFBDfY/KOZZYGREJNZ85+/2Ogy+dF/yYA8lF/rCvV/H0IQ//Dnk5/qE2IJ/8rHoX/44UP6k2noIf+hAjfPGYFz1+T/0DxP5ANUf8Z/4khTD2ZMoRg1jjs65AAOJTWs6qVJjfqg1d/aVZPhQViRCjrQTmKyHqrjBB434gtVRbR1BwkpYM/MunO3IeEYNVvcbdTdm1DQlCk/P/TWMYbOOaJguVjlWV00BAxgTIrusct52H8Ig8It2I/fxREgA+LGYsiylpBdEZN/rDq//toxOcAFxYDYe3M9yLRxGv9pquUBv5WauusTgRX9Yx45pt+R5NJ/rD2xyjZfrFrNCafqrHFb9Ru37FZLV1pN6mOByBsrboF8f5iiAECyPq4vBqGph3WMxOp8oBK+yGVC7GDUdmcFwBG7tyAWjif6D+T1rP4QCFBEgiAFSyZ9vIpmFAoGA0oIUmoYejnH6JjYUkS/0O33qghoBgJOTYu/Vvw7FVASo012mu8ysy1pJyOsFpsM4MbpXhw38iykD2O55/UegsnP4boLn8lwfXK73efvGsVDG5b/4EYIst1qyYJqZP9gVklkvwiRuP/UNYAtFKmrZILgSRB+sXUnV84Mke5ZUpNUWB9aNFaoxx1MTFNFZ46FYDdE4Wmr3T/kRNb/jY3vmD2+VH1JXU86Ph5GvrDaLbL8y/1Fxl/gwd0U2ijJkeIyGy4BgxrUWBxhgZdw2LoAj19RGAn9qbgg4cw4OGqv/qV2yRo//t4xNoAF/IPYe1NWyMZQeo9vLW43kW8t2NTNHLmNFSUoPnN/lQWY6IY0Ldb5vW7L/g4aRY/Kb31lOzQUimX6/ed5naSM/g/YWoOefb6hZzfUoZ4km/IaMg31EaA2RpE52ZQfEO1a7VsM6XDBq31E8e6mywaHvyieU6LoKmQY2Hgx/Lpo32Mhk01euboMpdsyKl/pDjQSTZJ1R8nleisdInMzW22g9/SMTTxr7Rgbiao7mAXOLgepzhYEydpk2wBTY8hUrASeE00/hJdGKDlCqzner8tS5GYM1yLmWONLaeIKIl/c5TQW1Wo/ZoE5qwMYzycli+VwnoBfEJQJoxWs8AnQWA3az0RCEBpH/SEdFr+N09/UJzf9AZ03/YP2FLt+eImb/rHNJ/+iSH6zIzV+pFP6jEsjpP3j6MGsv4iDcUQICHbHPlJ2O/9BJd//yO0Eu6f8MSIY5c/SxoPIfi2665eUFlt6qdUmTrNqp+GB3IVerWFy8XWcS+QR3FjxxfajoPBg68tV+qXPtmOjhJtt9s6zkNKkqAUEdqTfPgKzMneOdb/5e7MJLEys//kJwwJ//t4xOSAGI4PYe1mLeL/Qmw9qS8sFof0+G6LmWFKIDj7O65+P7j4jDR9qsouhPiBUmsusfwt4NH+cJw/+cJ0hf2IaK2t83Ia/6yNIY35wixU0NpdLjfU5ep/WcHtfzJRr3zpoL8T+66eZKL61KUtN7PqRzx0ru77pLopaGmQ0Tggzd0h1p3bss0ohIknsgGYAIEMkBSDV7eCwOGAqwLtYtgMAGD8KIHHq6oFtSynjj/AdtiMWq2qW5K76yBK2Qdq7rvrZujWCr+fjhhlsLnl7LutYQ72QEg50GQNZwu7pePgYQIT5Fb/9x57sGAVU/d0jgDtD6OtOpSzUOu6/WXxuH2+cGXEoNbVOse/MTdX9AdL/nDAhG6FNEjXv5sc/ooEw+rQNkWrTpInCIBiolq1qd1EqSamWpaKRxFaupRqYJugylsisqLvNKSIl6atVmKY01NtRRKL1X+UCWAURopAS8W65vmm5D1m/GFAzZwTFji9sNWL/JugESsaH1OVsvnp4dBGfCxaz38Z+XMKQ8d6rc19LqsnSUQaLLDve48a5Od/Pv4ypOYSi3u87+sJUjXB//toxO+AF2YVZe1iNOMoQqo9vMm43/LARwcN2yiHIP+w1j/8wHz/Mxy/5gaEt/Y1P/l8ahB1066Jwcw+urqI4r36kUR1pKWvoqXqMFFwmiaBuFlaSzSUjak6mOHzErqark8VnHuni3qH76pJ67gDRn3V1cCmO5aNy3qB4PwHVHygO4CSx1kFXA+BVL+Fk2UKvjDA0TAA4MKFU6gF4oJ1JZkwiiK6W5Y93YnU/TpSh+9rXYIxbuB7nM/uWpfhokcFrbHcM6O7PN0IT5b3CjwzyrlWASJtf3P9fSixNX/qBriwofcsCkWf5wWo8/4+xbn+mTgnQt/mQ+Cd/UajHK/YdB/+o3/5t/KZt/LpJm6kEFs6AtYYWK6NFk0DhJFQurZeaEyXF6NI2NzrMiuybEMLqK7LWm4n5Nm2cwFmnm66iYO60n6zCHEFOuVBN8fA4Fty2Cw4BCStgCg5qDJphS56SbgDuETJTTrY//t4xNYAGFYVX+1BfSMNQiv9rMG86xu8lkZh0OiS3LmrsTnSwJAS2lsTPNT/PGEREB7+94bszyRbnY5XMcokvEyotcMus5/zdMKCE1Mt34uAFqf/UEkEuf8fBgT35wgofmQHQdht+TxOiP+oYcYE9+YFr9XMl/7P9Q7A4Sjb1LOP7oEwOaXqTd0jtd9SCK/rfPU05lM12N5B+udS5NBkqnJyZK47NVps5t13OZs5ur6I91BXE0SOQhW4fUWUbAaDoGvuggjZyRqyZc3sDS2m+Ylw8iJhM9z8MIlPlgAAqNTuvmJy3DhnJA8Qt8+gps7AXYJhL/O85q8xsEoWO/N543VOhORm+Wufz8EBRcWRf8XBSU31jBF3+LI0b9Qt0fzEAaQmyC/i6gq/qE4JVP7CGNj60UanH8YE+lvZRcOGz1zQrBZi0LVpP1OXC3qWZCHMaTvRj0Nyi/ZOOrKrsphyIGaPZSaJsl00jAHMkeZXjkT/UZsy1L89X3QDMANTAUFtyas2uYlAIdfW62IQEBzC8CjVXTuy6U4ZzAMGX5yx/V1qmQjFBIcavYp5m5PTy2BU//t4xOCAGDIhYe01nSsZxCw9rLbUpRhv83p/pCyEw9DBwjGseWeLsU0q6SSJdIsAVPE/LezzoJhRHxtfw/ANXL9pZFkFRL8nydPfnRtpfoBoJie+oqKN/zky/UhYaazTdKYTut7+NZ7ZFi49vezaEy8Zt7+fd89iT/W72RBxSva/NPRBwIn3v421RvX7r8zoSrtRvv9jZotJsZ+4YBOl3DOPXOHSG0ix/rO2xVYtr/+8GL1E5zB1QoUaNJScrS6u8so/8AStlAVBBGoygpjDVW592Qvs3/8no5To2NMWWB+Lut5b32mQfkfP5dZ7LH6PAYe65lvCzjkk65Mj1uxJqYsBPgfRBzBbdMBEFuRf1ALA/Hn13WJQWW9MeBdLPxPBgjX6xZB4Huv8c5qUvyp1/j8gh+sZTK/JM1R+mZA+sj+aou/qTZkdbMob06+8utV8kR5po1aystNVPbGcFaLh5JtahLjY/fpk43W3umR006qPdAdzNzkrScmK6W0UDBi6jX4YUraib8gEU2gSOxE9R+aEKY8fh3WdxsUTqlIt7PX7ltljYygrXhvOpSUcAA1w//t4xOoAGvIjV+3R+QruxCw9mLdFOMp8M9WdTSU5eiF/qhx7kz0XJ7nzL/+kbeKb992BRD3b9RPT/QFkSpr+JsPf9YzAhYc8/9ZKFNm9zh5v1EdP6ljhL6P1jtKaT+iTAryX/pb1KUpSCKH2ITq/Jxo/6RTbVzM1QZ+oxCSjwQdXmJ/+ow8Qg+vyYKoEh5xwMvkV3JOcAAnJUej7MB0Ee4EJUVYn5lUO6ktcyhYefTlqznx9oeY0DmNz9cla14SSATMPShNRb+DIYqykwasmwSO937HJSQhQxpU3qOW8I3AOIA3w+gtCozEBQREQu91BxQB5iIpXqlILohx/61C5X/cV40b5wBYYWtFe9sZcWUQd7bDOCEpfTa2sxLn9ig39f9blhD6pGHk+ufLxfNfzEiCt+mXiTf81Huot2daQArP2t1by0BYFzz32y2LDyQ9Pv4NSVPz+rJgtX3cCMAaYEUG7iud1R0cBSJTe65IVFntvhwZ1YeszWpY1shtNamdP7BkEpvQozoIzpkOXJQr3f2pEZcsoy3BOihwpIsZgUmCMh56jy1BEIuYhKl1JkoBg//toxO2AFm4PY+1lreNCRKu9qa9sGBai1dUiwiJWb3UA4473+oiYhy1fLAoI0/MThI/mQr4aAW/zwoUvflIsjoPP9CMt72IhXf9iF/noXGm3ITBFmL5rh4PKJsPR8Ua/Jjh4P/Q5SYfpS5xrkJPqrLEMAmfS5yoFEIT0ZCJfdqkLr8qCoAI6JJAVw2FvpHGFEzBfR/GbloDUfgUpcaW24hbjjfAU4TGLf26S26DmiOydZk+9Jar1G7YthNWVRZtc1uvrNQAMayDPn49yWyEBavf/LHGAl7j0Sd7zv63GUO2GvnAMMV/1oDb/WS46fyoZf80KBP0Uk/Rhj+lhM/VQqN/N/mKXf7sIMabVITDhCv7nGD9nYzZEENfyhgurezXFJxq2KnqF4XV9KkAJN25F0+XVf4QHQRQgUQEXQ+JPJjhgByBoxL1VC7YM3gJgw/XxfdNDyjhEZtY5SmapLy+RahJu6w7ZstFA//t4xNUAGGYnV+1NV0LAxOr9pquIQV39fhnPUUpEYIIL1t6MzdFFEKxGkySaDsQMCNAGYlR/URYLCyR/Og1GMJvXTDz/oF4WeLb+7kGf1nCNDuDe9U4OYMiz7yweFwkl9FEgTW7IYVBDLId3kZL+qDVqdXEclo05iUxC+jq8em264WGX1OKdirIwTzueyHDEBoWjHoZMCgFlnpaYVNTXsXX7QFgTJq7IA9yiRigQAQMgIA0DEE01cGtRDS+KWpxzd3LY4MJivef37c8iEaI+6Femuy1h7bIdgkAHFpTTZ1b/KV/Cata/VreOMEGFBPxncpqXVqGQYqFgMWs93/cR0DEpfxM0qOjWAVENONXfQMQyGMw/5iMye/WTZIfuUBOJ7+Sn+iRL+Ex+W6/h4ZrfP8viuOu0y41rqesgxELIlsXRIBIX3VbmxJ2pO2+ippFHb3HFoDvJjN8psmAJRoZEwdNyIAqHO/lmYbHXUdJkp1/LnMND1n/EBVQ1RyRFS4nxwVvEARCQKBRNkDhCeBRK80tptZzEuUvRZ1vuGNqaT3DZ4VzPeoh24Awu93lMxvKJ//t4xOiAGDInWe1NWSNRxOv9qS+UAiQXCx19lKF+Aka0FvrMgI5GHX5mEIyBGv6YIjD16sZUk2/HQX/6A7C765ZDihcp/8oDhNPrmjt+MVatXQjEQYieg4jWrIwJyEibrPGJJZeo6ns00LZ81+gxOLv6BcFrXR0NC9MNbSIACIdVPiuF+J296e7AQmACC0Cm6UUGlYwsCIfFAYyp9QaWnKwoCGlcw9S02F2oDCXV/X9+MyEkXMdKly33cf3ZNRN5/3ycrZxwQ4QFT4fZvY4CMkxgnOx7DF7s0h+btSLet593VpkBjMd328KMT5vVMxKj/rSOiVDjP36hBBgS53rE8AAzLUPWUygQducKyj+s4k30ysguj9xOm9mMBKDf+taP2MTykfUxENlqqfOP+okB6l9F1qSUZl5Nlu9RcCYFKn1KJAyTQautZMC3un+1CZRERaLJaYruzSUBIZYCTdfRStKgzWBVdkT6y6lwwjIwhAl7PDHB9+uImjIO8/Htp4i3UDY6lNNAWdUy6SZCes8wxw2h6rqc7+6uaRVBVJ52VqMQ9Y49c6xTAQEOnIShn0A1//toxOsAFa37Y+zNWSMNwap9vLW4ogqN+vrcOFM/+OIcqf1hgEyMv5AWf/Jh9X50omiN1KQJpSNSipr2HwpIO7sggPIKQ2NVes46/pEUxRfqUSZRof0l/WPN32esmrXbyIHlTOttRLr28mBrtf6QGdFU306HpykXBW9AJEmsU7SHKB7JEy30htUWtS5BdWm/+GtyuRKPCV9rmvUph1gNsPGyJdSFrA+UHCSyarY1RWqO5+dC8AbGUF19wbwoX0UYIEC67O1SMU0T4bfqL6P8f3Q/BiGWSx76iGbP+bpv/NTqrKRmJANX6lqHeaurVh3Dgd/1f4+KX+TTv+39Y9DRBarPY296x+CUd+9ZOr/N3k9jADMBCxlFy4mheiogyiLMph5/RkpOJOxICh1xpNKozL+AoA0C93ms4zSzwGhU+v48T8q5ESsxAQaexaxbuXZE4QijLpn8a9fdJ6iae7Fsd0E9ziOxowrF//toxNwAF5oLZezNumKIQaz9mTak7H67vcFBUFFf97VA1IbbalUyiHKk/9U1Jl/uJtJ81bugKGAmRFWb1CEi2+mQ0k1tr0i09vmp5S9Csf1LsqzkBE4n+m/NKd1axoy/epAskAPL1VT1FqDVESGiiktd2RSW1qkCgNMQeV1KfWTJXW16CZiRI0DOk4DU/TBLoUZ/tI3uNmb7TS99LCqRlbDAuSMkLTGlsqxziE2VCyJG9T+VRjMmBiELkQ4SzqVxmgrS1BkER3ZpvpoKbhOstNbDd9s87LsaepUXIFUz2WsZLr8YGMgEKC07b/HL5KsOHHLm+tQoYKxdSt1B3Ckz+wtQ4yu3qIYJ8L7r1MYA0yIL/JcZd/0iKN+pRv/UYp/ok631qKRJ+Y9q7Gc17hCBPWvrtFYy4nriycv8dTApDYy+mZgk0+7lsUdMATz5qaBUdlRJxlVvgwVgCH8iRbeF1LCg5cS6zyVv//t4xNYAGhYPVe3qTcMePay9qC+co0I7nS/FPKKtJnHOr3KyL/Hau2Wfv2MCglPf1KbUpWDd5oRFEGmUCyvW31ylZkIpeCzljT97wgGCBPv902HGIeBqQh6HrchBQbv6oQyLGkvqkCEEz/5mQw/65SKBJfmRfAKUd/1ksRot+1coqE7m7NziZwr/l5IoN9I8Q0rt1Th0/+pM1b7JHB2K9GZuv6nR9q0CwRFKpdR8yEsJA9akXnIaRxp7OZEWNK8worLiH1KPsfwYSoAyMFgBWkyXxIAs6IudcibETrmDGgXt7yaxj0YCt40ja5TUVppMXIBgUNS2tfp9LKdpv1PJ27zeNqVEgBQRZ7/034qHAUSXY/vmslFQIgGny7ev/mTjqQkfPpgR4a/1mAgn84UFfx/E7f6zYJoQvzp8ZX86SB/9Jxvf2XGv9TolK3YydFHrWpJA8hugtEe4UKjFboGKjYa0VqdNZipI0UihpJF4nUEtNE+OwmsigpFpiFbbupTDYvVpImfYSU9jBEACItFhy4oeLYcFkIHG2QRN4FbjmBMMDWnRmOU9yJtoIGVY9Tms//t4xNcAGJYnX+zqUSMAwmt9rLW8flcHlU5feGeWNzGlgUJFW7axxrSK9GQaABoa29qVSH2BN4tr3Wty6BQIKydT9ZMBtxov1jXCNQWMybr1j4DBpo/rI8wPfqOEA+8sBoxadXUxiLZ+keGOPfXKI9LZHoqJw+ttSimSp/103LfvacZS61JJGgnLXQWpI1SZ9BVZv9BiyRZdKis4kM4KkigyCakVjoK66S3djo7XXU7ZcdlemdY/VQJABTjkQKtIlnICBgvGDeM9Q7nLEiQKHYtRW9R+EhQUrFs9ovrxy2h2KP5P++3mdr2GXDS7gqU0GfYn3oIGVflz7sp1UbiApYfyx3asxlfRiHBp0Zrd7+6RsZeGz77rE0ABACmNVdkxZAST/kwS89+oxEt/SCKACqRn9RfDll31VmAmLfWmiWtr5ga9tEvkk/5gPEpa3Zk1F7Z2UYk8M6LGCzJOZLGGso8kyp5JnsglGO9FtTlAKsR2atmJAepGVbrJMlfrmBdb1UDySl+EBFAEMNogqYbE4o6FymNpjxhU4UGELwsizp/ZdS5TMRFACJVntXVuQSmJ//t4xOIAGUInVe3mcMM1xKt9rLW8GWDUut63KPtDUqn5nrCmrSgZTLWr632/9K2BLSLWdTGHY1QO5iloLVKIWJicHZ+YiVBRRPLdXWHWJv+aCkv7kwco4vyaDnBOU/rFmUyW/OjjW/0yaeS9VZwk6b1ucGSihT1mASQvLXWuyBxB6qTFwLQQmailj4Np9mRWtZPJYuI1WWmO83PmjsyCysLIjIOidSQJ4waKNmW6ZKHTO7dJaC10VVG6CifAgiiBicywrcTNloQDJhg4IwdO6VsAQHnBFYmx74El7iblEvHXOpn9e38PTTSyzOG/52llrMTcV19clFG6UOqog/Y+GT2JUgzmw5AMSaqomaTizAR9GDZfOBc6JzXT6QjABRRa+5DBGpMP9QkBc/UM4ka/w3lz/1E4x79ZEjb8pk8eQq3MCcLpMO3SGcLphZVEyE2EqTht9Zmkp+o6QcqpN6SBirtqMWWpuomCeLi6DrlAcJmyTaygKFNnv1Ip3r1IMp/oGSS6X6UDUhcW2iAniLbfTmGSYiAw/NMzJBJ5xIkOdV3orPVYKuF1ygNrluMyVsSu//t4xOOAGkYjWe1NumsdxCr9vE04B0pMK1z/pX/gYqEEmDzrOV25OWZ0s6mvPY95MY7SHH2y/9XJHvxySKM7/Na3jAYZaGv38DUMogq6lCEE4L/4kgSpQV9Yc5M0+dCLlA4/zA3NF/rQ/k1dG+w+Eqozr5gZosylLcrC5GzN9Z1O78kzRa031nTY+jtdaSDL9AkDppOa1rKRggmmusfwUQc50kVah2FJBbs+gW06KGZksipU34YM4gqOSULbldHUFFTs9euw7aCAYQQQuU/ses/2kIR5b//zUZe0RKomWcsfxp5coccIkNbywu0OUaJY0crP7rY/dEA3knv39H3hDYMg2m9cvZVlkpiUmupLpFENyM+SyFesewzBev4zxaNv1jyTC/rE4ls5+UkEH+5v/URQiplTqUZE2TJkRzpVqIcmZzRbIpjOgTBEDV1PdyspfoLFdMz6R9CtEzJ5adaCC0TBC6TrUkbkwihZVikmpb6aJDRAiCZ9Taibu+lUUjejBR66joMFowVXJIn9ycj6Z5cyszSndCBgh6iRPyCGqSxXkCer3//O/K6VuIKEzn73//t4xOQAGX4fW+1hres6waw9nEcM9iy1UMfPbljl8pl0WBhpXk7ljNEjYvgSjZ8rIkyCGAAsYCO+XANEgf1yoFrf6I3Q5hIX8fhUmf6i2Wj/4noEXIO349r/WXWT/GSE+IKTQusfI8FYvqRQakKcXEFKPLPqDAQlEk0UF/KxWfm6q7RDUvmYuIMTrP+6zYnzFd9sHmuf+S0vOd++ALAPx8ia42Ha2/7jzL6wYGh8CAEACAAgWRHy0YQBRhsBCgSMVBOUL7KpbOupcMGS1WTUrv2GNsNEYPKFPb5dpaGGogFQqHJOBqXPOaYXDpABzHwDThpuWYcd6pSGFRoNGivlySXrmaf40QYrld1hyq5RjcsFAV13C19VTpRFZ1nzV2lguAY4OE2ReyYtIQAJ8TV1ECDUwLAr1LI8QqO7raP4QCCj1qU6jMgo4D9fWZjMlbfWSUFq7/k/N/+xdJa/9U6CUG57mOEmFj5tu/oUS6NkesSRAH+vbRiPpZX9647R33bWUdM0ySn160FIJQaVFTyxxPnv75SOMtvEdkyqP7QIkAMkSiCZiaj6mZgQIYCCBEmY//t4xOQAGJYNY+1FeWO3xKi5yS+QmW4MlCMkZAQ5crlO58F5PGVi7P53u0r2lQqXy33f2LmWIOlM0y/ly3RUoWGEzHv6ztYXa4k9rby1zKooqIBY8VnqLf6wmlbk2c8tdRNAOmLei+7FEnw0C3rHUKef+x4XzfUeGPC0o6pHrI4V8+pvIgUhP6ta3OKN9fMEy47W62PP91DoR+JckH4h389nWksIKyx+x8AjkPD5fLNIIfdb4Nig9CaDKeqPYJ7qY2TaHgVL1XzTHtOE9x9zJmshY+YraIZ8fYgRAAjACAClIknpZsHFLYY5K3IFhMySFC4FEYap30rQCwMypaBwc/Oc7lSULyggjDCB7aa9rPkJQIgUjXvSbtZS7HFjwsC3Mfqc/CKBhdRa/+fWcECEJMET3Me9ymkTRYkuUrbsTYRhMkfUsmhOKHzEnxEkPx9DJLb5mPkTF/zQolf6nNxpL/Jom//ZFkFfx8bj1TX7XEEt39MhIQXzxCkiEZ8/skpPbqZxvXZMN7fA7A3f1MzZqN1Q/fUHiONadTW1yQ7pifmbIlcXUtaihVU/swpAA2aT//t4xNgAGvolVe1NfONBxOm9uC+QAE/HsGl0iEGFAIcBjzI0fDiyjNmyzGGcQ23CAzF0BZhP1M6X43Ro6Bcy7lWpd45MVaSezM/WOXatepEWoiRPDnTFlOMuB8GaqZluZFACFQZJzzuyiwIuGbQM/WYBbRX6mG3/LpBz36iGE//Mye/ukW/0lkJ+oocX+b5YlT/io4JvvmOKHi7vZ7zARTssfEtYSDa3P2WiHs1fdPc5c4CGW1tnjG8PSu9xpD0h9a2EGnWtFaV/UrwkHk43+lp/5mX2ga030gM4BDJxxF/k4nwcHHAz/BBCJr4hQO2jUltoFhqd+alQVGkQW1jHnItPS/Q4AKNc9hhnUhqjQ8QQrgt48r9wsDhQoR563cy5dZiRKnms5Y4bkXAqlGRNE9lIisiprvXuFFQhianUtFMdIc5H6RHCAK1PXuM4Ld+sjRJEVepxyC3+YDoMf3Tc2/WX0vqc4Ur+ozHOQV+KgdgGu2dINJA+uXm0GE9cmlq6kNlrVCY+FdkWbggvtjt1ZQIA59TqEswb8Ouj5gfn/5hv/HnyUupvtQRQCEbbQLmK//t4xNEAGSYnU+1NeQM5RKu9qi9kXHiAUqZL4aQQAz8hDnFRhCplsDTsP4ZywGIv7h2OODFmKvGKGJkUuVLc40tkwjQM+uFWbmFSL9dIGRBx1fC5qzlWdEyjIr+rG+5XjIkm8Pwy/HRYJVFe9BbTgKMTAZKrqqOhQFrfUIYyf9hOz/5iAU4Tlv0icWq+4wY6v6mchqX1sZjaWrWutSyWM0LVIrBLmJrrqsPI++gozUUkKbtc4HIE6Pb6mLUu7qWXTA0ZT0zIYAcJRNVsmplB5HrWpedLE0NdcnuWfpEqXXP4MGc1iDWgHtyiTgwQNBw69MYZWIADNkKgLSoZl0pqUMhaEPJ3rcMVM4kvcdtCbFvaaWy7djTpmjBfzuNJAFqkMquFiluxac2ZMi4BlPOpM3eG4A5UHr5gGNFr+sa4pX+w7X/TFnu33KBCpfi1hZ5D+Q9kk/mYsRz8ph6wzVXUocJaJN1qQVHySZqitE1SMQ64CqK6Ck2ugUEz9SK5oK0Ho2UtamYpDNoLSQZTIFJNZrZB51A6drSdZwezMxenkwGLCcSdqlplNlGvzApAbQJT//t4xNKAGpIlWe1lreNDwau9nUYcdU1iBHVjaSJEXcmW9UxVJm7ld9GvAcKTAZE/M0/N+A42TGRZNLab9cvyIqnl96xwz1GW1JC5hBL+5YZWpizFRQ6um1u5Z7y4vFE6/z9T+1hbQH0Vmu+cEFx419Qjk8bfihBwG346yAGrfjWIVf3F+bo/1Jf3S/jXOpN5kQAiRqXuq5dWhWggwtAcDX/4JptX1DhsGRo+9jpTLic+Nnwq1rPv6QT+Kuw/gjHvmeZAfgiui79Q6Sjsc35IXCc/Jzpe6AhgBjIwQXeTSNGLAA5CzMOCRpmAqrO2dMmETBh6zWuxiSiJwvTH79Ld094wSIgdv9a64C/SViZgEp/7sass/rIEDNI0LufvT+S2OotAUDR8zs5YqAOhKjdD1E8Axje/aIoRpvxMxsf6wex1Lv5gPEjP8nhziSQ/Unt6Bur86Mo1/kd0W1a269Yhi4tX7ozdbeIcqBo2O39cEypr6iyiI+vqXS23w9IbwRB3Hpqm+BQdw7V6OcsEQ23tq+h4LLdbeTj8T8E/owXBGDk0JE3JjvpgAEW3VE19Glss//t4xM0AF74LX+1JeyMXwup9pq9hBT5OukhuPWvuSow5FZuXIahEXYYw8VANKz5/8giBSAuTSYvljhSw5bgIHUrfccZTORmGTEWwSQgbHcQuSOsypDCB7n8s9rMbEh7Z9d9MQQkUfZY8ElfWURKya/ycSKTe5NEQmv+gk31nVfrIaaSPx+KLHutzdBS3upZNAzDRvssvqf5lEEwdaCPb4YXGTn1VPsglS/d97WGh6XHoySBUN3vh/FD2AIQiUO+kh9fNzd0VG9VxoUmw0fsgAoApIpAK3E2G+YcGq+PKejr6FU4dRApGXMRjUlweOGDMJyIHetSiVSxsEa6TKMf1r6bAgAhoSmzr8v42W6hRWkHc33cg7DQ6BEh97918/pZUBorH9ax5r2xiyih/noiDCg/tLwwaf4/CbEu/XcS4YAoe8KkAYZT/PGZvbVQKxgz/zo5RhDVkmusvGJYjrSZJAlHp0kyQEyCYjB63cmss7qOiCAfGJe17LlpsQZ+WfxKSsX87D7b7liDR2iEQ9XfZNsBUfT9VHBsTnTEbeTU+aYrSTpUKgAZq42pNyKz0D0ED//t4xNiAGbYXXe01fONQQio9pq+ZKEvJtlC5zGLEBiE2ApmO9wjoiakmP2beM1IxEcLqTnb2OK+sCqKorf5SfQ7vSUEAEUdjurNLrJSkziHVyxyv4GIrAD9DMLvZZgHCFHvWk6zALRxv9F2UHsi3/mBbFTP+o6fFnmPqWQgEChoZvrRmSJE0XZSCJwfxChoh6bis7X/Syhbf/VJPOXfcWmVA1NbXXCgon/vlqBOEH1xaj1R1O6mNewQie+JrpRNssu+XpDo4n2wdA9MREUdl6a/f+0eT75nupz6/ahDgJqynGVMTichIAXyBp5eLoMrUpNuEDpbqw98JzkkiATcmSUd7LuV97io2Az2Mc3vkruOyBxE5jf/drGYRsG591l3X7d81Vv613+YQUkaL8p/13+1H4QOzuYf+VmcM2EYqK1e3ledhOcit3Xf7qgbUACsby/eVDBKx1X9w7zGYNVgUBH6aYg5TqtUdJwVd73oolJuylnDY+z9SzEkXq1ugRT/SoHCaOZ2QqWmcHcudRuxuO0gN1LWolN9lkiPY+6DKWyZLEsedFJZkfMg7Gt9WYj2R//uIxNUAGn4jXezNeuOIRKr9rDbkdNF1KWXSmpS9azE/b6gMkQRMkyxJhNpVY0g2VADA5dAb1BC0IjoZUsefrlNDAMHp45bv73lAxKYDC89zHccZ8+YMXG1AESCLvwpEwlANrBSMfQoGqkxwgUFFuh1oAiDgxEmldOTBBQ8yam3rCQI0W3WfICMw3z4uAWMYifyoJvFLOlekfKZD2+tAdJL/Uyxmva9wIJ+5q74TNL/vadD4v791wVnv661STXF9w4oLt3LXueT/Z928qriYm0SeXQvX3qCuKuJ6aIhPiveyIG2Kj4txIHNVLO7zJfhwyABQimpDuKSvFMBEDuufBTM4ADIRuxAcpmpM3PHOcCoeU6+/nm5EXZ40jev+bd+FkI4zt1IOcn+7llLQjpkeNf/5z1qMl9jMC34r6wvT8ecEQQQeJhjHK3upgh8/9BEefrmlUzKkh4xnOc1U9/XUEiOO+sxLwKyv8vh9KDWqcwMx4Jq9pqR/qSLovN6yto8XxM/ZLmv+XqE6tjqpqYfy/3N2yqNU1TblpWG5DnXLMejaBDQx9W1lh/Wb1bW8p1TpTOmhmPSz7l12aj0XX8RboEG5/x7wSknzN8aiH4MBQAIAQQAVSaotCECCoEimaQORZHQkIjwEAFErXl2wOtSGl5sEMcbxJDkE//t4xOuAGZIlWe1Rd2N0xGs9pq/M/YgO0zJ3xCLBEjLMN6lLuyJcwJTFaqudWC2izUEGREI8dOravXKC3ZY2JJ8/zt23ZmRQAM+BU8b9nuMoxgALBio5TlryAg8iBXRrSYviMyok/RJoLoCCx+kpaJwph6hV60lF8L5iSmVukQwmis6fRNjMiPfcoEky/RJsuX+Zk0X+qsmBoEGPr6lIoG76smB2mrd5oVCJL26CKD7bs6uffM08786mpneW/idfFJmfQ71zVkR0KBS2cex/suNRNZ/agQa3QgPBDEVxgqXk/u050qHpHhIu1hLcwCyyzgxaWxXChmUZE8udlrWqFBp9jLbJGUzn9pqXT1SEhFNEVKCR48x++3IVelWP65vt9bKuLet5S69VZkEf3Ofh/62t+T9w9DQFSX8qRfxeBGe34rhSlvwZAa/sIIutOUGAhi/4VAISF79hCFi3q5C7VbcDAJk3u12LvScaIIKWk7jINlZnseruh1Nx6UkzRSa3NCKUZsipbnDobSGrZknQRvoGA5lHqepM7TWOlAWTBmlZQMvI8svQCI/txVbUbm5I//t4xOQAHeYfR+3F/QsJRCu9lTekduIgzysulEQq2IuQArm/5apYYZIFYZkBlfGtjXvSAhDhDWZuXq9+HrbMC5aMFPjbQPJGQTQLsvRROTEB628wCEP6+cEBHKW7LpiDkmet41lhr/Hai3rUMCU2/M1mr+6jIvfrEyQKnX4/GqjdtU6NznlKXjODaHMpV/2q0zd+Sx00l38plx5ao4+oufqIHglF1yzhYzBNOuqH08UAEQ822rdLyWO3v+GrlrK6/QO2mb5UEUAUCmiwZyMZfLWIzvG7lRlY4GMQATFjUptY5xzyEMoR/543LcmVRZrz//G/pO9Q97ud0kB1ha2SN6KakwDRAmrvWmo4IQCAabruzCICAIyF/jFIc/TWkMwm30whMZMpvrpl8ZIZoq+dKYqRs/6LIv+j/OlR1fUXV3+Yb/H2tv1kvnupRBWZW66CLNquZu/fOJoNKptFQwAFNVrt23AfHDe3M96o7mU+qrkaDvE+eYYpWm+kB3EJaONRucpw4mGBgE/XgdtgEKIwSKhz4pN2tTVIFRVW2uP87MbizgqgDj8rvMPuvISPgFJq//t4xNiAGJodXe01eWrPw2t9qS789nDWXGCZ4AkSm/vc9V2ALBxU/lviKJ8XBb1n21BLsP9P03/9N6sj/Nvqti/NE3/x4Q9I14c+v89ck2T7/X9bIseCjznGfjrqHEd6/3XK7vTf3urWJXT/8DuNJ//NjL/2QH0Qh8bV9csb/ESwbiYs5nFdovi5dVquj/6g2NFqdCD0AHSL7mKixRDQdF39xnjS/5rJJof4ZVykfM2v1AKgg7z1IFzjYSwRD1D0Z3icOJkIUyJcFEmIy6lt3puKCA3D+vnKPU5ByJYOXU969dgy400YOmiOFAGT0Txs8TIhwCAGVhlRj8Ut9iHZ0RgC2N6z2g1QpjWA/EVNqCCpRABQjkUnqcxDvB65sz1LTcQqbt8yFykXP+qLSSRX/HUIcp/uQ4mH9UhpE1/WOQLek993MzRtmsbGb62SOlETqSet8xNjq9NSkSBEyVzquiomkNJKtSX62MllwnhbteVIJaPasXHsdxakvW9f6th+1MlaZ1msVPMlDe4pENUvowpRF0LbAcvJtOCPhizaNplwMoS/AAA7sQLOzABnJuQ///t4xOmAGmYdXey9d2t0Qis9qT9tTxlroABERqduLpwzdtFALswcrv9+r2JcXyYE7T67biD+Sx2AvJKEkLpMsJ7DbAwhNO93V/CkiQOQjTOk3njlcZi8g8N1r5gB2IHZc1HYMv9yeIRvzw5SP9Z8JiA8Gn0DYT8tfomB0fRO1LU+tI+c3EcOIGo44bUX1beWGwIRzrnlMqn4mImAlFd9K0azvZ9W45Tq4bRgCClbbuEz5BIIcHkaLSSFBYix0Hkzo9nJ2dQcIIEs+x/OqofY/3AVJnLuaIfc4sXJQiElajD3YYEagOYQS59mC52bsR8cIM4u1b8NWarFRA3DsUvqZVtxHB0DOEHP5nc+AZHGgopNYAe3Lkzewk6lIEOr3yu1q2rtZA4Mp0eH97qrElnSDmuooAaQJxPXRLxeCWb+MU0/MGG/81JAQ4yKuVFEQETvs5xiaJsafxYQT/75KgRH++IYMnx95OLhX+4rEIQj+Vi2sAUAOfW81AdEbzPtdq8314uHwmGcS0QeQiez2OAaH/Xa0SAiJ4/54Cxnuncip6o/tQhwRozcAEmKJPQCrKX+//t4xN6AW34lUe01fINBROu9pqOULWROIPCaZQCQj8qtOVuYxFaBOi1Rz1bCOuqMVmWU0GLyiFUjLmpkHQOODCIbinN3tXyEg6AZB3/x56nTKmhc1hnj8ZFBThAt3v5rXHbJRc+fTFUGT9EyEx/UajWWfUbGYwn64szzepaA2fssmt80eoQ1/FsYkH5aomnQwkrS2phV1kRf/vUSL4+amaAcfzva9lf8N6Hd/9wdKDXb3UuPj273oyw9Rd10zYfEBVu6jsU1qov9T+6gzgCmvEQFaH8fVmXrcbSqz50zPCyJDWu7imMeuF7yYr3lrCkbnBSi4GB4b/P6k8m8LG1Pfk/stYlQpwoIBpeu6U0upq1xKsZIQ5vlixpkATuPJqk3UN0bhXb1D5BMIcarrUsmw45L6BkNU99bEwRrfMiUFRTb1oDoJ39JRFX+6lq9qiYIbq7S+ef0jAmCI8dU0xHUTondom4HxHqYdSKp8vWfK7nWnJN72/kiq54uUB2IfGjoEwzv/+Tct//zGJj9sIGtP4ICMAUEwgEtyMZxAOi6kQYQDHGRjAE/ocWLNrFqV/rs//t4xNWAGI4XW+y1fKsVRKs9qa9kWfQYhiRmaxrQbbZC6r8jUa/3/uvvTKBmNNyCdt3KkXi8DCJIPK7vLmscsnBTBhPfu97gwoMSWp3Lm/u1kd9W+daiGAjUfrURArt9MlRRn/RG0RZ/TUHWFgKyN9iUIuTj9SkxnBxH1eowJtH0lpk+p/oGCafUpAdBEV1Tk+hA1P1Ve6XqKANX7fqy5QIKsU3Oy0V++kzA+Oa4+2W+zvLZFX7N3GjICxy1lK11fQ6ab+nzicOnl31nP06PUTmmCqYM/1qMt4aCo8BAg+5WFkgnACtheQgBgcGLokG4/bo5MGOk+m6ZaYZ0WsAwkA4QSBxEuDKBZABhhAGbtgefQBoggYILh8qDoJAg4GHiBYgLgJw459y4JsAywMUufc4UC4LPFLgS3jBJs3M3Y6gFqRfjjJ9NdAuCMBl3qVrNxHxe/YihL/rIeNg1+wygQAyBJJ9BQtBByG66zAfA0SDLQ6ZiLmLzoJrYwMC4RIvIK9U1UjaZm4b+S3dlSMTN109RYJdN2SVyVLp2tbZgm7W5mUEjRFmRsQMvUNzAmBXB//uIxN4AG34jT+1BnMO/w+v+t0AF5SWugta9ldaydmztqUdUaVkAIJgxMwIQEDCDAgGnXfQM8oiBQ7gA0zFU0wKCEwYAEKl4ZsAMYslYbaA+YHiM6BlkTZnYGBkoURi0/wXA8EBEaGOU53QsBihOUwQPL7mLh9MChQxRMAwAlQlSBAMLixrRG2qBMsC5lIEjWq0wADZCnSMgBgKTS04yHN+8RoVIlmlwYg/ByATFKtqxVGlbVNVtCxKPCcsCwAPC1kqgj/CrIrc5hITJDQlEISCHdnlopVN+pi6KYtpP2V4qOS3KACYNsSwgD1AJMIAorE58YBAUFwO7Myw1rsNUdLKoefabQHY7d+D/g+99nvp/kxC8sNuI1OXpi5RtD6WRdW1kskpaCNVn+nsspmGnSvc1Gaq2WP7qa/J14RVhpBG+UONxa86CvCgfcTN/ZmJqFXZt5aN9aahcmtGoahmHalLclVXCmysRvK05ljr6Q/gpU912SybCrRYaaO5cjxmkN7MbRXhiqQCa3Ml4PLLoAjc9D//VrRqmq8mqWaa1S4Q1qmzrX4iUiAknKVfbfkwhAeLRyTaCEJUR0Th2fWutGSJxJJ5w4BInEiVfGrKcFAOMSJYcSp5w4lhxLXnKJKJAIlsmzPeZ/kFCdNIo+nIhOkQlHK8zrzna//uIxOmAMCYdR/ndgAJVsmZ3mGAEqr1rzhwMAkTiQVs4cSmqqv///97yjsz61yIB00ijn8zrzP///eZ7EiWUSS8sSAWHEq/Y4llEg7+7h3ljwiwaUHf/WdVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.23750401 + //_tone.Arco_Violin_C3_ + } + ,{ + midi:40 + ,originalPitch:7200 + ,keyRangeLow:72 + ,keyRangeHigh:74 + ,loopStart:37588 + ,loopEnd:43724 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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RXhiqQCa3Ml4PLLoAjc9D//VrRqmq8mqWaa1S4Q1qmzrX4iUiAknKVfbfkwhAeLRyTaCEJUR0Th2fWutGSJxJJ5w4BInEiVfGrKcFAOMSJYcSp5w4lhxLXnKJKJAIlsmzPeZ/kFCdNIo+nIhOkQlHK8zrzna//uIxOmAMCYdR/ndgAJVsmZ3mGAEqr1rzhwMAkTiQVs4cSmqqv///97yjsz61yIB00ijn8zrzP///eZ7EiWUSS8sSAWHEq/Y4llEg7+7h3ljwiwaUHf/WdVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.23750401 + //_tone.Arco_Violin_C3_ + } + ,{ + midi:40 + ,originalPitch:7600 + ,keyRangeLow:75 + ,keyRangeHigh:78 + ,loopStart:29326 + ,loopEnd:35040 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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IqNBlA7IGcRC5RzSfL6ZVKRACKDPhEiBiUgvCcT1OomByBOAG0DMXEFGiaDkMJwFHAYhLRTJsh6bGiigVwDAIFgg5jIGJkgcNVkeGiixEsVCeQQUaouQALODMIJJLWWUzUfAnUa4Ihaf86akPHYg36nGuylWdBNN0Dy9NbnHSLpYMFtfXW5dKBp7pKZRSMX1O1aaZRHAVGZFWqiQ48mui+qslxzC0i6a7OYk2ISi4009mZJFnLirUKNJZAicuytaqj6Hvi+lAwEsrNSlaTEouBz8Fxi0SwjAIwLA4w/GQdE0xIBAxFeoCgE8QIGwwvFY1xC0w9FMBAE1MwBAMUBIKh5rbg3FTUu8ABEDkLBAIFKHSmMlQEaTLDNbgBdxh4aDjZyYBYal6jKAA1IRDmFUkaHGoFlz8647AIqxmMx1UsMFuVoMPQxcRTsSLyqGGWmhMVBAWRAaXI8KRFyWG5bpa0NAwDWALAGXlZJD7Wm4ruAh//uYxNEAHnYnW/WaACWiPqq3O7IhMEZK6gCCqxrpSiVOnww6lmpdVjMM1qaGmfNKi9JVrRGZlsSBAo/0UT8MQAYda+l+pCKzt5sE0/zlY63uls5VpVjKrsklV/HHm941qyCi9GbqbylpZf8uGsSHH0UyVIzRMdMuU4U1WGXZmrVWtGoalMtx3KYZ7+OqtXnct3Mu4463GXXJgdAIwB0mExqKIzkQE27JHjkrAFSKUMLnYxKo1TalUaqxl/cqtLNRqNY4U1WUxnaIbYqKvw7+1UxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxLgDwAABpBwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.06166400 + //_tone.Arco_Violin_E3_ + } + ,{ + midi:40 + ,originalPitch:8000 + ,keyRangeLow:79 + ,keyRangeHigh:79 + ,loopStart:24785 + ,loopEnd:30588 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.30252799 + //_tone.Arco_Violin_G_3_ + } + ,{ + midi:40 + ,originalPitch:8000 + ,keyRangeLow:80 + ,keyRangeHigh:82 + ,loopStart:24785 + ,loopEnd:30588 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.30252799 + //_tone.Arco_Violin_G_3_ + } + ,{ + midi:40 + ,originalPitch:8400 + ,keyRangeLow:83 + ,keyRangeHigh:86 + ,loopStart:22793 + ,loopEnd:28603 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.08953600 + //_tone.Arco_Violin_C4_ + } + ,{ + midi:40 + ,originalPitch:8800 + ,keyRangeLow:87 + ,keyRangeHigh:87 + ,loopStart:21965 + ,loopEnd:27828 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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Z0CkynYxKKci6ZFAaEAgcZsvzRkElFc0OMmm3ooE4A+SyFNzfoGaS0kGoM7L//uYxM6AKFonN87vGMLMQaw+szAEXBoECaVjNp6b769mrSPoAkET4KQE8nmfUm6kGWplXMTEdIbAKBD8hpF9f9bXXpoFwL9DysiZCf/X+iPM+kj//9Z8hUXr//6nKQzRVJ46k91//1lEfBqoZ6ZjfKeXcAcAgScr0fKVmwaA0KAOnMFghEQAGc7PGjoSmCADmLwXGMo8mGohmbBvmXyFmDoVmEAGmIwBmF4OmDZdGcEztNMCsAJg5gSAkmA6CuYnwfI8IjZkZggAHlpWZGP+iYYupNxiyg+3qSqWhWDSNJQCDABAVMDoMQwog1TA5BWMao0kRhVA0AJ05FMSIBARGA4BKDACk7C45gAAAGLwTaYowcgGIbMSccIwhQrzDnKaSzMBQCAMB+MMsEZQNRt27LFS9RgHAcqXLVd6NbMPEbQxMwYTFsG9MYInkxSgvDB1EbMCwEUKgTSlMUwLwdGRSxeSvCYATACgIz7pmAQAmJACMFZcw1gLIEbzAOBNQ9DAITAxBqMDUGIwIQFwoBoYAwA5gLgTGAsDuYF4CKUT8Oo90OyliJEAQJAPV6eXmAKA0DgJlMVbWsMnYkmiBAAX+fWITAgADDgBRCAE/rOgsAWXta4na4MYd5W6d4OgHAoFFzaWmsRna0kB1eV0eF574FjNNOOzBUByWHGts6mYk+0NuxE3whqZZlKrcZcGSKGtJjEFyqqvKRAwA0FAjPnyMzseeJI1S1pEWzzjT1joFIYABLcIoX+RSsw9GX1iD7z7//uIxOkAPxIdSfnfAMAAAD/DgAAEXX1l0Zpn2aKuRdsNUrhS+CoaoYKq5NxcGMN1hmgemNQyiEpU77YKTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.10166400 + //_tone.Arco_Violin_E4_ + } + ,{ + midi:40 + ,originalPitch:8800 + ,keyRangeLow:88 + ,keyRangeHigh:90 + ,loopStart:21965 + ,loopEnd:27828 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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Z0CkynYxKKci6ZFAaEAgcZsvzRkElFc0OMmm3ooE4A+SyFNzfoGaS0kGoM7L//uYxM6AKFonN87vGMLMQaw+szAEXBoECaVjNp6b769mrSPoAkET4KQE8nmfUm6kGWplXMTEdIbAKBD8hpF9f9bXXpoFwL9DysiZCf/X+iPM+kj//9Z8hUXr//6nKQzRVJ46k91//1lEfBqoZ6ZjfKeXcAcAgScr0fKVmwaA0KAOnMFghEQAGc7PGjoSmCADmLwXGMo8mGohmbBvmXyFmDoVmEAGmIwBmF4OmDZdGcEztNMCsAJg5gSAkmA6CuYnwfI8IjZkZggAHlpWZGP+iYYupNxiyg+3qSqWhWDSNJQCDABAVMDoMQwog1TA5BWMao0kRhVA0AJ05FMSIBARGA4BKDACk7C45gAAAGLwTaYowcgGIbMSccIwhQrzDnKaSzMBQCAMB+MMsEZQNRt27LFS9RgHAcqXLVd6NbMPEbQxMwYTFsG9MYInkxSgvDB1EbMCwEUKgTSlMUwLwdGRSxeSvCYATACgIz7pmAQAmJACMFZcw1gLIEbzAOBNQ9DAITAxBqMDUGIwIQFwoBoYAwA5gLgTGAsDuYF4CKUT8Oo90OyliJEAQJAPV6eXmAKA0DgJlMVbWsMnYkmiBAAX+fWITAgADDgBRCAE/rOgsAWXta4na4MYd5W6d4OgHAoFFzaWmsRna0kB1eV0eF574FjNNOOzBUByWHGts6mYk+0NuxE3whqZZlKrcZcGSKGtJjEFyqqvKRAwA0FAjPnyMzseeJI1S1pEWzzjT1joFIYABLcIoX+RSsw9GX1iD7z7//uIxOkAPxIdSfnfAMAAAD/DgAAEXX1l0Zpn2aKuRdsNUrhS+CoaoYKq5NxcGMN1hmgemNQyiEpU77YKTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.10166400 + //_tone.Arco_Violin_E4_ + } + ,{ + midi:40 + ,originalPitch:9200 + ,keyRangeLow:91 + ,keyRangeHigh:94 + ,loopStart:31014 + ,loopEnd:37000 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.23411199 + //_tone.Arco_Violin_G_4_ + } + ,{ + midi:40 + ,originalPitch:9600 + ,keyRangeLow:95 + ,keyRangeHigh:98 + ,loopStart:27997 + ,loopEnd:34041 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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ane3ICp4ZfuB2uLSCtRC08Lg8SKDoSUiWluXDz6plNDaavtrL4s9L0tOguj7hjhhldsymvbvX5kKA5MRPZUr73h8jllmWQTCbTEpt2YZcmha3J3DZTRMNhqigWOspjbK2FhUEGQQyUDKAOT1+Z3f1zWse6qdzr1csO8//538vxz7dky1Xuk+e+/jnnvn8/eXLnd3Odwv5/hcq41d08YioQcCRfBKT7O43S2cLFNMdxpbM5nGYph8s79Tm+cld2r3tiXEAGkhcsl6tZW9Zb3j8rRYmoZoZ4A5AJM4PWradMYHpBk5hkFpZI2jpw0vPcwECYwuAIOHQeGAwSegyxTBCQYNAOjmSgcZQi2Y0BAYFYLJgOAHAEBAwEgLzBDDuMWMLTFItKx5wwAY//u4xL+AJNInS/WtgCd7w6p/O+IYeAZMiZBsyYCNTOrQ+MFEFYxBg+3EV+QgUmBWB4Wjeo1VMgTSEbhMno4YwPGg8WvIjRCOq4MBEAIOAREgD0cy7Bdcw/BbwCJQYLBIJh1DImHEC0YLoNtp6mWGAmCQVg2M3l2UEtiZmKADgoBl/n6lpg5BumFYCSYIQP5haCNmCQEUYEgn5gsBGgwFidppZ8NQ/AUXBQFkHKxsXWozuItajCqCF6fBgCA5mA8CKYDgAAsAmhxMBAAMwCwODATAsBIB5YAsmatWV4V3Do5StYwIATigE+dsZ9tczxl0sgQwAwCku5eX2TOQxZTAEXj6VoBAaTmZGnSAAD6koiDt4zNulvRsoBnZ1Xqz2PtYa3NwZKXdfp+Ioz9Mh6G7w0y5tWXqgdNVVfqGTlMBFQBC5zL2ECEABCIGAEqYqrCIA+MRuBM1UDA7BeMEUACet0Eowo5HDHYxHDAUAFanuNv5Db6tKCwBtHRa1nzLmfdVaWt5eVejzLRZrtG1irtRKfjNWVQTEZC+3ZS8SkxBTUWqqqoEEBuUACJwhRCiFh////jG0LNEQqNCEALYBQMoADAkTFQReQinCIVNJodVZYCseu//FcOi4mwmzdVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxN6DxxRzAzwUgCgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.14009599 + //_tone.Arco_Violin_C5_ + } + ,{ + midi:40 + ,originalPitch:10000 + ,keyRangeLow:99 + ,keyRangeHigh:102 + ,loopStart:27302 + ,loopEnd:33055 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.17430399 + //_tone.Arco_Violin_E5_ + } + ,{ + midi:40 + ,originalPitch:10400 + ,keyRangeLow:103 + ,keyRangeHigh:108 + ,loopStart:27773 + ,loopEnd:34679 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:39063 + ,ahdsr:false + ,file:'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o/5e7zv7zvdxrd5Uw7jjl/f/95/rHfc9a3SwXCrwulLEf9YUD+pNAGitNKQIAFD/+6DE+4AhVgk5zfX3g5A26Hq3sAAAASCAcsAjVKRDiUiC+esE6TxhkFmBjQY4FhgxHAkvmCkABQ2AiAYmHpgEImZhcaaLgkHBhKCZAA4qBBgWEhhYGpMHqCAwCA4DAmTAWYBAGYWAknWYKh4y1SwwvBk0MkgueMgCYDiQAYRdkZAMwNC8xxJwxzEVXLB1sSISQFEtL2AXbMmwVMDQDVjRoRPkycyal99IOgmPNFjD/NATrAQAAIABIAAMAa11IIBAAI5EYii769GgVWkYjjGYGAbL6a0guNAoYVEiNDGAgIREfx+4y4SRIGCMIAgOAKsIgCLmr1ayUAEYFA6BAQDAfLuigEMqLUFvDAsATAkBwwCwMAjBGQBcCjEgTX1icnr3n0gN/YgFQVMgwOIgHpInqekMNx+QjgUmJATBwGAIF1Tz8VRvYuAAATAdiQ3qUeB4oEBeT9ym07rX1NrqZcTnC9iXYVDdiCljXpOnQ20CQ/DkMMkR/kS7FBBoC2rlyC7jEFjvnTsxZPLLtlYQOBiTUlqn1lneq6b29hEaLu////52glSAtMGTRutYu872783Laazvv////0cUvPDT2+XaeflljmVikp87/niIZ3eJm0EAAFEYjjw1sN7DvI2oMogEIAgLulmS5JZlACwWUMqVMGCZKtZcQlchz569VqtesKtVqtYldGbS+iH/+7DE/oA30jFD+c6SCzEmaLuw8AEgOoAlACRDkspTRNE6UNQ1DU8rkOQ5XK5XK5XPXta/2tatXr169evWFXIccxpIczXeq18+fPnz5XMzE9evXr169evbW381rWtrQnz58+fPnrCrXsXXtatawXr169evnz58+fPnz4VwKCgkFBQUFCgoKCgl3hQUCgoKCgwUFBQV/Bv/0FBQUKf//8IKCoopTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.16596268 + //_tone.Arco_Violin_G_5_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0420_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0420_JCLive_sf2_file.js new file mode 100644 index 00000000..ee60c1c1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0420_JCLive_sf2_file.js @@ -0,0 +1,170 @@ +console.log('load _tone_0420_JCLive_sf2_file'); +var _tone_0420_JCLive_sf2_file={ + zones:[ + { + midi:42 + ,originalPitch:3800 + ,keyRangeLow:21 + ,keyRangeHigh:39 + ,loopStart:29217 + ,loopEnd:33430 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.17560090 + //_tone.Arco_Cello_D1_ + } + ,{ + midi:42 + ,originalPitch:4200 + ,keyRangeLow:40 + ,keyRangeHigh:44 + ,loopStart:21620 + ,loopEnd:25679 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:22050 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//NwwAAAAAAAAAAAAFhpbmcAAAAPAAAALwAAK8AACwsSEhcXHR0hISYmKysxMTE2Njw8QEBFRUtLUFBVVVlZWV9fZGRpaW5udHR4eH19g4ODiIiNjZGRl5ednaKip6etra2xsbe3vLzCwsjIzc3S0tjY2Nzc4eHn5+zs8vL9/f//AAAAAExhdmM1Ni42MAAAAAAAAAAAAAAAACQAAAAAAAAAACvAndkbfAAAAAAAAAAAAAAAAAD/86DEAA8IBp5fQQAA+AAJEbr1/1oDk4XBAaD58u+tQP8ufghBCJw+XPlMH/8H8uDn+Ud/9Qf5c/EHyn+Ud9Yf+fqDBR1UEP8MKgAIaAmWeSCkX9fLZcrcg6BCR2TxVYHUTgI+tExAksFHVMKFMuHWMLCExlZlWI15LsInNhUSO5kHgQpWOH6iOSjroFJGGB04YpXfgVpTAmFlpwsRYaWOW78QbkyS3UYU/L8uRFadTZoVJLN5yWBnEk8kbrEYccWM5cnYhC3fuw/z7UObw/d3j+X5ufpOY4uuhk0JS51obmJbJHCg6WdllmphUduGIQ/bW4GyvXa2HNw/R9tu5t5Idsxtl8DyyIxFrEMb3hurlzHW6uGdqZo7vPyr7uZV85mnxpn8hOr/53rP517vaenwqU1+3SUsPQh+//OgxO9HjBKqP5rAAGXXfs3/yu1cM//5iiq3d1Ke/SX8Ob1OT9JzP/dSQVpmHaWliNm7bvyyWWI3dyt51SAMBL1+ujwJDGTjrWMBQTAYchdF04IAIQsPwooEvU14qiVTNYhwDD8twe740HFdOhGp96yrg/QnFSnlGW1terlLvDEcVO/Xr5dSHqhafItaYpEQoXyQ8aRfVFXlV+C1pyEfDcuH24GaXlS6uSjyDuPisCmXCaSA/8CvZmt4iaIfR4zuTyBJiG/pHvq73F27cOa7rsrPFvRcw2FlvNHeuM7/WqxMwVQ8a7Q7z23fWP7xu2VbWS7yPAhWixKyywWFxYbOstu5te+YsNrj1eQaY28n1C1Cny93F9a5l1eN8R/Hmu7s2QMb3PWHcAc2IDgIuT2aaKg05tJ+TToCKP/zgMT8Ovv+qP/aeAEtfUCammtOEJ9QrIuPQIzuDGFutVSWlr6LOj6dEBCgt/1sMTiLWYr85bVrp49lALn0795zEuytbn7ssW9AaxFifwsMTMFVxcUHIgzD5TPFgcpysaHCn/ds9okYPRpp4sLrefxd7K996XbPGGdrvdqXGr78987am2pA62XqJy0sIKAydIdUxunPIkSPTnoDKpRHwwI1oC2ivbGW/bLwo+Dv30l7QIJaxCdJS4pijryLNg6KLQhNot1tltiZBIh6QezZmIL/85DE0zaL9qj+0w118KD2ro0HBtUCggCwlPf//32AAda9hhWaZqZKvFzM5tFUWoXBamWC8Xo+zNrx49EKjjBX3T0b5uxMTlcotPpjHWgV2roZvEowpNNuSVatjLB7qlfqG+Dhtok6qyH9IsJFBqsuI8p/1XUc2jiKqC07GYIOkDYPcvK+iR1tTzDVltEL8/HaMP59PyH622OxbPW1jBPiZc1VXezq45aKF9hUpSpJGLMcqr52ZbNRFMxpxgjB4cGg9C8lm2IDUgsw8ktHQ9CKp3JHnwm09uu+XMX9KILW4iFo1QQgFEI5/tvZa8fEyl2YBuJI3cVosJvWSUmNE8BoDMJUNPT/84DE8DNTvrpe0xE98eeSARSMR8Av6CzNGAn+e8aRzgCawUnZMybV/SUX1suKw1VY7rJGPKPpiUaMhLMV1iWbTG9RSAajn6c/N3KHPwX0FGaPyWTD5ktjUpFVShO5GgWI5k7+SYvM1DbxhlvIWpFHZhgHW2h+wQUKr9iGVNyi65aLboDaPFFYRlca7Np61Ld/8o3kbuEsQsJoa7NRu/81dbG4HL7Xg9ZeDVwwqrj9h5sJJwZ24e6lD+Usl3INSFf7t7iHE61ZVUwhwipP4ses//OAxOU0bBa1vtPSvJb2SqdKG8qRbuFQAuC1A3H/kKj0LzLoHPHKxFhBtyRoVLHNMkZ2uHQz1uExxn3RUWUhm15YzbKl1BOCj6Ju+b9rZ5EJoYXbM2Vl6zdiwnu1I25+fKP0jbQ3V40q6ZKs79lj0VcF9JpCfLBYceFiU3Jvt3A7RkQLtMLJiyf8fYlprUquYXCu+epfNWs7CyoxuzPsCz8PfmFrdNnIYghlNjv4uMOz+PENmGSfDpc/HG8xoQ5kuTGlagoAV2t3gElBhWBbAP/zgMTWMlPmsF7TzP2jMEATdRYKrqUwMSFYQHStIGmJApEmkc2qQgNOtoaD7iQQonqNTIdO15yos3O9oqhFYvSKb6Y1n2NuAPpwYkbpTTNsWAW3a+sVhag2lV0g+oqKbYC1437uVrWoVoRvOK6rNiTVYELOtLBlMw2oacWaBWV9aEltdCPNtKV04lkAHSIhOhDJOQm5ESCUMl1o4ftPl5LQyeW1/uVaU00GMfJ1GaeYYmmaLDcUeKQk3U4lSEuKWSGSyJoiktOXnWOyL4qy9Oj/85DEzzbMFqxe29L4q2rJrZb72EZZ/GpsVQgAGukvgIhAzZ4pmQFbAxQaqECkMigQ5QiIwEuQKWqgQqSIkRB76cYGpzGxKUNkE2mOBXnU9rNBTZ29vjdoId5JOTNTbp85lpmlmPObkL5HtzTeAHsQxtrsz9EDU7tiPNJWO2PHw1u0rjCciHStWKNpFiNl+1h/oKNhYuv+sX76TLJ6QfDFLzNrustDh1kmFRVxF552tZvOV7ttnRa3vvz9Ybe32dOO2td+bMnerz9i7xPIycn2b9ZMKpo73X2FtE/uWlba1Mo7KSV/tMM0z87abXLLeWL2F+xPzWzCCQhgBW/a6urYf6GrgaL/84DE6zcsFqhe3hiYRRlUyAw2eUlGHNKPMmRBwIQy/TORFilGswgNFAMhwkCVeTD0KLPFi4Or8KN19GzXCZMzAO8IC1JfPrHOaq8Q5K6nHvgwua0BmjBGhRzbsyTHzukAGeitCVf2+qMUTr3L6ndV9ZTzq6Y73aYbbO3Z2k+4qYHfQnWnBHkzPb9LtmLTHq6+sVxt1/VS49hdfm1rd7XX6vvwOGJ6sRHyQGUB7zlsOnmr1mubG/B+3u5G5d1u9J/a8yq5zKNJEDJnzCnlKjgK//OQxNEzk6axntPYqd+28Zd850CSLBq6HDrcko7SVNOOCAkk2UE1pZS3I9ncRchSyBIJsiwMtFQay7P7amcG97g7LZR0N3Qo3TZH1LuqWiE0yWfpChmHpFnFZoxqb+rFZIJuGW5yU81BLCcKaQCnAUU1ZcB0kd0VccQ2eaYWRsUVxcmmks6CJlYQNCtFcJZLJaQGgvLSJq+sqhRdLug9eShDcJSbNreOPb6nzJIKL4iQxatEhwfcIGyMmR7CNfG82dCrEDQfVQwRFWRE7D+XIvS0U9jXyTW1VXkqjuwtiacKSVUEFwFN9J3WUpOqNC/phS6HG9KvbFJ7EgKB4piAQGxUVAWa//OAxPo1zAawPtvS9c0x/aw/CwCMnuBwrPtGi1VQjF68Y/fqPDg0S9BsCWWKz7dMlqw8IxMMWhInD1KKKDijYi3+b7D1wemkpFwsfna/qSPUHh/dpSokeptj9k9Dm9j+oms6R+MNyJpXXViEPvEV9+YX8g+kt1lfyRRRinRdO0dr9l92lnlT081WN9947dHIFMahDvu17ksDzpfZyJc7aIyjpqnFXqOqi8tn6KacPWa32quTXzWzpLGMKggAkAU+0vjoqGPPtSKMkuFrSPLOKv/zgMTlM8v+rP7bDVkjPwqqihZaIi8bGAMDx9m1dhnlUAs6VBAt5GH1VOl64Pp9Dhm23WlGkTRC9C6XeHpwhBnYG+tdAFPhZkB/jswxS34nu2Ikv31Frkty2gtlibc0A3xya1dceGjGCElVSI2QjqV7Vy8HpZQm8JUWvyxdqrD+LsLpokJfrlnKa/NnO2F1tc402jhbwz5rxsnJWQKN09BqmD28L5FdmGP1oCysGFgdKDMdhx9bFJSU+p0BELMQwstDCKEJ+pQ85aCnTQkAb23/85DE2DT77q2e0w09d4CJBIX/PQM9lgMCYBZTEniwqKIEyDgFl/VvwayS81qDkXnvugwI77SbbPkK6Y/ibvoMb3NMQ7EH2l9o5kMJAlU5VwOQBU8FxpQrc9lYZWWZESgh6XY5OaVnuhYlNOL/MufDPSqrxbJYWGLiY3bZVsv+uo6Kki3OutbxfMvryeFoy6SwniGW9nCGeW+DVrdNJn1OPU9O6WMXTl4xycm45NFzrlclOMk5pXBEwmWRDbuOKHK8bLep1UYxh8blGbrlNQLFJwRQygFVCACQBS72+WjAA9m9MQw7QS2IpII4ug09pCoGltIWz0zxi+bXcUy4FUWFgegaDbr/84DE/DMT1qxe0xMZRixWR6xg3m5Ppo1iia1B8FL9TevodMournBTeGG6JVaSNO67iZj+lmJHwFbdczwYGjOdZ3mHnM0j7pFbjrMM/Uv94b5zC/ZfWPVVXerdI8N86tGu3Ot3kfvoMNh3hIMjEh7opLKU629RPVZ6rE0D+NWFR96zTU/xOtTFvL0UhVqi3JTQS9TslJLkWYWFBcRRED4RWJadz0KSNBeKu5HrZKQTDRmu2AKYqggAGJc2+3vNLP2oZeDSpNRWOGLoGTTbUdIA//OAxPI1y9atntPRPeBy5Xk83RPO0/XpOyO+PBqdTEtJFjovtc22TtjQ1D/qmLyKqpszyZ0W5yXy1yoMMUZ6tXU0ZhPDThuR/z2+bbWKrnsSfr9Qa2rCzbJiTqREmFtOsoR5QBnFtxhorvE3jvZ6HwCFiLE3zasFZLMokVEQTfBdUSTYmsx6xJrWVKZlsfmS91sZ/ZzuNbmQ8dj4uynsxfqslWqcopupIGEbeNtmKxufpbMhJT6pHCbUXATxxHnaMKDZv9PTPKVziYIXWw4Zif/zgMTdMyO+tZ7T0vmJEEsEQPG2TDz/FkTrDZCIPp376m6pzKUwKgwAOTTKe08k9dkP0+pqE/BHyrKUQn38v63tkOMGudwp0TORjpAdSXB14RugIyECqIGj5wI9UipDH7qTVVzVy/9xfoKa4PqEcRJXHglrn2guX+0YcssxdtyziHwnrG46rYD1s8efvxwbHFFzleVWXyvq3Z2Dry3s5Pd5fLhy8RaEomdVLeKIE7OP//j31xeFw5uCY5Ld8eKa+BydKyP+58PbGR3E7XJC1SD/85DE0zRb9rDe2w10Kl/18RXMdOdqjAjOGG6tiJs6gw6wqOgJSkZcGomQTC5mlM+LANYdgBTFBXGUhih5Jtqdxo2ZP+ah9SRNno4XNvb/K7H88IQloYZSK6sFkvAd0nS+a9bjiNsjpBw7UljG1L3WwJNuoaPDorji6IaJIY4y6VC1r1qYnXVTrYoveshV0tVJS44XbstH1D5ekTFxXgz4LFvH78fdHsS0rpG411XfrvY/s2r35DtsYtG8vqw5V+PkL8RczWnd35Tb2gd5x+FJTY4PyJ+Nhx8n+vtm5MPwv0iqvfgi+xBOujAJ77Tu8MAT4bpAZQQTZmsJZWlB9EK+BI6DhU3/84DE+Tcr9qw+29i1DAZTZlL8bRuvsKHkdMYQPFWESPNfmLo5VITpplL87lC8ovJpvHs52OyOmZPWfxVLjYJUDg2uey3HSdLXF1Gw2yPa2g/TBME+vkv8hT57Uqgy1Do1dOWrVrt6prLJaW457TKGZTeKBHO9tXz7SnXHWx6XHaJafT09bIabHfofz/MubjU3dWTcGPLHfVvGWQyKaM7edLfE0iz+qP23moOimx+uFohBEhFKbFrAjaVpijZ6PVUIgLQXP/75KSgArfYUQVlA//OAxN8zi+qsPtMNdZnqcVO2nSqfXLwoayxeTyUjFMWY45jwK2gc5rjW3gb3jCrl+Q0DW9nL9Rl4Naocdn/OPZDPFdoImAxuSvgUchS1/OQlTYDdgqTivK63mm9zh0rVwtxDRHsdXH0tHFL7MB25L6yJ2Y5SzWjq5lCXwfvS7sm1kJ+RhxJXpf6Oemr+pIoc1zINz0arG/QxmMYQTxDZLIIHsEYvjq55pa2SJseUUISipppo2aofEaWgtk1I5iWoUhEfuWQ+hi8yBIDglz/66P/zgMTTMuv2tZ7TET2RCBOnef8w6oaiMzXJXWGihUUyNwgMnyZGryIOLcWxhJUs6oQEZfBMvW0nX1u+NaQbaNeoaOrc29WEzTdmNNUil1wLMRn63Kzr6ksU+N5XXJVyPSxjiLFjGhLZYzBVSqElE9mBIAwbbrwmVH5L6cOzc2hA380sYpagq9JyTXs9/EtNDDwpYk0fTFOodraZ3WcVtF9hmylvlNPm+20iR3p4Kojdo8v1uTZVQ6UTqpkuGu93+y3Tp7IHmrSc0o50zzaJFon/85DEyjPT/rGe0k2RjnFzYsRqIAhQDe/tsmWEOgO0mTAzcaXYCKCGMEoD5AWhgRNoSNFQDVokjH6zImKM/Jg+4LAaAaMSx6gEJTrwz+dL713qGHrt7VM0DGBOb5EnLsLb7QkfFHJUVRtKU3mKd0cXkgf8yeMp4TH70lnu2S77NmiaUYR3Q846idJ9i6jYXsP6cVpTjl6B56CjTlpm6xkqHiZQRQ9FohgUIMJXlQbh80by+mZ/7h8rt/ck1he2xpa5W7mt8TKJ669i3TnO8X2zC3c4o0+9Y4opp+MyVVb1qWpA+H8aoggClOb66xV1hdbWeWF9DVWYxEHyYax4RBoQ4QKrXFD/84DE8jSz5q0e2w1xqgKWGpZ7pp4KNsKj4iCWKSSEbYT2S2vo/enuTHOSvVeM6a9INbwUUn2jvd5UwQliUR0wlOQh9ctRa5AJMaWra1khq9UV/2a0Y4qx6WbkIM4iBUebsIpHCJOM8atZ3CfrIIoKTaiG5PpSHTthAhdsdizaud1Q1Oq9ldk18xZmG1ebP1kao63Zhwyv31NOVQ3qeyy6FplFkHx7aBSuuopFfWWmGF1cqveQq/KLmKHHIvqGKzUOAFg3N/r3+YCf5oy0RPxZ//OAxOI0a9atftsTbTqdmXDQ2KDnzBg4MuyZOXJKcmCfzaT7HbBQBsMMBiVg2wJHhPcqpkL47DvAn9OG8IX9n1BOwPqtE3ZRJByZAXpDHzyDO10dvE+9TbXUdLzDN7f/oc4qsKFR0FNjh+B3Sv0KvL+z0JmWOQPUMscH2vdHizg+HshFrUK5D2sxNbG4NDn77BySDVPHOQ7TGoSHCMEMih4uYIJDi1j6QfBdSVxFjyS0drVmehVUtWR04ehCyDShwxGEZRcxxCLaKMODSyoggP/zkMTTNAvusZ7TEP05v9u/qMx4dbFiYqTZmUkxSkZNDpIeSXmEJ2SBEiG3GaVSwHlL1Fx5oVBNDrTPtD2NdfVeVXkMtWpJDQaAhNPKYgYIqMrjKS7hcrQRPL7tzL4pL5FYER+nym+fbXS7OddIuq1cSyqFamhR06xOZL1zyxW29U7Qwvrxyub2vOeEkkI8RhZEwpS0Zz5iiuYf8frSi0sgozBfFa1nxpODBOKQ0DIUL20xjK68EFrsWjmoy6aFyy8oQI2+T6WQWjPsKFryaXk9aN47zlLY4n/X9VJyUwohIIAVd5a+xIFmIU1cwCCDDJ0EwbiYtCQlBMzR4wAB4Shq9WZM1v/zgMT6NTwGrN7TExlhUEiTLDC6RjozKGkNT2rzbu245YxgLGCezEIzdSD4hDt6V/Abyx9LqefUjdBolWFBjrFnXd+xZtAMbk67GdTIrsTnyn2VWofg+zW0SWlOx3Cp2GF4bUjlY9B1Wv7bubOMcsIsPqW+tWyRmiz7QM0Ymihc+9fHT86ZvW7naRaQlQg8gYWMtTGOn4VhQ4ioEShBGIcYqGK4yz1Gi3yzyZbKQsVdTdo0GxEzFf80DADkF3/7eC0PDeXViGFcCyBXyhUTZFj/84DE6DQ73qTe2xF1FgYRKqo0Cp1DWbyp19MGwSnlE2kcvxRZs7dF64Mywjl6o2vM4TlNwLWL0UsSNOkE0qOVsigDHyVnqJaih/FWDW6XUVW+1Hw29+JGtQb2tEDYATcEECkITRD0CJ1By1lEvFutkmzmwvKVgt1GYkMrYgTynmmMahLUn9EzBrZTzYPmzkcvz2sKRESc3YdbT3PiaNSXfcmYF1klqNaWQqIuQQi3rVK76uUcucIuTVbVa1MugwjgavOVDAFT32ZrRec8VWST//OAxNozW9axntMTLTETcaaXXULlw6A7KpAPK8ZGhi8uQmA4moVKy5sjKgPDOAQGs9gK0soOC8m77rXvc/4M5HoHyU7xgyK9ofgFz9q08emJM4wDPxWWLF2xTpC/JhcOTeEffgyXrjh7iJq0lI8Zfwv0MCM0Iau5hAcLWS3CoTCOjQ26bc4y1PPZZ7emZZcXH8kJdc/kcFSGLIie3C7VrznNdx+brOu2v4+VelSdaANen9NOXkEcmBJgRAXsHpnPDJltaIg11sQpY2RjUotPkf/zkMTPN9wWpF7bDXRZqdHpGRJGM8zuddXl5zyBiiAkAUvrlplYQGAA4EkKZSdeNCRLUiJEQhwMRdYDAumJAkuqDWIVhgz9EiX8oDWhNaCHkj4cqVvq8+EmusRl8FW+wf8ZeeaZffqZbXHUS7yaPI6CEYPrJpSyTke5qpzCo3acmXIpHavTVjxJIowiXXvCwM2SQTQxQacNwMLA/rZ+adoWpgxJTSYSrFZbKzrbTHYmuhISIiaM9pI0YTDCFJs8vX3K2pyVT3//7/DqYu+yPE4cPI+1e4+CF8ZmVUFQkjMr9tRo5OZE9qGsss62y52QWlHGFkpUrko3m+7/z39lbwgCAy7+Xv/zkMTnOEQWoP7mErzyo3HRqKTZgSCJL6PAYcyAlAoo14ah4PRwniwGQ/K3R0VQRmjMRIUiIwItAdB5JlxbecH/np6J6q2fO5jcc73A/feMsrrAxeqkSINPLLQW3LxFoIvsReDeETVLA+vn0RCLaEW95b7/Fy7TrJCdgfqVsK3MgY4qoLh5GzU6ms284b1rJunLrxnvQqJkLaFMZlACZAOYFQmskkjwsjwlaTyis/k4e/69MqkuELLadRavdWwtsw5Re1lanK83pSVWxGygXVW7KHJsoLiTa2mwluolEoO88lPw1LO9NRUIAILm2l8wOAJsUA10wAMKHZOQBH7vKBt4MiIKUv/zgMT+OBwGqX7bE22RopURUDGr4PtxQ5Ak9BdnSpGKvVCdNGvTcn7W0+F+Itc1le3HMX7nN28GJ4NVc/g6yQ5hH9csRlwd8Ea2VdFFgvU4UcHn9F3rYrll6lscsbS8ULkaxBlCrgl95vaHqV43nryj2GW3JZnK52ISpCPfalnMMqies9Tak91nH21bt0dXYn6+f4k6i2m1KE8m+0C7idS9hGoMo6Euln0w6yJg0sYQJmKqkEShdyzz3LijBeCbs9zysUSMBMvtmeEhCAbVpLH/84DE4DVD7ql+2xF1gjoCjZZJa6uIgegICMxgAjoUA7xVEE2Zxw8WBkQLIxIzhoqiDzx6lzYHySyLCZ40bGYdX5vnvLpnO+d4wTToudE2L5S20+jzch7UAQNolzdKEtIZF5QINB+UxM+LVajC+LsQBdltqBTSmkYk4ompNc1qoNRIkRBNfaMMkCy5Mylulnya+e4zM2SwMMLIZXk5LuWTgRrXT5yUSlr5LKlR1w5c449qELkq1I2Sysx3o6SrYfBz4qy97feWuY7p3dsrHfMo//OQxM419BakHtpNlMKek2OITEZVsvEgCl+t8WHQM1mEcowFoDjBu5MAS1HSVDAKUPEZLLYFQKcjFb1ssA8JSnS2lYFD5REHPmWkZQxPckWb/6gy3XkeT7ybrNuVvgiBdsCvwa92q3y+1eajuT8yb7PIp6Ekgw2U3iDULUO+7OmoCVmbVoNL5CMhCrtwPwM7ZN04nI6yuXdJ/TijalpGF1peDOTRUfJkZO08x4gw9xid5WU+NWzJsxPMx5eLkpnZGj1RiBCG3lU6BmKx0jC3Q1kjHtB9UblKNqibup547QW2hDnXAhACrfbV7BYGP8iygVM3KR6tYkjTPGAhNxmJFeOgBjWH//OAxO4zg/6oPtpNjRAURCNhdqmBgVMQBkZL6mUc9rCGhRBSNhh2E1R3WsfDVNBtBgqrZgl+70O4S+DrBELOsgnrlmYW7uNvLQzmon+xVLPBYfFJmVXepk++DtRyhe1FJ749nrKqb3u1U4oUrpI4mF/TzdK1hcotmGYWMKthPJ3roTqKgeRMFqsDC15PBzmldOPCLyqdv/rX9RhibbebvvvzV3oqrPWJYKx0jsb3RqdPbo6LpOnIWUKDp9feF3mrzR7fvnbX3X4j66Lehrsubv/zkMTjOav+nL7eWJ26KDxaAEACQBS76+KsfOAgAHAsYTZdVjS16hioEKjboRIyIDwvnxGC1IwynxeLp3mwiwZgwYAburSeZVJOvqqPamcw0mtH8I60DFRrUlefUW2xvOAnJsOH0FEgVujTDxQuYfqKA/sKiwuF+GO8DFi0k3FUSReMjEj+Aq9UWqsu1E8IjFBNheDC6bGVqZlIPUrKYVVTPgqCED0B8zpOomTrNWWcy3NaQybaNkUpUyrHNyW0vNRaTElWY7LoefYgTrmOWtm4xd4stkJI8q0iPyFBR6NusfG5whZGtI0dQLCGKKLSTayjl0cW/lwxOaoCAIADNfrXeCgOe//zgMT0OhQOoj7jE2WMiA0xRLEnuWlYLmYGFNmVUJpiGQMGWSoNrPiCuaqGLU4iRCGYFDnGbA/kuJhqXtwl1znty+Db3w7p270fi253rdYXdVrrtlHzh6AUwDx+gTtFDr8laKBCYKYlOhuRbIO0zp1omFeiEkIVHAube3N+qH8IZmXlWc3Tv8NKZJeyV6x6zm2Lc4uf1ILTYqLDxYOk79fdfgWL2318ob/XvRtrt3Gkq6wlqENdjzzyOJlqz0M5Tcp8WL7y+xRpCcsW4xPO1pv/85DEzjmT9qGe2llxnR/QyyrP1XwLKtV/vl/WJacbcdavKHx86gIAAqAV++/ZaOgDj6V1ARINSgoBMIOjCd9KQACtdLEx+FQGnng99pHSFRAmEUo4JKQ3DETI9FCZPMRNGHF0SSA+0MmJdNUhbbTohlxW3oTovoikMgYcVP6jnXWE6wN4sOSfxo33KLE+KKmZqn8OzHYzF6CxgFZ2MGVkaBE2SyrbudKV2O3SKKrBYliCLb4LsYhXVJVytcfgROkTpbsIzL3GFrQpvaqPg10UaalboXs8lbNk6BRk2uWQlgJSAdtolMQIlVpmGyFCiRNFFHrzkfmoom9uCj34clrU9zdakED/85DE3zfsBq4+09LtXQWCe3/3lCL4J5WyScklHC/N5rLblQkEIaRT0nKoMeDTMs0VQkCNGZDkmgzVsTZsYHoil939FL5cGmySI5G1CdFN5BeheGWkjBOfSCx0cXGx+uHFoH5HDyD1iXZJPm2tOsG9zu6RG2eV5V19NbyaMk33ED6Vp/Wk5vKvk9IVErJTxSe4NVrn0WfCFvXRieKK1drOUtL57w+khgu7H/19xD1Iaz2TKwmnGLdSh6iQLazJvcfqF0Ipz1uab6QIUXVxZu5bbNIm1UKqua/JpZ2+D08VAhABoub///NRQ4VNnAhZCxxH4OjtfQ6S8dJBiO0sbywBaFM28FX/84DE9zQT/qxe0xMdJT1OVg6ZN575I9unZ7AFrKpk2WfzZtbr/HKXYW1p8hJwKC7SSwQog7HWhrUTaVEuJJ6ZLQ9Rpx29dVeg1S4w7FjKFAhLcQrTOlaUilkKqNRORYz7XmtNPwldGVI4QxSlM3JHPyjJWAAUDBEsqypEoviPEGo5zKSQSrMv/ev4NW3ds9OZ2DNVfW0s2pNlpVk4KyzyQ1AeUMrxtRGtrlGY3H7XuFZt66M4ygkpKGSYIUIOA4C3/18aVXOZRGThwmTLqEsB//OAxOk1a/6yPtMTUAVChIDc1XRE7SJADmSAqk4JbSqoGuFTtCRHwaExR4Lu2XZPRYrzNx/LUF0lSKZswxmx6lJJAHWQFWgKMr9E+J8b+tnWuXulyNOH3mkcw0Ag97zCh1RsB6yg+wY8vq2PqxmhVcoWZvcuTcp+3C2qvbYKsqqHB8f2mtzvKVYfokJvK4mFVH6rG/gu398lsxjfeY11nuUkndORhFBFeKY7X7997JTRfotyjLisZI1yWMpOvcIEwNMhdED9GCkTYmW1LwrlUv/zkMTWNdwOqX7bDVlgtRAK7/WvMuAT1QgFAMWChmbTxsKhzJQ8WdnfDB6jZqjVKk8cgQB1YcFj2iMKAoqo493FWYtfsTc9mzfcdswZKdPNej8C2InhAViombZaMqhYhFHDSqsfYsdqjk3iHlVgZWKVGibc61qrjbK9EQ6QmXFRVhp66zK4+gdieTGzTD2WozbvTGNSsqSO6zVmKHqvevXRhvYeWUS7Hpx2T1IcLpUyxkX3Yio3dXOXi5TUmQJLP8LkncIYrWJ+1ZJi6fgdaXJa7LrJJyms+rerWWt7RwPtu7sa4SlDcCAsAV/+tjqAo7FJRbMWQxJLZIv2TLG4WA8aSqo0Kf/zgMT2NgP2oD7bDXUsKgNK2NRHIvN6jSQL4K3xld0DKNMl0rymbHWjq6MknFIXyCL5fd0+0e7iYaYQ/lSwDH3M1/T/of1Xooiwf9Pe9Zp5hdfTI5WU74fw+lqrxY9nj5Y83dJHf8zvPo7yXIIFto+mYaZ3wxOLfZNjs+yK9rL5YdfjeYpFzLTGV9wo92xGNSUhsgS4RlF1VLU1sltHQowxKzq9eola4MPcjWz7Rw+vvl3n7bNL+cyk4QtZCADQFPf2WPCgibZKPyYUrDSsmI3/84DE4TMz/qT+2w09lmkGZeSBpQzQQBQGmTSSQepPOnHAmnY0nBTmAgDtQ7B5CBBwXccaxQ7uMptRycmmLXXSwgnm5Bi9MDxJy+ullvCgZPUiUmztXYY0q2mzUg5QaTRZExyulnyF7TYk1N3BU2kzT2UzNfMbkTv7E27P3BAcG3kW0eogbatXaIURFVFnIaUNRtHkKpNAsgKPxhWSeclz9SaUE7C0Di4cPYqlFE4zKogwIgEAB0zD5u7ISxDhXU0c1egumy5Huh4qCEA7f21r//OQxNc0G9ahntpHkaSCRklKm4CXgHAD7jwPK0ZKYlER57rkAJxO8oAbbSr6GDUlsDwhKTAgV+ZuOS4SEqd4c938m5VIKim5rTM5DVeTUuwmXO2o9RQAWKrJqpIAwqXdtetpK0wFnSqv7pIPtD+VTpaeSXyK+SMSLFqShl3KZE7nOq02tV0Wq/85WUbYsbyZLHuskdp0Jx7L9Su0d0TOKjthh+Xpp1WKNxRUzvHva8f/dfXbmHowQpk3/WR5cdCB1mMy6JQT0wYYXR7MWdGbba87LT7fLfWgrhAGjBkIAFtvrRCCmKj50MoBgwwcgBzo00QADuKbQkhHQEnRkVBXrFQcoCb6//OAxP41e+qgXtsNdc2GCoHP4OACAGeFRIMMIeMRYDRUa7jwLZfpqhlyyUPVY6H5zEoSxjO88Fwrbom75UtyF0maY7FAhxJFG+L9prVV23a8txz+myl4r2HFmYlG+TPzNh/hipEVseNE8a7hluW5cRcslVVSlKLN8fH3BnfTR5/EjzuN0U8bXV3KJBrp3ZjiMF4eMbpbGcfOPX5faiOeJp4rm9o++a11e1L41nFYubRKXe61EruBty1Bm1A0/xmaK/heeQVDbkaNpQBwCACRCf/zkMTrOTOeoF9beAEDcigjlaW7zZWgwBcH3MAlBBzA7AIEwGUBQNL/iJDb8RZAwB4AHMAkAiwgDXFQHU2AyBZMpkVcQcADmAAgIZgGwBYOgGBvDSOWZsK8aGAkAYYE4AxgagMhgDhgNgfGBSBCZocXR5f3OGdS6OYEYBaRSmhgSgXDID5AACYcAgpgzgwmcoxiKACgIBRKICAAlgBMdAGcxSsxnkCTVqSnMWItAyLDSVhF7hcAlFtYyMA4AGvpo7cTBeKEMvEkgwcRWjHpFmMMgl9TVRp3WIsGWq4iNpZ53n7dh1GSmA6BaYiwvpiDASmDwISYfQDJiRjuGDCG48TLYGijYP/z0MT+fZQWjx+f8Ax6tw2y5pKt7Tqz6uzHplrphTglGBwEiYBwGoGBRAIBFuBDADAWMBMCRWFuDhReQvhGIEn2TOrNSxTNIgv9AilzAZKuyeYI87kO+OAPhAGJf0GgIA4AOBjAAANEAARdUKgLGA+AwAQHAgD5fbjOC6khf/k1ajMliVt9pbRufC3+tQPDjuPVLbC/W3lME8gYwBgH09S0pZUQACiQBIFASgwGgBGAOAQCQCkLwAAHmqqYAABdJXj8/PMpaTB0bYy2aFU8t3WmaSl1VcaMxCGpM/8RnH7o5bQTsLlk9AlHQTfFotq+0ZVuefCHlVX1kNZ2m6uq0l4GJRJ+plXopaeCMBtkd7GcSG0Bo8llS2s+ylUpcVgsoZUsMsaihp/pddjNmtGmSwWBINEyYBQAtCEEQyzUpf3GMY0iRYsiRSxBWxX9NigrAVwaTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//NQxNAS+O39idhIAaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.40013605 + //_tone.Arco_Cello_F_1_ + } + ,{ + midi:42 + ,originalPitch:4600 + ,keyRangeLow:45 + ,keyRangeHigh:47 + ,loopStart:35356 + ,loopEnd:40136 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:0.10544316 + //_tone.Arco_Cello_A_1_ + } + ,{ + midi:42 + ,originalPitch:5000 + ,keyRangeLow:48 + ,keyRangeHigh:49 + ,loopStart:28362 + ,loopEnd:33104 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:0.66307867 + //_tone.Arco_Cello_D2_ + } + ,{ + midi:42 + ,originalPitch:5000 + ,keyRangeLow:50 + ,keyRangeHigh:52 + ,loopStart:28362 + ,loopEnd:33104 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:0.66307867 + //_tone.Arco_Cello_D2_ + } + ,{ + midi:42 + ,originalPitch:5400 + ,keyRangeLow:53 + ,keyRangeHigh:55 + ,loopStart:27978 + ,loopEnd:32933 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:0.87443298 + //_tone.Arco_Cello_F_2_ + } + ,{ + midi:42 + ,originalPitch:5800 + ,keyRangeLow:56 + ,keyRangeHigh:59 + ,loopStart:26131 + ,loopEnd:30895 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//OEwAAAAAAAAAAAAFhpbmcAAAAPAAAAMQAALygACwsSEhcXHBwhISYmKyswMDU1Ozs/P0RESUlOTlNTWFhdXWJiZ2dsbHJyd3d8fIGBhoaGioqQkJWVmpqfn6Skqamvr7S0urq/v8TEycnNzdLS19fc3OLi6Ojt7fHx9/f/////AAAAAExhdmM1Ni42MAAAAAAAAAAAAAAAACQAAAAAAAAAAC8obmAJ8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//O0xAAa0ELMH0MAACGpLvwAAAAAQTu6IiBAAQCAfxODgIAgCAIA+8HwfBwEDmD4Pg+f/g+D4OHO/LmuIAfD9YOAgc8uD+UBAMDwfB/+sHwfAgIAgGMHz8oCAIHEA+D4Pg/UCAIOHg+D4Pg4CAIAgcg+D/BA5icH1QAAELByCUEnG43JLqXmMStJU22ENS+0bMkAmCnwFCAgQoQYILOQsKYKAJPRyFbrTZ2zpd4BOxeMMslrgLgVw97IHWdd2G4OypXEHjXy9Tyyh9lWxRJSIvw09pCp6NhDRWveFlNsVjjrfO8+kFpFP01iKurSvxE5ZWtQZNw/aisrwgeCYfm3GfydoZJGb8/Kucs2aaW5xCXzturL7V608fw7Vic5H4s7MNRmVRnK1NfyYwgnGfhq9H/xqzsPS1743ff6m3dwt2cb1Sjn5mzAlB+8auXaS7hP//O0xNdJZDq6P5nAAMQjVi78ck163/6m8PwosLDdaC73usMMZV9WrSVrkpvTOqCm3jS38qa9jO003Zu7r09/6r/Y0+8//XK+5+vh9qlu9gmWyqvKvw5zCxnY7aUkAfce75XC+aWqkQfonItFiTkFQJnCvqOUtgQfZvGoBIGU/IfSIh9ZC7ykVMzMQUk63eVjUJKznij+NXSVc2SJFHQUT88EJTCKULUMBdkUhck6oSjXpPHGSZDHkrp80KCBFfOXc2uA4yQMYa5oMtd28SsBax8tUBo1Bzqlf91bZoUkGkFuiK1GS4bn0sfTU3ZcLva+8lt7g3mtCcZ4tvTMOkGV/3b6r/EfdJZ1ztrrmL5P40mI+5NfV7R6TQ8U8e9LwrfdL416b3ncruHHupWWSIfi5szP2LdYMKDeSsJ9iHAxCxWfx6bfe2rwaVkVBIAcAFpv//OUxPQ7VDq0V9l4AHfJo6PRAO1E3zUZBgWcXMITg8AmFhh/7hkEdpawwGPSjUkEciT3CLsoGtwElUrOqpGJY/jcgAkRLYymx7uzU3S1kTmmL5gRxqB/3Xf1wofayt+Xxbdpvc5VQwK+jaXt9wZfznbVA89TPK01SWTncd1KmdcZ7/axJU3qqj6UkOQ3bu2IwnINrNpNlQYIflIkn5tr/KuBI21RMG5VtFoRv0cPayoMo2duJIrhE2VcrCVqwnkpRyAag+cXbqBC5T46O+J9rqdVeuxhMoPoCwdDownUOjklXMaye+1y9lq62qMrsPxU//OUxOk7pCqxtspZ0aXPPiyttQBywiXIgI3Je8sRJgHByE0Dl6FjRIWHSRg8hQrQZwoLzdQz2B4CGI5eCwgQbew7NmNQPDY1qs4JM2KPF9iXBn0/dxgkoafx7cWECZEQesrzBURYmbGeU17fBhRPqI3CopvNSYreN9uOSFi1C7ERje9LnGuk6uK120dopHLrmyD+pk7zMh9L+YoEX7eqZR1lXXmAgGTuBSoulJjqSWdqVlRIh1j0WHXuk1mvgsquD1bZtn8l9O5sy3Ok7bt/U7TofdK4QG02qzziE9FNeLpAxNKbtY90OJhQ59nT41Vw//OUxN021C62/svXTXGxpNrQclu7KB1o5o4bbACpjSQTOHhYmQmBE5yqCF0wSoLHK4Di7TmEAFQHXv/ZuVxGU2n/vwV/I8NzoXkKAYezuUI9JE8eU8pXDZv5yiLQj5qmZ6ihLLGO4mxRapmJ+fbYW76g5abVxRSTXHzmlSNPtBUnurKSIse5EUQFRMG1faI1VewUjn2iQqbI2D42uApH85OeEkfBOPs3EkfDt8GJpN7iTb/iI+SDtlWitN1m5/8xHQuzaeOPe9lt7e1jGuN1Ft0nWuWg2JNv3Ne9jHkk8kpahPcfXcNsX8JFUJGk0+8B//OUxOQ3ZBq6/stXhXJt+iKyIWh8vmAJg8+ZIgqvFXXFvZwySYpfiBw5SJWxCFUTaoOHQqwa72gdYAlikjW5LXRM0MtfTXkbgETfOdrvoY8cNB7n9uAoXA9/Ou+i/OdCvP1UBEIMiYiWFNtMTQ9xpG9eoealrk4c73k49WomhyDylMamr8Yp/j+adYnpDTscJM0ZcYyZgpMwH86mswJ4R03lReIC3WeJCgvxFvCCEZauoLD/db0ma3qkEJS6aCNQTHG79NBpWp2rCowTIITr2ztSGl2JeJERtvhFyO5vUNIfOQpvN67FXslfmXa9KmBw//OUxOk5jDq+/tNTdKGCdm0pu3k5hYFBRXIMKuAISHoVfSodZB7x+5mEgMC0AiyHhiVMxw0HgsGZ0tbuVMIqDwDmL0FL4ONYiIp6GDFFQZBKZJdxBAwlPbs1qAwBKC1uum08PP7TrpY/X3yaRTe54Sh3mgb6B6BU8LktrCi8oR+D++T6rFPNHr8RxslFEcTKqoWqXGZJZzQsPV0GvlC1tiT+5JL/10bEHJa0R3OoS+VcxHvuSZ+98hut/xmv+oer+kUr9WLdTC8molUSEGIxkhRKJMonKWyoev2rF+0wtk0NgZKSg2RyAYnbxtKgJNwD//OUxOU1bDq3FsqTkOOiZledwiCtJhQD1CBicZAbBCFwwXDvgS1hIQYYwiMtYQlTOqIHw7RhRIzf69AzMcO1cNZwADltidq5A4UHPp2a/qdesN4wQ1L//BVCRbw1H3if7wUv9gIl/qiB/gmT+gPtOrJQgnPaoGi8tpY9McjYe/4/kR3V6aVR5WtzqDtb1CImu/JFf5vXUF3SyMwXYu5kYdkxZwCHu/yG5fVlt9IzOdTUdV1evnXmJ4fbRoZS6MnzJ6IybbkRhaat6RhLeuqRxrzIGKpNpTLzpZKBgXSDRWiDbkvDrooALy8iRohQ9OJQ//OUxPI27DK7HtLTkS3KToYBKkmkL/pH5NuHKNoMQBcgsGYQsJeWgz8orjhpXlvn7CxqD9fg/Q8Ei9FfpgAHRbllfNMsmLTM3uVphuVnTYt0YLRatX1H2mtRwA248EvQHot4UCc92Kh4w2gtd6AQJo8qG04nFrZgpN4hAsddBJLtQ9jHuBjuY4rA4vY0kGfG7rzd/+QNbDh9FLN4il4dMlj/RSVwtM/69xP/d91VcuTNeNJ5BfV2Je4romm2QeAyS/UguTShMkJZxzFyaqcoorSckaTVUIOyVmaIk5Zb2exprdbIoTjxkibI0wyORDND//OUxPk3bDa/HtHTkEwDQGjTACoLAC1/Xfd+HSRUYJGzyJtEkhnz48xfq9aUUMYLfi3TQyBVpEha86ESJQJFqVWeSC81DSYXLMbVZbk3hSbYRA+P55NYyoaFAAk9FCWOHaDY3gwk/E1uLrtULc7Es7ZSW5e5CadwmCASQww4HY3U7ZzPatf2NimvkAFd/Vvz3RDGtgNCXJXQBTXW8gJrY8HTHlshPP/xb37ZFv+///ul93n7+8vGpbMc1lhUFmFfOJiM8TSeltNCpuHpIy/M6GFaMIGg4autSS9+pW1OpKzcFP0E0Ri5NCKxA988xFQq//OExP437DLDHtKTiW80FkLUdLas8NFYWvnuZ1Bj1r9zeFsrBt/+ZIi9tump7ISS4NikuXSIJ9sMr67rG7+USSbp97uOFIGeNQWDaxBSn1FnjUaqeopMynUvrE9PquYjw8TQhpIrREYNVY1EvakpbLokZWxJNuLpcN0lxUNFtTOWoXvrVieo5Cx+VT4WYjnLr+H1A+qrRffmB+6+///h7a9Ug3/TqUNtkeNLQiDhea0eCRnehiZ3L4y692Ap8G5l//OUxNE0vDK69stTkZsjMHCDsarBjbm6aky2k3QGVSBFBKpyZCy4jBi14iEI1s4DJwtAEAJYB2h1eZGE4Mqbu3oADjzO934+GBLH49FAauIFjt56jOhFC41KLdgtQ9l2nlrKWSaw71bFFrHeLNGQ5wVzflI7v0gQg0vaIwI5x3I2sh249HShBEeuaD7X4jAnN6gP4+T6Q3HP3Wz9U5zGIBnZqCCIO7lIpvvVuv7We66zMp4kK72aopNw8Ron8ZER+PVyJuedQkhD52PvWETEI4WbdS0QdBBAsu4DjzBkVFh9lddCSoHQdsc7MW2sQuln//OUxOE5LDK2/tLTkUkseDJggICSVmaSqdvH7HiBTtyAyDkw3TqCSTpiFkJSO8kWAWtMjNbihQY0CAASWHTqdpt4yldYnVbqV4wLnEREvymn4NJeUuzEIDDCRK+rNcfAZVh+f1cYQREPLboALxqtkCCugZ7n5Kj5d7+5SEz/lAfa+Bsr97KT0jj3SkmILikpLYrUD7XuRHl/fnf5ROd6plPwCURofKIHGvbSaFXtKq+UR5fPeNCz/BKVZL4JXbrcZ8vRIVreTV1XGUrsl9HvijZvw9E5M7TW5PkoB0TPVJIlVmVGmjXyceSlbWknk1yb//OUxN85JDq3HsvXZFhPbaRs+mBxkO7Nmcd3GvLhCQrrpGOVGzEGeBoPR4UVm6MHEShg4vhEyo3GjYFPlYZlrqGnePlucipCXQKu61BYolf+pvT7hlZ+3dpYgpIe33Ju7ARhiEDX7NlMos2p50I8zthqRkgiXRXxSiNOGiJdQ9eWG6ym/Mhb7zozpuugmW+ajdKmtInCXdc6VklIukSOfWSjLsUC/dTCsFTrKPc4u73CIlT3qEWriSAW/eQNfyy7rEJtzGUuc06QZp8ZTF74H7ZT0yxBN7BuX20IyB21yYFDFFGWqykDZVZsJ1rGpxrz//OUxN04PDq29tRXdEPOZCdxYIGq2BO3byJxFwcClz+hlcMooLtgp1MA0qcIEGG0DIuYgKUUwuTUNoxgUaRDJu6oiHJTG9hVeI3KVFZ+oVTkbOW7GIqMa1RYfXWfYy/6Ra3e/WXTJ949iC7ZNn2otN1f/4+vez/lf+wRP4x0X8KkN+qou9sj2z9gFy3iVQTl/zG57eRGxOaNruiALuZkB+dY+6PXflB5/by+YlAkD9weshoW1Mneyk1r7p3UOQZy5MmrM2bL9A1unZvD1XJks1zA2NwTj6p4mAcIMmok5snmmjTQhjjltA/zJxGKtE3Q//OUxN83xDq69tYW9ICD07NFaoJ278oetbCClSuY4CGUxpUrl0Sq+M2lNziFBoMHtUAG4OTAxWYQWqcx5oW9NCvW6QKm3h1v5KNMr3f8VFwLLorOwEYgGiXXtcHR4sLpdw3FF1L8xx3WQik+efs+d57rDg8Y5/y4hx8JF6lj3KLalu2P5eVx4I6x8HlXOAphTTWigWosgkSJstM2Sbr06n/69UhH25YJD635xxtJmVVnMXk/aW1OMo6wykpbv97MzoY+pHRxb22gp+TM/n7LzWrs28UDzZxRfXDo2aRU8K6l664gFliOa3jOqxMKaufJ//OUxOM6BDLDHtNZjd/0xzCScKGiltsQUt15EHfxoO5gxJAowGVOGAA0qNxOPOOAIjo8PlhlQikGYNykhIZMicdOYeOoYgaPM5zPKIhjCE5fMlVHF+Z4UIknuXrNokCs25jX6QAYjz8WjrO3nyyyPd2EsQfiBE/xXtgwZsomG9NsLg9KEAUtMMCFUUYCBe7h4TO6QK2hsnR7GPogfIkfAUih2RDj2iUPneQgoLVi8Q7nOwUJrz46touvlF3YjRn38o70Y67Mo4348xU6VoRrr04n0rrbOXf199yleospP58UynCgo4AlaoNubdFpkCz6//OUxN4z3DLC/tKZmZVAiU1as3BYt/UHQ4dSN+PGhiGTVQBNWOXHS7VUMgdGkkm7jXGCSLV7WM0YErCucrih9m0fnrElB1VUM/ZuKGhgBzLty44C393M26oDJzVna+XndHIQKTaCMCvqDZbCcLzTqCCGnROcPho7Sgt+TDdNAWiTkQtvqFy7cd85qKgzV3UQJblCc/l4ztaWnyxP6yHCinMFY3zs5CmlbWn52y6c7O+k77HdntFuuZElY77aXzffo2WWomXVh/A8lJLtaTR3a0blTlr2uoyDZWs1cJLEzr3lybcHSE5UB24MEDAqojfA//OUxPE23DK/HtKZkUtc4RBFCw4xlMwJQAAYHNywXvC5ah+ZK0ae7fWewsw+hquevalwgSln/k1kWEY5G4S8RmvQ4637oBgOR5Vqr/pny/O3ZAostqXPiKPFXwFbfzYD1fmxPv4BKP/wSbrg+Pny8OfcMn9EMiyqVKQZtruSHirktMqnonv/NT8XDyin9Hfq1SUcdSQ3A2u+mDeNDX5sFJMevdjWu5ySty5upFTcNlmaqv6UX+bMTJ77aTSYfbSLB/PwmCEBtlnTYbg9j/zBu86o5FfN0WZmypPLy8/tUXFwopJldmJy7cjArCqwWYBM//OUxPg5tDq69tZWnMnQeBQErupkjQVwPMTBTIwAOJBaQu5Gcy4NL4cDDCiiz/JYYW3vNOz8hMSBKwE/upDRlyLTn9l7pmKWOrG8s5IQEH8s69hLCrSyDSif16QdCSZ5RaFCilEblkM/Kr6xxedJPyHNrMBJD1bEWQ1KS7kYa9ElDTUmRDxqEgy6yGIUpZJdkHWSqGq6eoxGgjdyqbqQQiwrss0GypJaZOJU1S33Mic6kKmSRLjXUcrQdieUhqy4k5qROLHb18YjLE0+Uyvi4mj0f7gz1zPvGWySmrXiU1GCVWBQoes4Q1rbePhW4I+2//OUxPQ5VDK/HtRffSfATESvqTjs2MDjbBTwMAcXUNgglnCyQAGiYE04gBmPc49xvBdSBt0nxqNFHCcbwwyesgEZ/TVywiWpnv8UU4TvfygoGotTD+h5zNqg4p5oiQUKQ9uJWSbbDhflAhessomzLF8AOzBnJgUgXVLM2KiSTGxsJOki6BKEJZB02QojqExRpy2e1MVGZy+M+VVtMCNP1pkYRq0XYfB+6Lj01JMpki6loEpXrPJ1JKKqn0+mYERboK6jVF3QMDfZlk9JakYo3B/vLAY24Es0LNtW3TcKeeFnNoVGGsPbhAVwkqLPWoSX//OUxPE6ZDq6/tRffF+4sliTA8ZIASxmChpwQKIv6ISR1y5z0AGUjx6QGLBEVQKFkdupOmGXQvDdESr3+x7SwEBhior267SAEteTKfqEh5oO9YgAtb59yoSeMagDcS2a7bC4pSFA6HC0/9gC8jf9SMVv7qt9rWWo8M/dngaV8eGTvP+Gxx96wx+DyzvtitdbvSuJqanNxK4vm7szOktAn9SAZXu5zFH92xAVTOVLcMf2UmV5j40hXLbkg9cvS0SLe68MX9sEUzjC5/O6Z6d9q29TX//tXx9z2AUD616hOFS7WIXoumWWYv6rVHMvkU71//OUxOo69DrC/tPZVC65UJKBU0aKAnN92x5wPclZIhCwUyxRSuoITJ1xwKxowLmgkLtxoKzJuzgiIYZYm/Gd3hVJtvY/6E0oqxnnUJCQsYdeWYPqZ0o7FenmU/iYVG5ZawaGn1owzpUozDyfjP5MLrcq8wFq3Hw91jz8rHouyyXfqhJ3sD479vXutKvlK/ystO9yBZZ0waJxdsHgdvc48Hn3KANXbM3V3QYHy3qnW16vmu6Uz/fRc6j8vnnorW/VJ10yCslW55iCSPrnUI4/W3JBqdPxaZ1jl1y9Z6Z/H+h4XDWAkaJydIlKUt3E+n7V//OUxOE05CLDHtNXbQfWAEgBIPYcKhR4cnNoQ8JwUUNEQ+a04sOCTxgdqIGKF34PvTfhEBPXCZ6u4ARjRd+4m8UKxtjL/uAbhygdab5bJlp/G9mlrL+VaQhHLnP/ak0sSOaBVTAlPw8M8ZpxcX3jpblRxuJY18QnkAHvCn2UqW6kfoFlkoabPkAIJY4njATmMxDI89BNq6BMInWpI5rKURGZiSutrqj33IKjvhKLpbHzan6kV2slNFaaVg+l0sWCjSOpiAGpsM7cq1o6EIQQzIGu+WuGqmCQobJNWnHtuQALsurUpjy4CujAEutaVtJv//OUxPA1TDK/HsqTlQHqQhUYALBRAmd6yxFlRUUglFBNBKZeIGCQVnuM0HN5H+rrhExjlNFpINJlfaldpP0iNTcTnsioEaFUqW3hGkEgwz+C2KPSPgUFXFke8fFNj8Q1qdYxU6ajo2trHCb6zgx06dIZb6yz0T3mD9R7lZ5pXO0LgG6d0iYT5ztMVE2rAope3PORTMnvdTi6v2m2Wv2pqG9ndl8nfZLHzv26dltZSa5x/83uPr/zK0DBo47YumaqrheN2+avlu7mSz/tvrpn4YtwYKOCVEaCtlnCeK55PclwCiEYIMBx+hGCwK2ncPA4//OExP03fCq+/tNZjdoPuQZkIJXDGLCQgDQY0EOIBgSn5CzCxmb2/1NmeCT3NWZKkrqPX8wIJfPHX0gGMSCn5SvE2+WVmcLt0tSguxhKA8nOh+REEdIab84Wmzg5R9WgPc5MR1GiK0nGKXzZZYLBLouiwNYdiDICRDNrVXQomKRxWqFT7/VlKbw1qDVKYWo+9Z2nZ/aMnqzXrDb6WgV1qWnufse+K4VUS9u2RNb3mW9/82+P8bx/i/395j63iyee//OkxNI8vDq3HtQfjGn74dxyuTA/fshl4fwIq4kn3IxYbIEaF9skXTvOY1sx8HBhoerfBFNbecwBA7csogZMoDsA8uVhhkZUGfHmxZAAGAQEpEKsmEgggBgDDSEYTV899lyVQOfwfZttwMqUGhFPuOMxCoSA1ow/MGFOu/Yk1uCAEbT4lUopFZxJnH34IS08/r2EzQtrhtJZBc4/lFpQcn+DTj/89Vv/4n3/Vckvn/ydLnfX728t3I+BQ7/ci7SaxL0/HprBnq+/tC5z+H97Ckt7phIWrsQgNm7Og/ExZlKgMGjJgpAeMi5H0h/hFObbbln8ooQ3lr/9T2xJox+9qr7Ra0mILlQJQSNXoZgR1ocgN5xCCo+aFT5UPlT4ciks//OUxPI9FDK6/tPXcZKDqnCQgYNUUBOyTc3AWFO5k9IozEKMcRCgm835GfI148VTGjojqsHQFhCxKAuUbwmrVZwsCpcItQfjWgkZLok5f2DDKC6OmpuFVaGD7eKkwGqQ2zECQsjBpE6WepiJFsjcYYDHddQxh11mQVQhdATp9Zom1zoJRqM3GUiyKA4D6ntcQd3yUH/uASHW+2jV1wic/c++qznPBmZTUqEFKLdRGqYwei2p8Pa1Mp5O65Vn/H+qrUtzrVHk9UW9fd2HyblsEA75HYDkyPShDEGGkFiMaCpNY6GezY4m9uOIE22KkHGh//OUxOA3JC67HtNXUaY0F8t3NcAf8uJuOGKSGbABjkvlARIbBig0kEAhggJDZgHos/C5FL1wE/zRkJ7+UQylcDHuFOIhMD4aqzwKREsYusA7CW6gUwhLxoEtQdnCSkNaMngsikZrUH8L8vYWRS4+DBG2odiC61Jm3UMVuTSmtcmIO+IcZS6zMcxsmmkOwxdS1kQ2bUIfn6kYbyMG8c/yA8lzVDQ7HaXFS0YSEApZlAuJ26ypmJ1KjBqDVcpLcSUT2W2SEz/5ulPcEC00rOpIVJoEA9SKiMTmZRSQDzCG1ydCZj3sprnaakfkzuuQ9wHV//OUxOY5TDK69tNTOXGQgsFJQE5ruDlbWJVlLTWjToBTImyy1MxAPMj50WNFrXCMo2GrQjmFipFBAR9sC5XcCWMrvd/g5qFb/bMVJ2bdJmFDtvnrIYAuWDKaZlKcYlKKorAKXfWKyFn6A5f6gx/zZ9eoVz8AkENf5QXX49jcvNKjXf48AjXV2KzzPUXvbI9q3+bE6HygvCEoAIrro3bDWWKCgO2fYQjzvbnlz3oDTG23GX0kIx19tKCajUJnlnbkBAT1EnLbuHeTT8aZN7YmTlV6yQYH3SoGA/WjtLE0j8qNPy88TJOqOcdY1uS61ZBj//OUxOM4FDK6/tYWtbHW3RGJy3jVJqwVCVZ8WclEMmHs9Z6OXDUJzIPCoBMCBgAwLh0EHFZGVkEAEvWVUrx1SYyNO5NluOCA7Sb3uIEUP4Kp9jRJp1qpeUOaf2ra6jzB//yhQgndYbpYvViMB9+4aPwoSfjIE20ADCw/R+FU/qITwqN4UHx3RzX8aeh3YCLY4qH12OFc6kgFE1ml+QCufeQDxKHCJPdFHyeLPYiLPuVWuRXqL2Wxg4ezMjD4UuwK4xQR0dxmXTqallCVvY9djF0ERALVYHGj6Uiasdt5pgktW1K5gzZgFWBKMla/ohPH//OUxOUyVDK6/tKTmVwJ6URngZhQTWTMvyJKFhgNCNQMGPBYJ5703TlQoUBuf/gEpO73UlA8mrQ3PVwYDbyl1yPqI0/48gp56svopoQhZ/svrW0g8u4UqOlj9b0uHDq4hC1LSEasksGEHxfWp8mi3uyiXNHqGoOY2opEBeskG6R/ympKkouMzlYI6F/PIOmMlJlxwlFA4nAJe1t9kdu2AaqT/0Uz/amf6ZzZ7PTUmcsq+k7WP701Lfd5aeZ/sJuz3XkTTMCs5OGKra8kcX1W1iu0dHTbDsbq2VEbaUiagJCCxs0aen25wAmmYuXF4zAD//OUxP46/Dq2/tNZrDM5MTFBZCXgX3EpYOgyYJWk9YWSwwbEIC6sMjgmZEASbuNGDSwaR6OzlAIgI4f5ZrTRfyKPhLJ8FAYsWVKlFHTEgSBMKnWBjQPak1m0CAim3Q9aqvLMHG0I0RzguNPuT6fHSVOYiGMmtAkj5otAfw/IqKPLICQh5lJCIp8fI4XqWcJA1Vk4vj5LlSzIWWSBfWkM+AORUIoalAgQ4zYxOIjfKqZpaE4tkyekf92MSzxfLC4wZemB6PWuKQlvzaBVNZqteyLdrOXpVJa9IoIchnDJba3nQuPPvCcgc6l3Y4KMz51H//OUxPU/5Dq2/tyZkHdrZ2crV6LpieQKYHKSxt8DTs24Zsjj62XiADIyIoOklonqJJYBRDisZAKcQ2CCYl/AJ9bb+NhMqRz/9J1jW+F3sZUBCxMCsVoJZ8Ol3aa/dgEUihMCHbWU4EI1W17FpHUGBlp1Bnwtinw5UklIJDKA9ag4zI97mJHNzIkOon26InN86Ok91GzNelWpPevMyNT+Q09yV0inL3lrBvr+CgM4wwlCcG9U2uPr+VGf5oZ/tmFU5pqx76WKO5ZCjvu24qYpHpbC3BpisCf4tFdbxbUu97vZ9XG/Gi33WU+HCJTO0raJ//OkxNg7zDq2/tQfbIYV0XiPHh3Zb1zeS8fG9PveabEuNRJq1cKOMq4BXnJ+LRZppdylMyHDLKqLxS5DEFqBLyNDk+aYCHiZkIzJat1iEEbYlB+8KIZTmJAS+xNvAQkm0z3g8ZhwlPZneIuj0XmvKD5j/O1IEprfVBTiJk38CTOUF8qh7C32teQPwj9f4M2b/Tes/+6/ea8A+Q+L53dfi31VuTsW/zgcr2CJ/dFl9ypdfNX/Y79uoH0QLluTCnXKBr/JB19SQJzZlZes5Y3AvTtsElvN4gunMImixWJY5K04tuwgTkJQkeqkDUbhppVhLB0fXXKAwHSu55wkD1C71YOHVaWJ5u9J2Sz9KKBikJFUUhSSW84S8tWXboJ8zgkI//OUxPs5vDK2XtPXUcZELcl6RhsbZyaBIimWAMEFWQ3IzAgSLGFBmBGAKfU39EIYZQRou3GwmLIs1/8k7wUhcmjpppeoc1uY2qFI6Fcz9sTf9z7XWPB2svmE+b2eddPSHv/5toVr+CANo5KBi9/IFwHy/5iDNc2H1e5UDBX9QTj7HAfC1nyTyFqXyPVdTV/oD4XewgA1NZ+nsjUJym95W7ZFIE5Gzx8fXsQKB0kozzg3jcbXyS1F7mX1W6O67/5TJ3S7z9KpIFBJNU3jxChYZnU6nM5+2QHy5UU0aajO0tTHDfN+JY8BuUMrzGlxBnCg//OUxPc9NDq3HtLftKS51CddtxIMtZRjKoY04agkbEsYwPSioATBn5LBEEoRtQOOoDwggDI3WSVSSxllvAyN3CAqwex/1AVUzy/EZGt46tAHBC7ReGpl2CWNnYwPQpFVmFLPuCH4ll/Ll2xIDe6uElW1RuwU3hfncMBRoVCMlMZBLZ0wuDmZeqattmrjVIRzxM+zYm8Vp1Xutu3s3pi9fjECIlK1iRBoQPWXBiVp8tca29X9dX+Iu/9239eWJjGbRXLdYfPO+aOJ6KF0+gLohLLJO9yg30uJmpwiz0y2bgXizvYFZI0pOlCBopBUZH7v//OUxOU3JDK69tKfOfRWNOXlQhRCFQpkATz1BUaCvxyRIsQQRPiKP1qo5FAZlJlhRWOou3dmIKFDKdtcgoDF579eSiVPSqbq8GiLEZPqiKx1eQE6TqEgg1Yup7mAmjcfSH5r5ULe9IfPnvFx0cxH5uFCNfIRrizGvvPsZHnPdkWdj5J2k+BCX50R2PZTSBN5ZVGy02uWFt7ik3IS6auY83NHpu2rR3KRy/+49UhNfgiU18poLNmxUm2oUA1HLlBzvmrWd1z80ifdbYP11XCSxdXpCU7/uJIHDX9XoBREKFAdhLTRIkagQQbiWYMgYYC9//OExOsxzDK/FtNXUceUxRkiGsmASxccfbOqWq75VeX9z/umRNCP3TCBUaUs7w2FwIHv4XWqLppK816M3edQAc/3iKQ7/cFL/zEu/0mfyQ1flRZ/vv8qLP5G1/4VJP5gDxZ+qtH5T9sglvc2SSeu3Y+sYqdSGt7eEiHieRAcNqzjG5oPy1OgeRAUy5Sfv47/fcfpsuvvv03vnUfcMoPvGwRgABAIKUB2FrO5BEIzlWbuZVZ8rJRb2HRiYHCRklNY//OUxNYz7DK+/tZWmQFy+8nCRweEVIJMqtAYEGAUro0IA4PQHYHmXAGCDwUMvi/AAMBAMwoAQpzVppTrsiMC8Dg9NZyjINM1csqehL01IxZmUgCJXLrtuoPPvmrFWRoL5d/qclrO7+KxCKOaBAE+VBnVCzag9GOUArZmHQ29SgCS59Cg2Zq6ElR+/28xcf5xNn2yu2TPxCp8/qWPr9rmtj5hx97xlMOGt0bmuHXLPDOiZhhvUC8jYuvqx5ncjXP72fazr5ga/9M/P/3/us0elafdvCgsOKxX68O9pkmfl1LgsPouo6smpJDjPIDC6i1h//OUxOk8RDqzHtHfiEuNNrO8zFtAUDCApbqJXWci8ugo/hA5FoKK7W8ILECQ9gU7RIWPs/iAqmFrgIRMqhYwLNAve/HOmZsEV4Gx1LxoKTC7GE2xkalsvsSGyIUAPRy6I6mwoNc+xn1ookCt4X7hCOaBlf/QqFKa2WOMC2+oNoodQ3o6iSIHUXmZ4+hyG1Byi3yRtNRHhOmdZqLho6mUPdkVLJEGpN5QbHLtQuHpp+GgPS9ecxG8ug2seh7dTMQj3B+R362nYatijiZNizx5JkNu/vh3+1D+lf+VHzxm2e8RfPWSw0N0INxsJpial6Qf//OUxNs7rDqq9tNXjMhCcfTVWOHh2tJphRNOlbDc4kpdYFCQiiQENtu4d9aCHCtPoZdwZgELKkKX9EaQ2qE88AygsHJp0wocmwiAomhAMOmXqRTOzOCFKCt0XsXYIHCD9b3qlCFnef16iJdf7usKBItjrUyRBOV+6KoBcNzL7heRf0zGYqnuvK3+6WRLd7UoZF+Zkj1k3ZNMhgB6VGUgRQiTm6jQtH1IF0nBDDzzAfCzVBCVEk1mgz47bvtXazeoe/nNaop04HEc7LY7R63YgH1ffoa5XqF93nm6g/Np+Udd3avTP+V63+1FtZ2zfUyv//OkxM89VDqu/tQZqMffezlZ99ox+6EvgM08aI4Ki69NZKaJlxiOW4M5eiotu+kfXxLG1XBwgOnIQnrtuHSW4T1qJlVqEBTDDJLYL7nRBB6ciKoBoJEMNEVHpLxL0QLDRK2rdqzg6dX9z/mSY02a//jgZYsoy1QsvFjVXDMAWObWssx2/PlHGs4jc7D5if4CXqnX64JbX/a9Jv+RCM7/XaGbxmhZCNYtI8IxF8KrSYj7PoJueO9dEIy33mPPvWMIbrefCSt838aNj3Ow4a61K5wNUrlUwdRliDyVk201OONodZqEY1LIOThLEm4X8za2pIpZ/8hdJsbL1UrqKY0Kn1qoAg16Wp6DOTfveiJGZL2i+MSiftGuMIGRxroDSW9Z//OUxOw4vCK2/tPTWfMwVuGjGNgSMA41B6AiByagsbh2BgQcIf8zDMWTgE2KC1+FBcm1NnvSuwYZONK4RaxegDKbP45lQQiRGbO6UAByYPZtMTxXWusaROruRQWCNmDEO50KAVDxoKXWbr5wedLFma9Cf5kHnqHj4mgyl6xhixrOXOxfPbHBktRQMDe9YwZryspo7Egt+SWtMY1bctZGiN8bTk+/Js/6Wx3jvOs5fzfP3Fx9ZxnP9ntc7xCcPu+0DnGFY2kPboL2rXtgozQ48jbBhadS5k2x1fw9K+9nBwhsYPVgkJJURJQ+XbluodZx//OUxOw3nDKy9tNfWXKEyJUayjodQamYaTgBcaHFgIDbsFogsCelYq0iBWAE0A0EEysCJCIVO2sbZM6k+GtEogoGzLD5DUM+KDA0DU0GROKq8Bx2xgB3dx8KHzwx8PH8WH6B03iwe25c5qhPGrvcP34Ih+nC5buOdR6euRC3OqJR3KgVGMRBJFNFj+hzURzaeOpn+aZtlqEKtq7Qeocz00dL9ek9+ZTJvM26ca9/NjQ9xh0yKL8DKtaGd1zcZKqw3EnXYhfHO0dqmMr12Axya85ZKpJzo4EjbD7duc4UWUEQRgCwgC+HpLgpWYkegEMJ//OExPA0rDK7FtKZWQjuKQjcvhVFmYClBCQKiiweMQUNggCHv95LwhobugYF0BqCdSAiQgCO8dBwfAAFxPhOFxQtIWmEEQQOCtiR1l4WOpSyVGggpBhSRo2WCffc2NGzpBk7IDcTfUXG0xnUmoIlVPQFCDqKiClCmGjK1sjYyK62WgQ49UmkVEFJpi1mCkXMSLI8xNGUpMvGizizE86nSJ4tINLBKm6VQ6S4zskV2Wy1I9M33r10CURWcWUSITQv//OkxNA8zCK7F1qYARqTI71sfNRXiQNFHSyLgLiK5ESuX3PlhNjRJbucZAyNkL8IVQCgCQFgM14aTUclKz2NQYYAMYJmwAAPGgINfZKMvVFDBZMmSiMGw6MCAjMUk6MHw8MYAsMTh9MFgAMHwgGQDSAGsh8RpABLnEIEyBcAC0pjAMTXpSpMMijM1CiSNxhRjMjFJxJIY8gYtAELyBAYIubtWC0CxmvUKPKuVL14VqFrKKz6GgBLNMEbLpTMgQFPs16u4MAReOrtbIbAG8Qkei7FUXXZWknVP/Ko1MhUIlE7t1yVgmBF1pa09zA4Y4b/EIAoCO7OwC12kymlbvp7FLKnhdFpq8mBDpouy0lRKMMBQT1EjXTDji56Z9t8rZXa//PExO9Zc+KS/53QDFmXZh2tbxx5/81rKrVWisMgJRPBwhAxhqH5MTJRREHTpbVOF5H+pqarGb1a1KfrP9MxmMzUu5lr//W98yy7jj75MzbnDahi9YNQumGvxNoCaMobhi/cBsHkSpHjf6rS4f19dSp/ojDsZrU1r/xlNmrFiIuAmdg9TEFNRTMuOTlMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxPQAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.40236878 + //_tone.Arco_Cello_A_2_ + } + ,{ + midi:42 + ,originalPitch:6200 + ,keyRangeLow:60 + ,keyRangeHigh:64 + ,loopStart:25246 + ,loopEnd:30266 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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edhoaz0HhoBqOF+2Ava0lYrsMpg5gUtdJiUSDASBQoCQIzMAiQwCEkWxCDAqBhoBJyuTBTNG3HAQjQhMcR+V8OqIwWJABu6I8Zht/pW+0idGGqd/ZlyZNDMOwVDNI/wgAqGL8CgDRtYrPV2ul9k5n/EYCRuak85ad33pCAHATBHvfVfhfwSCGCar6usjQh+8y51ptu/2MSo4k/03DVt2aaZf2Zf2IPq/MklMw/0FQE/TIXZoE9WAwcyFpMCyq0/qRyt0XUOYE901TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxOQAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.22719418 + //_tone.ArcoCello_D3_63_ + } + ,{ + midi:42 + ,originalPitch:6600 + ,keyRangeLow:65 + ,keyRangeHigh:68 + ,loopStart:32509 + ,loopEnd:37540 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:0.14101087 + //_tone.ArcoCelloF_3_51_ + } + ,{ + midi:42 + ,originalPitch:7000 + ,keyRangeLow:69 + ,keyRangeHigh:90 + ,loopStart:34306 + ,loopEnd:39016 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:27778 + ,ahdsr:false + ,file:'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' + ,anchor:1.22942615 + //_tone.Arco_Cello_A_3_ + } + ,{ + midi:42 + ,originalPitch:10800 + ,keyRangeLow:91 + ,keyRangeHigh:108 + ,loopStart:6198 + ,loopEnd:7590 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:31250 + ,ahdsr:false + ,file:'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' + ,anchor:0.19065601 + //_tone.Arco_Viola_C7_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0460_GeneralUserGS_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0460_GeneralUserGS_sf2_file.js new file mode 100644 index 00000000..6c70cabb --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0460_GeneralUserGS_sf2_file.js @@ -0,0 +1,140 @@ +console.log('load _tone_0460_GeneralUserGS_sf2_file'); +var _tone_0460_GeneralUserGS_sf2_file={ + zones:[ + { + midi:46 + ,originalPitch:5200 + ,keyRangeLow:0 + ,keyRangeHigh:33 + ,loopStart:16217 + ,loopEnd:18317 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:21605 + ,ahdsr:true + ,file:'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GagcBgRwCsYAEAGmAGgE5gPYB2YFAAHF6iYNGAU+bzHSj8PuEYfgAXAS70HAoFghDpFtfC4FMPg6QXHscB7v1nlr/5yWWLOWFHex7LbtW5Wsazyt0Vir8op69Lq3hKrO8Y5jA8bzpIrSfYpaurvP3PdrVs7/JvPWPbMon6avyV6uTVLT3Zfe//OgxN1PJA44H1/gAfnaurU/I6ezakGGXbdmzjWt1bv4YS2cpcLcrz1+u0m89SO9/zV6pyrn92/8zYxr1712rU13K3Yxzz5rHDdrLtnDOjptb5rGrnjvPPXOY81nVw59r8NWr++467Y/e+3ANTBGAENVgQEwQSBDLFGkMA8CIRgGmH0S4YygY5hikIGBoLUFQOjAhA8NmAJAxRAgzFxF5MeAawCgKmAKC4bGPZnoOGABCdULptlYm6HQYjJRh0AiANGCRas4wyITJB+Myq0ycmjAoeKA2j6PBabQliQHMgo4wQgTE48M6mBLYMAQICagMOp108v6ZeHZmMEmZQUZkAhmEhppBYLgwBrQIASnA+bBBoAPMnQmYYrE5jwgGMyWYCI4oShEKTGw7CgDV45aqqvUbpdFmCRSpP/z4MTMepQWaAGe4ACxz5M/aozE4qJi6Y+B5EejHgeMRAQxaHzFAuKgoYaIwInM2MdACNzjt0WlFWXrPlrL4HqxeTUcsaBIgCMQsIDDoqMGCUHCoxaEgUUTFYLEh+YkBRiMQg0LmBhE3zKajXkQWUvEjqra/jVWAvk4i/Jc4jyVocv2M2/nX7aHOuOYBDpggQgkPGAgCYgCZhsBAoeDQ5BQ/MPBYwACjBoXMDBgEhocDoXA0PR13VVn+fVMpgUNsaYFA85AT9Mheelh/PPsIo4cbyedx5KZ+JzViR3peYXChhAEiwrCBsNDQw6DQEDzCAOMGhcUCooGCwCzBwVMDgweCphgAjQuMMAQMDBhMDmEApSw0oaymOMJYDFJW+sCuF1/Vgnakq+mVRuCFarqmbUcDeFuHE5kpFxOE7hcmQbwuSbHyEhMlFD1OBbi5LSdNFCWpDmSIVNWhjnjHKRItVFMyElgFgSJhCBlsKhlgRAkTFQReQillZE1cd8YxzylS0pkIpZIgSgFg02QgiSlgScRE2qoWaRAIGlgqNDRYOiUqdBoeGwVAQNFVu/ERZ4KjDwNLDQiUe/riJZ0FVB0SrOlv9CjxFYaESjxVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zcMTeJ6GyAZvPSABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.34880814 + //_tone.Orchestral_Harp_E3 + } + ,{ + midi:46 + ,originalPitch:5200 + ,keyRangeLow:34 + ,keyRangeHigh:43 + ,loopStart:16217 + ,loopEnd:18317 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:21605 + ,ahdsr:true + ,file:'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GagcBgRwCsYAEAGmAGgE5gPYB2YFAAHF6iYNGAU+bzHSj8PuEYfgAXAS70HAoFghDpFtfC4FMPg6QXHscB7v1nlr/5yWWLOWFHex7LbtW5Wsazyt0Vir8op69Lq3hKrO8Y5jA8bzpIrSfYpaurvP3PdrVs7/JvPWPbMon6avyV6uTVLT3Zfe//OgxN1PJA44H1/gAfnaurU/I6ezakGGXbdmzjWt1bv4YS2cpcLcrz1+u0m89SO9/zV6pyrn92/8zYxr1712rU13K3Yxzz5rHDdrLtnDOjptb5rGrnjvPPXOY81nVw59r8NWr++467Y/e+3ANTBGAENVgQEwQSBDLFGkMA8CIRgGmH0S4YygY5hikIGBoLUFQOjAhA8NmAJAxRAgzFxF5MeAawCgKmAKC4bGPZnoOGABCdULptlYm6HQYjJRh0AiANGCRas4wyITJB+Myq0ycmjAoeKA2j6PBabQliQHMgo4wQgTE48M6mBLYMAQICagMOp108v6ZeHZmMEmZQUZkAhmEhppBYLgwBrQIASnA+bBBoAPMnQmYYrE5jwgGMyWYCI4oShEKTGw7CgDV45aqqvUbpdFmCRSpP/z4MTMepQWaAGe4ACxz5M/aozE4qJi6Y+B5EejHgeMRAQxaHzFAuKgoYaIwInM2MdACNzjt0WlFWXrPlrL4HqxeTUcsaBIgCMQsIDDoqMGCUHCoxaEgUUTFYLEh+YkBRiMQg0LmBhE3zKajXkQWUvEjqra/jVWAvk4i/Jc4jyVocv2M2/nX7aHOuOYBDpggQgkPGAgCYgCZhsBAoeDQ5BQ/MPBYwACjBoXMDBgEhocDoXA0PR13VVn+fVMpgUNsaYFA85AT9Mheelh/PPsIo4cbyedx5KZ+JzViR3peYXChhAEiwrCBsNDQw6DQEDzCAOMGhcUCooGCwCzBwVMDgweCphgAjQuMMAQMDBhMDmEApSw0oaymOMJYDFJW+sCuF1/Vgnakq+mVRuCFarqmbUcDeFuHE5kpFxOE7hcmQbwuSbHyEhMlFD1OBbi5LSdNFCWpDmSIVNWhjnjHKRItVFMyElgFgSJhCBlsKhlgRAkTFQReQillZE1cd8YxzylS0pkIpZIgSgFg02QgiSlgScRE2qoWaRAIGlgqNDRYOiUqdBoeGwVAQNFVu/ERZ4KjDwNLDQiUe/riJZ0FVB0SrOlv9CjxFYaESjxVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zcMTeJ6GyAZvPSABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.34880814 + //_tone.Orchestral_Harp_E3 + } + ,{ + midi:46 + ,originalPitch:5200 + ,keyRangeLow:44 + ,keyRangeHigh:53 + ,loopStart:16217 + ,loopEnd:18317 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:21605 + ,ahdsr:true + ,file:'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GagcBgRwCsYAEAGmAGgE5gPYB2YFAAHF6iYNGAU+bzHSj8PuEYfgAXAS70HAoFghDpFtfC4FMPg6QXHscB7v1nlr/5yWWLOWFHex7LbtW5Wsazyt0Vir8op69Lq3hKrO8Y5jA8bzpIrSfYpaurvP3PdrVs7/JvPWPbMon6avyV6uTVLT3Zfe//OgxN1PJA44H1/gAfnaurU/I6ezakGGXbdmzjWt1bv4YS2cpcLcrz1+u0m89SO9/zV6pyrn92/8zYxr1712rU13K3Yxzz5rHDdrLtnDOjptb5rGrnjvPPXOY81nVw59r8NWr++467Y/e+3ANTBGAENVgQEwQSBDLFGkMA8CIRgGmH0S4YygY5hikIGBoLUFQOjAhA8NmAJAxRAgzFxF5MeAawCgKmAKC4bGPZnoOGABCdULptlYm6HQYjJRh0AiANGCRas4wyITJB+Myq0ycmjAoeKA2j6PBabQliQHMgo4wQgTE48M6mBLYMAQICagMOp108v6ZeHZmMEmZQUZkAhmEhppBYLgwBrQIASnA+bBBoAPMnQmYYrE5jwgGMyWYCI4oShEKTGw7CgDV45aqqvUbpdFmCRSpP/z4MTMepQWaAGe4ACxz5M/aozE4qJi6Y+B5EejHgeMRAQxaHzFAuKgoYaIwInM2MdACNzjt0WlFWXrPlrL4HqxeTUcsaBIgCMQsIDDoqMGCUHCoxaEgUUTFYLEh+YkBRiMQg0LmBhE3zKajXkQWUvEjqra/jVWAvk4i/Jc4jyVocv2M2/nX7aHOuOYBDpggQgkPGAgCYgCZhsBAoeDQ5BQ/MPBYwACjBoXMDBgEhocDoXA0PR13VVn+fVMpgUNsaYFA85AT9Mheelh/PPsIo4cbyedx5KZ+JzViR3peYXChhAEiwrCBsNDQw6DQEDzCAOMGhcUCooGCwCzBwVMDgweCphgAjQuMMAQMDBhMDmEApSw0oaymOMJYDFJW+sCuF1/Vgnakq+mVRuCFarqmbUcDeFuHE5kpFxOE7hcmQbwuSbHyEhMlFD1OBbi5LSdNFCWpDmSIVNWhjnjHKRItVFMyElgFgSJhCBlsKhlgRAkTFQReQillZE1cd8YxzylS0pkIpZIgSgFg02QgiSlgScRE2qoWaRAIGlgqNDRYOiUqdBoeGwVAQNFVu/ERZ4KjDwNLDQiUe/riJZ0FVB0SrOlv9CjxFYaESjxVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/zcMTeJ6GyAZvPSABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.34880814 + //_tone.Orchestral_Harp_E3 + } + ,{ + midi:46 + ,originalPitch:6000 + ,keyRangeLow:54 + ,keyRangeHigh:60 + ,loopStart:12971 + ,loopEnd:15118 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:21604 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//NwwAAAAAAAAAAAAFhpbmcAAAAPAAAAHQAAJCsADQ0NFBQUICAgICkpKTExMTE7OztERERETU1NVVVVVV5eXmdnZ29vb294eHiBgYGBiIiIkJCQkJmZmaKioqKqqqqzs7O6urq6w8PDzMzMzNPT09vb29vk5OTt7e3t+vr6////AAAAAExhdmM1Ny45NgAAAAAAAAAAAAAAACQCmQAAAAAAACQr8uICpgAAAAAAAAAAAAAAAAD/86DEAA44OoD3QwAAg1AGm2v7voiUAShwMPz9YPh7OQQBAEPKAgD7wQBBxcH3wf//Lh/gh8oGIIHP//wQOf//l3//wQg+rAAVEIBmCSdgmMYbF0krdwaBVbTApRZ0Fm245hoFGDxSYoA5ws0GKCgDgo0wwyQ3wAAaLliRcZchAQhYREBVIScwcNnbvwCzxIF558njQAOpOXzRVAM7bIAxhyGEKmAQZDjH3/h8OAdte9CpozVnyamBCJDkMRiRzd+HGKiECMSV11xrSY/ATj8GApc9D+ca5Od+np6R8oJZ26tjd2GKz2RBenKC/cd3tJyvG5fY33923cnID11oGGrXxrG82spXLGaCC7n/Wh3GgkH/hvX293o3bsYfhSTkJ3dx/7OLktO3KcdV6k9lV5+Fioz6F9lX/TZR//OQxPNHi/q6f5zIBLp8pRSc1KLE//M8/////ma3durZuT0qq/+7P////xGBbOT88j0W5dy+7ZVVAU5gGIBoYAOANGATgHxgKwEyYE8C4mE0Br5hI6KCY3aCgmBaAABgLYEWDQGMwIUAmMBCAajBDQZgwSABLC4A0FgBQiASzAiwI4wGEB4MIPBNTBLgLMwCAAHEgA0SADAQABGAEgEhgYMBgSCQQATIwQBZgoH5joFZ1YVRgOLBgcBpgYELwoUpoAo1lAlzLqfWBDAcEjF0GGIiwAiEAh4Bl3mBIZGGoshAEtNgpwkejAkDjE8HxoCmTWuUyqJgKIiVSYTDWmxBVQxdFcBD//PAxMxfM+JYB9/oAQo0xCXPEWqDg3AQ2q5onSZMNAMQhgYPBKXpfmNS5iT6OvKqbuo4psIwMaFDXOiMI01VkkICOBLqsWlTlEIRA4HmnS7KZtU0zZ/8sq6Oyr+ZWuTUWepdri0v5ZZwDIcu/vHX///+vrTfMsflTKmHMfk9NTcv7xmYrjz/3Vs4X9b7+VXCMymz341NPs1eK1KX/rPtLrVrLtnUzLX1ivfxs3rMZd1rtbG5hrCryM8YNzUE8RduPAEhAK5gJAKGCyB6YQAEpiRikmwN2Kep5LZioBVGkh5GJb+mLBCmLQ3mYchmdwZmAIPg4DAAAJhkDC8jlo+zEsGi+KuJUDgBMDQLMICfXG40sbiCABMIRCOl3jBwlJamJIEBgHNUBAEYRKMIHylRRpQiDnaFw41JeKNDTRlCdmAxeWd3WewUTKQfXCzfWgah6szPdqjQePhdLlrNt1LihpVVhhGVbuzfQSsHo7TsdXW6w2/3//131a23m8bRQEb9W1Xtfn6/AutIO8//7f///mUBN9vn/ldbhK7OGe8OwS7u//OgxONNHAZUBvd0WXjazu0uOXe9/XZp/t3vppmQxMGjmLc/LPD8aW9lVxw3vVezzG/z/uX8O1qXk9ljcnv5uahqnva/m+fq1W59/tXuVfX4bwxt/u1Y/HuF/uFakcpAu/MDBgDDIFF0yiDDVSpOou4xm4zMNErAUjA8gPw04GgxcnkxoPUw3DM1Sm00bDUwgDIv+GBYYDh+YLBodQ0kZNAAYGA6RBoYIgYKgWBhkMo0OTAWDQnFgCQQDQVK8yCywgC1PMeREaDkOCJYIwwCF5GlMrkjEVZDDcBIdpYInEKRCKoCZgWAGLY3KcLCQYnBOseF0XeJlGHYbOvex05KYpiSOQ8B0Tpt5JPKEEQB3v3KXKHQECA+l97nwZTt73H/5VXLT8+gAoCS6jsO1zm9VXRkPef/71/////zoMTaTYwGTCbn+iH1+9///jPmSbyx5+MzOfjjvHPff/+8x+t/e/rJmK9cN1sOVN0vLn477yvhha5jYzzxl2Fbm987dyx5upn29NX8rn52q+7GXLHM7us7ka7zKg/lTVnXfw/Km3dQBVUL//MCBLMBwoMDgtCgfGEhdmJ+nGGwN2Rjq4dkYA+EamRoMmjyBmYIQmMo3GjW4GTotGBgXigFMHMEAQC46mxHEmCIllqEaHPZ0YJgkZQGGJBq3AteIgKMAQVMLjOPWKFMYA2MEAcMZwZMDwBTMYMLEu1N9ZSrVVfsHCiy2VcV86xd0xODlrErqZyAwHBAHGksI16W9uQQYXA/Fe5akTgmAwfrMl38qw0Qgkybfe0sOx4oALnN6yxl/5a/tI/0j/VCjLS2fpefr7S8ZBa3nr//87DEz01MDkwO7/ohdn/xz/kM2L/P18NstiM5F5JO36aZgWzbx+5zPL8vyz5rmuZ5byuy27jv+X6vezXMKmVvmpr+2Mct3be6ljLC7hj3eWtf96fpauOWdT/luGHd/vPdyrndwoMqW9273ue8qlnKkuaIqgD32xgKoBQYBsAAGASgJpgBgDwYEeCPmAVB+RjBMAwZzgITGCqg5pgqYHGYJgEcGBegRRgCIAgYRiEYGDqACRWAOqpkgAuYAMALiIByMCoExjAEwD4kAD1FIfmAQADmBvgSCMaw6Wi3wcAOGAxgCZi94GQYFGATmAIgFZgDQCMMAATD1QmkHTay5sjgykwIIMUDXXpLr0XUUweBK1SG1jEggJNMGoq/tN9Vl5koc32OG7CqVEuKWZ820llz2X//GrQJNb1++ZzX7/PHj1Qre/WAe7lzX919mAk0LY8WOuSBLYvYqezB2cJ1EQoggOBfPskQlGnNjy2ojf/zoMT5S6wORBb+0TWECMmKddJa9CCRUhKkWU66P8i9Gcciwhu49YY5fJHkNEkVFuYk2htNVkjhY49SabamMeTyGHUgAA9vtTALACUMAZDARwAswG4AsMDNAcTBgAa0yiENeNaMATDCdwQ8wScEVMAgDYjAMwUQLAWJgSolSYEoA+mAIgKwAAFy1RgBIAsYAkAumFAiKZgIQA+YBCARL8CAAphhgAYAsYHoAXrgf1WJK0wAUAMMBQAuzFHApADAeIUAGjAYgDsBADrUioyM5JYZDeFJHAqERAY9RX3MXCKKzUIn1prupWIXhrkbrwNz/UpIkkHfvLcw/jJp3/1SR1te46xs11fY5cw1g7P2blLUljRpHazjEDN/P1prmNLnwoC1wAUmcydmsiTVQd4vLURKcxkCpARYEXX/86DE9kvMBkRe/o01JR50O3J7onwi55/rdTxmKWdEfel975b75snqtwpRr9y0vZRUzlJTNab5/e3eFWmVcKYxlRrI/muJqkAC7fWmAxgFBgEwCOYBmAlGAzARpgWIIkYRkITmQiyOZocAkqYLSBcGAGgSZgqYUQYGoBuAoB1MJ4AlTB5QB0wDoBFCACoWAARIAxMBBAKDENgsIwNsAmMAyABTACQARarbkoBKYH6AKp9NgXmMAAQ4ATmAGgnRhN4jWYAKAeDwAIYF+AHBwCsTAAJg8NnEwuVg1vJfQx5bJnAGOrfqQvJRUzkGVuT960/pbcrM78MupcqsPA4B3+/y1LjA4GZzjh/MuPdWtYVZ1o7jVpfWwzpn+xw+9nM2c+ahp2r8iv27cuxmUMoCEj8lLKOQYmPONQdE//OgxPJNlAZAPv8NNRkgkYUYatCiUnpkj7JFymxZBZcvG/TfOPelVJVQ2z3+TICMstoi7YvLzMpmnx/z3mvn10u3rnvJ4e2SZPL3s7oP45jfKgBftrQqANA0ApMAKAXDAMQKUwGgFOMDlCyTEPpAcys0RlMFgBsDA6gM4wXMGXMCUAgzAfgLgwM0RuMAUAeguAVLgJgAJGMwCwABMQHBUiIGdKAuSAaFZMAAkMgg8T5ctTAQgGAAkMN0XO3ekMVRDMFQbMnAYHg4TGKg5mIA8KGxyn7KX6MXgLoLd6B36ZeYXgW41LW3JBwFTA0BmovL3HT8ru7/75cAADv7R///cD5lLMNEE0dRjohXYhiQUYLiAeRkHEkFwJoEE0da2SOqyJWy3MvZh3DlvEI8jpqDx6D9jt7hJ/HEHf/zoMTnRRvmRB7/UNm9DSLf5SVCfczpULGxaaVZ609tfCCZzKpaqsV7dx1sPvi+oHslyPvPRhOunZKVIABb/a4wAoADBQCmYCkAMGBIgHZghAEIYUiB0mYfG7Js3oNOYXQCsGB/AtRgUIe+YCMCrmArAMRhGYMuYOsAAmAjgJoCANC0bYjAZBNM/ZGMwpwKzAsAEBwAaSEnMBcCwwOwZVrNMTrBQABgNgImD8GIbFg/ZhcAYGBAB4YJ4H4BAJZUYCAAZi4AEkQFDfyiSN1C4CpgGgEvtZzh1xBwBUDBrSOx3k85oOB0kcVtc07VSXfvW7gqAQ0iT7/v9OFG1WzJMsmmfmi7aZRWBGxsnIjqc1YkaXtlyHJo4NKRIiiDHFYuSf12U6l4tSins2rTg+1pH4bs/G1Nji3wwU3/86DE/kwkFkBe/5K8vs1C5JqmkDCmJd8VGrzG8dO6rb339dvtaTMbxPYZ6lGMoTGLWxlC1FTb17LjuTmefNelIABXfa0wBgAjMApAMDAOAE0wF0CGMCyBHzBmwwIyUaCONO5DXDBqALcwBcCuMEyC6TAVQO0MBEzA/hE8wKcBnMAwAOjAGwAEaADBAAKCAkjJFW6MGwEQwFwHwQAEoHAhgBAPGA0C8vNlyuQgAIwGADzCHC0NhUpUwvwADABAxMGUCQwFwEAsAOKg1CoPae0EzF6mBADYKBOcexffltSUB8CAFPrWx1BI6AEYDQBbnSfm/kFPM8/9s/EABLGrH91nxSb8RpsK1pomvFIwyVCVKMX9NxLnWtdJWLrQyMzI6kzSIQpIED53SVrNJbiaU9VmrBpi3XCWa062//OgxPlMBAZAXv+Sve8bU22ZrUs0vBqKIpJuTGbRE5jZVjFT8/04fJThHF+uzP1L7kZXB2T20qj2r6bFum7zVYykoQkwAFf/9xAAKjABkYASAtmAUAURgLIKKYG0HMGH8x7xj9gm4YMSDDmBugZZgwQJMYDOAkGBTgJhg7AREYLeAQEwBRSp7CEBQUCTMONZ0qgikoGRUANTarmAeAGYBgHKtzRVZioASMgaGAIM2YnyABgHAgiwC4YLQHAyrWR6MMUBgeAHhynux4dADMBwAiTWsI3EREACHAavxf52kzFgU28psf+Laud/uLR0ETzyD+f+2v1lzH6c3221dSONIbLxgftGdGjA3YKVedYrVlhJa7SJfDZFDy20r43q+9HHf72xZLlkvY1AxHFfXcb26HHFrVizXNpHjv/zoMT1SaQGRF7/mLxKqzUVn3ILeV0TLLk7baT8EXf71Z382YLRP1te3o/pakDt552FnE77zrFJcqxfW4jmxTAAe29lEgDIBAKhgKIA6YEYAjGCBgSphIgOcZg+eYGw1BuBhUYJ+YHOCsmBsB4BgHYJ8IQDIwVUQ6ME8AYDABQFMGgAwUABTAAAdMBcJ4zll8DCNBSMC4DswCQEi1LbjQApglgJDQAaxC/5gAAGGAyB2YNwuBrbHcmFkC0YFgHhhXgcmBSAOXsJQLTBwBWUpj1f5sCAKGCkAC1GfsQ/HkyDAnAB5/7mkXyAAyKybL9xXnd7/TMYbbvRYZ464Gy6ETmxDNFhUcWODsLg+tuLSYQh6hEKCeFgi5hKHiUVYQhJQ+B0HsryKFD2YosgkSHobZBFJ2UNVyImxc//86DE+ko0BkBe/5C9yZvoyJUY925kxSrTD5QfKzGnK88rzxVro0MlxpURTXKHajLmhsiJMWiT08OQDjkgALf/9jAGwBQwBYAdMAlAMDAQAF0wIMDIMFGCczHfWRMzvANRMEHAcjABAG8wOEI2MA4A2DAcgJcwcsNDMECAVzAJQGQwBAAJLRGACAMYDgMpoXmgmEgBKYFYBgOANTqewLAUGAEB0UAEtnYoiWTAUGDKAoa5oEphPgImAaBaVQNhkAZVMGAUGE0A2hQ/9JUmyECgwDwAX+39L1sQsB9J8O8ry0SAdfPH/+m+dpO/bhhq68ZHW3lqlWWOSlBrJzWyCcnoUCYuCCFiBE4uC6ax1lyOsmZZnF8mIZ9KJJ3cManhiTFSjqbcJUo+7Qa19nrpM9Xop0WhJHmJuYTn//OQxP1JzAZIXv+SvTc3uPqEJsRS6W38hUddaXnrc/9VWX9dJqc7978jFX5C7852nHdqn52mRapAc3/2xgAYAcMgFJgAwCYYBGBGmAnAjhgXoaiYe0/LmM9iYJggQKQYF4BOGCwgkJgMQB6YBsAvmDmBlpg6oCqYEwJ4kAkPAAg4BEMBqNPwJIwrwEgcCiLADL1aUYA4CZgtAuuAylaReUwAQHjA0ETNAguowSgHxUAYwfAHQcB6zcQgWGEuCaptS6+oQgICQKVvDs7EXrYVS6u4WCUAIQgD9ga9ljAuA8cS0HjMmEeoOpUfH0wbLjjTpp68KKAwxhoWon0ySPTCAJ5sVnzq//OgxM1IBApIPv+WnfbOacldRdMOWaJmrjKTiefYnauugi/Qq1V2pOq74UQduZbKdNv6l75lrdlUxxXdPo7aivxFqb3MTmK7QYxkfecOsuOYccPnVF0Wrn2N7t8JbkZaQBLt9aEABIYAtmApACRgR4BuYIMA8GEsgqpmdReqa9GAqmFTAnBgcQKkYE6HOmAdAwYXBMDCRhxYwR0DqMAoASkinLDgEwwJQ2gT0hYmESBrHgDGPJ2mAwBAYroGhb9VRBGFgEACCOYFg5Bj+I3mC0DMYEwEAGGfEgfxIAgwDwUzEFBQEgD2mQ/K4gpuo9G9azpJaNAQ2O/9yGxYCp8td/5d2Zs5bsNiljdotSz1LyaRQ1Z4mhTexmSoU7mT2NCIlLSeVOIsDzNzyDvm6+1FY06U7R4o32ZpnP/zoMTZR0QGQD7/krxxa9mjWX76izBWyx+6ge2sW+w1mEV4LarJLdw7tluzasJ6d/rPUJ5rN/5G7vt9RrJQuMJ+5b6nkMhsk2GZS/l4fKxSECAKu3+1MAMAHTAGQCowCQBFMA/AfDAfgQMwTsMiMc4d3jPDwzgwUgCzMA5AeDBIAhcwEEDPKgFYYbaEZGFgAEBg2g0mBUAQCgF1gjAVB7NKxa0wrwLTAsAWBQBa1E/jABBCMYIGgeAhWelYBgBzAaAWMH0M81xR6DCvA9MCED0wVAKjAKAEc4QA3mC4BgjjLsdXXZKALIEv/ajSwULnMb2+ogjQBEpnd8+K6LLfLoiuaCg8Tq49WRmK5halHjiasWunSheZzASoirMFqHLJNyJZd9/oIoo3G3ljrTC5hrH00b9TFmzGQHL/86DE6EuEBkRe/5id7XX8+FiXO/4L0vDDXMeio9Bzr62m9W3WXTmZ66XJtM0Y+WJu1OuQMVr9Jd7XWdbtSrFOghrPdOfBS2xV5um5vWvA73N1FnLt/thkANBABQYAyAomAeASRgPYJOYI8GvGMcv0xlBgggYN6C8mBzgbJgsALUYCqBjGA3gY5gEo+KYCSBsmAWANBgDYAyBgBQEADggKoyp3FjBmBEMAEAlORrcUMAsEsxPRAQUA8nSnUW9MBUBAwdA4zWWJIBQoIEAoMFgCMwFgCU6gIBOYSQEKtEjwqXU7DAHAVpK+uT77NXt0l2pMNwCACabeda207kSy3yXvjOxukt37urB1RcSF0AWYQQLoCFlckIGATWHFiJbdYbbct0syCAhYnXpM4t8kuTYyciuws1ardVEP//OgxOZKLAZEHv+SvaW4ou5vVXN2u81iha8uP2py+R6a07WGtu55qqHxSjJEzJZtieXex/xlzGpLLT9te24U3DbVqebdrnqx1RjkKdlOTM0Kbf24wCEAAFgFESAlzAgAAIwO0ATMIgAIDLpwkQ1dIJaMJRA0TAmwS8wD4NcFQTAwI0BcMSuDajDFQFYeAoRYALHAAQQgTFgLkwsYnRUF0lAQQLWASrMDIEIwQhbgsAKmUVAASoAgVQRQaO4YoqSpgFgoA4CAeGeEgfkDZGCQC2TS2/3jShoHOXY6+pnW/+Y1mkMWov5jqK1e37Nrclxeut21Q2L6YhoPjzLyUcEsza1cGRlzINGihRkPPFYIFJNK9yUlJ4hxZJJqHiGSUiqEErPQWSJk1ZsFovQ0wuUOxGjaVxTQet/8Iv/zoMTpRoP+QB7/kr3M4Sy//7vclHynUJeU7W2k9h3wqGRVqoJS20fpe7tLtbvV3qlY2+3ZNYhurnFp4UuRQJr//8YA2AMGAHAFJgCYCIYBIA+mAoggRgbwYuYqy6smVBCI5gIoGoYC8AOmCWg0xgCACwYTQbhlJvUGQMFoYD4NIMAYFQEREA+YAoSRmTOIGDOCIYBgCZeZRUvoYIICphpCRl2Fh0hAKAGYCQERgxiAmluYkYTYH5gPgZmEEAsYCgADB3EBAB2OeHKid4YBtd/Pmsef/ttmQhqmrxSJSZYfHo+HzAbuJnIy6pUZBFRw4suULaMtexDUTh3XrIULYqJhWWz5mkbb7ixY2x+x9Zy1sbZvd34ar3KNrGdquemG0NtWP1/kLXfyB2PrLVL+fBFBq1p6jpVtX6v/85DE+0mUBkQ+/5h9nR4/faRPXtVmbQL9cvZda/XqldpMuf/LK43vde8OVo9aKO947x07Zr61ttWzbf7YEgAhgAIBCYA0AhGAfgP5gQAIEYJaF7mMwN2ZmQImSYKUClGBcAaBgnIP2YA4A0mFQG+ZsrkJkVBbmDeEIYEgCYGASMAUAYwIgWTTBXTMH4DUwDwAEiWVLLMBgBUxIQxCYBtirFkLQUBUYNAQJqyA7AoUAwBgLDACAlMAQAdhwwAEEAyubf5+SdpgDAKS2RTcsjtJDlJSwt6jgXZLbo4vuVVQrDAfiIH7p2dLD50unJseKVpqkSN1ejhSQolp+weRKIz91nshgfj/86DEzElsFkQe/5h8uipV5Xd5pjlub9IMrMNIK7Wl5fah9Ou6jdMtfHlr37aWJ7rb0fbM5rWs3m/wH7b3u0yvs9/12OYFtvr/tPMUlClqWaQ/ZZaPN2tKf/vOZ3RzBtor7TqJJrDyIBa3f/YtKHAFxEAwjwFmPAppgw4CEZEEKpGhpgzxgyQEQYDgBmDAUiYAMBpmA2gLph7AhaYVaAwmA4AJJEApiwA4UADJgFYB0YoEG+GBTgDxhkCIYEyLLYjBEIDQwSUzXKYyVQEEARmBaTHD8wmCoQIwgIzg4PlYRUCDBEE36s/+UpXrJu/zWedndKoDEjGTaJxOBtN/imgUB5KCLWYUgQILPrLsxQIVoOVULiggJSpWCiE1IlazZpJYk37lL9KacCshJUo+UPOCK4tMKm7j1rt+//OgxNJD3BZIXv9S0FETGooYwvGM9aQ3Tb/BX0zAxJZJqp6ogP61/CPhWyuMZ7lz2pOtWoyuKsJps+vf6ja1M1ly8MjGU4+F7WpVIBbW/a4wBAAZMAVAMjAGAFcwCUCSMBWBJzA+w5YxeqNoMrBEYjA4AQ8wFcAYMFMBeTAbwOcwJ8GsMH+KeDBSQQgwBwA6KgAsJAB5gDYAoYAcA+mNsgS5glgByAhmQwFgOBAGiwWmqYFJRLlRcLPmAQNGBZznw9WGIIPmBYOmRAIBgWNPZ6DjiXFzff3Dusvyyx1+4rQUz82JbIakqm3FvRmthlZpqkuvzNBELsZ5yRHAEgSWYFoEjXooBGyk5G2KAQ5CfqvxYQpwQzEZxm2CRZiYHhjXPNUc6Mxs1IaKYpE4tEpmMy1adh53m8Q+tP/zkMTuRiQGQF7/TNmgRTmZmqlXMbXacKZatjN8ep58/2hjZ6brZ0KUURQZMrksLIooTZVtyHKFn3ulkIAB0wBgBIMBJAhzAiAOowP0HHMIsFDjLS8Eg1qoaaMLjCTTGFGBMjo3Qw/xSDBaC/OQtMU0kgbTDPDDJghQEA2WADRCAUdgBGatbSIHgVrRgBBHGMkHYYEgA6Xy+0HAEA+YJgJhuLExmEwBEYCQFRgtg/hUANRQkA3MCAEBpMer586Ox1TdnmJmigqTfYhTWNlifN2g8iIugmi7rG2AbLBpRhJZCTjJ1cyjx9OXu4y+FXwUozNpGlNZeSbJuklqipJpfbJsTv1/7v/zoMTNQ3wGNB7/kl0eDe/0glUqzfmqrnqZjtzRxS+bBPXqLLF1mltyaiO+wzFeVfGPXnDYeulPP9rL84RntSyXjGSkWMwv28qnwkWjTL/tq4zANwBwwFoAJDAR4eBzTBmwAow5YDDNL/LWTmKAJ8xAUFNMRMfUVXIMDwnAwrSNze05rM+EYEwuBWjBJBDMCgCgwDgDgUAOeQpYwsAC67iLDgAAYwSwhTDWFhGACGftcUmTAOGCyAccLYk5hbgEmAeBmYCoTgjAEW2BADDDAATGgAH7llJngGlpnW0Me0uicVM4JkRAVsMsEShISB8yTIgeCxo29JdzE4IbgEDjMEQIhhBCImYM1KGIXA4wiZnVtwUJmZr22+cE12Vm/FJlkfQyqaHWWY2x+y30XliyzE9peM/KMZSglXz/86DE60Y0BjAe/5Jdv7CaWZO2sSWzIwfCcHLx2aTvkcw9lQnPKhdbro+cqn9um8xSUt8pS2c2pyTcjp/tdJAKAfGAwAMxgUAE4YDyDbmEvhn5i6ZMqZHbYxmnvAzhhdwPcYJADTGBZBpBgnwL0YPUEkGFsGSBhS4JsYHYAlmAXAF5gQIDOYGMCrGDdApxkxQamYO6CthAIUYAYABGAPAFRgDAAsDgLExuwfA4CMEgEioBhgNASGCoEcYOgYZquFCGAOAmYFYEpgjAxmAUAaCgIxgC4wPQOQ4Adx+/T25Hnh3Pv9x3P16GpXlVNeysUkxSWLUOxmOyjdaISyfvZVcpmpru7nd57u7sz/yzDV3mes69Nneyq93lSa3v+1Obytcs4Y50csy79/VXVeQ2r1JZr1KTnbHfr3JV//OgxP5Pq9Y4H1/wAZ3rWFnDHuWfMP5X3vn548y/va97fO58138MMeYc5vnP/eff/mWP6wx/HnMfy1Z7l38sc+XafuG7mdxOAvoagDiNAAs7PD6fLqYKMD8GAwzC9TAbBpMNQ3IwDQ/zDNSYOEA1YwoxXzaYTNMAIUM17y3DLjLGMZ0YsWCdMeILQwMQDzCDC2MR8JswLjgyEDAZBAyLJYWpgwHCwwnVsFbYZujqGBE9Bm+Z4CFBNMzGOgwjI0xKMQxHQMxmG4YBxtvMeR5MDwcMLgMAwkAkVTAIajAQQTFgVe4//qXAIGF0P4/BjCKgONAx4B8HHWY4CRrv/r+sXg5x0z4FXWr8x4FIyVI0yCKQwPJowLKchG4x9Izn/+9617qobtvQv2xSD2uDwAGLw4hBtGSYfAZFTP/z0MTrdswWaF+e6ACNFExhB0xyFAxpHUQjLzDfec1l/P7qBl0KQizBHkrQ5J5yXsXkJg8OxgWLZiUNphiMBh8CJjcH5jKChjUFQQVhjCFZi4KxgcIhhWLf//f///v//79daQcCq7ZvSuPZt4LckTLE4IsugwcFAwrFowOFcwdB4xXD4xMCMxTA8IKIxWA4xVEMwfC0wyEYwrEswQE0RicYBBP/////////////+3lM/GGHHvoofaHOuO39K78v3bkF+WGFwVmEoNBwqGGgBiQ1mGwQGDAGGEoRmEAXCELAuGZUBwwjCwwWCMaD4wxAwSGEwzBUDCGYUAsYThWq4scVjmuv2yUQSbQyPoSSDUfhxBqFLi72VqoqiSe0XRnIk6aRRz06LgoBAKOHEiU/vMsSJTVa8scSw4lWvjVhxIklskSNf1VORANTOVTkSOmkUfWyR00ijPqqn+ZxjiUtXmWOJZVV55xLDiRLXmXaqqtkiAaeWqnIkamcauaR2UZz//zMz2qp/ecY4lNVrzziWVVf9q9VVd5nf2rXNI689qc0joKbYFpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//OAxNgpo/atv8wwAaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.06716349 + //_tone.Orchestral_Harp_C4 + } + ,{ + midi:46 + ,originalPitch:6100 + ,keyRangeLow:61 + ,keyRangeHigh:71 + ,loopStart:40255 + ,loopEnd:42975 + ,coarseTune:0 + ,fineTune:10 + ,sampleRate:44101 + ,ahdsr:true + ,file:'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S6BqeWUMzKJ2S2rfJdSSvVuvc5at4SyaqV/1WucuXsqOrq5vDKm5Zwo69S1Z/Gk1WuZ17OequXMsrU5nyv/7gMTwgBVNlTvuJNNqxjNnfcyktffvy/8pfrGUT9jKzcy3cxxyw3hvHPGvj/bOVTDG1jqrhzv87jllh3vcNc3u/391MOXNYZ613eGs8Naz/8cvv/jvC9WuBhgAYApq6nEs8Mtmjrtkp1FhgvKAG4gbmYJQ+xlbiSmAOBADgLjFKBNMJcUMSG3MKAGgwAgFxUAIwVASCACIwfg0DDKBsMCcCIwHQGAz5CoUcGxmhm4METGBkxMNSJHQs5FJPmqDfHowgJL7GBgRWSGGga5xUSNwMDt381lTNPH0xm4qlVKPBCVKZTPlMDSC4yAcMcBjOSEw8PZEmMkM0lUqwrcmMuGtdKEIDzGgwwACDAAxUFLbsNfZnTOoBazB16KMSbebecBEZlwsYQCBAgZKGgILBwOzmJOU1qIuS5L8MhXS2FlM0/qIUsMQAEHErAcHrrRTBwYuhkkScpyoi/rkxJ/nKl8txn4nvWEPw5OAonXm//uwxO6AGV2VO/XcACZ+QSp/PbaBg+DiB3FMA4LdxiYkEO/EX9dmVP87Upf12ZU/2UzZs2ZfrL7VefsW6tRs7gOip5TeLN2UEhlmKKcLYAmJDVWMxmtGo1VlMZrU0aq0t6vEc56plrWW7/dWr2rHPxzys487yxNw3blEYsRN/5fGH8nIbf+Lww/k4/7lyN/HIijluXFyQVFJBUUkFRSQVFJBVZNtJ/pJI2kgnqYkmpZmCCotIBIjSo0iYAXWMIC4zBq67ZA4QNRBBECIkiSJIkrbWtazS5cur0ztVq1baa1my46Pnctb6rVp7ba17LLl1ctb9qtW22teyy5dXLW+arRcUVkFMBTwUXFFZBTAU8FFxQXIKYCjgUXFBcgpgKOBTcTfCvCvxNxN8K8K/E3E3wrwr8TcTfCvCvxNxN8K8K/E3E3wrwr8TcTfCkxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1DE54PVAMUVvYYACAAANIAAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.04612140 + //_tone.Orchestral_Harp_C_4 + } + ,{ + midi:46 + ,originalPitch:7800 + ,keyRangeLow:72 + ,keyRangeHigh:80 + ,loopStart:40148 + ,loopEnd:42855 + ,coarseTune:0 + ,fineTune:17 + ,sampleRate:44101 + ,ahdsr:true + ,file:'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' + ,anchor:0.00362804 + //_tone.Orchestral_Harp_F_5 + } + ,{ + midi:46 + ,originalPitch:7800 + ,keyRangeLow:81 + ,keyRangeHigh:86 + ,loopStart:40148 + ,loopEnd:42855 + ,coarseTune:0 + ,fineTune:17 + ,sampleRate:44101 + ,ahdsr:true + ,file:'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' + ,anchor:0.00362804 + //_tone.Orchestral_Harp_F_5 + } + ,{ + midi:46 + ,originalPitch:9300 + ,keyRangeLow:87 + ,keyRangeHigh:96 + ,loopStart:26956 + ,loopEnd:33165 + ,coarseTune:0 + ,fineTune:31 + ,sampleRate:44101 + ,ahdsr:true + ,file:'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UeL37cx66NegL1dom6x03NvsTnrIIVua1d6yGhi7ervcj4xKavynIlcluluzWovbkrOdq2PWfdh3Pf20u/35bf4zId2lN0WHRnggTXSJEoSQOi8dWESi5wGEHBkCQGciKEsxzjGBZ8oYzxiK1cIAgVu63Wpc6bFNtGvXrj19YT8JTROP9J5MCwqCwT0NY1g8n7qkf0vv4jjdvZ1cYIcR/7C5w8xI47eCzNJtB81Yq+xrTKS65mbVxTZ2FBdsn5csIjE4sUBh1GHBMoo3QUhNAxqR0UkQGZgkFnAQKKX/+4DE+QAWQaEx7KTaoqQ0Zv2WGnyEoJDBqEMxqOSmdTkTY3BHzEOgcyGUe//0IkPTRBgn29rRYCEMJRHEBZl8zZCJhAd0FohhFQEdGHiAIGzMu80xl9XkrUXEZncsXI3+Fmnc1lccjMN249RQ7KotL4DdhqFmkgumoa0vzn5dS5SqtA8nywlGctnfrPVST+FnKkv4449naeltz1azTwuW00oxvzt3PCzub5nu1TTfeZW7mVv/r6ws7qXJdnhhrPHmH/+FbHn44az/C5zd7nP/PP89b/LHeGeWGP732xYxyray/uVTuP1cc97z3S9/eXN2KljaOiBkNXdxJJUrVJXJLbZJI0TbmTWkzQAQVOMuwMCZErAqcAtIzJwyQF2QNrM8kJEQKrDoAw4YvuIVURg5mBcXVIQYDnAYPGVCZt5CYoPEQIWSwdowUmMBIzHx0WAomkWXsSAXc0lYrukQKv1v2ZNQAoOuuDkU1pzLWf/7gMT3gBYFnTPssHPjGbPm/rOABV25bgRvl8Nxh1WFs7eLtUrXZLIZiTOneuRp3HwjFRYR624theZ0GaL2pmvv9EX55VpX1lcXjLDbbsujAbdZpv4fdxxnyZBDEP1rW60qdrUqtP6+MPW35nYOl8reyMZP1TP/DcWlr9zTSIG3KYZ+rDNa1lWprUC0lJDNNLqsSheoq+dmJWJqKZQbLIldo4KnJuZorFbest44/v8ssvy127W3Y1v963+P55d//1z//+a5hruPe3e67+HMt7pK4WC4Ens6uyVOgrg1/p6jwipMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//uAxOgAJ/35J/mtgAASgB/DgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:0.00746015 + //_tone.Orchestral_Harp_A6 + } + ,{ + midi:46 + ,originalPitch:9300 + ,keyRangeLow:97 + ,keyRangeHigh:116 + ,loopStart:26956 + ,loopEnd:33165 + ,coarseTune:0 + ,fineTune:31 + ,sampleRate:44101 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAeAAAvJwATExMbGxsiIiIrKysrNDQ0PT09RkZGRlFRUVpaWmJiYmJqampycnJ6enp6gYGBioqKkpKSkpqamqKioqmpqamxsbG5ubnAwMDAyMjI0NDQ2dnZ2eHh4ejo6PDw8PD4+Pj///8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAMTAAAAAAAALycII87fAAAAAAD/+8DEAAAG7AFv9AAAI5MxrL8zoAB2UzSZRAqAQm1Lh8oCAJn3xPE59ZQ5KAgf3gmf/l3lHf9YIO3w//iA58pB8Pwffl4gDE4t8E/D73REjFQAAnKkEoSBVb6bhTAjCSBGhtxA0AA7qDoeF5S1xKijcHWJxEQqpknDtObgYQRAxoTMFmUKFAhUsDmFASxwjjHhAFIRMRjTJwASpYl5IUxrYJPDTpzma4txDvCNsPRajHklvLu3CgMx41vqTGzWMoNRLo+6jw4epMPrYw0+sTgWm3cvpLCQGmrfluJpaL2oqGOcw7LK2fNXNfdu5d/soi/za/+fnzPON6yy/uu/ucbpOY3Ps42P+tOTvN71+UgpaDK5nWqP3ez5/5QxP75//8l5///9kXf//1BJbU7/9R7/9Sr8mphoAAwCDoNE1A6mQBCG8NcbobppgXiDClEtPBjR8dG6Q4gJMLiiym6l0jFH6ouhhJVHf/9azIT4DCAGqPFlf/9ajYJIUkl9kkVJqX/nTAljb//+o+pH///ZR1T///6I7Eye0rMiqAAyOGgIg8H6NcyHwVwuIqAChFPiz0Jiw4NCYkJeFrpeq65Xe1rZoEeNB87LYcln9tXaWPUuEttXM7k3DDAyYNOXFlnS2zz+b18tbpLXavrKbO5bU1orsIAkdjDHgd3qtyxvHX///lfxyy1lDqfRiIEwxtrfKDP1UkjdFSa0aLOTAHKLTX//13C/B9Pu//9dSaxtNgdR5L6NepfQkqiiaBVy4XjN0bo/9S0bqnqUh1QlADgHBQLAVIFHEop4aWCQUUzXQLSmaMCSAaAhOS8Q+LRIDn9sOExsVQMTS4BCJnrLau5y3Xi0ukdStS613C/OP+FDIZ4KRb1r1mms6/WcmhDytIg9YZ+b7LlYWbJEgFnFYXau+X56x/v7x+vmszH2CwG/F42QRrROpmbrptetiaCkO1e3/660SiM0M469fUt/av/7gMTUgAx1d3H89oAqwLTqfY22PCounhbSsSpeNUmdrVK1OtkjhiXkjAYAuYOoQryxENIh2d0FgAEBwGDEWwV4cRqTI9ETQGgKo2YS6AcHFBUeMFnYFLcJlqQ6/q6jIJOOwUSYKNaKjjX6DtzOpV7Rb1nhTwwysGAIiKR3IxjwQfOQ/cyxu/NP3LnefqXwE36gTwEQXIhIYLewOJTL4Em89b/v/rvqWqS4AK4UoYqW9jZy6U0y6x1a1qYyErBvApJF2XWp+yaV9Eol4YRgkq+quq6d11lAipoIAFE1WiiykndlrUfZlpH1F0fQn8b5TLwFfmxMLx1K0OpZuWdHAAYHEifYKOMEKJoMmBSjMYQIAKlhkiCU5ACJElnRkEWJ2sLhAb8Fwz2KkDM7HGBvxNW6n4bs8rVP//wtwwIWk4dLLpNdjVLlj3+XpdJ41Qw9H6R2nmiwKDQBdwb2O8qO9f7OpE+kRYagWyAxQAFl//uAxPaAFol3S+zyEaMUL2h9nlI1g7yKnEkVopJJGR1aSNkzEzNQ0gaCSrejs7trrKYn0fJVv3SZSaneig1Ys40JocZsZ2U9rGCBw2MnUiTZk5bIMMwHTGRonUYtNFI0DM45TM3mBgzRMOjAAQDBaXoqkrhkuE0wEdBqYjWNWoSsAQpdIMZGSi9bUiYyLSGy8TRxhoDQ+eAwUChN4rQfZ8qrQLyCi+5VoJlwmxlAtfCg0A4iQAtbJA+i/tWyaRVOESGwNMG2ICScCwjHca1q/qu+Yj6J8AEgA4QltlXx52Cdxvt7DjYeaV5QAaZWZ04bz84rnU2L7tjsWl2DxQlteQ9zPM71twkkiRvvcS5IFiOrnucWrq+polZrxJ38z5qhPG+IpywOLLPRxrbMSNFjv7akgbdagT2FeFQWAAgHDblEqDfHN8JJFmZS+awqDhjiJfoLI/K4eIlBTjQQg4KGnRR6BmZlXIZiMCqGSb7/+5DE5YAYraNH7O6Poz00aH2avjzj8v1cq/LNbuf/+Gcoa2CCqMrh6AwQq6f2XUuV7u8K9PIYclMrjcbdyBxYBRCHxMP8Lou/hnd///8dcx3li2BHJyRIVJFh9beevDhx7YaoG8RrUfj1N9rWrJTdK5vAt4do2oWl8VKWYNWrTEasWXGXVau32tOY+maE1pTeIDZBtJEmcrYo26x72pezE441mL80ieLm94OsRKYgT1VHeGBAAMBwW5S8IUqYmjQBLBtICSGrwlMWsXnC5i3zApxH+stGMuswU0gOyPIObRWArkfkFDSXYhLsMJ2l1vCvKGll7DEIAOdEMmBkKvdxy//lHI7J7cxbu2pGzdHwCIoEWY3ZfXVtU1eUkQQkAoNSdBn1m6SDsiks+ZouUxOBdM07qWmatd6KkE3U5GiYjml1lIOdLxfPmZfaVkTqRUJ0xHUbIkEJ02as9STXUmXEU0nM5gaGZTUZoUab9i4gnJygfPmpopk7AQAQOAQkZzTZTRJC7Y40zcSRLfGSwsCjiUCEA7dU11EXxwiymBac6MD/+5DE4QAaMaM97PXx4xS0Z72OUizqGOjMYHgMEaAhgcTgqJ4ZVscMt4Xb2csi6chgefJm2XJg2BCKLXodl07au8+HHic952mQ9Ov8yCMLwV2JGFI6Tmv7c5rn4Ya5lvG7JIeIABHglyvfzmC6cbwzqayVPZuQCqoOgVhCspqN3kdqN9QIfXvTT7aqTCyLYtnkJdGSiaVaxbEkClyNklq9qRMso+NwhBT49631tnE6XhS80dMSbWxY+qDAAQDgtqJYmeYYiJdIyCjYTDiAYyDGB6dfg0ETDuex0DVo0udGqcgABP5ltR5gqD6tkMtYkEjll/l+zYs4f9upG3AQzMGgVNIQ0IgPhNqznv/4/lFYlNHR26es2rc1bB0DRYMq/P/+7/nf3zn/vvLmLtFYBf/NYY09adOxoTfw2cpVcHz2UibSWfd5barXW604vWICZZA+xnv9ditO/3vyvJJZtWteld/2ayV6+1IsmFjDmW3pq7E93PVzLQ4ARpNSVxEAEDgEgllDDk0QibKYJG5pkARkgRiwShCL4IDM1HQJaZWpxmL/+5DE24AZjaEzrPUx4w6yZz2esj0sBQyAAcwNw129gyTDowGAMwDABrEjvZWc+zuV+tnUzsT8US/MCi6MgCiMDABU2cWNUtzH+V39mGnyhrEbYZI3agZFQRiWJBNbw3j/1ceYYfvesq28a1osAWTAT+PP75tIsw1mzBlQowgDmyeGsejYQySyBPKp0L0JKo1H+uordZi4vT016pc/N7rrvc55atpIuNjfr/xr7f103eu6m536gk4gwBhBUGqnKEoiVSxUsQEDDgWUEgGEjwgKKYU74CiQQpHNOQAh0RyUnrrjmkgDkQfAQC1nKBwxauYawxldT7sYl7gMDBADGHIcG6g0lAUtCgWRYz/KfGWNbXqrySszW43BnsucCgFSNJgCt5at6wuYWMv5rf5ay1fgUhAMmBGp9i5cp/qNcPulAxqS6MUhQdh8W8SkMai1bzTmG1GyOcKOybQ6ytDGvGkoQQRqVUie2rsU9gv71vzl99Zu26rnKTUpTy/6rJpAqWn4E0StZHz+ihNdJIFjAwAEBwCAXcFEI6kAgQWeiEwvkLH/+5DE2YCY6aMxrXTR41GzJa2epjyDJomDoBgEHTgWYjYBhagj62F1l4DP3Tui7TN0LzBQCE42QOlMxSvK95X6XC9j3Okf9UhgWU5jaQJgeADBXelN/HDHFoC9nJeZ9WZqyy152Iu0u8sEqTAvMWt1c+29dyr8vY7pd9s2MywBrFcPv57wbY0oqdhJiKdMpnAHQCsYODOnp6RIsamvUj+FLWe3WHsTZud14Pag+L15OXXplHHX57ZuKKOunNy06ZbSXY8cjPsqwncoVjO51zoapopYhzG4FnNrmZWBBwQAEDggAmoPiNMYxCvQgJCgeICMwACBkghf4YAgobJFnFQJDadLcUniQiBOhiLo0GA0CUIQA+q3vO2jfzkWzs1KlJZ3bsP+/hecwHAHzE/AsKwC35prNvGt3GFLeabEJlxofeNOuEUCwYwEaUAT81y/ynq3d75q7hesfTUs/OodX9q42+W+QQdEiOtMsUwdjFYflm7cFiH0pLblDNxJVLSaTpMSXeiVJEmGUoxVl1Y3qSiKKsV8dCX2Ky71NkvHE9ij3XX/+6DE0YAboaEt7XUx42SzZbWvJjxKGyRNJRr/WCgMGTOESuvZs/r1qrPIzQAgOCkWYIAWVAPL/g4R0WzAYE2NiMGmxhAaysEASRAA1OUFoy+JdZ3mWiMAgIIJofQZi0DpfJNih3UlusZdRXrOvz1zPB9wsHxhQGyxYepaarjjr26OC6LGXKaw4c3FWwOI1sEpIUFGm7UF1Lapk1eHVPzzI3eyiYNJLnXrHWkablrXcsiebQIVhxChaXk2enAlM/Gwc82YLdZJesjik025Z0tz4s3Fm8zY3aBQjb0/FR0HooKoqyNv5tSGSXJCTqBcudhwAgHFbSMAQRU9xAfgrU0HZMIJAgAShToFDHkX1ZEAjci+M6+anA8478uBZ5DwBTihEUxtfYpYYh/ORfl+dShfQtkZyBLVp/mW//fto8buyKlttzoJ25LVHiAWpRc/H/1bw///7FepSVrk+5KTq9oYrW5JlDxISKpQJDLVnTrDFmRZJEHiZLUMLTWJJWaU65NN6kU5TiKESc3wn97Ek1FFn5K42nJY/FXKq9ajCpI0v53kYp+fvfCOT85wUseCv1WHvZwAMDhtFEUpbkZQX4DIzFPYII2jaCBVCIQjWKw10CMFgDEZDfh1KsxFDvuAMxAwvGvSN0l7lygtUlrKxr+bw7GBGIzCIfYNS1r347/3sbrEIhHqOTwiAZP/+5DE8IAYlZ8zrtE8awgzZrWOJjy9rCCQVt9e7/73V5z+bl2c3jjy7XxZC2fL88eWETQVI1YgvNqjC0noxSWYPJ+HbWpOmIKaiYTgk03KEZLF3799MWu3UvnWTvYsr1KU59+K2vUo19vcj5O2aVd0Hf7i8rivMy//XbtI8AEhwyQjKcMx0XFGnBEkPNCVxIGBBCsZS8iULYrhJUGmiwCa0efVfRLmZHRmOAymgzt4JyX1e65v8K9jG/zOGGVgYCQEWzZ7Ge8N5fhHI9ILMYlsbrt1dKEvUWAjheX/38dd3re6zTbcg0QSgJFsxw0h7HmmuLDVWzn3EF1LYe49ZKW1PZC26Qx3H1SQNu4hybe1GLTvUTKTupMyS6xsLLJ7bY1NHOehrVL1yNjxpZG1v//qQmilNQAKBxE3AgQgdMJV4ALAQhAGEwBRCOShqpBjQGPhha48hDC7ZS/zWQaYBnqtABFIWEzMDYzSkVQJEhhPl6/UmDQDAYEAREUmqSfWRUiw7yqPZFiYHhIdRDwiEST/6lpQjsdbw/TgnNfN1X5cGpn/+5DE8wAX1Z8zrPEx4tmz5nWeojSof30vCVt4qfjQlh3aa5ic222tfD4yh84opso0kkLSFxWWMIly0G2dagaUZteN5BthlYuqZYhBSzL0ck4OqEkTnqd72KSf6ItYzwBEOGSUZJCAZra9AboxhFXhdRxQH1VMFWIeR5Zj7oi0Vp4WXAIpy9bjyVUlSS6H7WOVizFca1WrhluxE26IRAI6vZ3mfOf+dBYl8K3Iar02LDywwQBtz/5+q3Mf7zvRUgcWMS8YAgLQPFmFZRjjJUlCOKsgl1gbZMKfJJLFrL8x4rcMOhj4nkpRZCbdTpphdZPF0FaelNjKIprYlkOh6V1SeZoZaKPg2htDxw0Lf//qktmeACA4iIShBopAcoyiCqWagSIBA4GBlvQKOpQ/0DizRsAsOWFsZNYBKJxRgg45p4Q/LIpT02d6pey+7nj3Ws6hKBzCIDl1nLe8+/2bijk5QE8VSHYq+8urkATalreud+t38+cl9vC5Wo6SZvvp9TlLMYZaRLJuYbp4w9C3BARiKDudO2a69QVLY6RO2zcVNn7/+4DE/oAXAaM37NUxosw0JnWOIjTnud3tc/KnMaoVs/D8ZoS95WaUbLr3s6RIM62Ppn8RS8gov9lNXRESQAJBxEyygQHJG5OZIIo2xFQYhUAKDd21MENCdIRI0t4rIumq+DVRw4z3OjAACZ+3CG7t7Hla1SRCzfsU8prVY4yMIBAYRq+GWu//fiMslE67MRlkogx96WHyoBXP5/81vLeGH415qjubm86teGql7GzlukMmNmkZ024xaANA2mNJiE7cWDEhs31FFwmGNIk/CN9VPu1TbPf0/28Kswyv4hcF8smmmiYQ+4KT2NaOVyOJ5qR5HfWFmZZYAD5HmklMIs33wNgl4KxJNl7RVsCkCIBRpBCDgVJNOLssgfnKrKklQMGocMEl4uk2XU03k2TBUPGf8RANsNXX+srLRloplM6fJ8kgkCxJmc1M8xdRm0D5BMiSBrKOlk4IX0DsIFYqqVReaO1Is/Zra+6bG/dedf/7gMT1ABbJpTOs8NHq5jLmvZ4aPSlykymdyW2XOI76TeCpeoguU4/xy0uvEsZ1zK1mm2k3b4bLMj3efLUxbOkKxrBAW48zbhoBpADMUHUpLjBhhTMUJgEcuuXoIZbBSLqrUyILr5Oa0I7lQaLSCF4SG7huctUkO3pqaiFd/akNp6AIuLEZzv////JjsWjl7k1S001yUEgtj3557ptYVdf+jVdY6fKvZhRVGHhDBHV1yM7Z7u791WyjD+6Sqk2yaZ5xaEUfrzyoaM55dRbdDN6IHHgsopzkqxNrW5jYbPPdKMLzc1BuluPc3KbNUGaqhoi1WUAcl5W3T1lDqcQGJgpM9DAEgL8XsapNJC7RZjyIyEpGxLPo4RClCDxiCIRIuZ3v32pT4Zx63rLP/7gVQYKHy6r/5a1+NJch23NZ1KPmq1slCyKrjd3V+XY440mIPcaYRTiyJpD0ZNIT0COZLOMNmFaW6Ww8Psq6DNGz//uAxOkAFH2jP+zU0aK9NGd9pJvEcLr3FFYUehyTy1qyJ+QtnOY50CKFM5lGy8l4aQpEo3iYZGjJbwUoiQPMKWY04nMQrw1ABfD7SSgK6UEA6GHIQsNWs/YyTCpRaqFoKCpVs4IBZeWRBAvWqzPzVQ1f1Plm+WM5fnKZZYtZd7q7MR9GgLWn/02NDIvmaZ8zK58xCVmSikUywuiVTUwTKPysMYCBjTMFOGcohaDSkfulazJItFkUVG34MVes33H087UVZeHJLj6VPZ5TM33RskYT8bXzr+bmrMx65752Qfw+uZDeOzGnaBJ0lmhpEE6X2kcIkTKjEBQtwbxRmDq+MJsanDA0vB7VI5gRcJLZbyALcSg1RQLwDYJukpbd7DkNRWWQ5L7OOP8/WyQABQBLb+8P7//+pfRWaTOvYtVL5VE4flk3Zl9PSWNzd2L18N50k1UpMqeYkO7k/LqCMFlVo49MqwcsDMNhIzINcbr/+4DE6wAVjaM77GjP4pWzZ/2pGxWNJ08Kk+bhjDg6OKPMlXvSDf+EPbVEqXjl263zC3SxRzm+Mt4SguGvbKyMVOoyX2PdAk6U6s7ABbjWtqHIAcFxoKtdESB0nlRWOmWAHJKqjIQhBTRAAqlbW32tx2fUVNn1Ggs9ZtT3cM8rUC3qlI7L0OhLpdG1yERIeG4dz13n/u9XsTt+jj1+9QWsCwDf+zUlerkr5OXLFjqRg20Tz3Unq4FjjnZnKDPykIO1Mjz1SRMME6c9OlEo6fqZitbJRI9ltjf0huGT6upd4aKqPd4s2Fj3uSyi4wzYS6RNM2SphJ36MIQx9VmGVkkwLpbRJMEWLEjgRYEk6F0IYDFAlalBIcAOXcyhK1PhTcsnKYZdxzjxGCgvJpPVuW5zUda5LafGWc7b3reiUCAg8DWf/W/39qWyGilcUs0tu1N0Y4HncZdYhyYrwzG4Jlk9OOUYBckTDxp4SKLEGf/7kMTuABbNozvs7NHizDNnPZ0Z/d0fmTd6mtB03A9kxsJneyzEbh8ichSbYjbtcJLONE7t5ef6Vn00tvmtV/MZL4+pwzfal93TL8lSnCbqXBNGpSkM0kBbn7tqCRyGTGk1DTEKwIqYQIiAKlF4RwIjgla8hEXCATd1N9QZaUoOS+SAl9W7a7a53GljFx/GSxbKzfa4wseGjRaRc3/cOb1L7NBfls9OTNSQT0cSXg6QfDdnGtEJTQTFFmbbURiAVgI882XTE7aqnayaSZRAuzTK2n23asmv3c6RSYIZ2fJi9EDDukyhhkU9XL77TAx7eYhrUYUzj4Zh62OoVcp6SJ7MdXa8+nJgYtmqeItoagAu5/m3DAEANYWeDIkuiMs2jjdmAoL4mKENPJ9tBKCFRqVpVZZ0C+zEY2vzGNLZzpdSuXRC3NV7vP3vC6h4YIBVv1P5hd+pes01PexllNOVbUCJ2v5bjs++lNcgKlpLEGVcKEJopJBZJI0YbsGGW9/TIWjsWQ+nGHRjoYWTY/Md3RlcNNZrPc1RNJHHPMxviUVFW//7gMT/ABX9mzfsaM/q2jRnPaSjzL1dG54vspRZ3W2S8ZieVJSK3zlIRX/+UizLEvCyIHuPrEoUAQQuFFBMADCRtQRfcxBEMVJyEptEdAYhsz94l7JW701luhlNS1qW+9r3+15giJ7UCykfR0IZz2CVAvdf6zun7i3KRawrW17BhtzkVZiVm1NCiMbLPHmaaSP41LzwFijW2uN4XyvxXuIl8OKqWdMNmWI55tHzGdc2Qb0V5vnxjPVp9pr6+Q70+P4xzPfeoLVUG4B5D9IgEFla+6eXeIU7kisLEmnPDezsVbh5iBA/b7W3BI0xah+AMgChZsrhDhCAPfAY8zjQqOWCEBKTZfpd7Ms93WQnuuizI5yfzpqmci+fpa0zLeWb1WXy8hLMUVvuTWFvHuVIpZdiP6H30NPbE05SO3imjF9xlpEyFE+n0gPVJI3W9CJNuWRUStmJLIHgRFFnxqQr51OEqQLpmZHSit23i/BV//uAxPeAFf2jO+zoz+LItCc9p5p8J0V2bNqTMMdVHu5e51wXhXtpqvPzx6nJKaPzUutQLK0owAF4rQAJtkpYxmHIigMQCRCYVXMKnAIQxgIwJ4uuqkyovQkCyteV2baQlufDCJJ4pfkn1u8qwXE47EMnoaZFGuRhtVUxIaPFreO965z9CEgGj6oYQKIlYKB8UkRVqln6kuui10ZxgpHMZaYn1XLwqSPaHDoNiirmu4WRRnMUiEEFBAQx90OKaxwA0M1E0rZBECTVQ/TMjDkFM4cB+oDpRorqXYdCMECoAWruv0WFp5h4UE+32klGyTgEDgwiIWAJDRIQgjHhzYERTCggVPfZYFLZSTQcI9DaSgB0fyv8ujti5hY5SyncTpZVS4Uu6EgELIXsc8KlNvLo+QokblIrETSC8QKUzSpYN14UqPrCsyx5hA02emHP5UadS9jYl8UuzzUduu1q6WdBC4Tg6OtAlaSCN59LKu3/+4DE8oAVTZs77LDaasEzpj2kj1RP/T1UFedYl5y2XVHux0TEydkQ2tNsvWi+azmIAdU53Z4AC3NcJTLgABUYcgisQsjrKUEYUUsUAB9K8VHCMmPFAwMg21peVahh5JUzutCmNbpKOxzkpp7sPXH5lr2SmG4y11yS5Q0Jx3z8NZ/2jYILwYEhx6S/QGGGvV6hfqBVcbIpRTg9miZJSaEjXRO60GzbI7u27hRnJSZtBCFluhqphXYDcawwtFgmZgQMwqDKLDjs6NsaEhACyIIBoRqMHcBDDoO4sxg6q4taQUqVhrx3eTBPLtXFD0AM5Q8KoCFixXEdyEhAQkIQldGGgGEMxEkHAXU9Fmkjqt4PEQJ0XZTWpbfKGvCYXSSq3d5Yu2NKplq6OlrW687lh6VuN9XClcRWVrCt3HZdBhq0uPmq3O1ieLHm88faElpyR3ub3ST1zFonJoXKBXRPrJKZzXNSe/BNLTmKQ1f+4//7gMTxABTpmz/spNpqvDLmvaSPVNTu/d7wlW7j1tbn5TpNENasBYindJvWoFpe9tJXLuPpUu8ur0QHutZGoHWGomaSITAWCQUaYjZhDmIgIA2TiohCAgMTFVQY9Bdl6ImuQ26F6Z3KHtiz8liMevx6IPPQxh0IInqVIlEr/1vHu8OEYqZIRE2rC8DNjEVRZBttlxKn0xU8FPVW56RmottnsFiTAcgkSRVAck6IRJ5GXtcwSpcl9bky9Z2KMs+LdOtj4W76nO5VUSz5JdPCLSRymt9Jao92vOhBrVMCZ0igtFAqi8OVlKd3eABNv5W2zvGR0wIyY8YMcqMAHwMaTNcECAhfARhiYhMq+JQLIZRzsw2EKL3F7eldLnatTcxQTMSjsYl0rztanRgAYAIv2Hr0ahvWVHSEqhOKWEAFtkbRxGkSqwhtsmVW1mnoZULybVFJZHsyMPxNSjB1Q7KiLMatEj1eKkagyukjSg2y//uAxPGAFW2jO+yw2mK/tGc9lJtMxU7lny11ur9TpNRtZJR8qVmoiQUmk1CmZMavog7aZqruUj0ZRVFgip0NScIimoppVdWl2UEvdsTTMA4EgHCynqOOMzQhHaTeKMIREQmPRdTdT4R0pGK6nm0R+ADzUt5x2QWpZq1TRGxUmI7yAsWXyF4FCx4WQ7nMMLvO4mGoQVDz4leKywrBFA4kPl5lBShRW6u6cEG1NyiKlQdK3tjsvVwm+WbHc8qoSN10StYh0AVWM8IKU86fUxdzvLrWSQmJgjOTDIYS/rEbkJyM5baxsLLr5z4dHSpBTIdy5YWnaHtgXbf2NwMpA4wKpIlxBAEFtLCjYcogasULFhYBA6A2iueze9POOhJDB5B+MrqWreMpvdmqaamKS3jlTVllpj1NX537vJXwkmE14aRMMuaZDIlKD5osK1BHqJImItqouysQqQjbEIOQFIyyF4iEi+QqPi256ZWuQPj/+4DE74AW2Z857SR7arA0Zv2Um0wZaINBJMgmAz9NyDIJIcbKwDK1BRMehhmBOdhmCyXOgjjCD7aZEE/c4GyxOsq1GB3vWMlmkSACQIntjIG5S3Cq5sJHSI/AwOWsVRVuJAIijjnEYWvsyh4XhfgTtuYxtSneEthvkYcB9WlzjH5pJrLlmrhf5lnArclHrEpm0UHoCyBNlVELImSampwi1J9EEmYdaSzEkj1tQFDTiYnNMnWXPizFhcw8LyyFoXIhkoYncKZlWMUZeDMiPtINe9aghJyCwQ4KDRiNSrCN2S8QPEQYVYineXtgX//Zt0zRMmcHiWGJGgJeYMnXEAkDFELgQSEIteDhKErHgEvQ8cBLZcALirWfds8NS6jPW1iniwdOp7yr4bAVBiaZdd68v3Os/tWadQOsKvbYyLNsvbM0OrC+rRb6yXzhRTdJKCcwvJuMyTe0P4PeHONk2XvIMQytLqDdafSbNVO1P//7gMTqABTFjz3spHrqmrJm/ZSPXazK6eldzrRQM191LbTT2EiBxFGNyMyIVeTsUuoSy+QQxAkhmhYAEvekKLUgCFjbKLBRikBIaCAhOCE0+AAKCBi7qeDLVUYAfe1labCFzYpfnJ7sLnMbcns0l6Eww9L6rmhl/5cn0ixLbs9fzvY18gENVAgbPtC9g6LitfY7FuYrNnUBAmwR4mkjnrCyA2StGvpUuUTulLYyD1HFKOu2iQek4dDNFksU5iG13Q8O1c6YMm45Tp4UkcpyVibQ0cLmZM202qXGatNKHqlaRTG2NQkyla9PHQFJ62kkPWTIWjM4MGMIJjVCFVxBQmEyExCiUNS9JpGSBb+TwrkU7BQDyyCWs3v0lL2FS+1OUsJvxCET9SAKZYMZLWw/jyNwxZbNX6QB1RgINzXILJGBP025I0tTFiyohW1cQiJLLhS8XduUQQdJ7yi9w3yvUjvqYZjkmRIeMFEyBQVq//uAxO+AFQmjPe0802LANGa9lKNUHZMw1cuyesi9sSKIZNVcRl5WfqzbI5d5P1Jnti//qG9X8KnGfTjeqyQ5hJ5g3TS2Lp/smvihrLKqwYLKrGSEPEDBQTgCxbIBE5hh5dUySUMVvRGQIEWIHC1CUH2Grul8ZdsqgQ4PT8p2c42pTPkehm257DRykY7p9wMYzRrXl3m9rtVITi5SR1Xl9D2zq6EuIsnitXUjZfDC9QRfEbWx4Mm+JQ9tOW97R9zEFVR3hlJnaifu45GVae3SK3ckdl7NS/fvuKfDInSvcXpu4zPFIa67Y0hUu81NT7QWai8YuPKTq0qEuHV3ME19aJKNQ8NgMEpjBTX/wMmLwgk+pQZMG5QgGCgZAQiSw1S1Jyu/8OrzHhLHuddszgs7TcFkU7Cqk7EgJx+Z8ccgEkQBiIQhqfPU20eqaXZ0+83Da3i4gz2UYNTBtcLPgo/bRxmY2KZ2hEslaOnkzpf/+4DE7wAXdaErrKTaQrQ0Zn2nmmzV1hnfNNLljq3Ui9IAS1FwtGTPUqSl5RlI/6htwyOfTK2LyS2NU/cQr5zd1VU+op1NpSkiU7WsLkTJwGVel4l3moME+n0bUGlhkYhwd5kECtJgjZjBghRo5hyJDZUwkOIsIyZJAEHM9sYMtZiFxD8W8mVweR6KNDz8RMZ8xPFavrlrOBTFpq0tcwN7keNCnakfO1x3cNPoisqsYGd7KyHKxLhm1Lvr61QR2WGOPknIUkdiSezZHJPOdLzhGXQ18ybukkTTcq7RfmY5NTZV5mvaLNkJ2z0cl7eUJhBDZpGnqcI5izD6hpdAn4+nG5h1VqaJizBfvrE2yIkI+EUoKFNwA4EC5w4uTQockJZhrmS2JQsOBi7zqoakjTmjipsC5Xm15txwmDSuytMSkGkrKyH0/HyvzPzzdrCvUMSO/foujttnpiWWVRSOS5lcMSSTzx4kmVOGFnmq6f/7kMTmgBZRjzPtPNMiwLLnPaeabf2IOJ7k4RdGN0C3tr4jVI84tBFDSJVJ0vp6YtDtcqPTW/OKyjrx4wx0HV+0ppxEaf8Lqi7KprpF9Z2+/LvvGMx3w00xqZ7ME3mdRLUQFVTzrA04CkBMSrBmUlZDGEYRlFOcaDEQ5hGCCASWl0BO40lAxi97XKkATNHbhENxiA4290/DbwNrapWFqfv/nPZ4VcacUKNMDQQNj5oIEzVRmbkgZULnbSVi4hED0SRlImfARAKVQvxpKSOadQw6FbCB78r7b0+OrUn+Ynb7On5T276/uPR86lZlZ2yLWWzYjKcDwaaejD0eVzzyiteLkpP1Zrqgwn//9SpzdYV5UFm+kSTNSMGLgMgWWMMUHYLHHGRrgMuZkMDhVBXYOCUCWDgqQ1k52lgkKYv9jUU7Wt8pZLZs1Y3Ym/cmp2ILmpofit2VT0vjsKUUciC6jZgNvVRInIRKY7E4spxagpagdEfcH8pMpKShxfkk0IK6JblZi4txGThFtokc95GWWRtbk8OZBaeG2HbJSIvuFwazy//7gMT7ABWJoznsvNNiz7NmvZSbVOVCORykYzd12YvIbWhsxmSutjSuZdn7FM7ZmRSBbVnEQhIIgsaqBpArQlykyZrGQgQoLrLEQCCBoOgJ0GrV3360ccO8us4KplR4Qy1FexkkYcIa46HREGPXo4xN5qcrznE6y56vJj61KhuQvRPedUYWfCtgQkU+S83juBI1Db7OZNBpEOcoEX0ikHGo03NvyV2VTySiMJttWe0NrY0vZLWtDM31uVd417OoysJeySOdbFu8RmPjtE5PO3efo+olh0hXMDt9bACUiDFjJbMIkYZN1gIuNNwFwJDBUNFIoOXaRALkfxXb6L7WSmiQgTtm9LJJTboINjUgi85cmuX49K87y+1M4m5UMT1K+Tgw0/okD5Mw0RuGhsPoMxCWchR3ENrukXciajo97MeTYraTR5kM3Oo52xnYytqYnPRrLS26g7dK8mOhaZeRHqC4RyLV9+6VpUHw7G1u//uAxPaAFZmdN+yk2mqWM+Z9hhp1vgovG+pY7XNoW8d4iStdrpnJfopaP/tuZqdWWDBfZbGWgF6CGQcWeoJEiZCSaoEbMgBYy7hCAFwYWrGhmlzF+wlhzG0BdPlickseEVnDUtE5aWUNRGXlReJygI01+hj55X0VI3Dxyi5vVr5yvToaKFviDA6vlK66/ZfdUeL37cx66NegL1dom6x03NvsTnrIIVua1d6yGhi7ervcj4xKavynIlcluluzWovbkrOdq2PWfdh3Pf20u/35bf4zId2lN0WHRnggTXSJEoSQOi8dWESi5wGEHBkCQGciKEsxzjGBZ8oYzxiK1cIAgVu63Wpc6bFNtGvXrj19YT8JTROP9J5MCwqCwT0NY1g8n7qkf0vv4jjdvZ1cYIcR/7C5w8xI47eCzNJtB81Yq+xrTKS65mbVxTZ2FBdsn5csIjE4sUBh1GHBMoo3QUhNAxqR0UkQGZgkFnAQKKX/+4DE+QAWQaEx7KTaoqQ0Zv2WGnyEoJDBqEMxqOSmdTkTY3BHzEOgcyGUe//0IkPTRBgn29rRYCEMJRHEBZl8zZCJhAd0FohhFQEdGHiAIGzMu80xl9XkrUXEZncsXI3+Fmnc1lccjMN249RQ7KotL4DdhqFmkgumoa0vzn5dS5SqtA8nywlGctnfrPVST+FnKkv4449naeltz1azTwuW00oxvzt3PCzub5nu1TTfeZW7mVv/r6ws7qXJdnhhrPHmH/+FbHn44az/C5zd7nP/PP89b/LHeGeWGP732xYxyray/uVTuP1cc97z3S9/eXN2KljaOiBkNXdxJJUrVJXJLbZJI0TbmTWkzQAQVOMuwMCZErAqcAtIzJwyQF2QNrM8kJEQKrDoAw4YvuIVURg5mBcXVIQYDnAYPGVCZt5CYoPEQIWSwdowUmMBIzHx0WAomkWXsSAXc0lYrukQKv1v2ZNQAoOuuDkU1pzLWf/7gMT3gBYFnTPssHPjGbPm/rOABV25bgRvl8Nxh1WFs7eLtUrXZLIZiTOneuRp3HwjFRYR624theZ0GaL2pmvv9EX55VpX1lcXjLDbbsujAbdZpv4fdxxnyZBDEP1rW60qdrUqtP6+MPW35nYOl8reyMZP1TP/DcWlr9zTSIG3KYZ+rDNa1lWprUC0lJDNNLqsSheoq+dmJWJqKZQbLIldo4KnJuZorFbest44/v8ssvy127W3Y1v963+P55d//1z//+a5hruPe3e67+HMt7pK4WC4Ens6uyVOgrg1/p6jwipMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//uAxOgAJ/35J/mtgAASgB/DgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:0.00746015 + //_tone.Orchestral_Harp_A6 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0560_GeneralUserGS_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0560_GeneralUserGS_sf2_file.js new file mode 100644 index 00000000..deba451f --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0560_GeneralUserGS_sf2_file.js @@ -0,0 +1,110 @@ +console.log('load _tone_0560_GeneralUserGS_sf2_file'); +var _tone_0560_GeneralUserGS_sf2_file={ + zones:[ + { + midi:56 + ,originalPitch:7000 + ,keyRangeLow:0 + ,keyRangeHigh:60 + ,loopStart:10808 + ,loopEnd:10942 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:31245 + ,ahdsr:false + ,file:'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' + ,anchor:0.07818851 + //_tone.Trumpet_A_3 + } + ,{ + midi:56 + ,originalPitch:7600 + ,keyRangeLow:61 + ,keyRangeHigh:66 + ,loopStart:10773 + ,loopEnd:10868 + ,coarseTune:0 + ,fineTune:7 + ,sampleRate:31245 + ,ahdsr:false + ,file:'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u6BxtIqDb8LGLZThZ4mLvwOILQ8ZLNxQnMGyNqN37DZOhPx0HI+1TgLncotuLFtKPChAAWFbHFVbBChQzGoAfKaBggE66b7iMKRBIxDkvlYofNyFUrWPDaw5nSAIrZARc4avDZwMLJCh1NiHCdANcxAGRjHjvVAiVLBEDAoE4DYyQdacfYEAxcJyUBmADkJVMzdMU8LDCQJxBMvhaUvTGuJ8N9Y+xkkVLQH4Q9N5mHlLiTIGBFBJzp9zAMmLfQGVHe+gKYfQVcc40Q46E013HKQQVcd6D1pkWR6RJbzhm76ZJNqLBffy0lywb+Q4eDJkEBrk4ijcixOJVLHygta3JA3PKVIC//uIxM0Ama31Xe08+uOLO6v+tUAE69ZMLQzwzRopVZMMhXNryWRsgSxDtyoigciBwCAUCAoABBsXgMAEEjSCALMDgRNF4iN+zWJh0BAjmCgOg0BjZK4TUyJwcc5gSMaSZgICJjoKRjqEgOEMEFKFwGCAWIguMchPFhjMGhUKB6ayk8YHg0ZqtwaUucZQmKYIA0NFaIhYKAGMLxERNUSMBwSMY5sNQ4GM7yvMDFeMJwhCCAMCxQFibMFw/JhEAgJmCQFmBgMw+AANMEATMFRwMtxsMrF5MxFPMug2MISFMGARCAXBISpqGAACrPCwGL+CoCI1MBWCLJI/OkicYKBiYDAcCguMCwkCATSYLbGAwJgYER4ARwFIWLAs2hABia40A9ICQCaTBzhMhU1cnbssNBoQGAIJIVqqRlpTGUMWeDgBoIaFa8cXzUZpKGCy1vLzXmlQpwY85TlRJymdbuQ1EVKW8d6JUfH2l7+vrIZVyViQAMjFgGcdkNChEsA0V9GoOAyV04IgN3YzlDLk1p6UwEzpnWOpVMv6/sadFpMUt/ldrVZqVU+FXV1WthaGy+K7oQmYh2A86Hle/cw5zHda/DNaGlboZvWuymW48rY/+8a1W9lW3EpVfq441tZBbKJMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqq//t4xOYANmINSbnegQgAAD/DgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.22269163 + //_tone.Trumpet_E4 + } + ,{ + midi:56 + ,originalPitch:8100 + ,keyRangeLow:67 + ,keyRangeHigh:71 + ,loopStart:7231 + ,loopEnd:7302 + ,coarseTune:0 + ,fineTune:9 + ,sampleRate:31137 + ,ahdsr:false + ,file:'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My45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tYxMUD2RYjZ7z0ACgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.10961236 + //_tone.Trumpet_A4 + } + ,{ + midi:56 + ,originalPitch:8600 + ,keyRangeLow:72 + ,keyRangeHigh:75 + ,loopStart:13334 + ,loopEnd:13387 + ,coarseTune:0 + ,fineTune:-1 + ,sampleRate:31209 + ,ahdsr:false + ,file:'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0yD/1/MO/nFL+H/nun3ytB+Wtf/b2r1XPGn1Yzxv0lxtpy1nvt69lnJJDTWN3bVe1Te8Pcfz7zXKTdJLau62HbPLf2K2/7l/aTdDZnf/dfOnr54YTWP0s9q5l37/d3+93bX+gGVgAAAEAAkqKVO3YBmwUFB04Fiw/M2is0EgDI4xN7ycxwRjmjOMRkUaHZlAfg4RmjQIYoEhiAWEgPMIVJOXRAETymh42GHxBhxMAoLzAwJTPl0wSA48B5rAHa/wUABi2NRioAqPBgeCJqOERkSB6XgXJ8w1GYwvAVmgwGJiUBowEBCA5h0cIQmo0AAWDhMiBDFIuhCFaxhYFwcBNMYHhYIQCUzWyYqAonw3oNFIOCSEqdmDwDGHwkpbNjJgfIiMj7MjA0JTAsCmGrPJQDKAUU3bqgibxr4XAIeCV346OAQuesVQDmG4NTKBJgeAh0EXUhgVAFIctajETA6kwXzCwDMIUTiytUNw8iC12XxJZzvx1E2HZATA+/7vEAAQMrYoK30qewYAJ+13gYAlIoD1dpiKVpyrSais1UaYDIIIau9UtdCWSGHqaj6yGK9jTNoHYal1AzSYA03eYeyVPkxmJwl+YccdPdgDWnJak57XGHvSz6GV0us4juNffxnr+szdCu5cJgimb2N3YvLoH3HJmerXGPCMA4DhiWJIT0GUra0UZkL+RmT7943rmHCXLCnOZout02YNjYa5T5Pa/b+QFBMP//uYxOGAOOIdS7nOkgMEQ+l3koAFQM9jX0oAUiUQkm5eVAKBklLAlZCCLwqAUAIloiFQqFRUVFRWigbA2D2skORVAVALB7DSKmwHQNjShYWaVXYoWFhayQUgKnEitM0hyDU4kVN2aVskVFTaYWFli5VYDoBY0oWO1qGphYWa1FRVpXZpFQasSKm1DX+qrUCwsrNcrRQtRQsc2qr8MzSKirKq7XK6kiq0wsLLDarAsHylCzXK1+zNcioqyrUNqK2SKiq7My+qrAsHysc2tbcMzXIqK3K8NkitgopMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02169246 + //_tone.Trumpet_D5 + } + ,{ + midi:56 + ,originalPitch:9000 + ,keyRangeLow:76 + ,keyRangeHigh:79 + ,loopStart:13180 + ,loopEnd:13222 + ,coarseTune:0 + ,fineTune:1 + ,sampleRate:31137 + ,ahdsr:false + ,file:'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mBYAmDJAGCoGKMKYraXnLk0UwYZlDPhgIjAQNWkPM/JguGIyAUZeFmZgABhiiBiRCk0xDAwNQcBqK7Z4sypsbBYjKHKfaLsNJQDLRXYxNF9HLzpmYNrZoRCCZQItVQSIhwBLWgBrifin6F93Bhxh01D0zKbz7VrVWrMpfuJdsvipzjW6+FHWoq8gwjSMDaw7BrAXKmI3AjY9S+Tw3CeQ68Va1d3KbOOG8s4jVs6XZGntjdbsEWrVHdnKlTv0FX+7fZoC9noo5FAVDLKWPSadrSi3JpZYl1LyGpdWprX5U2+Sr8dVeVo5U5GQltKgAVgbE545ElSHRlEdGR9da7AuQpw5FRVA//uIxOAANBoXSfm+gkF+maN3mIAE6AWooWO1FUFqbJFRVA6BsaULHWoe0UsakmrwSKitFCxxIram1DSSKuKiqwzSrf/JIraip0GnlgaiU6VwaLB38tVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02957896 + //_tone.Trumpet_F_6 + } + ,{ + midi:56 + ,originalPitch:9700 + ,keyRangeLow:80 + ,keyRangeHigh:81 + ,loopStart:8439 + ,loopEnd:8478 + ,coarseTune:0 + ,fineTune:-30 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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blBfIPEAYAMG8obSAaASTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//twxPuAJhnRJ7lrIAAAADSDgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.17609978 + //_tone.Trumpet_G5 + } + ,{ + midi:56 + ,originalPitch:10100 + ,keyRangeLow:82 + ,keyRangeHigh:127 + ,loopStart:7930 + ,loopEnd:7961 + ,coarseTune:0 + ,fineTune:-28 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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2W2VXDgOanOhjIMDwAabDcD34/I5iYncbMrrQ236ZwsiqXct1S4zNu3ypV3GKv2i0peuH6/O1eWKevrmHLE7SsRJgJn3tX/ywx7na7b1UqsbVglGGFix+dTn8x1f7laZ3hc/n5Z555d5vusviVOfHhrdR1v4WR/rWnrNfa1iCn48Yd57Ks+fuWQkMnVAAAQaAgCHFHDJC8mFDdmg0SNPEVjl80QF5nbWGIZiIiFHg/eMLOG5rMpC+uJFBg7WesroCjhR8aBjPTRdas4oCgESrLXJBMw4MMGFDA0kxMaN4RXEkYobkaGlFGBgiLqDQuj5SR0LARrwwllXhJYGTkwSKNRTHBBMZMTo3QzRQyvQwRUEgZDJcIYCAAJOTjBqkc1lsPMwMGHyIUlNS9MEiETGHHOpGWK0ELoTVDzMvn2sFyy4ZjwKp+zOS5lpE8Ri7q7Rya8KDAZEyiX3uttDDjg0AGANhjWozF2mmQB1LatVbg4ES6tmSCRmAi1ytM24aHQ2TSiUhcAEgZgjeOXBEPLSZ2+sqrW1VoEytbxelcMo7Ztth1VGQGrjzHBHeHbePbr0tQbWAlvtCcR23RZS7DpPrF4HcW9/7/O1/9////////////otZ/27z/5///f////////s3rdJqqTsjAkZZQsMLyXOTOQioUgeUm4jEccGUgGEGWERS1JiOZhtCMDQVVmRcJBabXKmKBoOQAQCnsBKEI+5pc9etCUJTAhA2Jz1eaPpt816x0ZOlYSj6611oydy31rh0JR7WdrWtems5b2TExj/+6DE5gAtdhVJ+b2ACqMz6X+wwAHZWu5b2SS8ytr0zVm05a36tW2mctb6s2na17Gl3Wtb5rWv7XstaZna1rXGl1cta01WrbVW1m1vmZma1mbTNrW/Vq221r02aXMVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.00843537 + //_tone.Trumpet_B5 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0580_GeneralUserGS_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0580_GeneralUserGS_sf2_file.js new file mode 100644 index 00000000..fe754caf --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0580_GeneralUserGS_sf2_file.js @@ -0,0 +1,65 @@ +console.log('load _tone_0580_GeneralUserGS_sf2_file'); +var _tone_0580_GeneralUserGS_sf2_file={ + zones:[ + { + midi:58 + ,originalPitch:3000 + ,keyRangeLow:0 + ,keyRangeHigh:34 + ,loopStart:4626 + ,loopEnd:5058 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:19980 + ,ahdsr:true + ,file:'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' + ,anchor:0.12872873 + //_tone.Tuba_F_0 + } + ,{ + midi:58 + ,originalPitch:3800 + ,keyRangeLow:35 + ,keyRangeHigh:40 + ,loopStart:5418 + ,loopEnd:5691 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:20043 + ,ahdsr:true + ,file:'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' + ,anchor:0.14099686 + //_tone.Tuba_D1 + } + ,{ + midi:58 + ,originalPitch:4200 + ,keyRangeLow:41 + ,keyRangeHigh:44 + ,loopStart:4510 + ,loopEnd:4726 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:19980 + ,ahdsr:true + ,file:'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hLqGmww/Knv6sUOQH9IwDjkVJef6apmbT/0qMnAS6TYAxS4y4gz2MGZVmzGdGtIwMxlqNeID1jccGH83HVcRNMrVezZQBag4CNBzM3hN/DJZBssyukY6M6YLnDEJizkwngJNOeiq00o2wjKSL9OhVw44zk3jCVCfNTJSMzaTizV7KoM5ws8xryyDBzHjNKYloxZzCzGdA7MrQ44yPjcDKiBrMG4SswUgvjBzClMEcDkxnxDzAbCwMO4HgwPAdjGnE3MBoFEwAgYjA3AlFg6DBDARCAMjAoADHgMzA2AvMFUDEwGAIwMC+CgJAcFUYDIBpgyAqGCABAPAaiQDyRK5mJS+MRYaAjTAYa0B15u2YEwFBgOAFNIM//PQxPx77BYkAZ/wAAqAcRhQHmBIAdSyd9o6/C6WiP7J5HSRqBWzy1rERZagyGAHiQCANANDgC39MAEAkv2YBIAr+00bpoBh94IwoMuiG4ZgBoT6XnLoGBQl73FeVe8JtGAWAeNABmAmAeYB4ArLzAZATCAB29MCEAUWACYgBgE03JXQxmml1Fll2iyv3caS7QZ2Zfy5dmO2p2V450lUvwNABgwAQSAEbsYAAAiFAEAAMAYAJLgwBABC1j2GAUAElxXx+ciUc/C73dzerPPxw53k5a5up2pfq/njvf/+8e2AEAgvVk4YAAp2n2vxHtWN4y/6o0x0A7bl40V3nLXq7v0KALAKAJBIA4C4XCYWCoYAwQCkwEBgyXTo0zID/MRRMMQCvM4GvOCtR/zNIwTK4tTVoiDBRs/8yNWNZRDNTA2S1NcNDYTj/8xIvCC2NmNoQCQzHh3/+Dy3JgwelUYcThAYMDIEC///ULCgCuZ00xW0aK+smu///9CglStbiiq3ittWWxKVTLcna////9YrwMBaaz5lMHMCdmbX00qXsycKXt2fb/////+AFApa0pY00sM050lTP2wJY1+arX//KrV1HZTh////////7xsCacz1lUKZC7X/86DE1UPTbrsfndqBK2U00AtduuzAtWrhVq8q483vn/+v//////////fVdsUaSy2CGkuq3ZwZM0qGZQyqUx5yuPs730ctRxVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MQxPEAAANIAcAAAFVVVVVVVVVVVVVVVVU=' + ,anchor:0.08173173 + //_tone.Tuba_F_1 + } + ,{ + midi:58 + ,originalPitch:4600 + ,keyRangeLow:45 + ,keyRangeHigh:83 + ,loopStart:5687 + ,loopEnd:5859 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:20046 + ,ahdsr:true + ,file:'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' + ,anchor:0.27426919 + //_tone.Tuba_A_1 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0600_GeneralUserGS_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0600_GeneralUserGS_sf2_file.js new file mode 100644 index 00000000..56960fe4 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0600_GeneralUserGS_sf2_file.js @@ -0,0 +1,125 @@ +console.log('load _tone_0600_GeneralUserGS_sf2_file'); +var _tone_0600_GeneralUserGS_sf2_file={ + zones:[ + { + midi:60 + ,originalPitch:7000 + ,keyRangeLow:0 + ,keyRangeHigh:0 + ,loopStart:5893 + ,loopEnd:5952 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27507 + ,ahdsr:false + ,file:'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3VsVoF3R8jeFSG7OdPKqetds7uZ2JZP0tP+q8tpNYZYVLeOtZY7zq3d4Zct4a3UuYanLH42scda5QxK/hbs67S18MLG+ZY/2bytZ03M8MbV7Cgv2+XUIAACgNOWb2aSSJQCGAUgHRgBAYSYAiAEGBoAZhgGYAaYBIBkGC5BkRqHg3oY6kCtmDXWjBgBYB+YWyCtmmRg2RhTQEEYc0LHGBVgtphXQFYYBwAGGEQKmQ2oDwGGDYYGPeuiQhGBQMGKz4GXwyCoAmGAjHGAxlUQVqiqIGLpslYCGYJMmP4rg5dzBwHC0aHEMEh12agIjgIDpESj9qDhQBTB0CTIAZjFwWDEYFDB8hBILLcTMMgubIYTjKLAyhWhGYAg3CDI8fTFcK1AjHUZTGcbTGcKU1xEDBgGAasL7JbNQWot4iC5djcUL//PkxOt/HDqBv5/qQIvmYqCEYaBMGBAioYBAkYLAEYkh3HFiMph1/odZq6cDOhDzqxJXC1E136ZuYZhaAg/MFAKTYRTMMAmMJAmMHgAMLwjqy2emIArUdLPS6pG4caW776PA0x+38lTut8y8wXAtb5gaBJgaCoCCsw0CgwgBgMBRl6WgQAhhaEcrqS+mi9PUr6rWJ3mF2jpu0s9EIxN09urP17E5enzB8HQUE5gkBQcAENmDAJGCQKAoIDCMGTBEB1Jl4wCA4OA8wkBwwWBDuPceZVrWse/+rmNfWP/zmsa9vmr/cJ2v+fLeNTnM7AcBiP7dkrDB0FTBMEQgFzA4Bi6EyYFAMYDAUEAYYMgiYFgGpNd5e8vWYLAcYFAMgYoqAJAKBJA4A4CcPh4OCEQACgJGA2A4ZPCa5pPDB/5gBgDGA0CSZg6gRisk9f5giAVmAkAaZRYKJliHg/5gSERg6CQsBRuNUpj86xkbJv/6txcIwDAoKAGZVLSazEuZxtcZurt//5gEAJbV9pOmiZmjOZBAMHBAZAkQYqJP///oCgCABgCAiaKYLsGLhbjSAGK4yGGopAgSwuQn///7orlQSrSUGcbzCkajGkGjEYjTEAczCIKjBMJxADf////zStzI//PUxMFf2+LPH57poFUqpYah6AX2MLgdMGxkMJRQBQrmDAGmAgDmBYPAATTBQPf/////2HKZOC12ipYZXK4TEmvVRYITAUFDAEDhkARwChCAgKBYwAB8wCBct4pON////////2GRNJVKoC+zvR99mdKBNJYjFasRXajMlU1NhrgukqitFmqlStz7vBATLv//////////XK0pdzOpTedJ0WcrtfZ3puJO0w50WuxXcy4K8WAxSeyf1mTSoPdmGY89L6wK0pwpXKJqHm41TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//MUxOQAAANIAcAAAFVVVVVVVVVVVVVV' + ,anchor:0.21630858 + //_tone.FrHorn_mf_A_3_41_ + } + ,{ + midi:60 + ,originalPitch:5000 + ,keyRangeLow:21 + ,keyRangeHigh:51 + ,loopStart:7515 + ,loopEnd:7704 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27752 + ,ahdsr:false + ,file:'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' + ,anchor:0.07624675 + //_tone.FrHornmfD2_52_ + } + ,{ + midi:60 + ,originalPitch:5500 + ,keyRangeLow:52 + ,keyRangeHigh:57 + ,loopStart:5097 + ,loopEnd:5238 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27636 + ,ahdsr:false + ,file:'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' + ,anchor:0.08123462 + //_tone.Fr_Horn_mf_G2_ + } + ,{ + midi:60 + ,originalPitch:6000 + ,keyRangeLow:58 + ,keyRangeHigh:62 + ,loopStart:3522 + ,loopEnd:3628 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27734 + ,ahdsr:false + ,file:'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' + ,anchor:0.12803778 + //_tone.Fr_Horn_mf_C3_ + } + ,{ + midi:60 + ,originalPitch:6500 + ,keyRangeLow:63 + ,keyRangeHigh:70 + ,loopStart:3793 + ,loopEnd:3872 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27592 + ,ahdsr:false + ,file:'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YmJ+DrGWOu443b2d7DuF2VV/yxv2pXO/nT81Xuz2FSm5nVxwjtrCz9e7dma+F6xuvZkeVy3nV19mO362eG89zcq1zWr///OkxPtOtDplX17gANWlp8cKm8c8amN/uP3Je8ln+b7f+JzeH5XeXKuVjW+42oPp4jUz/Okn4nP39ZVeWpq9euZb7Wns91MeYVt53s4gBOR9PS523DICZgKA5CwGZglAdGB0ACYMYARhvp1GciCmY3JNZj0iFGGALOYHIGRgvhAGUEnEYHwJJn2m/mBUEuYYgK5uKjK+js4ljVhkDAEfjVFtzHwmTBINjE8ejCclxw1jBcV3UMhg8MMRmNXQXAoHAIMTBUAjAsQBEBQjHgeOp/hAATzBYnh4txoAxGAkyLBMYBgIYEgUAADRLxIQF1aKAHvweYBAxEBIBQQASVgGFoHCgYRg6DQXMBgYHQPW2PAM/9W7TUocELtF8GZQ6rsa//PkxNN/vDqIv57pIAbMFAXMCwGCAoKAoMFQBMEAQKoHXmcmAIDOoqsRADjLdQKrGxOict5Ys1xSA6CaE4wRAYMBkBBGGAeYEAIYAgSFALxdOamZZ2CYNs2ZbYb5JBXmN1KNpqKYsAcCs7jIFCIMB0woAUeE8wmBYwEBAwJB8GAoYJg0YHAeGBmTB1an56WarR6xemd7d+mq008/CoIUyxklPFHzlLjqxzjT3/rGDgBGDILlgFRgGgsAJgwBYQFRg0AgKBQwNA8wCBAAgkCAPHgOCAqEgk9+5zU7ZmMN45YTN7987++aoC6LQkrEmIu1zOWtfRLgVTdt7MrfKRPwryRNcMIQXBIHgQHBkDTBQFTBEBgcGA0FBgqA5gcCQyCBUBMv8YJgEJA6AgjCAHMBAEAoDhYBRkAli5ZGHI2o7JbesKhUGnqkIpFOkIBQRDLlhUKhKRAkTTQwAYAQih0AsHzitFC1FCwsdJIqKt8M0ioqyqbDWSK2SKiq7M1fKrAsLGlCx0rTC1FCwsdZIqKtNbNIqKsoqvDfyqrUCwssNcrlC1MzXqq37M0ioNWU1drVbVVXYoWWL1WChamOblf9ma5JFblahtVtVWtmavlagoWqGb+GpmZrUVFWldmkkVtR//OUxKcrXAKiX8lAAVVh/xQXgUpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.08618440 + //_tone.FrHornmf_F3_44_ + } + ,{ + midi:60 + ,originalPitch:7500 + ,keyRangeLow:71 + ,keyRangeHigh:73 + ,loopStart:4805 + ,loopEnd:4849 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27385 + ,ahdsr:false + ,file:'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' + ,anchor:0.07683038 + //_tone.Fr_Horn_mf_D_4_ + } + ,{ + midi:60 + ,originalPitch:7500 + ,keyRangeLow:74 + ,keyRangeHigh:91 + ,loopStart:4805 + ,loopEnd:4849 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:27385 + ,ahdsr:false + ,file:'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' + ,anchor:0.07683038 + //_tone.Fr_Horn_mf_D_4_ + } + ,{ + midi:60 + ,originalPitch:9900 + ,keyRangeLow:92 + ,keyRangeHigh:108 + ,loopStart:347 + ,loopEnd:357 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:24891 + ,ahdsr:false + ,file:'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' + ,anchor:0.00887871 + //_tone.Fr_Horn_mf_D_6_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0650_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0650_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..bd64b553 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0650_FluidR3_GM_sf2_file.js @@ -0,0 +1,245 @@ +console.log('load _tone_0650_FluidR3_GM_sf2_file'); +var _tone_0650_FluidR3_GM_sf2_file={ + zones:[ + { + midi:65 + ,originalPitch:5000 + ,keyRangeLow:0 + ,keyRangeHigh:51 + ,loopStart:14844 + ,loopEnd:22589 + ,coarseTune:0 + ,fineTune:25 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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/T1qrwAyJlbIF+TjXJ4w2hJTAeBxMJ4JsweAXzBAClMLIE0weQ/gUAKYGYPhhWhif/////+sJNq/ky75504vKG/gCHJcYBIHRgqggBUCkwCwJjAPALMDwFlVMwGgLzAyAxMAYCswLgEQaA4BAEf////////diQP5FYnAkTh+Mu/ff+eikDww/CYhgIgQLKMAcAwBAHBcAQHAJCAAdDJHcwEAG0tTAIAJL0hYAUSAJAICX//////////+8S6Lq6IBYO5rD3Hbm27+MHghlj9MMfhrD2O+1kVACMBEBYRgBGAW//uIxNsAO3HzT/nvBoAAADSDgAAEAIu8QgAJRmAMAvKwQAOYBABIiADAwBqTyNqmhgEgLM+AIAgGAGVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.01853125 + //_tone.Alto_D4_R_ + } + ,{ + midi:65 + ,originalPitch:5200 + ,keyRangeLow:52 + ,keyRangeHigh:53 + ,loopStart:16555 + ,loopEnd:23469 + ,coarseTune:0 + ,fineTune:30 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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FUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//t4xOkANK3zXfn+GgAAADSDgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.41831249 + //_tone.Alto_E4_R_ + } + ,{ + midi:65 + ,originalPitch:5400 + ,keyRangeLow:54 + ,keyRangeHigh:55 + ,loopStart:27265 + ,loopEnd:34829 + ,coarseTune:0 + ,fineTune:27 + ,sampleRate:32000 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAgAABChAAPDw8XFxceHh4nJycvLy82NjY/Pz9GRkZOTk5OV1dXXl5eZ2dnbm5udnZ2fn5+hYWFjo6OjpWVlZ2dnaampq2trbW1tby8vMTExM3Nzc3T09Pb29vj4+Pr6+vz8/P9/f3///8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAVAAAAAAAAAQoToZ/LoAAAA//u4xAAACaApSVRhACT8Q6d3OaAAAAAIAtm78nsEEMfTAGTv+7tgMWBAQdWD+CAIHIkDHlAQDHBAEH8oGPKBiXD//OYIAgCH//rB8HwcBD/xOH/l8oD5+D5QEHf/xACDvB8AAAAAAYAgAAgEWuSy0VBJplLhUhmp6OYHO5mGQgQeGMA8YMYBmI+nImUZcrJlU8mFwod3O5iAiGDXkYYO5iSwVDniNAUSZzuadMmol6m8ZAMJJgEfAVQxhoxbVpLaKdvWpSEEwcKGgoVADJoEKxJusOwyMuRbgtq8AzEtabABQyKBpdNOtSjOTw1Xl9rm7MANZkr7VqbVCuF35FdnKF7bVPD0N0D9Sy1LuYze6SKRmV08sx1FHEqwXncl87UrvvTx2My+huWKSW3Jms60snopOVccKeLTNHbv3J/OV4Sr6HWNWgtW6tnt3fLmucq1MKuf52c6D6exr+Y1dd12Qf/eWKa/hKq9uzO2NSy3NZd+xcncdbz3/1q2OFa5asUG84vfuT2dvdi5yxd1T1qOIZ2bF/KlwwtS2Yt5X87GFydwAEAW7NfulJBKX0XHBAadVpbuZQc/D+ljmmfKSqBEldmCSidqUqYfK0x3tvsyZrVU7bFKn4To7LGMQmNjL0WusYbFboHToLTBMbEB17FuNT8ok1Z9nsrYQ5O7lcrhuNy+9rUohuxIpyWwiYa239mBJdVwcOxEkTGoRlIhr9hbAkCeeFkz5QC0O7XhvDVD9q3c+vR6+k7nvW+frlv+Z/+t6r/rDX/LM7tBS4YbwmJ2znZv8uS3Kcscp+53Me/lz9f3/7zv3xgYFyAoNtQ9jXsU1wwgFgBL0IeTxeq/phAAAAEBKeldoRCZowA0ECkRzp6nUraamHERSpMQMIKq1mDguNTTW1VQEoO6VQAywZdqVIsw7dQbZpTL5Rgfh9CydJGwSFuTwaFSImpSAWIimMt3KC9wrYCHlkE0hM1VvSSLxDKBtjthmrND8VzkpUF7RMPW1/IfL2qcUXUavgVKaNgNXJsTJush5tWerU1xSP05rMPXgRZIWnKDbkwldkDpFz8U2tkhl8hS6mQzIoVaVlIV14ylZ6Oi8ImfmqTq/ASfJwiu96h7S2R7N1P5LI3DUshcPtVsoWqZq6hotlv6aDaj//uIxN+AG3mDVv2sACPTQenpt6cddyb/rOrLGLjXap01Fx0gMFQFIAEAAAAABV+UNiIGNaBVABCImFPi21FjJIsw0PQVMiNCLqWYKk5E/M3GQgGD7gNyNhJp2kBo4pCOJayvB6CINdhn4BFG6zwsKPuw4gTlhn/JCoaaNFgFFQCvIwMCSyRLOkMsbJI6kFNB6ihV548qbUeOfDlvLjmVs8Yu1JS/fJ6u9tZ+RZwkkGMBqzvRTzFrCNuzAGDNk987e76TdXbRbJaniTba3+FH1//VW0arPM9jFpA3Zg6ypy5a7TsxU0qfibbpfm7HNHPxpK0Bxx1WRKJFq2U+xlilGXJhdxq/PuzyW+5W9+vj1dHN/I/oUo+ylrvTLfR5eBCrL002O3RzrubV+ZEhQCEp3+biOjhiIiW+AwgZs3tmRBMacAwWU2MIpAiOlg6bgYmpWHhk9PUBrh6zaShUfWbDjY4ttjUFt2gAxwHdOmMJDmKtcC58JGEoISQOqJa7pQoyZxzBQObpiwA5ydomMreqG87lsk44dXYfhixrFaRVDFqbMGMnJsLtL2wSn3A3v3q0V8AHeLyaNPluFq3hSbodk2z5VCaJAuVIpkgIm9qduLkn68j7rPO9nPdJiFC0tY9c0c0smzNtktelS1vrbZYVMZEyVFijQ5ST//uIxOiBoIYfTa29mqv3Q+m1t69VumUoNy07oYWRsmo122yrjVe1R0h9H+qUY4h4RHfR9GqT82M25s27badD8xZtM6UmTOEAAAAAAAnOPB5QALrEqZb7dzS1hmUBGigQ0WqJDGkDAB1RwtBSJDqqpoQ0yVhRo7Qlw08GEYsHuWsmF1Z5FqNxQOjZP+VXMWZqIyhNwplMierLFHDAhY02cMKQPOs9U/YUai9JaKAVbFn+FRZXeT09S4T/7v2aSav7emT3WMSb+PncwVNjTRVj87JVv7XyUDNWZFv4jumtXqd4rN2bhOMjZpqxEL2N+xUr0msMctVb/f7ndsalMY6QNoQ8BEbZZwdJnA3dJ7EFW0Ls2SGC4iow2eiUuCRPqQTkgUyZG/VLT74atka/jcqhfUhK4wo9qpFumV1OnxCjitkaJIShbmGayoRRwq04ahit1b4wCAAQbvUDGQgqBIWBhQHGAo0ItgFkQIewMXqLBWMBURDatpM01lgB0doGigxhgO0ioUC7CyqBvdfjrDLL6lAzDsnAQAhFF0nCZciQyFmEBMPaIADVAAGj63yLsmBfwZURah6ao3usS3teTGfXLfC0vrdEUhe6QvcZO7iCJaxslruYmOKqmNuHPCYaYkR/y7eMR3JSFHcPh1nvaQs/W3PONa1H2zsV//uYxNkAoXIlTa3pM+PRROo1t6ck22JlQ5KS9wFakir7V6a5tqL86WwSYlEWhQvvSQCUzr9MTTatYp4q5FLM/zX3eZVuqLPpOLhDdSaxOlbY8Gv9r+OwdkZ3PIzV2UcvG59SogAAAIAABd865zaEUKUCKvjUyJ41KTQngOLmgAFuEwh3xgMAyTDEpMjHIfbsY8qIjSwULELo2m/LK/pIw1NDws1qCBCUNctDAYROlIiCNP7nYCEDxzGA+AbVpGKlj5EFZ6ZTi3HG40XMTy6xVx13nywzTJNyvDKaO+P37ZEtFDGtBKEWCCxjK1SFPhtS+ILhrCe3dljWEsi0gRbZX9Hq+kyYH5yuaxWR+coytgTC21YILqG+5/EPq4XK3iawpVukUXod5dA+5f1v+csYwYc1ihcrbr2izXO+sdr37HXNrOJM5JaWI6Vi6xdl9LNJm3Obj/7T7NTH1J+1rVv8ALAAAEBU+UdKpEOj7SmcmtCaGDlmotgswP2DT4XXKMdEDLwmH4dM2DY88gb8ROPMVfi/BaAVFFnIDfYael8XAAL+TiEoegZ2SWDeMOiIQxHnRh4LASWWOKs+ij5EXg1VTqU0zSKlR2bfzM5vU5X7I/xt7n6ljBsMYxqrMvcapymYVB9eNN/NXFi5R1N+1tjVJxbEL3VhOXY7j8SSNReRu3zKCjOqSaxx5JK4z80SeHnWlRD1RW42JHTy5OS2NGnqp5gWcG5uqUMTJzKg9C7oy5BcoY5Fkb4u7dPSkMliUa+o//uIxO6An44nT629mqPzwum1vK49sWr8qPY5c8dVqzDuF3rOvPorNuurULzudapljyqAUAIAADAAAKvBxMRBrnlFOUF6VBp4I94yBGL65hguqsOgQe8SBHc0MCXviGNUeWDMQdy9bRhGUCyQVAaBiIsnYeHgizBAqES6eFQ8eIYGKp0OAcYaGZkPy2kVrcWqxhqdhu5WB26FCmkqqb7VBd1vbYbUGRT1ulN1bd4XDzLaNWTA34HIO0VfHHU7yxYsBLOLGSRN2I0NpdGEtw6x5NNk2q1VF0i1ofUtCslulYIpWLK7DbKTaijWMmM86vZs8zUkO9XYi6r2X8aOb8cdaFAhbRQSTzxpdSRTtjp3tItYmKfO9PVy+6z+1rdqmOmlawN87Ood/pA7aKnO/0NKQn17R9M0lq3Ov1o0Ac0AAOdAOSiBYIyEiZCIwc0AHGQFiIKuSKWZq9QfQVhEHmQBT4ycSZXdgYxJAGjp7RGEETgMABeZEX5SJEcoiLc2TTpVISINd0dGgNPvenqZKIV4BJA1x5ov1msoxNL2EmiRxNTXYiekPqmCtklL1FsxWy2s+GopMVMffVrnMLLnB6iJTqUtGWUSXcYR6W6uKXKuK7OXPV19ozK30wbliHa37vymvO63H3K6aGechNARerYV91InMMB67VJo//uIxOMBoT4jTe29mqvrROm1t6ccUDnbMbTzEV2VYRQ2QtYVh0zc5NyqUK3P3MePnf+T/m1Bx8oGnP9PSajbH5BBTzqBucWcnk5K5ameCU416uCd44CAAIAACU7bItuYUVA02hYOMvFlNCEFAHwYMPMNY0L5ECjAEDqF2G8MnAqFmABVA4AkaUxM+KONiTj+XIWVHZbvblJIOowuwkeZCJNbjxggzF4FLaMfoolFMcUceXUZZ/SHCRUzwqc9jkjtVXdq/NSbWpfybfHLNiNrkck95uNJuCVAK+b72FknuF6N5kjxRB7HRTljkYYlEiOEPI9iXWlbesNNSut9OafdLzeIHjrk+1yctokOzWt+RW5EOSRChcSnCtXQdDLYI4EEKvAcL002KXQ64mdvbpYSccg0lxoUpmoWHklvLiw5IeLGTMMlTdIlku7ohFYRECQAAnO4yqJVEguLmBmxKRmOFZYBFhh6+HtFREKCwvyOYIQwzcbk82YsMufICgMjMjadhPysqLoXZ6QOkMHkIrQJkgJIjLEAj7MIeEsSQB0LkSiRyhLiYpyIbdMQCVLKO0CVHpadjbpu/HLWV2Tdzo8cWXcqKLWMa0D3Yi+VnSquNqxOX3qrWqaYz41DOaYFYsV8cMZ3XB5dm1fbfeYrvrOxlH0EXyeP67dd//uYxNIBnyofTa2xHmvuw+m9vLI9Zz1D7P7FpA92LYWUDZs7QrKZdadgtWrEfw85AW8aG8LR3m2cxiP7u27+mu7keU+fnp2PW33IT2fh1rttWZbO24F+d+/eON6szl3ctORdzKQowwCAAAAACc6STNF3iSuFimFgsYBHkjFAIYPjJgoSqmAhUHvK1AQgExuHGXx4Kix3IBBvotTLxwYbdgKG3c1Nl9YHuqGlYll0SI2diQGrpoeMUtbr53m0qtUTp1KyYWTyhlSrOtUc2mfWDsJud1qvf/j2fua1Waz9XsHa21OOahvKmjkisR58qS1CJ6lgXK4zaLUu4O7uKY6v6qA2/PbcvOSUrzEiou/V6wbqbXT23uIHdacWiWeNJWTxguvNJiMrWQ4rDWasxiE5nIbgQvlxaXUh6qMbvc9fxvfm6nrb4eKCXTlLEELzxLt5HyjU3w2tnUqilVJ/MXehDgANTzLIhwPmHBMYgAph8biEyhULosGcE6GV9iIUZBxQCskVVM5ABULugUjw6+4iOpdOTEgeDBTEm/cHOVCKEanFVCMtZWRMfKucjROCjJte8HJkMUeBuQueNy8BWllKDZqhtJ+Tt2Ou/2R032LF+vEGK5ch3tPBVrWcC15S0LLOPY3EtopPyt7a2MHRmWTee1k01uXQmrm6uVSr/AVBpCSBIRpFaeSpwYPUMgYfQAKTQmatuk206Xb2X3WEzOrImaQJn6w3DNJ7lVzIdghyguiWAQmyyeKi6SMR3BaNSmrP//uIxO0BnxohTa5lMeQfQ+k1zCZ1ZP2Dcrzy+f1s2WY6WQGLnkpZcROjizsXQbUjstiuzKbcNXVeizDagoAAAAAIKd9MusQAAzIARIeKXGDi4kaKgsyRJDMYSLuhZzGmAS/g6BjBovjT4GpMzaVmMyRpxUdQQPxg98O2S/bUZEQFERupcPZ34LNcnOCwQs06fQ7NWi7C0B0B2zCH5MijbN7LRp6Zel/q+Mly7fv3HwlPK2W/hqxyX3qkFyj7sP/QsDvaiLLZUMCqwWqLx7IqwqEWBs3aiJn+SEdWTKdV7ZqfO4rMi1vyn9ipW0DzzdspSrKyGA4LGuc5hsu1Z+iQ1Zuzy1DvHWBK0fPwjonQxGrJx9am2tsQUb32aUt9dp0VtuxObfbxdiZt60Vq0q7Xpcu3TOaz4n72ps7sesXstzn6kCKAAAAEp6aARkSMjFQcHMMMTSQoCFxzM/I1gETrEHMY8CugIwU0kUYnHTIQVzXaABoLEUZT2HjuO0bs8tltZHeKghDtQdASgyrMhAAhMyoaGm1lTGGOUQ9xmLmUAatYB0FbxdN4bRaK6VmNsDnlecvjNOfsSGe7vbabWZWyWARFqt+rLiV1lV1sMDFkQ0Qpbfs9+bOeSD9o3Mkd8EZlm51mSuFX75XViXVvN5hdZQrMnp30bXaV//uIxN4BIMIhS65lj+vJxKm1t68cTK9SZtebzoTcjTGMZek6pX2kI1V3wzip5jb8XTOkF08tPSteasskHWOXc46lRRZ61GshrjqdKRChP9/SdWIAAACAAA3/dfxCeBpIWE3hAhgh8hyNNgwVkt8ItQMG55EE0QEeXANIjr0Bf4WAm27lI7YaB3vsgUSpLUEULpSVErLi5AAC2YFh80FZHUYe3sjj8hlsMr0nOqDQqon9FMYIZrhWhv+UHflVj8qLnH77xYDnXrfLk3njKnPxwp8gov5OuywA/eT1PlPcYN50cnWSWrvL1WYHfCPqIv4vN6wr23x8sm8M6dn35O65lSnbde768w5NUir05WOYSP+jgtwhHqEFpRHNlYUlSWtEN/6xTBSaQ0jaUUvTonOuUqYxPt37LddudYnHq/KP7wRdB01jvLe8mrbazr2kQABu+ZgIYC5iIKFrUUhwcpDlzDCkPMLgl4hyAExrcMYCxi4MskjAcY3zfk14R62FlUcniaLSuZYqAAmilaIbbWiWUmehkZEPs9/oONmSrZKpsbtPS69A6AsLY9QSpZedqM02R8rk2y7+QHU5K53GprccgL/Tn+/FZ3F65BWoWLW9Td/JlUg5DMv+SuFejS6ab473cGQrXlWJKHnr2prqdgvrqWM9obU0uawz//uYxNMBn04nT63lj+QIROm1zLI8AZdas3XrC+utrzPoOL2Ppe+Wiv6OcE77FM1YbUfEgsa5FGF5/HeGll8fnD9PmmWnL7sNe+LqTtoYurH6G8xO55xOZs8s5k+u8/TX5iy2M/usz6HW8HvKoYAAAQAABU8aUDCwCMyAMOCBe8AkwqgktSZyMwOdSFpDMh5DdC4EM6g9t4JBxYmlOzBZS6b+EpkrgkgFYRvaK0ZERbgdTFms6VVpM/cAQlzpinvgY1ieidQugpKTMhQvlyiyOdNou/OV0Pd0T4LhzlrHavuBvsE87NWZRNIwWc0qKtMo9OYMLq7bG1jl1hHMR0Dng+qo9yWGaSIpFUu+660R79dOL6f/7db0tdDLF+YmUO8oVtua/z2Xh2YVWQzWI8o4utqajNrdtpghjlmt5KHw0WMkt1w9QUJiL6uWttLId7ZaOfm307dyCiFscbZWU0GuLoXGGh9qzV1puv9fXvrMTjGbV9T+I7ZBMoUUBBAAQAAGFL56ASEIMTCTHwpCwAFLKE9zB7YxoMZ2S4RWQwwQh5jYk/8+GC8hhowYSIhKdKoOUJaqMsXFZjoGHalleUixLAiRE9wcCTIgSQwyYyGU0OEIFDkvmWLVKcoBru1oXazSLcJgNSBhordX29J/JnpNO/lHWp/uMx8zyTFh1ld0yoUFlgIrcqsxxYceH+fCX+A5GZRe0GzU8JBG/Glim4sxCTibGXMChViAdYs8yTjbDZ1tEoZJpS3EKmMQkq1AsO3M//uIxOoAoc4nS65pkePhRGo9t6dU7FUkfA4JmNleJ00hn73da9qxuX9/yRp7lpg7G0zNahhp/wj5K+E//LzlH5ngz9qcF+6FggAAAYAABT8WWIIQCZlAQQJ0dDB5GJQEXuM2nEHMlmxUlBQfpQFgCZ6ACeMUARAj7RDB1i+FOVCZOLJRLNUfqVyDRirEocZmcDkB8ev1xAEOsNbRyjSIZU/4XAq8axNpNTbCUFIjxIeBphHZyI49S3OzTT933c/KCL2M1Y3HR4Hf9JzGyvG3tutNnMLvuYNItXBwJA15wFCstvzhmgOwuzt/NsjV+YF5TEKbi0MQekCeQRR5x0knbptJAiU000vo/GbKchF6YnBoyrbW9FCaKUF2+kj+FHyGq5wX68KkleLXc9+evJj5fv/Vl0pzWcak4WXOaewMSnt1PKRjj1Mgh+QXky4rNgukwYRs8AAAQNzwy3YYEzJBQBFICEwQUrDp6GCWIKH5UQ3Q8xtZJAwwoVhyWDw3blphhkyMiKgpSWOirlUQv3TOZnpFTv9DxIeTRTKZR1gv9LTDYlknQQwvGcdabqIa2LTqX8KZzbjRHlqzMS78bz7fnO3P7KHq/q+8eUMj5jJsMXCu4Re9gvJzb8ke7Go7me1Kc9d5ugpueTNaB01lXTUXbVItb/i8dtZX//uYxNgAoU4XS65pMevMQyo1vKY96FE1zvmV2S4mnzVWdZmHmpZOrJIWVTb7ELQZM5kG5TKOXtFtzul1br7f88z7lb9uvi+2q03Q/eI5yu6qHzYd14vraWS3L97JaE7aEOEqooAAAQAACc8aWHQQAKJDiRRkZOEpVKTSk4Mnk1RHnBF/HG2FrdZ8NhgrDz0jh64dQqBZMpMJfKEbmhCPOp1Re9XLAuLB1pJcwsWlbciAfjtRwGpXoMfiYrjwtP3EGns6oexypUJPeitxl5vJ7xfJfwhw4ulWmh8oPa8qYEMemNHUuasZEyNyb9jD8IU6Ndfmzh187ukTtVMRw3HiH4nU0h3ZD/pGgPYamhXPzDGvZehOsdET3ZxljK8bxLH2hnxOxAH3pFlZRMtaxKSdXs/l+q/uMvL9P+DT+9ahV7D0976856ulCXtNp6Veox1KXyEMbp0CU8BAAAFzqDIYiosZ6OmShgACQacrsQnhfgMuHEnwraAMneIgDTBiJ9awJCHki4ILHq4wVTR7qOyyG8qoyjXpCwCqycHDQwSlgE6g5bZAAjFqJfUnlL4NzqdImLFKIx4r0qCtm5Hko79h5+fnz3p1+r/3Xqw0ollp6W+3QOvymZ9LPgOR7pJb3Tnd9WSfxj05uOyzHF1+5hWfLmZ4ezsT1TaO+U01Opfi2ycBuR5aSjeXARo02ILFs88g3C/kEkf0RPsqe5UG3pH9sih6lPHVqmVl+qz345nrfEzKZzGRTuIiSGZUrvpVmuum//uIxO6AnmYdT629OqPexOn1vKY8peddFlx3ZMwnDEoVUG5DAAAAAAAJX/DAqAmfhBj4SIiIxAwJAZhwKjyLRgcGvwHo3PXIZ0IupeIRGbrBaBO6kKrRqVWKu9dtFlGLaTdIiVn9I8xVuwY6OXwuxtKd6JfLKcrPR1itc7dHGpn6SVVBJKFpGNmQ58pMe4xTf2Ne/dF7dpB8y7n/rub/wd8RkVmSNTwm4G37M4Gzmpbz5v8oc74FBtxztQLa7mij1Ggs3BwbYpcS3h1yGeXHQU8WIY/Dvua6Ha32IZmIAf5gBXwaFnDRo0oNSodalpDVcLFV5CaVH5xMluJssT9B3nj1uRNDC7KOjJjc+Jesi3iRjXGz4zDAAFzszLTCgHMjBAHEkGgUxiL4sFgIYXjJhQGryMCh4jHao1HgxFvfmFgEv6UDNxMtiSGx7cmX72kBqCZlPFSKSbUcBoNaCwuDPTUCIwXHiRrhpopdylmzANefrKSafb0pcyr2E8s0dr4Mt4UEZ/VP3jCeZSWW47cn6sS32GXs7JFIdxeenoWc0e466+dZ+8tP13GNY8cNcKE5mpUoHnMLuj9TBx3HRaXNJJprEPUkbkdxbtL9Woz9PMIoXwarEncXvWUmCCPtTNnpDuqM4xrr+rY3iZipr6ZwSTiB4bWqvfCh//uIxOqBnkonT63hEePmRKm1zK48tEljZNWKm0VCB6bp5ztjzrl+YcyudeKDAAAAAAABTusmmKBIxwIzEgQFhmZYBhgUGiQIMeOM0uCUFDBJnOGhpM9gJhAKRSgIQE6mIj4RTrEA0sbVEhthijuTdrJlkXbrPhRXJWHNSyqN0Ii1W5i1onGUCPJocYq7BqhPavKRY8xSdkWL1X9R6MbtN9/tzk+M5LLGrNrCKz2cMbxm4dvTCq9SVwxlYjkH54setfBXMYxrd+/9B5VhmeXmR/k1RKaT89FWgqHkuUqC1YgvoUbQcx2OlDck0+RAuAwrmnKwSOwHsyjpVUpOZmPp0+Kv6pxQXUaIIkD9BPWMJIkYbViIiFIkmMINOKWdwsK0tRTDHziMDAABABN6SSpS6xvYKLFQ0Em2ohhAmOgJqlQA6YFAAhwzL0BZcOCEZpJACgdJmuQhQ8dy9fLTbVUKBMjxHQ8aBahYES7dqPAURrvgSFTWo2hwKwKowkOGKWs0yR6EYdDlyH0NtyVISG9F2k3JH8IXupUJ3pCEFdJIH4Q7yXvIulvbeRUjYXZ7DRXiscLEkTMBfdeBHxBgYWJ3TVN4ui+M7ItGCp6e19d5HPdC3te8Tzq1+h+FNuUMp++UWyzqSYbo3BIR1NNEaYm/s2zTOx8NxetR//uIxOYAnzYjS65hEevdxOk1t6dU0tf8GqyaOm5JmnzncmE4ZKf2a2uzCtMurpW9+JNyyM6VxpRtXKuAAgAACAnupeSgQhHpgsrBUHiohMiHVupgMBmDKIYtB0HmBDmbWDiZsWBAuhMbCw6OuQKKdXnr39QhVWoSXLvz6bpO9/mwg01PVBx2aU6wSLE+3RALEOK61m2BWmmekaBXqpDoSIG6mgnIOpwZ/w9dQyPvGhfexbmRHvYvG3JSx3F6+MTbTTrDOtxzXykenHZeHVu1Ed2UCzb/0TTc73ppXFecuPJE6uaVJue7m0xhBhqfU67l05vWa2aJdfeWxPNX8mRYJK5dQjVxy2uyjdjx7upztIa3gcjcXMdR9ll5fjN9s9rzOf9rONQ0y7fZ0/RFe7j0LWew1zAriAAEgAAAB7rDkQOWoNOEWFpCCjEp+FAYHAsxK/jQwCY+YSDxGTUoUJxhgQxCODiEihoYeHms5l+L9kdHs20FSY+WL4GpobawTkvLGg5WYwUDRZtt2SjkUoShs3S77FakfKGcW7qBRCcb3l6Yy3MRLvY/v4AqZtEnt7sfp3McabLKVvzXSBtAwd8w2pkuDDqCJHe1/YzGxlehAmk9sLE0W/jv630sfM1W+ut68isMQZd88xiOYf6CDanj3TSSRb6HkcA9//uIxN8AH1ohS65hj2v4xOl1zLH8LVgltwGBSx0Ol8SaLHD610KbZWHqswZTK8y09LUVKLpo1PLHrczLkVPblmu8xk5H3vf+Q+tjy3d//0OjAAAgAAAFXqXCgGQihhI6BQhWUwBfFAhPY0U/DTUoBjCqA9gDUggLK0Nt2tgUDxgAqkUeuwQ2btOo5PzBVpD1VJ5EqlJIIU0jpkc43KBXsvqUESutgp8poADkVUQlIg3GykwJqUpd5Zw/vlA9uO41/vmlhHj0vxeXDHUIW++F79Ey3DMzVXdrhUIulJXFJp3vVlKWNlL3kitjhTMGTl8qx0nz3fva5ja3nfr6HVu3LJtn7fWlOzbztfaW3bwFl1oKN5da9UTjd3Iz6X2c1nL33+tnzN6zXqbCxFduvtVx+/3TzOzN7br121842/NN9u/f6bH56HkIAAAgEb7cCI9hC+KwejOYFIytQUARhWMmJga+wEdQKlr+EADMeCCQRIwMArE6AhMUBWFjAERTlden1Ng0H2bTcla5cMCISBccXyYUAkZjJhYTXJyJwJbVke6khsHBp7sAQAXtqpbrVfD3SV5CstmfPb4/wy0wamORvNTYmukIVdvHdlatwRFyuwwJTch8Vofi1teZbN5qb2/jwjfkuuHDLUub0cZobPG23qHEODqjjpi5//uYxNQAnronTa3hkyP6Q+m1x6Ndsv8KtZI2npSx3I/gSppauc8mHiGH1sAIFSBDRyR6yGoEcSmIYdS2xw5rGf3ffDE25M0fVh4609Bw7qpLrGM0MOdx1K0MIjUmPGDwvBXCgAAAAAAEzl3wqEBwQmGhAAAGFwEYoH4qCUoDLCxCHe5pLLhJ+uWIhAZgELLHcMEgmFREqKX/zJAhEXlciatfqGAHUcfXwv+GxxoRS5kYIHCDvo65r0rUaNbM1oqiLUmUVCgKBfIgeOxQOpzAas727jTX/3Zy5dkW6CplK262Np6fjI6LTPLvMZHfoVVq1xdrfYyq92nXfqcZFOdpp3Bn8l7oDnLjiPV6myZVmFucPP4p/RPTpQXpYjzc/4uo7NZmyHOp1ddQd3+liPbrfkWV8tXssj4vm1t+tWcsXrbXYvjmu9+XmGPPcu+5rAWXtp62w7a599XPrCi9hFzKpv/yff+C8Mt057+hq4gAHgsDguXUNBAESHCB5kEmITRwGmUIwZlBxfEL1oObNkKhY06IU+n3CgEi1GBhhQWnSwQJnUAyp7u8MKTn8Ui22hkdiD3euIRx5TLQmCGwNReTtIdaPEpBt77oGmAyCXhBWT0AUCKfglRuR40zfZ8lOrkxlqgit/BKPdhW/tlRun9TqF8mZzHpeW3KiQRB9j2KbiK8KSlTdvZyWK9Vle76AgxQD3SoWv+hXe0nZY3nnUdSmeTVq9V/4XKbZF2RsILdXqP6ho6Qorfzt01P2qRopsMi//uIxO8B4TojS65pkew9ROkRzTI8StsKll6m160iifnWnLXzd/scmfjln6SfzGZ++TjzzlFuL8+JfVdV85Ud17UMa9Bemq7UR3ambpZdZi6jgABAgAAFTqDICSEOMTEzEQYQAJjRimQscy+SBzQxMk2A5FiA6KmVkjW3jR7U9ARVGoa2WAIoF4/J4t9YwQEh6hIAFilKOjhEryohAzGxCN5BxHS0T1arsKU/adIHCcnqFuqLRCAUlUmZGaHBrwN5hTeStGwflbH5G6Rc7KZB7qcG5BlW0FMhEG5q9sHTbRmb1f7PUx/y194UbwHetz67j/F/kd4l1/BodbdFTmWn0w8fRSa5fk4cajWYRTjKLh1juVkFj74lz3VSdyi5elp6+eIq/u2VTrlp+JHF2u5J8MKJqE9yL5UuEF6g+57JpG+Kex0WteFAABACd7N0NEqwNLAorHAIw0yWUksZnLgptfoqay240oCEbCnpQNAsrlBfZKC2VQAoH47bw/AeA5B1EBvcBUCHnOjckifHltGFArnY5TtSPNX3HSwCY3SwB3dJtKsbpAsHsA/9+PjW3XtCzczd9dOrqdb8rFnZp20X+Jo/iOtpK+wtdtKOJ13vMU4vURIWmKfb91ZfzLJgttiju7X2nNKUcLDjPE6+Ubgq98m00Id21P5d//uIxNQAnqYnT629euPAwmn1t7NVRylbOlpjCDjZ0L7XdWLUs6hddl79rPPbS2Tnfkzlbyw/Lcd6N0q1dXH8tfXbVvB3Z34/W7U3Z7WFchXkVpVhgAAAEAAAAbvbiFwIUGTNCAy4PMZGQIbo3qAGOV4KZ7IrmAp7jZIICMpgiUGEgkujqCNLHq2isTjvc+U5ZV744Ohi/5YoeJL0XUSMXEZVDIhJIci9ylp+v1X0FAffXkbPcX0UAFDCLbS53Z72asrr29IpvYyn2iiRafdA6hH5VyWd/mLfCArsblMmC7jpmfVj6xoQ9iXWiiLENx1dvDE41+wk6uU6UN2Sl9MNdXiS89J4dyj+pMrJSe84tiV173puMM+19KR43dlbiFf01ehOrXgzYosv9rX6vfjUVE2ZUwzGry9x49fIV2Ups45M3rrHch7NavQKs2cvEvBI4AAAARnsRsQBBsAeaQCGIiAUWCQDQZNWjAF1A4BMD7DwQ9hylZu40ut0xQRpqpVHXFoJUTH0doGSUskKpI6kqS2IrvgWIjCp10wb6HokAbkQaSALUojy4cZgE0s1BxkipWqFGYMh4mfTZMh/UGd+7Ob+nt6uwdtF2vc9xNYNDu4P1RfDV/ckncI5M84yuen8Wh4wTlc+B/4QplC4jcjDOtBaEl2FljGa//uYxNKAn4ofT+29mqvyROl1vCasKdmIh7czZNfFs0s+GCSuxcC+eFyWv5J2Kx16i/SQkQBW+MQZ1SSxurFL9vK+VrVV4Shvh8475LuuFp4bbmxHlcgm+6nLsPvuvpY3jC0UUKxNi8pJA4BBJAAACd9NKRUGM1DzLQ4wYfMVO10F7x3cMSEF4gFsPTAVLhAAmuBjUI8YCRbMUuqOovsbFV4uvstLPp46WWRKpnZG8yaIoSas4Fixv5U701JF78lI6ulqEql6UL0NdtU6xMKaVX/t38dU+/sZaZ/T7bDJ9VHFw1DvbMEzl9cG+jH38e+CE/y5Np3/x/KHZuAw60Wc7C1TEYJ7QWyfP17mqOtuB+MqNp9UziNjFZ8imy5BDzxtSMk8S5lDIofVIFziJ6V/cUfkXbV+av3XZ4X0sbWZ2J6oNUkrGSTv8qjNUs1CEfHI4n7/10/98Ky1wKAAAACn7sECMMmWRIYbCYoJDJhCIQsn0ZbJw9YIGBwaJ20JAMUCMv2mgQBNOZLxQEoPsIFqxTNEXIpILBlKI9ZAiRZzbRjTLi2CqsLltOrXYgOOQHEWtXMkWFapCMlE0HZWPHsjAO3WnUXS5adSoV+uNRDdK+pntkrUcVKE+xFYYm4hJstpKIsstukUfEilZJLau5Y2mph1gwaYzW0qx/el1JjNXnkxr2xVszRc6+Z84XnLDDH3fetMGMy53WaPBh7remJbxpHPcIp76pS2PmSPv3v/8/eM1/r/mlbavPB3hvffDPNC//uIxOuAngonT63hL+P+xOk1zL20f3iP4FI1d+1MRYvk1Rsj+3l7hiH9yx6XgGIAACAACAXvDrOhEAmqAwkOzJooasAggMn3zUgdEICt564oyeOmKkWcGiIdkt540YrjYW8zpUA+dpMQrC8XpIiPB6SQKltwgBoc3E2r7jqoLN2AcqAlFIxVUSJg3b1r4aniOndN030a9soD3O+DWRBZemJqq/e9ImZXDO1jdT1r/e8Ar87R/yw/Mu/B6nCJz35GrQjccllsg72/pJY6qNEvLbx7hipOXp+4g1HovPnVjkKUg0h3oD6ufKjheKGXIwbGpc+x6YueqYlzT9vc3Ss5sqXSyGI2+3Gx1JKbPtPTLTsKZ5jeth5Gnwqe9lO18gKAAEgAAAXflBY4FjDgpMFA4wKAzLQPMBgEDAgwdFzJYRTsLC3MOjBhL6GMAzFHAATCZUUFWk4onAKvcsgcC/WIOJ9R94Bs1NBhsfSTJdtxckn1OfghOmlo4Kr2VJpsW0XE+fxLo2iDRZX4pSFqcLeaRTfy4g1OB5r5K+jES8wbcTj/6ZEj2/8hChyxZfyOOUNzcGP0JUVIFEpjHpjnoUWUjnGu6dsxFOodrOX0VxXhNOrWcPVL0L3Qvw8V5uwfnZooziz5cq1cpwI/cri/J+ld6s1pM1mcz9mW//uIxOUAHgIjTa29eqvcxOl1zDHsWueyKK0uxKdhno+btS8f166L/+HszNnP7KbanMZVDAAAAAAGeXQKhUEWsaIw0CDP6GBghQAmah+NgssgYKapzoeBgBe8HMZqeIBFTJIbLCpQ3Mbbe941XZjgjyEqI2QGIAr0Bn+I+dczk3Hol4kSVVhQkPA1uJxmCyGt1apVISDuRMeqiFKrfZv3JNqPL0pdv5vSf2duCqOgrNOp5TGqXckis3Lmh5WWaZzD1TVahwprSVtJ1o2sJTlVvOb9gNbJfiyCKslF6nTUvu5KO8ns+xPJHLRqv1VNy7f6lCbvbxcpdvKn9s1ZqoTG4F2X8nIuJ6bENY0xWOCj2HX7WCc+Gsv2ycttLQNONtotvhw/WhzFdC6FUvo3A23DEe1bje/3Y3/VUp8LVmWwMAACgE55mCiQNhQUDgLLALMZGVBkKgExc9jNYIiY8FBMmJ43DIgQeXY6I2m9FClJqWJutrIaTbpQCEejIyoIeBcWiC8RnACou1xEJb1FNPNPTcsyni7qr7xAJPK48KFFJeaZr7dn6eBedp/3LrF+ntfTQmcpoTrOJ/qUxbPKX2sJ7Dlm9hQtTq1ojzv/9yi9cSwkJE5olYDYY9b5EsZihqacrSZ9t24qL4uP2mKKsVimEha0lS2MrLF4//uIxOKAoVIjRU5lkevUxOl1zCY8sI0PqDm21rLmv1L/lOfioeqoyvP434+c55KvFGslTMoOjUEV0bWt8VGevO7uSm7qyj5TjuVsry1knpLCgABMAAAF3u2rWqQOwSY5S+MbUEtC45gfsZoCOGYNBAfdY4g0ZNcamgAAx6UAg4iSpJYPCZXFRapwQi/d5KQoFlY4INizseBwsYtkJzyWnQkN+CGKapCVSm0SFRa28BEbZoAO9+2UOPNp+l2txARyJzvsbLggdcuWqkLWXLtLn7t2BlzwztL/yvmdQeuRs5jNL5r2Vlx62m8/3ak/oWK1Li66l6ZWraostDDKSmQUm03dYrVJFKctOSSI9hH2pfitqyPn2Ot0/2v3vkXbBO/1sd3V/Swx1KUXv/RivMX1tqYK97vM/1v5dp3k5ba3lu1HAADQBU6YQiASEWMTGzDw5YQxZHFAZUwZHEYSiWBM464DZYIRE1sWWupWTDTiTAjFHclaHBPm/K6u6AgFpdiSAyhMtIB5OWWNLEkd76YAkMbrMabyeaM/uo4IAWE11vyHBsCeMcbumtboYa5upljX5/kx1g6M5AsW2YG9mA2yuk04GaTCDHc9pI1Q9umR+lpzkCSYD4sdK3yoWtahWu6rOZit57z62VrNg6ySd1LnJnGwc3ECxzvc//uIxNQAnf4nTa3ljaPMROm1tZuk96HOO9pmLS5F5k1hGLbLT7pbst1Hed9zLHN4+ZbFZ+dLEUHFTT3Zhaqjr8sVb/aoXrez8SnSEmnpUbeiAAAEAAAJPotJWF7zOIAFhW+xh8kMuCwGMQyExsDZcKQ4zsAWxBYCmjBArTNDQJx2IQCoxfKgGWvn11L9UwCD3lphwOQ/iQiIOKcaZCYsDDuykwwDlRSGNLMrNibPjAZMKpftB2/eXmjAkjBB+PcEt1q8Py6/ZYeyaRsjnWcLhn3Oa+6q2DHVr+58nhEajpxY1X91O07++uyf24x3umFVPm6utMO9ON+xzWqmo9ov520svk9h4AzcZCMyMuesek8iTzKmg8+/aYUSChJyNjwE6CgDZSdu+MQvfX2pQpr7//+rGM6WTH6kxiSzcebht+kkoUzNl8Xlqmu1c32snOq20E4KAAAAAn5tEIYDZiwQAYMmAwGYYJIXBKIhkhbg5rtdJYsAgTLxwTGGiO1h+AUDpPiWBdP6fxMHuy6P9tBhB5ooIzA0Lp0EQ2Ph9PwkVuhQmTPJ4SOA1OJJpZ+6cMeXpglCYcLAVQi4+g8Bxzad3vK3zOP6u822f9rxe/dBW5M0G8Y1jWgruMdot9c/uCg09vCf1UvdvLu/wHt8H9l8kNelETygW1u8//uYxNQAoDonS649OuPexOl1zS48odJS+ZPG9jVNWPK5i1RJ9Y7U4TnSgzcclYzUsRmZWypUJMi2nIvOfLX/x/0vX91WlStTCg0Q8msJE3UuhB1HzZajzYNVpcY+9atc7ntd7z5VCsIAACQAAAFO4yAcRABqwKLCisRgKIoaSAJnVgaiBIohfqNPBW7LHA48pNkYWDYelqMqUd5jRQRzN+NfcLNMczZeUB1IMgIcxUbdzJRqG3iLBvJZxqrm25lr3YKBQvlef9s1sqALHJj0NP3QP9teD893naatIUCqrePbZw/KZhWbom9QYmTQ1KK662vUhtl6WIbTALUeh/FzljNX57g3+vSWlHqkFXjSlVIrSWHYM7YH5T/h/Jq+WrnFBosrN5QGkkPFhtWbrQxzEV+bl1P3fw2buN1vXbszalVzc/mlXmkItiE2W+5KHb1n0XOfdU+ZQWYwAAAALndppIyFGWiJi4EDAcZP1KFAzD7oygAZGFao5MDcIYDTPCh3ZUDAaQWnYUZwpysFlO5nCSlURleY6HqulxUCUBG5SZEB2ZSYIBJ5YvW9tSpq1lBURoIbb2MQERBuaw3p5Edr53801960uqWMKJSAqv0H6uFs6ccUnxhf3Qopoi8lMSI/OTWpzfVPan+fSnn1imcVvvt2vi3zNciJoGSWAd7EmDBvFurjmR4KFyTyhtiBOJBzSLUwnGwEmMx6sWMoz5n5dzb+pq9h1QkZMOkylQ7rQ6ZUTPLPKvwPpzyjRVaGFlQu//t4xOyAnhInTa29eqOhQmn1t6Mlw4AAJAAABV690BAqCmehRlYqKFBghsVQBgRnJqLXsnBrcC6doQoEdVruSAzx6XRUCXFxWciSq3prlouQp/EkRjVA0knFisBAqaWSsCpQ5yCYTKqlPdsM2ilOkqxezEUYOxFKyx12e6u4f97fuMcZovKyjX3JqNrriFFVCNPwjU86/kiPROItdJ20HW0klS40R7Te0penaZud5fzYfmi2aQ5KT+/s21MQqS1FkxdmTiyHmntc+nDP7CejsltU6H++ov+j1k3zSk/WcvT56tK33IdtSzMWoT1af3MxTXu/6Tebz95e7OhpAPKo0YBBgAAiAle9amQiA5kwHA4ohUEmIx6/ZbgAvcCAdnxgMBDYaaG6Rl0FPmwM7LJhSEZA2fhYCwbdhnNuOBfCXFCQRbNBsGAEtM9YgHXjTR1u2npae/+LrXaUqJi99opQOXxxcuU0wmphKr/4Xv+X9/7GLVaLUGWd6ltbB/t6pqLtB1tcjIUuzcThuuGoR/unvplHNC71yVWjVNfPObduyNN55rOe5pdP+8+mM8r/aYOz//uIxM2AnYYTT63ljevMxCm1zDH96La0y7V7b2NQzMEwLVcaytUp9heLN+WrpOn8lqsbWzec79/f79i+aNxMVszWn32v4vzW9Wr+/6dvfbJyf7v//zNgdoWqgoAAAAAAAM7XkEYoGjHwvMNAoMDRloUGBQWNAQx8wTTYFQUMEoU4GJkN1KQcnHkdIcE0kp1tLfrKKqsp6IKgncVdlfoWOTdmW3zRyKT6PqbOCEyM8UbR+m5XDu+r0RLuJPoRctDWpike+T0se79aEbzjn7Z/dzbDOcgJSedaL9pZ23cj0b/bbU0TcmmsZT/IIZRerbl+NJ3KZg/YwMGULjorxUIeb7JE+47sb91e6OBUR/xSCDsdFm3WZyPai1qw/WLskBFjwbHwIxWPqzRtLCTA7kaMi6XHJNOOJagylLSuQpiDy9xgsPp4dopFFyrPVSBVnYVPhscpKYAKAAgFzxaHUJQHAx4uKAw2MoMIC0EZnUwC1ZAIOU5hh0rao8ZCE2IoEDxWGUM8NE+cArVzj5UE4vZLAiVjlOskOE32jwhI6s0QCjNqcZCGD35aRCtBbhrGmHQZm15nocGSyqohFYRXFp9I7w3seN11lStPXKj/NxyhNkbcZpe6PyA/MOZrQxppp5RIFT8PmnS+4aysbgIclNsKUtdUaxv5l/le//uYxM8AHy4nSa5hEePfQ+kpt5tlV1/JmfGGfytUHD5AZrE7VDxiWPls/r/X4rVwkg0wtlRafpe2kly4cU/kbHyWb8v/GuHx4XJ5BRI1ImfMnhJOlFqmiPVJhNk9aLR3x2NSLmHK6gLVYoAAAAAAJc77qLFQNiIaCgDBIdMgIdBcFAMCSQxiCGDmDBubyAxEBWnGGgF82SidxeN1JhXn9/k0CAQ31UlCZMJbS8C7VtnhhIMT2AjBzJJ5gSzu5kwOmLclvWn+fjNuiE2p67j7iBboUH8QsyOaJ7TCEU1H6J8rPbdq60h9Y/KFi6fswGMtFMj3fLU8e/UhUyAbewLcwrzN/7bbsMszs1jm70ri/Fi8i3lTYuPV8qPzjjMZz8u/NYsz6pijARb2g8IIt81nzX8O9XmZ99P739PYtF6XZdlMHpAKTkgmlKODOzPKUGN9mZzDaqUKmwYAARAAQBd/o5oJDfAEeGSUOAtUOBAcFmH9htQMsGYQ2HnEaIimZk4i97Tw4hKBOMMZGj6tVZZ3AMBoRdGSNCGkZ8RDkVnzKxW5KQSAqhpqFV1aAU+KLr+5VXYltmeIha1VVTUJA0NOTn03B+XSrHJDdqyPlLhLrJIydiloqZhwpaO7XubTIKW1QrmptbGe4XPcob80H1fchmLi/8I2xvVFsgglQCutHmkUcs3XLMo41skVKEMXoNRIXU6UZg/JVBMxM1bS2o1m9yEIbORtefj30+kr2TFm0U3SJ2lPpH+i2W1OmI/ujfbn//uIxOuAHbohSa4w2yvJRGk1tidVW9abCcslcF+IYgAACAAABc8GJUio0aGVmEgAgCTIZEEBTBjLxwbWAcBha4MrM1oNxOayblRBFFKzXA6KIwYw3PwALyVik6QcYS3DBZYSiggiH4KMoeW1y3EDV66quGD1ZRAGLUWY6CTBe2NOaWYrD93ui/CHv1c75B3js5nB6vnucnmjELsiVvpa/DTl4P1TjtbDymLyPJXV8wOEdNX6Vzr7r+laj1W7rbmaxEve3xAEa3GvYUo4DB+0BrdO1XHb5ZfLa6yxyBg4nC+dWZtKwmR1W3lx753Lb1q9jW5PzPzCqi12scr/WnDdX2IIbb1nq/mQ1tncw1brNe7E9v3gq94EAABQABALvp5QIw018QCCN8DKFQu8XUMx0TYAN9yrMHwh8KGBYzIdZZCTBx+HZIIg52Mb6JfLSAajkgADlXVRkNvzDihzBIV9iSVA14ZFmresHPYQQ+ViPjw3Fay/Xe4z8mDEUfo5JcK2uoSp+r+1cYN1aoiEJ13Oaqc12JtvEPqnn3tdQexjywk1TjSF7yXCNsNTapcX0zo2iyo6nzy7KGmWWVuducvPKRmU1L9PvepccetXJKsw032onlh7+v1QhRtrszclrNJSmOTZ3X7OMx9lt1qPl/060u2gw9ao7ezk//uIxO0AHv4lSa3ljeP1ROl1t7NUcFadeJl6X3bTr9NX0go5b7tZf7Zs0paj7dKNqsCAAFAAAAXOyxc4yGzHQUEgAiAYNHaY6SBhJvmIwSQgQwgfDgIbMQhMeARnsAs3gQDGMXg00RhLC8IyUVuyW9S04OLllOVC1cRQkAG2WuMJOwpxK5Ku5cvUNaHUaJFZYzMthAlVH57KEZBZLNXkob1dytcu973n8l9Sw/Xa7K5zdW/8ofn8bN6u1udqSx8/ye3LTZbXKKdyvX+12D282kXOQRaz7ayuS+l3Tc/PXNWeatf9Fu9Qzv17fbs9nyIU+UBWMJii5jFs9Vfzyq0lTGtuxZ+N5bu95dhrK5FcPt9wqd52j/m//f6wufl+sM/1h2vbs7wwrYa/eO+yvuXKtXO9cuXfw1h3PDPeWvyw5hn2pwUVAAAgwAABEASX0/uAgEBhcAomE+GoYlw+5gDgSGBqCYYCoJxh3g6GCAbAZ/RJJg9hVFlDHjDyMGYLA2rgmjBWKFMFsJQwqQrDRZNMFEs6UgCqfjAAVMJA8wQLzDQ9MIH0xYbjFAXMMEQwYDQqCDCIWJhGYmFxkgZGYgaZ7JhopeG6oEZOMhiEWJeiMGGIxgTJMFAoeCZggMmAASJAEzYWgFGAEmDWI+MZjwyGbGAxR/kQQEAQ//uoxOOAImIfTbXMgC7UQ6hrPcBAIASEDiIAye/ON2YatQxKNSEEjQeWEZYqskiLEVTKFSnj7LDWWRXYbtL0jkWaw3CMP+VgwMASBgsP0E4iAoiBwKBwCDBZ5YZ9X9TllVNDToxXYcFnZ777TspleEeitWuYXCjNg4HQMtte0YbRYdWOEq7cKU3G61rbszT/R+IxWM1WsQwuly3ZlCerxu3Bc4/EcrUkWpggEJzIJwUElZU4U9F02mvuunxKFVC3LFm4zU9MuTFZqNO1/6rU1NW7NTVmftQ59PYsTnYRKsICdv5bN4TSsC/HIa+yuOJcLIU1TvZe19mDUHAdNk7tqhTQgH/q5ZRLHGlrZU1WllNamhqrSxnIgAAKFvfgAMhKSQaiSewCEDZwlCMfQrYjoSmVkTWoRSSoWlRSCIZZWFQqwiFTVilkiBJlZE1cY5UYxypWqhaIQRJcWRNbUpS8cqWSl4xpZFHylLYoUMooUMfJEiYCngpoLUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxN0DzDTZK7zEgCgAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.60737503 + //_tone.Alto_F_4_R_ + } + ,{ + midi:65 + ,originalPitch:5600 + ,keyRangeLow:56 + ,keyRangeHigh:57 + ,loopStart:20916 + ,loopEnd:28115 + ,coarseTune:0 + ,fineTune:27 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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' + ,anchor:0.10118750 + //_tone.Alto_G_4_R_ + } + ,{ + midi:65 + ,originalPitch:5800 + ,keyRangeLow:58 + ,keyRangeHigh:59 + ,loopStart:27323 + ,loopEnd:34389 + ,coarseTune:0 + ,fineTune:15 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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n6/O9//JtYYyf+15rD+xLeH57u7r2Narbx3XtfzcJ/8Iryr+tVuTGVypI5zH//uIxOUAnq4fT629eSwlxOnqt6AEdW9zHKfrX93/1/ef9H/43e5dyxt297y5WxvYUln/zvc7q5r8LuVjKmx5jrP+67rHeuY3Le0AAAAIAAAMBkuSfUBBydbAcYPjQb8rWYSiaYWkIaXJibjJyZDWEZqjEYsjwZGkodUCoafKcdECOaHpSYKCiYhB8ZRbxh8OGXqcZ0DY8FggogrBmRi+BhUISoYQVgiJBkgJmGweYQCxuojnF50FROYZIJhA8HinmGCkwamTBAxMyjgwQEDAADM+D0wAURCJDCQRJAYpM1SGSqXioPgwKGKAmSg0xGFGgmAgYtZXyYE9GU6QsBxILiwaSugNji7VTIMID0fCAAtxMBgVrafKlwODaaLYC/61odeOSxBN8hBKrH8IQGteHneVWaYmISAdJlQVaiEarGHsvGgJAKaIkCJGrcXhcZpzWHKlb/QZKorXsdSVhhei+Isnm/sGUs/SzEvgJQRyHeWoxBqUANoweLShnawKnbT5a7eHHEsSiBufHmrZewZRdijJYCdCOQTHZfD1PL5XHamTO4fbupmy+BVh2Dskfdt1cSC2wxlkUYd8lkVJHI7ZkDwRu487LGs1rDMZFFpS31PTUsJh+auYwXMRq1DdSGaWSzEIom4JiMEe5YRaiscANMTDeeoqdTd1//uYxNcANs4dTVneEgLrP2t3mIAB27qnYO9rA2DokxOKEJy225kkiCDUGoik09LKUkg1A6TYjoyJQcg1BqDUFo4oWDokVBqDUVFRUVFZDkGoNRU2GYkOQag1D02mZVJFRUVFRVW1FRUVFRUVZm5UVFRUWFhYWObVWFhYWFhYWObYWFhYWFhYWWChYWZmZVWtmYpVVV/ZVVVVVrlVVVVWvlVVSWZvlVVmZm/mGZmZmb2ZmZmWvZmZlVf2ZlVVWv5VVVVVb1VVFRUVa+VVRUVYKfiChQUFf4UFKkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.08437500 + //_tone.Alto_A_4_R_ + } + ,{ + midi:65 + ,originalPitch:6000 + ,keyRangeLow:60 + ,keyRangeHigh:61 + ,loopStart:28901 + ,loopEnd:36197 + ,coarseTune:0 + ,fineTune:17 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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BIAoFQAgeAAzACABX///////////aGwyQs0YfImhsokzaNLkTT2kQlpjc4Wy//uIxOMAPonzTfn/hoAAADSDgAAE9uEILyp4AEAKEIAAoWAAAsvKogBQAgvsoUBAAkvqniBQApCck0BAAsvqkCBQApVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.56453127 + //_tone.Alto_C5_R_ + } + ,{ + midi:65 + ,originalPitch:6200 + ,keyRangeLow:62 + ,keyRangeHigh:63 + ,loopStart:20411 + ,loopEnd:27514 + ,coarseTune:0 + ,fineTune:32 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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' + ,anchor:0.59565628 + //_tone.Alto_D5_R_ + } + ,{ + midi:65 + ,originalPitch:6400 + ,keyRangeLow:64 + ,keyRangeHigh:65 + ,loopStart:26043 + ,loopEnd:32549 + ,coarseTune:0 + ,fineTune:25 + ,sampleRate:32000 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAeAAA9vAAODg4XFxchISEqKioqMjIyOjo6RERERExMTFRUVFxcXFxkZGRtbW11dXV1fX19hYWFjY2NjZeXl5+fn6ampqaurq62tra+vr6+yMjIz8/P19fX19/f3+fn5/Dw8PD8/Pz///8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAVAAAAAAAAAPbwcKWq6AAAA//uoxAAACVwBS7QAACR1Qyj/NYABCBlSJZAKct58oCAYc4uD4PnFg+/E4P4gOS4P4IA+/KHIn8/6wQDGUOQff+CAIAgD4Pg+fKO//B8Hwf/8oCH//oqBAEAfB8//rfwwQA4AzQZosyQAJEZJLdft8rGJD3/EKNrYXphywIOIlvoJY0jAQDS6TDWEMwmBgovKyhnjBAqIiIs5ebkLmbAvAQjSEM4IYUCahqmSxZpKJKweRe9zPJZU7m6iE+NRdp0qYCzB72wNCf6WtFd6/jNXs5HBWMVysbrOFNy+Wz0hhiLULjw5IY/H3QldaUzDuxiarRSTyOF2qCES2UV41EJFlesT1JT4d7Sc/Ld2ES2YoLeW9dtVLO7r60lXDcNXuWbNiS3O28L+NvOthjvHDHLeN6kv6zsSixYuYVtXd2r0lprW8OzeU59v6XPKrncllvCxjf3byv3quXOay3XsxmtY1zCkps8+W6Kl5XpKW7Ww5jTWvuZ555UW8MruF6wHKmEVA1hoQEgO3da17splRqjxi0DQLWoJMmhBzuk9gZhqx4DBeNMNBGXbHGDiCc2DH9Z+YZYYXalcN25iczhuNu2/9+klnJRSbp5W7b93Jzu9Sy7bzzp5zmv3nn3//v//17efda3n3+4Yfn+/zp6TDX54frnd53VnwTNhENAVDUidcgY7HFDLmRVZqIxz59LnoW1BpATCwsEpGuHGmX03i83dKFA3Fg/QgUuxmgAgDghCApJd+aKeGHFdyJrYM35CKlceWUS8jUCI10wDhFV1IlsaWLkRIlwOAJi4kWBAHQcLdNVThhQSLJXy6UrxMKiKlV0ntbQ+UdxuzwyQCJR/pKWEtxFBE92VLNkDgHfthoSzpGpwbdw6wdrK21cAwzcLeTPU5J+XSdN1HBGQ/Ijb9ylDFK0pvKnYf+CBjKr5lcrawYAyN9FZpw2kPZJbyS7BJHSr//uYxKkAFUzhW/2sgCS2Q6o9vCa9ptPjBbbSl+oYwiyGjMnUjDuNOgGkpt2mGw1uU0+quWdSej0szrdiESf2te+ah6B6eNVog7M3SY5SSNuZT3KWtykzjWphMN7cEzAoJyJcmQtNwSZUeSJqkZUN3UIKmyVpq2COlG0Gk/QXE9J2xnCamVkMWqc6UVtOcapmlflXRzxvcuU0myegAAAAQAAAAK3FQJkxkteZACbPSP3ECcOVnAPeeIjEXvRgdCmcrA4UTCRlKpSAQId+XfDsPQoVQCyuKVmVNZEPVA1rEvWq3Q5rd+a8apMBYfP6cRk8WIi7wO7WZ0Om4EcaiUdmhw+hHOzMV415vJrlBk83NUMOsiElNJKa0liBWDtX7F+BlXUFBagEegodkFQud2F80RycXf323x4e6uK8iK2vWeltwYCF+XG+4b36QcV/weyo1fPXX80ejnHvBtl7utfSbcGFfSayiJ9AZGyTl6PrITr4mOb2asY4u0FXzQqzJnRdmt0j2mpsqZCEzFT1nrSkqGoW4i5BUNpj4bdk5O8o90INbx4CIopIC/WYsBQvUVACAYuYEEqekNw0lOYyO5kcGsYp7romEC+Wpg0dFphsBDA02CiWP00WIsGCEUXlcMuGYamCsaba9HaWHOMfKGz5QFFHBLwS/kofNpKwD9zDxweIjIkItWHQla6SJHSXaPNGeW1sqb4rhU1AjxoA8qnaZkal0rwp6+KMedPfqFQDhOZX6dyL865dessDKqfC/KaS//uYxNKAoPIfTe09Pqw1ROm1zSY8xT+ibJCTZskkYbLg59hvR7D/sZvsVDsppbm0j/FEsTdSTNS3keyTtGGeNhhowKy5uAONCgkBMdxvhcTgnQjbPRDySBFAvYhVQq9CDqAueluKNVJtmpq2nWTTTtC2q6a1lZ3kdXSjUIUhkmnqLpagTeQAMIECAAVuVg6VlO7igZmzaBs9gkvgtbBg0ECTJB1m2mqmMoiDCHNMEueQBAGlXNv2cEtX4V3Loq6YUBxqDbK4rioFEscWQ00zCDwELy+24MRwV69r1SWFigGRElO5U9gh0Jhbt+BeKqvPW7X7EsM4DDEC+rtl0e4PzFFZCP8LOGtMMcwSkm3E0uIlU/LCHdBhL0+Ir/HOHSgtYibX16eqU63+Pyxszl7zrVEIX999YR0ed0TnN/oF62c/zz+ZhXlqbrnXidRc5ZG0eG9ap11WodoupEhsPsfNo0Xwex+txV9ieXV9tttya0+9Mpd56ce1yt3odcrvzqT8o7Z55zk+AADDCAAAB3aMrbTP6hOM4wjbQZasulzSTUWsDOKhUJp1DDVEshEWDmCBYkCjJ4151ypZJWmlgKtBktLAkBGKiFINOtrcDqwnLriUl1o7RqMGGIRS00VpK5Frtg7K2lyEeYwy110cyUIUEqXsBUyNjNss8a0A8u57kjuyGZqWcEweX3+kiW6JVSMzVeXqhl9NVtMbnNRuX1kGaTU1aze+trOxwPptX5L/z0wJb7M0fnez/nPpcZfDNViP//uYxN2AIBYjT629nGwixGm1vTI9q5iEozu9ue7uzoWd1HpIfZosdtVcJ/p19mnHV/o1zj9WPvBfaOXdpl27HkFHL9TOrAcLn4b/LUEvvtRxUXdDy+7kXWhs/rp/lJvm2giBlYABACAgIAAALciFxZ+YeMcAhheDGPAgxOKQhk5mQHlBmcR56RkZnsUCIHM8QRv4FwKZpATH4xTUqH5MCW0gZsbdhEjhINPqyduSM5i5Mg4lvJIoZZeYhDd/tO+8JRqtQTOPGnYmrqBq8ySAQrAtbdeKCoCeS/jqxLM688VdKTby+UQq5MsbAIONuInoyIE4PF3S1TFfS3abAkrXhaqmqxPYqGLG18T1X5rJU+Yplzp7K/M3sQziaT5eH/vthXNcnPPf6Zrf79dgtcVqWJFek+cPy0TZY4aH5eu+knHOtFjbVLv8pvt5+Bc+ias/RangXb2q3PfpVZeHN5/dba3ml8ORdWswzbWmH2IMEAAGBQIFXn1HE2O9F28NSCG5jF4cvN0NHoO4oBIFYlPGBOiY866oyBX8METSFHFmqCRkAFMySSzGOBdiDDhpDxQCrMZJFBAlBMTnJsw4OzxgtwIqqyVdodrKS7g+Z3D5ADKu5umgRw29t/nq/jnuMdk3LnKmDnz/1ZIp3J6+OF9Dpfv56xaNYr1/2lPf1UnPm8KnMQg90cOOEUh7lxwlFkVwfqb+uX8gw3uEi+dkjy2WRuurja9Ck1CZSCixKHNypag1uOHcln7ZWS7g3Y8lxHUu//uIxO4AoTInTe49nGPRxOo9ra6s/4b6FqEw1TfB2bioIQ+my9aYh+NbIPQhb+Hb2bLltM1HrrEAAHBQEAAAu8BK5jY1MwEoaYjbgJdhrOVLAmEvZlhWDgpBHqVGxgpgxE8RgQECQkQAxpgaySN095pBWBTksn5gElQdEKJQO46/DPyomWHHZdElWGGgL813ZoLjf0MorYwERCV+Ie6xCDMfrzs1ESUDmbmXb0z3O0fC3lsiXil004wLlSZEF1drFmct2rBUazlkxwxKZavRcR96w4Iyv1+lVHNtuyitkzXK7WW5neaE//vsAf+t/lqPc2PW/nqR3s8/EX5SfRwduZi9YbLHk0l3eaWtuK2fls4h6Z7s3ua35p7SjbXhOnKVZPC0o6tWJnrtcdO+5NUHIP2Y//qrWPtZu+gAABgYGU9zJwkCGFeIJ7mJV5noK1iJ0LIjPjAmb2oyLkTNeGjEwm2rEreIwA1UTYtheqkowTALut7Gom4xNKKOOfaWyFZESFZO+81AQQIvdUjMAPE5BbbLpFkKeJ+0cToa+7w4wQkp4Xxpg3nvLl5zt1DwX3ca8VIg6IvoeiEqLFJJYW3iiqsCsDi9yPQvME8nNYh0ihocjo7e3UIm0pjH1pXyp3Q5wTOTWuC5Ri2qWn/9ivDHWcUUrL5eWNyd//uIxOCAoEYlUe29nGP+ROo9t7MUUKZQX0eOCgOBZ5bpJJ5tet1S+Fmzi4wj21a216aOu1vjTuY/DzsVtYQ1jlPxfvfDcktzSjNNrmQPxVtPc7WlWq3QAABAMAAAAZ3NhBTLge/JmpGYBguDNRl8rVUNDVjbg4MD3Etw4bSSiASsJHhUIJQ8AoUB1s4ZVmBwXT41o+QC5NSJvPPFYsY8ekTuvSN0a0SoLRiam5QhIvnzepE8jQYp4vlAqD0CyfYfqEoQa+8+HGiZUELI5lQ3vZaiPPK5qihCc4vHPVAoyA6iQqvV3ByIOyxGxk4uivi1iIsFsJi5vpG4WlZvdjPQmslq7kezQtdPxLbaxztLdqG31pk0zt9ubVmrUzv6XrnatAYDphtQqOwTJSkpelKzCJmkZGmfYoichQutP1ay7jtGn0bK93nHFR2xRae3XO3OfdteqZHFzE/2TsOXqztKfMM0WIAIOBAAAIAe4oKGDCc1AKyjArIBOTixqJKoiGJMaTTDRJO3UvNSCgsHv8wtBdkBphS/G4p60yY2t4Urpl7Qx1UuhyKuWOCQ89zrrSl6kzkCWcnlVgLqbclzCTTMyK+eRgPZXYTy0UYZVvB2i1nL7G0WfWfXIO3O/tdEq1jWTNAc9Ug0UxqRGFlqfpeJczack243lyN1//uYxNEAIYYjT+29mSvpw+o9t7Mlaja1JGxmmcO8W/zFx/qsf2zW3K2yo8i/plh2n7VkfXs2YH5nbUI69bEtKj/LLEYUm/rbePZraYrPWz7wPw9s/SO9fjitSsETcew0sxrk8dQ7/2WWt1MXR0uxLs2rvPMsZtHpXwWwAAAgQCAAAMvMVAzAxWpH03DBdQBMEPzkVakaEKDV0zWBsYYNXBDIyhd6UbXJEbSGSOKxqOCIXMeHnNprd1KQAAsGxOrHRggKI+3IbKjpCWsRobkayHQp+p+Zzm0n5dcry7Rf4cCFZIiwahambUZ4tNGCYmY1MxSnxTbaHWjYMCMshjRZMddJmfG5CoGLav7exRcZhJMbe85kV1M3ptd0/vhg18afNns8qyQ571wuR5TSTyWRmoVXl90tGyxRbPYb9xCMZsUCrMbJAQopULClHPMVo8xjoSZKq4haLHOKjy1GMcKDaQXGGHiw7U9HIYaew0kx4H0RNzaQwxJgsVwQAAUEAAXeDp4wMDsS9rhjLEGgi/4EpVZDB540o0Llt0pG5mhI5lAiwNMluUOB2rSz9JF2eApViG5ivB5poDKYMmpQQFBRVyJ7MXFFCEeC87d6Q5jwkbm+MFQjmuO/cSdbrv5MP5nzAYd3xDbSt1mPHPcros7/IXrnm+UkWSB3ukjFZ7urmKLFd4O1G3+qKsZ28V87j7bzWJ9fEOJ770n/feH5rY3eshaekSkKDre7xd1hUnrW292UloV+Qkv/b1sE6NW5vYrd//uIxOMAn9InT+29GyPRROn9t7Msje79/n8/tve94G6UsdZBNup9k9nrW1qY8/E1sdtsd71y7iHbG3fb69H5dfxt0wAAEFAQAEE9w70FFUZd5nJnbovNfPCJLlNe9DrrfTtO3AzdoBXnDIng0ppjrh22u5xEsAAU7tUtHRDJsBhnJhNWTDIgpHRt/8JWmiUI53LWBTdPJ4sIlzBJaBc/dy0cmNCs5+5I3eSZZitpi1zoL1CesLgJIUzYzZcgUOq2t2fw4fSI6NZro96Y76gnakkre7nFxmTn5qlv23XruystPGDO6JEItm+UIrizcv+6Kz0zvLyxW6IFKZPYjqS1tqk5RM7qk5kHG0ffbXonj0w/86gi60ouD8KoHpOWZMfLKt+5zLPH7hr5ju7QaccDRbAAEDBQAAAAK8yMBCwZQyRJ0L75hQS8EbrL7ModTPwVMBx5QyMghQ5RTeDgUxoAQZM+MnZylFMwMSMrtLUmB07SquL8kcAplEVfSzcNOgYEVCQVDOcYgBaGp4+borJNtcPYY/tw7wF81J83/jfLyhf4d86ulr33O+KKNDhaVAbU8H3bVZq+KKwInUseUo9U9ZRp3196YZ9/ff5/xr/6+M/7lib+5kQ5XmoMJ+tgVa8quGxY5HKLLaojd1Isg+lOozBAG4InLEGy//uIxNsAHcIfUe09eSvHxGn9t6clucxqsxXEs3J90MTeneYrrck+dwhyKb4QhS3gHOvltpMylibU2Go/0pMioQAAUGAgCQCryYjMGAKd/FzmPQIOl3EiclVmMSbjPw4FALtfKQo4HKYv5IMCCigxrPupM50BKyXAq156bGe2cw3FaSGjO4B+0OPFYg405GOdobTgKKz2Momm6KtouTtWC2g43d2omhZnvV7ee6+O4Etd/dRoFjmsq0TsaxsMCMdtajEcSmeaAnK6i7ACGP01RsPU2j4g3Maxo1fcm7eY6rjYPrfl9HWMyQZdzmCDZqSuezi4+IsQegMDkOsrUg4fklkIbJHMgC1e5aS1oltzMqalLP3qqQo1yZrcNgPjZc6Z/PWR2Kw80qjZttNlqaBCiCHZABAoOAgNkF7mVFGGB00OtaMxIDOTqyKRxk1o8BgUunMrtEMJLFQaXrAzJlWtFF95pbYn1kjRHCzeiYiKhieA5XLVHAp6SEwf+jrGSPxW3fuXg4tNv7CIkVAieOodiV5LeL5SmUU4yFVbY1l2A72f1DLffOIaYJnAtPrao1m9D4SO/SsGL4u8E0fat4B1Yx8t6kz7YlVWvnbZPivw473/5NfWFwq84/a4uPvD6n+PbWv7vMY3RdsvYt1XnWbb5RscTMm0MewI//uIxNyAHkYTUe3lb+vEweq9p6OkO+f+fikrVCzbcNbxanbMXzClrcqq9RGAd5uHGfMBOdzMnrLvQcQ0whEFaoAEMFBhMBogLdcy+7klUcGZQyQeX3DEscsyonNBARoAh+kdMy08MCCC4igpYFCoiaJT7yqtLJKHIwdPy2NgQ4jbcuH4aa6fLZNy/TXM5ccrEVzt3HRklDcnYDISBZO1G4nVSnt372qND117XM845T/ypg9H6zwp0St4XdzEVs4V9S9m1//+Od1n3rQ+f3+w1jjuVRoZxq/9Hzlfk7/5rqMOv65O8+Yz1vior2+zRE926x6OOcfeFInYimgNy7EIgDnLZYCay+ytyjXwYFnVwU3dMYSolktD5drOgyl3BiX/5jacVR+pn6ZVOz8QQAQOCAgAJJd7cHusQ+7hnVQuMb+BLLZATcNgmJQays6Q3ishKv05Y8RdUFgHyzvN4jIwDcNQDEhSENSnjb+aWWZjuGE5Y6eMOmYRyvKdr3YzTU2O4kojle7eDCR8xUF0EXQWszZdkwu7mCzAaQkBKrXHYSqklGYdxFNoksaLZJMFQgymM0DPdAPKltWWuk0mmtnWSP3fmJEQVnCAgzrMUk0M61SpkyzqzAXGk1hwC9vzOhLdaXGzdz3T7Gv9E2fNsxP/ansf8N+Wc66e//uIxNwAHW4nVe3lceOKQiq9pqdl3EL3vSSX35q4YYqqth2QiXdAE6lpSbEAIFBQMAEAvcCg5iIRSw0wEw2BDoGRVHaYCZGqmrCqwzi9jxoZoYuPK6UGKoCSgRhpi430z0lUCEYLCsLuAXUCsVgFqUysMY4yCSc7NNfXMYCRONetV0gGgpo0eSAaUbUrowVBNuLYB+KeJjd4mfLWUpHe/8mfn2yxI++vz9bov/bWTeNyEiiTZvUzFrf6YJQlL68ym19WbEZvX+7/OdOP8pqiGFfnIOjOeGf/4GKnBNcx1XkSgseRSiCx9OOvBEV7lHQ1V04lDmoZsCUGLrfi0mMkUlPJKBpid4mSX40KSRnfN843HrDn2doVMmzJufu6SCpJbAAADBAAAAAK8x8RMFFq8EJPhbpMTDWkSu675pBWEYaMD32ImaosmFCMkYMHECH5paIveUXZ+HihDv9nqIGngsxzbEoiwgw2oBwhMvpHXRFRwmHLVDTyooG71qkwmmh7+vbqeMLdLhtCr3SXUHXeXbx9SY+coRP8eEo4frAXwR2vXn4lbXjcUxw3LfQg6u3vMAQ91nFpDx1n5kh6+90xr+zdr9yYvpmkN7W17p3Q4hW9yiauRXdBugo6x4EG2ZkVLrPphmk2noEdjGuMH3TXOfM1CEQrJ0g1//uIxOaAHqobU+29OSvZROn9t69cp7XG4u2qIAP1XQ+ibbGUkO22tba078gXm6a+9u/hFbAAAFAgEAgAK8w0JuW4cVOZg7gsnaZDb4lQAANwZUZBQDcCbaIafAAI6g8CgjX20OGEWKYQ5JCqJgoyf+WTdkLgAk9OLDzwu4BXIFXkqmn1rhVJDgmGo1SThiQSqO1Ac7DC2JbySSzrn54y/knKwX+3qenvZzxLFEfUPeJC6LEubQSZRbYyf4Z77/CSQ/0d9bNOFeeUqVbb9rGyXvFdLyziuqYat7/krrWvmb/uurKzLAmq65jJVp25L3zBLDldc1GRjF6E+LwRLdvC0V7srHS+r5/2z0/+CsY5KKdSKP6Vv79IIvOYrfE4VYbUr5yfnLeUs30VT569PfRKVqzH4ZW+2t369mv4AAACCAAAIAU5uYoYsE2oysMZNDHKgC1YtFmImkqIOhWnS2aUdMakwgoLMpJjAK4xwoK387QzzIQEwTtu3KBUhDlqkjrj0AXQBsEi7OYLWSYAiixHFIZhcsGZP1XzryBg8hlNbC6ppVoK8NMLYdT3bN6pe+9TX7jQJvDPUNPZ39aUVt7yxiiwVHrudZf3Zq1lwoNncl9V4bOvx6/CbP4duPVzeXdyK/r+6jfda5q/9IdotycuQTDYXuQ48ynJ//uIxOIAIM4nTe29nKQKxGm9vDMlb3ncP5mL9MdszNzzttE6M79fS7aDmI4I/mZbivaGZnKffqrftRtNeO6X3FqlJiPrxwa7jVVqX6+h0vMdrMxQ/98ZcddXsAAQEFAgAAA7wFdGDDNaOrKGNwxsAd2VQQoeZBEgJPZZT4t2MEcjExFYYeMAKDSU2QgkMunZSQBRiBHcp4zKhgXMiCnQbNHIBLvE3Jbt14CUEKx2WSqT4B9CUeazcT1L7Rd9m7Jh9VSmLTOtNzLXThvnj4Ue+isyu8YKBayv0gIpNZfeWLnDlvZONWVXgIR/PhFDbzj27r492G/x+8v8X8XcVrWDtRVmhACjZMSdKes2MNzm3pVjFtgWE8Eh9okZgrcCDZKLlQjO44WauE5RjO5z2sh2rupyUe256Gccu426DKyGbbcm/Gl2WmcnSkF5OSS3dc3TCdiAAAAwAE5zMxkwYRqQGvAA5AKmHXk0VUyMmYBJWabPZxky8/MrOjAAUaLjFRWGDVx93K2XYCByFb5UiYoBC2at6U2HrXiCqmzA+46QBxMVYvBD+bxEQRKJRSXxQCnsIYpl9et5bdVatbFFvwHu6KvdXLaQK2kXei/VrLGkChrPz+hm4DDduU9KOO2o4ddQaay3Xw6zeX4nzt9iSfSScvI7xu2cfnSs//uIxM8AnuYnT+29OSPAQ2n9t6Nl7tXBnRr3ntDv7UbIW4+NYh6vPeQRuhYdBtjjoB6HZ4ILppjvly3va9lmrqbeUUflDRRTJPNmEuBV0mScusQCR3Tt0addyYQTByqyAAAgMAABRT3KP6lV6LuQZGIJ6GbxSyzwxfQ2QRy6mEbDqpmA9OzBPPpxBE3yNz0yUFZbN1oJKpoGmYm78xDaRgYNlmVJAa2kWsIXHtsjVpoH+lmRCCeTt+11LfL/cQfN9P8bVHSSEQoKmg5cZyqJ35X22V1hIbZFPDwwTYvRujxrp9zakXCbEMm75wfigiYgfa38RbVv/jUjveaY81RKgONtR6Mk2w4B1aeIfxI8LWY41hGPDoORS1LEIRBhYVUacMFCxrnIIKHOLJK9KNVEqDEuJoyVpuRz+hRcVdwwwlNuS1oi6uRBR6Sl5EyExBBAb3JxQFAUr/OSZWeN4YXUhphpo2ol9eaip2kGTfAZVxKle1c4YeUbjNnQKRw9dzsLrCXzUHgopxRYBV4U7tR2XHKCdO6c5ONlAOenFUmWR1Wzdldi2I+hFsT/0d07nWyVziNWQj8a+cRNQrOiBz4t7sdMQd2Pxz3ChWPX6SbywudLtuJVxqz7vLfGZYTlqC9vqZUsYKO8NAZRJgsJ5uogHq9jxTpssTMH//uIxMyCHbIjUe09GuOOw+opp6MlQWFgaXYkoeQNk1BVhrlD0R3H2Lh2cggq98PBDxQyBiWqykLAxyGdu0lR0c2ao8Q7p2gxF7gfaJLVwAAAMDAgAkC7zKQkw0aoYKTdMB2zJgmCKeaW2YtCmbhKtjt0i8wq0iyIyEEgr0QCaQOOrY7SEoCKgGnUf16BGajIli1CFv6Fw0il4tHZVAamBEJSmKdpGIVZ6tjZSpfm9rChfiUamp59BYFlu6bHOK3JJIMYGjONe9ZljJq9Bnm/lmWymtwxR2dXWKHde48Dz8KzGUG80YHMDF+/UM16d5dH/TjEzPzfsrKQzc2eog7jnF86+t4SWcvd7CmGb6sJu47hcOchYw4Kq56qw77r0unc3epD/w7Vnfhn92iZgauDEiVoRVwWHRygVKHFmQyTXFg4JeEEpwKWC5AAQwQAAAd7X2GU7sJpmOVZqIGziVwSm8ZQ1BDM1mGtwwZI7AoTLcmGAgXHywEGBlsATsVjCHEMJJLYseKoIOUZ5mkEPWFBEmxoYnaaAAoiOx87Y4z2SVujNzbP4/ajFmvmxAEBfHviFSF+bLN/WAvwMP77Ob0vEX2SPam15elxahGFrdYmSf/7zQoUJ9r+aD9e7jX/wPn71DvrIWGiSLeYUYVToRgaXz2dLmo6sMSq//uIxNUAHzonT+2wfuPAROn1t6ck309OoJDYaum4yLwXK8gCfQehHsd2ShqFXAofuMaReMrRT3WW9fuQbXHZM3fWak6NrxepOMkpI8nKLdxaX2rkYcIAEDBgAAIBO86q4xw20/LXjRNg0s3sntyAO1FE17pzrZDF1QFcfwHDAgQrebUA59Smp+kwyMX52GxC/Wm7cw6rPjQYAVOgF3vmTMo4FpIvFJS4FyvOVrbQ8aXC2p1Jt46jRCCVpv9vXZFO7y3qJc/mrrV8dczpZnd2rAPNHptiE9MSLgTbu3TRIW3/mC1bEfoQYWacxDcb+1DpZs/dbfK1kYTk/Q39zNGmOB3bM0ctTnpvucWKa9TTz+qzCg2MF2kBX1GXlt/f+XqZ95h7J6YpxH0tiFo/dqEBenGvXyV1zl40WrafBFl1WS9/WLyABABQcBAAADvAoIVAGag1DsMchjZ4XtuTCwZlzma6QhAAxPB4xG6GQgpggEJCxp4UMBZkwo/MqtSNYAFCLuUUabmFFUHP7R4Q7aaBl9QClxe8Rm2PGVETzcmoYZypXMa7wwxfTty42YRWW1vCeIZmsnbbYzH2UNs6w9BWMsFgzKqr2bLQCWa3WG3sdoT25Wx60iXN9GPtXYQkd9wTtrSus13p0huzs2KUzBJSGtvKW0jc2dOD//uYxNGAHcInU+0w3uQTxOn9t7Mcz+XarDelotQ39TuLxzYtixokwf10MN3Wz+AhDNllt8VWzKUHG23bumv95ab1hlSn2v3egauy5QxP6MS0hw8/nGldv/xRVmaWerNqNM4/LUTEADCgAAgFzs7XvYh9chn+AawZvCIqvIxXo06xGWax4YLGDALXmjmRAjgA3Q9xIvausaHg9PO62KIyM2ttoL7LCmp5jXFmzSqGHShkrTRvvK5C4SRkL2p1Rqr2U7lD8M8UP8N3UtmpsvhgxoumoNMwiD4vjTa4R9vasSpre2VzfSvnoJFJKx3oPi9p6WBvTf4egj+yK7fc5li7HN9ke/ln6CZks3SlidpEhkSu9qxilaUOLcht0RPSvbl6dexk8673ISDWHOapOZzX/N/S2pPfaZeotWTZBrZddld5SNts6zmd7eE5z+v/5WzkSuzz67Wuabq1FggAAYKAAO8vmZSHUsPNdMbYyLBbPUmnFM/FxapalFc44CWwaVok0xkLWjWwdqcsp9tzEiuG5jCPCIDHo5YGBbC8zGJUBD8BQDDqq4WKV15U0/sBLfqfFZV/Mak6mW54D5+GyERWkKsZ5W2LnW639xzAd5r2tl/xkug/55Z4FLVRPouiGbZd6J271S0MomiufDL18a+WjX39T/58S3l8gLbLcEh6LFJgru/DhJd5RFOjr5lhebtTIWOymmRnmzPGmZxZgob28hxP6fqzE5bHM1mpHb6VSSaQ3SxEzkayc/aZCDHrKVrL//uIxO2AnpYnUa09mOO/ROo9t6ckWcRvvypZXp1S9eQEIIEAkgJewtnV2PMZEdSYAAxynmmfmLLJo4ShpE9R8LqYGIIyn2pBuplxQ5lmglw4JiEIiMel8wtsFEUOQLlWBguTQ9m3cgsiACISnJbjMgIMfOCWa6iLNOymO2cn0xuVp5wSgAotWvl1nVLhQQS+WrdbkZ5nW7MM0zu54hAKMmXMISoc94Jt3Uh5N7bEgVGl8wY13/Fu+EP9KdZxDD2WoYAkadFyOCNCoYH1k/gTOgfZIeIJHPUKTGqhBTxZYfrcKHJ9JOZcXc88pI6hizSREq50zMlmXFjqtrssSoZCSIl3wSM4ZlVqPZkgAAIEAAAQA7zEwUlAJt9F5mJWZsYK4ETgFPYxx2M9AFNX6pZcZAsGADrvIygEAuGXqbl3Zu86gswOxR0UNMIBTg60CRqkgEm045STVIMnAsDcvW5ANZ1Eaa6N5Kbk22Fx9vVIHvG3C8Cbe8aSKVxrPLtneMSF6dWt2ZYPrFpcRYmbYRBDteP1yrM2vxppSu/Kctf/hrvT+Rv//1bc7nzW/4sBTvLrE0Y54k8U6wVG591yHZwRsIsvZzJyREsqRlkewZZalcHpNQjBlEj8L8nrUympGmJJ6enO2U2rnkVKUotezuP1ioXGa9q/IGJl//t4xOyAHVIjU62tHmu4Qun9t6clwQAAEDAAAQC7wxCMSBr8485hxaUm75U8rWAMdaAc4NPllPAhl4CY6FRViQ4AyozRCUlNXus+MRD5VvUdHCAyYRXe2+MFJOAaeh/LtURikL5Tye2nZL62/xXm1bdy7cgbvK92OOJf/ndxnf2cas/zt/kGtX7vXYZy121QpCERNmOqfx3EVv2gCC+WyTAZY3aZD5E8mzmfzzOyO5txJb295AlpyZcd4qB6QbulYgIz9wlvQhIPN04kJyDUpSwtSZaTTHVVf9W5PQNQP3FLpri9Q6TFou5HXJ+8XGU1ZMUp55jEVQk7FRJAAAAEQXuJIYYIyp/WtGOOwHBmSy6NLRMhbQc4telMw6ZkRSHHthMhp8+Z2S0mMxVmRAGT07yWioIbKEvk40RiQ6AF8qsWqOm3Zz5ikeefTujHzdryqC1e4YWKW1uJ0dpRG3nfxjtzaBc1oaNfTgXJzolpgyphq4xvc9KrZUCAu7fAOD244YBd23YO+upk7D6+pe+3b/YfsizgetKgwjWUwDRfeINC6q4EBp4gnAfNmiGhAejd//uIxM2BHK4nT+2s3qOVxOn9taOUpNPUbBBANhowyioFjo2Qmce1bJYi1aSSULDYxkkdO7QMMEBbpjTSqV56tIR7VhFtoAAAIEAgAAApzRQQGCNBBKHYGfxk4I7M1DCaZkkaaGAtAp/WQKtA0bhgEiqgClJoRZJcvd5BgQDLiSFsbgCEhMzIm0hiXt0gADLEQl0Yh1OxOKna/chHkrbH9O+FhNuIrtQr2tEcoBNL6vmGy4XTHeQ+vLG5Zmpdqo9osSWpMMuajyfqSJEZNbQW6qzdn+NdGAkrZaZH5v56v6iI/1pkmzvmkD8GVJj+ytp0fZa6Icq1ypLNWJnoJr6RpUe6QIS3l1nFpjlzm6+xtXwyobpPJ0HWbTkmkIEulX006vbLSPnEGHifEqGkQxRMmjLhoJhgAAQMAgBAKbmpkRggPEGVqqGGzwOgG3hEVYEZAuApmdWesM/MdTzHBAIEDDBcvqyIw8nqXJZSu8PB0P3sHqIBkObICfKepkQBp8pInPu0Fh5/NwDL2o6cWb30clU+VbRfNuTDlQ7FfJVy+Jrtiqo51+rWYWjL/XjrOW31UGdz77HNZV4yeG5FnW42sMtA/Fz6Taexs28q637by/1iauoOqTaQqxlHW5rtHIFC6vxwwoVYJld0K6qwfX8R18XRxm1B7UPl//uIxNmAHc4RTe29eOvexGo9t7MlJT62mrtk+WzVrGHnfm9Y5+F++RNMtNxRf3fZ2WHI39t+5v2bXNTl431srq7TN+j+0Z4K4gAAQEAQAAA7zDmzKtp2Bm1NWdK8DU5ZWhBt0x1ggsHgSnpDcTgcrYApyUBEPzMmHXpJf6qYcf7MY2xGbDrrdJZbdwIHiY1s7WI6/Ac+TNl01k/K7NmyMwtkWFGy1nB7x6mcz7zH9ZfCxtlcsY1dH6iRc7UNfGzHQGcxcYY9wEdkmbjMzx7mbW+ZxMR7tryfUutNbm9Vfi+fvRG41t1pl9sNJIIT2n0Vpljz0kHNNuRvOn0paCUXOhryo8gWLoiDhhMzEyp29M4opJ2/9yE6zUz6b0IiYhA4UOXh0nj6x9KSTLt21VVxxVZFXURt5zsoRkAEAgGAQAQCbzAwcLgEzBSHpgfCZEJtip5Utkwh9NFQzBRpafG7Ger5gwsgeYaJGLhDKStGZra1LSULLzSqUYTIJUy/LrPbACqJjtWAil/nb9fRlhbD9WG+QCwS1Ensxm1QY1rWLZYd3VpqxABN9aqdysz25YeDb9JsJkgGcQMWbsv59uEONLEgUjRz/fcknorYDafCs+OL5fYho4XTKqeLkrmzPjhbW7yk+Ypwodsyh5mRaXDb63lms5M98zdh//uIxNgAHhonUe09eOQFxOn9t7OMqaP0ZG3t9KGgJGjxwcx+reLR5f1+nkTIZ+kX/R5rG7K/UasQltV1L2pVBbde2//Mr6m1qTdiLF7Nl7mtd1ffpnI6qqEAAFBxEAEAq8BQSPlO/it5kEGBqNrkTkq2jHmIHOyDsPXHpMKXhJLDAUaFx0rFBYxITeiWzFMskWDKKcsR8qL4YZtlyhxYczpDFmN1YPqTRkZhDkfhqFszCqEgj2NcBM2YJMlCrJoEZsB3HgzwsZOak2o1kBump2wH7EgzPHz3ESiGDhKVNxXu5cs9ADJR66rZ7E+60X4fZioXx89DZt34/bDLtycO5tMtF2b7NUDG64Xo5p37+/bp68sYRZTwSmPYm70TjFMQ3ajXkt88KI5i7Ef5bMV9k7S80e8vP9WnwXu3kkl+p7ejDdP1lZXtcyH6fVPSa7Na9LLLlGACBggAA4AFOZmHBQFh5lrDjKGAFWza0dt+TQw0obVJTnXwHFsmRWMoaIoRYIl1P1cM5QhDJpu9TiiWNPa+6eC1FjCJ4HDTkvPxnhgCDL+wnTCGtPRSLWd8UAETauMkqpOtWvxSnjCphIcyq1MEy5mfy6mPL2tZdAr48K9X0DyUaygheWK3ruDRm+x8y11PRTVi7g3SjuiSNG+ez/e0izzUmnu8//uYxNAAH24lUe29mKPQROo9t6+MQT4bSg4dq0QV7eUGo23RcyZPl3JpahH5uKGDTd7CBWY26LjlxbSFu6p9TPWvOnZEtqsPccp6CIiNeefJJVY2Gj7FNq3oXdGLnVJ/c1zpPRXAUiDhABABXtXdu5JUCiHKJEYQAM1GF5mXLpoIOpo//KcKryZzgmEEJiYMSBJiBRKZVZjZUAgwBhy3YiwiHxaTW29kbYAZaaCTQ89FImlDBktaZn6VzDD2x0jLhHbxnokxNQMaD/BK323NVGnGs1Hy79ZoYwM6ieSNTWYk/1fdZY+If2ejlqDNgwYu9YydE2bZkLTX35Z6a/lnxjPf/rGDr8uQLz1jATtZ2eVuI4XyZkmnDxrFMoB55a0BYg2VdDgp0rh0P30DvSrtEYe7LvY4oyTLGh0rL+1pWA4jqy2R/kKQvKlU1S4iWAAAMCAIAAAc5hIACjuxG1yGTwwO3FnwJFVDjCpYzFALSrm3HRE6hhw5jcYZTcM8LX4o6CMkoEED8qgWzDA4GiUczFtbjcTAXMOaYelFuiMPCB4Qi8UkWgAA42ZdqaJbNsyNufLBMEZmqey6nzesw5o28WoNnO/PCW8fG18y41PJbedUwKdEzTfDaf73aALq531lMJm2N5gvN/+rv/fe3/vERDn4N+g4/1E03YvA8sT/Fr3/j0pSatw6MiZYDLVUEEIhjRRwhn0kWI7ca06XIzlW4N1Szi8VmA/LHuy24vfAMHsPcPhSkMyIlbkQ3iEglcEA//t4xO2AHQYnUa29GSPBxOn9t6MsAABgEAkAO8Ako8tWYsxEx9bKQFqdJKm1AUOVkkHzt16jBmwx0pLfJCiECixrYhT1JXPJpjTdA9yhghAiAhLbe00GhRxYDEIYnXxBp2lzbs1OAYXW7ORrCPOFFbdmqr1dazaz1DJhSWwno9IcaAbkTPkyc1t78E7q4m24Deriu5Epj660WOPqfUjlv0sIQZzMoQvf7M2HJ2YFnbkwR/XeXG1J6o4rKXckLq2rmlWbX+pjboOu7uPUQh/y7z2Edj5igv0N9qb1/fZR06W0/1pVhd63a+9sb1zl5rO5K5sNdPZb+N1Ug9nbudPML2781CrHzoAAQQEAQAQArw4tAoRdjyioB2TMAWCqeGkpzCpM0stVI6dyImTqIEHEfJUEArsg6ldSzMViQFMUCo7NTFZzQNATERl02WGciF6GS1ILMCMx4TllucVoMFTwWvUEbMP0wuy0vTW0kp49rQmCFTUkNJQceG9LPHg45g1vJ4B6wd7hQt7pXKlLFa26PvE/qMhB6/w+jUv+w0/8Jj//+PzRSTI+caak6xI/H0o+//uIxM6AHlobT+29mquxQ2n9t68l9zCVHsYPSGqvKhfSNJjoOupdIZLbOi5aW0SiH4fWfuWb+9V6q9nnNafY04i+HsuTkmh48RSHezzRiizHVbbUbQRosgAQEFAQUolPwcghUCm4AbmCJkDK76TMpdoxoqFlqBZdZnzIgIygdEIIulsFwaZq+W9ugYoAyyrUmxEHAJFgd7sbQgNQ4aiNStJHFKDKzFZbAPc1miJI5HgXqRjnjucXdO2GxG1nTVr+PDVSFMUKatyaUgw11Mq/PmQYKCznGV+9s9qNF7mJhIoXX5gOyvvilWJb1quI01sfFZ85/xhLeA/vtED+WvxaeLDof6GoLzrIkDsWOsOwHBtkqhCEBoGEg7MjzkDYwc57nUOMgbcLNCpipELd6RPVoMGcNBz7MyMjxFlZ6qCG8AAKuEAAEBQACZGS8HhTbDrcYa+ZKeN53kp5tRQw/I4yBQdyKeGDSljbkEpGBMjmSbjRZ4UrpFY+Ldl0tFRxtxL0vNGY0FB6xJuh3EmRFBrkdqQEqoxJ3LE0zwcPQ9Sxi67rMmwXpVfcYwJGQwbPVmXMoo6T028zAm3MM3MRm0tXy9g9TIKb3yurW14CSxneG9dW0xYRYnkPMs7KY2402ly4/x4VGn+bTN7VxMU5LNgZ2CGKwGdT2pCX//uIxNCAHUoLU+29GSvZQ2o9p6eVJZ1SK6bTWF5I7mIJNLegXM6U2BRX3HXbtb04bl06FXe5au2nGaeWgT7GUl6hckc8SrDUbZlfZaWa2FsSTgowJbIAACBQMCdku8ABAVBpn9a0Zy4C5zayKXOCad6Dwq/ozWdMxkM0RUdCAEKzKTgrXA1nOyOgTAAn/gK7JhCJAaZtYYpIgpQLRKGa9339Ji26ew/5gwTWLup3BGNbthwrEGNOcWNMRjiHEhKJRO9ZkL8KrwXEqui/o+eR81qRU3xOznuj6NcsIwHKtNSv9YmyvJ/51k75697Q5Bm0zvrtw/+Jdb1/TevrwdMipMOr4Lo0oJAgtuxQuehwazUQqSjOGIpjKI5UHbZpElBXXxdOfShw9HbmToXNvPmssRO7yukobNGxyYqZZsYcHQaW27O26peeT0eFFdWgAhBAQBADQLnEg8GDdBBqBARcBiYwz2pGFzmWMYGh1qOPqMgFkBodGwSHLaLACYsLTNWFWoQPEEmsavCpyGGzc28rrQS+JpCu5MnYQYskNap5ZLlwDdpdc9cmX7RcKAZsG7Yzhaysh13WbG4FZxikVV87YQxlXaWHILI53YIc6NvjWM3v9QByM2vmAcD3+6cAx7k2vR3prJO2enjbMnH77TWDGHK/RukvR+Mu//uIxNGAHuIhUe09fKvWxOn9t7MczvSQnmTpcXTftMYspbjx6tfoesdtB7Iud8LbtMmhcvvZV9mudLGZFX3WrO2dULKTS5VUw7VM/avwj+WYJ9tdenU/a52bk0svM6rRAABwgBAYALvOFDjMQPCH2GGUsgZSM3ik6z4AOBi5wKg6HaurIZMomJH5WDjwwFRlMgHLMCS+luodB4l5fwiYEGRIzUzfeeYSZK8gYpiDZKWOGfkcJ1SWWdDwdMSukjRKBsMoH4oKzZXd7QyNwKf83Prc8g12anydgI7G6fEt97VDB7+IWSibeA3f0kJn3yKyevexo0O+iJPE0IjNvnHdUkMobUFA1X2uKBDRUwbHW3OfqKqD8wnSA+zGwWUohvHmnqxA6U56hXe5tG0d3J19aZBmdoJvptykfJNubGa2x7itpxm1FJnFFLHNuLpz+Tj7EAEFBzMOjEgTBhKWGlomb5h3mBqkqaSa9uAtqun1uQGcVgFMHgYmalYVqPONiVtrEMDpzD43NTknMC4nDYWzuo1s9Nxrd+Gkzj7nlFIMKSecEiGjDsNWrEo4s5LJt+5M8bmXJuX32Av3z7/WH8x1OwYpZJssqVN4MDl05apZqRdiEtYH4OzFahxz2SCIs9ClRNccCiP/sw+VDKg3ORPkH3HJ6M/vC73z//uYxMyAXhInUe29emPOxOp5rK38CTqTc8ejTi5KXa3MX21RB71ziBZLZYQRpkhtB+mruB3bmKwTphkIzfPKyqlyKD5XOVLN9wQ1vPQio271dPbFHm7GqKNq6OUsjsLHVbAAEDBQIBREy8ibhkMuxxVMCU5iYG+kTrw2ZoGkzG0C/yoaUOhchgoOBgqAJphDs28suxFRoiD49ZzegqLg8HPXA1hWQQSS0qroZUhwuwLPxa+7LJMZY4/GYjTMsrTVVRNNickrvwQICFLqWMXZerimqVeRJh8m1hlDYYtL62dfN79U1y1NtDxzv4yveoAs7Zfb5R6oam8bOQJo2zkB+JnZ3JLeOx4vmbNOVnkUPibpOm5vSbGMDkO7ZfEzd7z9EK6WSkncsyCI0Gz3uIe3bg+3EW87fUZzv9anSwgq5WXdTKdKL41csOHaZkyoqrhWaZBoz7YtT9xnwAAAAAAQAnzHw8HR4ACAoKmdg53gyeitAqEMJCx4IT3Ol+jSzkw0KEiwwkBMIPDw7YxU6MaATHwMwQiBjeGaJErAIcBoCiqhEYSRCAHJh8xAILBObzsGsiIkChgmYGCGWEwDQjnC8zUDMSAGmgANNOQTIRQaODCQlO4eERCBoZEwWFgJLUOBxoYRBTyQkKPoWjoOjsUAJcNow6QGKhJCAFAkYEAJ/goeLsJ2pBloG4g7oQNPRVqD8Gg+oQdLRIItoMhYkmArKs5AASjpEw1UGzIrsMfJd7KlxrCAgqOSaij7bLMrKgVO//uoxO+AHv4lU+3ldyfYxOh1vGekzJLgLjUUSxQBsYWehMEA04kFFFVa0TFgUsC76yFwI/rKVYg+xhbyxFbVRmQhIMeOBkI2jUDGchARJBIS+w8wwlQaJngoiRoksAEQZJlgwiwIkgClQRDzACNLYSQARp7EUgQAUCHXMTBAMW2YFITRLBhWITByAKkLgCIAFaEoTGAFBYIdcAIL2hmwAhBKGUAJy3QRACrLrBkAKdFYIuCFF1QyYEMX9BzwYg1ET6ONvMz1DyUNPk01D4QNvEzSDzTM7Q1kz1XNbQzDzxVMrY0gz2YNXM1Tj0UMvU2Sj2aNfE0wDzVMy42CT1bM7I2DTzVMa4FYnhAZe5rnHgoZN5siHg4Y+YG2PNsyMDWBO+ExsoyAlFGC3JJJYBQOBsMgMXMExYTgyCQygNIgCiEYRnjWLuJllzwqEIw2yiSbZRKmJokoSNMWiKWClqJGwkbBIpaJWolLIloJGwkagSOTROtE60TYSNhI2Equaua1EuEjYCUUoMGjSaIECUUoMGjSaKIVRSkkspNFMVRSkkspNFMVRSkkspNFMVRSkkspNFMVRSkkspNFMVRSkkspNFMVRSkkspNFMkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//s4xNYD1JTjWaSkyYgAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.44749999 + //_tone.Alto_E5_R_ + } + ,{ + midi:65 + ,originalPitch:6700 + ,keyRangeLow:66 + ,keyRangeHigh:67 + ,loopStart:14118 + ,loopEnd:21025 + ,coarseTune:0 + ,fineTune:-8 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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' + ,anchor:0.08346875 + //_tone.Alto_G5_R_ + } + ,{ + midi:65 + ,originalPitch:6800 + ,keyRangeLow:68 + ,keyRangeHigh:69 + ,loopStart:12035 + ,loopEnd:19310 + ,coarseTune:0 + ,fineTune:4 + ,sampleRate:32000 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAASAAAm9AAaGhoaGicnJycnJzY2NjY2Q0NDQ0NDUFBQUFBdXV1dXV1qampqand3d3d3d4SEhISEkpKSkpKSn5+fn5+frKysrKy5ubm5ubnIyMjIyNXV1dXV1eTk5OTk8fHx8fHx//////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJALAAAAAAAAAJvRuQT5FAAAA//u4xAAACPwRRbQwACTRQye3OaABAAAADzVs8+7u76AAACYPg+D7wfg+fg+D59QP8oCDkQQBAEDmXB+D8EHfDGUrf5QEKhACBz/+U////yjvrB8HAQBAEOJ34IAh4QAAGBiGA2HRYPptN6YdCxnkghAfMIC6XAkLmNQ+ooZeMQcWzULlMkDAFAhrRkpfGYggBL4dgIDQlLF/qICFOedCiY9cWdxAG25WDJEqJcWaY6ynn4LeNdV2YkqFV5EXM8gfiHY69kHxR9KJg0hdyWjS9Q9ORWtwYbl8spqCX2b0PxLG7A0BYOzIndfu3D8/F1qNIquDJ6+Ek3O3H3gKNSOM15qNRixkwR211xd9Ixh3CWPE80ff2Y1lbiliv2DpfIoYwmZVc+X3rd3lFWnO0lJNTc/bpLdWxnlupL7me9Xs6THlezlW3clVikyvZ1rd/731r9mpun+rb+UfXn7dmvjzC/dm5Z9evbxtTVmhxztYV7uVTHUzGKfOZ1SQ/MT03QYV+Va178cOfNYcxx7Zqbw+ppAqhDAAAAAADFtb1BopTTUlQxBh0DZkHmsw7OOEIxhzdJGpcGEFg3GoAsnCZBIvMeMC4EwYedlmpDxyghMgdESPUhhNOK0DIQppNF43LgzQY6UxzU2JsfxZoLAzdFyoKWHJFnkGKxgTBRKAYPFCE+52VSdBuMonj6aQzRVFUks1URo7Bnh2SyTozAyQcqioxIOLGKYLlJgwMimRxVJ4ZszKaBcGQL4rhEC+jnxyBZJLubqQNh8HkjIyUUSaJZM1oLKReRo6jpOKTY8miX0Z9UyJRBXUkUz9FmMUDdfpIvRXeh0mZNq63QqUz2R9jqrrrWq+yjhQbU61m+yfF9L40wAYAABlThxOYFH05rLSjAArMXDASEL4OSyVfUOGLuyaMDK7pBRvwnMDAoacFYsCH/pY3p/zCxWFgdFc27rpHgKMm83eEkCcCQ7hF28EvTz/RS3HH3Za1K/CrcORtpITimlt+UV5GzFcUUoe1rkMC0a13U9G4qSNRLls/T6ii8kT4Zl1mWYS4qlb+als5Qx5xXYv08OQ9FYeWW13t2pXki2Z8/rY5aoJM5LW+PRvv//0mmUr9QLIta351tnX7dK2WfvSpDJ79N32j+8zZm0SD9on//uIxOcBH4YLU/2qACwoRGj9zDLl59IsarsEeL+WbmyRMne2zFKTNbNQ9186ASiw5BFl3T++5kulZw49+WxzDzv6HW1kd52nvvMSxUhVuzCgAEAACBC7zAYKSFayl9SQU35hkdhUQioDe6vGI2YpupikGvRAcjfZQ0MK5tUekwGhiRfDUMGLYDxyhwzWKDgoIkm2jIUxpkt5aT/BdWPDH3h6kltI5RMDgR7ovL5S4BnQizZVya/UGq1buZ95JESqL9Z0NE9ZQLt5bypo0X+rYZ54ZNJIhcWeTKHWmzKlsUrUlK60CRF94a5Q0+m6s0Jq/NUSl6vc0+J6rh6hPmWvZJoOH2pDmliu6Iq3wfas9oC1N3KNcX8PThIlXMHWnQ/rc57TH7Z82UubfUGEXXdzUo9XtEkPvvEI5W2qVJjIe3RHm3s3+bwhHEWpT6O4ggAAAAAAAKcDIYwGIhYOpyTtMoaBC0YXAIjAK4GetiGQGYy7ZwEMskgeF0r5hYhmamYgBcJsMudCAQuJyIswNOwUHAOA0eDVRTTolzvYIyKuM4wHkw1QWcnHigsVSw/JqWq4IxnF9Z09Jg0dh1m3uzbriId58ebk1EmSNHZ01n7uwobCcrdT7TY1OaaxlO39S/HfLNybqSfWt/+MVNloP7ipkceUkiKn8ir9//uYxNUAH7ofS+5pc6wIROj9zK7kvqXjWehvLCVtdSNWQzl3zKQPrOlH5M3UqyKVmp3YJLHXTaoGWP4vJa8x7YWmOV4KF7zR1sD/CbLXNQ/jQe1Wm5IBFNja2uaSCPdmvaiR97puZjN0HHHrQLAAEAAQEbvC4oUBy/EPYpLX0ABeYwZAQCfOJSxnZg2mE7bTH/icADoKFBI2x9U0mZyfoI6QlKfOvlbhP8oEBttb2Mr7KmxCiggPuUVNNwpoo0AQ5nGM4BfYwoQTZpZPm/UozNb+tSAjEbOLeKNlDMz6+GAF1r53LMbIbykVqkYIL4vM7ZIyqx01GNVwasuMjt7fH3CcZtf/vB05z6Y56NOfmJlEan02Gxsm+tWKhjpkbLV2dyc9HZixj3U7TLKt0HpA0dv5oirxzLmH23PdlUsOxK8jquVHNxa2HzbIIe+ZqCIpPFykZMr5tFc0fOGFgAEABECSTlQBtTiQOAlWVOmYrGRhkkmHwSyS7IWhmLB2PmNVkXjtwqAEAg82+PiIDw5Gr81TjCdEvDHryLVLBsxjZ0aCKWxkKqA2YAJJLC0z/PHG24IQwJLPlNuOGHPLUv0tS1lACeNLlrfcEw5Dlr6SdVlIhlnPn3ejoOc3nzPijaLUYkM1IeX0rpd8uorNmtBfb3blrKQz81fkPPoZ3Pmf8iSQfN45W6zxVtflnaMQGNf0Lc5aGXCI+JnEqYmIM6kfi9UjV9dDfDKroxIXuVIwMzHXlJn3bu43/7ll3OPqNCxy//uIxOqAHdYbTe29euv/xOl9zS5899wdX2XObkM+YpWBHY22IvzJkNOU6bZD6RWrUIAAIAAACanKC2LAZB4w2L5ZC44ZMGZi4FCAHM7c+HVhjCSkD00y2nycUlA5goEnCB8NA2H5A90mp0JJMz+bqRubZIfBK0x+n9et4FMxHvVQeuHn9Z7EmRI516Obq4x8Ko2C5azwvqdN1jFe5zCnSJe/DtS5yGShDrX/TaCgKlytdq+o2r6f5dvSm0rRhhjeu1a8n7zfdYzzzWW7R3rXUwkQYZN+V6DNaVU6ygE2f5o/3y3YQtXTvHTdcegWzsk9giTHtcQZCXFy2AJrum3KJH998T02o0TJ19TBvdfaAhLmyJ21jEhKQd1BJs6zUhE7UOPUG1gTO0QMAAABUpzLIuZcwMAD2niDZTOIoBQjYuxCKPCSgIwhOjlISbLGIq7wwAyEhGhVSntJYKkcvpioIRZTk/IHDS6ENBP0zCzD0A0Cg5qdjYM/VgyJvfmX+p7WrVdsQK0c6puW2/aMUBV+ay5XL3Pdz+crQoWFpN63nBCVeV3Cvc6sCq9rkuicpe4RBMmncHQgieirdVTU8U3qO0LJDSse6B7H8yD4BbrlhoS8NpQHHxMX2avccBhb3SQnB6LqIxlRFo4cCdpS7IARG1OShgAqX3ue//uIxOSAnu4XSe5pc6viQ+j9zKJ1I3MXxHetJQ5VitAXPnEH3KclLRIrZ5aEFg2OOcqkNSoHyqkjRTMciiBgAAAAAA0ryqA3/jQUAdp/0ZDWAPBREAgGWDus/EQGMazY0SJEf3Ihxy06DAopN4n4MD7iQqUXYaAAyEgNK6aYCoDR+BIENjkNp0tavKKkaMEEISBt2HK1WLIzlYIitPLtTMWARvprvJr9JE2gZxm0EOilr+7kOEY8+JtxGYb0WzqJeoSY6lfmrnMBNFgrI8Zm9dKDvnr++0g2qPe7Iggqrm5HZVPmmkGfdrtVybcX7Uyqqnlha59T4ijtr54I1/TSUbkx6FbRcTT/MLMLh6TrOU9c3bnD82tx0vDVEZckRbSzqjIo1s9DIXTlFpmw4xc8i+kHNOpubsPwqfRuaaIEAAIFq8xSDXIZYFgFPSFW40yESIXr7ZVHH7VwYrDRjIDKxv5BEArBGABCbEGgkDXegnu4gYHCSTFHSN3aqzQwGTQeQkCb8vhcf+iFrPNFZJM0F8lKhDV7EKfTGTQyrW+UXcG6U2WedNi9CgtJzHdmqSKW9vu9V4JaHnyv+6Au7hlnav4LLU93lBav571/5fyV/bGTJUinSPNEOd33MiGOeEdZ5DzdrbTFtXUXkO7/xQh11GlUdxbIq5vK//uIxN4BH/IjRe49equ5Q+j9zC7ljAYOa/Zn20h22iia1zzapnXZTKCLYzU+xjadazZdsa2mHYZC6y7KbaKhyjfhzVIX5VabIFAAAAABATvNTAiYMCwSFwirGlVThFoIVWAKWwLEkqTLd0DTrfUW5Qw8ANh2TCW8f9pMDz7whdBa7fsQ+j6LFoXzTnzRh9JLp2lsi2HnwlSz6CySvZPldnocm2iGSMY3VlnLzdtWPzxxgJb9/8M8si4ci3vLnGiseq8pd/XBRtb+ewzT9p9fT4d1e5zHvPmb9RLoQFHctnoALe6WgZDaIR8gBL7HXaXcPSlg93Cn2CYjLU3IhCe+IdBBobojMCMIspYQJE2NggfV1NuaTBcsTCzT3YT+uth8JxkmDxzioi09UfI+1MLWRWve1k6sZoNnLAIAAABACAUvMnBA5VSIEQHlQpPGcuZn5EOA6TT9uAOgIA/TLQVlEroZpmJgZ8fCViwM7tP9LGjHAgrAaL59rAsWljTMyBnZmn9tzkZGpw9KJiUQZRFR5QerZj9Wkl4fqR83Vp78BQndnWs5tErXMt53kBlrWGe6N8X6u6t4Z8Eizty739qytX5qlvYfj3nefqIZP6nNxp7qbkE7/m1iPNbNQPO9RyVErhe5sg2y3vUAyfczmUjO5ZzYg3W+LeH8//uIxNiAHhonRe3hFyPLROj9vC7k6jLWykRlmy+mRXM/EMd0/eyj5La4xvYs9ZFB6lbjKXS3UYw3fT0uCgudsdT5MljknWnquABwAAAACQA9wMH1YE92MV44SgcwmkjCYfCA2RAR2aJPsy4FyKXosOPK427gFJJqsqILuhDeGGBg0JQ5X3NoMDw5HYCCqJAMejdNA8jDMSKP1cpFAgUSUmjMCwzTygkKZAS2Yu5UncZDnzC/yDVv4Z61RVwhfZmtzlthd+7hK7PyRKOmlNWx80FBNtzWrHLtzDmH83D/FKr8PmP6+W7//857+f0TY+VwpmEqd6TDsIZ58G89Q3pPrN1CNiZuLWI5iDCtHiHqBA42spbKDVJNPgjYmS6u2oleNxYwUNwmnOJ22vmZWZ12FmZSXmnVWQdPYEdu1SDEdTbhxBQAAATvWEd2jWDmI+jIZqMpiQFBYCJrv08IjAhiqSGIQYu2VZYwUDBeaSECOMWnJ6nwRRY7lzSHhEJRA4QNeI7PTEFQigKh6t+birxwhDgVhpNUtFL3QI2xTtn+9p+6xx7ySsf7/8ypAgFjOx/M1k0d2/ZyvTcEYz9m5VqBcTeb59+/NyCxze+fFOG9fjyMOmumBL77hgJdRNVcTPCESeqrdVwHdtQ15Ett7pKql26iSPjEzzZa//uIxNgBHwonRe5hNyOwROj9zC7kCX8XMKkJ7Uma8w6IYsypZSTD7mWde2VazV2syFn0eQTulkag/mp9Q/ZuqbtPrqX20/DqTmrJIFAAABAAADnMCiEwUBX7SJnpxl5qscGMQCWzYgzxwxQFGKa0bADyg7WJZQSswARjYwhDgJL4hblFgwWBWa2rL1DAIFg6YMZpzAOJ8vsxF9n3pDAYCijcZTL1UYAJQYrVBlJG5FQPEYhB7519U8rzbLF8sMcdPS3bH+fOWxoFvlvK9SS+IsXm6aI4U+BflAmDU0dgK0RZJncvojYNLrqIseMFLzo8rSfOESbdUjUK11MKEJE8kpMxOmijGs3jJIs8+aj5QTXUySNnqUA+2HRDgNCN2qHoQR+j1dNfa3I7ZLTZEMoxgGHxLQaIQPnVyPe0pz0GYce5uK4jyZ0OtRaENIX0kDAAAAAgAF3mWhYo6z8qgHcuaSNOgeJiID0wiG1ADEJcOCAZNd3IpB7OASJDVZbFgE/NPe1JRwOpn1JuAF1ZGAgmCwyNACRS63mxEwMBWgyuN0TgvutqGL8t1jZwMDB55OfT63Qtvh3fMbiQOsdS8XAIWQc+tAyMimDrIIibm0sALoLAa2QMxCEx3L7GRFVv50tF9lNOk+hsyzYkHs7HSKp1uyiNE+GjqdRR//uIxNcAIEYjRe5FHqPOw2k9ySOdJtNJ06QuU+pJV0yympmZF09GcOwFnnU00PDvqbVua9YVHanEB0Vb6pagd29PJJzkhAiycMGCGQNO6hgIbJESJLtoHwcPShJOmyBwAAAAAACpwwlP3IDCALpoivozGIx4xJKsSi0bYIYpSZ3oDJ5uRBElJAISi8y+rlFZJJYRUnkxSJvetw6gGSuGUBufokChl7pRDECARwW/YduD4cpmyEwmxZuxrsYMeBKBk/hlT1mjr2y1f1XmhUI2n9woodZ6g5O9z+tdL8sV/PnarYCYDSX8rXM3KnMPp7NZ64H73XNYSB3Z7tOOm8zp4OdJ2+6YoM/+2ThLHPWpeE3vSGPFR//d8OFg3mel+yye/5sQadDanl42inc21edz5zaZkznu/m708sYZ2+uHr39a3tL5ivkTZdfv2PtlZOy/WtmDlu+Xx+K8EULTEQYMAAQAGZ1DmP2iQOW3+ekx4QAUOXQYLHJ6BTBsrPYARs8soIoSApFA2omWIPvZszNokABQR73tiTwqqKGBlA7NaWSyCX0FTcTHJxpbNzUmiYlfVpo9Q34yIIU8fw5hhSixlnX5fg4xMBv7k/bbgEG4a/CzBAXWiuV78aeAgcfFs89dqvHIO1NbvSmDOfl+da+RkL3sJBDqWx6Q//uYxM2An+4nR+5pk6PbROj9zK8c9Ghk+jkIB5LpQOMdRgZzUTAjnv/0H/PB8Z8z1BTHtaigQkbaa8eWNrfTxxV3MUU0+mwxtsp/MIvXO2cRof6tE6eyA2HU2ymo5ZpvSJUby5pk41XYaqZrDVGQrVWrUIAAAAAAASvJjO0N6jAI293K5jEwlCvMAhFe0pfxRMwHaQPXXcp6eXJOBcFnCyoUAOKZXMrJYBBWHfzmi6a3iQWGXEejRL4bbHdfwOCQkXpXKYlD1IxsoDFrlDM82QBensU9beLYG73P1v5sdAqcOt0s5AkA9wvPLTQCUzTSwaTCzgQo88WaArCEw8Zc542ytr6fON1EJbhgRtouhcAZ7Nu5DMW8Vh8Dapkp6A0IKZL0DmOZVw9Al3duhXYqqDRGEQozKgsAznNUW5iLEuSVQzGMYw+bTQ81aR6ZBeRd4soQas9xxho4XQxbKBT1BI8dJ8XCE4xBldSoUAAAEAgA1ePEpT91TeQwNFDFxoJjopcuCPtYGQCYIlpwARpWOPF4QnMDAqboDRfmBudoY0IBIJFalpoZg1K4Chg1WFkknZf6DZO4IXEqm0JmKKggVRsmBTZLjjt2p4ZJRJP1d5b+AGbX+bw+hhMV/m8sxwBIlZ3N63dXpP2bljKoyQbYdbYBQEQz5T3LI995LYw1dLA/lZ9zHywkorvjaVgP6g5TcgC9nt0FS2+nQSzkwjEkVDr4g6+NmoQDI9iqNoShmS4Xk79bcRavd2W80zvQjDkN//uIxOeAHwYfR+49HGu8xGk9xZvV6VaZrwgpS+jrLd1PL7VVVf28X1Y/55a8VbwQcAAAAAAAu8y82QtVuCgPUkpVCgTJmVDxbBEqH3ILnmeX5qhWiozuA2kJplg+Ajqm46dR168ABZKaJK6lOk+6gJNT8SlT8VZTh2ATJCMeHYcrLX5RRlEuWYPBP1WEGKCsgxqN1rKZaz/9yDppv6icD+cF6x/gujBPK17gwQa6PrvG5EKFRvG9ft+951u7Dmama1XK39/4sxRdfOsL5e9eTWtF33TFc4hK2LukuZD8h6zWm3jrX+7QL2+CV4DmNDe3AZbX8QidZqnEO+XeAXdm/fZmgLOHNN1dlg94xHXosS1Ob9WRMJVQLHIK9k7hTFEiBk6IKAjvR7aYh6YKOXYgvMztkMdBUJaZk3OPOYwaA6HbSN0MugUwMjG+YiE3En4VqiJiMmIJHOOGqwWDSF5OpOlN4hLHevu8ATJmtHVcqivQYTBVzKSS3lMBkaN7zsc+5F+9oP+s5/f/CvUHA2N//7rqdO7dzm5zeaIp953/k2RQ6+ovusf//GY6Zs+dv28+olXu4T053GmI0PBUkoccai52CAXQ5S3qHPqeAPtl7HYhCAPcfnvneYimebVttVDptvYqsxjq5z1KxVPlLl+yDzzdFjTj4s8o//uIxOUBnmYnRe282yPGROj9t6/MqUlzS+EHGrWQdc9JGGTR7edOHLVXba9n60zqqBBQAAAAAhCrwcvsRbwRgdJNrAG2IJjAIW4U3hUdZEYlmApekNatHWZAxXOQgkHX+nXPyfEkSXBrVYknwDhEwZnO4NkFXKqSeEuWYu6IkommK5Sau1OYqNLkNykFybGXvzGJ+st+lt0MN3pK+Gfd2M6VljfY3O/WepSVe/H8I/WEITyJX32+fihY4RAYu2yJfL/uw8cEWZqX27sGwp3yaSvX9SPM/9sBmnsbFgtTN7ZUrh9RjohnxQhDT1/t/UWxFPWt7aW0XvZI9zMoXLqdvprL22obxFQrtNjc/qQm5EpN2NnXpc/uo6mqevnQXLYc482EHmiwtrLEDAAEFq8yWG2DI3mBAHTxBNM2SJAcI1M05GcOmOAQwPODJQMUDfyxUYmYMJx0hBhwgWOwBv5bDRiIAEQWk1O8CZTCzDg8A7JIga30Wm5IroyIKi0umuS61E1tlADj0CuDWlLtkyDz3MwHKJdADzUG6GplKE4cLmeFBVJQlIMZbb+E1GvbzxfmxbIQeRx41QxvYgJgLDTxeiv7HZnU2vtUQn73XlUiqnh7hVeF8d3peDACWFhgapWE1E1Y1Lm2Kn67VdrGRR7bYA0dnZmeRzak//uIxOQBHuofR+3ldyxLxOh9x7PMC9kUG1WWoZjy/c0dLx4sv20xtZtf7vu9lbxvn778Kh5WX4PjnbJ1jMDkR9MZcybavUUXLHbR6us6vqo9tTEv7G7QVd8QMAAAAAAAt44+CggBAgDKb6kaghwwQDRIRMUVf11kLDOZCErqTANq0slzuiFRHAR+EA55WtSbGBDE5GYJnYlg6Dg4VmKJIdWB63JEumAJQhzM/gRDaRPwxWH4GMAgeSlMHwy/cAFUk6hpTjKZf3Jn1qW/jrS+KWj7jlqGxkl8soja5WizJZimfWclUvJAIs8Py/CUiwaUPcOSmmycX87tzc2ze9LuvLBMgZyerc2rBassgK+a36S8TXddR6wS7UhfeoCwe1OYKVTFN6dn273mb2tG7B1pry12Zgy45qev1epnX2vaxbZ/737V2vWhLruzR/EtfmGW33VkOM7zC3HP+y+Kizy2yertfyD+WxTQgoAQAAAIBV5icEuUy5UlNDKMxpkohg6QZR+fd0hgDmKY2BBmg1JaaUtiAoCM0iJPuMPHLLEpAAZW73l8cBg0ExV5CWso5K1KVNcLCYQ480ZhuC5qACGBlliSS6J07kE1tF2msxvU7nPfhb9uTNM+d7uWJ9brUn55jJMv+5aob9IrvPL8PrgQOd5q53Ffcsy5//uYxNAAIdYnQe5lmOPOxOj9zK7k3DczSYvrnAuZVFbEWTVN9tRs4k5uY/xNExEPFp+LqohB0Ptss/vaQJDQvXZ8/MfMjsWP3TKp73Mt909sQ6jq6cHptFrzTPq59Zs0yGnLc4vWY5x9BMlOTagxjGq049NUogdVpxBgABAACACrzF4EUefdeV2DCoCTGxyMCA9XaNModAQgMyMyzXYPTAdeH4S1cLAUywJmG0E5SWuID2n3N0w4Ch4LGDVQcGAU5VW5XicEmKAnLYBcF+pqQFliYWRClXlKJKSgYwEB6DOZimXIbt4f+GMTTgvfrPOJLNpOTXM8FcwNXuxaVcyf4mETxkakcEMHAs4XC7FpG8tGkkiOSmeU6SyIkI/dMeEGbRGsOxlposZkszOtTGqe66xP5v0JDyomjVJ03U7NPKgowvGetDX3djyyreTnSrUWayowbrw30ikm60qxo/CGv75tYWXKWhuCL1sMYaqoTYivFnJw9Xa6a86QQAAAAAAAXODhCLjAYIwqYlawBhy2ZoQGCBy4qsUWuYwsAPzTMh+VwAjuID4NfS/EPvBeyoREOjwvYv0SPwOEjAVw5w5XlSulKaHx7ypNylplJMp3rC5XY/SWmxG9invs3v+AWn95v/mS68X/WedokM3l7Ct9hfSX8C9vUmrqhy/Lmr3fWHab394cksOWMfw7qmkd605sTaiPgfR8v3ydIGtsJUKgC13qPcsYVtVYwhRzww4keBBL7rpjbm4ZThtP1FPSG4sZ//uIxOQAIAYnR+5FPqPXROk9vC7kENmz9TxPXFxMXXTdudbUymSjZ6+jUNNPd1ZgPjHruZKyKnNMTP2ezzUaXSqmJohAUAAAAAAAKcODjt5FUAV4AdsyCSAMN001eWn4YOYmlh18DoQO/QxxD0wGIDg6JIg/CZFO4UYMBA8V5zslGAMsYQhAeqSZ85F5di7IoVwEYGWyqX0VREEqAaEUj80tSlEAxVpn6+edR6VpWd491MwCiXzDCatS8DBeT0tblJGhEFJu/hN40MOBGWrD+0o9KcjZ7HtvORZ1rX8F9rG74y3OH/9rP9/NvZrZNbxXC8O6PiFXcJ+de+1Vs+Y90nr8t6u15N10x6sxtIxqt1GUftoRY7KMNUWZW3Xsv+b9XYJyd+nczRotxyVULucPGoCVTVurVljuYlsw0Q71ZllVAddR9yjNUJygzrMFAAIABM5hkDQYK6fBgmHsgppYYwBSYOAAhIZe48cdsYc44BCluErgdvAuC6rz7P5bk/SfnMDJINRe9wCOhrvDoID7lLqW0Us3LAo8hmzLLbix+WdER2q6q38DYxIgERIElFWtPWKUDAM9jvDW4gJHd/8JudcMGA0i5rCNxAZGHItYcwyjAcTV79BnUpmESPKpLKeS0rJ+7uWudlpFj1iCiwd/r9+XEFBtbZls//uYxNqAoPIjR+49nqwbQmi93bI98UUy3tlwf/pn+ymfnY591Rs5Blx7rPP5Md8bbWsFYHT/23vZHgqx/B7djpAretrJ1l79lWnv+aTZY1WsOuuL4EfPad1bq9LXwqD+2uuTXmMXcxCyt+kgamVqykCgACAAAACpzBokKBFFiEY24vQGRwEYDDJblwITaloVox98EtXhFSPjoPaka1YL22rmOW0ORQZr/JscAmMoNji5zNUM3nFx2EBMv1jlb/MVwfqzJqupglNKzLv3O/pBNf/6m+Q2RXX/uVLzCUink7lW1EioYgS5ld1rEHEz+df86sGUe+0/8syG/+rOOOA0MjlSCMv83or3xPkVvzwmJpp8U0qc1Wbk+QtPitAQLo2n7VfTzp1zwQF5mrggCGdPbJRLNvNSZVsnY34mZew1WuKQO0w9WynK25Jknj0xvN6K2uU2WRWqwo1dVZfNFJYAIAAAAAEBPdYWTtLYHkyAs4ZMEYCH6jac7J25GEhoYumAPyZjkQqvfVAGskEkJwlUjoEAEguYQArYTK7j5YJ+oNmGAx6QClC4EZgaVtfEAey6VRiW24beMlBWOUka7cuFQTYbbt1r9NgnTzeVX4AaANBVf8spYlujrAvd6xtioUxXmEtwsTgCDqb91sKd2rf4ynDUsh6/3eWfcL3/U/C4734b1vKP97b19uX83v7mEtl9v/53dm5j37k9G5bb//xztY75++WqXPHd7lJDsDWbc33CGL9bs/Upr0qr48w3zfJ7//uIxOiAHcInSe5ldyRKxOk+ubAEXc9WqtNbw/c1zHveXedx32tPWNW90VfC525cw3Y3jhV33vO53b28bPdW+Vcs87OFmgAAAAAAAAAAABRJDi1e0LXGCRSiEizJkRDBoHzBUdjO8ljCEVDRglTBQJTLUxDAcWjAF9DsUPDBFtjfMMjL87DNMohklGTeGBRybZwxiI8mqliYGBksJnctMxgGgdAzQg7L+jgYMmmc1m1wEAhwJmTBKa5YD+JkGY1cZEPZlACmFxwRBxKMw4AFKwAEiYNFqQwLEoJCwAFR4lYW1AIUAQmL/LLL420L76tyhSHABAiMxd6GDhcIqxIZEQJnlVVuwMwKB2EICVuxSxOJF2C0ksghlFRqj2uGkNEi1zeN2VzSpzakrirRTBfmJUdISAGebA2a7/WwtDpnen7aAiAGyL1hpvH4RDZdFmgSd42Avk5T7ROEOzGJG+0bkDgrgnWeQO3fV9qEXyl9BLNRq52B3XjMEN1aA47SoU7NaIWovDcMS2GHvZU+7yMphiB2tQ3AjWYIedrUFwJZxxm93cKurWedS1Ut3Lm7mntafSS6Dp212hht9Ii/rzxSGqKYuc2w16HHXM8bqLleB32HPi5DDXqcdhz0uQ1luzW6BAIAwIBQIAgAAAAAAAMu64ANapsPAwED//uYxNmAM1IdPfneAAOuuST3LWQArAw+i08DBsRsDJMMPwDA5gY/Br+BjLSIBi/H0BhCD/+Bo5j8Bo/dMBoFGiBgORN/gYrSjA4/QGNgk4GEoUYGJYHYGCcMn/4GAIBIAIGASBeLeBgQAmBgJCMAKBABQC3//kNCzwaiDUBAzwgkHElYQqBUAX//+McI+DoUxQIWXDPCPgwKRonUG6Qx3///+I+BvKM6I9BukK8JyBvKMaKVBvMK8JyBvKK6JxBvN/////4rwnIG8oronEL5CvCxBfEUiJ9C+QpIWIL4ikRYQukKSFiC+KpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.55512500 + //_tone.Alto_G_5_R_ + } + ,{ + midi:65 + ,originalPitch:7000 + ,keyRangeLow:70 + ,keyRangeHigh:71 + ,loopStart:10310 + ,loopEnd:17299 + ,coarseTune:0 + ,fineTune:14 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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' + ,anchor:0.13128126 + //_tone.Alto_A_5_R_ + } + ,{ + midi:65 + ,originalPitch:7200 + ,keyRangeLow:72 + ,keyRangeHigh:73 + ,loopStart:13185 + ,loopEnd:19691 + ,coarseTune:0 + ,fineTune:2 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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' + ,anchor:0.31099999 + //_tone.Alto_C6_R_ + } + ,{ + midi:65 + ,originalPitch:7400 + ,keyRangeLow:74 + ,keyRangeHigh:75 + ,loopStart:15408 + ,loopEnd:22254 + ,coarseTune:0 + ,fineTune:8 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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' + ,anchor:0.28615624 + //_tone.Alto_D6_R_ + } + ,{ + midi:65 + ,originalPitch:7600 + ,keyRangeLow:76 + ,keyRangeHigh:77 + ,loopStart:11266 + ,loopEnd:17289 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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RgMAj///////////4JACR3QoAgAaSiFYJAASfQ0BAAKUiC5Z5KVBQs6h2QXLZIeoOAgBkwIAATAZBGAoDQCBCMBoEUAANgID0wGwRACA4BgPjAaBFMAAB8FAgmA2CEYAIDwOA+MBoEEwAAHwcB6YDYIFTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sYxMIDwAABpBwAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.25924999 + //_tone.Alto_E6_R_ + } + ,{ + midi:65 + ,originalPitch:7800 + ,keyRangeLow:78 + ,keyRangeHigh:79 + ,loopStart:20531 + ,loopEnd:27151 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:32000 + ,ahdsr:true + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//sowAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAZAAAyfAAUFBQeHh4eKCgoKDIyMjI7Ozs7RUVFRU9PT09ZWVlZZGRkZG1tbW11dXV1f39/f4mJiYmVlZWVnZ2dnaampqawsLCwuLi4uMLCwsLMzMzM1tbW1t/f39/n5+fn8fHx8f////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAPAAAAAAAAAMnzYhcwMAAAA//u4xAAACjABT7QAACStw2d3N7AAqALAAj21t+4PlxOD4eOFwfB8EAQBCUcsH+UcUBDrB/+CDsvy4IO8QHIgBAMS4Ph+JwQBAMfunOD4Pg+CAIOUCZ/ghwGD4Ph+CH/+D4f//8Th/PEoAACchiIxpRSyNyseIjAC0oI2MAZGUOCwoKgRjAWVQ8BKRgwgZ4BOQcCkiwGdxRPKWBIIFTDwM0MDCyiJrYCDUb6cAnhf8ChS5gUpszehz71CjdI2hw0jk/NFGIJcZ1JaOAD2uTNNNgWO0rrNxf+D2cWIzSvlKopTVo/IpfDcojMEblkglE3I4b19a9K7OcuuyWGoLpqWYl9G/0WpaFZ0V7Lq1Wbi0uf2KWfi96Rx/l3PC7exxd5sE3J5PT38IYpLN6M0nI/OSmX53LVW/S4Vb9izTy7t7lvD7dqZs2d44ZfaqZffy/WtaoJ7CpnP09buNbLt2plzPmFSvr6KUXLO/sXNY3s6HKmjtWYlW5NR1berNN9bHGxWkNizh+VW9hf5jS4d7Wwsd3usWrVQAwBBH2SZWr2pXDwUDMFQgLa1hbqRYRdHgKxVpMhtTIMAWetJ1p6kTTMsdDqopVtw2F3Um6erZrOiBQw4OHpMmm2woQbygsBuvKmimbafcYsK+0ph9/2EJ8Xe8rz7SGuu26c8/jA3zpKXPTc0i3vhu/UiKgag8D9/VJYv3u3cc88/1r//nP+MQ5z8P+vb/+9qRiX9/96w///8MN9/+f///1KS37r6xfIYgDMsUDECCdBQEGCRiCSUIY+EWqFR1ogdEeUcOW+iwdeuqMEAAUYAAJbvNBJEBK8kJ9QZAQcdbgVyZU4JgLAducruisqzboY6KLsLm5WoIHD0zuCN15DhisDHRcliJpECtaB5RTSkZBHoYGZPOvcd9nQIRHTMwirc4+5nCp0yCerW5mqn+BgUZo638YA5EWyx3xfcVva/SToMAQHRyyz0AAk+p+3vbYgoBuZ3N8locQ129rFudDO/qorMUDZ3PHXXRavczuWpsHJ2PxmrzbIGn4Y1ebUaf+5V18oXRn+L8RYsLF9YlY5q6h6wuma1cyubNvfqpmzWs5s4KHMuJlyN5SM0bF2RatA3mVHupY19Q67362U+LUz8VniY8JJr0bUmYDMj//uIxOcAGXk3U/2cgCR7xOm9vT606ej2AEYc851HZ07fESzauHULU9bs1ab29YZMUh3JUYABYHADATvJAxGiGnZrCgCRDNt9Vq35CBQcTFmpyC/YloXHwUCgwHzqQ2IgA3wxMtUwURuhbrCNDjV+7Z7KTRyQeJeblOTEhpmg/CpVU6MCWn+sRm/jGV6/vCnpGtLco+Z58fLV7DHI1B1Ws4ioRkmyFh1gzn1rzMst5AE241DN2XOBhA4tVIzFQN0aJkF6B3J60CgXlUlGRq35DMm8eq6+X+NFNvUH6/5MF6+FRzcfCoOTvN5sel26SRfFQVpX7YNX/6hN49w+VHfMG3cQN4GbremSmdNWMS109uY35ihBDEu80OAA4MEIRJePGqdKOC2o+OAQQ3o3P3AV2ABVPNXAHHpM8KIKD6jaQfO3l/HOg5pwQYeHJgu1KREJwdu/ng+5ny2pGWdd11SwKmLhk3Wuy6QmYgpMIug3a79BvDueEVBo2nDf3Xzzcaz2t9a+LElfCUYaffDVF3JF1CRd1j6yyPXoGb9QviSelht5aSSM0DgzJsmtMqAbCYJoNLBuydaQ+S2ytqZbFcMEc7b3+RS33OEIdE93cHvm1QcV9SVtjY5gOXy3iTWKdG93fuma5zc6503Be2X1ap99shgIs9szEOdR//uIxOMAHH4fVe3FfKuzQ6q9uC/NK5A8sbem2N1nn1Lv5TAAQEDABCXNtCDLRgwIUT0LOCRwUFbiw01qIrBAiZOCSlSxqrqvIEom+rTLZBxBNeojCwIzIBSSZbDTPZDjnbvxg2u6RYafStxUiDCsBFrNbbfrYQ/MqqTKQFSuJybKgXt2rhnNkAmv/DeF/5T/75t9CJslmFB+257zr627JEyQJR91E9jnI1rIwVogZJuocotGyyZRH8ASUFsyiSfUdCCl1+o2vokwXNDMjyVKP5pQqrQoMiWCGu1d2tWiRU8vnU13dRBnX79SyMQt3fyZRkfet+kWFGvAxHpWeujmc9yxIeBZWm+3ka2dUjd4hXnx5o8fwJr77ygABAYoQJrwhExgMEhAmAAJyJQGpWOgGahU465gQKnDAmPAR55y3XYw7bXM6j7lzDRizGAil3FJfLX1s37MteIgAph6PmHwCMAwYAdt2wSCkcq8QWJMQEIgCaNBaILFavNtpzC/zMGAEmEU79S1+FzePZlWQLA15+Q13F+b9Sjx22QwGBXkp9ayX0xc+a7cGGhEOtMvH1qRtyAyEa/p9Zmj/62EJQz498V/+NnsJ6ce8x9F9tO+itS5OFg1PCiQNxo+4EhPgaarvFu4Z1D3dwQr/ul6nuShM+ffOy982bF6//uIxOwAHs4nTe3F/uQjQ+m9x6/V0P+WR/k4a5Y9GqnvgUgEyerb1Zt8OSUJTHSxJ2o5jDUjD+fm2pmV1b+4YANAIQIEqdUq6g4UDhEHEoUamTEZf2tHSoQMSxZs/OWOV+hfzf+vo9PwwoCHse9oZRe1ajKlRsuQmzKwTTpa9xVDAZO/FyMP7HhgWAZC5mSy6lrTP7/KslIpORYa/8+91rbRiYIq+ze7qVb3/eSWVA4xAmfpnDVLuXgbo6mabmR6rUG0MkZb60X8kAW0L+brVu62mTF4l3ZJJNLpGQvlBrLpPzwuiMEpvXdNaR8qoUk93YzL4jJC/TVOl0uoXbu2kRhuqm9mUlfFKAVKGZVLvjOpvFIVE6lx8LtbMOoBW14scVnbFGEKBBhoJThh9fzTBYJHEjBYXZyh/CVkAQ0yiDlEYEi+eFDAP/SRE0VEaEOLLsa2/53U23Ay5oadBgd3I3SN0V9YrZfcl5or5Qgx7/bWsOLYO8BHkzybOtFWdEsC6YhAX0k5imlpGIdgQXDmN39ZPD2GFzHs/uMwMg69D5sSQoEe//YvD6Pf9zpKv/0khyii/9aNIgRUUr9SlEqOY1f9aLP/tqZZxv2Rsc0Po+l7+o989HgLGUPiad1DaQH893XPzFEHgAGEqWvM/B2/BwSYAAwKVgZe//t4xN2AHI4jUe01PusBw2r9qS9tFBalhmtERkIMfV3GR9cqxIKRQ1lPPvOECRgaHYtZ7v/t5ZY04UETgjYBNKkorDSKzhXaeQxarIhR6BQC06W5Vd77uayT+AIEDieepe/llzmXFghIGCEtQqQ29wFYuY2brdF/KaixLSVE011qeKVFnAPwkzV7N1miAaqKl7IVZRLpqSlv6jYvmYeBDSQTPqRNSKC5CIF8xdBBbm9Tmw4hvpbrc3XdE0Hara9B7E6KFZWglXqmNJ1M72mlHEDLJ+f6TYSBr2c18REuBo4zvllNm+T5IMj8gwAkAxAEA5xZHbQwAOTLbZJlP6BL8qoXoHRM3WyXe1iJ2JyT4SKlyp7wgdjCwWGqGXSGftUmOMwz8KKRxkuY0LJDsAbaOe6/svUAdstgZ7EC0c/us8N6pMk5SFvBSR9T6TquZDHgLXFhRPuUT5mlMCwWwBaC50kaLqW1Q5xqEESojU21bk0QEYF6S96Jwoj7WpttdSyPcd3/ti2LRJFUOuuNf2x9fEiId5zS+dYlvadIHHqPisO/3TeYBwuc1r5+9b9a3iYi//uIxNiAHTIdVe3Jfuu7Q+m9ub9d/P39YvfqSfNrb09pedrkRCig6g6tNnNdUVgL1xxrfznNNVj6jVFoVbuXYAFQAEIgJ8IJhYpW6lbXTrb106R+6R/wYKH4NI8GNvFKeA8GjkQbS3Jt9BkUFk+VYZ/ubyqwzGmGhw8e6HCxM2svjFueyjsVlcMBUFNTzU9nNyoq3ct+eohPxHSLqQW5syExDG4B5EiZJuddBNGWBQoh4KO5ib0qTqWeD8wasVDBHUpqmLouYeVWX+iMeI2W/+xNk6fZTKda7JlgbBNUV3vUpQ/C2H963agsmxZxPNf13WPxsfd93U1a0zXpqa2KbZX0We1Inlmi6YBPH0LetQoNs4zEQwscVqvb3v5IEkc5EdqWNPGmruogATABAkApzCw9YqCRmIiGTBgpPUKgFLGY01kAhR84yX6dWXcuUMONWpZZPqYAFECqzWaarlVwiuUqlrrhaCZtYYIOsFdfCPJ1xSH2atDkxiaIVrBxVrmOv/WsLmOxQTB177O8+/+F1pQOCsHhmP2v+nudpsrCxwdNJj1PU1+9a7+oghxTVtc/Ln63+oYfgCV/8dfkgQAJRd1X/XI7yEdc3x/Tw/gRDqb9c3zLBvHaW3zd/D1Dpqanb6ZfewuG2HL1N7Z5JZcWrNjbPMQSB/QQ//uIxN2AHSInTe3J+2PCwun9vS49NbXWl9vhQWD6mrSbG1UPKy8hzA/R260tt7w8xxuQIr+3MAAAIUItS81iKhkGGAwaDg6LANZgkB1OrcQjamBg1XmtzEW/cSNyykvsAp70qayFREZEqpgoOhwKiuEsjvb2VM9YiCxm6HCWUMYNT+cFKQILIeKhYQpmWkVOZzyl+W3bvcx+V02/t44qBUP26v1a9SvSSVfZNnXVjb7h+safDaigklYKta7hyxa7a32lLjgUG3erV3udtafSWtxDD4QYUCk+/5reP7qEAIeCy3f/3+//4QG/M5jdum3cMFNMEUpfv+4ayB1ElU7b/5vMRBk6HTN9ubtHpQ2mpe3iZyta29T7LqGFRSqcZFXWdWTJ46Ups4gmeONcgHmFUVLlqj4pMdZtEwu2j4m/mkABEAHBALeOWMHipMLZvLh4ygKJiMidKhaoSp0iAzxxzO5hnRw/KJezgAjs3uZAcPGuTNbGYpbFmzEEPzacdMbB8AiIqAlAQKgRegIAw0BWRoPEARY0YWShEBn6ZbPfld5a6XS8A4gqJsmqtkGTUbjRBmyfcfKdS0SuywiQCQxLWRZlnt1D+bjHESooWUopuLwDoEvEWPpumzqWpYAryLlw/anqTUPJNmylU2QrrFdGGeOJJHWQSdJR//uIxOIAISIhR+5pd0v8ROm9rk188sGxbOJvdVNQ/k06nUylaTlgVA3UyLrfZRibJqbV9RSJg8YrTQZmtFZWkfLqbpmVJjEhxcMlMkxxBp1yikpmdNlI0TSs7DAAICHCCjvWknSiowVTYaAEHDBBOVQ1Su0CFE6Y2WrLr3/bgWPavS4KD54B0HC4cCtemaOMzlL3PS8znqhAEx+JRR3gYVgY7cdmcEBUBdwysXHi1VRsVfW6/P6s4FkQLAD9arMmtjIN0BKuN9ZNtQbeM8BZeJ+LStB1oOw/iPSEdTqLi8oE8IyAUdiUDQvImTmZ9FZwdYDBQCw9E3ZR2zJqRFeC5sn0rOnUukwqzJLVfedOOp1I6qB0dI8IKSap2rlIYo9mzXV3SOjwaIJU070KZZNpoHnvUNsCkF41/oanUPYN7Tu2NWossKmR5vwZzfpQABABAAB3TDACAQkL8IXgYNF8x4dBAPmJfGGVmBg0cmKocBHXllPnYxc3HUBkAMMjtUICC/pD2xQV5JXvQOXoNxqsiRpMvSAh9oK+EfnmsyGGH3NJxPcWQ6K5uXrmv/8rpCLUjrn6/+a/7jvGPOPJk/uPO7q45VrZewv3Jru7vP1rvfUYXX3+7rd5qzZg1O1WnmP8/X/nnUYwkFr/z3zu97+u6jf/CZymguQR//uYxM+AHiITUe3RG2wcQul9zS71WOwLfY0WAjbSu9Ty+LT1+3an2Fqxr2lb9QHDcCye5FJbB00Gk+/hyU11iEWGj55qGVLHHiyOf3XHRBDZXUzMOk9JqBYEzfFcvb2SQSUV6zkIdPuFSZVkBNru/GACUDHCIUnIi4KgrMlYGaqmBxAjlSv7WmSEeMtCW+it/k1IZesf/xiRh0IAh+Gu/hjzHl2IKHmlToGOwIIF90NC/6DiEl1n0RlLqQ2lMEZIOA4Ve/WscM0EwKFEHFk+51Fb61EaA0sNoSPo1KfWWCHgXOO+tTItaYEVDkB2K9fWIQyLvqZaL0B6EKCC5XTfV5ZLApI9qZ2ZVx9DFrS6N0y6UBGIZYIgYutN6X3ZqP7nv/26J4PpIOT8/01qBMY2qt3XCRw4xlXcuj0Tp4t2Zy3SxtyKRsTFeauv7NiOOw4pAn78ulCoAxQiHJzLEWGFAErnkXE0GpQwzUgssCHAhJi/buM7zomGwF3DOGDD9BID+013m9VcrUpaUILiEQBGsSh2PtKltvUCzBmHEAuiC4ZFVSLOyahTQiJEbn0XqRda1EeJcMeXDVtatkhxh6oo9e3qUI4EaH3/yyRYL+EQ1VtUmXSVIYNtbdtVAyLxp/ozpHkTRdfqTpCbhrm7aD+7BkNNvoRIRAWGf85H6eiqyEhjW1dEOCUDWeZY3z0OCaNz9qIlDTxCKoqv7VIHQAGGyLuVnXuDQlljzDoQIAcv9VltqWppGqo7UkmYenMd3Fq6//t4xOkAHHIbU+3NeysYQ2s9missylDWxgRKxbu9Z/rWP6mQqoGqAZkQcoOuSXx25YZ2iIofEEZzJIUSTH5lVFW5+PZbfHAURlIjEpS3d1O6pZ6Q09GgyVgxE6EQLI3+vY3JTJsqRbaaAEEAKFW5Sya67RZwYCA7MZQvMcrtmY0RNpdSa/zJTn2/6imYh902zyAVBFO2+7HGisOic9uiLoBTMOm0RNjAFgOVbur5MKHOMY/fUscSWm6sbQXg0bbKYbkYLonpt80wiK13aohCgAoTd04YTsWGgNQ9sC0FGVW00qqx5O0w5kh1HrF9KWgnGX4c55hRMLCM9jhhv8vx7FRGTHRkY0vJAN9Oxpy85izIsF5hgIPQsDXuYZc1ncw210eTRa7+X85vlWDCTjb9j2qu7Ws6eUzC0Rul7LPuWscO2X9ZGJMX7/O554/2rORdgq7sZB/Mcce1LEDvKyjPuNX+/nn9bUAOHu/rP993lrCHnhpubyzx1nrlSsz2GsO7sbzalIlM9v0UYBC3t0of/c46SkQWHdJjTznPJQWy9zt+5xGESpdjmoqKRJTVvMxx//t4xOGAG7YdVe3JXmOGQ6q9vCtkB3CBxG3PyZeweFMaZw2ysTzTspuSVVAz3l/E53of+A3YlRMC39eIGFMA46hFJlOQgAkVW7nlQwZB5sqhIrEAJbboQC/TaM4FQSqm5KCHwKiu9O0esL3/H70onwV/Kks1rmuVq/K7XBwhELeFzVe/zLD6wzQTLYpqtjHC7r6TNrAiwye1q737OGerv2FDNnGPum8UxOtR91//1vfjJAk1/nWIF/rOKuGN/Wsa/ziU749c/FMzNu/VFmnB+p5o3vu+4gEwHm+J94he1s0hIY3Wt8UtTeY+XbjHrTeLWt88/4P/+vj4rVgLg05xXW6Z/1SAqYWWd/WwAGoEGEibaTLdkGhZMATShrwDwRPQFXiAyFnFwCXbBIfljsVH5BwRndqTYUIg4bqUtanlN6e53B2xQWM8SwccMHfynidrJ/IbbSHy7gFqB4qh3Krut3n/2kGQMaIqO3vdTf9tawY0VAVf3a1m/S2Mqte/FAsOMhkUygrWnrD8wOqSS20LMo0DIhjfortOjHipn3V9GswNx2KmBs6kkD6RAxKZLo10//uIxM8AHs4fU+1h+quvw2n9uZ/d3MFVE2DecgxJpps7nkGUkOQJ9DpkDqnQfpxuCtSIpLd1VrQWs4dqWta6VUPIsiJtmS4IlKXRJpiiOC5jq61dEEQRXPzV33cQACAAwSBZjIIUMDA8OBAQBaZsqdCdsqh5+V7GFhMemGI0NWLSG3T1ptTWG44yMLCAyIqgE14Pq47yqZX7kRf4woZgiTjxLX648ARKNy6NxNyXSMIGQzw2Uim7w9vHGmtduXpeQhtLrmfM/7hrHQ5AC2CcHJhTOpadEjgEYAI4O8tnaa60mUTAZdE9GLa9KiQ8ZsZI3d/5gWjI3tv6ZTHEdKrqZNNklGaQ7R1ECWYnV3Uo1QE9hyIoHdBS0v4JROOcfuiXOIGL+Gf1wmkeur6/0x2Qw1re6pfeYAmgQkK1FztvqHBoH8knI7/nTNiTyP3W9VKAEoKMGS5ebMaXjlKHkFreU0afemakBiKUFxcAROpXp7r/U/50ghEnvymjNF0I3yfdDHmNLLl+mpQCo4OjjwRqbNGEU3JFDLSm4mfBCEgng4U7ljr/+UxGYWNG7WpvplICCANiOlRst1KezEoFszMQ5FV9dZQJkokubrduZmw3AwQLGMyNpW2tRcAoQb6iVEetqimNAWU6NIMZN7DEEMUCHJLY539SSyKI//uIxM8AHlYXR+5JfMuhQmq9qS9dB8fE74hAEgdJusrMx3TCWLCMSum1w+dhobI17+PmJKzrKPPq4lV4Ja51Cz97n/FEo2SSp/DW7yteFV3N4s+7MAJQEYEBJcxuEF4JDmDgFEgCABCCxYFUspmmwkiUDDu+kfuX59lrKoflETWQIzOYyMACEBMEXuvVsaPDK1HxQdGyoqJMEeGKmS8FGjB4oDjA/btQOsMvgzMGRECpdBf/QY594sdAGDQcaX6CCe7KIaCKwNtCAInEFn2R0x9AScILk8tbIa3YOoNIMtEXs5fazlcChgsqKqI7luktasd4YBHcg7znw/MgpaLrLSN93QI8ZktUXdGtedJwwY3Wyq00GODklV9766hzT11e3IeWm19dq1N1s/d3Y3btiQx93/6zUrmfFGQs0X5X/c3lBb/o82Bn4K6hx04QAIgIgJCU8GqwFAzWbPoxmHQgYDDVK/saayYFMxw0fpXO7Tc+grvZjIHnMCAUTEgCCSQses9rx6U1ok6pgcKA7/goZjTBQphiaQJUkSSH/f6WouHRIuOxdsF/ckoq36yoDFm2gSf+4463r9R8ySVTV7LE/fs4fu7TTQIGP40F5LvP5h/Mvhtv736/Gpz9cnx0YolK7f5YXta7rbouRFKfDX46/X5qOqb36bLm//uYxNMAHwYnT+5Nm2PpxOn9zS7srvfJFHTXbuP4mCs1YyXXEdaQIRC2dm7fqdwDw+KRNW24duGxeKmfe+uU3vtNdrWOf2PSbq2NNKe5NyQ+ulr7ltvefFIZm6kRb2Tww3qcp1AAMDFERcnDAOHWbvlBaKiAV0K8gp3YMBIT7xJIOBLdixK6S9jSPWOGBmCfODRE6sWqxHDLH6YqBZqjwpBOO8zprgWJxIcmYpDytkNmJEpk4GwOJ87cu719WNgYccOgzwq57rbzp3iJSgDIbr0srz07tvKVfYAIYAkRkje8xQQV3E2Bt51LnTRpw2FJADZWPqWk6athQ4DGIIIIrZE5qYipfGSMXSVSejKIcQTKVVVBbzIiRdMkVLZFB3aP5EC50lTRruQEi5vep9cvEkm9eunqTbYvX/Y797Bq84pvsOsUo73lYdDOP61ays2W0acn8netzcbUmACoGKGiHOodTKUpyRVC0wYBatNDUy2IgriN0xGJVcKWC39kGFrEZIHPgDoZf2G5itY1jZnl2nB2lDAeJLgc91R0OBksoiUFNz8eXD7dChqFrHtzv+WSgBVg9EXQ9N2mgWFAG2HGTZOpJJJFJJjERyBEAMIVHMUlnNag1IOmEFCQOMtmaasP4rcun/byNJ0aBOd/qYgI4EKjh33A2AlAnt75v4lQqBDJFPv+X6BRI9k+5fsZ+qShs4q281zFQypn+HxnA8qLcykbQ2s2BKD+97LqpmnY9DpDc3PVNM2oyx4gDjaRDdXf//t4xO8AHqYnU+3BnuOcQ2p9qa9duqMHYDGFakvDnk8lcoURphq7YjTS7GXDi5jM2IHnK+6GEyzncICM7MStrb/m//v4Pub2LTB5Rv3EkURfaR5RuVQaGATqGki+4/+Xf73hCLNIRGi9iV9/LD8cPe0WBpB3r+8Ptc5/xJogcabzWEyNUdQhg3iYAyCYtJa9aJ0cInYWgoJ62QXMReGUI0Jwgz/VYS4kXofUiZGQ8Tde3oGqIdyU+rWsyKxxHmVvqZkhqNG/5kbmlSqe1AxWy9+9GkHUZbp6noss44lh5e698yPmiErzvpxFBQCeAIBlzS1AIDb1qkAw07WMqGCoJXSllz6zFWs7zqXs/fYxtgqg1Nn5jW8sd9zvRolfIohjRWNxHDijzReUxt/L6jhO6BSqvlv9//rTMgyQFru+rqJ4LXiAFldzZE8ppTJEGkionEL/KRWE7A5T59uvyBCjnv+lOEj/1sbqdNmvNnjwdXT1c4RwU/7pcHSyM35xpEDe9V99GZ/9SY0kZUO8yhGJhPmKhjpdR8ChL6t0JQvV2p3fl3AEUAFBgVmM3FEGiYNE//t4xM4BGkobWezpuKLmQ2q9qStdih/UBLEH7vPvUfcLAB8C+lYmOyyH3Da4h89FLLX7aaCTomknVrb+vcrYy2agUwU+PLRTOQArCIk5q3y/rYGFsoWDgAQgpjWqEMDaxqlyp72/wvui5hEXUeOXOZ8/vGFoYA4qf7lXPHKdzyuuSvcwQIIgSrdZnbZbEyBPLjte+mo1ANKo/rY08XCHp/qaLhYdlzUc4qweCGMo2rHKUJgrGWtXeYLwpLc78Bz/9G210uYVpNf9w8HVp9GuFGjMe96MiBkcks+7UARQEUSrac1kFCDYBFQyBw0KAhhQGqlMy2/RMHG9NGNWh54pYldOnNn2mpAavhDU7sW3q9lnrU23QQiZwKcZCIoJGZsgYI70ZfdOBm2DRjNEgzIDYNLa3Px/4lfslUVMFAJXIberl/POk7DLrAQrVbWt199ld21fbgy5HQaFaKspDprMSiToBYCnRX6iiaGwL4boTKQnESEZxwmj0DRIyWdK1HwhxNsqNU6qj8PjHc6cczHHD0Cc1k/5gQ9P6hflt/ro3+rYnUotkexABgmnPZnR2iDA//uIxNWAGoIbS+3BXgOFQ+m9uavBrHs9lRlexMOIr1Xv3WIFgHFEikvInTol62IQwQAFsAoDTQ1SxplJ3ETesmitp4ZO8kYv/vMqlTGEE6WXdp4/h3tzGNKlDYARJUZkEPyWS7mH5cCnUMMbeIhV3/1/8+p24nePILOWt6u6/WUpiJgxkV5jjjj3vORqA0NmJ64zqXUvL4B7myTJMv0VDGj0yVCmqqgRgeZTabr3UXBnTc2ca7WHwFi/Tz3ZIBH6aR8AMSTnzG88Iyhv19DDTH63XjDsu57NgsB7ua6TWuKAGnqm03qTBzHx30gAZgAoQIcxhIG56fIkFr3AoAwcmBoq7MeaKSlxoMSvhn8AQ3T4ySV00bdBDmYe1hjhRZ4d+5rm8tmALBrh2IhRjbSFUXOfx/JJGH8l4IMDNLsWDnjjVL3mWWlmBMgJWBcpgm9mPaiVAXGI7WrXU+cFIADUC71aS1TemPoP1BsFEyavag7qLg5gjIqW/oFggI7VP69MzELlVftjvjlgojcJttTLud5QCoOfi/c59vHkhLps9Me16A+Fxqx8X+2NM2ll9fd8ksd0xUW+b3qksegHxsZzU7Jh58CBcdy82fmbmM0G0tS6Xgqfy1AAUCBEKLvIkecMADSQBtKzL2R2lL82pCCQs4UeU5or/LEc//t4xOwAGS4bV+1I/mOlRCm9ua9diE5nUiY4FGyKBhgiq6W95NY2qWUvshNNDLTVwNJKK013tFh9iXuASGxhYYixGqut9/P6WaeoxYBZbUu77l3etxB8S8ENbnL2P7z1+MrLhsoVd30kH2UPoiyXJMzWpb1GixwA3AIgFtIO7V1mAgAKhN/15PH4pJvW+pBNMcZHLvRtuXx4DnWaO9fyAkB4xfrW/NzXw7AygsXrNafOTeJPTJzbTv/hw733nPpMyVDQ5Ws9t8+m1SKTK30vezVK8vXuW97+U6nJiAAjAxwgGXw4zdgRg6k6qAxkLKJK6mb+AV9NtDXXgSfpKS5RvxX1AJc49E7AwWEBTJYGlsG273aCCSwQHqPZtYsMCaZSK7Mg4qMHC2grHa4uS0Y+lhYOom+5l+GrPdSUCgatca3uvlrHDfx0Ci5dWv9rDDW9856qYcDQG32eSN12UK+KKH7El01VJnwvwAAJARzSqpG67OH4A1kLmSuszUfSvcdA5Q7R4MtWrMxqFZaHv1EEPprQ/x8E61dN9qiCE8bG6Kr6s3HlJXT184Sol30mX6bG//uIxOAAHTIbU+21nqvGROn9uTPcVA/OaU61u6sywbwTV3XNZcp7REX2nKYyzT/cv9pAAUBBQyXJwE9M1AgiOg8VGiQHFcmppVQvQSv5j5A1+UU+EQh53IfqRtlAVRzay4HGgkcNvO31UKl3Keh0ucdyMDRMHFKfTLXaLuix3vsFRWJmBGCoH6dXL7k5//jcDCBqVnuWfPy1nciZggyt+mwmd6r5ze/2z1i8So8/Q71CzQ0gcNVAq9Mkga4MvkULqSNJk2WoiQWbFuLidiib9RNCGkwfauTSqphWIo1U6Oah7ZgE84f5iWVxGH+b+rZy7UFIfINo6jnuhFJtbK3dexCUmc7s629cEc+lcuQP+ykhrby/2Mq4aPJ+mw5WOHvuWQABgIgJCS6nT2lqyEELnGPDZkR0YAKyp/oyw4wZ7P4MhYBgaz27jIaXOTS4CIJ5BgJEYcAw9LezNnt2UzRIFnMQyhCjM5H4AKgcJKU/BEsl7+mPmIkWrQgjfO75W1VmgqHSyrrD+Y9/9zRKJAoz3nK6uc1fu3cqxfQyMHaXOVcXOKXZQ+get9Imk7mBsMsC9jhNHRoGamZZdA6QTvbTSVRSOjvEEyv2s2slBY1mOtkLJLNSvforXzUyZXR+58iZv1P50nXX9l3VVr24q0uzv2Q0QfVo17Ge//uIxOQAHdYTU+3Ffmuywun9uTPd/OatHEPzy1q+p2r7MmSuPkdRKuqN+2AAMDGDRUni75McYOVgKNQgD1j0krqPug4dAXrol9jOvYp5rv12smKrphAJCpD+5J+GNyXvIamXkRQJFazXDVUjxEDSOOtHVgiZiwCaYIL2hnV/eOt6ypUM0h4Ps398x1+HbCXwXDp+/V/lJ2rh9xUyYwQR0eFqdKPWLACqJWfUhW+iaixCSiclJanSfrGgkAzDBqp3XZGmQQ9pu3z10w0AfAHnz/Fd/pgggcHxm6Z45N1RwaMmnVPfNEQeDlV37vlN+zqvjbj0WDrPvayadLVJD4GZPe2Kf03smglumv5a9tnkR/s91NKuqsqABFAxxEXLyIHnTN2fwHBwwtFoy5OUyWCg0re6E027WbS22/WM0brMY0W/VWmxz/PmdRfZsOKngMUWHZYzpnw0AcGOPDQwQq4w9smCv1j39c/eM2lSFFyIk3veGNbv7xkxWBTrs0e8Lm8f7uWuCOEn43hS9EahLQSUFmZoX1NOg4SXC2FhseU11sZCLEwBxFDU71vKawio8uu2Tsg2SKQECZtj6pxqXDyCEBiY/vg61whDhC+/ZL6YbD+txvu9u06O44yK91S1RA8Xxde22xaiQOD1Xd/seblIeRsWtzamGPvH//uIxOeAHWInU+21fmOkQ6p9pq/NaQByJwWvmUAFEABBIBVMYjZ1QgaKRZUDAiYMASMcphmabKVS4bmFiaiK7DH3zsStiuLwOWDA4aPSZlEGOjKrNapNXdWoyu4CHoIFAsHGrwJLnxhNLc/V1TYwpODGYTYk/tbGjq03abSwaOQcRLOV79W+/24RYE0DBwzdSZukaqdEvE6MeFAo0lvopkoCCQXoiBq93tWR4ugyOnbX7F0lDG/+pZnt1KnaZgWv/MTEZF/+qKSJC/9JlkQbr/Zm/+1UjkyyKuvhAMgGh8ZzLO5m0SKAws+e+fcmkCWfmEOvuqCBXARw6nb1uu+PAUSXARTRFaRAL82p1cx307Z2oSOcmLbdIcw3SOmKuxIhIe4/39b/KlEKg8Kk2YYvi8z8L43CnNLppiU75GdDhlaHbX95/73xuKfgkhsfz95f3P2ZhYACnauu3Z3C3KO7rt3dgBBVbal+zbqMSBDLATAQ9lL+ZoE6A8I7L6r+1EigHUXP/FVBsRbjv3899jrQd06oqKMUAUNtv72fDyQKevNx9zB5AB8NHxxVd8KHY4/4vrNvY1rJmoiWBZ091u2O0Rf833cvirRIe1ItrMtxBnABhYXJ/a+vt/HdaA/bTZ52qsqUVOJad1iUZuUtuSQDrOxKxJKRMe91//t4xO8AGwofRe5JfQthw+q9qa/F+u/3VeAGJnveGjHlwGtww/jF5ZBLsOHMIfkH1VJ+aaz/P/eNylGBBmQr9buWfy7hrsRfACHVCbW/1lzeGcAyYDDhJnasLt8ukoC6IN/Y6al4Z43d23fUbJkBX113qWSpv3tu6ZDRclaFTUdSx8FSze66BuIOU3tT1j7JF1/smyivfWzZi30RJu5j3cBgNWuLmHZooYAQ5YRI9/gQxas+V2VAg8AAoral79LuWHkUedtwGLRVpNySqzCPPHFZXQhujlkoh/veUAXDFB21z//X5ZVZU9hPRCJqkm1p6G1uNtAd+kVXMgtEnsaxy3//+P0gjAgqlA+HMMN85nphyAhUNE2uh7GBZE6g9yqqb1LOFghoGC4uFBfqdi6aCvj31/yPGSq/vmo9oI7PrWgRQgJy371j0VVo7U3rYWsURR7b1qMBZJV0k1L7KRLylLf44ijuyt/VVBwKF2Q307nvYJ1I3w97oiUh5PPdOr3cUARgEYWAydXyMaejbNLVOmWjhfoK8QGQ01dgWuuh/4xKKeWsB5vCnCg8GCMuq/+s//t4xOQAGYYfU+1FHusmQ+p9qa+lPx3cgsqDwjGQIHKLuA4c7DkXhrv9cQCRT/95+9c3nj2ABkpQCVcrH2NfytViQiBHkklfLcxYv9w7RvIMCAcHW+L9dSxPYBUeV/0BZJEkf+YDOp0fvnBjBwD0nWy3ZbJk2Fz5EEH3dOtaxXyRZ6k3vmtIAUdNzfVbOUydN17P7iYTqW3x39NQO03qmS1mqA/Bkua+/28kgdAejz3tljdKUyWOonPEgNRTEACgCIJCu8Mg6WamDSU5iYUVOwichiPu8jgcoBpQRekvO47j+QrKhgcvoYgxAZff6Mu/EJ22+ktikbXwYAUCUEGB76QG/79tGlMXgeNzQgDDJjUv1GaOpztJvsP1MhQbUQkMvgCQv5K569G44yEMIh4Flb0PxL+1IvAEIsSVW4yQnGgSggSHP4FY9O/G6aOnttXtp/CZ1wyilKya9KxIdtb66Ot9HYKx4EseBFeIhRsg60khBB0OJeciRSxoEZJcQA0TwLueipNNMIEb6KJOpSYnO8XK2WxlLwh6jkc4Gmm4LvYTeomY2WTUdOtYtql2lLdN//uIxOaAGwYbUe3BfqySxOp9t6fURluEW1BOOFURIXaQLxJyjJGCwZRrSYXRGCNZgV0qKGTaBU2gewRoiQjRMLxNkCpuy61wADAAAQDbzKxrMstAyiUTRQfMol4EIE5oTD1OAMAFUxOMy+IhKNExEotSuhfy5W/clDFXD3IJRwI2WAqyddxFOYwJCAjEgBFRI5gpIiCigb5EyzAFdjH1is+eWCV0wZE38QlKLmRKa0Msiedlr7QG6rhRCD5ClUs5hr0N8zl8XtZ0+L8LqQQg4rYH0ac4MOQM7Mcfp9bcMsBLuqww08Lyv9Hou5MGQp2aSVu7AMgh6AZA5UljDXniXVL35iLux6Nvy6MUd6OyiG0hXUbZlTvsteKH3FaVA7XX1fRlzooaBhgoVBwHKC4kVwckLkS7QpLdIzhzQQNDAMUDComBygQVDAScAWDQy3ohAoOgaDRI9hxS3KaAkIEDSEDhFzU5EIi1SaaBoNAmmJBCoEqwwqPKhiByCVRRIItSqooiWyUPRpL/J3pYgUCZaLJd1PxJos6oYk0XBScInGERCEmKYyEIx5JhEShHiGIpIIiUYAlURMYwDQ8GhmMBUGTFMICoFEgxgJBjQDEEdIRHMgyoBEsBFHSCwzGAcGhAZxEgyIACMMFL0GQJCJC8BFGSM7OrM8RH//uoxNmANaYnS+5nCWTNROH9naX020RAAJIHRzKCGswiE0yjavMfwkZLCoEYMcsHKES4kiaZBkJhVggKjGyEzgCNLADUi81FYM+fzH5YwCjMMozEpAztnNSMjTwMaeTLQAyIRMfIjGTolOzFCIBI5EYpBN447VmGtIW8mCtJsb6QSpkIQAqgKQir1qu9Vzh1wXQb9prWoJjklcJeTP2uN9DtxEmeCowJwZCxUomWGhGOCYUkRVYqMlCc8TIVlSxYugPsyjJUqURnmkKypYsXYPkqIhLDIyMCswaQoiEsWLoD7LSqypVRG5pCiVLFi6B7LSFYqVKI2GmUSqxZdA9lpCsVKqI2GmUSqxZdA9lpCsVOqI2GmUSpYsugbZaQrKpqTc9lZVJJeDbmlVk01JueysqkkvBtzSqyaak2HsrKpJLwbdVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.45524999 + //_tone.Alto_F_6_R_ + } + ,{ + midi:65 + ,originalPitch:8000 + ,keyRangeLow:80 + ,keyRangeHigh:84 + ,loopStart:17038 + ,loopEnd:23650 + ,coarseTune:0 + ,fineTune:23 + ,sampleRate:32000 + ,ahdsr:true + ,file:'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KScPWPzqZ8/+/7ZIzB5WE2ZrsNVK09OZYwCumjQlhwHL7vMOa/md2o8jKoaGFf//KmaBkWcz//bkYNCf746pm2CGHgA9rtvLZ6fSRmhXM/umOTVYy+dnTGta0EEPInuFKl2+Nq5GHs7unY3iqlZEQh8UgzgNbjyAAAgAEBE+HENYFRcBAABAQwUCmkKCCABBwjicFLsMDDQLxwBWsBAeFFkXGK+sny2WTQyPhIOGkCjqoWL00qQG6DRKBxlgcwnjVJBAuGE6bnRXQGBIDD0XOV50vm91KSWWx4ICbukuy1l+mM6IKiAIdg3MzNbpJ0E3GaDkiAE2X3RZq3uYGJJhdFImDyBgpFAuFhjYbAuQPbE/oskgpSDVKLAkI5QyBohTTdKgtRwwWaNqqToqQMiLCtj2j+t0h8ifPqay1qqL6dL6GpAvLN6LoNQUs1Li//uIxOOAHdYbS+5tc+vQQ6n+uUAFJOk+fTOpqUcaxoYF8Y4qWZN1uq5gkXiuVEIIWp+vx/dhcLBbGEgiEBADATAFIZAYTEpykoy7UTujzXjATQDcwBMB9Mx8WJTMqlXluqtpgPILEYHmATmcgC0hmS5Yo7kDGCQEOYUIGRhBGlm4I+6+0fMBYAxxQ4AQyOkOjBICKMmEy6MY6AwAaDo8AGYBQBJkEg7mHOIwYjRRpkYBq/rfmAGAAlwW3LSmBCBgoWYqw5JhulPGNiJCYAodJkuE2mD6aNjrP8dCwBLRF3s0EgA05EkgsAEYCYJRgvgnGBSAQYFYJQ6C2YNwKJgfA1igNX////+OgCuzPwYz0RgHKxpqrrT0CAgkVjAIAvMDQCswIgVTA8AKMHEKIwNQYDARBDMEoBn//////2ws4iLUWJvA+bWI68i24w1IwAAFzAGAIMD0FgwGwQDAbATMDoD8wDgLzAUAIMDkEowFQOjAlABMEAF0wGAP/////////ZRNtRa/WbO4Dotmcus3z6WXkdu+AgJDApA2MAkCIDARmBIBqYBAEoOAkMCUDYwBwIAcA+YDwF5gBAOhwDhgOgYGAKA8NATmA8Br///////////rfUwkKvFb4GV+rZCVeK3wte7AHtZIyN72DsgcwwBAHx4CgwHQ//uIxOOAP+nzR7n/BoAAADSDgAAEMjADAeJgKzAcA3MAIB8rAWMBsDQwAwHCgCowGAMzAAAbHgKTAXAyAIDA0BUYCwGYAAbEgLTAXA0qTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.65162498 + //_tone.Alto_G_6_R_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0680_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0680_JCLive_sf2_file.js new file mode 100644 index 00000000..5bb7d6de --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0680_JCLive_sf2_file.js @@ -0,0 +1,110 @@ +console.log('load _tone_0680_JCLive_sf2_file'); +var _tone_0680_JCLive_sf2_file={ + zones:[ + { + midi:68 + ,originalPitch:6100 + ,keyRangeLow:21 + ,keyRangeHigh:63 + ,loopStart:25048 + ,loopEnd:30552 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24947 + ,ahdsr:false + ,file:'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' + ,anchor:1.17372835 + //_tone.Oboe_C_3_ + } + ,{ + midi:68 + ,originalPitch:6600 + ,keyRangeLow:64 + ,keyRangeHigh:68 + ,loopStart:24953 + ,loopEnd:30062 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:25160 + ,ahdsr:false + ,file:'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' + ,anchor:1.17523849 + //_tone.Oboe_F_3_84_ + } + ,{ + midi:68 + ,originalPitch:7000 + ,keyRangeLow:69 + ,keyRangeHigh:73 + ,loopStart:16578 + ,loopEnd:21830 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:25173 + ,ahdsr:false + ,file:'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' + ,anchor:0.84836930 + //_tone.Oboe_A_3_60_ + } + ,{ + midi:68 + ,originalPitch:7600 + ,keyRangeLow:74 + ,keyRangeHigh:78 + ,loopStart:24375 + ,loopEnd:29022 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:25052 + ,ahdsr:false + ,file:'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' + ,anchor:0.92551494 + //_tone.Oboe_E4_ + } + ,{ + midi:68 + ,originalPitch:8100 + ,keyRangeLow:79 + ,keyRangeHigh:83 + ,loopStart:21569 + ,loopEnd:26329 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:24641 + ,ahdsr:false + ,file:'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' + ,anchor:0.50618887 + //_tone.Oboe_A4_ + } + ,{ + midi:68 + ,originalPitch:8400 + ,keyRangeLow:84 + ,keyRangeHigh:96 + ,loopStart:17597 + ,loopEnd:22884 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:25117 + ,ahdsr:false + ,file:'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' + ,anchor:0.83556956 + //_tone.Oboe_C5_ + } + ,{ + midi:68 + ,originalPitch:9600 + ,keyRangeLow:97 + ,keyRangeHigh:108 + ,loopStart:321 + ,loopEnd:333 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:25117 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//OEwAAAAAAAAAAAAFhpbmcAAAAPAAAAAwAABRAAaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhox8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH////////////////////////////////////////////AAAAAExhdmM1Ni42MAAAAAAAAAAAAAAAACQAAAAAAAAAAAUQNZJEHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//O0xAAXmVKSR0FYACrdYwQ27xjGMd4x4xjGMC/L9jGM///5ZUksEMCMBMEdcljvN3ve+XsZX/sffve98G5u/5QEHZQ54OAgCH5QEHUA//g+D4Pg//ygY4Pg+D//+cB8HwfD6BACAYwfB8PqiVmEt1hWpHAF61GgtVrnbpoecdwjElM3JNd6MtYcIwlaDgmBXFeRnZrs0LaUclFBFXLgAwfQyB0QsxdBeRkARaqmLtP2xCdUsMVonMxmheDOzTcMo9QjWTZQaAeJANwG/aGZgCAGFAHxlHiOmn46iagTpJhtL2GRq2ONAEQbGaOaoEx2lKWPhArXzKaWvNsZRswsVRDAZFiMw024xmRqXIhwu4lnUwqRmLwLFn8uvIYkIqhi2GVmWEJ2Y5xe5iSFsGl2qkZyrFz4opmAWACzqQU/edVvgwwEwJEx2bw/NRSYMvso//PkxOR/zDrDH5vwEHNXJlsyJB7TPZWaMF53kxYDDzOOJrMPkzYwTRIP+MP5Rfr6Shn37jL9zNPFJdOU96AYagYx3xuDALGxMAkDUw8BOzC8AoMF4I0wIw4jD3CyMH0QIw1QRzGAI1MNYYHLX/+8LHP/9/L8ocuwdG78XiFLLJuXyuahx/JGYWQNhiFiWGDiHEYVIEphzCemDYHGChgTDHEyMEsLQwvQOjCiEvMD4LMw3AbzCzF4MGsOAwzQPqT8d9/DDmfdfhveesOfunr5Sy5Zl9W3SU1ins0+E9SboqfIwSgkTAAAzMFoEcwCQbiUBIwSwUAKCKjUYFQJoOBQMBAB0wBwRjBBAWMBkDYCgbmCsCuYEwKZgSATGDGDkYFILhgdgImDIEXVCBTljsqSYQhyFxCf/MIfxpaWls1oaf6zKnKZ0sZ+m6ggMDCpSmYqahZEIY7BxxGyMluZSZigL+gFW1CSg62rIkJTEaR2mtM6h61VjMajVNuUxmM2cIZayu1rsVmlzFwi+SbxjnGeQkEFgTIJARrJWxF7TABQGqpGKYZ5QcMIgTINL5M9RVTBZbOxJrUPWa0qjUutbq0uXd4444/+OOOPNZVrX1qampu1ZTGc5TGZbzKmpqbVNGpd//OkxLc76yoBHcHIAGt1ZTLe0sZltnlampuVpVLqbuNLS5VaWlpbOpVTcrU1MeBUNiUFXA04GgaWC1bv08qCsRHhEHVgqkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.01337739 + //_tone.Oboe_C6_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0700_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0700_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..6c185174 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0700_FluidR3_GM_sf2_file.js @@ -0,0 +1,215 @@ +console.log('load _tone_0700_FluidR3_GM_sf2_file'); +var _tone_0700_FluidR3_GM_sf2_file={ + zones:[ + { + midi:70 + ,originalPitch:3500 + ,keyRangeLow:0 + ,keyRangeHigh:35 + ,loopStart:23746 + ,loopEnd:29755 + ,coarseTune:0 + ,fineTune:-23 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.61147392 + //_tone.E_s_Bassoon_B0_R_ + } + ,{ + midi:70 + ,originalPitch:3700 + ,keyRangeLow:36 + ,keyRangeHigh:37 + ,loopStart:6143 + ,loopEnd:11747 + ,coarseTune:0 + ,fineTune:-19 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.07365079 + //_tone.E_s_Bassoon_C_1_R_ + } + ,{ + midi:70 + ,originalPitch:4000 + ,keyRangeLow:38 + ,keyRangeHigh:40 + ,loopStart:14135 + ,loopEnd:19907 + ,coarseTune:0 + ,fineTune:-34 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.49215418 + //_tone.E_s_Bassoon_E1_R_ + } + ,{ + midi:70 + ,originalPitch:4300 + ,keyRangeLow:41 + ,keyRangeHigh:43 + ,loopStart:17207 + ,loopEnd:23229 + ,coarseTune:0 + ,fineTune:-15 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.54117912 + //_tone.E_s_Bassoon_G1_R_ + } + ,{ + midi:70 + ,originalPitch:4600 + ,keyRangeLow:44 + ,keyRangeHigh:46 + ,loopStart:23346 + ,loopEnd:28970 + ,coarseTune:0 + ,fineTune:-15 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.24208617 + //_tone.E_s_Bassoon_A_1_R_ + } + ,{ + midi:70 + ,originalPitch:4900 + ,keyRangeLow:47 + ,keyRangeHigh:49 + ,loopStart:10955 + ,loopEnd:16136 + ,coarseTune:0 + ,fineTune:-25 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.60734695 + //_tone.E_s_Bassoon_C_2_R_ + } + ,{ + midi:70 + ,originalPitch:5200 + ,keyRangeLow:50 + ,keyRangeHigh:52 + ,loopStart:17000 + ,loopEnd:22532 + ,coarseTune:0 + ,fineTune:-30 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.04566893 + //_tone.E_s_Bassoon_E2_R_ + } + ,{ + midi:70 + ,originalPitch:5500 + ,keyRangeLow:53 + ,keyRangeHigh:55 + ,loopStart:23936 + ,loopEnd:29696 + ,coarseTune:0 + ,fineTune:-25 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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BhwPGHBoYTBpoMkKYGFgQYcBQOCZiKKAINI0K2IADAxWCBWte4tAQDgMKT02elUgNRwsWyQMWqnr0AQyUG0O+0ihjr2+yhdgsHF7tdWWMOJOVkOocJN3fpVLH4jFJDjtsslmGmZRe3/MZXz/xlGf/x4Ivn+dBI8+/2Bv3i6aTGtaqwHhuxyFRSprcSjOtZXI7f3+ozb7XrdnMMIagqb/KrQPdhh2ame5/fgjmGNNSz+ufnSYayrf+u51M/+tTXu7//OgxNFCnBaaP1zIAL0QovzoHioLHKuNbmGM1GrHN7pL3MtXcO3MbuOW6aXUm+fzC5u9bkP2a9+VxyivasUvMcr9exvDO5UAgAYAkAcAcAhHpZLN2t2FoJgfgQGB8BoYEwV5rV4KHoWkAYEwMhicAXmA+EeYbYHRxPdTm2FWuYCwiRiFBdmB0JkNFHHgtWAdOaeIWLweJIxFAoxvLAyJAExSCc0ClM8u1U5+V8Cg8YYg+/I6AYABRY5oI8pqMhR1jvzxDILDwAEIFFYFAYA1hSEBza3DDkUhznLGzP6R2gGDIXL3fl0EfDCQFRoGVdweb6HSbU5IZoswauiwZdI627hr6DgBuufE2py2nVibSCG8MDA1MNAtMOhVMLBhMOAYMaSKMGxa9ypcVgDcbO8MveeC0t023gUobv/z0MTyedwWhx+e6AjOos9MUxpCYxOK8wSFsyEGMwVJIUAwxZHIwzBswbCqGEzL7ZmxT9jG18UiFpRlvVRiQAO+yRW95mJtgaA6DsmAQjmJgbmEgnmDgSGKYsGCogEw1GHw1mBAZmHgKmDYpBcEjCcHJDMxqCpfSyeA5TaqUMTtt/LHXjs3Bk/HpY9Epd+UvO5DbMEcMqAPaTRLwp6qRBIGKHAIBiAA3eCgDhwAgwBRwBDBEDHNmKRw47JdapssaeS0lJXatGo48kYW6qeOMTYY5DOHrbeDXmaZDT6QtnMzT08ufxG5dYAANI1UINAZVZHJEGSqAuhKXSZc+0jZTHWuwYpWS1G5F/iyQCEXGZMvEAFMw1MzVc8VDAtULPIpNOm2tLDKDMurv67sO2VQqAEDJKkKgSBKAWAECTVoSFDqpCKSXFhUKsIhUTAUFXAq48VWCp0sHBEDTwVHgqGix6z+JTsGlA08qdEoag1////7K3FTsRQ7TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//NgxNMcuOn1adhIAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:1.27492058 + //_tone.E_s_Bassoon_G2_R_ + } + ,{ + midi:70 + ,originalPitch:5800 + ,keyRangeLow:56 + ,keyRangeHigh:58 + ,loopStart:17764 + ,loopEnd:23658 + ,coarseTune:0 + ,fineTune:-17 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.70185941 + //_tone.E_s_Bassoon_A_2_R_ + } + ,{ + midi:70 + ,originalPitch:6100 + ,keyRangeLow:59 + ,keyRangeHigh:61 + ,loopStart:10384 + ,loopEnd:15946 + ,coarseTune:0 + ,fineTune:-2 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.61034012 + //_tone.E_s_Bassoon_C_3_R_ + } + ,{ + midi:70 + ,originalPitch:6400 + ,keyRangeLow:62 + ,keyRangeHigh:64 + ,loopStart:20220 + ,loopEnd:26128 + ,coarseTune:0 + ,fineTune:7 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.85215420 + //_tone.E_s_Bassoon_E3_R_ + } + ,{ + midi:70 + ,originalPitch:6700 + ,keyRangeLow:65 + ,keyRangeHigh:67 + ,loopStart:16370 + ,loopEnd:21725 + ,coarseTune:0 + ,fineTune:-32 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.84390020 + //_tone.E_s_Bassoon_G3_R_ + } + ,{ + midi:70 + ,originalPitch:7000 + ,keyRangeLow:68 + ,keyRangeHigh:70 + ,loopStart:17526 + ,loopEnd:22530 + ,coarseTune:0 + ,fineTune:-4 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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wCBmMDsGALgcmAWEgMAAGBeA0YIgU5gWAxmB0AEYHoIxgdg0GAmBb////////6JpeVIhFstkkqgkXqg8mSslQlXxe5Q9KwUAiAAAYBAMMA4FECALjQFJgNgcGAmBgYBYAY0AQYBQDZYAKBgHK2QUAiYCYH3//////////qCo9KLumlyqZKpd6sCKqhyab3JgqrL6X+xVL1jCpwaAQkmXhBAA6ehVAHZ0oCCQGBCAAoiAACQQASmIu9BMskRgIMyViAgCNUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/8xDE7gAAA0gBwAAAVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.86036283 + //_tone.E_s_Bassoon_A_3_R_ + } + ,{ + midi:70 + ,originalPitch:7300 + ,keyRangeLow:71 + ,keyRangeHigh:84 + ,loopStart:15802 + ,loopEnd:21136 + ,coarseTune:0 + ,fineTune:-27 + ,sampleRate:22050 + ,ahdsr:false + ,file:'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' + ,anchor:0.07700680 + //_tone.E_s_Bassoon_C_4_R_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0710_Chaos_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0710_Chaos_sf2_file.js new file mode 100644 index 00000000..d25a2898 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0710_Chaos_sf2_file.js @@ -0,0 +1,110 @@ +console.log('load _tone_0710_Chaos_sf2_file'); +var _tone_0710_Chaos_sf2_file={ + zones:[ + { + midi:71 + ,originalPitch:4800 + ,keyRangeLow:0 + ,keyRangeHigh:49 + ,loopStart:2225 + ,loopEnd:2564 + ,coarseTune:0 + ,fineTune:19 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMTWA8AAAf4cAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.05204082 + //_tone.Clarinet_1 + } + ,{ + midi:71 + ,originalPitch:5700 + ,keyRangeLow:50 + ,keyRangeHigh:55 + ,loopStart:1891 + ,loopEnd:2094 + ,coarseTune:0 + ,fineTune:20 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAADAAAIDQB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAMMAAAAAAAACA35+etEAAAAAAD/+9DEAAALVGFGdPeAJCAzKHc5sAAABGN8Qw8CfgXwCMCGIeZbn5E4WwuB0MjeW8NQJoSxUZY1er2dkePIkSlKUve973vDfqx48DEHwQBAMcuD4fcCAIFATP//+XP5cEAQy5/8QAMH8uCAIZcHwfD4AAAAAEYYAAZDSsVtlph2kiTyMC281mFwJUzhoDEjkJCIw6VwgYGDzmZqBxjsumDAiY4HYGERgEkCEImhupgpWbkeGEnhp8QAA0mYx0ZRgNMSlbwIFmLlLIHCeRnzxrMcVBYvC5xgIIzZKQON0d35f2vRgIqUvnJS46Egt6oY492HGoUt6RTTN4OfiURy6yeKNrRwRVlEnnMqeUXp2LQxK4vS2ILt6wbFSxaYgTdW/Wt3rOElrQ9FYHleGNqxORSN1r96/b7hfr0+7+ed/5Zlcr53qbGzQUvcL1TUtzpJVjvG7n3LWeO9V79fOtVzsf/MeZU2OHe2985FKmFb53Dn2rf+z3f6f/9qQGkYFgAgAnJd2khYpdka8ZwCpE3QxAYh2VBWM4N3X/EH1TqwPgEownvuVFmNFZ9Q39WxxkjrbX5oy7tAwlYl4sN/nWfAcJY8WND14EWrG5Up6x9Y1eBF+q9sZb6p1Z6a949Xk1Il6w7ZZL7lxDj6zfL+cTr96lHDlE+tJdfU5EgxUuXJ/aqEQUwAAAACjMBgUMNiEMvJQNlwfMNwdMJQPAgJmFIZmrITAocgsEQQAAXAUwRKEwPGAwOB4EAgYEAcYVGZFYzyBmMkEAz0ITIYTJAGZSaSHYBAcIITcwuHxpJRcVBBeldYGCokEgqBRCIyIAAoCGPiSYtCpg8ImUDyFwGOAAx0F0E5CJQEcnkMBAAOIyK5hUMDwwf0ChNtVukRMnJUghbqgnMEARsz9Ou6AoB0m4bL9u6+4cD2zW4xDihiwe4chvJ6lEJqM5VFKItE2V6n2h5MvcCbVXh+cZBA1LAMulDd/j6wGTou9Zch++szymozR5NMtTDv9eqHfnoE6tCWSl4s46yqcji9LbY5V1/YesxSK7bnSTTKYfyfjCSY8lVnCtSZ58oZdfsU2qHmqtW3ZsTeGNS7/0W69L+tf3/z/fefXodWhPAb//ugxOWAEOjzY/2HgCVet6equ8ABPdhh4zMgIVUPo62jwClcG7DM2I0AABAAACgAAAQmESy5wLIQGAeYBWsY4CCgUYOhcBBjCC9MOCmNMBMMNw8gAwcKsxvAMyqO4wIEwwDBQwlDIwe4QuODcmMN6ysGgwHBYxqQQUMDBgINWM4xIHDHhXMDgpBECgUXnd9mBikLggPAYlGFDKECqhqtJBgBMQggLg9IYHBcwIBTRpeMdmMCiQyCKyZY3WUlwYjUSaUCHQC3qqkgMYi8OBQKHo0OhYNiIBNLjL7MJZCulajsreYu6rtQGBgGHBsIBrxhwKIQIUAZhsRh2GYjDrsu/BbSXcvQFBdmPI5oTS7LguEms7EQbjEXddmVRqVfTUz6Os19lT9u7Vs0sO0petB1KQQAFGotmlIpw3qaboSl/X9lVrv1qaZjOqWXWoaid6cpYtTQ9HbfeO+0Ng7kMElL3v45Dc37Ym3B5Izll+qamqy2ly7jqm3+/3+v13Xcf/+c/////9/Y3LKluXyuks6vSjGXyu3RczwpLEvp7fA+FXYNaxEezoNNyORFqgP6gBEIzqNZEui+pkGnCDVGczHQKY0kS6VVLkvKyJFY1CYDxOQwRHVCEp1pc89rK3ma9lrayt9lbXLfVb5yYraNPWmbWs9+17Wa9a2rTH2VruR3isjgXEVCxFxRXArJ//ugxPCAL64FS7neAgGNlWO3sMABTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02639456 + //_tone.Clarinet_2 + } + ,{ + midi:71 + ,originalPitch:6600 + ,keyRangeLow:56 + ,keyRangeHigh:61 + ,loopStart:607 + ,loopEnd:728 + ,coarseTune:0 + ,fineTune:20 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAFZgC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAPdAAAAAAAABWagXgXkAAAAAAD/+9DEAAAHcCtOdPEAJBSyKfc5ogApp2a8uajai2C2CaC4GRFTigZIlKUpQWBiwfwQOHOsH3+A/DHL/5d/BA5///WDgIHMHwf/+j9YPg4CAYAAMIAQRAAAAAUBgWUsFQQePZbXzQSHLACMcxAzkPTBwGAx7dEyQDjEoRGAIFAEYBCKagXMYcFxCBHTwMFGIJJ0lVQYIOyFoIKcIoQQRpBI20Sdm25vsyR+27veXjlkgGAl+GI2zi22jI2nwKtNOtaIGEJJKaUTZY248ERtLuHWVt+tNp4WCIRPAWgVvXNUqSyWQRe5FnQlk3GZhtHsqRGe1DkvsRSxCr1rLmMik1LAkrnt8+X09NQxqWZXflFJcs/Z7vW8o5VjdJ+cxU1j8Yy5as2+yjmOt8mOYXuVLH/S6l93VT8rmHKfmNXfctd7Y32p9zK/eFQglogdDDxjhiEf//uRo0IbG4Sh4WhQGBAIEBESAsoFEsQgCkzHhE116CDAIEwQCzJlnWdJ4qaiQXKUqQvNGJ46g4GD82sm8YpnC0PGDOY89sSkRgbOZstlhGKAtsrZ1kxHW8QujmHD4yMFUxaisdCteaxa1+U/5gAGYaRCI/MGFR0SZXOLxUGaYwerWtbrWltzTvPS0qD4u/FO47qbcfdam7WpsrLAofghKprbPGISmLsExjbXJyn1llrLLWWSGTI1sF7mRqKF7mZqoLsjFdnEOVXYgS9DEOayy/LL9Zf6GTM1UE5m7rYVueNnjKoLlkQdyKXIYnO0mGeed2V03/l/6///9/70Q1Nxymu1P/dXV2rcz5nb5Xt2K9ucu25Zu3LMbcYvZxix2MUn//////////f/LL8sv1l+sqHGtQ/ldrZ8hqnmHClcEMqgN6GBPG0RW542MK3NjYxVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uAxPaAKUZBbbm9kYAAADSDgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.01668934 + //_tone.Clarinet_3 + } + ,{ + midi:71 + ,originalPitch:7100 + ,keyRangeLow:62 + ,keyRangeHigh:67 + ,loopStart:1024 + ,loopEnd:1114 + ,coarseTune:0 + ,fineTune:20 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAFmwCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAJkAAAAAAAABZt0RKYZAAAAAAD/+8DEAAAGqAND9BAAI7IyqD828ACmEQBkETcAFCebGg+8H0sn1g/KA+H4IAmf1ajhR3lAQcUd4nD+D8QO/4IO/4nlz////B//BAyAgCmQQADIyQAgB2IqaywAgqF6VxiCsm6YFYGAASmRxAU3c6QdCoeaMCmKg40OlUFASmYMHGCTAk7UJ4i0PEYTZRJhaIeP9vOgsRnnlQuLIjlKXZiKM/iEErQlDE8SdiJUXJpFzPl4phxlsVZYI7olzXEgvsK5GOTBPcy1lqpSiflTkBjZoarTEKC+YIM1D8cIq0srvTPbessLDprVr93TN1XtlVrHHiN7g5NN7X27fpxCUJQl7F1ijfiG3xYUuXkNv3TGtWzCie2M5eahanltaJNG8LwIUb0kkpDkpEiTSjLn7///39e+Pv2rvSAAKGAAAQgBAarTfP705QqVnVMFjMGAAwAEzRI/aAJn4qgow6EiYDiRXMPhF3DBwOMBAIhERjTKdRlaClJkiauy8CnMdAUcQAgIBRIbiCQzjp0PxSI/mJAtcdWGEBt5eVPNx9x7isYyTKCzPEw3Ka7D0igR/46/jmUj+FsGVM4LtuBcaopbajc7A0OXsO57ylMG15/KpYjMcf+euz9eN36T6K9GrF+zbp6K3LKOvlR2ZXMx99YDkFHl+dj6fWNTdq1+dizbsWM/28MjfzOA6z9/GIvMYTOf1M6bfcq9fte3TVt2/x3hc/8Mr+Usn6SWW5RLKaUSy5GMKSx//3/uwCQAAJmEIxryGOUZ5xmjIVCgJmLm02AjkqzGLAQKPsMJzAUABBGqHECqMYYIDqBBHC49tLaLaLihJ3A2gFocLInldG3/aC91CVyunYVDHTqGstE8QYTYTZCW40jSQ5mt8wnz6Nuta5hPnz6NmC9Vr6NbeavXr23//zWtrb+awXr23rWta1rbfrV7WtcW/rV69e29a1rWtfmta11/61rXX9q1rWvxa//7oMTSAB/BmV+5zRIDQbGoZ7LwAFa118WtCrXXxa0J8GoNA0DLlA0DUsDQNPg0exEe1B3kazusFT2CoLYKgqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.02362812 + //_tone.Clarinet_4 + } + ,{ + midi:71 + ,originalPitch:7800 + ,keyRangeLow:68 + ,keyRangeHigh:73 + ,loopStart:840 + ,loopEnd:900 + ,coarseTune:0 + ,fineTune:20 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGawCenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6e//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAM7AAAAAAAABmta1XzMAAAAAAD/+9DEAAAIDCNQ9JAAJAAzKb85kABgAJCjnsIQz3NcVggGGLRo0cwcBAEAQBAHwfB98EAQBD4kBAEPB9/wQKAgCDvBDEAJg/wQBB3/8hBD8Th//+XD7mYADwkI0mTusQs193n19oXApiwouIOBASCAjFbAR5kGDSWBRiIjWcpGJkQKhwQMkkoxsETIIIGgDOhkEylwKjAwkcAOMAAWL9KI3hElwbiJFOFDMAkAd9YRrizxYQKRA6C+2CCW5sXhDsQY5E7IJRZfeBoq7LgQE1qGZXA8OO/R01DDCt7fLnl8YdWSQFylmZmEPZLocnqaVyCgeOcllNjlEqkOW6H7li/STcWjFyLZ0dS7D8gtYZawsZyyJ0/Ma0t5U1OyWbxz3KMtfF6S5Yo+wPUxmMcrtLyt3KvrmGVz7Wd7HH7tXfe853lPzdaWWOawuWLeOFPz///1f171/So4QAFzNWQBREQOKI0OiYShfimZKAWHARmH2YOcEy+5gDAOGCaAwQAJCQAJpjziGjO9AIgFwcAMCgC2QHJWQKbsz0N9PwoAuMBABQ0Lm0zN+NaLiGAUBskw18LADpcGfKHsZIyNZoaDn2BGAENAEvuxMtTOwgyf0gDEFFKMOgjExFBknIdSIJKIQJpPvTM6XKYNYshkSjLGKoayYWQX5h1inV3DgixAEOVo3OTkAQswoh7TB2EFMPwDcw9RnDCLEUMOcB6xWhyi3cvbt14RU+uYKAQIMAlMEYDEwFQagSA4YGYFhgBgC8xl/amGrlJS01NfqUs5XowaAEQAMmBkB+YCgHoYC4YJYOxgMglGCSAAYJAQ9/8+fu///yL1JRKKsbu34xTWDASBHME4BswLQbjABAsMEcC4wBAUSAAcwKgMTACAULOmACBNvDPPfP1j3//vc7NP9+phYu288rGuGBKAkYBIERgCgHmBkB+YBQF5ECIYF4KRgDgWGBiAQYDwKIIAbMCwBsEgYMIMBcCD/////////////////////////////////////BQBYFAGEQDZgQALmAMA+YAwAxgWgdGASBQUAhGBQCWYAQEpgUADmAuCEFwEDAlAYCwFaj5gJAOg4AQEABjIChgOgKGA//uwxPaAP/ZBa/nvEUJOlCD3s4AAKA0YA4AJgTAbmAIBGNAcmBGCMY3K7Y5ZEAANZqqgQUwAS1rXASIaqSeBluHHAChmzq2mMSZBIOJSVNVTpEMSocAQFrnnay71r6r+v7efZyqRcy6o2uVMVpsFLDQ7cpqamy3Sy27GZbNO05U8+rOZdKX9f2l5lTU3K1NTZbxqnRKGoi/8FXFjwiBqCqwVOljxYOxL//lTsRQaes7//+p8SxLv///W6qpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:0.01920635 + //_tone.Clarinet_5 + } + ,{ + midi:71 + ,originalPitch:8400 + ,keyRangeLow:74 + ,keyRangeHigh:79 + ,loopStart:1063 + ,loopEnd:1106 + ,coarseTune:0 + ,fineTune:35 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAGAwCpqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamp//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJAJtAAAAAAAABgMRIXOPAAAAAAD/+9DEAAAIJClCdDEAJBSzKXc5okBRNNN9ETd3NAMDeBAAAEUIIGn4kOF4YWD4fn+gP5c14f5QEHYPv8QAgclz8oCAIAhA4Pg+D4EBDg+f/+gQBjwfD9eBgABgASADIsabUljpgQImLBiDmoMBkOWpIHQYCDBApXoYDHkJAg/M/kNyTngoLyCVWZylqCAF0vQ3NB5DMmKxYA00j48AYZQDp3fkzKHyeRI8yKlX3H0MIsIgGMEQ5NR+lbpDIOKNlko4AIDYY9aNGH4wn7Lvu1g4juXupEOaAhSTKuI7YmYs7kOTeUFsHlUUgZ2JuJo5z26TGfpJ6zFbVe3etyGgitBb7Yf+32phAlbHsOXvqavc5TXLlJS1IzlVrcsWbk9SYYTE9YvX43b+9N2Mqm8LNJT1sOXan5z9JhKH8vW617HPKk+7PXvuVMuYznLly/e1cQDTn70xgXNXgM8UBVVWdoUAFX0AAAFAIRnNTv6ceTE3StKXyYSThhdCgudA4PJUcwoCMrKTmAWNHbh1KZ4KoHr7CgB4w4yY16cNAF667KUd3jTCdGCbA3oydsy8tf8XesynB7E6E7gAbQous4MjVGnd+3EAvnSznIefgqGWLuxBMaMMZdu5G4/oKkqLGsmovAww2blrS1iEzN+sZcgy7yZA0rpsZlIaqXSMmAcSBKMxAGmtVEj0+8NXWXSCzwlDri1q66ONa8lO91Jzla320vCforkYahYsTfPjnc/7C+bu2Z+av9mLcHZ2Mbss5hu//4yvesbFDUt5/2V5cxu63u7FKPCvlXy/OteysfMXd//W+l+v9Lq6kmAAAAAfMxAiwQEzNOETg00HMQQ5IUeAAlvWYGFBtYBnNfL+sGr1Haa9G0MTEk1LQ2WSBBmQoCKla2AEiMpErWfF/i5SKTToJS9QCuNEaJpSYyumigA5qWmskaYBgIKAFtW5ISi5S6ZY1pYZUzEotMuy/0ajUuzhlhqgKYr9R1yXJiuFNGo1S2eVpVGqbuPf1TU1qrDL+01WUy2lx/LLH//LLLLL8su7xpaXHL8cccefrHHHmVNTU1NjrKtll38csssu7xpaXJYKgqCqwVDRYGQ0oGgaOg0DT2srBV6z//ugxPOAIRGZYfm9EgO/qyezsYAAv/Bo9ER7BqJQWwVDUSusywNKTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.02392290 + //_tone.Clarinet_6 + } + ,{ + midi:71 + ,originalPitch:8900 + ,keyRangeLow:80 + ,keyRangeHigh:127 + ,loopStart:535 + ,loopEnd:568 + ,coarseTune:0 + ,fineTune:80 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjcyLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAACAAAErwDZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ//////////////////////////////////////////////////////////////////8AAAAATGF2YzU3Ljk2AAAAAAAAAAAAAAAAJASGAAAAAAAABK9j7Ot7AAAAAAD/+9DEAAAH2CtH9DGAJNJFar83skFYMhEQAClrt2+Tr8RCd3c/QAAwNxACBQH6gQMg+H/B8Hwcic/wfP4nD/BAMfBDlAxwf/wfD/+CAISgY//8oGJd1Y2IRAYNBAGFgu5pY5ZRqhMVAzdBogBzYjQ0RKAQG2xbIQhYYKGPjo6ZAUSBgkYWsmEi5nMGa6FtKPjPUIiNGRTMEAxEEJNKrssEYWGAZiQMYIMU7JL+BZsFIEdtGICgGQC/isF2C5G3sosY0pZAugYiFmGjZjoubCEhAS6GfJh1b83XtSxdEskc6zMw8JTVa/EHappbF7luKfBrbzzW3fctdjLEVFT3Wzy34plJZPlUlmVmnqw2/fMK67GcKCOW+ta9qTYb1hn23rlTkCbzwt4T+PNZPI/ksf9w3XhyUTkvt196vYbp89YdxzxznMqTlTDO9rnKmrOcrdT7F+o/EXjcjdiMXnbf/////////////////////Wv/97/X/+/w/9fz//v/3DDn///+sOZ552BA/BXM/dpQERCCVjuRJBR6ScgqRDS2i2i4s6dIKwnKQVhTqGgKzSJFGZmqqqOJAIBEUc////mZIkQCAUtNIoyCoLA0DTwVBoGgaBoGQVBV3+DQNAqCoKgqCx4GgaBoNf//LA0DQNAyCoKgqCodTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//tAxN0DzUB5bfzzACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.01231293 + //_tone.Clarinet_7 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0730_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/0730_JCLive_sf2_file.js new file mode 100644 index 00000000..6e1e60c3 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0730_JCLive_sf2_file.js @@ -0,0 +1,125 @@ +console.log('load _tone_0730_JCLive_sf2_file'); +var _tone_0730_JCLive_sf2_file={ + zones:[ + { + midi:73 + ,originalPitch:6700 + ,keyRangeLow:24 + ,keyRangeHigh:63 + ,loopStart:64517 + ,loopEnd:71390 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAA/AABrOQAJDAwQFBQYGxsgICQoKCwwMDQ0ODw8P0NDR0tLT09UWFhcYWFkZGhsbHB0dHh4fICAhIiIjJCQlJSYnJygpKSnp6uvr7O3t7q6vsLCxsrKztLS1tba3d3h5ubq6u7y8vb6+v8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAAazmE0B/CAAAAAAD/+9DEAAAMjBNdVDAAK7gzKLc3gAAAAvVLZrbwAARKHAwMWAABgAjP/MPABAA7YeHh7wAAAAADDw8PHgAAAGf//4AAAAABh4eHh4AAAAAjDw8PHgAAAAG44eHjwAAAABGHh7/QAAB///+AAAAZuOHh49AAAAj+h4/0AAEEjiBAjVt3n211slpcsySZMHAjRtBlZwZQNPz6mrkzgBEReQmhwI3EaRZYNEDvIUxBUEBNNXSrxwSoRez6KnfaISlJpd8PNMS7lVt7YPppOvqkfeL0y4Yo/TO6rMI/L5A+0ORiXvq/+LAnDY5FnBfR2ojhrCrEO18ZVenPhumx7PSi7SwLZlMr3N6+TY2pRH52OXc6+EzWpZf85TXZLXpr26Ht+pL5yeuXK/N0t2ht1qfv2q/Pw+/nhY5jlS03LnMbuGFa9jVs1rX2ZbUq26GzfuU9flytarVLcsvflfr2+7sUMYLsIL12L55f/cqGB5ljUTVv32uC4G6r7S5KpxOggSkynKkuwBe1JaJAJcXv8ckas/7Qj4uocOJXVszwoPg0zjbVeDXJ5i0YgFSmy1ClnROK9hNkFrmezkQpTmWPQ3YN/nc64bXGe6777/UxW/ze8wyXflrf5TO///Y39HITbmhiJd+9spMmTxgIiYycCIrCVQ0YVKgUYsEggqEkht45ExQmGm1bkD1WwpFJM29zTQ2vUtuZvlvLRk90n/K9k8fQwYqB2OtgKqm5WsIhXX3E5fi7nom24zP7F1F2ytRpVhy+1WkSyBV688Xma/ejYe7bsxxS7NWq9F7MfZCxzHPx8zZat668vxXirbOnVjZLSxhMd906xGDceU43XgqCkEn5I9Qc6RA7o47Imn0JZVJBUz/a2Yw4ZFgkAgY0vNAG1gSkE5o+YEhG5DzXWlMBBqMZGG0GdQVCzJxWH6mTVQMNLtdJdiHcML37k2PtibfCkjyVDqXuSkvU1mFySbmqjuUmwiWqAkXA2XCQQNLjbzZ8OC84UqFpRRKVjbkm9kCFoUVJ9EiaeXaVEoIlGTZrfMPtKWfUqWZ8tLV5GX2c38tu1vePCXd2YzHd8esrPyL3uZr6krs6O7kCps27kt3/AMFVYSjSTkn3//twxO2ADhxjW/2HgCq2s2m9tg69u+25jJUXXCDAx8LFBgm2QU4GLiqohAjAclFgBPJAAY2ehzNF7iiwIMzMHpOn+NlMwVGmgdt9DkAQ0UvhxeIsWDlnjlEHoA2aOZTwwAV1Tv4/MQGQGfxtsC+mWQJamq8zCvv1YvaBTRUDSzTgQMgs1gkKAXAY4HOZkkfDRUwWWlLcubpnZ2P2WRMFF8lUqMpphuspz3aqu2yDvnKtd3M132EKiu24YyHxF91re//hcTFetmd2ss/AnWoGAFIgB8uSyQMJSzZig8ZmrhR6A6iZAAGUkq1hCTGij7tLtUyMAQTLhx6bEfFB45AZZp3V4RhT2YP5oBEcC00muGGC7LZYmTD9tFtuaQ7GCALc+pTVFhK2qGs87ycjrsL77T7pbk5jEH/blP/7kMTwABatj0/tsNpq+TNqvbyaLeasyqGVfy6k3MxyhkfAjDcEBVHtTkyIGUZIimbYJkh42nJnNTTeJXmIIIiCGQOKBOIMYiYsDEK467JYzXMccGgNKQUSqmLod1ebnomRGMxA8g85haGHoIfrQYhgAGAFyNg4pmGwGAgAFxKCKcbEE4OIgjG6aBh0khrXJg0jAjWYGGRjgOsgiL6gkDG5SGLA6HZWh2MbFuTv+mvRmMg1G+U0SCouZOkG8jN0FFanFfVBKBAMpdO86rc3nKepYjNqUVGf45Wca0g3nVSZIkULiS0EJkL42qEy4nmRhSaCk9pJDAonpkhbxGhNYBFKEPpq1kHtHUWrCOdzAsMuayL7mmZ/k3MdPexc22Pv1ziXzCsztf3tZG3zVyXYpbwUhhTcosPk6pgwGAAEAWrEHJp2wYEhQqiOsGQxeGAomJoYOSRnmkTIhmmUvEwGKgEp5p/mBCgtMfJRgLhWFgzN5WSj0uiMmNwrFJJTTIBDL0XXPlo6AFyMqjrlhcHL8huXzLpt5qCYRDtJhjpo+FmPTv/7kMT8ABiZm03tpH5rJ7QodcSbicsolq8h48ToFAzUHIiYQLnBSAQ+nAnFeY7tJZGYzvyS75L2y1Je9MzmfJRixts2JScTMOETKNhUw2tJhjVQO55TxUyU9+TNVWpG6c5PTI/wr5lTlzlTtW4VWvKj5Q2y3jTCxVBpSN8oYBAAAA6jKw2FgiDAYYYKJhW6HfRuYnERjAJGJAOYsa56A5AIWo5PYMiMxOKk63UeMGDg3wpwwGO/XS0NmCseBEEKZrzFk4nFMP5LgEOFq1n3joNBLDIElEDCECubJ3DfEsAmBHbruJKHXrTz8qz0dPSaeCuYK4bq7qWEgN2JzjyGJP53RTXBIh/co3pxxq+0kYEkB6+Py4YX985OY3wrLMaG70ZDFyTjp1W63Y29hshu+IV6pPsVj772860l7mOVb/TjRTSiBt0EYadVLrDxpwbdaku3uo19j01VtBAoAAANSSi9EVlxhgKmHVcfPCJgkAKBIRmHjUfOEo0LAER1cmBBINN1QSC3dCAELlIeEUJjSW5uMMqvlajihhjzKQiskdAy1P/7kMT6gBn9o0OuJNzDbjPn8cYbkFRRajgcRGpnX4X1LiHX2qR9bLN49qXxCHqW3iz+NTNSYiUrFmIoORUgYUAkItSwPiOaHTGCeg6cTkr0GHk+yhVTzg4E57YYCpBAoPNGF2KI4oWQaKHIxehIoQgycWVoGrW72hFSfVNBZWPLTs+j+m9+Zo66oyyT7t6ZJQuT3cuolrLRbOUH1mhxp4Xcyya9CwCgABT0AisBgEYFApkIQGERSA2cRGsBJMIHwVYhgg0qzCIIrQKwyZjFbj0DtCAHmpCwumLYv4bCGEie1ZLcTzVNWxhsg3MSjUeBFmvUlyhISLNk1Jbfh7voZAFgsXwOjSdlqpn4bmFhCEkckFl4SRPauhviE0+mQRwWm/p1J4mcyrTn/Wr/JF3ZeBtfWGllvurSkvSMnLBotiw+QtXHuH6xlatabr6Z9++MO7PJfzJ9rZy+fvUiY76Vcnl9c3busRttLDl9s4cKS1lOzBjjpxOXyJlZNJhv9Gn5hYYFABAABAFQMUEIwAGDAYZMND4wO0zm4iMXj0wWGwMIjP/7kMTqgRsNsUGOZRMDbLWoucwyWE5qPTj0IFxfFOYQDEwIXGlyyGSUIGL0KyKJ240bhI8niqHKHj4nFmqtDDyViZtqxEgCQiRcjF4wURYmD5iUCMKWymYmlOl+XK2LdWr9oZXVZtnuirtAq0WqzuUVX8EIqSJnCOUlLD5Oqr2IGEJNSq2cbTW9nWm9PxNoWustjrohV1KS8Jy1V6b/f1NWX25r5/B2znakIySOQ9e0Ff+EcmdI8ua6cJWprWJycXjBZBrsX1m5XjL061ZY0VYZQO3zqq4tLu6oYDADAADAVZNKD0CCAAgUADoVZ5kkQA0JkQwGgSYDP5xMeBwLL0JFmBiIaGC6XD932fmGSov+tfiJp4iQ5pSmGDEZaEhg31WeGRFK93JkdBrNblqGCUWuXTVZYsEqDGUTAdKburUojLXbof9ag9L1bVDoLyZzqxVLmDgcUYyIAEToSOmZbqDOxgPtKJSVJow3SK6WcvVUwv/GaC6TgDl/Ljm6sRVfm5zc2ij2Kmlk90ggoexwtHFT07941sou30oWTQQRkSFh2P/7oMTWgByxuUPOZTNDbDLo+cYnSNBoMAQ2GBZjhARQGEd7cUsSMlKFhgMAIAAKAAm0TRycdEiQFC5QIqU2oQWFMYAAUSmBR5xCogFS+S9AJYbWTrOnetIM+J8Kfswb+f1IdUCaOQs4iB3SYel4lsPC1meoxQFafWj8mFBcoDpiV1phOHcorlI9s06Ux8ohurRhWlfLVa7o9Vy+QVcOeEIpUXOko1dzkNWu6JgtOFZpOdmNIztWZWoueq3RNJlaWqf72mdWIGi/etdav91zZU5w15ozYx0Dcy0lmKJdPM6dbe11mUy8RjTB1SZy8VXZ6V7dKIUmAGZIh7fvvT19kSDoBgIAwAnGiYWJBw2puY2LAhDCSw0ASMZDgYAmkCw/wlYAoysQKn5j5M79icfYBPT3Z7rmpFVmow14jFDwWBpurGwqCzXPzWg31aGbD8lYTheqUytGr9gkZt7piLN24GXkSFAPjTrDgOr228K/Ga9suobmvldSsx1KrVwRQoPXfJJZOb+2UEmLKET4559yL00LCubsWh+5x7d60o3gMLoJIQOC/hi6pqBEMasVtI/qmSTpxVgCRDMQSwKVHLWq1b4FOSq2M/fQigQAUCAMB/ox4RFg8HEAGl0KB9VDCwMVxIKLDcaIgswWSnURIhNmMdn7cEgKInKb8zTyOhkDOoqZWHlAo80MSdB1bv/7kMTwgBqtqUntsNsDIjcpvbYPYN+rkndHMaHMcACYKs/MUieM9ykQm10GwezS/jJDX7ROX1+1MkLLXIixt5eHBycLC0Iq9AdvK97vO4LVWJUa6bFcmIayPamSCeopJmHA5SUTx+SYvn63BNiGIe9lX3yto5FJDCyRE+tgJzWxJtwtolyD1zMxSd7KFaeT3EZDMRhEiYPubXt9lfpaAUAAAAAAmQBC9CWQgQxWLQQZDWgFBw1MWhEFAowqWDkY1Dgk9sbITxqX7pTOPDSmanfmT1LpZXXa75xj5fu9TTBIGbevnffpzI5jGyE8mzQyOSOyTAM6W+QE7ZChEAS43MhIizDUiJtO0hDcvoFSQCdVcGUDiwKbGUjjTevOoZOIUeJZRA7PKz7ajmkbduwzCU5lO3IshbT8V26i7Yerb/93f8KZdBJdq8uSn/ueQrGp/Di8HZTfRtqnov52W+bN+OyjJYRA+KtMCUgjuVVEko6901V5BwBQMAwBajREmouaFAwEo44uGRALSTPgFWkGn5148n2tRohhaSaWFNvRSRRcy//7kMTngBlpoU3NsNrDULYpOc0leIoUsyvXDPQ1+rj/SgxEyMeCkV6y2jJRMDAWOvbnLLda+SgzyWsq0vY5PfUIRGXI3pNm18aQ1OlRadH3H3FQVWdXVZ3Mfd2dSNftJSYqQ0JK334etlXI7G6JtespeVjNmJxVi29mW0Xa8VLXtWjCTUB26a63uUCjHQY2UQZV+ZxF8OgyqGVV1hrhSEwWVFk9J4F1UNAKAEAAEgjKAlxG0GgxgiiI5I08RMXDgiQBRSYFNnELSDrEpUACc3YmUjP3YkFyWNYY4GvEC3a7WVHQs3pKwBIYUFB8mAJbnkwF/piCIsMgBMCZ26duaUGovUIA7ookMxRsyOFyAgWYNsEa7RKpqUim9WJz3GZfJbcnSWgVNSWVQ1GlJH2ZVQs0rKQ6s0sxR9j6QLxQWjQLLVS9mTK38Xmc3GnMGN02IKOt4J5szNfN5jIlkS1QYdMhRdl4x0uS036RIgcyYDBseaRp3uDxbSpV9CrKByAgEAwGvhZdMQNRwYMkWQqhAcLMrNiEMSpFkUn6SIFXs3EUNP/7kMTdgBg9pU/tsHsDSTTpObSbYDJiVkkXtt1MFJGp45wUZuKudahqAjDDpH53ZQ4RgREqXt/kEX5bKtLBp4UfJluqns+XEx6pqDJh3ygk2spqUE8ZH5bBkBSsVmhtl7sZRc4gXhk2Ep7mguxWYTQkoutRcUFnxJwBSmIT+MeNtfo+M1gjW7Oi7O+70zhf+mFnGPeZ1FPPlGS2eTaNNRFJHpo1RRW1WQxr9I+OMHa2uYj/0PQOAMAgEQKTbRkoK05GUSaVfFdCY6BBFeLBxA3GsHa5AKDjQAZiKArjY/LMIMMsB41P3PMyHnHlroxEykdFhFJtZc0CjJCqcj2bxbj1aUEoKv2vexY2x3PCN4GdF5/V1jIUp51KSWfmBlRTFmFbKuOxWn6lK1naoa3IuB47EzXG5oXSrhxwMRs0kZyhQ9l00PCwM450Hay2jqqI7RF1pn1CFoomr0vCs7t5fwXC9k8hGWvQ3A9XU0PKPtGEhQ+FBALrOLGpyG7ofNWrBwAhERWCUcaM5LAEACIHMwThGThF8YmLmMhqOQBNDkRdWP/7kMTZABidqU3NpNqDJzRpvbYbUJiLIiAnBBlBdSxDZMpN/UpYAMpFYGzdqXFC41KapackE28mIkytnMgZHB7yJ+yLGnxZ++Vv60fanVqxGi1jSWJqEnrjE2WxlheUlnkZGSWSjALKIA+0dii3G3VKSu3cxncVOrI+tiPYFYIBa7nGilSe9y4SjbFCvOP0cbCXcu0yxdzjFdkNPLeW6uZ7jmMkXuySIQTFmw8EGpvEn3tU97xFUeZS6jZV6bgGAEAAAhZ5NYJzKhYKBpgCAMspmYMYOThyq1AwE3PXGkLxYAQ3MWODdgdWiX07gH8g1C/Ytm4JG839eA42mobu1gYFDMqkM8mRAtO6MplLTspJXVne3czLXjc7eFuYvW605Qbks29KsdykKXkFFNPKjcbTUK/LpVpP0w+5YN7DPFutrUKi5hIjeawQK491zqT9gohUiuqmwzd/JytzHntxV3+ldXSTy/XuXvwfDI9rMUSV2kL25lGJoYRS2oy1nCgmDq0kU2yNLgbGPTpUFfWqpwYAMAADAm20gQHCxhVMVLEFcP/7kMTXgBlhvVHtpRyDQLVpubyl8BQCECbgMJBQtfNMyYCrcnKCXRy0LTrOMSNiti2F+8RJ4cyiUBgRbA9BnFAKCYtHou5qo1uMkiUPvhCtXOsJk34XGqyLGal8StT3btaHic0a0CVUb6CrSBJJeM5Ii2wpZYXUSkopeaRCCn8RppYom+Wrm4Lx22n121kSs2/dZI5SyCsxZMdj19GVjeGLxjojFHgs4HLaPGgRYNEGQcCDCooaBgZsYRRphTEPUaUI7te2puvZBiAgAADJbjSMiOjBxgFAJiokIDMMyDEgAZAkiTGhEH0CLKn2IAkvM5KHXlEwo2BDqdsbyEiWU6iMGAAumqtqlEYnDkOxelJRGWwBSYR67jSWWZuphdqCsdOXutD/q9X+ldw98nb8WgW9bHYeMr5ceQ9+jGrvcxRdcyNF4WoENjLwwNqmzgnXsZiwz92Ix/VdiPNf7feKuqv39mtt6d7ivPVCL7LZ39v32z3WaiTUfdglCkgt5KNCCCWmmR8XYuA4un/tf3ylywYAcBIFQSiSDvgkFE3CJjZqTf/7kMTPgBiho0/tJHzDGrXp/bYbWGIGMA5jUkQHRnxG4Cd5cYzofFqh7c6FVAyA3mOUmYfqk+axNZSgr50tCTRGiuNG5WCIi12KRl/Jq7r7DdZN9WWQa1DPPPdqlq9yxq65Xk1XW9QzzL75+jyaS1EJJgg1G51W5ZBBmaz2Qh0y6PwPSB/Junt4z+PqvRJMhp/mMLObMiqTopj4hlHzLnnI7yzJ+wn56DesuUkkHREkciS0YIU0U4Kyt83/asHAAEBAQFxxEzU/TwBggaOViAqDMUFLpn4mgOMBPDqx9LqQysqiRjqG3aV5vuaaLNvINyUHGMqm6GTmOALQ72VwhEnnh58mTAgIRigH5uN4/bmGwya3bqRhq2NNjPSzPGrMfaFDfO12JEgLMvtxEjGlvzA6SikbqHm3UOGBY0xFfZXTe921bpf6UBFi1es9chWPY+uuY041dXo7ONsgq4ZfEGeZ657A/9HDXI0Llv0XqrAwgISEgcKgKspkhICZLix4YBhDISWLWfu7kpoIEFABAoOStI1UoWyCgYCoJIfAotIQM//7kMTPgBdJl1Pt4NGrMrVp/bYPmD4FU4AJ2c2ILPX43AxNFNVCGbyy5ICKccy1hkYaAR6gsQQYKQM4t1NgUFXtV3aJQiKSvKnksrz5Wg2Q56ybsyWZlMvpW1r1KavnY8fOThw1cXgrE7SqPoUy5iXj5pLavVSwsXwpVpAfTGtKrDxUhj669DzLzbbrfdWXZJDJLNzZf7l5527/Znjda5vUw1uxDV6zzt1RmxZvY22bTT7Mh/+hVyY8Di6kHKj3/39MSCgBAAgR39CU1VUypIw0kZrGtBmJBB2gMIgzWc6EsK7VMCE57EDe1aVPY7qd9odsRMyx2btRt6wu5isu+HwoTY7M24ysZLGVSm1QXsNUHssrnl4SB+aDiPJWJak1h67ixvzvW1pwQq3dsv0SydxXTeQ6g9l9g5JRfWVmVbRaUc019S6cCxNDbtOMJbcUkM8Orp3s66cY1UvLY5lVGtjssjCU02lavJu21sbYkiXijQ4gVCrA9DzQubyt7m5xv7HHDRGCjWKZQ+61yMrViAYAEAACArkYAghCKujBwjC48P/7kMTSABiVo1HtsNyDLjZpuaYnEA0TMNiZRZpJQGCkakQNZszEUGhjYjssf+NIymLiozWtS2TCIWiUohD7GIBQx6pTxIKBqDYelj6ioRY7NyB4SpGu+6UMHmXFwR8kPFZHpW/Of14GOsw2X6S5UpQy/m3vqn7LFDMOYRZJM62ZJkPpaByAfHoKNTWZrMlPzpCLAgs09KLtibTl+LjJfP/lOae2a5ZbFeL/9fotylDC4PDnoQDh6ToAAZ4fEghHsUGoF3gAx6MzSYmgUAYAEHG7kejKNix4eqq7I9SVwlPGgxLaNo5aQIQZaAMxk/Ji8UvKdGIgzUbpMTJGZZOS+dEmynFaJxgAhiYNDExgQFWDPFLtEI/vsbYw3Imwyle3Eca4eWxhCUMrbMyeEC69cy00qSx+rOl8Rc/3Ls1nMOXWY0MjU3MMq+pVDzl5MdEkbbweVzDjSXd4dyvN92ZtttjDvlQdZr8tv2/+/S3a0o1ZUDHOfdpPHtmKrJptfC3ESWzfdWpoBwAQAAECcbSMgBGmpomDDAqYg6uMPJwMTo5GCv/7kMTPgBjxk0vOMNjC57Zp+aYbGFh3YujUy1pQiHzMDJpusH3MzKJfhnMGBhjeUksgsw4nVf3UTFRWIO64UMrVEhuNYwtCPK7ewbOsqhPK0rjAuFBUlo7WTq0tddl8d3GasEuBQbuWgUrSUQHddWNoRX2r4nARuVCwmyvDbaMnxVccUbUitZOUkLO8OzOhu9n1p1/+8tXxp2mUhl46ne6FEH0oVRhNOyCk22+qENjmHDwwDSb3H/6av6JgGACAAAwFNNoGm7LBwBEBgOrJiIIYSShkInCDU87MuRzXQucAGRsBivSH6dlBrQup63j0wYXZLlL2yCJEfCfj0PgoNJgWOUKwwgJCgDXPybj1Jl+cAKeyp8i6DBlvUxn7cLOH7aqNla4/I+X2JaJHH11sS4sNFtl37c2rPZA5MMgBCO4HszFZqvo30iqcwtFnROYosFasfd3cqzu87595v/pNGE6Iby0tf0dVed3EUQA7GCXezQ9/au5NKk0QEEB4IFF//ZWaBgBgAgEIcljGvRMWBS0wLgccg6Y/pqAhfkEQzzKlcv/7kMTUgBhZo0/tsNjDFrRpvbYbUGJDAIibNweEGs6ivUYLFudhasGRPRXVJETGoX5yrzRIQh9+n3tDJxSDlO5OfB1Nhm3ZT1+rTWCDOiuR9ip93l7cRsrU60OyhVjq6JpaRbMnaitzV5jmT+LpOSOnZXXWdVqi6WuPkbrGyQfTSjDZIrPOTBQpLnHxXNwnuu8ZeY/5cmfupnnd0/ns0os1OLdFuisMYjCC00ifOXQBEVlnUpexqZBAAAAAEBlTEhWMHAoxMATIIaABDBWAMNAgWGzLzCQ0O6CMaEDJ2QFgdhQ7NVgiYQ9M8FRs1v8jCBDdOOwuDyZQkwalEbgAIDYsDqWirNTIgS5ly9JWa0VBVSkXDlXh1mTa0kuh6DZi5vCblzk0sWc2isEdlyEeVsSlK0xG97KJl+Sm/BG8XU6jkNYeWyUhpeNS0aV15rRuo62OgV+aih3+/beU7/OK7ZW7ve8ntSUZVAVY2Xs+2fbYDAbNpsB93naH9Bj/MordqWphhrK2BT5em02iQs/9KnkEADAAAQspJE1QdRLAR4ZuIv/7kMTWABgxl1HtMNrLX7Zo+cYbkAgKFzUSMAc3hA0FYQwlXVWWKt8xQuOgHUgIbkqLxh6i71LqsDSiFxOBG4GPoC9O6gMYKV6NdhlkIyViQjKYCuDLQ1bi6CkNqDqAOYIPGfwi4B4QxUOLUsWfu9I6PPPQwrvItXl37O+bZ2qaOk6+0JfjGoK1CQAvTaMRIEXVg8ng//pTHmJ31D26WJ1njITuKedVH/rOU2myZiAJ8vIfY3/vks6zQhBNYsOUZJaWwa4KB8EROKkEqCxIm67sy3/rawYgYREAwrbkEGBjZuIjYHSphQGXHQDGNkADs0WluNjMBNDYydr2dxTsxE0d+pyqMDNa3B74kqO8cigSVGFAwkGtaxk5UF1xSuGIoz+F3+5KpTf2KOnSjoaKmpmvzkR1T3b5a6ln7sguseX8KmaFJe+2jXL/er3Ia42JkMmgRLg440yqbOUfZrmOYwYwmEJRKvbVLoE3pk4+S+a8VWzuuzY9dbKxIq3yFfs3R9wvISUUrS6VLMXKSwoUePPDNg2nZ02JBQAgAAEBTbiEZ//7kMTPARohmUvtvNjDBrOp+bYbjBfINDDDklkDAFUQtYGgI7XO+6YfKGwDLU07p45Reeg3CeJT9maESCRVIOf4ziJM6KU0QHTTN3vl7fCIKRJnczwE8816w1C95Xw9k6mNHYfL+ZhcTJnJLS2l4CZWnsD3Q2hLsK31fJ4cvi9uew0aidJoYlaxCkL6R7xzcPMk4m20oXdKoxo1vp6jk5lvJN5pt95s9zyDz4NJ2+e9bm3P5stcPUWyu6GSh2hNyoqVWae4j/0bigMAAwFmMUBVdwCARhQahc5GiQaYdFAcdAMHTDhxOoE4HBkuMquYgEBvgGjwMjcrjZpEWNbq1o6YXH63JA2zXDJY4IyS6MSk2jGrMNbaWBSA3eA36ZaxmIw5jHnCHhzlPjEVQVcZfKF6SyksX670VaD7sEHlqvOxlNWka46bK1IUr78+3XGc/22aLTSj1Xl7qvpczrfbP1lDXsxw3Nm9xetv0N9+9pdteZetk4utNp+u/Rqm42h+05AzNZmn2MVt1rJ9Lo0l1XNDqm1fjq21SnQBwETwqEGIJP/7oMTLgBeto0/tMNjDjrUo8cwymLdYu1SpRhIP7+tYBgAAAAEBqRoRxcOJxiIFmAQ0Ds+YhFAGYZEEjAh+OaFkOCDftZBIuNSnEOA0mlSqpFJFw0f3DEwggV92cqLmDkijnVm3rHCKnxIKk4VQ01OGNuCm690psRCuVgevOz8UThwi12eeGIUnc6bnctxrDPmLPbmW9CYTjFsydQ4qchtzSW3Lf7IydPGFp9HVDUmsDl+P5KJy0xZ0w7wUkinZiCRdwb1E8hnhotq2dtox7S8nVy6edrN2XAy7mQDOopEh6ZZblWxZydZRZoHDoCKhUJJa0yg11X3DxgyxpAwAQAAIG/jIwCiHiMy4wBJqB0Ys2LGYKJjDYY8ljBQMnKqkI4J2eCKb+SZ3z5o2r7n46acjDENW2BGkwDQKHZ6NkwwiMt2nYNJUBMAj9yIwbUp5iwzNOKXaqjUIa04ywVY90ELLyaRBpSVooehgfEpZUzK5UW/E86qjWfo+OnjcJ8sdgbaaWXrCmZWsqFSHeTGOFJAuQ1+1SchWs2TKxXverCdj56/79Z1/4a6rbzpabjx36X5uaT97sduXovrc1O+PSwP0WvtIXWabT5lasuZkAjKGXo1e9lScUCAAEE1xQIKhgkCmABYKmsyODjCYrBRUbQwiNzookGg2NCQOCZjQSG3AWUAh15G8pmonL//7kMT1gBt5pUfOMN5DaLapOb0xeNouVw91id1/4wfLw9BCoq9Ag+eGHqk6KjEzj7SjNscYm+9UPlVLUrumnlqvexaBbx5ct51bcreLWrdO5Um3ZwRmJ6iR5CDy/+UkYaZqAGLaloVQwkVWpLrEyJJhhhDtsOPNyQpL0iisSpkEKqGFkEF5Hdl0dSY8HSyEkkCa8vBd8txrtzlBK6j5obmjRIy5onA3NM7FSl6Vu5QuNZDrgZhtu7jy5fr5+4BQAgAAcCvjQ0EEACIYXPhhdMsCEOZowIEDoEgTQl5HlNJG0wFIN9UUNpTmsoztba9ZydAxkUe2ieBjZhDKkPNX30MJDCYiZjPwkVCx4shtrj0wXYp8LrYWmUmpw6NMoCqIHZrTp3TSTGfHxELf3g62mREcoonam0pGlDEYJpHu4Pc5kMO55syEkDkx+rQdZ5d/TXiEwWUJgyZYrdZ37aJtjU9Z086SQaE7JKq8VbPhemYyTlSAjAMJkiBgtkuvZBWOwqDwVn4dr3vv2vvzR3NVyAggAAAAADGmjHYJMUhVCkwuEP/7kMTggBuRuUmOZTGDQ7QpebSbWRAJQ5uGRBUJDZIUSIpGASgEve7AqGTJJSXXGJQ0UwUYJnuNMYAGL3W3/bkYUGw0BrvZkQiV9nUOoHcvMTEEzyl3NBYykmpXJDKy+Y4rw8UZq4vpstunREeu+dCPTqOYHNULdZ38dgTtkhesSsiF+PCy8iz7Z38dlbIjF8qzft2e97Z+9iZcu+WuWkcSfeXHd7bPUoeGLVJb4Mz/V9mozHl0q03dQL8cIcsGAmFAVeWFEgwiZ//6ogDAEAAAQW4M2HoCLoCSOCAQbJQ4YDksMFiF+M4XVkKUotGTBB4gCRAj/0KUxhjjMV7keGTRi0zB0YMpGB4In7zhgQfJhi7L7pIMvHEKLBuqcNSZqwY1GvW5JHZ3Wt7aBhUl9mK4WTSI6ZzCJ0kVjEjsJqqubRXV+0keKKWJpHtgzRWUSDkS+kLaePQNp6qhaZpIvqipVs85ZZyz3JzZjDvjSHIry2UNrOozFTjXa2Uxdw5mnF8Q7g2JYQaRaIgwd3JcRNEBx/7yhlhrGXWaVYoIACAAAf/7oMTPgBkpk03uPNdDPDfpebSLoAb6MWH0Pwg4MRORQyB0SZkGmYgamxgo0eiIoXOa9YVJjYzliXJpopmqdfxxlIJF8s6ZsIgQ43YzngoGI0yKcvkgOoVGaay8bQLeW4AlvKf8GL95ytAeuZdtKz3nqh5gvsnUWMvfpWslI7nz2acblEIa3CDSNZSWwpoiUnqkfHWaYfkYiRbEh4nsdb7yu2+G7fy/udyWQnlpWx2Zhj5smsWmxRyJk3ZAPBabJJ7JRjnE6FkIJw1wwxVf9LyCgAgAAYVdDS9BwgBAQllVQHQVLsWbB4BFV04lEU3pHoGS0zVWcOMWGiGwJLaT16gMQDsJc/rWjGiRCLd+GBGVJ9xaQxtFEoP5ZKorEWO0uGMcg+pc8giM3FSoVVh+pqZtvYqgPNqJEahfhBWehLC604xdvY+dQ477fDWy9tK7TsYigYhcO5s2yU1qr0x9s/6+9X2io40/eBYXZKS57OzJfbpmss1muUUdAkr2Dr2eWYQQPLtZdFYaClUVDQYc3s/U2A0H0gYVeEh6WWebpQlilYcFACAAAgVkLASAQ5FAIYSEYXKhn0DmGw8NGwFBEwgYziRKCAioMzMwUEDcwbHgY79PTmpSNLpR28YrCLmZO04BisgEwQgexGBoFjQuk0NOsVQYTDq69UseFNimpaGsrXL8qC8nBKLNqv/7kMT9gBgFpU/NpNyDRLSpubYbYCYpYuVq8jXOQel1Hy4Hq/vl9fU/cXvzBJj32tCeVmNot2/q/d6GDbr22orrUJ91fVmBMkYzI3uSuMGlquTXXJQdnrt6nTq+Ji419lqa73s1/tOEbh3a3YzdcjtY9ZkJmpPzNSKdYLoFA8LfMKm1i25K4oGADAAAAqpMgBZ0aAxZ9LhEZOYiLAqLSiACgfEhiQAnGmCYOnHNpqsUgpn4OUD3yn71OTIjjxuC1Owuwq5iUpqiM7Z1Gey8cCFJdyxoSYFpvp3pfq1T0onDjNbGAD3HPuRPjRnzC2nrQfLDq/SybcvwqkZa8zNWNeoRRNOLCiKZ8ikp1xKJ4WgAkkgtICQepJ1K0zUOemDFUnpiRZZ8ZL/909h3P/VP2lPOsy7v3rucdc7SEFXhS9sw0bu2aC7rsVpvyLbd+7rUrJXh9pu+3e1PSmgFAAAAAAhZAR2KgDMzECYKn4DHjBQ8acwcRGFvx4q2DgJgLChkxMlgF5wxOLDneiK47M/DhlZYxCkZZFjLgQiFoTUlZgRCTP/7kMT6gBtJsUnOMNzDSbjpebYbUDtNSxwkGocuTVmVCwpblteVyy3dpZUpzUl2cEuVR17OTr1JBtI57NlA1YqfTES6ujBepmFt1Q1h+bIy3TB95Pt5lmijJyJOc8i9z7sYDD+8OSnUDBxAgbJh5jnRHphONBaGqhm05aL1GTqbJZygzsWTtyRUGHLgzlQiYhjM2Tnh+kTSGXtnWIRWHWsUb1vAKAGAAAAuyYNCyCIqhMwMQhk2mLwcYFFIkSHUMHi85eIB4LjQIDgGYmFBtoVkwQbeH2omwikzWX3I2YaJMWtq7awbvyIkflEPACxS2F1eCpxMRbiVfMoZn5XSz9TCplDbNq9i9tbtTP7r+NuwnTSbk8ElSCoNmDjtB6XlU4Z8OTaYtQGfdkUFNRxMIEMXDCcbgZRx60CeU/mJ5KB5qLFtwpRRtFq1IS0ZpYynsFMilSspwTi3H3cZ5lszmJYU87DCHDUYRg+11kbCrtilLKmpagZFpUdQ63H2I1//onkGACAAAEGJpEJEl4AuDMC8GI4CyIMnKBBg0LZzTRlbVv/7kMTqABq1u0nNrNyDdLbpOcymYJKUmBaH5aqSjNKso++NoVm/KAu+kE88inYXYs5nOwwFzCMdmXTjfkRWhfybfcoEWpihjm72HzBi2CNEA6UfIRlhSyKREuxFUBQs5JsD7V9HFJalBhnqpHykVsXRNI6x2ppqxzqPIB9ApINJwEY8+3MdAFImdZ3MaySev8ynNynbb860HQ9c76/zs8m5hydxqadk2Z9WUysdk5wjiExz956v23xNf5nuetvLCUAwAABRkUZNJAUEhcEzUsEQeLThnBEECRbEzILG2BLFi6wgVPzHTSA6CgU7MoVHdl33SwS3pHI+gYcX9RU2IhC2nUtNLSUHVDjTcWSTCtvPGCLlmepGBtWP7h9bc8lYhHKASUx4kRHhy0nswftJzDREcWOwurWXnkHO66t+eYUR1mf1dels1VVOrvti3HTXa7AmMbrKp9s3loh00N3PGt6idYohZWkSoqjW/9fZ77i7aH0+HiDOnjfwlOoRy+F1idIgvo66zAQAYAAAUY7IgkmMND2tGhgKEwejRIAFidPosP/7kMTWgBlBl03tJNqLGjVqPbYbYHBjxO8C0U8jJhQHYrHLdC1QYT7lv6wMHO08hqAEMdS3lKxQNY5nnmWAnPCgxeEmDJyt2gk8usWik28z9QgZrPrU9u8uehKIyVE24tE579qnWOdmLLx2gXY1AnH5le9E7Cu9jHJ+qVa0vg91276Ay92XvGsv6irTrJ/48WrMitv0j3TcmuzHQJ7fy/73H9CM9eXo5Dws9IHwOgJEi5F5GrvXFBAAQAAAH3RmwtHQuGGNnIofAaVM4CzQxdH4wcoPbGRoCai9YNNjaT1WK7WQImiuzb3NxkxktkNx/nhLBm/t/LMCBSfNHjXGAdKPK5ZWWVgV+fuRif1u+uDPVWHRVzdwjHpyarhPdbbUkHIeiLcT9T8CqFxegfJi7v1c8eLNca6HS3Mx1s3faWXUgUmTLkrDxNey+rOxOFVbFE0vpfg5Wduze6TbD7IEIKk4pc2Ru2LRttQBwiJMBRPYMSQKgMP7/NSyoYz+s1HFCxRhLY1HcHvU1/vqqgYAIAAAgIomgqYgopAocIkUlQEZ0f/7kMTUABedjVPtsNsDUbapubYbYBx5wThEaKcGWK7nGwCM1M9Ol10l5mBsyS2kXvSoxoOrVIdjRhQUp/nxAVHFRy6dpmKFBHZgKQKPow4duT9rCtnCP16RyGUbOSaebDssJDi01dFSSJ7xPv1Hm0HE3V6P3t9paw6gKGEhdOmV9Tla5WOCT2ZLy8cp3aO+wXSZbT2Po4rQAhsTcKuH6JdunqOmvjZkZUNrTRE2+lhKGUTso/D/gNwNGb5TlR9I3WwziHR660IEIAAGRtRNOCCwUyZw3lsZLB0szpgI6I4gRqdwoyUw4RAWbgYPsWaU+6Y5Y5t8O4g4+/nJVSGFGFAGRyWdMKDEi0tuUxIETyqTHGMqMU9+5jar5Ypx87HWwMdf6k947SslNwqNRrqsTGpQXyCbsEeHkRi4w4encDaq5S2Kj1T29YEK8t0sw1MZ2UuWsLU6mjbLz8lR5fSPFTZ471pO2rx/ka7qrEt5iG3htxmlzDzQd8ZM91o/D9zarRLGOTRRLBBAsMp1VawHADAAAAu5MLKjAhMAhRoAWpkPV//7kMTRABjJsU/tsNrDF7RquaYbZJhooJJ7nhQgOcFVWNTYaCTQ0s5da9lDhRwuRfsWyg5lVLNwaVSmPzm65UG3EsYaJASNXanGfpY4ZfT8s92oJZ+0g/9nxRNpOI42nJcv8hYgJ0iNIoPpSisSLuynTcOcjY8fK5MuryQacg04edg1BWIilCtrNiQ9rpMm1FJh+h8djFKq4o/0sfBlqNn1n+nrRcRnlnOahhmiOrF67pzTGQqf/SqqVo31guAGAAKjKAdYiq8KCzXRhGfCVQFBh2dJILtjdp2dMBUSEbs07R35ZYh48I+XWd0hkQzySiAJcYoQi1KaObBQEiO083QEpJPizHpwaYI6BnFnWLzSI/EryGL71mwX+6szMgsN80tnq6q/BUKTOBlqV4i58IikqHcqNvClkQoWYaPk+Essfds7rayrIqJN9uh801o0PaDa9Sqfh1mhpyy3x/7Wbj0HeK6jmFWFmE/G8syEwHhqLDv/39KJBQBQAAIKvgUjsiGAMQHQ6egYuBIiRAkkMBAQPLIxlAyUB4QmHIAaWED0b//7kMTQgBdtsVHNpRqC5jTqeaejFOm6JDNcuWzGCWOyeH7xhYg5lqZjwwPPq/UryL3FAxLo5YU7JgSh1jyU9wpXhLUjRkCILpwGqZIEIZTPY0ttTYD6aRUPCIxcZEJiDMZIs2eRcSwljWQTMQrHrSpJtAiXWVOShtQ2cVD9uektJYwuOFS85bGrNPzFxB6OqSURMaVqdM0er7Op47OkhseKtBZLINGNCsJgMvR9OrdrugYAMAAGb/010AxYQxwcEyhhyBoAjBgMAJARSuOumeqLIygWIdFurqlqr6Ojlb6U5zBi1UgmncesqKXZnKGMAEMRDozWjIjFixWjlFhD8oCW8Kkss56wgONZ4ymUNdllmnmHdEiMSNgUozC1YfGAFbVcebBlZqJGZetVrMWsoZZfjQ/Nzlnu1uLnJm2F1BWHp03QvekefBtlZCkQKKS1pbVwe+I4j3LNTmJfYamf/2+v0CDPsIP0VmTb2XmR/HKsqEptiGf+qqgIEBAAAAaqNAMQQKA4FMRDhAOh2gZcSBYEQdMSGz5gYiBWrs4C5SaqiP/7kMTcABjho0/NpRsDGjVp+aSbkMniEQKgGYVDV5i3iYQauTTP3TGKDkL5UiIqRwVZuQyVBGKyi5ECqCqMXMaCgsW8OSl5K9S5TNT+5epoVHuOHsPfUuLL5cTnvdqNeO5VPW9rZSOyU+XslkWWktNBl4SUGcanTPZmJztEVn0tuYhZTFM999+Xf34xMn8fIOlEbrXQ7tc4e8pHJrgkcpFSBjSo82KVonCaIJCANHhhJ//u+t5AwBQAAAKqQqGCwUGEgGWwYEDYqECgcfiQUONxwCeqRAst8Z4FibwVgEviZABGhQrQJ+xNGLdPy58p0HtJMw/KKEwhyY3l+8ODqI9uygkFahOW60DQJhllKmo40mVDBlHvLCKJROm5oMQoADuXGmhMZiAg8VNJJoyFppXonQjFZtVuEjCGlIxa+JIEDHJBFNjSNbFPCLN6uw+11yJKXaSabuM/Pfcr2i6C9kyTS/RrNb/Pa6etS7ckLDewggiyoUSqLaTWRrFlFjJ4wtbXprHV0tcroRWIBgAAAAEGlQiHFgJYQwkjECQBsEIMTP/7kMTbABkpqU3NsNxDVLTpebymKOwUIAjC0g+0zEgaEwGMkRpauzqhyZmcOxJdxTtUYLXcgV+m7mJIaP9atEBAXODNTsXeUoF7VSWAk1C+vldGpG0wohjjPo8AiW+LGur7rP8l3tumoeKwTD3SNbrU+ouo8LUeFHO/LHsuzvkUYnaDakBRCWGo4aKO+U3NtEclDRF5JuY1v3lXVnq26GHLyIc43u2mdnNNso3a3NkEyBOKDnjrxBE/Xeqc2MEgIA6KtBlKT6+yWsLLU2n+6KBwAgAAAGpQYQIZGJhgAYyqvBYDMNBRrBShAqie2cIHwhngBPThURNeGNP4dERqeo6V6gIZYvw6rpAxGV9O0z0GBhREDXMJUOAyhUtuSwhA5y7zkKqV7VDATV6/JfEnHxpddmGVvI6MNXUE5iZiUL7orBw87T2ViZx1q98kaOnD5HPdZO5ZCWOMRYYyQoaXdk355ooZLovSPdKfjar+TM3/errL/xef9sP3EjTIs94QcCf7Zx2aSm6xJ1o8iE0kzhouJ3uZ7NPze6qqBQBAAAAATf/7oMTRgBoRrUvNvNjDKjRpebYbiERbGUDhhYMYoeipoCnMDBwsmBwCCE82gyU1VNB5iQucIHJ4S+rA4HA1/zlySmKksnlsKf0HC6reZSkQi8BSmVWiwDSyrnOkoDb7hWlP38LCMehGRODUG7YM2jc0hatNCQvZtkDmNIjQiZiTwOveg1icpxVhHsryS2MnU/GttCfmI0GNSZhdI2l1IjJAXbi2QI5PIWz3E6zetzzz67yTMKzSG5j/1rFan5jGyD842KspevtHOVF2hpjgkgsjdT/M1TYMQCAACp1UYkApgAJSMuIRCDC2GYWJDQU1sxAiPGAU2HWcEhKjBUWCLc8wE3g8cW/jWMiIpPK39j5o6ve9yJmBJEWm3YFQEwJFdh0linnly49dNfrVc72+XrrafV58LREpLMTPSaSLCeiAoNu6S4jPXLFjcJOif8IvMNTjgtTOqn9Q52YpT9LwSm/P024+SUny9rL61UT06qewnrtyWRll7iUL6S7UZKb61Zl+wUijSu8Iyiceo2p6QPhqwWYeCI1P9u7qye7/6rsEAEAAARa5EZgGASsuaIQIR4m6X+NKxIMK1hG5ZklOX0MvHP6eWfAk60o5+Nj1DclJrRuFyNR4RJqad1KBEYiMur+jOUAdS+QlQKrX2iqR+kpMZZUoXQlJcEFlmlQ8Yf7TmsMffWsFVsbRf//7kMT+gBj9oU/tpNsDJLRp+bwmYIa7uK3rI8dvv0pFNegbWHP/Tllv2tqrY6TVlg6Lq1I39XH7K12ROQQXKKQJ9ioqmdpdmuS3eOfnfw3+57vmIPZZybSkWVhY4xfMNzzBm/7Dw8nloeQt4xqtiF3Uz6KNs0DkCAAErf1GJE4sBBUNAhsOloORjASFraPxiY4C1NOIvykUYgam1DCvZ6stkwxkfmXY1gEmV7LRZwxUNVol9DLASDFAFHcpkhC3ttTM6VQkiB+ZXI+/HKazjZpa1qmW9bqXNPvqO7YJI4d74lTmlxqYnTFXfNKT9fxnstWCH77JbrLcCWa0lRepMfyWAgK9NIFk/zjLfvP3CPumqf8lDGujPu1ifR3NvJrGbnQoNOJSQYGVChbSXjJcpDHLse0AB808Ynt3/+nMKAAxACE3lDejEHxUmYGsQSTGAASVA4hfpCpNuWdt0GfjjQCN4MqzbGDKR4Yx5sefNmiDwRswhV+6+pkVGv9SyqlHBLN7El4k6UArHeyVs31MT9uWmEooOTBlkGyyNqgg5BHEtv/7kMT8ABlttU/NMNsDHrSqObYbkJe26cRrFAcH8Z04QrHSpte5SbOZdQeJ1eetjLWneOqs5eNmrNYz2zUeuGOLybCZd1hqopgmq2EvN6HI7evmP/8tm83zFdvpFoxZyFpSVDXzY0mNa5CNn/93WDgCAAAo38mSJJjRGY0FmRngoShkgBgwygIRxMANzmiBLlA5IAx0lOJDlRyyII7m8rT32Lc2ZwFwPx05IQEFB8sfcEA5WAYXp91SIHzfekZ6TBcsv9pXMzwv/R501Jtq3Jrk3CaxJ0ghfU5aSXX2iLqp1IYh0sXUdHrkexsuqdearjD0HJqsy0C9wDg0lojTAYnFjgxiiiUuWVGTSTvkY4jfnMKbtlUaclLRbMQzvL/shpze22ofSQEBfTgASE4Om2AyCYRCwP0XQF7a/Ttq/AcAMAAQgU4kj6mAx8jEjwz8Hb0moTJA4Md3OCxMcYLr0ctmQAMzWCJrtrN0Dih9vLerhk4o2lVrFKZ6tW580KMfmTymaHEEwpVK7kRKFWsvuObjlnnSb5jLnXuXrHwfuzoAqf/7kMT4gBe1m1XNMNrjPbIp+bYbiP6Avz0dVaVyZwhYawDoqTgm6dXqkkJxGq+MdE8EXbRo5XKlshByKGP1LI+8+bD1M5FEnTbL5LrRZuC55WONsz+1PY+2ff0jGdQ9AlA6xFxdQ2igUheSR8ADjInB5heGHI5CNo/u1dYMAGAATNf0c0dmLloCSDERsYEhJlIhwFKaawXNDQSNrzyuGMGxiRa+lDumEvt86LUlMQIW3jbX4mYoEt/OU8wIQhRGUWZoqCEH09DbulA1znYAhNb8DVy7cVxGml3A8fsy+NHubnPWxtE7Vz+iRC1owzqCdEvzsxcw6QuvtsHF283KS8VGoQ6BJKM7UPQRoKQvn2IML7Ukr3GPOtSu2poHwdULycd9d95bDCbPlzgpoQJRGEa7dU2hQxyoMxnFcGh4oREbWfJ7v++hnSkwYAAhCgAipseMcKJaY5GARkgHiT1wDGmQnsx9br+GVPg9U29JcgE8hZ7e4yQKoL0ocygEaqOc5OioNk2GqIdCNQs0NibJhWPzL0ZfzVt2/8RWLfArjZMWgv/7kMT4ABk9nVHt4TMDK7VqebYnSPYOlSI2Sdlj7I/qQ6Q3QyssZrFZyUtVpVH6Mfb6O69peJh5w01NkySgN7YmliTn79OVT7cr/KfcwyXTXtmO3qUt7ZXemFzd4WkyBkGzW1XtN2zS+G0GA8LqG6P5TzGWDABAAE5PygE2EkgkHjLE8ZMgUng4qEoAWAREogQ4bjNQ0CCU2Y0X78ZWkcGwttS1pkZSWTw+nlDJiZKkzL+SUQDKrKTKsXmFiRx2eySSlYTa+7QN/37Rwxc5REIf32D+ESKNXcDi7evocbW6cyexoQ8o1D/pDRXkoVZxmB5DpVCdYeXlU+cpfVNvX1dt8mF2ibioJqNdiVP7NrNx9Sh2prtPlU0qrdc3vsXsykMitsEPNOo0LnSzo0wzSOSeYQQUAIUD5EewAv5O+hdz0vz1KswJMDAANtNyNMFDBqIXCNIlGQA9fNOuDhCgpjhYn0Yq05mI4wMonhy3TMxNVQh2pSx4EKoYp1+xsyB8oB4z3QQCS5n39wRDJgFuAZqlKEedu7UTjv167aKqEU7lov/7kMTzgBcdo1XNMNqjQjRp+bYbWKr/uV1VshCdSvx0mc/1caSoTzyC7RyA9f/mvv91vVXUifaObvoDS1vXmUvB1tFSUyzmxgxH+cf5nKre7N5Q37mLi13FPVRJzdAzclLFObWuokmQHBIUeEKSVFolV1HuySs//V3C4BAAAFFOVomdrmSPAqMbY4KgR8kn0HV1nFRUaQ2+gJEmGBHFfhLJi85ixoR2ZJV1MmNR0tBD0kKhKUUPzBVFNvlP1yqHeX3/zmCgn/OR9j3bGBgppB0RF684OTN3/BBxp7jaL/l9fDqGw+7VY0e2gq0rczqGjVD1xZrGOKjDPZKr2erIPiaFo89qsqvM3tF/Mmp7Xubr/Hhr1yVXGObb9ph9Z6QyHpioDaIMZFhcEAwcYYDjwdFQYaf69213l8sJEEAABkpSJExhYMMFACHhQ8HR0MOjBTUrK0rjASQ4ENV8hqj0YEemiEzJbVxfZkbNHcN5GODlNi+uABBRIFhyq/iEY8LWLeZAAwPYp8JorD/zyeNztZVWq0SvnQVpmH7klfe/k+XuWv/7kMT0gBgNpVXtMNrC/rHqvaYbWJYc2506uZ4rJYj9pIadzjxPuYHGk0CYouWfAAbrSBDMzOfTsv7jlfDtSOXuQ6ENG/c7Rqp71Z55u5CpfkY/5ebmzH52wbnfUmWdcoRuU/ZQobEwHKPOKbf+SmicAMAAQynJGjSI1AgCJELYgnmMDCEqAtDNRVOd04y9hi8xE0Mk3hivXfQ5VuUXeykDT1aZxu1OYIizfHHElDzVeWRkcDjwOs+tLKyI9j9V6YpF79z0ba+WRyZtHQStR8yEJ2v1o4XOU1htZaITGstUTnWFXtoNpm9NOiY0PaWaF+jqAzA9sIJ61Alk21iFpkVSdBHT5YjsR9wyquJfGkaYk5PLa3zdYp2/KopnwsOnhMjJzoHExSmRWamijqY8GwyYYx1NvkqKCABgAAcCcaSIkamRKFMeYGB4tYLoALQpaDEp5DC1QgcVhDUszyiGL0lIvs9cZ58O9NUDgau8ceERhMKVzD7gwiTEZLOQOraPJ3QbLx4yYNR8/2rXvzZHyu1cMasSwJO0X1CaBdZ0lce0sf/7kMT6gBhZo1PtsNqDHDSqfaYbUHpQ9aNK2xphazi9ujfS0KoaYmkSNi+iz3e5ufCk38lQY6zIw/22fXRh9xvvN/jcJxmvf8PbFVU7uO7hQY7FmopCyaqUKFRim+bpc/e0agBAfW636O66xecMCCgAG2lJGkb0MFAKtYPHuoTeTNCgyvB4WLHWBto19nwAdmyFPza3KDuF3lv/MGTLLEmGUWAheohR8kQiGMFtUsvTcTisyuiaKPEuYVaRZuWWKl35YgQbawwbJ2EN8EV8TMQ8uv5HCPQSSmmo6IxjUVufKJCykjm1iWNflbpfuz37i/U0QYz6iqZ/+Y/bM75nx96UG3KLNUvDf/vn84dj6WBQaS5aRS+T2MMQqBBHnk256psXECEAFEtSNI1gBJdIwyaERIA8KRLAF/L1BWQblG16Ku2MIjLQW4Su7fJwpqdnU2YYUym+682CBNk9W/EBGHIt7vWklIVhT1GelYTV7UeKBd7sEZXU+QhBHq6Zh8WfZK4NGu17rddhhyrlVZZxDbSO9n2UzjuP9AUrq8bdXwVr8P/7gMT7gBhFr1PtMNqCzLOq/aYbSSzNrNrftbsbdRNllF+uavox9oH/69576cxt6UajaiuxrbU1j1zf3b2yJPPfBRzPQI1TvcbvI4pu2e0o+0E0kwYUdfV6cZt9Ldw6UHAACVtAMuRMyJQ8GJZUuGSCg0uTVVKDSsw3kx9JlaBo2oSmaHSXH1PQQahaxoAumlGcgrDg52rtrgNIpJTPag6Cfi/JajRyg3NZ23ikdztSPXNWCRK1tm6Fs3ezEjXoj/TNiJFvWIqmdiM10z0iLp1EbcQHF624oohPMZOwmuUkTfzh/tF2gq3VDiiR6gJdfa0gtnuNLhoxUbJ58UUS+O+W3liW+qLa3g9RR1B4SGQYgBPVJnPEgBHio9Rprmq91b+umwYCYAAzCi0SAcuZGIQhik5CQFi6NQ84XqOIwA4bi+DAjESzaEnl+q+xyVcPWdYjJtrNpf0MmXIsVv0k2MD1mP7L5YKiCIhK4Dfx//uQxOyAGSGjU+1tj0MTM6q5p5tU6SIt+F16Gz7t/W91CU6BmzdGej5z8bg4VcpKHuQYZqfOV5DpaFEQnYpdXUlIkiTYxQYSbpxQF0Uyi83u8LOZK8N2VosGNGfC3lMs1by0tbSlT88cYz/Cu17kf+O+u917y87UhExi57/UIKPO0/UzbB0AwADcTcrSNobDQAdBAZAOioENN5g4g1Yu6ZIKiY4t1gy+SA4MQM4xbly0TPF5mtzGPGBFDkwOr12zFC8iC6SXwstINBtHGaV2x4g03V+FlkxnQ1Y3fRjr1Zg8LFMQlo9RLDnRz2ksgnydI6cPM5WFqllyWFYw6mW3eiYXXbaTxKj4rRXhW192FSyhLlmtjZzEy9cmtrAjAWijyLwvXRu5d31mztntnMjDk21gNB5Ympq5FKvhHDX51Ed1M9KcnVxnRLMUHHA6xNTrPYjdTfRVzQcAUAAAinGkjqA8yANLWmaBQqAj0cHAwdDpnFQ+MuK3AR7SIMfLTeQZQucsrKMJf45T2INMbKc6zjSQUHKbeVAVQaNy6S1x0DWr//uQxOuAFzmbV+0w2qNFtGp9thtYSvHg3MmIrd7bc1xZ0s6oW1YVHIxRLe0pVZYgDxtYqZKV+gPj5Ev6Jhf7kSxRrVKE7frE3kNG7I7R8ZvVXXdvEmv1jGTYcMHRZxIw1qil4uNElDdOXo8gocLDDYeWTmkm4ZBpdJblGHDg0I58oJVgSHEKQ5xxEGXEiiQ6ZPO/vahe5orOlQAgABybKBvQLKjMHzMVBluBtxg34RXacFRx6wa9lNVhgA5N0YZrayYWZWtK6m8jMDlvxllNkzocaC15bpRFEq9amyoDiMsmcZkoHYfSNHh7PWSwf1urTYDdoUM2EWlb6DO3WcE/Po2603ZKQJgyrSBa/8jibVY3MFwkXWEEdRsCl0m6SuyJ8JnMYWbSKMHlmR+8bf+bfNamYpkz+ltdTyvW1+9xiD17daZi2TTkdGWeTLg+pzQiHmKsRRZ6fSqbOhBAACZ7kBks0QYBirYknmACGDbniDM1FUpvxTvsoX2FmhjD8or124G0d0lv6oQzfi88TpmCMr//GqSjakps9Q6tClE3RYER//uQxOuAGcWhUe2xGsL9Muq5phtUveNAz+GL300I/LWVDJKbokaA8xTtGKKCi4eFd96jKda0Sn+O/TE3G7NnyDlUmQU6QV55JJHkMIhnjUnwvvy1FMb47WgX6vb0/MfSmSbdeZxpQnIe/XjfMX4rT/fcqj6WmoYbs2dHc4Smz0gxgC//11oOAMAALYTljJwEYQCM8FNvOHCYlMToA0RS0KJzsGGChgorCGrPguUx6cpFpn5aOdY7mHVZ+y2OYFEjhWb0pAQErBSmU5NdGhcZg23HCYXvfwa3n1vZcqcUcKGzWpqveVYHy5i0R9f6Z+t2daRNbCZIs2hy8h1ZOYL8t1xDoSHuW2XONMxGVR627Ew+UxRIw1FETuL27zt95bX/TR5O06yshr3Gxq3fzN2G19xl4WCvBpcy65+mmOAzXLJHvs7eqpsIICAAIxflMTGRUCMYBTPQdlpWqGdEgKn1xmFJB1QimY77ZAsVmsGCmsxfdQ7wLRhtfgZiKQiwqo9Jj4+3vblYcDJtyoCoBEFDwXLVlzLdCYa/tvSnF6platU1//uQxOqAFx2bV80w2qL+tGp9phtYYCXGaHzofvPZQQbWpY5d67jhytSUbMI2HICx9NicJKOVhkgpgwao+zw/7npPy/rGk8VhYwfZVjUqDRinmEWxra3mob7dVVLKuUMzZiKMZ92j1tHyaGAZ0yTEFFo4cTKT4i+3758uZ3qUHNPsMKqkfRnHJExgJyONtBHNMQCDAho4YoaDxI0wOCDTWEbQ06Nyn5YeBJBunrDI/uVAMXI8/rmOGs3vv/HzCCSIHGYXEACGIh0N2sCAY32LxxNmBQvmZ+hcBJmkyqQfxHLTwNsLbvGFa0sEyxK/Q4fcdbaSI0cxDDHpNO35Flt+yI8jqU4vLqH0DM7QZ625QqZHCpI2TakzZ1RRCvH//P/P7/kL881Ex5TT3rNr1C25T+4hau7Sta0kAbHhS0bbLISDINW4fhim6nsrUGAAFspytEmNKdMYgKSRIARaYIYmVA6ZRmoWLjynKkX4AyeRZzF6SgbibkeN7TYyQwsshiMNpARIUSTKVREZHWXQDeqEIUySBo/LnwKBPLtlnkC1tWPN//uQxPQAGY2/T82w2oMItCt9pidM7mb0IxsWFiwl01dYHVK6zSuq9r3XFjp+nosOI5LLdl/Hh6YhEm1hR9nkwCCjAVMG4DSQb9PG+QYVuNb0jOK3cuZVTM+S7rfH/WfOaKTNd5rO5lU/ebjcWNLd5gIfDiL4gz2im8NmQwHRQ2McnTW5MdlAoAYAAyT8plF5iwYCdGOYjK4IdjwYWsIQjk0wrZss07QEenQePzjGU0jcYFvpDUfEGKL4xdTmTGKh5ECP3KYiFg9GCTX8FtLhrxG08RMN1LWDYG3mpdTp0IguHeIzsYo+HiGKHBqmqaony5klx8VVPmNeWv0PaI2mFNGqaqlUtXpLnsfL3+9xiYPv1qf8825lHSm/RldE1FNJmDe/Z7Ntu9tJy7rrrDy3uhgnurbrX2BrDnFzS46dJpSx0qtMtK11Ynn3f2WLbS85aEiedtHUOFplwwSztq9Ck90IEDEANwNNEEJHGTJmZFGgdo7D0Mx5QiCOKCAYTEZq4zdRRIaxW7k/aZ6YqZS3NzQgQP9L2Kxc4ZGh2pbLAoxa//uQxPKAGS2hU+2w2oNqNyn5rbHor7SefSrGmzTdXXfAmFj+UeaHlb1YROiS9JhknWRhWk2ngHSwvgUShvJpoXl0Rpc2WTHUlZQ8ZNzMKTRnyWlGF1qhNtOMcy92/XyVbbEanGaTCvuad753HWtlW+6WQwVO0ddcJB6/KX9RtZOVtoGVUCGZKtIl5NltW2AwaAykHmiQXWxn+2uuKBGAAASLUJANISHhAlfA2RI8fRF6hLWs4gXG+PuQWTBQgFdycs1Oxi0Qwk2UV9UJgTti1FqhUHSyZt0gyOVfR2PKoFkuUlrqOFBK9nqfUZu7wPB9LGP0Fo8cUqiMqtsYFOVvvk9l+sJ/GvbMyQ0vL61tS5K4wtn3FM1I+dKZT+NK57fSj/27EnTMLNA+iVLudt2ts94zbnya7ktk1ECXjUXLdq+qec1A1sLHQ5ZVPhg9GHdLDjgWMwecD7F7/UqrGSBAACaDUkRMJDQCl0zCOhlGDqxh1oRrDARiYR8x6sSKKPQEim4VN7TXF9nJuQ/c3NGcRfQtdjJlTI8Vg+kokTyIFZrW//uQxOaAGOGbV+1hMuL9tCr9phtUSqDm4pZtsYIg9r9PWx7VbYWFenzWkZYqvMCSpDDgPKk0yFv/ECMmXSko01AKsNolUUyR+EzbQlgMTOFpHxsrVd2cWc3OLTSuUzoJskF3RZC1Uyf17+bW8tk8NPD3tPU62tu54fw2fUyAhDdtCfGEjn1+VDwaARA+UMdX7B+hpBgAwAABCKiJDFZrxIBkpkWDEvYOi4KVGKhcxORIFY1BE0wQkGgJLXJXL2GHMNLeTfMDNxtesodK2YYJr3zqVyoDwJdzpUPVP452lZCYW791jdNyUdTDJxw/LLy9I6eBFta1HTPduQIffrBuv0QomXZjiZrNFeXcw/TehwrIHGy4WDTWXIrPX2ImDyoQdjz0N00meuX3vX+/vt7udUazQVEznh91nptZyoqruBAENOBkg5OiWKRMV2OUiXKO7sYtwGCwiF2XOrKxZ0n5CBqKrRgAYAAIiU40TTAgt6YoFmOqwwUhEIpYacCJIhQ1NeJlcgYKHhEzUJCO5RmxSO2cyTMfuffImCX3XpgohIC5//uQxOkAGHmhU+0k2oM7Nyn9thtYEDwK74kEjRDTQnbgkwHOROuwooG63Krd2aUsuzQ4NOomFBwmZeInstaM10wMlty7Fno1zV6HsS1lw0p8tm22mTLIohRxpZEnKKIVYIUdpuLSM13HFSUcRos45DpGsc5hvyoaYMS19pWHwbMUWtJju8+J8yRN7dY6DC0qtM5XNYUIAmFwSPB0mcNAkZU832V/+LzgOIIAAZYbkaRhAi4wsyiyu10mbDEgweP4HBAscACsUZeo4FEkzYed2t28GjLQJ/6QyMGY7KlDHZMdI1I0+NYsA0dhucmE2hIC22WLukTAXce0THav9UIoaEgcj9VJg0Lz9vFotZzmR5tTmh8SMJtF7DwokIzKjL0y2p3jmoybRLKJImXzRI0M7yoXB6TSUWkzE9hKNHk4SIc3wZrP5Y/+sTdbE55KbHT2Tpf1KE+pPTF6R6JFUwwTmueZWhNYaVNB55cMsDgrQa5fjNH0VZ0YIUAAKsuXREDJ2kGeCGbYjAoSskTADgy/QXlGbRu1ArWwswM0Vfinuyo8//uQxOWAGhWTUe2w2oM2Myp9tidIY97735mOItem3/yMIXJjTtQO3hgQxQKnMrBICaddgm09RQC/HCCGo81YLjOxOwptydLFuWuglWe4TrYzQ9qXvgLZytamimJJZOistgdWQvLXlhwtle0vZOUE65mvf09XL2pjbi+sZ/WPG4nExT9Pht5Vx0oZjEx1F19Pn5veuSorKQ73orpAmqBIgOlnGmpq66w9YKAAKtaWxIZKIimGBFRSSNgclKj8BHUjgdPJ0zZxJKniHqx73A9Ss6JxlEC396MGWdCadRuwgRJDS+PO6Kl2bTueRYASGXx++3YoF9/jRHl7VziK/r8qmXliONangGC7RLLhzWqejzsuJjxB1WeuKz1Zym6+/cpsqSb9iCx7oryiKKAMGK9fINzYvcSaU+rNGLMSfdNm7fc83H1uzUbLErI68srMaq7/94/ZEs7jUNerNc7qR+knbOTD2/+hnTgCMAA4zXI0TbA3OMCCMVJGXwCniRoM+M1JEJi2z13IaERs0RyK/VbkbmXKsq0GhRPF46xd+AE/Eirr//uQxNwAF6GZV+0wewL7NKs9phuIuw/4gIpAUVW4ncnBGo/abkRB8PweJ++d4cqjMVEWES1yIZkkFHIvoJy56DSqx73NXtUf/jjcd+JCT9Z2KMtgODBdQgPIEZYnRJycXsFvLXuI6WaXTJNPQZzt/mn829bnnMtWbjwrHqbm+z1N1VRhyEnCCAI68qzrlnOoo2FqrfI8zzu9wyYIAALYbkaR+y5gCxgUBupIqEFuZoUg8lTBMgbB+Rfq6l8iJ4Z5XDlu03Ez251bFWSAhpMWntpwQfRLhi1IkJCcMjr7aULDL8Mv/kRC7/MKZTnVXrY2Tjk9cqe+sYBc+S2Xgufvs3DiN6rsJ5JkW61dTVMlP25pfWwegXVmksSdVGqwYx6Rf1ctbStamU7Sk5iEUJ9i1lV4w/jKvUVp3m/amn9rS79P3Jlu7qULRy1JZ/Y1qBOIHt4emSEiJBXFaOW2vm09KhUKKZbV5Gr6Fe4IAHAACMlSsk90iJioxcJMuAlgyJWDAIFRa/iQkMmHXYCoCWYMtLwFbKfsceodd5RjlMmJkLQb//uQxOQAF+2hV+0w2os/tuq9pidQkajwoKFvnhiNASlTX47LrbVSgIicfmGlkw9Zwqv+p/tStKKpmGimjSKAUVLehJBHaQ05DZxqGzPkZtknPILYZ1sfck9BjbN05hvcIEJwYfEo7+vKF+yqkms6Yd4Mbn1neP/3yNd8fl3X1y2P+1WVbe659YyTpG3+OSBrKIp+d1iobETRZIoGzQHe7+VY5tUti8WDiCAADQv6g5IQkGJgYMLh0dCDYKipQTI5GCkxyoemcXxQlGEIpsBMv2eyYWZLOV7HaYzIEY9TshvCRcRCkQq3C3STUEaxHQVFm9HZ1NsoE7Xdt3lHNebH4EqPQaqLmgXqP0NbNJcbzw2dkwufXkwRQRSW181o6zJGqtuE17GKGjC8kMY4j87m+WB/+bRF1kV3BuaRcyk8NuP9fJyPBe17QUxl7u5cfM/6GF0WRDYPuwQDcndIjjtOMqzb/32Wk6YQss+vSrtjDd1WxbsFADAABEJyRELqxYSOkSV4VDqKCHMSSM1FU51zTX2sLzETgwjGIV6deBzN7TP1//uQxOIAGSWnVe2k2sMttqo5tJtggEUopOPRBYgMrD6naoqNlUtz2i/du0PtVRj3269Lm4Vdk79Q3zCiPZkSE8qoAGyiyAORVjhSKpY/KZ1kiByeP51ex40s8mLVHphCKU02T1c9yEoaXBooPIpzcFQxxqOPIuIiK+U7Sb6h5JXZ5HRMvPxG54okFEKMhUNk3O/galByg0HTIrPAk46o/r+/33MRWC4AwAANBy2NmvIILGPAgFcOExawywIYLVCx85w5pocCRINCbOWAbPYpGRnleNve3ozwGmrx+YBBBA7ecvLYtBtV7ahsD3rs7KU8taxoWo65zTRhzeKHwfUfVnLVgBjg8doJT/88cNWhwVIW0lgt/C1WJHl05vehdVWimg2bDSjUYz1D/NyGKqorRNtsvhLdYjPIZL+fg1PdvJRX7uqt7Y8ov+YzvnNXYclWLYYEpwZi82uFZxlJSzrlF3qHhKIjz/6VqgcQIAAAGvkyIOBQSYAABB0wUrWDKhwWemLmCHB4AqmY47RgYcmsFy6Y1PNmPcFSgAeexKjQRJ+K//uQxN2AF92hU+0lGoMKtCq9pidI76YmOgqno1buDAVA9TemsNStTN9YAmEtaoIyljzvWto7A6bnuoWp0PiKXUQpaKW6mVselYuIdGHpmJL8P3HNI8HJ6CBJVUm40JIohI0qcPNh9dSNMhDkD80xmOIowd6RtIpt7m3OVGMvnTi0q3ZR9km/Ky6TKa5zVHTiTDeWQbHyXpjqSDBUYSBRMc5/tqdYlVDdeqIBAAAAAQClDIABEIFYIYHCYUGgQ/RoUAY5goTAVMGTS+j1ArlgwaGliiXgbu3EKhI5KZQwNNdnoiZYDKwvXj2DjSveDpPUMJgVMK9hNEoIn5FZh8YERWD7W61KTAmbnbzMVyqsOhnAsiXhVaz1SjGxnppv0nK9qGAxXLbwler7NEsBEs8CUrLLKBUxyiZAs1iWNpE+T5LCEirfSLc4pZnlTu1EdbXxXO12uri05g7C2won2pJDvySZ8/bl31PEOYKpq1armmL+LtVzSnrXyzJdBggoXQZQN0b/oWsYQDAAAIFxxoML4DMKJAqgkCEDlEECIXESyRmo//uQxOKAGamjTc282oNqNuj5xhtQ8Jt6hTZoZMHGDew1qdaAhwLNGZGI029BCdzkcqGDgUhv7riIDbNKPzXMuDk608qBk1V+gxVB9uyuimp42LrPOQkw8dcZHA/TF7yq/Bi2zkJcjIR1VYuYXqnN+v29K6SCP3LiFgU6fBZM8slaaRTcw9F7sVhKHohewQP37HxTR9b2WcbvLqT3ozfz23c2DrKLsHOYmY9GPH+y+IJk/DienO3EgwAAAAABONJBdoAiIWBGAckLwHDyIeTfBoCQ2TtsGd8goqJQK+Z3FIZLAw23tXE3qaCOMJxgl6wofbPZ3WGBUpo8arM5DjQRcqjEkMqtykTwvWbxxmNIlLhy+9VOxfFomsrnoxCTc2+UztcPVKnp+teOlhwsehM2oLyUIXNXpRIZ0ySY9zJhNNj7I7eTNFl87OfKSFw6k02yWb7tw2aENluYYhfe/4+eZRXKBxAYY9gaWhqQMGcwykJNLjZzleNeY/WvQooIEEAACCfvNAEyyYyIGIGYqNBDuZKUGkBAYAmDJJyQ4mqoMquY//uQxNSAF8WhT+2w2osSNim9phtQcZAcRS4l/Udzh0xl9ynvAupqFR9JUYkT3ymasgEIoGod8T9h/P59O4mM5rCMJ443LZkN1h2rQh9NUjCwne10BK2j9zGBl9vjPUXFU7+KE+cY/436rnmarzhIpMzjr85jd6vra1nNgZZqsp+3pXs9/2t2y+Fy+31j6PwTtSuqW0yjmuVtStoIN2Bis+6x+dc4P+fsV0NykDDkK7dqd3aWCgIBiByKRzevbBCjfS+AoAQAAgLQokXpWGMABpgC0Mm7zAwgOP1agIfHoE6EDF10mDlxz66RAUgxdQ+o7bSvGF5mgH4KC3TTDXIRG48KQuWTZCEqiq/YQ6lAHnKLZIBFYt/ZpjChNPPzBqWsdVeOz1JiDnli+4PpNuvMG28uIHSE9DZdoju29YfFHqNe05yVU2JHSNuTbDKkL//lB+e824a9PW7k5fwk5uaE3t4RPd9YbI1712J6lMSSgxkKyKE4uJYMxI0EiBxommyK0XOyWVQLkExRcd/aVXgxm1J1/2lf8u+hPjpWlzwNapfz//ugxNkAGk2jT83lkQOSuWl5tidJZ8fdD1zLGAAgAAaKdjRNJKDAwBeYANhkXDGIGh4c7rWEJAZ6OtedluxYGwudR+phEwGBRutdgAGnyzJx+K5VHUx4e3XJBd+NzFO+osFxuq94D8CJpaGXYccfMTpqS/6dhuMLRvPnTxjUCwwL0E9lh7qHASCy9CUUoGhOFHoh0gLqJMyjtmUC8HqMzSTYTrdaX2F1I2pl5FOEYsNNbTL1PTKOm5Tb2EpvyHUIEsRay9mooJOWla/lTC8Wp3LEs2JKPvNI82TRBBzX9Ve9yAHxYQG2XOqVTATNzKP/0xgwIMAAtMygUBGACAOVGxYHtUEJEBJJwRgwWGedNRY5iEhqiMCW86galqY6gkwasvrI0No0AnJQall+2WAanmylm8Eu5u1oHoQt9uRThNR4FKIW+Yp+kojhV4h+p7P0xHvaCxOGMScbRNDSo2kystHJqJMRTOKfdw8+7ZzuhmGekNKxbQatKcdJ7JJO76c87k18xL27UHTgn8GeS3WZkHNslcIekKHCtjM2nWgyMETAdPcNsPNPkFtJ/3+rov9JQoAAP1SaRI2RlCIAJTPzhhGEfGaDVgOCgSabJA10tshqZkoVqZFzWweS5n9oDHCI1Aa+XqHGxiQEP1H9CwUmY5W78FjRa9K3absRD7X4R9gmNzKxI9JDCOLJ//uQxPgAGt2xVe29OILztKt5p5rcKhhPUUKS6tepls7NbW9oIVR5KMtKSurs06nUrb3dSM6HwaN8YXzEKmUYUsFw8muQjDJO3GFxFNaX63Wpt1VQqjb1qRi2LNXDxIwVDNW4NjDhc8QBiCEKDRcwYOLx5QsQbU3DjM0DSjVX9vRvDCAoACRmKSIg6IJOhYgasjFSZyYgEBlcDmCQA8K8jrvAMHzLCJbr6gPa87nKDIlBYo6CqkUM6EJlELmo+0hQnPW5SoXXl9JEygF3+wwt2xvQ4EWIhCGyHUZ0bFkrfV19LnXdT79WDk0+iK7yWFLyp9yKBhWOyP11kmctQF49wdNna9bHXjTczanIx2+Wxn/zZbNjP83m/gnnUf8zlG7/7KbNM+HyftYa8/c31Cy8816lVJQd3f11vBUAMAAEwnJCQkgcCnDRjGDhclOAanWsKxHS65UCv+InjIfhin3aKSqBr1yDTCkWhtwfJSqTs9yxpiAEmYhLcG4EwFFpmdW2i1l/G6TPNYy579/fxZbjer9lJlSRECD+mzhduBQbPYQW//uQxPQAGOWvXe0xGoLdNmt9phtQBw9NNtNZ9spRQ1lIn2skS0lZRDUVmmkcpudBajNLrJmYTRrWwX06egt0tr345PfP+7v3Oa35W+/J4tKFzJbbd4798FqQHXGqRytA1S+EsNkuCYKvNMa+oiFtzrKzkrNbxUgMAADQisaRoZ6GBpj4cYCklgwQdEQ2ULDSDFSEHczU1uuAYuNgqOb+pWcE4oMcXtLBQ4bPdm8saMGBigShPaZXy/t16ySisUplc6o+t679Z8HP/DARxcVTMkPC8uExayMspXhL6OnlSlu8/LfL7PrpK+rFSvaoXXTXSnQ1Odocc8OyG+sat688afnqYlaPlAvWbSnz++/l2lmRRa9gv9muZ+3WqiGE5DuU8oGJETmF5esi3JGhgdJwOKdbPi39yrwWADAABANyNkBhSgZjokYIljpUEJY0HCy4lyMH4IJoBmoaBBSaUPQLjKUGjl0diV65KDATOQVG+qGKgiZmM1TkgnFK74fUrtvlHaCXmpQzhV+TKJiwki9q/fd/lYeuSnbTogVXtItwo3UY//uQxPqAGQ2pVeztL4MENGq9thtQmeJbUPdnfXUG/2+hprciQnDYOOROw8pVO8/qZJrXOEcPRlR5BIrTUdN3dbZzcPYp3tjLhBE1i4v3Hnv/mxBzzE5CQ8tcJg9lX23zZSAoCSR6RYE2vGEq/W1q8sIIBAADBe6MYMjOikykCMiRRGJCV2ZefGHBxZkyArAeoNArLmEjBsaIkqWQO7QwIm6TyqtBSz5keUO2oxM0JX7gR24eNB5QWalPWVNpLoDp2cFZdjVh4ECdinzC4Qok5GPIpCyAMsTZoV3ApxRNj8sOCdSAUVRkSusJJuYPw2kTC9dF3Tw9WJ27bW8kB1BFCTIBWlAVQbVZZmzHYwqltr+TXhkcmpJe1Z3GbN2Klm/vSvXwI4JlAsTniRUHRQuePoTxE064NIFlgUBuGQWS0yaQhlnfVRj76ooFAGAABEFqMkGi5goCXGCCwLhJF5FwhZrFg4UcDiEVQQwsLEiA1cACY8oE3MhkgGDNrdYkroJkCocmvNSgIAljAqSefQ44IjTEjpx0rmQVG4WQOIrXdbcI//uQxPuAGKmhUe281wNgM+l5vKYgiFfpMqWlqU0qiMEVq8tqN+i5RIBFTBCYDpOSrNptUwktO0uQ7FeNn1S/GlVBWgDw+6bf0zDXnUFIUzbpJrDbFMrqsRm3JBB8Q9LcbRw3JZWVPfHyt1XKEYxn0qycHeSaWa3tpwucED9XUUZQLyhUF15TytpdpQ4FHD37uxPqT9E4AQAAJhSyRg4WZNyYticWGF2JvwBiWIGrpniJcd8uGC0x2XgluY5UW8VwwMAgzqvEiHk3AY4Wim5b5CNcty5fMkpeUP5b0OBYVAcTcsgAQvuPajZ87+Nu9c3XvPbc1Vuxj5M//v7RTl6RxG12vfxo+x6Xv/SRqkk1+cqzlHT1qmtVOWK9zO/3HWG7GU7vvc7l78a12xa3yxzV/+bzu/vLmu53aXf6wx+7rvL+e7eG9//Z61T6q48/X87hrOksfZ7dqVZjCUVLlj7N5oFqBlVm2u/qDAAAAAACakjiiaSUmZOGJeYZYSX5rFJmIBOazcBi05HMkWZOPJvUwI0iX1MMHY2wDzJTiM6BkL3U//uQxPKAGvWvSe3hNMNQsip+taABxGGzMhjIsUYgmQOmxhk3mFAyYjBxjpBGGQyZUABiM+mDAUYeF6jo8NQEBAqDQsCh4WlAOFgQBQkBhgAAeWqMTgNc5EE4ROGBQpERoHRW4YkAKHdM9xIZL1o6JYLANDactKPsrgpDaBV8l7Krnv45DP3mRvapSLGxctma06FodVp6lCliXDrZrwYpRuvAyzW7ReXxWAo1BDE26roh1cEScCvLIS88cbxz4ozSnhxpcrm6ace2BYvL3kkFZtIItv/nJKf2ztMeyVxSahugfS7em5RPzr7dvQzJIGjLuMieGnwn4jDMWsPPAcCuG90bZHOO9nKbTuxCV0chj7/W2mvdOx+Xx29V+pn3/7nnUsWM899x/+fnvtNO2M5bjOZZY577d5dwy13X77zv9r19RSmlGNSplqxUwnMMLF6YqbpKACYMRAAAAABMUkCphrqIbmtuYRZpNmQeaS5qGq7ABZoJmgSX5QRGawcdB00G47BASIzoNaDOIuMwae+adphy7l3MSZ05VmJNaZ0zpnTl//uwxOKALwo3RVnOAAt/NCh/s4AAOU/16JOU5TvS7LeOWVNTU1NTU1NjqtTU1NTWsscf/LKmpqaM2dVqampqampaWlpcfypssccccccefvGlpaXHH/3jGYzLaXH8saWlpaXH8ssccccccccf3jjjjz9f/////////6yy5llTZZd/8ssssv3jjl+ssssv3llll3eNLS5NJVagaBn+Ij2WBp2DR7EQNf4iTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:1.50349212 + //_tone.Breathy_Flute_D1 + } + ,{ + midi:73 + ,originalPitch:7200 + ,keyRangeLow:64 + ,keyRangeHigh:72 + ,loopStart:51357 + ,loopEnd:58204 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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kD8nmuy53HqQGsQWihA1haaxEkHVTubInKmNJM7l23jn/9y/XP5zusO4c///X0luzfpe4d3//vv71vHu//D/7+fLlux4ZsBwuB6uRWH1xSEAEAAAAAUAZD0CEBv4Y0G2BpUbWGVBkWalmYYYVRowqMpjKQyqMhU2oTknOSM4HTYXNZc1mTYbM0wxwC7S6p6Zf1yWGrmVMu5r0PX8aWUvs1pdy7l3Neh6/VpqaVRqXU1ruOWWWXfxxpaamprWXd41a1NTWsvxq0tNTU1Nl3eNWtTU1rLv445U1Nlll/7yyy//xxxyyy7/4445Zd/eOOONa0N6CgwV0FBQo7///BRXxQUFN6CgoL4KCgpvQUFd8UFFfiCgv9BQV3goKK+KCgv9BQU3kUFN+CCgvwlMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7YMTwg9uZJUfdjIAIAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:1.02571428 + //_tone.Breathy_Flute_G1 + } + ,{ + midi:73 + ,originalPitch:7700 + ,keyRangeLow:73 + ,keyRangeHigh:77 + ,loopStart:49464 + ,loopEnd:56852 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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bRYzHEm2cppSTCXKaxxJtipMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7YMTiA9cpNUtsJHbIAAA0gAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqg==' + ,anchor:0.03578231 + //_tone.Breathy_Flute_C2 + } + ,{ + midi:73 + ,originalPitch:8200 + ,keyRangeLow:78 + ,keyRangeHigh:82 + ,loopStart:57555 + ,loopEnd:64656 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:1.38709748 + //_tone.Breathy_Flute_F2 + } + ,{ + midi:73 + ,originalPitch:8700 + ,keyRangeLow:83 + ,keyRangeHigh:87 + ,loopStart:55822 + ,loopEnd:62982 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:1.35825396 + //_tone.Breathy_FluteA_2 + } + ,{ + midi:73 + ,originalPitch:9200 + ,keyRangeLow:88 + ,keyRangeHigh:92 + ,loopStart:56329 + ,loopEnd:63258 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.03523809 + //_tone.Breathy_FluteD_3 + } + ,{ + midi:73 + ,originalPitch:9700 + ,keyRangeLow:93 + ,keyRangeHigh:97 + ,loopStart:63598 + ,loopEnd:70561 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:0.02312925 + //_tone.Breathy_FluteG_3 + } + ,{ + midi:73 + ,originalPitch:10100 + ,keyRangeLow:98 + ,keyRangeHigh:113 + ,loopStart:61972 + ,loopEnd:68230 + ,coarseTune:0 + ,fineTune:5 + ,sampleRate:44100 + ,ahdsr:false + ,file:'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' + ,anchor:1.39886618 + //_tone.Breathy_Flute_C4 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/0770_SBLive_sf2.js b/elements/pl-snap/Snap/libraries/TuneScope/0770_SBLive_sf2.js new file mode 100644 index 00000000..3ab56494 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/0770_SBLive_sf2.js @@ -0,0 +1,89 @@ +console.log('load _tone_0770_SBLive_sf2'); +var _tone_0770_SBLive_sf2={ + zones:[ + { + midi:77 + ,originalPitch:8600 + ,keyRangeLow:0 + ,keyRangeHigh:99 + ,loopStart:6625 + ,loopEnd:21792 + ,coarseTune:0 + ,fineTune:-37 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Shakuhachi_G4 + } + ,{ + midi:77 + ,originalPitch:7100 + ,keyRangeLow:0 + ,keyRangeHigh:94 + ,loopStart:16118 + ,loopEnd:44026 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:false + ,sample:'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' + //_tone.Siku_Gb3 + } + ,{ + midi:77 + ,originalPitch:9000 + ,keyRangeLow:95 + ,keyRangeHigh:103 + ,loopStart:5380 + ,loopEnd:6154 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:false + ,sample:'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' + //_tone.Siku_Db5 + } + ,{ + midi:77 + ,originalPitch:10600 + ,keyRangeLow:100 + ,keyRangeHigh:105 + ,loopStart:899 + ,loopEnd:911 + ,coarseTune:0 + ,fineTune:31 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Shakuhachi_C6 + } + ,{ + midi:77 + ,originalPitch:10700 + ,keyRangeLow:104 + ,keyRangeHigh:108 + ,loopStart:332 + ,loopEnd:343 + ,coarseTune:0 + ,fineTune:-19 + ,sampleRate:44100 + ,ahdsr:false + ,sample:'lv8VAEIATwBBAFYATwCyAJAAZgCUADwAVgBPAL//FP4F/xH/HwDCAGcCTgAy/s7+dP/G/bQBewNR/1j/agSqAUP7Bv5UBVT6ofaYBWoHPPZ8/LcMnQDY7icJig068/j32w5fAmLsDQP5Dcr8EOreFM4GV/Qf+h8RaPcz9EYCVA0085AAkQ1tB3HwDwApDZ74TetBC/oRDvIf+CEZLQcS6bL2nRYq+5vhWhEIHg7w+OmgGUMNwtuf7ycnifw53xYNUCpB4WzmXRrRDzTTNvIINCX5E9ygFzsradOs6Tgd1QO71IcAPDUo+ufp1xjMHQDR791PGnIFyN8zBHI9KgKT7mcGwSAu0CHWWg/kERbgav25TFAJN+XYCq8c1svby1sM4BcJ3A4ExVIID/3fjxPNC5nPI8SMEQgJtubpA25VDBTO7SsP1Ahiym7FA/0ICiztFweBWtohsOwSEf8Gj8CpvoH6CQQO57wdSVnFIlIBkRFA8nTA07/L8NT6rOr/JGFm4BiRBxcbG+HxxT7B/OOk8rD9gCXiW24sWAaTDR/vAL97sEfsOvew8b8mYnHLI6IBdBS87di7VKeR8ML68u13I+x2gx6eBvcfhPTisSitbusU8pLddSkDcVcpWAgBI7QBu7ntq+PcGPYN10oZtnHLMr8IjSy+/pHEbaNb4Ofxb9U1E31t8DgtAVEsvQX/yNKiT99y8qbcUQhDaWUxmBNzJQwAjddsrbjQ3fG12E8Dw2gHMZ4RDDS6/67d/K+ixjLpsOqs/ktEV0KTI2kiHgPJ79m3U8eQ2mjt6vbzO3tHxhxuIgYPt/RHuJ3FTtqQ9qTmcDZ0S2EajyC9FEjz0sJdwR7enuze6n03p0fJFj8kfBPu9T2/+MbO5ZDiiuloNhZJvRTSJrUQwvnYwbrFO+UH44rp3zQVSewWAAAAAAAA' + //_tone.Siku_C6 + } + ,{ + midi:77 + ,originalPitch:10600 + ,keyRangeLow:106 + ,keyRangeHigh:108 + ,loopStart:1318 + ,loopEnd:1330 + ,coarseTune:0 + ,fineTune:34 + ,sampleRate:44100 + ,ahdsr:true + ,sample:'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' + //_tone.Piccolo_D6 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/1040_Aspirin_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/1040_Aspirin_sf2_file.js new file mode 100644 index 00000000..2d49b803 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/1040_Aspirin_sf2_file.js @@ -0,0 +1,50 @@ +console.log('load _tone_1040_Aspirin_sf2_file'); +var _tone_1040_Aspirin_sf2_file={ + zones:[ + { + midi:104 + ,originalPitch:8000 + ,keyRangeLow:0 + ,keyRangeHigh:59 + ,loopStart:26235 + ,loopEnd:26289 + ,coarseTune:0 + ,fineTune:33 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.02752835 + //_tone.SitarD_4 + } + ,{ + midi:104 + ,originalPitch:8000 + ,keyRangeLow:60 + ,keyRangeHigh:83 + ,loopStart:26235 + ,loopEnd:26289 + ,coarseTune:0 + ,fineTune:33 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.02752835 + //_tone.SitarD_4 + } + ,{ + midi:104 + ,originalPitch:8000 + ,keyRangeLow:84 + ,keyRangeHigh:96 + ,loopStart:26235 + ,loopEnd:26289 + ,coarseTune:0 + ,fineTune:33 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.02752835 + //_tone.SitarD_4 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/1050_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/1050_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..ac0dda8a --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/1050_FluidR3_GM_sf2_file.js @@ -0,0 +1,95 @@ +console.log('load _tone_1050_FluidR3_GM_sf2_file'); +var _tone_1050_FluidR3_GM_sf2_file={ + zones:[ + { + midi:105 + ,originalPitch:5000 + ,keyRangeLow:0 + ,keyRangeHigh:52 + ,loopStart:71942 + ,loopEnd:74025 + ,coarseTune:0 + ,fineTune:-13 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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u+vaVF63bzIQCy4HWDstPfCTR2XvDEJfCq0Tj2fbsQ5TRetJp6Kye9JYtGKmsaW7O0kp1r+YXr9mnlnMKOpJq+Oqa5lOVcu3btPS1sP7bzqVcL3fzxsc7b1Yyz5zK9vt3PWG879juvxxw/WWWVS3+u7qd/X4dyzr//uAxP2CFgGbHa4wc+KXNGP9thpsZ47sc/7GH67jd5e3jvDe9cx7z8e75n/McMauXe57xuXe91rVe7+sAkBsjp3hng1ib3aaqsxiEwdydzAwB9BQHANAnMU0oQyLwKDAJESMAMBtKIOCCM9BakyXD4RYOguOYQADhgbgWmMALoY9ohxzz8YCBHcTZ1oCae4GXXLKxY7QmHFNhpagbMAG/DRjhCZvANAUscOHzKSExobElMyQcNPCzFxoy5rM0JE+3oxWJJTGSYmWTLx8wwbJkIviZCfGIjqvjHDNnal76LUSQf8yYaMHGBY5MjFQALhxMAA57DDxwKibhmHC8WdeOSxtIfrGOCANEBIdMZDQoIhA0YsFDANABgYMOg71mBApUCIfsWYc3fl9TYyBIUgIPHAFCoBBhKAI+goPkiYyiclTFVmgpQZVGk3y3U1ep8r/FG1jIKKNLpQHrbXchoshhsAqCqLQEoMoq8Kmqhz/+7DE/oAZeaMf9cwAJtPIJP89sgjxLG5e/LPn2N/3n47Q3X2ypKxfDAU62RtKToZA0lS9gbMm6x13W7R53m4xF+W5RJ+m4xF+c/w7j/e6z5lzP/xz5+/w7e1zOWSiZl8roJZSUMvp6CWUlDP09BOUlDPy+YnJZNz8BTUWgGZir7TUWfWZir7SqLPrKYq+0qlz6ymdfaVTz61MQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMTWA8AAAf4cAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.02399093 + //_tone.Banjo_1 + } + ,{ + midi:105 + ,originalPitch:5500 + ,keyRangeLow:53 + ,keyRangeHigh:58 + ,loopStart:88184 + ,loopEnd:88854 + ,coarseTune:0 + ,fineTune:-13 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.02145125 + //_tone.Banjo_2 + } + ,{ + midi:105 + ,originalPitch:5900 + ,keyRangeLow:59 + ,keyRangeHigh:62 + ,loopStart:78873 + ,loopEnd:80297 + ,coarseTune:0 + ,fineTune:-8 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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5jrJ31eeHHWbg1WmaSy1wX459ypreqVxIDd+G5c7i5n2fppMy7sx/9x138841AkrhMNz0PySHKsef6JT7gxGKwF+v////1qYnYflsP1JPGJyMTNyNW61C/sRonamoe/fe/r+/+v/8Jfdt0lqWfOV7dPWllaxEdym9VqQ1Kp59ZmMzXyrmv/u+/3Wt4//9///fP/9/nzP+65r899/uH833/5/P5v6aatwzKZ2JXJddyqy2ZsQ1NS6I7pcMbkamr8M1UxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5DE5YArRkErud4QgAAAP8OAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.02333333 + //_tone.Banjo_3 + } + ,{ + midi:105 + ,originalPitch:6600 + ,keyRangeLow:63 + ,keyRangeHigh:69 + ,loopStart:56507 + ,loopEnd:56858 + ,coarseTune:0 + ,fineTune:-32 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.01668934 + //_tone.Banjo_4 + } + ,{ + midi:105 + ,originalPitch:6200 + ,keyRangeLow:70 + ,keyRangeHigh:73 + ,loopStart:71867 + ,loopEnd:73055 + ,coarseTune:0 + ,fineTune:-21 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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gMhv7f2ShQwaq8YQkGpCJfffcGKTXqTYMmcGiCmhClm0rxoFLKQvGBizlsrFQKHCciHQ4LL82NNff9laTZMsjSa4FVkxlrbT0eWXw/GHYpJRUoKSkbgpCxdVkMYFYm5cvl8olEYikORhyH6mJW0J8q8Nv/D9PTsIAoKBQSICRATrhtsEwuTiuaBAgQMIFEmEa6820a7a8EkREREd3DuHFh3EIEEIiIju9cO7uiISIiCHd3ei3dEREQkJ7ubuYMZICAAA44ePjyXTZHARURCQn2tQlGUqKhGqwB9gESIwggoKKhgzMgKAEDP1G0eUfWIqbT96LFURWDInF4tVaPvHkAEi4jJIinq11atFhYWFhYWFg6BUbqgNjv/4FhYGx2oqOFmlVf/7kMTrgBX9hy3tTNirKy/mfaSPzVlooWFma9rhiRUVXgWFg+Fm9VX5VV1rjVVZmOZtm+CjrlePZr2Za//jhr2v//a/9m2ZhYmCgoKDBR3AoFVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7QMT0A9MReynssRDoAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.00789116 + //_tone.Banjo_5 + } + ,{ + midi:105 + ,originalPitch:7400 + ,keyRangeLow:74 + ,keyRangeHigh:127 + ,loopStart:-1 + ,loopEnd:-2 + ,coarseTune:0 + ,fineTune:-21 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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wFvCKlKpFAkaklKnW9cUqV21SmACwwZJNUzZFSkGUslmdkKhfFyi//uAxPMAFamjNexNe2K5NGY9qa9cgjUK8r9l6lI01+10WzJiXqEt8FwiH2tv73E90y7HXU2BMgIAftnnSlYYgMBAgVYGrFgJBFzIRwEjhkQCy16qC2FICRWG8pXI4gjwpgAov1cPqRggEGHVjYpmjkQ5GHgMcXGjbzu9H1DVK34ByB+9d5lkvkmXwPT2v1XVnVoo8eXJQwAKHiInT5ze9XEeIew5cswAjwFRLvy+nrdwYxDcvnamH73z//WGC8qlj/1UawAivLrjz9a5JZZLOUmstRuBMb96zndalAn/Q6wmFsy3vP/mt71/7xr63//rWsN6x3/9/eWOetxm9le9FNdkDt1pisVwOVOEFUKKR7rXPV6HQGCZiNXVjEAEy1YSWAREY0pGJgZg56ZKRGiT5pkOAT420PLAEZaPGMDQwprKM/hizwIH7axQNIIIAF9iyyYIFp6GIoRgo8HFxQXg0kGsswVDEhswUIbulsD/+5DE8QAVFaEz7E0bY0ev5b61oAUA0uayxwwct2F0DSdE0qWKGBgjWnhmpdEddIA9C0RgxsoGgIEYVAUddQAhUcY3V1TZvtLx5EVOCQDB4pHwaAIEZmuh9Gbtpcps7lbO5IaiwQ8SuQYGdEzfDUtk0HurKaifpdZr7kZfr/3//lzmpT+cH9z+OP+7kshUosU8ETEj1+tfr//X/////////37GFuxhnSYW6TC/Ywv/4or//mDRmaS40kwaMoNMV/YqTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+2DE+YAiWX0r+b2AQAAAP8OAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:0.00394558 + //_tone.Banjo_6 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/1070_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/1070_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..599e34d7 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/1070_FluidR3_GM_sf2_file.js @@ -0,0 +1,50 @@ +console.log('load _tone_1070_FluidR3_GM_sf2_file'); +var _tone_1070_FluidR3_GM_sf2_file={ + zones:[ + { + midi:107 + ,originalPitch:6000 + ,keyRangeLow:0 + ,keyRangeHigh:60 + ,loopStart:15819 + ,loopEnd:16157 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.01879819 + //_tone.Koto_C_5_R_ + } + ,{ + midi:107 + ,originalPitch:6600 + ,keyRangeLow:61 + ,keyRangeHigh:66 + ,loopStart:14277 + ,loopEnd:14754 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.00494331 + //_tone.Koto_F_5_R_ + } + ,{ + midi:107 + ,originalPitch:7800 + ,keyRangeLow:67 + ,keyRangeHigh:127 + ,loopStart:7608 + ,loopEnd:7847 + ,coarseTune:0 + ,fineTune:0 + ,sampleRate:44100 + ,ahdsr:true + ,file:'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' + ,anchor:0.00283447 + //_tone.Koto_F_6_R_ + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12835_21_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12835_21_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..23d720f7 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12835_21_FluidR3_GM_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_35_21_FluidR3_GM_sf2_file'); +var _drum_35_21_FluidR3_GM_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:35 + ,keyRangeHigh:35 + ,sampleRate:44100 + ,coarseTune:-1 + ,fineTune:0 + ,originalPitch:3500 + ,file:'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' + ,anchor:0.00197279 + //'808 Kick 1 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12840_6_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12840_6_JCLive_sf2_file.js new file mode 100644 index 00000000..411756e7 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12840_6_JCLive_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_40_6_JCLive_sf2_file'); +var _drum_40_6_JCLive_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:40 + ,keyRangeHigh:40 + ,sampleRate:44100 + ,coarseTune:0 + ,fineTune:21 + ,originalPitch:5000 + ,file:'SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU2LjQwLjEwMQAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAAWGluZwAAAA8AAAAHAAAMhwBISEhISEhISEhISEhISGZmZmZmZmZmZmZmZmZmh4eHh4eHh4eHh4eHh4ekpKSkpKSkpKSkpKSkpKTFxcXFxcXFxcXFxcXFxefn5+fn5+fn5+fn5+fn//////////////////8AAAAATGF2YzU2LjYwAAAAAAAAAAAAAAAAJAAAAAAAAAAADIcfxXIWAAAAAAD/+8DEAAAGBAN/tBAAA7ozb/8zgAiMBoBzJOSNSAcLg+bi4Ph9EoCBjy4f+UBB3iAEAQlDn/gg7/hjlw//KAg7///f/ggrm8ozrLpDEjHcJSqhU6XykoNQsMNv6Mjk4GqICQEsZKIWFEBo8QvoSJQkkQMiTHL8NeTKmmrhUbAoHjcMrtemEtAaRRP1CGFYNyflnMtp7FV3mVw42eJNnlEBsl1P24jLJNI4/JYjLrkUh+IyN+pXGZp95mdsSyrP6mKtmAtyuM3ZRGKSbilPDFTG/zCvzeNHZh2e/7FWw7NNE6GvNWOTFSXu9KeX5nKzYpa0r3JKlNayp7fb9jWVjVJ23vOis454Vfy3a/VNN6zyp5FMY50t/cprfX7ljQYaxq2/1lWz5qztCBjb////DhZziT7MiromhJZ0KhlGAHwuRIxXRcBMgjQsZOhJWUV0hJJWS6dOYDHgEYgzFoOWv5h1XSTyq83Ozt+85sVtVXtJ4JU9VVMjbM09839HbdtarRFYobHj1uJbByyxsZGEpFhEulTYOFGLoVcuTRFwCky9qFpXUt3b0b6bUXEK90saTRTVtUNjkIo9DgGYAeA8Q0DAwmA0n0C5mAL4ZeD44lkVQKuHErFtaTRBUJ1jEEYeLyIfpH3lnRnC+h2m8ppnVpmZMq3zk3RIBigpE4CRCD0kFgjALcIzDX1lCkhQ8zxE5hUa1UxszEsrSxRJ30tsmPJLNtnj3HLPKQO1UJH51qckxxJcqsvbInM/S1zWfsv+cO2c37vOHugMPkn35Xp43O5GjRX8KZSWZjppRTcJ35Bygy8U1C64pIZZoksEXQlMUWFL4g4ElGYlL27byfmAnuildk+odD7JUK4VOzkueJTBMjViUSWKwTUPL2TvW2FOQPMLoGVBdFBGhizhNGl5qv0mxAkjQyil7IiG7URokMkRMzii90l1KUnavr0tjSbXk4llvTjO5WamtOKeVP/7gMTTgA48wXXc8wACrjDtvYYZ8BxHM4tSZ4hk3kR0nYeXac5G3jEUj/ixGOSW1rNlDsalSkdjB9VUqnktu8kvm9pssEuhtHEtmbiZTqnP/Fb1s5fdb+dSTsZkw3ulcSRGsKiMDJVDBglhKkNjJWgE1VoFGTDHCEJCmxe2AGYxRx4g67s0M5jb+H1jHicgAkHVF0aEsqhROE5CDp1QnQBMZJJ4qnfIYElsxMkZITSuxIDdnAwkkYkVwRxInRqSjoFiEtAkzQZdk0T9jTSGkQGesyaOvKhwy9qKT04lRRWkVF5dV6d5dMrTG7Y2bsszzbVT84hMPFIkWtNBQ2CYBKGwKfZK2jZz0PzrLLhtn/2q7Fm52qddLJGkgekXRROMxcQvjxIVML0AVAwjyY0vgw9AsunEUiGcQI0GdlAKBIQjZ7AsXJEIhBdZGKr0khFES40kJjT5oIk0XPWu0SPJMsGVASQsnDHNGEiAojis//uQxPCAGXW9X81lI8rfLmx9lJqgfb0xiA/T0Oo4WbBNJLUkzy8F6l2SjXWDUUa6+2zXYjmfm1eTrNppj6jPdtAiV5hT7u95yb23Vubbu7m4fu9mfsz/st4AOjI2i11yM4v+1K0e/16PxGiaiWSStlEk+CgI2nIYpIEfd1gQlyCiSBUaYLPphGKA19hbG2syWQwApkwmW0sCI0sC8IYLQukJo/OD8Si0qaSrrjkQzwutIJySwg80cLoDYQJBRSayAr/dK7BBqH6TQ+Ej5qp/YKK8iTDywm0DLo459wMltzA92KeNIPqVFNlsZUk80o9zO0q2WimMcurSh+Wh4xJPlRTvuopZUs77dRRbP01ociIXIFQyhYKNceiIiMLJRUu4WelB4Ui9/7RW77iqzKZ/rZGUwPw2xfkyWgRCRDkgJEqEFDKYYYoegSMINbpckSUYKfFcHnwqNnmhnCkMETRTbK1j1YnJJu2JMDHVXpTk9WvMPOwQqW/X4YKvOmD5bE7sViyc4cYqMkDWSJLZEKPKTkkWtglpodVhLGpbvrSjTrdm//uAxPSAFhGTX+yk0YMBM2q9lhpYdny51ulvJc7KkxnnvUzeYXrIkJpaOGujkzMy8bBVP4ONThA9iRtU6NHV4ptSEpoKB6SwnYyrXp1z/e0Q0zDr9KAH8dm8ACxMxaQkajQ0w1ctPMiIWNBVslrQuQSvR+QvXpEFh2sOWBhLTZqqPysxCzauseewrdLJKMl/OM3tx/dj4eOlSIxdeq9TKiSo4ORK1yLkhYNV2UmRUeGLZ3w1flAscf4SCUdaNSFkrk2INQNQdllSZhhc7M9y5MY4lMt/SGMbqaNinmqNNk6odSU9fedaDDvAUlb4aibBJM65Liq/1Ks7Xm4+PRS/WPKTvVc5iQ3eADnRF9/sP+WLajHX/q5n1c15ucmEjWuNJEQNtZGoCIoxFUwTEfB8S5ABuJqpiC1bUVqN3XQvZ7InMMCCpfBctFQcTkSVpfNVhTRF/RMVoly3ITlRvnI4CEtTRSuXXzV1I1x8vcP/+5DE6AAWLZVX7LDPwyY6aLmmGmG3H2tWPtHTq8riEMPMYVOFkhmLVHHSKtMjhjILVipBYrJJJZGpBxChUqlNi45oxXH56irlPcw4gkofpBTKuhAypHQ7XVzbcShZvVNYxppa2mYv5SYG0yknInREkeZru05Xmtz57oXPxbLMy6yJtAklUqlcBC4tGMS4UCTpOeaeIYHiyWkIk6CiBzCGZJrp1UcOu2A5w+hQDEnEk1pZKSek3Q2Do+Stkm3wczOl549TGygPmGm37TDC77rRKYJxWXokid0gZE1HyXKoUTVqkpwnddIpdNmMJySmrDxjGLPssRB8yhuGypdVJvqKkKoVJYoYxaWhJjY0stT0BM1CKFXFH+S8rreyS1qqSaXSzEqRYianidRjmqxy1U8/23Z49NlmVeu8TSRLhMJAzMoRhrW7nlKKeEOJhksqBiQNOig6WwUmYFjyDiAxRd0UOHFfYFGYuj6zlMpHKaXMsaG39sUz4iK8tLxth0JTxVey9RJYPkqlkSSSeknAEnghOXrbaEp60pnu11r67Q6e3Hn/+5DE8IAXZaND7LERgy43Zn2mJjCetb69b6nK57VruNHz65nvZWuLl1Sqa/LT56SojKiTlJGwRCRRMJMX3LGsarSOHQS5JJjiS0yAVpE48icicSatg+MdGZOJc1I5L73I4852qu9Vs48/t2OB0BB8SxEHRKNMgq6AgaDoiDpUFaFnclt29BESlBC4AA6FuiUHImniopUf/cv/zKxlZ5UOQ4kCBkRe5TKrP9fMrGVSP////X//ZNHKj/WavNaxgoMgOnuRCT1uWAm8ej+PqRYP/StMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+3DE8wAZgacj7DDTwSwm4KQWCJCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq' + ,anchor:0.00117914 + //'Snare 2 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12842_0_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12842_0_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..1abd1810 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12842_0_FluidR3_GM_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_42_0_FluidR3_GM_sf2_file'); +var _drum_42_0_FluidR3_GM_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:42 + ,keyRangeHigh:42 + ,sampleRate:44100 + ,coarseTune:0 + ,fineTune:0 + ,originalPitch:4200 + ,file:'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zvYFtiIDi0v9aZGIbWIWRVe4jOqGWXx6TtTitKRhPekCmTd0k6apRWfMQEsH0roGSzBBmMb/+4DE8IAW5hUZ7KJ8ooUxpD2XyjzoJqTZlpPsgjPNSoJJqSNT31N/ulfa1jpnR//+j0Crb9GLTV1UzLzeSD0TBDUsECrToEMo0mTLTKj2kVWx1sKPCkoLduJFAeV5fss4zdCMsPDexrh3D6E5qeis+b1aL/MjvV2hfe/kZefHpL8Y1CccdsYHtviT9E3gy2kcWW9LVgZ3Wu6QonrEr63j+1WL/QTWju6B0IyTKqf616arzpuqGVC1YnEv/9bv//+UxLiPJbMmeKiYiXia2Z/sDwheVKoqBhwCdzUKcBkP7GZuxZoYBsxzLbhlCuFypepJbGvWgp7XZi3rjvZ2oguef325LJP+FBWyjjcE45rH3RgT/1ymdG4UH2xA0GqOKKFyq1GMNpPp6lp6/VQb1orMlppSlY9npQW9mPoGxm5fAQgvmiJoo3SSdaDLRUikZoGjWRRdKjQNlQcFf/7f//91N2wKDhcnljMdRqurm//7gMTwABVFjSPspjyiPyakfYfKfKmlqooHoUAS4dKCDKPoAFVY2FchqhAUhgbXIfkEvQgkxk1fF1LyLcuWIvrYXZHnYStQ0zCjWlTrhGTqy+u+zRijZkjQFgnw4nOm2Flxr/J1yJQCMk9h7d+is81Y53ChOROtOw50X6Nbfa59O7JL693E/LFzoCwDSMCMydb1P9un//O////8O0xBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//twxP8AFHFLH+yuHIIloeQ9l628VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMTWA8AAAf4AAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV' + ,anchor:0.00106576 + //'Hi-Hat Closed(L) + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12846_0_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12846_0_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..49c29a17 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12846_0_FluidR3_GM_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_46_0_FluidR3_GM_sf2_file'); +var _drum_46_0_FluidR3_GM_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:46 + ,keyRangeHigh:46 + ,sampleRate:44100 + ,coarseTune:0 + ,fineTune:0 + ,originalPitch:4600 + ,file:'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tElscIx1m4lm6OLkEuoFD9sm0dh0ShKMWDE8etKvF57CiYq48I18ZhcgYfVu/lh6PrZsAclJbShDRrDNu1Js02qSxQPRShvbVcS21UprKzTimQkq1f6h7UN2T+h8LToFhNrTLuy3V7N8mAq6SjYwxJWfztSxe6RImn6XJZztHKVZKUNhPV2tk3HY9pN0qs5EpvzWLMWCN88Ve2muL0/t3//7cMT/ABThnx3nmT6iurehMMYO+G/W1PsxwUAJ0422kthCq+T4hCNRNDJZpFKW5uocRImrpazJECRpCs2cYcVbKvUphptNItrUjDwWxwU6Xmw4rKMIJl0PBq5T+0jBGORrKOJNFtfKejiqmpXUo76yRId9qbVoyouqtMTCyb020vwzrEwKkHNfrC0yodQNwK06QUt2zaSh0b/b1lrmdGQyVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUz/+4DE5gAVsaMFQbExihuxIKgUolhBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMTWA8AAAf4AAAAgAAA0gAAABFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQxNYDwAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.00095238 + //'Hi-Hat Half-Open(L) + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12847_21_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12847_21_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..c90d4bc8 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12847_21_FluidR3_GM_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_47_21_FluidR3_GM_sf2_file'); +var _drum_47_21_FluidR3_GM_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:47 + ,keyRangeHigh:47 + ,sampleRate:44100 + ,coarseTune:0 + ,fineTune:0 + ,originalPitch:4700 + ,file:'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hekJE2jRkOM49ElSykjhVZDJNG1JcEHQM5EGKD2tTGcJaLVkftCP6mXGNDtgOPrZDbvLRKVXIGVeCB6lBZw2Wwg6O9PpACa5m4dvJZCShkEamMcdQHCjOoMEcZDRhGglwbVGlACMXyjSJzFy3K7lhlNoerwyyl1RiDQ9QfI4sBWxCD5rb4ok3kVBqHqKMBsHzioeiociwsLB9c6wuUH1sdtwLHDTRZhYY9N06yxQsLX30sHMdfK2qqtc17M1/xNFHaqrfRQs//uAxOyAFUWLMe0kc+q3tCZ9pI60LHSzMzdSKtzXAscxJtRkmnSwNBIGh4CCoiEsSgqEn88W/I8AFcsaEmDlTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVK+lfVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqgUgAA+UmCAAIQIEBPgAAI/wAA0FE9ExCSIrwkFVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1DE7IHUdWUj7WED4BuBIOGTAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQxNgDwDQC/AwAACAGgF+BgAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xDE5QHCcBEDDAjAKCcBIKDzAAVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==' + ,anchor:0.00396825 + //'808 Tom 4 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12848_21_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12848_21_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..c6ab66a5 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12848_21_FluidR3_GM_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_48_21_FluidR3_GM_sf2_file'); +var _drum_48_21_FluidR3_GM_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:48 + ,keyRangeHigh:48 + ,sampleRate:44100 + ,coarseTune:1 + ,fineTune:0 + ,originalPitch:4800 + ,file:'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BNETqJW2LkBKsy9HiFJRQgiqPFzYKUhBUhJ7Wk7ucLQRw86TIFjEm1owVeMUpRitJarQRG/ueP/7gMT1ABZ1oSvu5SPi0zSlvcYaXMfZzP9jb3TJlqxkC4ib3a2ILR2B/yNKudz7sveaf4vdmzUk9dodbrRKd5E4xnp/////6nCr/8m6j//WNszAIByac+7owD0uLDpgoEAUASJAEFiAiEQcYMANTk1f0/FfvgLA2dlQunf0QAFik+Rc+wI2hSOJ0QlwNaHjjBAYHOkitiLis4MClMVNl0oyGBGaImlALJFy79ckwl3I1ZwHkDqRmQOBKZEu8OzUHZiAg5xydH68Gum43S43HINMFoCSSabH7iPMURnNPLZ9g58PdoKj92yo3c3Nd2h71pilOfxcmtJz//////UqMEjKmIh/t7m2zEA4MCTpA4ycLNUUzSTnXNeEKJGKSZaJmkhCVx7WAOI2BEt3mYP4wCXQ3NgbGwoQgqC4GybQYZVtkjTUUICJAMIhURoSI7TANBOLknA6To2SzJjJtskNYpiyzQGRSbQQDgNLoWEA//uQxOyAFoGRL+2k1SLUsiY9tJp0ZZaOj1VC8vN6G9avXV2IxdcKlisWE2Fcctfjtffcs7SbXhnRZpNrfqaCcsjS9Sl4Xl0vkpR/+025usWqo9tvNzZJREzv/////9QgKrcQyrt9K20MBxJAbG4d94CnSRQqDMIBMINLfGZGDJMwQUBBS2qKLus5gldri3hEBoEia5wFQqEwhACGYZLeqFQRcRAiSpIkT0LpLInqoRShirsUKGKwqFRNFVCzUlkTSyJNDAiJlkTKyJE01bIYm/qqAtqJjYYCEw43GaH8ZmNqvVUBX9VKNW1woCqoFAQSDoalg6RDU7WEwVUDQVqHiI8z//////LVTEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVK+4AA6sQ9NP//////////////////6EI0OLVTEFNRTMuOTkuNVVVVVVVVVVVgAAALZVSSSSS/////////////////+tT9ExJEJpsAoAE1hq8iaRME4y00K03oN////////////////0GppuYAoFM//uAxP2AFx2dL+3lI+KiKSR9pI48QU1FMy45OS41VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUBCoAEEYHRKaa1TW/OOqa047OO//////////////+pShJUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+xDE44HANAL8DAAAIGLIIKFACzxVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7EMT2gMOmQQKoAbngjsggoTA3PFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQxOcDxDJBBQOAueAAAD/AAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.00369615 + //'808 Tom 5 + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12849_21_FluidR3_GM_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12849_21_FluidR3_GM_sf2_file.js new file mode 100644 index 00000000..13b68560 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12849_21_FluidR3_GM_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_49_21_FluidR3_GM_sf2_file'); +var _drum_49_21_FluidR3_GM_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:49 + ,keyRangeHigh:49 + ,sampleRate:44100 + ,coarseTune:0 + ,fineTune:0 + ,originalPitch:4900 + ,file:'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OTkuNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7gMTngBVaQRmkmH6ifD8jNBSOtVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//sQxNYDwAAB/gAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU=' + ,anchor:0.24693878 + //'Crsh 1(L) + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/12869_6_JCLive_sf2_file.js b/elements/pl-snap/Snap/libraries/TuneScope/12869_6_JCLive_sf2_file.js new file mode 100644 index 00000000..6af167f4 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/12869_6_JCLive_sf2_file.js @@ -0,0 +1,19 @@ +console.log('load _drum_69_6_JCLive_sf2_file'); +var _drum_69_6_JCLive_sf2_file={ + zones:[ + { + midi:128 + ,loopStart:0 + ,loopEnd:0 + ,keyRangeLow:69 + ,keyRangeHigh:69 + ,sampleRate:44100 + ,coarseTune:0 + ,fineTune:16 + ,originalPitch:7700 + ,file:'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RaPI6TkvGcrXpbUHwXKrLP3KCsPt7WasO2JgfeMvNMN47WDvV714+VSmZZp13Mrssq9HgsDqsGy8d0B8k9vXTnIwTMF2KBGYMr2FNhTJFwOdkP7w3mHM6TJN1wVqpUDnGf/7sMT3AGnaQT3Mse+EZsgm/rLwAJ3GEhh0ttLLzLIyLbepmeFCSCiYnsppMKaYGxCo6uhwVK5KesZDVar1SnVbWj+VsorpmRVMUtGLbBHgqpiOqE5LcPKhgTt2GqAdrU3K6ExYhs1mZgfKJcqVxyrasz7EVkfVgQmvzvY194r6WgwfbG811p9BjTWvisz3Sph8tspKpYpEVhcTQWAQAADxtE3zhIzPhACORzNS7NCkKGCljkSoqiDCqW6s2tVUEL4svR4q4F3iJCNiJQgaFGbq3moCoFNxAVW5wEHjKJlTSn7QSudi47pqsXsrQKhdNFFcrRl9wDCU4UiliMnkzTmxO6/6Zq7YZaUw5OUVUpU+aESliIDHxgLKYAWLIHuhjlxjLpO1H4hcjTwr3WiXemVbldMPkUDS6auPyy59H0a2l7KaJ9pVKWZOFC2Up+Izp8zkGkACqBT5eBfhQB5kHYpMwICSQy4SyUqoDiNS3q1V+rhjKlAXxgpoyt7UxwbdYYWSxFpbsrSch8WvTVh9FzpCLFmYxQSOIMpkLoxGcdp9pt6n2o6lbdat2CHd1DWLosPia12dtZUsiTK6COuO0CHIedm/A8Qbyag+GJVcd6xDDBpa8TYY46UjsQC8EDYT8trVblLcrWaGKf+MSlV2gmpdM5dxq4U2W+f//9bLdapMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//uAxPEALcpBKfmsAEAAAD/DgAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=' + ,anchor:0.01902494 + //'Cabasa + } + ] +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/CHANGELOG.md b/elements/pl-snap/Snap/libraries/TuneScope/CHANGELOG.md new file mode 100644 index 00000000..d53b0992 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/CHANGELOG.md @@ -0,0 +1,26 @@ +# TuneScope Library Update History + +## Added to the Official Snap Extension Library with Snap! 8.0.0 + +### February 2023 +* Fixed issue where `Set Volume` (and `Set Instrument Volume`) wasn't working at 0% +* Added missing Overdriven Guitar and Music Box files +* Fixed `Interval Between` block reporting incorrectly +* Fixed some blocks missing dependencies +* Rearranged blocks in the palette, moved Initialize TuneScope to the top + +### December 2022 +* Added MIDI file conversion to TuneScope. Users can now import MIDI files and convert them to TuneScope track format with the `Import MIDI File` and `Convert MIDI to TuneScope` blocks +* Enabled users to specify note duration in seconds for Track blocks +* Added `Stop MIDI` block for MIDI controller playback +* `Drum Track` can now be played independently of melody tracks +* Fixed bug where clicking `Play MIDI` twice would result in instrument layering +* Updated `webmidi` distribution to latest release +* Fixed issue where the Snap! stop button failed to halt playback of `Play Tracks` blocks +* Added `Note to MIDI` and `MIDI to Note` blocks + +### September 2022 +* Enabled panning for `Play Tone` block via native Snap! balance block +* Changed TuneScope note blocks to account for double accidentals (sharps, flats) +* Added `Current Note` block to report the last played or currently playing note +* Fixed bug where the Vibraphone instrument would not play notes \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/TS_init.js b/elements/pl-snap/Snap/libraries/TuneScope/TS_init.js new file mode 100644 index 00000000..a5e09a18 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/TS_init.js @@ -0,0 +1,533 @@ +// play note function +var AudioContextFunc = window.AudioContext || window.webkitAudioContext; +var audioContext = new AudioContextFunc(); + +// calculate midi pitches and frequencies +var tempMidiPitches = {} +var tempMidiFreqs = {} + +let notes = [ + "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" +] + +for (var i = 0; i <= 127; i++) { + let note = notes[i % 12] + Math.floor((i-12)/12); + tempMidiPitches[note] = i; + tempMidiFreqs[note] = 440 * Math.pow(2, (i - 69)/12) +} + +window._currentNote = "" +window._parsed = "" +window._isParsed = false +window.parent._ts_pausePlayback = false; + +const _ide = world.children[0]; +const original_stop = _ide.stopAllScripts.bind(_ide); +_ide.stopAllScripts = function() { + original_stop(); + window.parent._ts_pausePlayback = true; +} + +const _convertToSharp = (note) => { + const splitByFlat = note.split("b"); + if (splitByFlat.length < 2) return note; // does not include a flat + + const letter = splitByFlat[0]; + const number = splitByFlat[1]; + + const indexOfLetter = notes.indexOf(letter); + if (indexOfLetter === -1) return note; // TODO: handle this error + let previousSharp; + if (indexOfLetter === 0) { + previousSharp = notes[notes.length - 1]; + } else { + previousSharp = notes[indexOfLetter - 1]; + } + return previousSharp + number; +} +window.parent.midiPitches = tempMidiPitches; +window.parent.midiFreqs = tempMidiFreqs; + + +window.playNote = (note, noteLength, instrumentName, volume) => { + window._currentNote = note + if (note == "R" || note == "r") return; + + note = _convertToSharp(note); + + var player=new WebAudioFontPlayer(); + instrumentName = instrumentName || window.parent.currentInstrumentName; + instrumentName = instrumentName.toLowerCase() + // console.log(instrumentName); + let currentInstrumentData = window.parent.instrumentData[instrumentName] + player.loader.decodeAfterLoading(audioContext, currentInstrumentData.name); + function play(){ + const vol = volume || window.parent.instrumentVolumes[instrumentName] || window.parent.globalInstrumentVolume; + console.log(note, noteLength, instrumentName, vol) + player.queueWaveTable(audioContext, audioContext.destination + , window[currentInstrumentData.name], 0, window.parent.midiPitches[note], noteLength, vol + ); + return false; + } + play(); +} + +window.timeSignatureToBeatsPerMeasure = { + "4/4": [4,1], // 4 beats per measure, Quarter note gets the beat + "3/4": [3,1], + "5/4": [5,1], + "7/4": [7,1], + "6/8": [6,0.5], // 6 beats per measure, Eighth note gets the beat + "9/8": [9,0.5], + "12/8": [12,0.5] +} + +window.baseTempo = 60; + +// converts note lengths (quarter, half, whole) +// to corresponding time value (1, 2, 4) +window.noteLengthToTimeValue = { + "dotted whole": 6, + "whole": 4, + "dotted half": 3, + "half": 2, + "dotted quarter": 1.5, + "quarter": 1, + "dotted eighth": 0.75, + "eighth": 0.5, + "dotted sixteenth": 0.375, + "sixteenth": 0.25, + "dotted thirtysecond": 0.1875, + "thirtysecond": 0.125, + "whole triplet": 2.667, + "half triplet": 1.333, + "quarter triplet": 0.667, + "eighth triplet": 0.333, + "sixteenth triplet": 0.167, + "thirtysecond triplet": 0.0417 +} + +// instrument data +window.parent.instrumentData = { + "accordion": { + path: "https://surikov.github.io/webaudiofontdata/sound/0230_Aspirin_sf2_file.js", + name: "_tone_0230_Aspirin_sf2_file" + }, + "bass, acoustic": { + path: "https://surikov.github.io/webaudiofontdata/sound/0320_GeneralUserGS_sf2_file.js", + name: "_tone_0320_GeneralUserGS_sf2_file" + }, + "bass, electric (finger)": { + path: "https://surikov.github.io/webaudiofontdata/sound/0350_JCLive_sf2_file.js", + name: "_tone_0350_JCLive_sf2_file" + }, + "guitar, acoustic": { + path: "https://surikov.github.io/webaudiofontdata/sound/0241_JCLive_sf2_file.js", + name: "_tone_0241_JCLive_sf2_file" + }, + "guitar, electric": { + path: "https://surikov.github.io/webaudiofontdata/sound/0260_JCLive_sf2_file.js", + name: "_tone_0260_JCLive_sf2_file" + }, + "guitar, overdrive": { + path: "https://surikov.github.io/webaudiofontdata/sound/0291_LesPaul_sf2_file.js", + name: "_tone_0291_LesPaul_sf2_file" + }, + "piano": { + path: "https://surikov.github.io/webaudiofontdata/sound/0020_JCLive_sf2_file.js", + name: "_tone_0020_JCLive_sf2_file" + }, + "organ": { + path: "https://surikov.github.io/webaudiofontdata/sound/0180_Chaos_sf2_file.js", + name: "_tone_0180_Chaos_sf2_file" + }, + "banjo": { + path: "https://surikov.github.io/webaudiofontdata/sound/1050_FluidR3_GM_sf2_file.js", + name: "_tone_1050_FluidR3_GM_sf2_file" + }, + "saxophone": { + path: "https://surikov.github.io/webaudiofontdata/sound/0650_FluidR3_GM_sf2_file.js", + name: "_tone_0650_FluidR3_GM_sf2_file" + }, + "shakuhachi": { + path: "https://surikov.github.io/webaudiofontdata/sound/0770_SBLive_sf2.js", + name: "_tone_0770_SBLive_sf2" + }, + "sitar": { + path: "https://surikov.github.io/webaudiofontdata/sound/1040_Aspirin_sf2_file.js", + name: "_tone_1040_Aspirin_sf2_file" + }, + "bassoon": { + path: "https://surikov.github.io/webaudiofontdata/sound/0700_FluidR3_GM_sf2_file.js", + name: "_tone_0700_FluidR3_GM_sf2_file" + }, + "bass": { + path: "https://surikov.github.io/webaudiofontdata/sound/0350_JCLive_sf2_file.js", + name: "_tone_0350_JCLive_sf2_file" + }, + "violin": { + path: "https://surikov.github.io/webaudiofontdata/sound/0400_JCLive_sf2_file.js", + name: "_tone_0400_JCLive_sf2_file" + }, + "cello": { + path: "https://surikov.github.io/webaudiofontdata/sound/0420_JCLive_sf2_file.js", + name: "_tone_0420_JCLive_sf2_file" + }, + "clarinet": { + path: "https://surikov.github.io/webaudiofontdata/sound/0710_Chaos_sf2_file.js", + name: "_tone_0710_Chaos_sf2_file" + }, + "flute": { + path: "https://surikov.github.io/webaudiofontdata/sound/0730_JCLive_sf2_file.js", + name: "_tone_0730_JCLive_sf2_file" + }, + "french horn": { + path: "https://surikov.github.io/webaudiofontdata/sound/0600_GeneralUserGS_sf2_file.js", + name: "_tone_0600_GeneralUserGS_sf2_file" + }, + "harp": { + path: "https://surikov.github.io/webaudiofontdata/sound/0460_GeneralUserGS_sf2_file.js", + name: "_tone_0460_GeneralUserGS_sf2_file" + }, + "koto": { + path: "https://surikov.github.io/webaudiofontdata/sound/1070_FluidR3_GM_sf2_file.js", + name: "_tone_1070_FluidR3_GM_sf2_file" + }, + "marimba": { + path: "https://surikov.github.io/webaudiofontdata/sound/0121_FluidR3_GM_sf2_file.js", + name: "_tone_0121_FluidR3_GM_sf2_file" + }, + "music box": { + path: "https://surikov.github.io/webaudiofontdata/sound/0100_SBLive_sf2.js", + name: "_tone_0100_SBLive_sf2" + }, + "oboe": { + path: "https://surikov.github.io/webaudiofontdata/sound/0680_JCLive_sf2_file.js", + name: "_tone_0680_JCLive_sf2_file" + }, + "trumpet": { + path: "https://surikov.github.io/webaudiofontdata/sound/0560_GeneralUserGS_sf2_file.js", + name: "_tone_0560_GeneralUserGS_sf2_file" + }, + "tuba": { + path: "https://surikov.github.io/webaudiofontdata/sound/0580_GeneralUserGS_sf2_file.js", + name: "_tone_0580_GeneralUserGS_sf2_file" + }, + "vibraphone": { + path: "https://surikov.github.io/webaudiofontdata/sound/0110_GeneralUserGS_sf2_file.js", + name: "_tone_0110_GeneralUserGS_sf2_file" + }, + + // drums + + "cabasa": { + path: "https://surikov.github.io/webaudiofontdata/sound/12869_6_JCLive_sf2_file.js", + name: "_drum_69_6_JCLive_sf2_file" + }, + "snare drum": { + path: "https://surikov.github.io/webaudiofontdata/sound/12840_6_JCLive_sf2_file.js", + name: "_drum_40_6_JCLive_sf2_file" + }, + "bass drum": { + path: "https://surikov.github.io/webaudiofontdata/sound/12835_21_FluidR3_GM_sf2_file.js", + name: "_drum_35_21_FluidR3_GM_sf2_file" + }, + "closed hi-hat": { + path: "https://surikov.github.io/webaudiofontdata/sound/12842_0_FluidR3_GM_sf2_file.js", + name: "_drum_42_0_FluidR3_GM_sf2_file" + }, + "open hi-hat": { + path: "https://surikov.github.io/webaudiofontdata/sound/12846_0_FluidR3_GM_sf2_file.js", + name: "_drum_46_0_FluidR3_GM_sf2_file" + }, + "mid tom": { + path: "https://surikov.github.io/webaudiofontdata/sound/12847_21_FluidR3_GM_sf2_file.js", + name: "_drum_47_21_FluidR3_GM_sf2_file" + }, + "high tom": { + path: "https://surikov.github.io/webaudiofontdata/sound/12848_21_FluidR3_GM_sf2_file.js", + name: "_drum_48_21_FluidR3_GM_sf2_file" + }, + "crash cymbal": { + path: "https://surikov.github.io/webaudiofontdata/sound/12849_21_FluidR3_GM_sf2_file.js", + name: "_drum_49_21_FluidR3_GM_sf2_file" + }, +} + +// load all instruments +let instrumentNames = Object.keys(window.parent.instrumentData); +window.parent.currentInstrumentName = "piano"; + +// initialize volumes +window.parent.instrumentVolumes = {} +window.parent.globalInstrumentVolume = 0.5; + +// tones +class _Tone { + constructor(id) { + this.id = id; + this.on = false; + + //const pannerNode = new StereoPannerNode(audioContext, -1); + const thisPlayer = new Object; + thisPlayer.context = new AudioContext(); + thisPlayer.oscillator = thisPlayer.context.createOscillator(); + thisPlayer.panner = thisPlayer.context.createStereoPanner(); + thisPlayer.gainobj = thisPlayer.context.createGain(); + thisPlayer.oscillator.frequency.value = 100; + thisPlayer.panner.pan.value = 0; + thisPlayer.gainobj.gain.value = 1; + thisPlayer.oscillator.connect(thisPlayer.panner); + thisPlayer.panner.connect(thisPlayer.gainobj); + thisPlayer.gainobj.connect(thisPlayer.context.destination); + + this.player = thisPlayer; + } + + dBFS2gain = (dbfs) => { + //return Math.pow(10, dbfs / 20); + return (dbfs / 100).toFixed(2); + } + + setFreq = (freq) => { + this.freq = freq; + this.player.oscillator.frequency.value = Math.max(freq, 0); + } + + setAmpl = (ampl) => { + this.ampl = ampl; + this.player.gainobj.gain.value = this.dBFS2gain(parseInt(ampl)); + } + + setPan = (pan) => { + this.pan = Math.min(Math.max(pan, -100), 100); + this.player.panner.pan.setValueAtTime(this.pan / 100, this.player.context.currentTime); + } + + turnOn = () => { + console.log("on"); + if (this.on) return; + console.log("turning on"); + if (!this.started) { + this.player.oscillator.start(0); + this.started = true; + } else { + this.player.context.resume(); + } + this.on = true; + } + + turnOff = () => { + console.log("off"); + if (!this.on) return; + console.log("turning off"); + this.player.context.suspend(); + this.on = false; + } + +} +window._Tone = _Tone; +window.tones = {}; + +/* Auxillary Functions */ +// repeats an array n times +// similar to [1,2,3] * 2 = [1,2,3,1,2,3] in Python +window.multiplyArray = (arr, length) => + Array.from({ length }, () => arr).flat() + + +/* +Queue.js +A function to represent a queue +Created by Kate Morley - http://code.iamkate.com/ - and released under the terms +of the CC0 1.0 Universal legal code: +http://creativecommons.org/publicdomain/zero/1.0/legalcode +*/ + +/** + * Creates a new queue. A queue is a first-in-first-out (FIFO) data structure - + * items are added to the end of the queue and removed from the front. + */ +function Queue() { + + // initialise the queue and offset + var queue = []; + var offset = 0; + + // Returns the length of the queue. + this.getLength = function () { + return (queue.length - offset); + } + + // Returns true if the queue is empty, and false otherwise. + this.isEmpty = function () { + return (queue.length === 0); + } + + /* Enqueues the specified item. The parameter is: + * + * item - the item to enqueue + */ + this.enqueue = function (item) { + queue.push(item); + } + + /* Dequeues an item and returns it. If the queue is empty, the value + * 'undefined' is returned. + */ + this.dequeue = function () { + + // if the queue is empty, return immediately + if (queue.length === 0) return undefined; + + // store the item at the front of the queue + var item = queue[offset]; + + // increment the offset and remove the free space if necessary + if (++offset * 2 >= queue.length) { + queue = queue.slice(offset); + offset = 0; + } + + // return the dequeued item + return item; + + } + + /* Returns the item at the front of the queue (without dequeuing it). If the + * queue is empty then undefined is returned. + */ + this.peek = function () { + return (queue.length > 0 ? queue[offset] : undefined); + } + +} +window.Queue = Queue; + +/** + * Converts all elements in a nested array (2D, 3D, etc) to lowercase + * @param {*} arr + */ +function toLowerCaseRecursive(array) { + //check for arrays and recurse + if (Array.isArray(array)) { + for (var i = 0; i < array.length; i++) { + array[i] = toLowerCaseRecursive(array[i]); + } + return array; + } + //check for string vs non-strings + if (typeof array === "string") { + if (!hasNumber(array)) { //contains no numbers, so it isn't a note value + return array.toLowerCase(); + } else { //case with note values, which contain numbers + //capitalize the first character in the string + return array[0].toUpperCase() + array.slice(1); + } + } else { + return array; + } +} +window.toLowerCaseRecursive = toLowerCaseRecursive; + +function convertListToArrayRecursive(list) { + let temp = [] + // need to do more testing for chords and nested lists + if (!(list.contents === undefined)) { + for (var i = 0; i < list.contents.length; i++) { + temp[i] = convertListToArrayRecursive(list.contents[i]); + } + return temp; + } else { + return list; + } +} +window.convertListToArrayRecursive = convertListToArrayRecursive; + +const convertArrayToListRecursive = (array) => { + if (Array.isArray(array)) { + for (var i = 0; i < array.length; i++) { + array[i] = convertArrayToListRecursive(array[i]); + } + return IDE_Morph.prototype.newList(array); + } + return array; +} +window.convertArrayToListRecursive = convertArrayToListRecursive; + +function _typeOf(value) { + return Object.prototype.toString.call(value).slice(8, -1); +} + +const _isObject = (obj) => { + return (typeof obj === "object" || _typeOf(obj) === "Array") && obj !== null; +} + +const _objToArray = (obj) => { + return Object.keys(obj).map((key) => { + return [key, _isObject(obj[key]) ? + _objToArray(obj[key]) : + obj[key] + ]; + }); +} +window._objToArray = _objToArray; + +function isNumber(myString) { + return /^\d+\.\d+$/.test(myString); +} +window.isNumber = isNumber; + +function hasNumber(myString) { + return /\d/.test(myString); +} +window.hasNumber = hasNumber; + +function deep_copy(array) { + return JSON.parse(JSON.stringify(array)); +} +window.deep_copy = deep_copy; + +/** + * Select file(s). + * @param {String} contentType The content type of files you wish to select. For instance, use "image/*" to select all types of images. + * @param {Boolean} multiple Indicates if the user can select multiple files. + * @returns {Promise} A promise of a file or array of files in case the multiple parameter is true. + */ +function _selectFile(contentType, multiple) { + return new Promise(resolve => { + let input = document.createElement('input'); + input.type = 'file'; + input.multiple = multiple; + input.accept = contentType; + + input.onchange = () => { + let files = Array.from(input.files); + if (multiple) + resolve(files); + else + resolve(files[0]); + }; + + input.click(); + }); +} +window._selectFile = _selectFile; + +// play dummy sound to initialize + +setTimeout(() => { + console.log("playing initialization sound") + for (let i = 0; i < instrumentNames.length; i++) { + let instrumentName = instrumentNames[i]; + if (instrumentName === "shakuhachi") return; + window.playNote("C4", 1, instrumentName, 0); + } +}, 1000 * 3); + +// set loaded to true + +setTimeout(() => { + console.log("TuneScope Loaded") + window.parent.loadedTuneScope = true; +}, 1000 * 4) diff --git a/elements/pl-snap/Snap/libraries/TuneScope/TuneScope.js b/elements/pl-snap/Snap/libraries/TuneScope/TuneScope.js new file mode 100644 index 00000000..2b11eaf7 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/TuneScope.js @@ -0,0 +1,372 @@ +SnapExtensions.primitives.set( + 'ts_setinst(name)', + function (name) { + window.parent.currentInstrumentName = name.toLowerCase(); + } +); + +SnapExtensions.primitives.set( + 'ts_setvol(percent)', + function (percent) { + let adjusted_percent = (percent === 0) ? 0.0001: percent; + window.parent.globalInstrumentVolume = adjusted_percent/100.0; + } +); + +SnapExtensions.primitives.set( + 'ts_setinstvol(name, percent)', + function (name, percent) { + name = name.toLowerCase(); + let adjusted_percent = (percent === 0) ? 0.0001: percent; + window.parent.instrumentVolumes[name] = adjusted_percent/100.0; + } +); + +SnapExtensions.primitives.set( + 'ts_playnote(note, duration)', + function (note, noteLength) { + window.playNote(note, noteLength); + } +); + +SnapExtensions.primitives.set( + 'ts_getcurrentnote()', + function () { + return window._currentNote + } +) + +SnapExtensions.primitives.set( + 'ts_parsemidifile()', + function () { + const getMidiFile = async () => { + window._parsed = ""; + fileMidi = await window._selectFile(".mid", false); + const arrayBuffer = await fileMidi.arrayBuffer() + const _parsedMidi = await new window.Midi(arrayBuffer) + window._parsed = _parsedMidi.toJSON(); + world.children[0].broadcast("ts_file_input_received") + } + getMidiFile(); + } +) + +SnapExtensions.primitives.set( + 'ts_getparsed()', + function() { + world.children[0].broadcast("ts_no_file_upload") + let temp = window._objToArray(window._parsed); + temp = window.convertArrayToListRecursive(temp); + return temp; + } +); + +SnapExtensions.primitives.set( + 'ts_playtracks(tracklist, timesignature)', + function (tracksList, timeSignature, tempo) { + window.parent._ts_pausePlayback = false; + const multiplyArray = (arr, length) => + Array.from({ length }, () => arr).flat() + + const wait = (duration) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve(); + }, duration) + }) + } + + const playTrackMeasure = async (currTrack, measureIndex, beatsPerMeasure, tempo, instrument) => { + var elapsedMeasureTime = 0; + const timeEndIndex = beatsPerMeasure[0] * (window.baseTempo / tempo); + + /** + * We can calculate in seconds how long the measure lasts in seconds and then simply calculate when we are past the elapsed time in seconds and this is how we synchronize measures + */ + while (elapsedMeasureTime < timeEndIndex) { + if(window.parent._ts_pausePlayback) break; + const note = currTrack[measureIndex][0]; + const noteLength = currTrack[measureIndex][1]; + measureIndex++; //increment for the next index in the track + + // play the note and wait + await window.playNote(note, noteLength, instrument); + await wait(noteLength * 1000) + + // we increment i with respect to the number of beats the current note occupies in a measure + elapsedMeasureTime += noteLength; + } + + } + + const playTracks = async (tracksList, timeSignature, tempo) => { + // verify inputs + if (!tracksList.contents) return; + + const beatsPerMeasure = window.timeSignatureToBeatsPerMeasure[timeSignature]; + + var tracks = window.convertListToArrayRecursive(tracksList); + + // convert all elements in the track to lowercase + tracks = window.toLowerCaseRecursive(tracks); + + // check to make sure we have an actual melody/chord track rather than just a loop + // this ensures that we have a definitive track length + let haveSetTrackLength = false + let definitiveTrackIndex = 0 //index of valid melody/chord track + + // check to make sure we have an actual melody/chord track rather than just a loop + // this ensures that we have a deinitive track length + for (let i = 0; i < tracks.length; i++) { + let currTrack = tracks[i]; + if (currTrack[0][0] === "melody" || currTrack[0][0] === "chords") { + definitiveTrackIndex = i; + haveSetTrackLength = true; + break; + } + } + + + if (!haveSetTrackLength) { + console.error("No Melody or Chord track provided, only Chord/Drum Loop") + return; + } + + /* + first, add up all the note values in the track + to determine the total number of beats + then, calculate the number of measures by considering the time signature + and the total number of beats in the track list + */ + + // converts the strings of note length in each track to their respective duration values + for (let i = 0; i < tracks.length; i++) { + let currTrack = tracks[i]; + for (let j = 1; j < currTrack.length; j++) { //index from 1 to avoid the header + //Reassign the durations list to duration in seconds + //jth (Note, Duration) pair + if (!window.isNumber(currTrack[j][1])) { + currTrack[j][1] = window.noteLengthToTimeValue[currTrack[j][1]] * (window.baseTempo / tempo); + console.log("the number is " + currTrack[j][1]); + } else { + currTrack[j][1] = parseFloat(currTrack[j][1]); + console.log("the number is " + currTrack[j][1]); + } + } + } + + var totalSeconds = 0.0; + var defTrack = tracks[definitiveTrackIndex]; + for (let j = 1; j < defTrack.length; j++) { + totalSeconds += defTrack[j][1]; + } + const secondsPerMeasure = (window.baseTempo / tempo) * beatsPerMeasure[0] + const totalMeasures = Math.ceil(totalSeconds / secondsPerMeasure) + + //convert any melody/chord/drum loop to a regular track + // done by repeatedly appending the array to itself + for (let i = 0; i < tracks.length; i++) { + let currTrack = tracks[i]; + //check if the current track is a loop + if (currTrack[0][0] === "loop-melody" || currTrack[0][0] === "loop-chords") { + let secondsInLoop = 0; + for (let j = 1; j < currTrack.length; j++) { + secondsInLoop += parseFloat(currTrack[j][1]); + } + let loopCount = parseInt(totalSeconds / secondsInLoop); + + //appending the track to itself + //we don't repeat the header + let header = currTrack[0]; + let newTrack = multiplyArray(currTrack.slice(1), loopCount); + newTrack.unshift(header) + + if (header[0] === "loop-chords") { + newTrack[0][0] = "chords"; + } else { + newTrack[0][0] = "melody"; + } + + //push the multiplied track to the tracks list + //and remove the original loop + tracks.push(newTrack) + tracks.splice(i,1) + i--; + } + } + + + for (let i = 0; i < tracks.length; i++) { + let currTrack = tracks[i]; + //find which elements of the track list are embedded chords + if (currTrack[0][0] === "chords") { + let chordInstrument = currTrack[0][1]; + let maxChordLen = 0; + for (let j = 1; j < currTrack.length; j++) { + // iterate through each chord in the track to find the largest chord (most # of notes) + maxChordLen = Math.max(maxChordLen, currTrack[j][0].length); + } + + //splits the notes of chords into separate tracks + for(let k = 0; k < maxChordLen; k++) { + // the new track will have the same instrument, but be encoded as a melody line + let newTrack = [["melody", chordInstrument]]; + for (let j = 1; j < currTrack.length; j++) { + let currChord = currTrack[j][0]; + // if the chord is large enough, add the kth note of the chord to the melody line + //otherwise, the melody will rest for that note in the track + if (k < currChord.length) { + // kth note of the chord, keep the duration of the chord + newTrack.push([currChord[k], currTrack[j][1]]); + }else { + newTrack.push(["r", currTrack[j][1]]); + + } + } + //add this new track to the overarching tracklist + tracks.push(newTrack); + } + // delete original chord track from tracks + tracks.splice(i, 1); + i--; + } + } + + + // Play Measures track by track + for (let i = 0; i < totalMeasures; i++) { + if(window.parent._ts_pausePlayback) break; + console.log("Playing measure " + (i + 1)); + const measureResults = []; + + // count for the number of beats that have passed since the last measure + // e.g. in 4/4, measure 3 will have 2*4 = 8 beats elapsed. Next measure starts + // on beat 8 (0 indexed) + let elapsedTime = i * (window.baseTempo / tempo) * beatsPerMeasure[0]; + + //per track + for (let j = 0; j < tracks.length; j++) { + let currTrack = tracks[j]; + let instrument = currTrack[0][1]; + let measureIndex = 0; + let elapsedSum = 0; + + // identifying where in the track array to begin the measure + // since different tracks have different array lengths, but + // the same amount of beats, they will align at each measure + // beat-wise, but have different starting indices measure-wise + for (let k = 1; k < currTrack.length; k++) { + if (elapsedSum >= elapsedTime) { + measureIndex = k; + break; + } else { + // add the value of the kth duration + elapsedSum += currTrack[k][1]; + } + } + + measureResults.push(new Promise((resolve, reject) => { + playTrackMeasure(currTrack, measureIndex, beatsPerMeasure, tempo, instrument).then(() => { + resolve(); + }).catch((err) => { + reject(err); + }) + })); + } + await Promise.all(measureResults); + } + } + + playTracks(tracksList, timeSignature, tempo); + } +); + +SnapExtensions.primitives.set( + 'ts_playMIDI(controller, instrument)', + function (controller_name, instrument_name) { + + function onEnabled(controller, instrument) { + let synth = window.WebMidi.getInputByName(controller); + let keyboard = synth.channels[1]; + //remove any existing listeners + keyboard.removeListener("noteon") + + // Listener for the keyboard, prints midi note number + keyboard.addListener("noteon", e => { + window.playNote(e.note.identifier, 0.5, instrument); + }); + } + + const playMidiController = async (controller, instrument) => { + if(controller === null || controller === "") return; + + //enables the webmidi controller, doesn't record notes + window.WebMidi.enable((err) => { + if (err) { + alert(err); + } else { + onEnabled(controller, instrument); + } + }); + } + + playMidiController(controller_name, instrument_name); + } +); + +SnapExtensions.primitives.set( + 'ts_stopMIDI()', + function() { + window.WebMidi.disable(); + } +) + +SnapExtensions.primitives.set( + 'ts_settone(id, frequency, amplitude, balance)', + function (id, freq, ampl, bal) { + var created = false; + if (!window.tones[id]) { + window.tones[id] = new window._Tone(id); + created = true; + } + + window.tones[id].setFreq(freq); + window.tones[id].setAmpl(ampl * 100); + window.tones[id].setPan(bal); + window.tones[id].turnOn(); + } +); + +SnapExtensions.primitives.set( + 'ts_turntoneon(id, bool)', + function (id, on) { + if (!window.tones[id]) { + return; + } + + if (on) { + window.tones[id].turnOn(); + } else { + window.tones[id].turnOff(); + } + } +); + +SnapExtensions.primitives.set( + 'ts_stoptones()', + function () { + const vals = Object.values(window.tones); + + for (let i = 0; i < vals.length; i++) { + const currTone = vals[i]; + currTone.turnOff(); + } + } +); + +SnapExtensions.primitives.set( + 'ts_loaded()', + function () { + return window.parent.loadedTuneScope === true; + } +); diff --git a/elements/pl-snap/Snap/libraries/TuneScope/WebAudioFontPlayer.js b/elements/pl-snap/Snap/libraries/TuneScope/WebAudioFontPlayer.js new file mode 100644 index 00000000..d9feb11d --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/WebAudioFontPlayer.js @@ -0,0 +1,1222 @@ +'use strict'; +var WebAudioFontChannel = /** @class */ (function () { + function WebAudioFontChannel(audioContext) { + this.audioContext = audioContext; + this.input = audioContext.createGain(); + this.band32 = this.bandEqualizer(this.input, 32); + this.band64 = this.bandEqualizer(this.band32, 64); + this.band128 = this.bandEqualizer(this.band64, 128); + this.band256 = this.bandEqualizer(this.band128, 256); + this.band512 = this.bandEqualizer(this.band256, 512); + this.band1k = this.bandEqualizer(this.band512, 1024); + this.band2k = this.bandEqualizer(this.band1k, 2048); + this.band4k = this.bandEqualizer(this.band2k, 4096); + this.band8k = this.bandEqualizer(this.band4k, 8192); + this.band16k = this.bandEqualizer(this.band8k, 16384); + this.output = audioContext.createGain(); + this.band16k.connect(this.output); + } + WebAudioFontChannel.prototype.bandEqualizer = function (from, frequency) { + var filter = this.audioContext.createBiquadFilter(); + filter.frequency.setTargetAtTime(frequency, 0, 0.0001); + filter.type = "peaking"; + filter.gain.setTargetAtTime(0, 0, 0.0001); + filter.Q.setTargetAtTime(1.0, 0, 0.0001); + from.connect(filter); + return filter; + }; + ; + return WebAudioFontChannel; +}()); +var WebAudioFontLoader = /** @class */ (function () { + function WebAudioFontLoader(player) { + this.cached = []; + this.instrumentKeyArray = []; + this.instrumentNamesArray = []; + this.choosenInfos = []; + this.drumNamesArray = []; + this.drumKeyArray = []; + this.instrumentTitles = function () { + if (this.instrumentNamesArray.length == 0) { + var insNames = []; + insNames[0] = "Acoustic Grand Piano: Piano"; + insNames[1] = "Bright Acoustic Piano: Piano"; + insNames[2] = "Electric Grand Piano: Piano"; + insNames[3] = "Honky-tonk Piano: Piano"; + insNames[4] = "Electric Piano 1: Piano"; + insNames[5] = "Electric Piano 2: Piano"; + insNames[6] = "Harpsichord: Piano"; + insNames[7] = "Clavinet: Piano"; + insNames[8] = "Celesta: Chromatic Percussion"; + insNames[9] = "Glockenspiel: Chromatic Percussion"; + insNames[10] = "Music Box: Chromatic Percussion"; + insNames[11] = "Vibraphone: Chromatic Percussion"; + insNames[12] = "Marimba: Chromatic Percussion"; + insNames[13] = "Xylophone: Chromatic Percussion"; + insNames[14] = "Tubular Bells: Chromatic Percussion"; + insNames[15] = "Dulcimer: Chromatic Percussion"; + insNames[16] = "Drawbar Organ: Organ"; + insNames[17] = "Percussive Organ: Organ"; + insNames[18] = "Rock Organ: Organ"; + insNames[19] = "Church Organ: Organ"; + insNames[20] = "Reed Organ: Organ"; + insNames[21] = "Accordion: Organ"; + insNames[22] = "Harmonica: Organ"; + insNames[23] = "Tango Accordion: Organ"; + insNames[24] = "Acoustic Guitar (nylon): Guitar"; + insNames[25] = "Acoustic Guitar (steel): Guitar"; + insNames[26] = "Electric Guitar (jazz): Guitar"; + insNames[27] = "Electric Guitar (clean): Guitar"; + insNames[28] = "Electric Guitar (muted): Guitar"; + insNames[29] = "Overdriven Guitar: Guitar"; + insNames[30] = "Distortion Guitar: Guitar"; + insNames[31] = "Guitar Harmonics: Guitar"; + insNames[32] = "Acoustic Bass: Bass"; + insNames[33] = "Electric Bass (finger): Bass"; + insNames[34] = "Electric Bass (pick): Bass"; + insNames[35] = "Fretless Bass: Bass"; + insNames[36] = "Slap Bass 1: Bass"; + insNames[37] = "Slap Bass 2: Bass"; + insNames[38] = "Synth Bass 1: Bass"; + insNames[39] = "Synth Bass 2: Bass"; + insNames[40] = "Violin: Strings"; + insNames[41] = "Viola: Strings"; + insNames[42] = "Cello: Strings"; + insNames[43] = "Contrabass: Strings"; + insNames[44] = "Tremolo Strings: Strings"; + insNames[45] = "Pizzicato Strings: Strings"; + insNames[46] = "Orchestral Harp: Strings"; + insNames[47] = "Timpani: Strings"; + insNames[48] = "String Ensemble 1: Ensemble"; + insNames[49] = "String Ensemble 2: Ensemble"; + insNames[50] = "Synth Strings 1: Ensemble"; + insNames[51] = "Synth Strings 2: Ensemble"; + insNames[52] = "Choir Aahs: Ensemble"; + insNames[53] = "Voice Oohs: Ensemble"; + insNames[54] = "Synth Choir: Ensemble"; + insNames[55] = "Orchestra Hit: Ensemble"; + insNames[56] = "Trumpet: Brass"; + insNames[57] = "Trombone: Brass"; + insNames[58] = "Tuba: Brass"; + insNames[59] = "Muted Trumpet: Brass"; + insNames[60] = "French Horn: Brass"; + insNames[61] = "Brass Section: Brass"; + insNames[62] = "Synth Brass 1: Brass"; + insNames[63] = "Synth Brass 2: Brass"; + insNames[64] = "Soprano Sax: Reed"; + insNames[65] = "Alto Sax: Reed"; + insNames[66] = "Tenor Sax: Reed"; + insNames[67] = "Baritone Sax: Reed"; + insNames[68] = "Oboe: Reed"; + insNames[69] = "English Horn: Reed"; + insNames[70] = "Bassoon: Reed"; + insNames[71] = "Clarinet: Reed"; + insNames[72] = "Piccolo: Pipe"; + insNames[73] = "Flute: Pipe"; + insNames[74] = "Recorder: Pipe"; + insNames[75] = "Pan Flute: Pipe"; + insNames[76] = "Blown bottle: Pipe"; + insNames[77] = "Shakuhachi: Pipe"; + insNames[78] = "Whistle: Pipe"; + insNames[79] = "Ocarina: Pipe"; + insNames[80] = "Lead 1 (square): Synth Lead"; + insNames[81] = "Lead 2 (sawtooth): Synth Lead"; + insNames[82] = "Lead 3 (calliope): Synth Lead"; + insNames[83] = "Lead 4 (chiff): Synth Lead"; + insNames[84] = "Lead 5 (charang): Synth Lead"; + insNames[85] = "Lead 6 (voice): Synth Lead"; + insNames[86] = "Lead 7 (fifths): Synth Lead"; + insNames[87] = "Lead 8 (bass + lead): Synth Lead"; + insNames[88] = "Pad 1 (new age): Synth Pad"; + insNames[89] = "Pad 2 (warm): Synth Pad"; + insNames[90] = "Pad 3 (polysynth): Synth Pad"; + insNames[91] = "Pad 4 (choir): Synth Pad"; + insNames[92] = "Pad 5 (bowed): Synth Pad"; + insNames[93] = "Pad 6 (metallic): Synth Pad"; + insNames[94] = "Pad 7 (halo): Synth Pad"; + insNames[95] = "Pad 8 (sweep): Synth Pad"; + insNames[96] = "FX 1 (rain): Synth Effects"; + insNames[97] = "FX 2 (soundtrack): Synth Effects"; + insNames[98] = "FX 3 (crystal): Synth Effects"; + insNames[99] = "FX 4 (atmosphere): Synth Effects"; + insNames[100] = "FX 5 (brightness): Synth Effects"; + insNames[101] = "FX 6 (goblins): Synth Effects"; + insNames[102] = "FX 7 (echoes): Synth Effects"; + insNames[103] = "FX 8 (sci-fi): Synth Effects"; + insNames[104] = "Sitar: Ethnic"; + insNames[105] = "Banjo: Ethnic"; + insNames[106] = "Shamisen: Ethnic"; + insNames[107] = "Koto: Ethnic"; + insNames[108] = "Kalimba: Ethnic"; + insNames[109] = "Bagpipe: Ethnic"; + insNames[110] = "Fiddle: Ethnic"; + insNames[111] = "Shanai: Ethnic"; + insNames[112] = "Tinkle Bell: Percussive"; + insNames[113] = "Agogo: Percussive"; + insNames[114] = "Steel Drums: Percussive"; + insNames[115] = "Woodblock: Percussive"; + insNames[116] = "Taiko Drum: Percussive"; + insNames[117] = "Melodic Tom: Percussive"; + insNames[118] = "Synth Drum: Percussive"; + insNames[119] = "Reverse Cymbal: Percussive"; + insNames[120] = "Guitar Fret Noise: Sound effects"; + insNames[121] = "Breath Noise: Sound effects"; + insNames[122] = "Seashore: Sound effects"; + insNames[123] = "Bird Tweet: Sound effects"; + insNames[124] = "Telephone Ring: Sound effects"; + insNames[125] = "Helicopter: Sound effects"; + insNames[126] = "Applause: Sound effects"; + insNames[127] = "Gunshot: Sound effects"; + this.instrumentNamesArray = insNames; + } + return this.instrumentNamesArray; + }; + this.player = player; + } + WebAudioFontLoader.prototype.startLoad = function (audioContext, filePath, variableName) { + if (window[variableName]) { + return; + } + for (var i = 0; i < this.cached.length; i++) { + if (this.cached[i].variableName == variableName) { + return; + } + } + this.cached.push({ + filePath: filePath, + variableName: variableName + }); + var r = document.createElement('script'); + r.setAttribute("type", "text/javascript"); + r.setAttribute("src", filePath); + document.getElementsByTagName("head")[0].appendChild(r); + this.decodeAfterLoading(audioContext, variableName); + }; + ; + WebAudioFontLoader.prototype.decodeAfterLoading = function (audioContext, variableName) { + var me = this; + this.waitOrFinish(variableName, function () { + me.player.adjustPreset(audioContext, window[variableName]); + }); + }; + ; + WebAudioFontLoader.prototype.waitOrFinish = function (variableName, onFinish) { + if (window[variableName]) { + onFinish(); + } + else { + var me = this; + setTimeout(function () { + me.waitOrFinish(variableName, onFinish); + }, 111); + } + }; + ; + WebAudioFontLoader.prototype.loaded = function (variableName) { + if (!(window[variableName])) { + return false; + } + var preset = window[variableName]; + for (var i = 0; i < preset.zones.length; i++) { + if (!(preset.zones[i].buffer)) { + return false; + } + } + return true; + }; + ; + WebAudioFontLoader.prototype.progress = function () { + if (this.cached.length > 0) { + for (var k = 0; k < this.cached.length; k++) { + if (!this.loaded(this.cached[k].variableName)) { + return k / this.cached.length; + } + } + return 1; + } + else { + return 1; + } + }; + ; + WebAudioFontLoader.prototype.waitLoad = function (onFinish) { + var me = this; + if (this.progress() >= 1) { + onFinish(); + } + else { + setTimeout(function () { + me.waitLoad(onFinish); + }, 333); + } + }; + ; + WebAudioFontLoader.prototype.instrumentKeys = function () { + if (this.instrumentKeyArray.length == 0) { + this.instrumentKeyArray = [ + '0000_JCLive_sf2_file', '0000_Aspirin_sf2_file', '0000_Chaos_sf2_file', '0000_FluidR3_GM_sf2_file', '0000_GeneralUserGS_sf2_file', '0000_SBLive_sf2', '0000_SoundBlasterOld_sf2', + '0001_FluidR3_GM_sf2_file', '0001_GeneralUserGS_sf2_file', '0002_GeneralUserGS_sf2_file', '0003_GeneralUserGS_sf2_file', '0010_Aspirin_sf2_file', '0010_Chaos_sf2_file', '0010_FluidR3_GM_sf2_file', + '0010_GeneralUserGS_sf2_file', '0010_JCLive_sf2_file', '0010_SBLive_sf2', '0010_SoundBlasterOld_sf2', '0011_Aspirin_sf2_file', '0011_FluidR3_GM_sf2_file', '0011_GeneralUserGS_sf2_file', + '0012_GeneralUserGS_sf2_file', '0020_Aspirin_sf2_file', '0020_Chaos_sf2_file', '0020_FluidR3_GM_sf2_file', '0020_GeneralUserGS_sf2_file', '0020_JCLive_sf2_file', '0020_SBLive_sf2', + '0020_SoundBlasterOld_sf2', '0021_Aspirin_sf2_file', '0021_GeneralUserGS_sf2_file', '0022_Aspirin_sf2_file', '0030_Aspirin_sf2_file', '0030_Chaos_sf2_file', '0030_FluidR3_GM_sf2_file', + '0030_GeneralUserGS_sf2_file', '0030_JCLive_sf2_file', '0030_SBLive_sf2', '0030_SoundBlasterOld_sf2', '0031_Aspirin_sf2_file', '0031_FluidR3_GM_sf2_file', '0031_GeneralUserGS_sf2_file', + '0031_SoundBlasterOld_sf2', '0040_Aspirin_sf2_file', '0040_Chaos_sf2_file', '0040_FluidR3_GM_sf2_file', '0040_GeneralUserGS_sf2_file', '0040_JCLive_sf2_file', '0040_SBLive_sf2', + '0040_SoundBlasterOld_sf2', '0041_FluidR3_GM_sf2_file', '0041_GeneralUserGS_sf2_file', '0041_SoundBlasterOld_sf2', '0042_GeneralUserGS_sf2_file', '0043_GeneralUserGS_sf2_file', + '0044_GeneralUserGS_sf2_file', '0045_GeneralUserGS_sf2_file', '0046_GeneralUserGS_sf2_file', '0050_Aspirin_sf2_file', '0050_Chaos_sf2_file', '0050_FluidR3_GM_sf2_file', + '0050_GeneralUserGS_sf2_file', '0050_JCLive_sf2_file', '0050_SBLive_sf2', '0050_SoundBlasterOld_sf2', '0051_FluidR3_GM_sf2_file', '0051_GeneralUserGS_sf2_file', '0052_GeneralUserGS_sf2_file', + '0053_GeneralUserGS_sf2_file', '0054_GeneralUserGS_sf2_file', '0060_Aspirin_sf2_file', '0060_Chaos_sf2_file', '0060_FluidR3_GM_sf2_file', '0060_GeneralUserGS_sf2_file', '0060_JCLive_sf2_file', + '0060_SBLive_sf2', '0060_SoundBlasterOld_sf2', '0061_Aspirin_sf2_file', '0061_GeneralUserGS_sf2_file', '0061_SoundBlasterOld_sf2', '0062_GeneralUserGS_sf2_file', '0070_Aspirin_sf2_file', + '0070_Chaos_sf2_file', '0070_FluidR3_GM_sf2_file', '0070_GeneralUserGS_sf2_file', '0070_JCLive_sf2_file', '0070_SBLive_sf2', '0070_SoundBlasterOld_sf2', '0071_GeneralUserGS_sf2_file', + '0080_Aspirin_sf2_file', '0080_Chaos_sf2_file', '0080_FluidR3_GM_sf2_file', '0080_GeneralUserGS_sf2_file', '0080_JCLive_sf2_file', '0080_SBLive_sf2', '0080_SoundBlasterOld_sf2', + '0081_FluidR3_GM_sf2_file', '0081_GeneralUserGS_sf2_file', '0081_SoundBlasterOld_sf2', '0090_Aspirin_sf2_file', '0090_Chaos_sf2_file', '0090_FluidR3_GM_sf2_file', '0090_GeneralUserGS_sf2_file', + '0090_JCLive_sf2_file', '0090_SBLive_sf2', '0090_SoundBlasterOld_sf2', '0091_SoundBlasterOld_sf2', '0100_Aspirin_sf2_file', '0100_Chaos_sf2_file', '0100_FluidR3_GM_sf2_file', + '0100_GeneralUserGS_sf2_file', '0100_JCLive_sf2_file', '0100_SBLive_sf2', '0100_SoundBlasterOld_sf2', '0101_GeneralUserGS_sf2_file', '0101_SoundBlasterOld_sf2', '0110_Aspirin_sf2_file', + '0110_Chaos_sf2_file', '0110_FluidR3_GM_sf2_file', '0110_GeneralUserGS_sf2_file', '0110_JCLive_sf2_file', '0110_SBLive_sf2', '0110_SoundBlasterOld_sf2', '0111_FluidR3_GM_sf2_file', + '0120_Aspirin_sf2_file', '0120_Chaos_sf2_file', '0120_FluidR3_GM_sf2_file', '0120_GeneralUserGS_sf2_file', '0120_JCLive_sf2_file', '0120_SBLive_sf2', '0120_SoundBlasterOld_sf2', + '0121_FluidR3_GM_sf2_file', '0121_GeneralUserGS_sf2_file', '0130_Aspirin_sf2_file', '0130_Chaos_sf2_file', '0130_FluidR3_GM_sf2_file', '0130_GeneralUserGS_sf2_file', '0130_JCLive_sf2_file', + '0130_SBLive_sf2', '0130_SoundBlasterOld_sf2', '0131_FluidR3_GM_sf2_file', '0140_Aspirin_sf2_file', '0140_Chaos_sf2_file', '0140_FluidR3_GM_sf2_file', '0140_GeneralUserGS_sf2_file', + '0140_JCLive_sf2_file', '0140_SBLive_sf2', '0140_SoundBlasterOld_sf2', '0141_FluidR3_GM_sf2_file', '0141_GeneralUserGS_sf2_file', '0142_GeneralUserGS_sf2_file', '0143_GeneralUserGS_sf2_file', + '0150_Aspirin_sf2_file', '0150_Chaos_sf2_file', '0150_FluidR3_GM_sf2_file', '0150_GeneralUserGS_sf2_file', '0150_JCLive_sf2_file', '0150_SBLive_sf2', '0150_SoundBlasterOld_sf2', + '0151_FluidR3_GM_sf2_file', '0160_Aspirin_sf2_file', '0160_Chaos_sf2_file', '0160_FluidR3_GM_sf2_file', '0160_GeneralUserGS_sf2_file', '0160_JCLive_sf2_file', '0160_SBLive_sf2', + '0160_SoundBlasterOld_sf2', '0161_Aspirin_sf2_file', '0161_FluidR3_GM_sf2_file', '0161_SoundBlasterOld_sf2', '0170_Aspirin_sf2_file', '0170_Chaos_sf2_file', '0170_FluidR3_GM_sf2_file', + '0170_GeneralUserGS_sf2_file', '0170_JCLive_sf2_file', '0170_SBLive_sf2', '0170_SoundBlasterOld_sf2', '0171_FluidR3_GM_sf2_file', '0171_GeneralUserGS_sf2_file', '0172_FluidR3_GM_sf2_file', + '0180_Aspirin_sf2_file', '0180_Chaos_sf2_file', '0180_FluidR3_GM_sf2_file', '0180_GeneralUserGS_sf2_file', '0180_JCLive_sf2_file', '0180_SBLive_sf2', '0180_SoundBlasterOld_sf2', + '0181_Aspirin_sf2_file', '0181_GeneralUserGS_sf2_file', '0181_SoundBlasterOld_sf2', '0190_Aspirin_sf2_file', '0190_Chaos_sf2_file', '0190_FluidR3_GM_sf2_file', '0190_GeneralUserGS_sf2_file', + '0190_JCLive_sf2_file', '0190_SBLive_sf2', '0190_SoundBlasterOld_sf2', '0191_Aspirin_sf2_file', '0191_GeneralUserGS_sf2_file', '0191_SoundBlasterOld_sf2', '0200_Aspirin_sf2_file', + '0200_Chaos_sf2_file', '0200_FluidR3_GM_sf2_file', '0200_GeneralUserGS_sf2_file', '0200_JCLive_sf2_file', '0200_SBLive_sf2', '0200_SoundBlasterOld_sf2', '0201_Aspirin_sf2_file', + '0201_FluidR3_GM_sf2_file', '0201_GeneralUserGS_sf2_file', '0201_SoundBlasterOld_sf2', '0210_Aspirin_sf2_file', '0210_Chaos_sf2_file', '0210_FluidR3_GM_sf2_file', '0210_GeneralUserGS_sf2_file', + '0210_JCLive_sf2_file', '0210_SBLive_sf2', '0210_SoundBlasterOld_sf2', '0211_Aspirin_sf2_file', '0211_FluidR3_GM_sf2_file', '0211_GeneralUserGS_sf2_file', '0211_SoundBlasterOld_sf2', + '0212_GeneralUserGS_sf2_file', '0220_Aspirin_sf2_file', '0220_Chaos_sf2_file', '0220_FluidR3_GM_sf2_file', '0220_GeneralUserGS_sf2_file', '0220_JCLive_sf2_file', '0220_SBLive_sf2', + '0220_SoundBlasterOld_sf2', '0221_FluidR3_GM_sf2_file', '0230_Aspirin_sf2_file', '0230_Chaos_sf2_file', '0230_FluidR3_GM_sf2_file', '0230_GeneralUserGS_sf2_file', '0230_JCLive_sf2_file', + '0230_SBLive_sf2', '0230_SoundBlasterOld_sf2', '0231_FluidR3_GM_sf2_file', '0231_GeneralUserGS_sf2_file', '0231_JCLive_sf2_file', '0231_SoundBlasterOld_sf2', '0232_FluidR3_GM_sf2_file', + '0233_FluidR3_GM_sf2_file', '0240_Aspirin_sf2_file', '0240_Chaos_sf2_file', '0240_FluidR3_GM_sf2_file', '0240_GeneralUserGS_sf2_file', '0240_JCLive_sf2_file', '0240_LK_Godin_Nylon_SF2_file', + '0240_SBLive_sf2', '0240_SoundBlasterOld_sf2', '0241_GeneralUserGS_sf2_file', '0241_JCLive_sf2_file', '0242_JCLive_sf2_file', '0243_JCLive_sf2_file', '0253_Acoustic_Guitar_sf2_file', + '0250_Aspirin_sf2_file', '0250_Chaos_sf2_file', '0250_FluidR3_GM_sf2_file', '0250_GeneralUserGS_sf2_file', '0250_JCLive_sf2_file', '0250_LK_AcousticSteel_SF2_file', '0250_SBLive_sf2', + '0250_SoundBlasterOld_sf2', '0251_Acoustic_Guitar_sf2_file', '0251_GeneralUserGS_sf2_file', '0252_Acoustic_Guitar_sf2_file', '0252_GeneralUserGS_sf2_file', '0253_Acoustic_Guitar_sf2_file', + '0253_GeneralUserGS_sf2_file', '0254_Acoustic_Guitar_sf2_file', '0254_GeneralUserGS_sf2_file', '0255_GeneralUserGS_sf2_file', '0260_Aspirin_sf2_file', '0260_Chaos_sf2_file', + '0260_FluidR3_GM_sf2_file', '0260_GeneralUserGS_sf2_file', '0260_JCLive_sf2_file', '0260_SBLive_sf2', '0260_SoundBlasterOld_sf2', '0260_Stratocaster_sf2_file', '0261_GeneralUserGS_sf2_file', + '0261_SoundBlasterOld_sf2', '0261_Stratocaster_sf2_file', '0262_Stratocaster_sf2_file', '0270_Aspirin_sf2_file', '0270_Chaos_sf2_file', '0270_FluidR3_GM_sf2_file', '0270_GeneralUserGS_sf2_file', + '0270_Gibson_Les_Paul_sf2_file', '0270_JCLive_sf2_file', '0270_SBAWE32_sf2_file', '0270_SBLive_sf2', '0270_SoundBlasterOld_sf2', '0270_Stratocaster_sf2_file', '0271_GeneralUserGS_sf2_file', + '0271_Stratocaster_sf2_file', '0272_Stratocaster_sf2_file', '0280_Aspirin_sf2_file', '0280_Chaos_sf2_file', '0280_FluidR3_GM_sf2_file', '0280_GeneralUserGS_sf2_file', '0280_JCLive_sf2_file', + '0280_LesPaul_sf2', '0280_LesPaul_sf2_file', '0280_SBAWE32_sf2_file', '0280_SBLive_sf2', '0280_SoundBlasterOld_sf2', '0281_Aspirin_sf2_file', '0281_FluidR3_GM_sf2_file', + '0281_GeneralUserGS_sf2_file', '0282_FluidR3_GM_sf2_file', '0282_GeneralUserGS_sf2_file', '0283_GeneralUserGS_sf2_file', '0290_Aspirin_sf2_file', '0290_Chaos_sf2_file', '0290_FluidR3_GM_sf2_file', + '0290_GeneralUserGS_sf2_file', '0290_JCLive_sf2_file', '0290_LesPaul_sf2', '0290_LesPaul_sf2_file', '0290_SBAWE32_sf2_file', '0290_SBLive_sf2', '0290_SoundBlasterOld_sf2', '0291_Aspirin_sf2_file', + '0291_LesPaul_sf2', '0291_LesPaul_sf2_file', '0291_SBAWE32_sf2_file', '0291_SoundBlasterOld_sf2', '0292_Aspirin_sf2_file', '0292_LesPaul_sf2', '0292_LesPaul_sf2_file', '0300_Aspirin_sf2_file', + '0300_Chaos_sf2_file', '0300_FluidR3_GM_sf2_file', '0300_GeneralUserGS_sf2_file', '0300_JCLive_sf2_file', '0300_LesPaul_sf2', '0300_LesPaul_sf2_file', '0300_SBAWE32_sf2_file', '0300_SBLive_sf2', + '0300_SoundBlasterOld_sf2', '0301_Aspirin_sf2_file', '0301_FluidR3_GM_sf2_file', '0301_GeneralUserGS_sf2_file', '0301_JCLive_sf2_file', '0301_LesPaul_sf2', '0301_LesPaul_sf2_file', + '0302_Aspirin_sf2_file', '0302_GeneralUserGS_sf2_file', '0302_JCLive_sf2_file', '0303_Aspirin_sf2_file', '0304_Aspirin_sf2_file', '0310_Aspirin_sf2_file', '0310_Chaos_sf2_file', + '0310_FluidR3_GM_sf2_file', '0310_GeneralUserGS_sf2_file', '0310_JCLive_sf2_file', '0310_LesPaul_sf2', '0310_LesPaul_sf2_file', '0310_SBAWE32_sf2_file', '0310_SBLive_sf2', + '0310_SoundBlasterOld_sf2', '0311_FluidR3_GM_sf2_file', '0311_GeneralUserGS_sf2_file', '0320_Aspirin_sf2_file', '0320_Chaos_sf2_file', '0320_FluidR3_GM_sf2_file', '0320_GeneralUserGS_sf2_file', + '0320_JCLive_sf2_file', '0320_SBLive_sf2', '0320_SoundBlasterOld_sf2', '0321_GeneralUserGS_sf2_file', '0322_GeneralUserGS_sf2_file', '0330_Aspirin_sf2_file', '0330_Chaos_sf2_file', + '0330_FluidR3_GM_sf2_file', '0330_GeneralUserGS_sf2_file', '0330_JCLive_sf2_file', '0330_SBLive_sf2', '0330_SoundBlasterOld_sf2', '0331_GeneralUserGS_sf2_file', '0332_GeneralUserGS_sf2_file', + '0340_Aspirin_sf2_file', '0340_Chaos_sf2_file', '0340_FluidR3_GM_sf2_file', '0340_GeneralUserGS_sf2_file', '0340_JCLive_sf2_file', '0340_SBLive_sf2', '0340_SoundBlasterOld_sf2', + '0341_Aspirin_sf2_file', '0341_GeneralUserGS_sf2_file', '0350_Aspirin_sf2_file', '0350_Chaos_sf2_file', '0350_FluidR3_GM_sf2_file', '0350_GeneralUserGS_sf2_file', '0350_JCLive_sf2_file', + '0350_SBLive_sf2', '0350_SoundBlasterOld_sf2', '0351_GeneralUserGS_sf2_file', '0360_Aspirin_sf2_file', '0360_Chaos_sf2_file', '0360_FluidR3_GM_sf2_file', '0360_GeneralUserGS_sf2_file', + '0360_JCLive_sf2_file', '0360_SBLive_sf2', '0360_SoundBlasterOld_sf2', '0361_GeneralUserGS_sf2_file', '0370_Aspirin_sf2_file', '0370_Chaos_sf2_file', '0370_FluidR3_GM_sf2_file', + '0370_GeneralUserGS_sf2_file', '0370_JCLive_sf2_file', '0370_SBLive_sf2', '0370_SoundBlasterOld_sf2', '0371_GeneralUserGS_sf2_file', '0372_GeneralUserGS_sf2_file', + '0385_GeneralUserGS_sf2_file', + '0380_Aspirin_sf2_file', + '0380_Chaos_sf2_file', + '0380_FluidR3_GM_sf2_file', + '0380_GeneralUserGS_sf2_file', + '0380_JCLive_sf2_file', + '0380_SBLive_sf2', + '0380_SoundBlasterOld_sf2', + '0381_FluidR3_GM_sf2_file', + '0381_GeneralUserGS_sf2_file', + '0382_FluidR3_GM_sf2_file', + '0382_GeneralUserGS_sf2_file', + '0383_GeneralUserGS_sf2_file', + '0384_GeneralUserGS_sf2_file', + '0386_GeneralUserGS_sf2_file', + '0387_GeneralUserGS_sf2_file', + '0390_Aspirin_sf2_file', '0390_Chaos_sf2_file', '0390_FluidR3_GM_sf2_file', + '0390_GeneralUserGS_sf2_file', '0390_JCLive_sf2_file', '0390_SBLive_sf2', '0390_SoundBlasterOld_sf2', '0391_FluidR3_GM_sf2_file', + '0391_GeneralUserGS_sf2_file', '0391_SoundBlasterOld_sf2', '0392_FluidR3_GM_sf2_file', '0392_GeneralUserGS_sf2_file', + '0393_GeneralUserGS_sf2_file', '0400_Aspirin_sf2_file', '0400_Chaos_sf2_file', '0400_FluidR3_GM_sf2_file', '0400_GeneralUserGS_sf2_file', + '0400_JCLive_sf2_file', '0400_SBLive_sf2', '0400_SoundBlasterOld_sf2', '0401_Aspirin_sf2_file', '0401_FluidR3_GM_sf2_file', + '0401_GeneralUserGS_sf2_file', '0402_GeneralUserGS_sf2_file', '0410_Aspirin_sf2_file', '0410_Chaos_sf2_file', '0410_FluidR3_GM_sf2_file', + '0410_GeneralUserGS_sf2_file', '0410_JCLive_sf2_file', '0410_SBLive_sf2', '0410_SoundBlasterOld_sf2', '0411_FluidR3_GM_sf2_file', + '0420_Aspirin_sf2_file', '0420_Chaos_sf2_file', '0420_FluidR3_GM_sf2_file', '0420_GeneralUserGS_sf2_file', '0420_JCLive_sf2_file', + '0420_SBLive_sf2', '0420_SoundBlasterOld_sf2', '0421_FluidR3_GM_sf2_file', '0421_GeneralUserGS_sf2_file', '0430_Aspirin_sf2_file', + '0430_Chaos_sf2_file', '0430_FluidR3_GM_sf2_file', '0430_GeneralUserGS_sf2_file', '0430_JCLive_sf2_file', '0430_SBLive_sf2', + '0430_SoundBlasterOld_sf2', '0431_FluidR3_GM_sf2_file', '0440_Aspirin_sf2_file', '0440_Chaos_sf2_file', '0440_FluidR3_GM_sf2_file', + '0440_GeneralUserGS_sf2_file', '0440_JCLive_sf2_file', '0440_SBLive_sf2', + '0440_SoundBlasterOld_sf2', '0441_GeneralUserGS_sf2_file', '0442_GeneralUserGS_sf2_file', '0450_Aspirin_sf2_file', '0450_Chaos_sf2_file', + '0450_FluidR3_GM_sf2_file', + '0450_GeneralUserGS_sf2_file', '0450_JCLive_sf2_file', '0450_SBLive_sf2', '0450_SoundBlasterOld_sf2', '0451_FluidR3_GM_sf2_file', '0460_Aspirin_sf2_file', + '0460_Chaos_sf2_file', '0460_FluidR3_GM_sf2_file', '0460_GeneralUserGS_sf2_file', '0460_JCLive_sf2_file', '0460_SBLive_sf2', '0460_SoundBlasterOld_sf2', + '0461_FluidR3_GM_sf2_file', '0470_Aspirin_sf2_file', '0470_Chaos_sf2_file', '0470_FluidR3_GM_sf2_file', '0470_GeneralUserGS_sf2_file', '0470_JCLive_sf2_file', + '0470_SBLive_sf2', '0470_SoundBlasterOld_sf2', '0471_FluidR3_GM_sf2_file', '0471_GeneralUserGS_sf2_file', '0480_Aspirin_sf2_file', '0480_Chaos_sf2_file', + '0480_FluidR3_GM_sf2_file', '0480_GeneralUserGS_sf2_file', '0480_JCLive_sf2_file', '0480_SBLive_sf2', '0480_SoundBlasterOld_sf2', '04810_GeneralUserGS_sf2_file', + '04811_GeneralUserGS_sf2_file', '04812_GeneralUserGS_sf2_file', '04813_GeneralUserGS_sf2_file', '04814_GeneralUserGS_sf2_file', '04815_GeneralUserGS_sf2_file', '04816_GeneralUserGS_sf2_file', + '04817_GeneralUserGS_sf2_file', '0481_Aspirin_sf2_file', '0481_FluidR3_GM_sf2_file', '0481_GeneralUserGS_sf2_file', '0482_Aspirin_sf2_file', '0482_GeneralUserGS_sf2_file', + '0483_GeneralUserGS_sf2_file', '0484_GeneralUserGS_sf2_file', '0485_GeneralUserGS_sf2_file', '0486_GeneralUserGS_sf2_file', '0487_GeneralUserGS_sf2_file', '0488_GeneralUserGS_sf2_file', + '0489_GeneralUserGS_sf2_file', '0490_Aspirin_sf2_file', '0490_Chaos_sf2_file', '0490_FluidR3_GM_sf2_file', '0490_GeneralUserGS_sf2_file', '0490_JCLive_sf2_file', '0490_SBLive_sf2', + '0490_SoundBlasterOld_sf2', '0491_GeneralUserGS_sf2_file', '0492_GeneralUserGS_sf2_file', '0500_Aspirin_sf2_file', '0500_Chaos_sf2_file', '0500_FluidR3_GM_sf2_file', '0500_GeneralUserGS_sf2_file', + '0500_JCLive_sf2_file', '0500_SBLive_sf2', '0500_SoundBlasterOld_sf2', '0501_FluidR3_GM_sf2_file', '0501_GeneralUserGS_sf2_file', '0502_FluidR3_GM_sf2_file', '0502_GeneralUserGS_sf2_file', + '0503_FluidR3_GM_sf2_file', '0504_FluidR3_GM_sf2_file', '0505_FluidR3_GM_sf2_file', '0510_Aspirin_sf2_file', '0510_Chaos_sf2_file', '0510_FluidR3_GM_sf2_file', '0510_GeneralUserGS_sf2_file', + '0510_JCLive_sf2_file', '0510_SBLive_sf2', '0510_SoundBlasterOld_sf2', '0511_GeneralUserGS_sf2_file', '0511_SoundBlasterOld_sf2', '0520_Aspirin_sf2_file', '0520_Chaos_sf2_file', + '0520_FluidR3_GM_sf2_file', '0520_GeneralUserGS_sf2_file', '0520_JCLive_sf2_file', '0520_SBLive_sf2', '0520_Soul_Ahhs_sf2_file', '0520_SoundBlasterOld_sf2', '0521_FluidR3_GM_sf2_file', + '0521_Soul_Ahhs_sf2_file', '0521_SoundBlasterOld_sf2', '0522_Soul_Ahhs_sf2_file', '0530_Aspirin_sf2_file', '0530_Chaos_sf2_file', '0530_FluidR3_GM_sf2_file', '0530_GeneralUserGS_sf2_file', + '0530_JCLive_sf2_file', '0530_SBLive_sf2', '0530_Soul_Ahhs_sf2_file', '0530_SoundBlasterOld_sf2', '0531_FluidR3_GM_sf2_file', '0531_GeneralUserGS_sf2_file', '0531_JCLive_sf2_file', + '0531_SoundBlasterOld_sf2', '0540_Aspirin_sf2_file', '0540_Chaos_sf2_file', '0540_FluidR3_GM_sf2_file', '0540_GeneralUserGS_sf2_file', '0540_JCLive_sf2_file', '0540_SBLive_sf2', + '0540_SoundBlasterOld_sf2', '0541_FluidR3_GM_sf2_file', '0550_Aspirin_sf2_file', '0550_Chaos_sf2_file', '0550_FluidR3_GM_sf2_file', '0550_GeneralUserGS_sf2_file', '0550_JCLive_sf2_file', + '0550_SBLive_sf2', '0550_SoundBlasterOld_sf2', '0551_Aspirin_sf2_file', '0551_FluidR3_GM_sf2_file', '0560_Aspirin_sf2_file', '0560_Chaos_sf2_file', '0560_FluidR3_GM_sf2_file', + '0560_GeneralUserGS_sf2_file', '0560_JCLive_sf2_file', '0560_SBLive_sf2', '0560_SoundBlasterOld_sf2', '0570_Aspirin_sf2_file', '0570_Chaos_sf2_file', '0570_FluidR3_GM_sf2_file', + '0570_GeneralUserGS_sf2_file', '0570_JCLive_sf2_file', '0570_SBLive_sf2', '0570_SoundBlasterOld_sf2', '0571_GeneralUserGS_sf2_file', '0580_Aspirin_sf2_file', '0580_Chaos_sf2_file', + '0580_FluidR3_GM_sf2_file', '0580_GeneralUserGS_sf2_file', '0580_JCLive_sf2_file', '0580_SBLive_sf2', '0580_SoundBlasterOld_sf2', '0581_GeneralUserGS_sf2_file', '0590_Aspirin_sf2_file', + '0590_Chaos_sf2_file', '0590_FluidR3_GM_sf2_file', '0590_GeneralUserGS_sf2_file', '0590_JCLive_sf2_file', '0590_SBLive_sf2', '0590_SoundBlasterOld_sf2', '0591_GeneralUserGS_sf2_file', + '0600_Aspirin_sf2_file', '0600_Chaos_sf2_file', '0600_FluidR3_GM_sf2_file', '0600_GeneralUserGS_sf2_file', '0600_JCLive_sf2_file', '0600_SBLive_sf2', '0600_SoundBlasterOld_sf2', + '0601_FluidR3_GM_sf2_file', '0601_GeneralUserGS_sf2_file', '0602_GeneralUserGS_sf2_file', '0603_GeneralUserGS_sf2_file', '0610_Aspirin_sf2_file', '0610_Chaos_sf2_file', '0610_FluidR3_GM_sf2_file', + '0610_GeneralUserGS_sf2_file', '0610_JCLive_sf2_file', '0610_SBLive_sf2', '0610_SoundBlasterOld_sf2', '0611_GeneralUserGS_sf2_file', '0612_GeneralUserGS_sf2_file', '0613_GeneralUserGS_sf2_file', + '0614_GeneralUserGS_sf2_file', '0615_GeneralUserGS_sf2_file', '0620_Aspirin_sf2_file', '0620_Chaos_sf2_file', '0620_FluidR3_GM_sf2_file', '0620_GeneralUserGS_sf2_file', '0620_JCLive_sf2_file', + '0620_SBLive_sf2', '0620_SoundBlasterOld_sf2', '0621_Aspirin_sf2_file', '0621_FluidR3_GM_sf2_file', '0621_GeneralUserGS_sf2_file', '0622_FluidR3_GM_sf2_file', '0622_GeneralUserGS_sf2_file', + '0630_Aspirin_sf2_file', '0630_Chaos_sf2_file', '0630_FluidR3_GM_sf2_file', '0630_GeneralUserGS_sf2_file', '0630_JCLive_sf2_file', '0630_SBLive_sf2', '0630_SoundBlasterOld_sf2', + '0631_Aspirin_sf2_file', '0631_FluidR3_GM_sf2_file', '0631_GeneralUserGS_sf2_file', '0632_FluidR3_GM_sf2_file', '0633_FluidR3_GM_sf2_file', '0640_Aspirin_sf2_file', '0640_Chaos_sf2_file', + '0640_FluidR3_GM_sf2_file', '0640_GeneralUserGS_sf2_file', '0640_JCLive_sf2_file', '0640_SBLive_sf2', '0640_SoundBlasterOld_sf2', '0641_FluidR3_GM_sf2_file', '0650_Aspirin_sf2_file', + '0650_Chaos_sf2_file', '0650_FluidR3_GM_sf2_file', '0650_GeneralUserGS_sf2_file', '0650_JCLive_sf2_file', '0650_SBLive_sf2', '0650_SoundBlasterOld_sf2', '0651_Aspirin_sf2_file', + '0651_FluidR3_GM_sf2_file', '0660_Aspirin_sf2_file', '0660_Chaos_sf2_file', '0660_FluidR3_GM_sf2_file', '0660_GeneralUserGS_sf2_file', '0660_JCLive_sf2_file', '0660_SBLive_sf2', + '0660_SoundBlasterOld_sf2', '0661_FluidR3_GM_sf2_file', '0661_GeneralUserGS_sf2_file', '0670_Aspirin_sf2_file', '0670_Chaos_sf2_file', '0670_FluidR3_GM_sf2_file', '0670_GeneralUserGS_sf2_file', + '0670_JCLive_sf2_file', '0670_SBLive_sf2', '0670_SoundBlasterOld_sf2', '0671_FluidR3_GM_sf2_file', '0680_Aspirin_sf2_file', '0680_Chaos_sf2_file', '0680_FluidR3_GM_sf2_file', + '0680_GeneralUserGS_sf2_file', '0680_JCLive_sf2_file', '0680_SBLive_sf2', '0680_SoundBlasterOld_sf2', '0681_FluidR3_GM_sf2_file', '0690_Aspirin_sf2_file', '0690_Chaos_sf2_file', + '0690_FluidR3_GM_sf2_file', '0690_GeneralUserGS_sf2_file', '0690_JCLive_sf2_file', '0690_SBLive_sf2', '0690_SoundBlasterOld_sf2', '0691_FluidR3_GM_sf2_file', '0700_Aspirin_sf2_file', + '0700_Chaos_sf2_file', '0700_FluidR3_GM_sf2_file', '0700_GeneralUserGS_sf2_file', '0700_JCLive_sf2_file', '0700_SBLive_sf2', '0700_SoundBlasterOld_sf2', '0701_FluidR3_GM_sf2_file', + '0701_GeneralUserGS_sf2_file', '0710_Aspirin_sf2_file', '0710_Chaos_sf2_file', '0710_FluidR3_GM_sf2_file', '0710_GeneralUserGS_sf2_file', '0710_JCLive_sf2_file', '0710_SBLive_sf2', + '0710_SoundBlasterOld_sf2', '0711_FluidR3_GM_sf2_file', '0720_Aspirin_sf2_file', '0720_Chaos_sf2_file', '0720_FluidR3_GM_sf2_file', '0720_GeneralUserGS_sf2_file', '0720_JCLive_sf2_file', + '0720_SBLive_sf2', '0720_SoundBlasterOld_sf2', '0721_FluidR3_GM_sf2_file', '0721_SoundBlasterOld_sf2', '0730_Aspirin_sf2_file', '0730_Chaos_sf2_file', '0730_FluidR3_GM_sf2_file', + '0730_GeneralUserGS_sf2_file', '0730_JCLive_sf2_file', '0730_SBLive_sf2', '0730_SoundBlasterOld_sf2', '0731_Aspirin_sf2_file', '0731_FluidR3_GM_sf2_file', '0731_SoundBlasterOld_sf2', + '0740_Aspirin_sf2_file', '0740_Chaos_sf2_file', '0740_FluidR3_GM_sf2_file', '0740_GeneralUserGS_sf2_file', '0740_JCLive_sf2_file', '0740_SBLive_sf2', '0740_SoundBlasterOld_sf2', + '0741_GeneralUserGS_sf2_file', '0750_Aspirin_sf2_file', '0750_Chaos_sf2_file', '0750_FluidR3_GM_sf2_file', '0750_GeneralUserGS_sf2_file', '0750_JCLive_sf2_file', '0750_SBLive_sf2', + '0750_SoundBlasterOld_sf2', '0751_Aspirin_sf2_file', '0751_FluidR3_GM_sf2_file', '0751_GeneralUserGS_sf2_file', '0751_SoundBlasterOld_sf2', '0760_Aspirin_sf2_file', '0760_Chaos_sf2_file', + '0760_FluidR3_GM_sf2_file', '0760_GeneralUserGS_sf2_file', '0760_JCLive_sf2_file', '0760_SBLive_sf2', '0760_SoundBlasterOld_sf2', '0761_FluidR3_GM_sf2_file', '0761_GeneralUserGS_sf2_file', + '0761_SoundBlasterOld_sf2', '0762_GeneralUserGS_sf2_file', '0770_Aspirin_sf2_file', '0770_Chaos_sf2_file', '0770_FluidR3_GM_sf2_file', '0770_GeneralUserGS_sf2_file', '0770_JCLive_sf2_file', + '0770_SBLive_sf2', '0770_SoundBlasterOld_sf2', '0771_FluidR3_GM_sf2_file', '0771_GeneralUserGS_sf2_file', '0772_GeneralUserGS_sf2_file', '0780_Aspirin_sf2_file', '0780_Chaos_sf2_file', + '0780_FluidR3_GM_sf2_file', '0780_GeneralUserGS_sf2_file', '0780_JCLive_sf2_file', '0780_SBLive_sf2', '0780_SoundBlasterOld_sf2', '0781_GeneralUserGS_sf2_file', '0790_Aspirin_sf2_file', + '0790_Chaos_sf2_file', '0790_FluidR3_GM_sf2_file', '0790_GeneralUserGS_sf2_file', '0790_JCLive_sf2_file', '0790_SBLive_sf2', '0790_SoundBlasterOld_sf2', '0791_GeneralUserGS_sf2_file', + '0800_Aspirin_sf2_file', '0800_Chaos_sf2_file', '0800_FluidR3_GM_sf2_file', '0800_GeneralUserGS_sf2_file', '0800_JCLive_sf2_file', '0800_SBLive_sf2', '0800_SoundBlasterOld_sf2', + '0801_FluidR3_GM_sf2_file', '0801_GeneralUserGS_sf2_file', '0810_Aspirin_sf2_file', '0810_Chaos_sf2_file', '0810_FluidR3_GM_sf2_file', '0810_GeneralUserGS_sf2_file', '0810_JCLive_sf2_file', + '0810_SBLive_sf2', '0810_SoundBlasterOld_sf2', '0811_Aspirin_sf2_file', '0811_GeneralUserGS_sf2_file', '0811_SoundBlasterOld_sf2', '0820_Aspirin_sf2_file', '0820_Chaos_sf2_file', + '0820_FluidR3_GM_sf2_file', '0820_GeneralUserGS_sf2_file', '0820_JCLive_sf2_file', '0820_SBLive_sf2', '0820_SoundBlasterOld_sf2', '0821_FluidR3_GM_sf2_file', '0821_GeneralUserGS_sf2_file', + '0821_SoundBlasterOld_sf2', '0822_GeneralUserGS_sf2_file', '0823_GeneralUserGS_sf2_file', '0830_Aspirin_sf2_file', '0830_Chaos_sf2_file', '0830_FluidR3_GM_sf2_file', '0830_GeneralUserGS_sf2_file', + '0830_JCLive_sf2_file', '0830_SBLive_sf2', '0830_SoundBlasterOld_sf2', '0831_FluidR3_GM_sf2_file', '0831_GeneralUserGS_sf2_file', '0831_SoundBlasterOld_sf2', '0840_Aspirin_sf2_file', + '0840_Chaos_sf2_file', '0840_FluidR3_GM_sf2_file', '0840_GeneralUserGS_sf2_file', '0840_JCLive_sf2_file', '0840_SBLive_sf2', '0840_SoundBlasterOld_sf2', '0841_Aspirin_sf2_file', + '0841_Chaos_sf2_file', '0841_FluidR3_GM_sf2_file', '0841_GeneralUserGS_sf2_file', '0841_JCLive_sf2_file', '0841_SoundBlasterOld_sf2', '0842_FluidR3_GM_sf2_file', '0850_Aspirin_sf2_file', + '0850_Chaos_sf2_file', '0850_FluidR3_GM_sf2_file', '0850_GeneralUserGS_sf2_file', '0850_JCLive_sf2_file', '0850_SBLive_sf2', '0850_SoundBlasterOld_sf2', '0851_FluidR3_GM_sf2_file', + '0851_GeneralUserGS_sf2_file', '0851_JCLive_sf2_file', '0851_SoundBlasterOld_sf2', '0860_Aspirin_sf2_file', '0860_Chaos_sf2_file', '0860_FluidR3_GM_sf2_file', '0860_GeneralUserGS_sf2_file', + '0860_JCLive_sf2_file', '0860_SBLive_sf2', '0860_SoundBlasterOld_sf2', '0861_Aspirin_sf2_file', '0861_FluidR3_GM_sf2_file', '0861_SoundBlasterOld_sf2', '0870_Aspirin_sf2_file', + '0870_Chaos_sf2_file', '0870_FluidR3_GM_sf2_file', '0870_GeneralUserGS_sf2_file', '0870_JCLive_sf2_file', '0870_SBLive_sf2', '0870_SoundBlasterOld_sf2', '0871_GeneralUserGS_sf2_file', + '0872_GeneralUserGS_sf2_file', '0873_GeneralUserGS_sf2_file', '0880_Aspirin_sf2_file', '0880_Chaos_sf2_file', '0880_FluidR3_GM_sf2_file', '0880_GeneralUserGS_sf2_file', '0880_JCLive_sf2_file', + '0880_SBLive_sf2', '0880_SoundBlasterOld_sf2', '0881_Aspirin_sf2_file', '0881_FluidR3_GM_sf2_file', '0881_GeneralUserGS_sf2_file', '0881_SoundBlasterOld_sf2', '0882_Aspirin_sf2_file', + '0882_FluidR3_GM_sf2_file', '0882_GeneralUserGS_sf2_file', '0883_GeneralUserGS_sf2_file', '0884_GeneralUserGS_sf2_file', '0885_GeneralUserGS_sf2_file', '0886_GeneralUserGS_sf2_file', + '0887_GeneralUserGS_sf2_file', '0888_GeneralUserGS_sf2_file', '0889_GeneralUserGS_sf2_file', '0890_Aspirin_sf2_file', '0890_Chaos_sf2_file', '0890_FluidR3_GM_sf2_file', + '0890_GeneralUserGS_sf2_file', '0890_JCLive_sf2_file', '0890_SBLive_sf2', '0890_SoundBlasterOld_sf2', '0891_Aspirin_sf2_file', '0891_FluidR3_GM_sf2_file', '0891_GeneralUserGS_sf2_file', + '0900_Aspirin_sf2_file', '0900_Chaos_sf2_file', '0900_FluidR3_GM_sf2_file', '0900_GeneralUserGS_sf2_file', '0900_JCLive_sf2_file', '0900_SBLive_sf2', '0900_SoundBlasterOld_sf2', + '0901_Aspirin_sf2_file', '0901_FluidR3_GM_sf2_file', '0901_GeneralUserGS_sf2_file', '0901_SoundBlasterOld_sf2', '0910_Aspirin_sf2_file', '0910_Chaos_sf2_file', '0910_FluidR3_GM_sf2_file', + '0910_GeneralUserGS_sf2_file', '0910_JCLive_sf2_file', '0910_SBLive_sf2', '0910_SoundBlasterOld_sf2', '0911_Aspirin_sf2_file', '0911_GeneralUserGS_sf2_file', '0911_JCLive_sf2_file', + '0911_SoundBlasterOld_sf2', '0920_Aspirin_sf2_file', '0920_Chaos_sf2_file', '0920_FluidR3_GM_sf2_file', '0920_GeneralUserGS_sf2_file', '0920_JCLive_sf2_file', '0920_SBLive_sf2', + '0920_SoundBlasterOld_sf2', '0921_Aspirin_sf2_file', '0921_GeneralUserGS_sf2_file', '0921_SoundBlasterOld_sf2', '0930_Aspirin_sf2_file', '0930_Chaos_sf2_file', '0930_FluidR3_GM_sf2_file', + '0930_GeneralUserGS_sf2_file', '0930_JCLive_sf2_file', '0930_SBLive_sf2', '0930_SoundBlasterOld_sf2', '0931_Aspirin_sf2_file', '0931_FluidR3_GM_sf2_file', '0931_GeneralUserGS_sf2_file', + '0931_SoundBlasterOld_sf2', '0940_Aspirin_sf2_file', '0940_Chaos_sf2_file', '0940_FluidR3_GM_sf2_file', '0940_GeneralUserGS_sf2_file', '0940_JCLive_sf2_file', '0940_SBLive_sf2', + '0940_SoundBlasterOld_sf2', '0941_Aspirin_sf2_file', '0941_FluidR3_GM_sf2_file', '0941_GeneralUserGS_sf2_file', '0941_JCLive_sf2_file', '0950_Aspirin_sf2_file', '0950_Chaos_sf2_file', + '0950_FluidR3_GM_sf2_file', '0950_GeneralUserGS_sf2_file', '0950_JCLive_sf2_file', '0950_SBLive_sf2', '0950_SoundBlasterOld_sf2', '0951_FluidR3_GM_sf2_file', '0951_GeneralUserGS_sf2_file', + '0960_Aspirin_sf2_file', '0960_Chaos_sf2_file', '0960_FluidR3_GM_sf2_file', '0960_GeneralUserGS_sf2_file', '0960_JCLive_sf2_file', '0960_SBLive_sf2', '0960_SoundBlasterOld_sf2', + '0961_Aspirin_sf2_file', '0961_FluidR3_GM_sf2_file', '0961_GeneralUserGS_sf2_file', '0961_SoundBlasterOld_sf2', '0962_GeneralUserGS_sf2_file', '0970_Aspirin_sf2_file', '0970_Chaos_sf2_file', + '0970_FluidR3_GM_sf2_file', '0970_GeneralUserGS_sf2_file', '0970_JCLive_sf2_file', '0970_SBLive_sf2', '0970_SoundBlasterOld_sf2', '0971_FluidR3_GM_sf2_file', '0971_GeneralUserGS_sf2_file', + '0971_SoundBlasterOld_sf2', '0980_Aspirin_sf2_file', '0980_Chaos_sf2_file', '0980_FluidR3_GM_sf2_file', '0980_GeneralUserGS_sf2_file', '0980_JCLive_sf2_file', '0980_SBLive_sf2', + '0980_SoundBlasterOld_sf2', '0981_Aspirin_sf2_file', '0981_FluidR3_GM_sf2_file', '0981_GeneralUserGS_sf2_file', '0981_SoundBlasterOld_sf2', '0982_GeneralUserGS_sf2_file', + '0983_GeneralUserGS_sf2_file', '0984_GeneralUserGS_sf2_file', '0990_Aspirin_sf2_file', '0990_Chaos_sf2_file', '0990_FluidR3_GM_sf2_file', '0990_GeneralUserGS_sf2_file', '0990_JCLive_sf2_file', + '0990_SBLive_sf2', '0990_SoundBlasterOld_sf2', '0991_Aspirin_sf2_file', '0991_FluidR3_GM_sf2_file', '0991_GeneralUserGS_sf2_file', '0991_JCLive_sf2_file', '0991_SoundBlasterOld_sf2', + '0992_FluidR3_GM_sf2_file', '0992_JCLive_sf2_file', '0993_JCLive_sf2_file', '0994_JCLive_sf2_file', '1000_Aspirin_sf2_file', '1000_Chaos_sf2_file', '1000_FluidR3_GM_sf2_file', + '1000_GeneralUserGS_sf2_file', '1000_JCLive_sf2_file', '1000_SBLive_sf2', '1000_SoundBlasterOld_sf2', '1001_Aspirin_sf2_file', '1001_FluidR3_GM_sf2_file', '1001_GeneralUserGS_sf2_file', + '1001_JCLive_sf2_file', '1001_SoundBlasterOld_sf2', '1002_Aspirin_sf2_file', '1002_FluidR3_GM_sf2_file', '1002_GeneralUserGS_sf2_file', '1010_Aspirin_sf2_file', '1010_Chaos_sf2_file', + '1010_FluidR3_GM_sf2_file', '1010_GeneralUserGS_sf2_file', '1010_JCLive_sf2_file', '1010_SBLive_sf2', '1010_SoundBlasterOld_sf2', '1011_Aspirin_sf2_file', '1011_FluidR3_GM_sf2_file', + '1011_JCLive_sf2_file', '1012_Aspirin_sf2_file', '1020_Aspirin_sf2_file', '1020_Chaos_sf2_file', '1020_FluidR3_GM_sf2_file', '1020_GeneralUserGS_sf2_file', '1020_JCLive_sf2_file', + '1020_SBLive_sf2', '1020_SoundBlasterOld_sf2', '1021_Aspirin_sf2_file', '1021_FluidR3_GM_sf2_file', '1021_GeneralUserGS_sf2_file', '1021_JCLive_sf2_file', '1021_SoundBlasterOld_sf2', + '1022_GeneralUserGS_sf2_file', '1030_Aspirin_sf2_file', '1030_Chaos_sf2_file', '1030_FluidR3_GM_sf2_file', '1030_GeneralUserGS_sf2_file', '1030_JCLive_sf2_file', '1030_SBLive_sf2', + '1030_SoundBlasterOld_sf2', '1031_Aspirin_sf2_file', '1031_FluidR3_GM_sf2_file', '1031_GeneralUserGS_sf2_file', '1031_SoundBlasterOld_sf2', '1032_FluidR3_GM_sf2_file', '1040_Aspirin_sf2_file', + '1040_Chaos_sf2_file', '1040_FluidR3_GM_sf2_file', '1040_GeneralUserGS_sf2_file', '1040_JCLive_sf2_file', '1040_SBLive_sf2', '1040_SoundBlasterOld_sf2', '1041_FluidR3_GM_sf2_file', + '1041_GeneralUserGS_sf2_file', '1050_Aspirin_sf2_file', '1050_Chaos_sf2_file', '1050_FluidR3_GM_sf2_file', '1050_GeneralUserGS_sf2_file', '1050_JCLive_sf2_file', '1050_SBLive_sf2', + '1050_SoundBlasterOld_sf2', '1051_GeneralUserGS_sf2_file', '1060_Aspirin_sf2_file', '1060_Chaos_sf2_file', '1060_FluidR3_GM_sf2_file', '1060_GeneralUserGS_sf2_file', '1060_JCLive_sf2_file', + '1060_SBLive_sf2', '1060_SoundBlasterOld_sf2', '1061_FluidR3_GM_sf2_file', '1061_GeneralUserGS_sf2_file', '1061_SoundBlasterOld_sf2', '1070_Aspirin_sf2_file', '1070_Chaos_sf2_file', + '1070_FluidR3_GM_sf2_file', '1070_GeneralUserGS_sf2_file', '1070_JCLive_sf2_file', '1070_SBLive_sf2', '1070_SoundBlasterOld_sf2', '1071_FluidR3_GM_sf2_file', '1071_GeneralUserGS_sf2_file', + '1072_GeneralUserGS_sf2_file', '1073_GeneralUserGS_sf2_file', '1080_Aspirin_sf2_file', '1080_Chaos_sf2_file', '1080_FluidR3_GM_sf2_file', '1080_GeneralUserGS_sf2_file', '1080_JCLive_sf2_file', + '1080_SBLive_sf2', '1080_SoundBlasterOld_sf2', '1081_SoundBlasterOld_sf2', '1090_Aspirin_sf2_file', '1090_Chaos_sf2_file', '1090_FluidR3_GM_sf2_file', '1090_GeneralUserGS_sf2_file', + '1090_JCLive_sf2_file', '1090_SBLive_sf2', '1090_SoundBlasterOld_sf2', '1091_SoundBlasterOld_sf2', '1100_Aspirin_sf2_file', '1100_Chaos_sf2_file', '1100_FluidR3_GM_sf2_file', + '1100_GeneralUserGS_sf2_file', '1100_JCLive_sf2_file', '1100_SBLive_sf2', '1100_SoundBlasterOld_sf2', '1101_Aspirin_sf2_file', '1101_FluidR3_GM_sf2_file', '1101_GeneralUserGS_sf2_file', + '1102_GeneralUserGS_sf2_file', '1110_Aspirin_sf2_file', '1110_Chaos_sf2_file', '1110_FluidR3_GM_sf2_file', '1110_GeneralUserGS_sf2_file', '1110_JCLive_sf2_file', '1110_SBLive_sf2', + '1110_SoundBlasterOld_sf2', '1120_Aspirin_sf2_file', '1120_Chaos_sf2_file', '1120_FluidR3_GM_sf2_file', '1120_GeneralUserGS_sf2_file', '1120_JCLive_sf2_file', '1120_SBLive_sf2', + '1120_SoundBlasterOld_sf2', '1121_SoundBlasterOld_sf2', '1130_Aspirin_sf2_file', '1130_Chaos_sf2_file', '1130_FluidR3_GM_sf2_file', '1130_GeneralUserGS_sf2_file', '1130_JCLive_sf2_file', + '1130_SBLive_sf2', '1130_SoundBlasterOld_sf2', '1131_FluidR3_GM_sf2_file', '1131_SoundBlasterOld_sf2', '1140_Aspirin_sf2_file', '1140_Chaos_sf2_file', '1140_FluidR3_GM_sf2_file', + '1140_GeneralUserGS_sf2_file', '1140_JCLive_sf2_file', '1140_SBLive_sf2', '1140_SoundBlasterOld_sf2', '1141_FluidR3_GM_sf2_file', '1150_Aspirin_sf2_file', '1150_Chaos_sf2_file', + '1150_FluidR3_GM_sf2_file', '1150_GeneralUserGS_sf2_file', '1150_JCLive_sf2_file', '1150_SBLive_sf2', '1150_SoundBlasterOld_sf2', '1151_FluidR3_GM_sf2_file', '1151_GeneralUserGS_sf2_file', + '1152_FluidR3_GM_sf2_file', '1152_GeneralUserGS_sf2_file', '1160_Aspirin_sf2_file', '1160_Chaos_sf2_file', '1160_FluidR3_GM_sf2_file', '1160_GeneralUserGS_sf2_file', '1160_JCLive_sf2_file', + '1160_SBLive_sf2', '1160_SoundBlasterOld_sf2', '1161_FluidR3_GM_sf2_file', '1161_GeneralUserGS_sf2_file', '1161_SoundBlasterOld_sf2', '1162_FluidR3_GM_sf2_file', '1162_GeneralUserGS_sf2_file', + '1163_FluidR3_GM_sf2_file', '1170_Aspirin_sf2_file', '1170_Chaos_sf2_file', '1170_FluidR3_GM_sf2_file', '1170_GeneralUserGS_sf2_file', '1170_JCLive_sf2_file', '1170_SBLive_sf2', + '1170_SoundBlasterOld_sf2', '1171_FluidR3_GM_sf2_file', '1171_GeneralUserGS_sf2_file', '1172_FluidR3_GM_sf2_file', '1173_FluidR3_GM_sf2_file', '1180_Aspirin_sf2_file', '1180_Chaos_sf2_file', + '1180_FluidR3_GM_sf2_file', '1180_GeneralUserGS_sf2_file', '1180_JCLive_sf2_file', '1180_SBLive_sf2', '1180_SoundBlasterOld_sf2', '1181_FluidR3_GM_sf2_file', '1181_GeneralUserGS_sf2_file', + '1181_SoundBlasterOld_sf2', '1190_Aspirin_sf2_file', '1190_Chaos_sf2_file', '1190_FluidR3_GM_sf2_file', '1190_GeneralUserGS_sf2_file', '1190_JCLive_sf2_file', '1190_SBLive_sf2', + '1190_SoundBlasterOld_sf2', '1191_GeneralUserGS_sf2_file', '1192_GeneralUserGS_sf2_file', '1193_GeneralUserGS_sf2_file', '1194_GeneralUserGS_sf2_file', '1200_Aspirin_sf2_file', + '1200_Chaos_sf2_file', '1200_FluidR3_GM_sf2_file', '1200_GeneralUserGS_sf2_file', '1200_JCLive_sf2_file', '1200_SBLive_sf2', '1200_SoundBlasterOld_sf2', '1201_Aspirin_sf2_file', + '1201_GeneralUserGS_sf2_file', '1202_GeneralUserGS_sf2_file', '1210_Aspirin_sf2_file', '1210_Chaos_sf2_file', '1210_FluidR3_GM_sf2_file', '1210_GeneralUserGS_sf2_file', '1210_JCLive_sf2_file', + '1210_SBLive_sf2', '1210_SoundBlasterOld_sf2', '1211_Aspirin_sf2_file', '1211_GeneralUserGS_sf2_file', '1212_GeneralUserGS_sf2_file', '1220_Aspirin_sf2_file', '1220_Chaos_sf2_file', + '1220_FluidR3_GM_sf2_file', '1220_GeneralUserGS_sf2_file', '1220_JCLive_sf2_file', '1220_SBLive_sf2', '1220_SoundBlasterOld_sf2', '1221_Aspirin_sf2_file', '1221_GeneralUserGS_sf2_file', + '1221_JCLive_sf2_file', '1222_Aspirin_sf2_file', '1222_GeneralUserGS_sf2_file', '1223_Aspirin_sf2_file', '1223_GeneralUserGS_sf2_file', '1224_Aspirin_sf2_file', '1224_GeneralUserGS_sf2_file', + '1225_GeneralUserGS_sf2_file', '1226_GeneralUserGS_sf2_file', '1230_Aspirin_sf2_file', '1230_Chaos_sf2_file', '1230_FluidR3_GM_sf2_file', '1230_GeneralUserGS_sf2_file', '1230_JCLive_sf2_file', + '1230_SBLive_sf2', '1230_SoundBlasterOld_sf2', '1231_Aspirin_sf2_file', '1231_GeneralUserGS_sf2_file', '1232_Aspirin_sf2_file', '1232_GeneralUserGS_sf2_file', '1233_GeneralUserGS_sf2_file', + '1234_GeneralUserGS_sf2_file', '1240_Aspirin_sf2_file', '1240_Chaos_sf2_file', '1240_FluidR3_GM_sf2_file', '1240_GeneralUserGS_sf2_file', '1240_JCLive_sf2_file', '1240_SBLive_sf2', + '1240_SoundBlasterOld_sf2', '1241_Aspirin_sf2_file', '1241_GeneralUserGS_sf2_file', '1242_Aspirin_sf2_file', '1242_GeneralUserGS_sf2_file', '1243_Aspirin_sf2_file', '1243_GeneralUserGS_sf2_file', + '1244_Aspirin_sf2_file', '1244_GeneralUserGS_sf2_file', '1250_Aspirin_sf2_file', '1250_Chaos_sf2_file', '1250_FluidR3_GM_sf2_file', '1250_GeneralUserGS_sf2_file', '1250_JCLive_sf2_file', + '1250_SBLive_sf2', '1250_SoundBlasterOld_sf2', '1251_Aspirin_sf2_file', '1251_FluidR3_GM_sf2_file', '1251_GeneralUserGS_sf2_file', '1252_Aspirin_sf2_file', '1252_FluidR3_GM_sf2_file', + '1252_GeneralUserGS_sf2_file', '1253_Aspirin_sf2_file', '1253_GeneralUserGS_sf2_file', '1254_Aspirin_sf2_file', '1254_GeneralUserGS_sf2_file', '1255_Aspirin_sf2_file', + '1255_GeneralUserGS_sf2_file', '1256_Aspirin_sf2_file', '1256_GeneralUserGS_sf2_file', '1257_Aspirin_sf2_file', '1257_GeneralUserGS_sf2_file', '1258_Aspirin_sf2_file', + '1258_GeneralUserGS_sf2_file', '1259_GeneralUserGS_sf2_file', '1260_Aspirin_sf2_file', '1260_Chaos_sf2_file', '1260_FluidR3_GM_sf2_file', '1260_GeneralUserGS_sf2_file', '1260_JCLive_sf2_file', + '1260_SBLive_sf2', '1260_SoundBlasterOld_sf2', '1261_Aspirin_sf2_file', '1261_GeneralUserGS_sf2_file', '1262_Aspirin_sf2_file', '1262_GeneralUserGS_sf2_file', '1263_Aspirin_sf2_file', + '1263_GeneralUserGS_sf2_file', '1264_Aspirin_sf2_file', '1264_GeneralUserGS_sf2_file', '1265_Aspirin_sf2_file', '1265_GeneralUserGS_sf2_file', '1270_Aspirin_sf2_file', '1270_Chaos_sf2_file', + '1270_FluidR3_GM_sf2_file', '1270_GeneralUserGS_sf2_file', '1270_JCLive_sf2_file', '1270_SBLive_sf2', '1270_SoundBlasterOld_sf2', '1271_Aspirin_sf2_file', '1271_GeneralUserGS_sf2_file', + '1272_Aspirin_sf2_file', '1272_GeneralUserGS_sf2_file', '1273_GeneralUserGS_sf2_file', '1274_GeneralUserGS_sf2_file' + ]; + } + return this.instrumentKeyArray; + }; + ; + WebAudioFontLoader.prototype.instrumentInfo = function (n) { + var key = this.instrumentKeys()[n]; + var p = 1 * parseInt(key.substring(0, 3)); + return { + variable: '_tone_' + key, + url: 'https://surikov.github.io/webaudiofontdata/sound/' + key + '.js', + title: this.instrumentTitles()[p], + pitch: -1 + }; + }; + ; + WebAudioFontLoader.prototype.findInstrument = function (program) { + if (this.choosenInfos.length == 0) { + this.choosenInfos = [ + [1, 2] //Accoustic Grand Piano + , + [2, 14] //Bright Accoustic Piano + , + [3, 25] //Electric Grand Piano + , + [4, 37] //Honky-Tonk Piano + , + [5, 48] //Electric Pino 1 + , + [6, 58] //Electric Piano 2 + , + [7, 70] //HarpsiChord Piano + , + [8, 83] //Cravinet + , + [9, 91] //Celesta + , + [10, 99] //Glockenspiel + , + [11, 107] //Music Box + , + [12, 118] //Vibraphone + , + [13, 127] // Marimba + , + [14, 136] // Xylophone + , + [15, 144] // Tubular Bells + , + [16, 152] // Dulcimer + , + [17, 164] // Drawbar Organ + , + [18, 170] // Percussive Organ + , + [19, 183] //Rock Organ + , + [20, 194] // Church Organ + , + [21, 205] //Reed Organ + , + [22, 215] //Accordion + , + [23, 228] // + , + [24, 241] // + , + [25, 254] // + , + [26, 263] // + , + [27, 277] // + , + [28, 296] // + , + [29, 308] // + , + [30, 319] // + , + [31, 350] // + , + [32, 356] // + , + [33, 369] // + , + [34, 379] // + , + [35, 385] // + , + [36, 399] // Fretless Bass + , + [37, 403] // Slap Bass 1 + , + [38, 412] // Slap Bass 2 + , + [39, 421] // Synth Bass 1 + , + [40, 438] // Synth Bass 2 + , + [41, 452] // Violin + , + [42, 461] // Viola + , + [43, 467] // Cello + , + [44, 477] // Contrabass + , + [45, 488] // Tremolo Strings + , + [46, 493] // Pizzicato Strings + , + [47, 501] // Orchestral Harp + , + [48, 511] // Timpani + , + [49, 518] // String Ensemble 1 + , + [50, 547] //String Ensemble 2 + ]; + } + for (var i = 0; i < this.instrumentKeys().length; i++) { + if (program == 1 * parseInt(this.instrumentKeys()[i].substring(0, 3))) { + return i; + } + } + console.log('program', program, 'not found'); + return 0; + }; + ; + WebAudioFontLoader.prototype.drumTitles = function () { + if (this.drumNamesArray.length == 0) { + var drumNames = []; + drumNames[35] = "Bass Drum 2"; + drumNames[36] = "Bass Drum 1"; + drumNames[37] = "Side Stick/Rimshot"; + drumNames[38] = "Snare Drum 1"; + drumNames[39] = "Hand Clap"; + drumNames[40] = "Snare Drum 2"; + drumNames[41] = "Low Tom 2"; + drumNames[42] = "Closed Hi-hat"; + drumNames[43] = "Low Tom 1"; + drumNames[44] = "Pedal Hi-hat"; + drumNames[45] = "Mid Tom 2"; + drumNames[46] = "Open Hi-hat"; + drumNames[47] = "Mid Tom 1"; + drumNames[48] = "High Tom 2"; + drumNames[49] = "Crash Cymbal 1"; + drumNames[50] = "High Tom 1"; + drumNames[51] = "Ride Cymbal 1"; + drumNames[52] = "Chinese Cymbal"; + drumNames[53] = "Ride Bell"; + drumNames[54] = "Tambourine"; + drumNames[55] = "Splash Cymbal"; + drumNames[56] = "Cowbell"; + drumNames[57] = "Crash Cymbal 2"; + drumNames[58] = "Vibra Slap"; + drumNames[59] = "Ride Cymbal 2"; + drumNames[60] = "High Bongo"; + drumNames[61] = "Low Bongo"; + drumNames[62] = "Mute High Conga"; + drumNames[63] = "Open High Conga"; + drumNames[64] = "Low Conga"; + drumNames[65] = "High Timbale"; + drumNames[66] = "Low Timbale"; + drumNames[67] = "High Agogo"; + drumNames[68] = "Low Agogo"; + drumNames[69] = "Cabasa"; + drumNames[70] = "Maracas"; + drumNames[71] = "Short Whistle"; + drumNames[72] = "Long Whistle"; + drumNames[73] = "Short Guiro"; + drumNames[74] = "Long Guiro"; + drumNames[75] = "Claves"; + drumNames[76] = "High Wood Block"; + drumNames[77] = "Low Wood Block"; + drumNames[78] = "Mute Cuica"; + drumNames[79] = "Open Cuica"; + drumNames[80] = "Mute Triangle"; + drumNames[81] = "Open Triangle"; + this.drumNamesArray = drumNames; + } + return this.drumNamesArray; + }; + ; + WebAudioFontLoader.prototype.drumKeys = function () { + if (this.drumKeyArray.length == 0) { + this.drumKeyArray = [ + //'35_0_SBLive_sf2' + '35_0_Chaos_sf2_file', + '35_12_JCLive_sf2_file', '35_16_JCLive_sf2_file', '35_18_JCLive_sf2_file', '35_4_Chaos_sf2_file', '36_0_SBLive_sf2', '36_12_JCLive_sf2_file', '36_16_JCLive_sf2_file', '36_18_JCLive_sf2_file', + '36_4_Chaos_sf2_file', '37_0_SBLive_sf2', '37_12_JCLive_sf2_file', '37_16_JCLive_sf2_file', '37_18_JCLive_sf2_file', '37_4_Chaos_sf2_file', '38_0_SBLive_sf2', '38_12_JCLive_sf2_file', + '38_16_JCLive_sf2_file', '38_18_JCLive_sf2_file', '38_4_Chaos_sf2_file', '39_0_SBLive_sf2', '39_12_JCLive_sf2_file', '39_16_JCLive_sf2_file', '39_18_JCLive_sf2_file', '39_4_Chaos_sf2_file', + '40_0_SBLive_sf2', '40_12_JCLive_sf2_file', '40_16_JCLive_sf2_file', '40_18_JCLive_sf2_file', '40_4_Chaos_sf2_file', '41_0_SBLive_sf2', '41_12_JCLive_sf2_file', '41_16_JCLive_sf2_file', + '41_18_JCLive_sf2_file', '41_4_Chaos_sf2_file', '42_0_SBLive_sf2', '42_12_JCLive_sf2_file', '42_16_JCLive_sf2_file', '42_18_JCLive_sf2_file', '42_4_Chaos_sf2_file', '43_0_SBLive_sf2', + '43_12_JCLive_sf2_file', '43_16_JCLive_sf2_file', '43_18_JCLive_sf2_file', '43_4_Chaos_sf2_file', '44_0_SBLive_sf2', '44_12_JCLive_sf2_file', '44_16_JCLive_sf2_file', '44_18_JCLive_sf2_file', + '44_4_Chaos_sf2_file', '45_0_SBLive_sf2', '45_12_JCLive_sf2_file', '45_16_JCLive_sf2_file', '45_18_JCLive_sf2_file', '45_4_Chaos_sf2_file', '46_0_SBLive_sf2', '46_12_JCLive_sf2_file', + '46_16_JCLive_sf2_file', '46_18_JCLive_sf2_file', '46_4_Chaos_sf2_file', '47_0_SBLive_sf2', '47_12_JCLive_sf2_file', '47_16_JCLive_sf2_file', '47_18_JCLive_sf2_file', '47_4_Chaos_sf2_file', + '48_0_SBLive_sf2', '48_12_JCLive_sf2_file', '48_16_JCLive_sf2_file', '48_18_JCLive_sf2_file', '48_4_Chaos_sf2_file', '49_0_SBLive_sf2', '49_12_JCLive_sf2_file', '49_16_JCLive_sf2_file', + '49_18_JCLive_sf2_file', '49_4_Chaos_sf2_file', '50_0_SBLive_sf2', '50_12_JCLive_sf2_file', '50_16_JCLive_sf2_file', '50_18_JCLive_sf2_file', '50_4_Chaos_sf2_file', '51_0_SBLive_sf2', + '51_12_JCLive_sf2_file', '51_16_JCLive_sf2_file', '51_18_JCLive_sf2_file', '51_4_Chaos_sf2_file', '52_0_SBLive_sf2', '52_12_JCLive_sf2_file', '52_16_JCLive_sf2_file', '52_18_JCLive_sf2_file', + '52_4_Chaos_sf2_file', '53_0_SBLive_sf2', '53_12_JCLive_sf2_file', '53_16_JCLive_sf2_file', '53_18_JCLive_sf2_file', '53_4_Chaos_sf2_file', '54_0_SBLive_sf2', '54_12_JCLive_sf2_file', + '54_16_JCLive_sf2_file', '54_18_JCLive_sf2_file', '54_4_Chaos_sf2_file', '55_0_SBLive_sf2', '55_12_JCLive_sf2_file', '55_16_JCLive_sf2_file', '55_18_JCLive_sf2_file', '55_4_Chaos_sf2_file', + '56_0_SBLive_sf2', '56_12_JCLive_sf2_file', '56_16_JCLive_sf2_file', '56_18_JCLive_sf2_file', '56_4_Chaos_sf2_file', '57_0_SBLive_sf2', '57_12_JCLive_sf2_file', '57_16_JCLive_sf2_file', + '57_18_JCLive_sf2_file', '57_4_Chaos_sf2_file', '58_0_SBLive_sf2', '58_12_JCLive_sf2_file', '58_16_JCLive_sf2_file', '58_18_JCLive_sf2_file', '58_4_Chaos_sf2_file', '59_0_SBLive_sf2', + '59_12_JCLive_sf2_file', '59_16_JCLive_sf2_file', '59_18_JCLive_sf2_file', '59_4_Chaos_sf2_file', '60_0_SBLive_sf2', '60_12_JCLive_sf2_file', '60_16_JCLive_sf2_file', '60_18_JCLive_sf2_file', + '60_4_Chaos_sf2_file', '61_0_SBLive_sf2', '61_12_JCLive_sf2_file', '61_16_JCLive_sf2_file', '61_18_JCLive_sf2_file', '61_4_Chaos_sf2_file', '62_0_SBLive_sf2', '62_12_JCLive_sf2_file', + '62_16_JCLive_sf2_file', '62_18_JCLive_sf2_file', '62_4_Chaos_sf2_file', '63_0_SBLive_sf2', '63_12_JCLive_sf2_file', '63_16_JCLive_sf2_file', '63_18_JCLive_sf2_file', '63_4_Chaos_sf2_file', + '64_0_SBLive_sf2', '64_12_JCLive_sf2_file', '64_16_JCLive_sf2_file', '64_18_JCLive_sf2_file', '64_4_Chaos_sf2_file', '65_0_SBLive_sf2', '65_12_JCLive_sf2_file', '65_16_JCLive_sf2_file', + '65_18_JCLive_sf2_file', '65_4_Chaos_sf2_file', '66_0_SBLive_sf2', '66_12_JCLive_sf2_file', '66_16_JCLive_sf2_file', '66_18_JCLive_sf2_file', '66_4_Chaos_sf2_file', '67_0_SBLive_sf2', + '67_12_JCLive_sf2_file', '67_16_JCLive_sf2_file', '67_18_JCLive_sf2_file', '67_4_Chaos_sf2_file', '68_0_SBLive_sf2', '68_12_JCLive_sf2_file', '68_16_JCLive_sf2_file', '68_18_JCLive_sf2_file', + '68_4_Chaos_sf2_file', '69_0_SBLive_sf2', '69_12_JCLive_sf2_file', '69_16_JCLive_sf2_file', '69_18_JCLive_sf2_file', '69_4_Chaos_sf2_file', '70_0_SBLive_sf2', '70_12_JCLive_sf2_file', + '70_16_JCLive_sf2_file', '70_18_JCLive_sf2_file', '70_4_Chaos_sf2_file', '71_0_SBLive_sf2', '71_12_JCLive_sf2_file', '71_16_JCLive_sf2_file', '71_18_JCLive_sf2_file', '71_4_Chaos_sf2_file', + '72_0_SBLive_sf2', '72_12_JCLive_sf2_file', '72_16_JCLive_sf2_file', '72_18_JCLive_sf2_file', '72_4_Chaos_sf2_file', '73_0_SBLive_sf2', '73_12_JCLive_sf2_file', '73_16_JCLive_sf2_file', + '73_18_JCLive_sf2_file', '73_4_Chaos_sf2_file', '74_0_SBLive_sf2', '74_12_JCLive_sf2_file', '74_16_JCLive_sf2_file', '74_18_JCLive_sf2_file', '74_4_Chaos_sf2_file', '75_0_SBLive_sf2', + '75_12_JCLive_sf2_file', '75_16_JCLive_sf2_file', '75_18_JCLive_sf2_file', '75_4_Chaos_sf2_file', '76_0_SBLive_sf2', '76_12_JCLive_sf2_file', '76_16_JCLive_sf2_file', '76_18_JCLive_sf2_file', + '76_4_Chaos_sf2_file', '77_0_SBLive_sf2', '77_12_JCLive_sf2_file', '77_16_JCLive_sf2_file', '77_18_JCLive_sf2_file', '77_4_Chaos_sf2_file', '78_0_SBLive_sf2', '78_12_JCLive_sf2_file', + '78_16_JCLive_sf2_file', '78_18_JCLive_sf2_file', '78_4_Chaos_sf2_file', '79_0_SBLive_sf2', '79_12_JCLive_sf2_file', '79_16_JCLive_sf2_file', '79_18_JCLive_sf2_file', '79_4_Chaos_sf2_file', + '80_0_SBLive_sf2', '80_12_JCLive_sf2_file', '80_16_JCLive_sf2_file', '80_18_JCLive_sf2_file', '80_4_Chaos_sf2_file', '81_0_SBLive_sf2', '81_12_JCLive_sf2_file', '81_16_JCLive_sf2_file', + '81_18_JCLive_sf2_file', '81_4_Chaos_sf2_file' + ]; + } + return this.drumKeyArray; + }; + ; + WebAudioFontLoader.prototype.drumInfo = function (n) { + var key = this.drumKeys()[n]; + var p = 1 * parseInt(key.substring(0, 2)); + return { + variable: '_drum_' + key, + url: 'https://surikov.github.io/webaudiofontdata/sound/128' + key + '.js', + pitch: p, + title: this.drumTitles()[p] + }; + }; + ; + WebAudioFontLoader.prototype.findDrum = function (nn) { + for (var i = 0; i < this.drumKeys().length; i++) { + if (nn == 1 * parseInt(this.drumKeys()[i].substring(0, 2))) { + return i; + } + } + return 0; + }; + return WebAudioFontLoader; +}()); +console.log('WebAudioFont Engine v3.0.04 GPL3'); +//docs +//npm link typescript +//npx typedoc player.ts otypes.ts channel.ts loader.ts reverberator.ts ticker.ts +var WebAudioFontPlayer = /** @class */ (function () { + function WebAudioFontPlayer() { + this.envelopes = []; + this.loader = new WebAudioFontLoader(this); + //onCacheFinish = null; + //onCacheProgress = null; + this.afterTime = 0.05; + this.nearZero = 0.000001; + this.adjustPreset = function (audioContext, preset) { + for (var i = 0; i < preset.zones.length; i++) { + this.adjustZone(audioContext, preset.zones[i]); + } + }; + this.adjustZone = function (audioContext, zone) { + if (zone.buffer) { + // + } + else { + zone.delay = 0; + if (zone.sample) { + var decoded = atob(zone.sample); + zone.buffer = audioContext.createBuffer(1, decoded.length / 2, zone.sampleRate); + var float32Array = zone.buffer.getChannelData(0); + var b1, b2, n; + for (var i = 0; i < decoded.length / 2; i++) { + b1 = decoded.charCodeAt(i * 2); + b2 = decoded.charCodeAt(i * 2 + 1); + if (b1 < 0) { + b1 = 256 + b1; + } + if (b2 < 0) { + b2 = 256 + b2; + } + n = b2 * 256 + b1; + if (n >= 65536 / 2) { + n = n - 65536; + } + float32Array[i] = n / 65536.0; + } + } + else { + if (zone.file) { + var datalen = zone.file.length; + var arraybuffer = new ArrayBuffer(datalen); + var view = new Uint8Array(arraybuffer); + var decoded = atob(zone.file); + var b; + for (var i = 0; i < decoded.length; i++) { + b = decoded.charCodeAt(i); + view[i] = b; + } + audioContext.decodeAudioData(arraybuffer, function (audioBuffer) { + zone.buffer = audioBuffer; + }); + } + } + zone.loopStart = this.numValue(zone.loopStart, 0); + zone.loopEnd = this.numValue(zone.loopEnd, 0); + zone.coarseTune = this.numValue(zone.coarseTune, 0); + zone.fineTune = this.numValue(zone.fineTune, 0); + zone.originalPitch = this.numValue(zone.originalPitch, 6000); + zone.sampleRate = this.numValue(zone.sampleRate, 44100); + zone.sustain = this.numValue(zone.originalPitch, 0); + } + }; + } + WebAudioFontPlayer.prototype.createChannel = function (audioContext) { + return new WebAudioFontChannel(audioContext); + }; + ; + WebAudioFontPlayer.prototype.createReverberator = function (audioContext) { + return new WebAudioFontReverberator(audioContext); + }; + ; + WebAudioFontPlayer.prototype.limitVolume = function (volume) { + if (volume) { + volume = 1.0 * volume; + } + else { + volume = 0.5; + } + return volume; + }; + ; + WebAudioFontPlayer.prototype.queueChord = function (audioContext, target, preset, when, pitches, duration, volume, slides) { + volume = this.limitVolume(volume); + var envelopes = []; + for (var i = 0; i < pitches.length; i++) { + var singleSlide = undefined; + if (slides) { + singleSlide = slides[i]; + } + var envlp = this.queueWaveTable(audioContext, target, preset, when, pitches[i], duration, volume - Math.random() * 0.01, singleSlide); + if (envlp) + envelopes.push(envlp); + } + return envelopes; + }; + ; + WebAudioFontPlayer.prototype.queueStrumUp = function (audioContext, target, preset, when, pitches, duration, volume, slides) { + pitches.sort(function (a, b) { + return b - a; + }); + return this.queueStrum(audioContext, target, preset, when, pitches, duration, volume, slides); + }; + ; + WebAudioFontPlayer.prototype.queueStrumDown = function (audioContext, target, preset, when, pitches, duration, volume, slides) { + pitches.sort(function (a, b) { + return a - b; + }); + return this.queueStrum(audioContext, target, preset, when, pitches, duration, volume, slides); + }; + ; + WebAudioFontPlayer.prototype.queueStrum = function (audioContext, target, preset, when, pitches, duration, volume, slides) { + volume = this.limitVolume(volume); + if (when < audioContext.currentTime) { + when = audioContext.currentTime; + } + var envelopes = []; + for (var i = 0; i < pitches.length; i++) { + var singleSlide = undefined; + if (slides) { + singleSlide = slides[i]; + } + var envlp = this.queueWaveTable(audioContext, target, preset, when + i * 0.01, pitches[i], duration, volume - Math.random() * 0.01, singleSlide); + if (envlp) + envelopes.push(envlp); + volume = 0.9 * volume; + } + return envelopes; + }; + ; + WebAudioFontPlayer.prototype.queueSnap = function (audioContext, target, preset, when, pitches, duration, volume, slides) { + volume = this.limitVolume(volume); + volume = 1.5 * (volume || 1.0); + duration = 0.05; + return this.queueChord(audioContext, target, preset, when, pitches, duration, volume, slides); + }; + ; + WebAudioFontPlayer.prototype.resumeContext = function (audioContext) { + try { + if (audioContext.state == 'suspended') { + console.log('audioContext.resume', audioContext); + audioContext.resume(); + } + } + catch (e) { + //don't care + } + }; + WebAudioFontPlayer.prototype.queueWaveTable = function (audioContext, target, preset, when, pitch, duration, volume, slides) { + this.resumeContext(audioContext); + volume = this.limitVolume(volume); + var zone = this.findZone(audioContext, preset, pitch); + if (zone) { + if (!(zone.buffer)) { + console.log('empty buffer ', zone); + return null; + } + var baseDetune = zone.originalPitch - 100.0 * zone.coarseTune - zone.fineTune; + var playbackRate = 1.0 * Math.pow(2, (100.0 * pitch - baseDetune) / 1200.0); + var startWhen = when; + if (startWhen < audioContext.currentTime) { + startWhen = audioContext.currentTime; + } + var waveDuration = duration + this.afterTime; + var loop = true; + if (zone.loopStart < 1 || zone.loopStart >= zone.loopEnd) { + loop = false; + } + if (!loop) { + if (waveDuration > zone.buffer.duration / playbackRate) { + waveDuration = zone.buffer.duration / playbackRate; + } + } + var envelope = this.findEnvelope(audioContext, target); + this.setupEnvelope(audioContext, envelope, zone, volume, startWhen, waveDuration, duration); + envelope.audioBufferSourceNode = audioContext.createBufferSource(); + envelope.audioBufferSourceNode.playbackRate.setValueAtTime(playbackRate, 0); + if (slides) { + if (slides.length > 0) { + envelope.audioBufferSourceNode.playbackRate.setValueAtTime(playbackRate, when); + for (var i = 0; i < slides.length; i++) { + var nextPitch = pitch + slides[i].delta; + var newPlaybackRate = 1.0 * Math.pow(2, (100.0 * nextPitch - baseDetune) / 1200.0); + var newWhen = when + slides[i].when; + envelope.audioBufferSourceNode.playbackRate.linearRampToValueAtTime(newPlaybackRate, newWhen); + } + } + } + envelope.audioBufferSourceNode.buffer = zone.buffer; + if (loop) { + envelope.audioBufferSourceNode.loop = true; + envelope.audioBufferSourceNode.loopStart = zone.loopStart / zone.sampleRate + ((zone.delay) ? zone.delay : 0); + envelope.audioBufferSourceNode.loopEnd = zone.loopEnd / zone.sampleRate + ((zone.delay) ? zone.delay : 0); + } + else { + envelope.audioBufferSourceNode.loop = false; + } + envelope.audioBufferSourceNode.connect(envelope); + envelope.audioBufferSourceNode.start(startWhen, zone.delay); + envelope.audioBufferSourceNode.stop(startWhen + waveDuration); + envelope.when = startWhen; + envelope.duration = waveDuration; + envelope.pitch = pitch; + envelope.preset = preset; + return envelope; + } + else { + return null; + } + }; + ; + WebAudioFontPlayer.prototype.noZeroVolume = function (n) { + if (n > this.nearZero) { + return n; + } + else { + return this.nearZero; + } + }; + ; + WebAudioFontPlayer.prototype.setupEnvelope = function (audioContext, envelope, zone, volume, when, sampleDuration, noteDuration) { + envelope.gain.setValueAtTime(this.noZeroVolume(0), audioContext.currentTime); + var lastTime = 0; + var lastVolume = 0; + var duration = noteDuration; + var zoneahdsr = zone.ahdsr; + if (sampleDuration < duration + this.afterTime) { + duration = sampleDuration - this.afterTime; + } + if (zoneahdsr) { + if (!(zoneahdsr.length > 0)) { + zoneahdsr = [{ + duration: 0, + volume: 1 + }, { + duration: 0.5, + volume: 1 + }, { + duration: 1.5, + volume: 0.5 + }, { + duration: 3, + volume: 0 + } + ]; + } + } + else { + zoneahdsr = [{ + duration: 0, + volume: 1 + }, { + duration: duration, + volume: 1 + } + ]; + } + var ahdsr = zoneahdsr; + envelope.gain.cancelScheduledValues(when); + envelope.gain.setValueAtTime(this.noZeroVolume(ahdsr[0].volume * volume), when); + for (var i = 0; i < ahdsr.length; i++) { + if (ahdsr[i].duration > 0) { + if (ahdsr[i].duration + lastTime > duration) { + var r = 1 - (ahdsr[i].duration + lastTime - duration) / ahdsr[i].duration; + var n = lastVolume - r * (lastVolume - ahdsr[i].volume); + envelope.gain.linearRampToValueAtTime(this.noZeroVolume(volume * n), when + duration); + break; + } + lastTime = lastTime + ahdsr[i].duration; + lastVolume = ahdsr[i].volume; + envelope.gain.linearRampToValueAtTime(this.noZeroVolume(volume * lastVolume), when + lastTime); + } + } + envelope.gain.linearRampToValueAtTime(this.noZeroVolume(0), when + duration + this.afterTime); + }; + ; + WebAudioFontPlayer.prototype.numValue = function (aValue, defValue) { + if (typeof aValue === "number") { + return aValue; + } + else { + return defValue; + } + }; + ; + WebAudioFontPlayer.prototype.findEnvelope = function (audioContext, target) { + var envelope = null; + for (var i = 0; i < this.envelopes.length; i++) { + var e = this.envelopes[i]; + if (e.target == target && audioContext.currentTime > e.when + e.duration + 0.001) { + try { + if (e.audioBufferSourceNode) { + e.audioBufferSourceNode.disconnect(); + e.audioBufferSourceNode.stop(0); + e.audioBufferSourceNode = null; + } + } + catch (x) { + //audioBufferSourceNode is dead already + } + envelope = e; + break; + } + } + if (!(envelope)) { + envelope = audioContext.createGain(); + envelope.target = target; + envelope.connect(target); + envelope.cancel = function () { + if (envelope && (envelope.when + envelope.duration > audioContext.currentTime)) { + envelope.gain.cancelScheduledValues(0); + envelope.gain.setTargetAtTime(0.00001, audioContext.currentTime, 0.1); + envelope.when = audioContext.currentTime + 0.00001; + envelope.duration = 0; + } + }; + this.envelopes.push(envelope); + } + return envelope; + }; + ; + WebAudioFontPlayer.prototype.findZone = function (audioContext, preset, pitch) { + var zone = null; + for (var i = preset.zones.length - 1; i >= 0; i--) { + zone = preset.zones[i]; + if (zone.keyRangeLow <= pitch && zone.keyRangeHigh + 1 >= pitch) { + break; + } + } + try { + if (zone) + this.adjustZone(audioContext, zone); + } + catch (ex) { + console.log('adjustZone', ex); + } + return zone; + }; + ; + WebAudioFontPlayer.prototype.cancelQueue = function (audioContext) { + for (var i = 0; i < this.envelopes.length; i++) { + var e = this.envelopes[i]; + e.gain.cancelScheduledValues(0); + e.gain.setValueAtTime(this.nearZero, audioContext.currentTime); + e.when = -1; + try { + if (e.audioBufferSourceNode) + e.audioBufferSourceNode.disconnect(); + } + catch (ex) { + console.log(ex); + } + } + }; + ; + return WebAudioFontPlayer; +}()); +var WebAudioFontReverberator = /** @class */ (function () { + function WebAudioFontReverberator(audioContext) { + this.irr = "//uQZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAABEAABwpgADBwsLDxISFhoaHiEhJSkpLTAwNDg4PEBDQ0dLS09SUlZaWl5hYWVpaW1wcHR4eHyAg4OHi4uPkpKWmpqeoaGlqamtsLC0uLi8wMPDx8vLz9LS1tra3uHh5enp7fDw9Pj4/P8AAAA5TEFNRTMuOTlyAaoAAAAAAAAAABSAJAakTgAAgAAAcKbsxJsOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//uQZAAAA2dJS0UMwAAt4AgdoIgAk1mNc/j0ABjDACR3ACACkAAAAX0TrnHAwMDAxbuBhBDLPTu0yBAgQAAAABBC77RERF3d3d3cR//EQTT3xH/8QYQIEI8RERERF2ene/2QIRH/smAAggQIECBBC7PJkyZNO4jP/3sgQQz3fgmTB/ygIAgD5//z638HwfB8P6wSba2gVAkg+UISjnSgflw+uIAQ//h/4P///BD/B//BD///lwfB8H4Pg+H5QEHQJMHQFIGMGMPBYMxULDajyWWA98l3EgFJQsWtLCYHI/LYry5k4DJ4NyjQHGmhGEACgghURgaiogHEBGEaOIwRCJmIoeg2PdCBMH+4oKoRPGeO0EIRDx10jitDKJFncRhznJBBBcEB201J6PVMf0lc/e7p8PKLBkW/2IjGCmt+L2JodbFLjR///0/90QUZJqvd5ZKLF6gw5cRkCgWgQUSgUAUNhBEBEEAR7W7L4qKee/7/TSj12/FtD//lLq//6lsATfqd/R//kv/6RVXEhAAAAAAxP2MVw9g6BYSGDNKJKnMR//uSZAsCA/o0Wuc9gAAsAAjN4IgAkTT9Z4wwzci4AGM0EIgC5hGEuDwNJzHWENh1S+qjMjtHJNKBIgQyXA8KyCvs849b2WVjq+6+78NdfVo1x2rfmrtndajli+/a12Imp2tb1Yteb31j6zkADCZUocA4OndwPkw6tATVGnlgd6AEBlV7q7Tq1xs9DR1aJRXLQ5BAkSA4/KoEsCemSYpf7P/9W6depQY/sfrvXT7P///ijl0zakMGyIioAABAAFtVWgXrka2CEq7WCW2dO4yxxWuv5GPjJrcMDMSjMOC4niMx8UlYoPHgjjxdBwe1JYVnT9ljj1jAvpTstWQlyon1TnaFRaDsgSGJnKdzdbrkUUckcfMOropml5r9koqs853K6/2dpiFEbXt95Wt2BUuNHJMIXxJrnew/jbRxNl38sr31cSUtklEkkoZBISUsEEeC+1Bati36e13/FSao3+1P/7b+v+3//19CUrEYUW1zUCcggwEQAAAAAAAZDSCNhwAWStQZfTuJKrkYrTcUrWgTAsYVNMAyKCRRCHxouEIMPqRITP/7kmQYggQFQtp56RviLQ2YYQAj6A7xcWunpG9IugAjdBCJuth9eOm9jFSbST3tk2tkkZotYIcXjBIUhPxFquCAdgIQOiAwFBSn6Ry4ZUazQjViy9eGzqxUiAH3I7yn9ORQSinc4OVff39/5OfT33bGffPoQfl///z/nWP0MGnoS5n5kiH3P///18//i523XpDIW9WhsgEFWFK6BDUEJIMUQABAABUxml8ISeWiFtY9BroaTJqShBPhBLxwUicTCttwwJhk0wZKPFjA8YEzV+HVdSmrtwQXS+RgII2qkDaVCu8XEuCooHhRZOx8UUWTvVZbuc4V13uSQuLlN0sbP8qdh+cYnYVDPil87lSuR9XnYPvZpXycblKLLYI7JbGiUKXJLM3XCzRTtQ5Xt/tcvrb5ec/3/3fQ/vc7Zq/+SqFzkxC6GCgQRaAAAAAAAAC6ZwiCbFsCRjdPw9S8F9MFWF7NGM/RqGrKLRrUdSI1oJhQskiDCF59osRh6TKI++W1NiDaTdybE67w/ZRu4LVp2LRSNzvj64mV+vSevU4aHkGVuHH/+5JkLYYDwTBaaek0UCugCN0EIm6O8SNnp5hXANE2YnQQCsizCRhUwRg8Wiolp0pYyYc7fUpZCHCFABsNLqGCllFtsAkltRJQXIKePR6HNWTxpAY1z/SowC4a9tX9n/v/9eln//3dvoUyNyBDEEgAOrgJeJgLoN0eY8EMLFCCFpzRFMCPfGGXgwlk6EIukkKfvmuCpokSeC/UwUeiTCcssHvJKYs0CJzRQU2Iczn8ySre0MZpYm2EFoctZRu93Rr8jIrTOZt0ttVVRPUmkna86OOWLNJMZ0qe5Cy7gfcil6o81NoGoGAtuAzIAHI/z/5zmX6//2T/7/+lv/evf/rr/9f3//////7pddrIiarIppXZFVBJEFGGRcSASQQAAAXOuxfD4RJLCxn0bpcnR6nojI7SlFhSPWdNN6IUCAnIDTbTOxkRZxIiRSJ2dWFIkIcuqqFoQgLYINabOqqQvlchYUZzIJfjJwkVLoVI0mU+Wc6pIX1+h+H9vPekFJV7AmbX1hEWcSWAWx7Wl1hwNKootGgllFYRKCrvKMToQlyoxf7v//uSZESCg7JK2unmHEAoIBjdBCIAj9kpY6wwscC2teJ0EApZ7f//Zv9NOm39Stjrkf/+jelUxafAEABIAAADmmVxZdZgI5yuUu1TTjqyp93+kbww9LYxAj4vsue9w5DdWP5qtbFJfKq84SpDKyP2+ePkJtfjiG1AhKrFeCOOaLoa6zWYLbXapoFzz5wu/Goo4f7af1VqpSkBBtEje7rQmr3u3+16xUScWWsOvFAXIlNKDRaL024v9QAgAGZAA///8v/6fp7a+9f//1/9V//T//////9P095kVmQ5LI2pHBEIkMpxil2EogAkAAAF7xSBEpDUlEX4Ww6GQhhpHbKbjIftHBkVkNXPEg4K6hlpFE0SZeSHUQlPb2TXhK4lXUTZA5rRSpJnn7GhkapTJYRR/n7vv5wtlyM7/jMi9X9p/3lNMyzDNUSJJASmr4o9w76CROqQSQRtuUIEgIXaofXpRtXz3z//TUR/++mX/Xqiq+z//9tvIGyGdGCdDB5KkwIsAAqUn5dh6zTShOTYIQFwS9KIM1EpqagHE5tQsVZROYKoi//7kmReAuNgSdrp5hywKsAIvQQibo18kWenpG2AxLZhQACn2JxSDSGJE+di2OqeMOtOozWUcGOq0umKIZyHQNgoDxkSNeoEAaIgEJkmBk6I4YApLiMABsJ6qFDxjQcRCB0JupTklK5L31dPdfNylfbX3MiJmnRCyLPuzpy0f//yn/X9f1PK9S9xdeVuUtSG8dVG6TRpFHisMWpbqYAEEAAAAAEqeAFUYSFJwAYL4Hs8i3xzuI22opUlgKBOxUXIamFCzqCFgTQ0c42ZIAmJ05gi1Z5Jy9J2saT0o7UxQyorZOjMw024vyBEFgiXBgwHUEZWYPQIm6IAsfMAadOjD4tkVqoFGftHtAFAFFFoiAAH5f5/5/3/v/2//p/9P/9/6/1/X+/7d/////9192fUXbemQ6mYE6ECqSIYfgAAAKmdiumKEeMgxAwiWDu2fBMCpNWG1Dm2Fyc8VAwOzMhAHjAZcP6uRkDBExIdRQZWZQ4ZYhz2PXnS+NXCZdtGR4SIkFmgTEIpoKFyGjmTpJDhEi5QLBpe1whiUBIeLDCFSA86pDn/+5JkgwLzXifY6elEsDLteI0EAsBNwN9jR6RvgL014UAAo9no+PXaTiRcP/8vZ86WQskbBOS9RazO6B//1+zn9vX8JR8tXJiJUQ58jEcwZDKqCIQSTicIhzCRVQAAACpXpGjHCEG+Os1BcEChAgNxwn441Z0U4XVDeRNTSJBdwBTRLMJgndsLnKxGe/5o3Vdw2UdCJyp8Ol7QzKfc+JmufvlfvD7SLQ3ORPmf8ciLQtDE1Md3FbhmSVvy/9c/9zgYmIM0QaowA2wowDIAE+vz16/1/y//9f/1//f/Wq6/on//v/////0r1UjK16O5EodhERFypEkQKQwxUSIIACnWwTkGMQYvZXAYhYDTuTiQWAvhmJqdhiMqsTsj1huzriNFfCeTgYmBktVQYndws7D3lAptDKzG31lurkvdhitcK6TPZWBumim+KKkm9NmZpEs9NVBLR5at1sWQpXhO30fWhC21ezWZLNQVqxX/vNbp6aSI9Cu1UfqjMPvSRfZNXXm//7dP2ds/ecfD7c7JffJaD6N6J945RAo18w0KTGWAAAEA//uSZKQC41xb2lHmHCQ1bYidBAXCDgWFZUeYVNDKteFAARvZAAABvMxbxHQUAJtHhIU+OUZo6h1KYhaPaWlXpBD0c2u2ZVrlXVb1RHfMqZUjCiG4/WJdP2PMEkWTE5qaI6wIkkhZzknVbJoybcO9TjnVnoyl+czMK183M7IVHc23bxZoYUBxJlgkcUSLhISo/+epZWXU9w5Uf/o6zKu+OA3sq5ST2LZH6//zZb5695L2y2jduavUsYnfsLMtT2U9tBx6eYAgAAABTlWA7DOQoCcBesBKBBx6yxFAkDYMxhJwvH6oniCTx2QqHo1LyxKg8LBGLwkKl5AO/cgtuwOF1yiVpmk9G6+ijijETSl1XzXmTwJrZGou9j9sTiRpmHC9NSHCoCaXCZUvH2pe707OWIqK08p+PxtqLxEQALXkvPWVKv69a//1//T//k/6cn///32///////6U/Zx1doZ9lBs4tHFLEMGKwAAAAAApyyRFJqJlvMiXD6GiGbZ2sW2WrScZ54YbSFuW7DPhRCdn9icWB3qOBgRl8KoTkq1f8vKiDf/7kmTBAgOjPNhp5hYwL42oUAAm9g4IwV+nsM8AzTTidBALAfFDzxydGnp6gkKSQOLtjl8ycZ2lGzyc4ZGdX+Mza/ddJL1ml7+YzN/rVimnNZm3d8X3KrfvwZcbFapwBWGjJ2upaAIiSRljH/z//7KG/WZ7hYIMrJzI2ZS30Wi//////z99T38tX+U6uQ2Di4Qc8y4IGUUckefYGukEgBAAAEpzEozOlLeHX3Umjy/rMo2IZWHUYHofnVAVquZLELywqifBl8f1lpsgagQJmgvI2B1pWQF0bZUPMEqxCmA/SjXJqW6esSUdJYQfQEZtfUpDFFbpnM41EIZKgUDFIBGkG1OXfXic24JixyoLcJCgXajYYVkAjL7nXl6+v9n//p/9On/20/p1///p/3//+//9v//ecuStKMZmZTqoKU6ugMqagAEAAAAp1eI6VRd+2pqHozwSzd7VSvS3dtaZfq62TtnpPK4S6RUNebJz5QeIvMSMrJJxCZcb7WGWULkT5281aFdq7oVj1FlAJREJi0hAgTwyI9klY9csIHDo5ISw5m3/+5Jk3AAEC0xXUww0NDDtmGAAJugOTRFnrDBpkM+2InQQCwC2fjcY6xYzp5wGsqSWDSTyVgwSH/CoUYYbOEMRH/yoGAABB/P//9f/0nZUpr0v669N1IjI9CUSzn8rI79E///erVNuj2mY6PcSYe4Ys5hxQ4OHiBVDokIggsOQC4CUFTHBER4sBQ43gzETOFA0Q1il0kmVYk9FRIkiwShxQesI1BYzYYClDjNDVE6zWG7Po8DUHRb5dMkoXEcaywWPmg7BWXz8sgbTFF5GTnxIKxoORmuaJJbHyhiyyoerUu3K7h/GuuVaQ4zGcZ7D1/iBqGKDtfMFCX6EUqdLwbsu8gBEOKjiI9StJVBdbqPkmhEQRhwOCRogEZcjvuv1wlR/kdfL//+P675fz/vX//Of//638/7//6//ZUd+tnalCIdVdbiTRgeugAAAAAAGZaKpzg828FmsaNdTII7oRJOqQSo1hbLQRd7mhF8VivXFl8tNYC8aQltXbPVMIBfGfgZnCdbWn5h9Tt+WVOfUIJkPzKC8JbAnqzwmgwlc2ZF5q92y//uSZO6CA+1E11MMG+Q8LZhoBAVuEkjtUEyweNDbNKK0EIr7ZhxIVVnEQQ9AHJ2JIAhoFEKN5/IiIRhQGBCGToxpkWAhhAcJipyM9QXWAEDmZ784Lvlnek1dokkjbbbdYIBBSjzpPTrLJIk/3L/myLM//r/r9v/+v///vb+Siev7dNE7fquiN3ZK2ua1jUSqwQMeGaAFKXwsNB8CjJdJ9oByKQoICFSGIlpMvIzlgbmKKKFP/GnXjbUlb2vM0ayzmHmIL8guZX/DF0exgLyQUStQvxtNEpG4e6VCtWx+mZNeZTPlJxPDZASWl321kPpYnG9dee1Ia/kFKUzQXCIWJ2cCBNKy3qmYhW0B0aVJA+FjI6JSrwV2/qU1b+2OD7CSmlDHT0RD0V9XSqbWVEV1BrRMioiutzrqz3b/0f///3H9T8d977/buczzn5EuSR2nyGB6KVRHUmXVgAAAAAAFxUgXLMwgmjEI5OKkKGBl72ZJmLZTkWenumGpo0CFR1o7W3FYvDENQh2Hj65MVaTOwPCYrJHVZG/cVjMMygwuNpRPnv/7kmTsBuSGL9RTDDYQOY2YnQQC4JHNA1LsMHcQ1jYhQAEb2LYAocm4VKR0aDSjTPYBiKv3bmSgRhG5BrhNj23a8UWfComDbiAjf50WNBA4wUY6gVKsUJGEvyj6336wCaYSMvDj1WjDSiyS1oEAlnEPLJsP9rmU9E57UqFw47pdb+3//v/////7GFXIQ+aHQ4AZlOkqjlOcQ/SQqMYSAMESgEgzIdM8FRQSYTqJkVg2YQ8nwpQXeUwS7YGjRF36Wa7SvXASORyXU4UreF3FGWtNdaZD8SA6ERaXmJqJhXJw8D2Bclh+W0Q8C8mCU8fQEomolsTxBoVIUxiW2T04JZpC9VLpI6mGOJh0KE8c2xmIjMokwZeE0hasulKYKgEocYbQA+3WrpsKvNElHmCqyZAABA5f//+v//2VP/337pv/r20//X///7rezPa7Em2h0d0RGKY0UOJU6qggkgAAAnZUrO9pfIRdEnl2kHEu0JRbZ0U0mCpbrCuvFm8h91FxwKrBDjhNadytBiA6bgN/4Yh983pjktZK+tK/loVkJMK0YhH/+5Jk444kVzHU0yk2FCqAGO0EIgCT2PNKbLB4wLI14iAQCqM5UoRh84PjxrVyLNJ5rmcakxqFLmUlU1GxmDMrVfGCT/49yNip9q6c5/qLJhYoIrxwXqNt0+l9QvbQoej8+///kRl/IcDK8wbR1YSxORjWRoIAJAP/6//2//avdPWj/yPpf/6f///2v86yIeWjEN3Di3BlZAxH6CSdjoIgGd7QEOawRwTm6yX/MhQBMLHSVSONtBWwDEJIPwFgDDAS2pmiIAmpJyCzLY36ZYiskUgHTWakW7aDHU5GGpaO9ASXzVY6zcAqMGJNLovEtepHAGwjp1ApHc5GgkeSCZxwtKypy8qjcnXbeOo/L0VrMLmY18N7VqPERkPIHjvUrl0bhaJdMqnq9JW7d6Mlrv9m/+9F0uj0MiHYed2N7sNBuvl/+1tf/91699LG2vp/t///911TRmTU6OdlRHdkIHRzlnI4bMAm9VUAAAKVG8HKTBkCYEZFGYu8SEwVBBBEQDwNDfRIgmCDx2XlAWBi9ayS8SDzpMxUpWFWm1qOKHrxU2a0//uSZOIO9Lpl1BsJHjYqLYhyAEbqVBWDSGywuMictqHAARvgRAErkJi52IM9guWuSHBXYZJD0qh1tYq/r7NAlUBu2/E3x1XfVzbj8nXTIiYTRUwdMMuQFrhKuRD1JCVz8+V8pk5hHmNV0F5YIkS2PzeRXWkrej5sCiphAqWp39Uo8iFAiguSdaAno928OMRmH6SB8GwrZLaIJbdGCEFrUF0J2bcZWZcO7f09DjDd3/9gz//1z2tv//29i7RYs8swARzGa0Y+YFhF7gFMOjBYaMoOmoIICdLpLToSggRrIKVhh/wsCxBAaCjGn4M7U6TfflaLpF5FLVDkl4QoI9cug6V5yVrjyT0vUWlL+v7FwxBRaWLEIDTtxNFLI7RNFxdexqmjXI4lZuX4UBUdHBjBlWLb2xEBggUFCsaQxYUsz+sZM4l6FraHzJJ0/FC4J+7/+SW1L+0sDpMIP+t//9///581/+X5f3////+7NaqO5nGaRZiujwTBHDCDhA1RAAL7Q4UbCpgCBR0x4ToIIBzgfF6ACCPShgIAHCAgAAkWF03yBP/7kmTcD8VfRNEbTDcQKUAI7QAiAJMdI0YMsHqAkzUiBACLo4KDLGVwL2QHM8lSNqCVXKQy9XZaitFLdC5Whsy0o5Jnne9lldl8bcCfiODivyzmB4ZeCuvqOMsft9ZTnABCIC4oWKidEUFQjWGypxViZtx0nMLFCWklHFnYcDdUF0bOmZN8es7ORIRbAyGhE+QNQiAOEf//l12HRbR1+Rf/P/OZlqfM5t2gdr87///xcPWX7t3isSOQL+NDFEBxUGxSiIjC3FEAurMe4WyYKUa6wBr5UAmtGm4EiZkXLmFSBGkSfLzHQAYiYcKP7IzSRHpRZ8tYFBQx4t2DYUBQYmISx0GojYZozKQKAzoMFXkrslBW2jQ86RDuTae6q76uk1RiTbSCVtcpIJpJG5ywECqSIpHJhkTiUQVgnjCXTiAehUgiUnSPqyUWFprMrtqSnTbF0VZ2msOuMX62Tq8kGZVYgFUvnY1CXCcCe7/+7d6VA4RAQ0O4/0ZBCcexdB82oV2+3u/o6f6GpUz/d//7///pit5lgDUoiHxQOAIoGIAAAAD/+5Jk0Y4E8ULREykfECitmGAAI/YVTPE+LWWN0LeAYvwAiAB2OkgYbQQaSYWmOMQNSDEC9mRQVTKDGwNQMDIgCAAeLBYfBrJV4NZT7T0aap0qdaKCsIikmdxx16SJ/31VTZpTrQWDn3KGZVMU4irBgKbltWuRk0S9EMomR0dkk6MtdSrGrw7t3Dylz9DYSwWUXZucftvc6vHIZWpwjz/1EwxBCkjE8drOmf4MiAxZawV+ir/aW3PLNTKHJLJJLGCUHovclVDRwqtCZDcY3K+uLI3dv//0vf162pxcls/o/6mO5hUbDz0gy1sxcwNZFTZgEHcJwMiYuzmkh44kGQnJhiUJGBoZUBR0wEKMkASgQNZEBZgPWVHAaICK47AUTy4gjgEKdVw0HgMAumhezREttBwKPsDspnU9IrlSx5iClDJ17K6UjTTGb+Oi3ReURburcmM5rQcVEIVbcICE+2oRD5A8mVCi5EBhGAYjQiNkfNojieOLv2UWWXTlKdUodCSCDQWS4Wo4hy3//8p1lq9f/7//3+vqVefUok8N4fPP//////uSZMEGxMtI0TtMHjAuAAjNBCJulQjpPE3hL4CotiHAAJuh+3/b/s+PDP9eLx8zKnaicYy4V7KOoOql1ZpQAAAqNMjzMk+RKC1rgXYJQdkUcJ9LpNnUoj7QFYAQFYpDFzEmgyJM9MDICe/vVNWkcympcxL2dmYPVN5oI7ytd30pyoQNfGDAFADQ0xRs/RY6aujjeW8S/5X/dwMOBf9xKgEG1burIexzX//XsgZrv1O2/+zV/Zpo//60ijF2pD4sBARQRGA3R4QIfABsHHzV2DeEDUh0/DBAA6WDnY8MTyIACLYhIPuXRUqsAoostUquyoHjatrIVdOUie5ceVsaW67xmy45EgIBUH6U3NwzcfWOHRODYoH/mROK3JXjpCsAZD0m6CSWBRyinMWKILA+Lok7oU6eGvt7dP3jazt+zuEc3E80+jM8Nv9+W7ekUjmnUIfRpf/Z8SMIoANBP/n/+Z/+U/nq76kXL8/79r//5fPx4OVORswkGCgqMoXRQEPzqgAAAo11hcMGIDNvDOBAeXBisy00XNGeAAowwKAEyBCRUP/7kmSzAsLtNdjR5hPMKwAYvQAiABKlJURtMNaAmbXiCACPqUjDRMdiLIyq2KsVpYeXYSOXWhEsCXDBiKwjA1mu8j6+xb6QwXCUs2DLycUdwbmZgBQIwWISC2dnYKs4U0RdlEVG2SohLXCo3iA2xNUVkpQWOL21y1Ix1rRL5msefdpl4cvsD5EuyhBxKjYsgsKFkM/+rQ7Q/Qr8pT6aBkWsvGHrj87znc5/D///8///re+/+5bbW05h9QfGE182mQCyxoM6mgyAdQkhQgM0VDC4ArFjSRFH00cxOEMwpgHkFgFK1ZZaW8bcRAFtBotPtfCANQVBmCV/LsSYUrGi2Lg4UWKLjM9UuAVEgd5phzqZJJw9UycbOoUIqwnoSgjJDVCxt56Hk7U8N9HR+0vBkeyK5cq1Vq1cqxWwnWoHkmh0YqQ3F7NqsTttYoZUSKQuIwaQNTRWwtqdckAqf8///Ii2vW2Wx2S0IkoEHILtCdz6TKStdqYxEx//0f6dPR/yVn1J71//7Nq1AuqWk0UAAAyN9iE9K4BfHqqDzDPGMkkLmgD/+5Jkz44EuDTQG1licC2NmGAAJvYTQNE+TeXnwKyAI3QAibopB8zjwcKnshWLAjxTdkpVsy+spckiOhqwqLF4HnWaqBTJ/ISps77+warS0BvnvaG/9tW0ojVlcaidxu4Wh5Z4zcJK9uTpkwQhYsYTY4KGZLukx5g5iF56/+HUyauaU9xhWk/KOLBAmtGK71Hv7///SAQJNKBRJJLGEQAOtr6ilFNarhVSNnT0XbnlphP/iK0zMDYtFu3/////MUrZcA0gKOUCAPICYOCDgS8LjxkSQHNxgQiFRI5dT9Qyl4nQyOHrBCU1WJBZLQQKUHCet10VQoQGjQ9ZEtwxDQEixUVURJGj2vS49S/2is2AoGAoE8tIAeB+IRIaEcqFophKbmRvdS+62Xiw2z/lZDhOktG3EdfxGyw9BFdaBDZANxZoWVw6MAizBM8O/v/f//+fDSXySSuSCyFQEWeCiLsx5Ize+5RN31Hj///b/6GxSi/Qqn/7v5/sTJCgiAxYqKgkAAL3GIS4aNMQyMKvA1BNU1JAwz8uwbAmcMoiIBjyPYNE//uSZMmOJD81UJssNhAsgBjdACIAkgC/Pm3hicC2AGLsEIgCFAESFGDCJlswSbQPROTuXMAQ6Tb3sDQgCwNp7oLMVUY6oAqk86mbE4Zbi3IOx4BUigiNCM2JhOD0hHQhk0t+hFcSggVKYVE2Jx8w6U3zw3ZL58ki0tZC1VGr/XmvBA+Nl9KP5KbqdMEHzW1gao9H6P/1m/FlvCNFEjDDjYEjQIIYOpZJFXXr/pSuv+VK++//VRQIkzw4x0/+lP/+JEwRWB73kxw8CnwYPA6TgANTOE5jYvD0LwNmN3pNxGA0UUYgLYb1EIBA84MynByUg0TKJTlyB6YPODUtMTKbE3VE4oMCDtiQTCz0X0VqVBOjnFH3RMmGHOG0xWx427O9NU9JDKqsleaXtZbAtd577gr8fWFvVCCaH1Tsxs9R4qnpglPTy50Va2fNuiXMfkEz3vRBIJgI0CJFDDAegsWvr/h/6P/lFu2FXIHjj6v//X0RcbkXMYT0vge/+n////8/kNJtcyPKUipKZ1FAYJwgg1wMG0uAAAAAC1uaBoKEmmAHTP/7kmTPhuTLPU8TTB4wMqAYnQAiAJO4zTrtYY3AnLYhwACL0UmTmrEMPDDugMDGYQAk6mKPBCoaVUBQELrhCwpUY1GEhZha6mI4dVhCsBETvyTyd5gyQbD2PvaoBLnsW09+1MgVHkxE8FR0CoDrw0ryi0G4jiSMqloRkiwcUJDLZgsevzhn0S1ovLpR3vWH83rLbSz81ivAABY4gnnRMwqVa5TotdlH//57Z1ZyNHuSsMQSCQSBoAAIqoLibHOW3aP2f9H7LUen+nvq2/////3vSMDgbBAFSwuHA4ZOjwFUwcQNghUehkZgMb9YdGGdpS1MRpDRgjUpRUmOoRgKYMmZYcYMQDD6V6bBZVOAFAV6F1hEBbdbheKKNfSIagGAkd3jS6X3DCKzGX1XfJ84PcdYi3ZYqaClHX8LYUrV4/jokA4VNJ7K4DzbaZDRqzeB1YiYMn6PqsSHjqxna6jvyDmIpCqdXXZkW6ojdzJX/2/5v////2+1rTatx6EiWSSWiSxEFBRhwosjHNKCAb9LeLafzm3/V//xm4U/UA9NHtUv/5T/+5JkxgYE1DTOy1hjwC2AGK0AIgCTrZc4bTBagLWAYzQAiAJQy8cVChapMCAjBxgwSVM+KDKWM2+cNNFjIGQzpoALGLxA+I3yTRaJBwzAgLHSRI05AAUCGAERgZgYoqb6h5e8s2WfESwGqVQEF4JUBUQNITtEAI0gy9L1QxEZ0gSgfi4BvFsH0b4gakhlEcA9Iug5ohKTkQtGG+eQhKEPEqaB8OaOgnDBU8Q8GVWq9UMj9aULudSM7yV5W75mgS4bnuvS9PumsQlic+AYYatDqU///yvrqrXgskKsGOEgskkjFiRCCLbCT7WvIVFGftYn0lYX/cHe82hDfV0q//Vuuze3+heyXdtOFz6DKYRFQAJLk0UPQCp0gApexxFprlSJaxDbBBkUMSNz2KPCYAEAoqTGG+TkpJQi5siGzDAGcclSUYxpHRo4xEsoRWFphbHKeksNeqfa/3Xri0iPNkym5G/bHETD/YfKeXTBk4lwQHlBCx5toVuFDxz/Lv//5xLT4hA/Hww2A0JCGo/QjZ1KP7//9vsQn9v8nodV9339P/+c//uSZLuABZQ6TAN5enAvgBjNACIAjrDdUUwkztCuACK0EIm4bsBEuokRNh8EhcoMAAAVpFARiFRh9pkS4BAAvGAugQdMOcKist+gFMoRT3eFbwNDF4EnxCF2XsXOgeNAgqHLrs7WKpu2ixG2YKrlD5i79OCw1czDkupNPxWJv68bxudRQA/1NAMih183Ai8npIjM24+UegORckRJDl9G1xrGIEYNOz3N9oRXWAkNH133a8t/gwTlu0zOngnkCOjf//hXr/Z9TaSJyYglFkFgFiRBCL2yKhVWlTUN/s/uv93Pc5H/6P/9f///7WJWYegesFAdoABKcblCwg8ZM9mqKpfVtodL1tTXq1566Re7FoUzSzBDxS14pDQgikwiOGixpGQjCMsNTj1fTdPXM86EFGDEE6P6cYcznQzec0s9z1i4OLclcMZgsJgMRsEQsxj2rOOFlDjZ/iwp/+e/d9NTTCAjbRhdJbdWkUGiMhdg459tYgID0uVfW76bv0f4t7nVOa7+r//2//q6iyJlgAAAAABWJshjkmMEL5D/Qk+N5GeMav/7kmS5BATUUs6bRhcgKIAI3QAiAI3cvUrsJNKQp4Aj9BCIAhYhjWCA1Ica5KlLBy1SWLpurGHPa+9igzXS5qfznqYx9dzyvVPs3ZOEp0JbAAuriCLymYF94tjgsXJCIfJCYSjoaH2ZizTrbW7DE7q0UpNU1OKrnVA6JiwVSgsdBdHEDBYNGxULVzx3dS/5V/rXp/TFgoJt/+MP9uBACglRxt1FTaL06rf/+1H//+3/0a03I/2a1ZbUlYnUDZ1aiI5ThgEITsMGABqIzl403o6HEmgBF0zocnBgIcasCGTRkyyxFYHIyyKnKtBEJJAYQQdYtwpsWgTVXooGxRgiwaKA6DcNdkAqbKHKBrcXhJocbtAm5TAkmXs2F8neNjEF6kcqrztohoBYLahHV07+L38izgIZCgjRQCEcDO1thSOrurfJmqjrcKNc5jEOn8wX1/q/WvR7HBmupBIDjcf3cARAkbiy3WqtVaoVu///0f2o7f7kM/X7v/+xDfYgAWDVj0AYIEFAABKTkdVDsImAUYkQ4mRrFoJ/rIT2VI7zAIfYD1j/+5JkygYETCzPUyxNkCugGK0EIgAS3R82bTBaQKcAYvQAiAAGxicFoQlwNmKD6MFpfPzPz84WnkT71WscWHC6zcLjjVOct0WPrEC+4IIVh8tW+u6Q0sPFXWQrvsLWI1J+LjbmTRBOGU6ovopUP/VnzcSoeLKsEgAckEYbQJBVHtkULFnaBy7f/1IctTwEH6q0GBhV3/92DCN97Wf//ta7edMwGJzCBseAAyqZhcobXgY9waVODGwFJGXciImDCo9UCgQBdQXVkWIRrOIAkqABZCE5N5TSXKqMOTnS9U5aMX7gZG1U8COkDMxHkSgvD0DqMnYvLg4HpXROD+X3FSU9MFwdHMKQS6OUrV3dib7OYWVg+Os1ZgqbAgw686gkEcnWfcQaHcDnfr/9vu+AFBljHtvS0YAHJAFiH/uqXbR//1////+aR/R//7bMxYA1MNGGA4oRFQAGBACZKkmhkpmwIcEHmHDpkQaa+EBBkNAZhpUDgBppualIl8CGuQB0FIkuQdUuOHEItsuLWLFTxWe2iv1gC4ShbJk6FwraUHdvkPO0//uQZM4Ek4Az0rsMG3QyIBi9ACIAkYi5OE1hi0CCgCM0EIgCsm1In+pOrPl0sgKYFYccH2QcDqQVKLE7CApBFNfIVVTmhw3Gn7uI4bv/qntKSHgUDSQyt4haLoCktaop7v+Af3eZcx7WMDqg0O0gt0sgurSSBhS9bCTVIJtTb6+piKrcSL9vfb/MaKEpfaKGdlDav///+vdsHhIjEY0RmuNhgxYZUcD8CbCqGIghmLaYWPGEmJhAWA+wOCdoZsxl9hIA1mVvDBSEtAevIKHmeIFBQKeqBAPTMoYKrySvA2F1RIFjr3s4V4rEqu3Ku4LftmgFY0TkTSjUDR02TTFcMxCOWkInnrLEUnPNNwroYGrPMpodfrWl2UCEmfrFLDorQFJg2duxX/6P9jeHktPNcKNNvOnW2aiyQWXBpFB7DTUmNytRnVnskij/4XYj1+tKtJoCxB/s8x///7KqCYqKtm0qARIkEAxlw+ZcsHE3ZolUZKhg7BNLEM0NAcJwMhMLxAqIKilEyEBlIlz0ATmDQ6jIjFSPRYElWDq6ehaHYJ4A//uSZOUOBLQyzRN4SvAsYBj9BCIAk2i9Mk3li8CxAGO0AIgCggWC7uwLxGRPQbjUcisKp85nczTkEQxmdm4qS2MLM6cnB5dmOplZGKK4PtYzLBf71re30PPzittwiYLiYCggKBZZUWulmhEYbxOv//an5PfIcRgJ4GFDrAE2sQSSRt2IgAMaitKgkToW6y/Zvv9rh4+noa3Yv/5z/////qwMwukaRcxqEtGAAvVKZAAQa2IoaIQJvXZoQoqMC4YGBCYaHDYQiUMAU+U+XKBQJH521TrzbEuiH37Uba+zNpTdos9zQYbYyDEE1x2YEYhsFCBEbJWnxIVxnp+6j+NqDK9xshzNDHSkg4QOBROpkVY7mdalrOqU834X4s3FDJc3YiiQ++T1s9D6lnU1MWRUFLBJJbJLYiQgdTUoYIUoTG7nqOjjDTDa/6/7f0f+N//pJOs96l3f6JDgFqjoRNUVAAdH+MVcDH08z4PI0Y3vCMqFjGywwgIMFSjHxJcphB6IAVLUEtCuyKqPpuM6KcLjl6lmgZikC7oCiu4sOJQMrDlJSP/7kmTejgTGL0yLeXnkLcAYvQAiAJCQ/TptMHaAuYAjdBCJurFZ+gQkEFMmZo/kBz7o8cGGLLElgKR5HnhuAZmBYEdq7Xic/Ny00mYgI0+qxCjSLWW0e04hRvyHf78bvv7/w3f/67N9Sem4ESbgTEZkzW9fv0k/s6TgEWoi0yphI+AABAAACAT/+v0////e1v//T16f9ft+v///9dq7tIj0KRFcoIFW7iWZyGUoMVQMDMTWkjWoDZNDaSjgMSXcYIKJejk7zBgi2ZlAgCDhgUQCENBwUs8FLVOG/iKuhwUkWgKS3TLQcIQq1XMCBKdgQSUQEQNWFhzBYw9zowQ6rsXKefjsJgl12DMooIXH4hEolEnQlUqvZMaWKk4zCPxK+na1yfusYnefcp6u0rKVNlvq3vV2ZXWidf/ev//0kT/2T9nRNEKuNzjQzgGAAwGoAZAI3ff7O////Xr9bf/U///t//+6gVFyoNoAgMCQIhNQLAALREIcZm+nmxWHdfmjMHeYpBm1KGnHPuFDIOQgwEYwAXSibDBUSBQKzS+kpQbAoEr/+5Jk4I4FAz7ME3gzcC3NiIwEAm4TYZkwTSRcSJsAYrQAiADCCMGvpPsGAVwp4JzILtUUehmTqqNjVCyJu0tigXDyblREWAYjqnHQeScVDuyqIqGaK5p7zqRyy/nL57si7CpSBRkEiy7LIjPqld0XTq8o7XiYfb/U/91ifQkbGRd6HuU0DlQALy1wUQCSwIlBgVC7z93R9e7maPcIms/tsIak63/1673fntTan55X+zKvjWUoOgyEElQhKVQUDRRY4er2ZFGLimvGoRGJZGVClCgFFCpR8ZgYEKLMpBzSVsbKoAxyQqEkrC7q1GMKCJOpyOPFJY7dEiolS7iRrjNcl0rtvdnTyZ+nMid2hAEEFoICoUQHjA4NQ8+ReeOKSJoXsiRMptbPNREcSlvaw/7xfV7oLD2GX0exgOir8u7p/V+r9DFLUBFB1IxAAmoulEtmgcNZCrFWdaHm5i7Td/R/////Z/RG1dtdf/5fFVJFDBeqAB7CETJQoBXZoaCY9CGaLwGcRQXBR6Z8ZmPDxlYYYiBLkMSH0fC3AOEkOZKNKrOQ//uSZNeOFK9BzJNMLiAwAAjNBCJukl0FMm1hC8CYACO0EIgCGAjDEhmjrLSIdhijvkIEWqVgdROBHJoLN4pA2MItwyAcnC8dFRierPSFwqtEZOdC5GesL8OHrntD35x+uWd1U7ZxmKuTWe11mYNx3OaUK7o9S3vIxedP24xvuQcpGOqO/+dyL5uHRyptckrEklkrSJICi0hipLFVRjzazaR6H2/9v099Ld0Yjv354d9r93//7dcjc2MYksAxdZEHAqKiNqMVZzt4A3ZAN6rjQhkRHpno2JCo6RBcQAQDAqioIFxYYEjJKpStO0vgja5QGDZA1lLdlS5xgDUYQ3dB03HfVLdW1Uq3U1nofQvC0KlsScaSuSycIhcIwjLlJ6jEo9LlFh0mbn3qsz/2hLDCsNdIYZchnPIpSsMaZ5bfM6tyGn6LmlNOfu0vy/53/b0rSdEnZLNdC1WQikMYp1QjDSjYBA5AxIIiSgtGbr1fTzTv+1P1/1++hVVJNtX+mxesMf/u/A7wyBSJQNmkhioDiqHmXJplpuYdHn6np3iaa0MGXv/7kmTXDgTLRcwTbBYwMCAYzQAiAJSBsS5NsLiIrwBjNBCIAiwXSSoBt+VBowcdMRAS7rlAfAVs3oEE/ZcwraIRKUsRBSUfy9SN6/FMF4q3qlaS49BAzMo4ydxbFZ5o7YhmDIjWdqGG7Pfdgh7ZuU2KaZpZm2MJAo6IcIbUOgwsxS6nZ1ru7Nzfrqi9tXN3+d5dJHmYv3eQn7f7/ZUflMys8rq+c8qqIQIKCgmSTWSSwZokoGwbe5zl5O0RKt+JBT/f7f9H+3zSDFv9P///7orny4WWEtAASl+saUhgX8KtTz4EKCFRBOJwINVvbAy1tmaxqLraoqSJxRDooc0RxkCpZgwiRvEVIEGYyMNJUeEEySlxE7RXtE1EqXlVJfCtxKWvm375k9tf19escovRU8SWwJMQeLEBgqwJtSlN5ljqWPWtvhPDGPEaQsLIsUJBHJZYKJJbEiECWRkLZ47WpYqxeypzur0O9HRuOtPCm7/6f6ysf39dP6O+SWNWaJrKsJEKABk38liBRcUv8aGpmrQC6UOaFU6zddrtPzGWjMZb9nH/+5JkyQgE4GjLi3gTcikAGN0EIgCPVNNBTCTQwMeAYzQQiAILomiwkNijhWKwybPo1901rl7a6BqjPYcEUcMQ5Nx8IKYQjBGRVIh0KQ5STm1v3M7ppKjH2o5MUXRJlQHYERlbaxX7wRrbs/9Zf/2e3XV/ZA+gzeP+ee/lx9sfrOpTBYXqs6Nfv//+/7N91u7xrs7R5/j6jXlqQoWHG08WBOGY3QAFLWmqmLDmPemYZnGVihAuSmgYoGioocxNkIwEX+0prcGzCnnbpWfQHDXrUgyIZkeBE8PJUNFyROdCWroeMPMqVufTKgsAAY0FnLAPHKNwUZ83B0UG8qurAv7hIjHFJnJU0JB3gFrDpkmFnC9TpS/7lmP3rhmFQkgBJcho564eACHgHb8CklALJfualG6zVHf/66Uf/etX67Go/q39P+z84hI4cVcVLkLBQUcGKmjmCDJ4KoaAOmqa55hEZMmmojRgUaBl0AkplJCADoYFQgeRqJQEcAjUUSq+RpEgJGuRAvozxK4t8+o4BhgoFmb7s9QrVOIANXTXRpjUped4//uSZM8MA59k0BsJFDIsLZhgACb2D9jtOG0wcsC6ACL8EIm4WvsUkT6Muk1LATtv1A0nhbC36h+bgGDKKMybKR5XqvNZSS9/ax7h1M/aJz7p5/cyKSQ6agyvHV//OuOTr5Tf/8j+l/e8hZEf10X/v1cqI0npQj9OqbQDGNgAOgAGOa2WgSiy2NEoAUeginsUrx2haUif/QW6E7tKGWnvb/Y30+4dAqLN9SP/ye4m5SjQuMAH5GGBR8H8E0hiXALIwDA+I4Wi9YhRBRwqwMnKwjghYRQDsamncW8YgLSH6exrjsoOp7swV21xUsud5lpk4FQaHpP8tD4/CdnCxcOy5auQABLImSk6Ope2f2VP95qZWHkJgVHd/3+Sdk//u2N8VBYYYEqRUm06CI+sCuuaj0XFh96OO6o0Rw/MA8gWQ4QCiASQVu+t6/o2vF3+O/0a2rU/ezTUyx6uZTk1e30rWz/o/btc12LFiCQ0s+H6AgDB5gpkdfTmjh50EAawdoBTVRExMzMBLhpQCwRTmEDCggjEjMQUKCAgDisGWjQGAAKtyP/7kmTnDBVybEoDeBvyMEAI3QQiAJGY5zBMsNZAuQBjdACIAmjI1yovowwwh9FUXkUF4w4pMTHwPegqiQQF56FCwYXqRRwPSO6ciRQfHlkdso7GwvhzmnPYz4lcdEatHJmdjEJKzUTTIUhzomlqupae5bPfV1I/9js+9/+mXR5aKSjoXqjXcIzOc4Ncglv/0+3eiLVP9KKr6Omv+ns////9EstPWRlZ0c6HQikHKBJMFAnrgZPWGAAU4klwOaMyG8AHgneocZh5rLNl46UmS0xgrytxdlgzeJWtUtSBnsgaVkyxuLqy13YRPOHHIuqLGEAjYZK7FPI2nOfOmVTqBtCVSadwI3LxVQiPdzNXJIVbzOl0I9QDKhMGig94VV7jIrvXO2StLzP2oj1uVYkSrcxwWJIFUyCQQSMARAkh2LL08vXu//8x9H/61vRUi7fK6U56n//2101Km2rY1wHaGQBbRAcYocaIeYuuBqJ1Ux2CgtuFBJc8EARZGzoFMQYERTGQA0Dawmu/rAASBdOJSp205G9LSqVuxPOTQLUbs+L9uxH/+5Jk2QwE8GnKi2wVsikNWHAARvhPvM02bKR2gKiAYzQQiAL3K3biFA8jSIflo3RidIOR7Jz7/Ou43Xc32aC3SVENa1bMjr2Q0rIZuR89FvlJ0nO5urVp/6Inv/antq9GV7yS3RdJGnnGXWaSCySWIkoMa0mKpuoOUFp4l03Nq/Z/d/u97vLLp23fsVV23GP/qmFIYozEw0uAMED6wjpjzZFRMwbLCICxONMPTNSNMaQM2QQ8TPIgheotqFgYcWQ5vBHWfppInJWtRbmMAmGt5A6m7S0uXzPR3HRMFKRwTVJ+J4cDyWBFhXMxkinRIV8Kt0S5RyqQK6nFXMroZGJ31qz7O6qfZ2W+7mM3fu61ZlV3R1RVV69/7XvnvujX7LUrWaqM5mKpiZpHmF8rGBvA5JI5HBEACExSknT7jj1qkmv3mGf7+3m6CH//69n/3V/6P0dD5JZA4BWtOrDdACUBGKAlLMcXzURYykYM0HTkQUws5EOZgqnaeNjJzglMLkFD4VFBSJf4WNacNAJfF84sstliHsaa89q02oS9lEGvCqdW//uSZOCMBExsTBNGFiAtwBjNBCIAkt2zKg0wVoC2AGL0EIgCKgqJzagdC8vuhOWLq6i5CSEI/dVMtRRQXlpj25pWef+bx0OaPOYIRMPBlhpx4mdEe1gfSWBICOOyof+v6Dj2Fm2pS9Twea8OhAsMLBccsVEkEgkEkkDCJAVa+xzqSDeLDu7/9n/+z6tFv3/////rqBBt5xY5AsMANAAEhj2YY/jGejxl8YChIZVDITEzsmMjGgYAwKMixUA1UkcREDjwkXuEgpiQJBICctM8L4VQUrQZKEpwOstDDE1JESwUpGtA+FS+ZVM5sqkfHvZwZMO3sVhfVtHxK6FMVHIU07UKqvYqZSv1a5CMXK70/OCSqWzhCLhtXsun//k962/1aHYepYIKZWIGKJcqwZxyQ5kUrICHlkgoYcFiJKBz42wuc19tjP16K1rMf1fq+Zsvdoruei9FaaSCNdKFFP7arUhTOS0y8moIBBTlsTuqogfY5bjp2FrXAR2BRSja7EvkM2BRKD4g/cKaA16H2kuxL43WiMon7JYcgChEhwAUYgEhMv/7kmThjgStK8sTeWHwJcAIzQQibpNVrypNvFMAxYBjNBCIAqFuU8otL2JNM1qhj5tYUvidtXXgYQnjm9shRpCZ8ofoghQmfXn5L7Uwz64leiBXcEm1SyioCPlPRa45Ws5OnBgQeAwBS8TEPDg8AHTgqUPOe9KOhyyv///2/6TvRZTpbVevuro2f1epVcUQmFVqgMsLJBggCgYLjJ7Fhy7AyUHVY8oBhQ0Z4uwIixIRHRit4QWHhKCcwRMWWtkgZrrTVBUT0Bg0xSiVDCFdE8YC5noVEadcnIarEnZGGVSzOSF1OuAu4zF9Sbb1+01/Ys+RWMghmmCEuxqu0jsVqP1W60erdW5zWd0c6PN1Vboq+rfR77U/3WrlsbhXrUk4chkVna5IsUQWwcbNYAIJHIKwSSHq6qETa4+ij5n9Sbf/9ldO5v9dfXz3//6qXxMLkSrTJl81AhE0x7oy+0LSzebTQKU+TEjTESxBBMeINiQXoAWJjhoNAjQICB1N2yMpMCAg1RN1l/GECg4E2jA1pO/DiJ2DUWIpgS9nC/GuvRP04hX/+5Jk3IQD/UjNuyYdMC9AGL4AIgASYa0qLTxTCKgAIzQQibqJois/EmUWI7URLGlI1jCpnuKG7UDzZ00J6hJfVtH/H9Vn6OkMqWdLe15WrdHX6x3+etK//ylZ98tP0b/jWyod3Bwy1BtLiC1Q2ICSjh8ttkkkssSJQYQEj1OYtqc+wVMCDuWv+//Ry17v+j9yv83CCv///apDWJJKPplAEEWkABQZSCY0ueycx1WUx48yKUw4syYkxodVEiDotqLlBa+vpqKOaANnymyTbv0qcK5XmWuwJu0MOGyYLwUI4rXRmDhkZa/r8XsPL8SPx0hh/XdhfU+Ttwisa+eYYnnntlbmhFpkqQl/yaT4XfyM5ZCYr/28/n/fz/OWc8t+GZ5/zpO7OpS0OTQAh4ZgAkkEDjjFYBJBAylsnVqRq2ff/2//+ive21tR7v2VX//Z61oW+xthprxMKhMEhqoVEDIhszkgMuegi/NIoQ5DMWFTLAdZQGJhkaMZIgsDpIoGqnTkSJLWAgEEACztS+CFNHFaM0trrKXJR7cRZjjOOpU6K7pp//uSZOWOBNdrygtJHhIsoAjdBCJukemrKk0wdoi1gCL0EIm6xIbwtU0bjNNUldmU5z9m3Q1LNTligt/4SZWZphKhinxpgEsjIb1SO0MSkSm8VTsytT84owE0cicHUngnb+8hZiPtpvoYyFYynKURCZ5wkOceZf13+9ZE8fO/xopo6XDNeS71/L5n+fn9laH7R3AiFYgB13Ko4wBAImElQKB8ACrGkFcjJ0HkQiOb2oIyszOguRXKyWfqdQ84SPkbV1EWIMjeRMFxHwl4HDQAySQGgBEwwVEpzDIoIVRJjTS7M8tqpEBEqxOD6lN67E0849bMmMjsEmRcAiIqLCIgGyRG0LkhI9b0A002cOCrtxdbUrMGC3it/0UJoWRc840KZMCgAcDjfcaMhj3dm7VqZq/7f6v6P9F33/qk0o330Vfs7mzb1pWfQWA4+gEAFSxMOWFEzvKNNEA4mY4ZpZMq6AWHEiy8wMCa+teLMIUDUWgp7lSQ/D8KiE9OUzpU0PQ/J5ffgZiriuvIIpYy6NLxRuJGh2nTNoRxGUTbfpFRLS+rq//7kmTiCATBbEoDYS9AK414YAAj9lAYpzLtYSPAoIBi9ACIAJ0HLx3VCmiDWPsUL1birGepbLtpp/b22pb8iu0vdWJdLTbsyO6K7GQ+WUquzkMxf/3/q7b0fMUKPRU9yIkQnGTWW2SyS6tFIEVsNuSopietVXAVpkA/6X1WejSP9n9Is5UoJ+mlLBL///+SeyZA0akCBBkYQCnUwIlO3OhwbBLqYGOA5aIiQEo4szqlMVg6ZmMLLbQxgQCJHMcC5SIyfA2Iy9YA5z1umuxwpWmGjEnwiDFlDojNuA+0+3C4y95aXszII70eeUB4hBEIpgONKxrVVmFMtb/TDF2ghoue9++oqP7f5ZIHzXGscUyrIy9Hpr9ieOE59fvVmho+unmenp/+mPqEYsq5FCTHERFNJLNexBsQDg7FR4wTJLJbLaESgQMNOLAT1eK6UatP+ZIO/700f9l/U/uT3S////rWLT6nLA49dQB5RKkAsjcySAobD8ehQAmCQxkwyAQmkzyOanSH1UDEi2DbOsmc6LDWHOvFmvKCl8JRVkjexVxXYhH/+5Jk6ohEuGLLuykWQjAACO0EIgCVNasiDeELyKcAI3QQiboruRN+LmGUuBZJA6SKJJMuP0HxDvWHQ6odv8+Gxx2Ixq1lS2Pbtnxuzr7U7yz4z7W5lSlFabnI7opkQqpduhVd6Eqejtov7pZT+5k05WIV0VzKQ7hJGiBp9JrrZLbQ0ig5zFC4fKAcinfJpVnkDK//641qV0p9BWVSpL2t16vFd713///nd+w9LVQAVqiJTFzSvjGITjJgQBATeulmO9WeVRCgUcS1Ka49aikq526r7eSKUUWkDfMmiTkvm/8/E8oZA+LYPo2UshPWmavsQFbkaPcZcNvRl1UbP+bObf29QO/yVvns869vc6180xCnUfAoYZQ4z7lWzuO/9dlYAUHvt4Z//c/Lfc/jaDDlFEu937rfgAfj8DNEoHIfWtfWOpR//o+r7Uf/q3Uf7P/9H1PEqi6owuTFzoCEYPoA0UUtMUcB4HKWJqjQI8QHHGWKKkgroeQgNOp027rkVsVieB93wWlEHHZOPAcIkMcrnA81FR8IhycoCgkROMsOUdbX//uSZNwEBJJrypNGLkIxYAjtBCJukOzDLM1hJ8imgGL0EIgAvTzPP/AxG1y2YiUekehwer6iRZE2cwW6EhIpIsTJpcoVR+9pYxRozVKSvLO9mi593I37YiCrMyucbOPnp/+90Inn160N1zGYQuVxDdSti0AW2wXRpFCDTe4VLhKeOWexdNzf1fo7+7Z/V0//s///8/r60gBsAJGmKGGoJgSKaAsIoq9DEk0BIOIsYSbS+RYQSLCl2FLoaZ5RQ/p0o5A8WU88cJdoGA1MVxBtHMPB8jWzmVEE8rYL2mxUJokKqOGfYpPrqNdnM1A70ic2qyw5NOoSk1CYoRE0UlieZ2pVnsGHeiKs+1T6Tf7Z+zNX7/9n8y+WxtH8ut5bGIF55vICJHM/DgoMkklrEEoaRJCSKxcrY/Sk9mNTn//T7W603Y7VXqjNCXbG/f///2kHocl8IGI5gIUICQMEAcM0KowdM5BAPPmGIEw4CDCZMYIu7KqaAJYFVZg0yiusPAK9hLF4LjoBBgfzEdB+IRYoRhEhWk8whSxIV3NWa1VfzhIo6v/7kmTgjASJY8sTLBzSJMAY/QAiAJJFryxNJHVIuoBjNBCIAq77kTOGNSAAmZHlCQYkC2KshfY4+WuWE7ZRwQMZiMn7XWUkGvnqeVe2llm//y/y9hq9+mZ+Tu5EZeiEUYnJMVcHC1TFiaJctRRbI7JLGiUG3UDyttyUp1WlNP+23uuo6FX/rb9X29hyu32f/7mJlHkIKFTIUClFG4X2BBZmlCIUEKj/4UDVavlYYtOvp9H4Umu54obmodpYw6NeM3ZqRdqUT9SiznnJaWgjtLEJbdpYJgOclJKqKCkFYPAZ87BGEn2E+qHxs0xBZJGEDEyp+c9NfnlpwVTFwjP8WvN5CHyXX4Dbd82WZsZpf2mT0iVNnPBQ4VvTY8v55l//PfRfY4HrcgR3EG+T/y/5/TI+9M+6PZ88mXn//////1tbZ7v9fttG7aEsf6V9VsZLzGGJ5xK1ARnQiGTFQsxcKMSgDBSkxg6AoQmYnCIQEACIVBhCAJyog1AsAW44y1r8DqKX3nPESowPioOBmSAfMAVaumQFb91FY3bMatlGl1dbeef/+5Jk5ADkjWxKk0wcQiwACN0EIgCSbaUy7Jh5QKY2YYAAm9jann7WZcla9dxdWH45DmHdFB012rRmBhW0FB2VImdmjiQJwrA9cNDQeE/PBjMZqesIj/zn3/1O5rGlkJjvMgTNHM2hM45AnIynDCU0rLAIBZBbWiUGvZV0lWql3+ZCZo2Y0a0Fqfds4qtpz3d33/0f6en/1HEY02FmG7RgAhALX90GJ+HZJoIURA2yjil6wqwzDIWNIrPgoA6diErLCGcE5aYQxHpvcLGWRu0SkRgFDHlEYC6G09zk2oC4F/5ZIne+2lnZR6+nEdIm9ln+JrxWV2xA5i6PCBF4GCLTyyyCqUg6TSZaVGC1zG41T3cJzNhgDjZQuUJvBTnrZJLJJJo0Cgmn2C4xA64hsZ0opgYwNR6Ur3XmWd3a3/sjVVf19Fv2/ye2j1uZAClAjIB9lSRjrgqMZEbstdPgH+YKVhSsQcYQyNNdoLVnauOlp8YOmc4npy+yqymD/ZLzIjZ4SrDkFoIVRUuYkikPKMNGmR82YQSOlsXYqLmvbM1UAp6k//uSZOWABM1qyotsHNIvABjdACIAj7zdNSwwywC9AGN0EIgC0lUjacovxmeed4tGUI7ElEipDa8JKpQSgrt583qNRh9ccylfd0mcRyzQkO7miK0jubGCn6pn/P76XavkVQUshhGiszlLrZZZRLo0SQFiaT6ijEAxYNA/oU/C6dn3+pgApceJ30/3f/Z//1/6vcL3tip5CViFAIyUs37w5vcraBYyHGzHnDAjUHUEzrCwxifHBQSoexxL1qbI5+H6cxiH48Kp0P/NB0TkhKwnQrVJQSJFxYyD2k0jFcegaWnLGhNaye2YfKJ3Q4w3DRseoPh+lt27yfePZVw022+O9RvqN0rI/qpq9tvnnGq871/5qm7a2et/pn1v4/8PC93n72Ke8zfRRCU2NLvT2Z8A6FyACBiCQNEEh6e2r29tXPf+7da539X+y3ucQe1Kv/9/36gA0y8JvPRHFVFSCggAAKBTBxwNbNWSMG4B5o1g04YFOJTBDmW8QEIagoSgiXw0dPNSxrEOQHTMkdyUK3SOIyqIQFK43FXTnJiHpfLn3qzwKP/7kmTpgATMZ0zLCR16LoAI3QQibpM1sSYNMNKIrwAi9BCJuuLUiDn5NDOxU5FWi76u7oDvSYv5jc2E4ezmK2meE4PoiO9Y4yC2bZHE0YdUWrdzld0ZkzE6pdbnpS+RTSFPoZ2ayoeaS1CxdziyoUSiIvEg/UKEChCDIAAAAoAFCAI////h/7f//v+nr/t6a/T/01//r+av///93ZaIzlS533rSYyxbOQGScBCMqo7YoTAzQ3Vw15wwrkFUQ5kospEx4sCm11lm0yoHRbVisJ0PbAsb46zxFU5qCIMhccM4iRMj65wX6AjQsS8VGuVo2lGyFOJOOtvYXPNE3guo1mHbXyCmXerm5Jx/8p0gYkeHA0G/d6m8DQzZhkbY+w4WaL6R/3H1kkn9JTjnxNM+/TLBuTc1IDYx5sEMgYvQhAPUELGlAAwG21AaAQb0eMov7Ef//7Pp/0/vbu/RX/pT9lGZSaUMGrQSAw4Ikz4LUmpKaXBlCnPWfipxKnCQaYKkkcEOIKOWutBt1D4HghQd95AC4h0DwSRsYD2ejWOcSZjx3cP/+5Jk4YAE22rJq0YuMDAtaJ0EApZTBbMozSRzgKGAYrQAiAD7l8/q3tFFb8hZK9uze9+s1er7LDsL8Pw7Z3JecrhildVV3Ea0Kp3U4s9rIxzNMjKu6Mt6diE912Jral2pVVavno2X+6e6g/jpODU5wSnDuit4S0ViSWtkEhsaRcmzqi2+WNMc9ez6SWYEMK/qt/2U/lWdf///R+0yeC4DAJpZAKGMIwM1zNIvCrkcBG7OFrwaGRKaOGCEYV2tSWBpnhiEGQS77ssWd6SSmWupJZU/0FutM0sUJgqIQSIFjkRMxB5jwWTbvl4oxmyZMy9VDQkNdw5KBgKjnKqmB3hQyuuHtsRSdnQwuFwlbgnELgwYs12pt7EZHfk5ys1baf+RndvzvQZFPVVsMjMUyxWEQGLshgwa+3G4AG4HgBQBJbT39dv//Wn8V///2bd3do//20402phYQpaYABNpUB0LAgBEDV5Aw41NBJjaissE8sCpMYOIFvgcIw4PEeKszscplxOiqxhcOo20L6za5lLrwUpTVkmu4JI6lleYXgXNKtaW//uSZNqOBENpyossFGIsoBjNACIAko2xKE0YdsihAGL0EIgAWwvWTgkRImKz7Tpzc4tRVzBS6xi6pRP4WaVCSG3rblX9rX35dx815f5bW+yz18N3Jb9u0lZ6d37/PTf41Vr//z8878eHgr4f/FNLQhslLcD+kzCOOPUsI0skLFsjkjAFgACEiYLtaSuShrf/X+1Nn/////+OUhzKkd//rPqWtpWH2F3vDC+TWqQn4bheFKpulYJiK9XEtoLghqIKDC95fpgD8pOmCAOPTustINILTIPpFltwyqlhQh/HVamgJSPt006BRjLBfSdkwQyFlmX1p42EU1Yncw0BMstnpE+9Lz1/nyHuZiHn7hXW/dz+/Zvv3KtmvMv9s+9v8+V/88s17Hj5v7T52H3u/T9WcrMNJIw+wx7oHqIr1QdyAGIYlYfJLJKIJbAiQCcLtJwCZypvgu+ee0/1e7/t3FQ9Yd/o7KDkrfb///7fMC7TpVQ4wImAEFAEDX0hjtP4aMDvGVkecKEtJlU6asDKnaanq2z/uApk8M1ELMsf+AJwoiTJoP/7kmTgjwTubEkDbDUiKmAIzQQibpNBryQNPNDIvoBjNACIAgxyzTiQwVckrah+vdIzN/OC/HKLJalrfA9HGMzQZFsR3ZR2Qv3+7/5zmxwM5m0cTB2rqPtL5anSTiyaE3Kt15/nv695/yXOn/lfnwfqFxAX2EiG5PiL0ejj/DX4doFB6Ka0X7ba7D9P/u/3S/bf//Z9Pb//R2dCBGUaZwgGw4D04gABgl/6mVhUkBunsQELj1YhXS3QoWkqq7S1oCpoi+EdaBR0919c/kcPstm8Ys9DZ9RGwI1Fj3VYbYtdp80+scTdNvYMvgvN9t4hdU0tyLLcC3ydT7XzLipP625mMscy7J0lzIiLPbaEhwuMmR5nOyXPh2nDzbeyfu0yPN/+EV17KjubOu9JAbF5QCgQAAj////v9/////rf//////3VmJRn0dbGKhCMjGBD9How0jMfKDGhkQhhveIhOIhoFW4cDlkwaSl1RY1RBGAhX6fjtFymkOgmCoJF1Y3bVtWdaZQ1iRwO79iahx2797cppZqWix4aiAYfZY8kj6NMJ2j/+5Bk1oDEL2pLYyYc4ipgCK0EIm4RQactLKR1SIW1YowQC5lNnYLInRG7WYjZVowaBlAeTNKZ91gL6jjF65xRWsX0CjTrJU7ZDl7l5rTdnRR/JtUG1jXuC77GnIdbbcNW67zSrWMbeZpC17m2uy83Z9XdMwtK2V2FmVLRgTiJ54wlCQmeJLAJJHa0SUIDegB9t7kKLUULbWp/6n+hH/Yrv603uhS1HpWU2X+t39SlINFloUTeeC4qQCgAJAjTqChI8INfNMMDBJQMKgIsn2WsLZI6teDgCaq02cQ4ziB2kvFWpeQQ3OZ4qPCotpM4REhOsQyHW1ZRv3JtZhZmf1qfOpRRZCGNZPIQWqUsURLJPRID3UTSe14ao5HpU5pqHOZjmYaexIr7qghkUjKfc79L2+Q3mrV0XpYToQmIIh9znO7aPQ0TYXl2AoxEBgAABcAEgCPX///8/f/T//3rt//9P/9P//1////+nSqLq66Kq6KzzqRoc7AxpRalB2zcKO8kwJAsge5xdwiOGAFZke0m00Uunfa48LWaFPSJ0UTdOEv/+5Jk5wAFj21Hg2ZmYDUACM0AIgCSIbEpLSSziLi2IrQQCtHNPUsLoK4ImIGopAEwiCg3eNpCkqeqcEJqSjBv1ElrFtOd3V7AN5s5uoZCKX3OewYkhEbUKJspzw+/uGf+OkEwnNGq1zz+SpeFn/Tsu5r3LPatxEZjcU0yqtBfBOVIGYWBggtwrW2Sx2CzRIkgwbQZQPtg6cY/ONvJPjRUtV7PTR+00139VEjxv+Y///8xXchxqFAgSCwULjjg0cJzBwVUYZFGNAphYI7SJgFAkB48BplQO3eIOc2r8vy5DB4fzCAUIZrbnCFczcfQxOLkSf4CWeL6J50PjybcNuRJPoF0Xe9DWtTKtOIx63pghd4cGIX7bvv5rqLTdpyX3JvCk2QNPhHmhFvSGX250et+RsM1RE3//WbG7kGd+X0++Pvi6aC2RTXCIeq01POzYecEC0S9/2/AEJKH41rmvnGqiv//+v+rv/Vk6P/Jf/17DVCjpi4sVeGRAKCAAAkF6gF0B2AcWDqQ6IOMTMM0KCANBiSRBstHAz8R7axF6NMTplLd//uSZNMMhGdsyZMmHUAvABjdACIAk4WzJA2w0oCpAGK0AIgAmZtrYirjLJbu3BkKlCt6CiUaCFuzeS99JG/l6QO9Hb9mxUhyVP/LOWXcnonPxWURu5chh+INpqOkpbLuxZ3XKh19IfkEDtGgG7C44u9+IUuhvUWyYodoNCAhFxUASncAw4/9mLUVPUtSKIy6G5ZWsXq8/DI0QgkFSBGNFmlBkUC8TYpFKCji5LLolku6Sqi6iDcXcTeaBhHGmk4f+M5X6qFX7ppJi7YhuRycNhj4FMrvxd8JwQtzgYDXUC3VEACvVQ636UPimhOj7/2ez+u61P///////0IEtpqAKaqfg+gbAiRJwkQiAigJwSMyRyG4ZRNoymH0YSmUkY6KxEW06ZKQMAWp8ippKIxciooJiT2EhOaUUUw09VMILFt2c67q2K6mHc9SjXGQYUGFB1Bww11E9zNTwZaTHzcmFD4gQprhpwG3ceTNLoF8+Mx9a0/+O+Q5/+vod/YDQYCyrWwzA+23/t4rySVNelj9dfbd/6v1a//Z+n////7dimPPXP/7kmTQgBbRbEoTWEzyH4AZTQACAZEM/zWHpRCImoAitBCJuPUSIgu0+GTdAAkAAHtL9okDdJrpioZCOXKaJBycqvX+emGnVazGn3l1HuNuVOZQK6VFlfa+wpsEcgxlq4sIKOoCOSYv4kRlDyzSk1ULWzTkytSsNSj0KJ6Tkmd1/JUTRGgSpA0hJeRmnEntGomk3LyVzYqz8NHDozDiRUapDJympCMimR2ZWOe2dzz8/yylnp777YtU1ZTPOGWcUwUNiCopZdNbaLAGgUDDiSYqlxqwsVd0hJyP//bSDSKtrq//6b3f6r7O3V/293k1FJOChCLCmIiaoAkXThWkDRF/AQEXjVpWMm1CHVft32KxWLwS+UDXa0FwDDdR6JPKJayN2nlooFA8S4YRIlfRICIDAkDopEW11OJNii9PnlxQkftAqhO/I/7I+hZguTTDEO8VrkUyJXRpRybaqaGEBAPGFKD2EpjiCJqYdQ5VE0Xlcc3PbZsQfTVp6ZmmmhNLl5LFiIGdDRUto48NsjFAyosOIjDEkAbckASAITGsT3ProQb/+5JkuwIEx2tKwykd0iwgGN0EIgCUPbEozKR3SK+AIvQQiboqcaq//6trr2FJ3///+vd/s/qbHqixAY8qIhQTpQgUHIBjHFXyd6xorEzwCxhhKRFddTlLQeuAqjdXQdunfmfl1x/oKlDnuur5rSKzXU+JZGBSbEio6HyhASwSFZSCOVrvmmrSytRRuUbuiOAo06KkydrtQ81DqNdiSbkxwho4dLBjGvSp7POvZRXa2IJGVbTpJi9jZdcouW5x2PN6+b3t2+/5bvn/+xN/tmvvj+8nxcLachm5cnXE75WZzWMEAa8u1FAkturRKDGCouxDddVZRg1LhbtG0ddx3sb/r/9HR/R+dm+v//ZR6gBJUAhJGVhsj4ihGkLrDApoEBF9gkEy4QhWeylQBOtz19NkbeUxvbtRWDX0gVprVpdE1bZ5qTcoLMqionhJs0KHyQuTJjwPIEsIHN1UWyyl0+pS1tOBplB8QGJkiGBGiStIq0CwMspwEJ8Dx7uytVbqyJKLINjmNFa6Li+1v21iFpo0vtfvm0HVMzlfpLxbNfEpaw/c//uSZLCB5RptSgspNcAowBj9BCIAlMGxJw0lFwCtNiGAAJvZ+iowxE5odbiaLh0OEUTIKIj/545h//L90wDAn/CUV+f//yP/89eW37Lw/+X9dmdoq6wvmFfZA1ZhDQjMFWtJWGHIYSA2zIU9C4QiBRmL4q9ZPLGmPw+E7qaeV0WvPBIpmpqOQtzIOYxLna00J4ESWteRymDEkwYs5FzVTpCRryzWjBl1432NWt6xbq0XxPVZUPwk588XEq64xWGq64ATPwHUCmN8hSclTWYcYHfnBl55fLD91fnYdDnPp90hruc3x++/db/P6zO6Feks/Q74i3zUb+XPobqKzxgy4QPwXlp3/l+YDYfT2x5TfI+RGpNFyx8+////06uqZXdBNIxjjxsokhA8RRp4mDXExTYMyDRxQsUZECiSIeMW7VeXyUglSQANlXcqgzluD1vnDE68vHLqwA8z+w8yhwYbhpkOTrxRGSDQuqwsbBM8eoiX1knpJcTOI4abDSRUPJogQvQs6DNa5JGEKSANpjUTZInBVMmzNpKsd8Oc/t9S5bwxnf/7kmSgiwUfbMkDLDXALQ1YYAAl9lQRtScMpNaAoYAjtBCIAgtml0OfHfcesYr5lu+N3x6v92qoef9/z7+/nXv/93rKxIvwwrXmKiJM3D4a+MKAlYJaJbKLaGiULxxe8T2VH+tjGsR0/9VyFM9Xf/f/f/f3p///r3thVLBZSOBAAmUisUkQG1Ql+xgKXnZinQhPTKfWJxR8J99evBlK68qnoJg1gMPMuZqu6Jw8/sNw2tm/J5mtCnJUPuDJKPKt0rlEGr285JtqB70ywQsYnJZO41OAfglMUj92ICjRIWq7kRDiD4Nm6Vt4H8LxiwqYPbm4ef5ve0NV+pevqPl5hFWG+e4//eOuKPqjRkDYmFNiFQ4YKjqu3J8KQUpLf//qDaXMl9J6hHnNSjk3eX///5fv//D7+js7rYn4mMnWJMezWULxCqk6kx6JJlwpva5qkZ0ThrBzjL6XhVQCpruHDs81txV3t9ejMAw/A/3ItGFfu2j7DCS7xOJQM0FxeCReSh6PHbPUjMTwjWYVGJbea1CubLIlKP8SR88u+PkKn9nOzRL/+5Jkko8E+WzJA0lGMCvNeGAAJvZU7a8iDTDXCMKAYzQQiALDy5ZY9YLcDdCgj4glzFmGuaELxIBxM0bzACd3l00uQzl1LlNELSR/WzP/vtmr+u2fN///xjDd/rDKjUK1NvF9zxiB1M484wK2gIgcqSSSyRySWNEAFaSU4+LPNN2ottG6bPxZCOKJrrUercxrqqL//////odU1lG+CxQoFyABAAKNCJSYg4WVDhRxiw8wUg5TG0VUfEQnEgqAbboy6DInOSthlI7U26rpPjA6izqyZWyKOQaJEQrUnIMcVGYrICWShhRBuSmKQPZIxVY0qzjh7TAWRubpvFMRIEcwZMHByCxsq1tvvm9893en+NKRNjz0WMLRbIZt+H1nxphv67bGw/ePL////7iM56zZ+7Si8h7THMknMJE5korckMNglO8ADgADAAEBB/X/60f///+r////Vo//t0JqYSaEmrWG3MDwYQVGAASUBwSKBLGIXGrFo0cXYjgkOt9QMdGDR0f5+oo3VQwK5Y2yrLom512VLAhr5lPFRqyRsYo7FmTr//uSZIAABQ1ryKtJNaQjIBi9ACIAE3mtJyy8y8i0gGM0AIgCMB5WF6TorKpCdNx0gwU0EzgiUEaKS3d3s6ZWyREqjW00iFrPdKfpqeL9sGIppZ2SszX3MvSSFnZGfflR22tNuSs+xX9Pe+i///n7//vD+96vy/z1NuGo4lpbOqXfQXCJEQS2RwC2AkgJrYaOhIbTs+Lhxp0II/KrDn/9f9N2/R99n///7mwIOuc9gImAxQhAAyEzqwwUgGhjLuxKgnO3R9kblPUrK1iNidOLtKZFNSx2aaMYdf28yWXMfEkVCAJgNmkN0YHFWI0hdRKrGKVZUq+UeY+02QiNcDipKSnfuRWy70okiDPyJEiklpTs7/W+NkevvI1Wf7MvmaSbXbG1v/8a+3Z++5Pfxf/8M8thr5Ph4/e8d9d8vZfvzhp+FYxeNYlAtLSY4ALgAAcf/4VkFBfvvk616f///p2/0//9///r7//X/p/Rf/////9200l5XzWaLzlirGCilIerh2mnOaWA2XExbEBQd53dZLKb0ef6CmNQXLobfKdrvu/0+//7kmR4AwTTaskrTDUiLo0IrQAiVlPVryIMpRZIqQAjdBCJuqzgNCbkr2qw2Ku+0JRARE5ahGhiSqDQnJ0Sx5w7VUOM0J7OTcYNryxtCq3jMoOVOaYx4tliMbIjupxJMnmsTx3cac8vY5rWYqJSa62YXmIHnN9900XfPE6/URxut086TEtLUwwuDLHQRRsDwgeoEUoeIp4iDBw6eSwWyCS0MkoOHofRa2vFCSdCqSL//+Nf+n9n9yK2/9P2Vf/6yciEGuBsUWLBjUaSiIKdWQWpB0uViQZxG0V2rDjaTqjHWSZHQXpfGBhgH2cykil80VzWpix7W1U3ukUsw5GdndMCcbFe5PtgEYFIvRkLSSGNh8w/4zxFnP/xJQ6MOooHlC5FUdfxnQ6v2flxEyQXjaVnxsKyktaGuWZml2+Pvfabdtis713+5k/fHvG+zuOW+fOVPLqyzCbkFICGJMmnoVkmrAAtAFklgRBHWdZ8OBdK0stnb2fUtpX//t173tYZ//2f//0V1RK2taSREFAOGMoswYS1ZqmDkiECQao2Ps69rjn/+5JkbgMU3mzIg08y8CnAGN0AIgCSGbEkrIzbSKeAIvQQibpQIrbDjBoHo4LsUP2J+hlUPxuG3RkT9OM48MymbwhverMqsV5fGM7NrmXvijMUwch1MoZmG3q6ldqGTTHNQIBQHCaoqZR0yh6rw8yuAyJ0XTNm+JlwoeRe2eXc8umcyj3/9Z225lDGyFW++lJZacmJ2aDEwVrnCc4dIy2QRyQSCJiEOuanHEgpqvQgb/0uV6Kf+P97LHM9C/////G3tnaSYEYOCSoAQoAYAIDZyHQRzmkwSHIqKVIzS9Rd11PP03wXouEcKhHWlY3Qzd1aIq8wKB8cDhUw4WCjTMMDglAqz1GCsIBG5BQm10nTZTG+VOjndvpZlPW7nhEDTB5IzcNbO2XNZJrtDiHZpZqdG0aTzMZtZjXxsn/39y/5yG+X3zfFf7mfw8dCc3Gv7585Cm+VhI1IMUGKLRlBnLgSPvv7uBwIgWOV1M7Pk/n//X+19//T//////q3//9f///r//rtZKP3ye0oJAkgQAZsis8IMjTfPlEmdRKQfbirc6Fx//uSZGyKBLdsSUMsM0IszUi9BALCUgWzJIyxDcC9AGM0EIgCkkNj4IiQ7EtS2uKTAqPIB+D4XJyeUC3fKQkPnWizXdbqcNP89i5ett0T9sl7jLWNV6GiAPeU/h56ofVvnKyTmarFtW7P8dNbRffNIczc6jbZp5u5hJpfmYquHqVr40uqWGm4HizdcjDqO6QsTskycMgh5IO6EMwYG2LfCSWARiVoEoDOpMRYIt64v+mxb/6fb//1V+pB+6urqZ2XdSRB/bci2Ri8TNDANhcBAASwVXGlgEOM2gICGACIgZAEnK1F8GpuJxkB5meIpKvlo0PjCe1eJJKiC0/ZWrYlC665DZo9qM0S06VEDefN3ys89G3HVNdUNarSqtsR4ZEaGHuttY1zXnaXG7QPzXNGijw09bIPHRG9NVXHF3S2THzHTTx6zT20zLWnJWK6nwe1d2LUUPex0EMcfnCCIIoAhAoJCiw5NOJf8fcYccAEFCTr0q/P/l/9f//1//7f///t/////N/01337q8royq6EitIpmHLBoh6xDYoo0dZwkWpq5v/7kmRqCwTLbEirTENyK60IvQQCxFKptSIMsQvAt4Bi9BCIAiq77r4DNCMQPhwbnRGMi9CWXTg1P6FQuVBcYD55SRpYzNo+MTmPDFawpqpyQmxbJOuiXOq89Ll1cvGqqv6C4kSVY3FkJi3f2uKUq9qx5mcyRFYzq4qP4S0i73Tnu+N5r54uZS/2trQlKiIhDLmLLG1Vj1QUthCFBJVTjR8sFxZx48PRHDs+ZJXLGxJGiQQaZh7wmxyO7uON6/9PZUlH96u9SFqR9X//+j1s0C2pxKpY0yWeCFUCAQJmlwz+mMYIxGBfYDIIUTCOaknaZNQxp0XLqBegycRkr8J3nQeGaNkAozqkRATKRm3hGxzh+Fw6ii3FWw+4PZan2erda4b4WVTeHMx1VXNVWk2//ja+R1NK0jS99b2ktE/XP9JD/rU/EVMPfqyxcz3Mc1TxUcosIqr4jti5Bws7hUcNooQRU6+AAMBtwOiAhX/lL+/qvP+vT//b//3///tpv7///W3///T/v6T9JTI6GUvVHMxWkYUYgAoDMgAMrNGDBgEgwxP/+5JkZIkETm1JKylD0DENiK0EArISdbEirTEL2Lo0orQQCtEEPZInSv5krhCALikaCOZOIZgeEy8j0sOU5jcajVauJyaJ1KsOk6m+YthQ3dy1qG0vAoeNlHX8dYtq6RFUzTcdGuOw/W5o/5eXqeYINV4uNXHWkrzEx8yrHVFSfETV1XDy18tDxUTO3THNfzUFw0DGXEZGiYKGUsSKqp2hZ7WwZkP0gFrA2AAFG1wASAQv/9/Of9c//+n/3/v////b//7tT//9un0/pcxtDoslzbM7opRoR7QaYACosgSvH8SJWGoErMMApbK4bvVf1t1ctdkZFLutIDk5LDG5K45nx/mgnSGZ6lt8Mz9ie3cnOryXVix2TF8mquyVuaNlneGrhou6eYPNGFjBHqd1SR7pbRKDmvb+mlWmpta4qIfvFIne3RabWI7niE+mul6pEmoGqbOpxpSyPVXFDJcoYtigkD0RLLDgIig+uxcRBREABf/5Zn9bqCNT1Dd+WX/L9f////8//Z237rzeZsa16zF0zLcq0SSScQQEpYIVAkyzPvNn//uSZGUHBLVsSAMvQ2IrzahxACb2Ec2xIqylD5C2AGL0AIgCUCDmoArpcielM8DWm2lLnvzYdHRQIlxTBEgIgZLjQGWmkIZDzVwPlm3oFIIXSTaQdN1a6EEdM9NOe88DR/R1r18yietqsJ5y1HU5713fHzzrjVTsYjzy/8EzU9RdXPSfaTPzM3Nw9nVzFzZsWh4waTkmRCDDhGQbpZqsQKFlC54wGlF4WMPoSwURySVsgkF4vKv3qQ5zYDscygNM2/dqlJH/d/9ivoMLxb///Rka5ViBI80HKkCBEABTVOc+0LPmzJIUEiSSSrTlSGftV7XPf9oEHHbTSGoOTpqAutHPFAUnD7Lzjjb3RtOL6xNNPRa7QWKNnIHQPoftd1zvFI9pUUPuOaKisq4cYppU8/kadlcUtUiZpe8X/pNVf1SaXdPcx/c3axDOst9PD99SzXDdRcsMmRFR6GmWNIBaOIIIMEp64TgkHZNSyByORuQRAgBBalVr3Sytuga3/6LLHy7jv/o2ChZEfp/////jmNLCp42LGQWB0DgYLDy4BgrMUP/7kmRkgwSRbEjDDEPSMaAYrQQiAJKdsSAMmTfIpIBi9ACIAoxxXE2wELGjMNgyAWnqr1aJ8ZiNPNGp+YkGW91JLbjMggh84dvU9GCCSjrPgmiCHHjuWctDBblv9eWt9/jH/mt748vsPusyTJEGf73d1Ocm2aRhr5eXmlGxWZO48GQvH9ec3zY7+ai98d+/u+7/b+5uZavy5ppUynqGbbTRqjLl4KLMOZPOTRYZteS4VLtbXBJHBABA0CCGximGlU/9//33dk43/r8+xz09fd63f/9nIeNPyDUhITRSAEEgAJADIS5x8KHEQJdAskBRBxwHElpPTHNIkZc0EeKtdsbJazi6KZrVijL8xxLtZkN8UemZqEmgvJkEgNRUgYc8nvqWrHPUncHNn5drbOpeUlBLilqTQw5vd27289TEdlDN1OPDe3+3r9nu3a1s/7/742dzNVnbW79u37O2v+z3N6o3MBNA9o1ucBlGoEEIKHJg4KmRFIHol6EEQhyQSRuSCIkEKS8XtYZPO0nppHQf/35z9y9R7ami+hW7934t//9u+pj/+5JkYoDk6mxISy8x8jGACL0EIm6S+bMgrKUNwLa2IYAAm9g1AGECws0DB08gBgQMHBNJsrmGwWfN+EifLjIAYdUzgF1pQ0oMAOAgWFAWWRRUNnITRmgoHUDyVAucV1BI8sKKNQmzCLSLKvE3KKu1ixQWGzDbIixEzPVwjuc6LVT8dDh0TqxH0tGjBmV6jFq69O5tYpY56ttXxt8zMx6clTMUNqI5tKvssiGzGfIMkQWD8G0WWexMSeFRcsPBGDgRRQyg8I/7PyScvmwKWXnRHIlLY85yz8v/////vb/+s/yp8PPd9YqzVaSREQRTU6FnksRVAIADREOplpBRMhpAwCHJUTRYGXZXexwpvUqcaclGMn7O1/lc1hP0F3j+yaZpb9NWufWxopu1S6xwuY2b9DBwhgmxjHR8ynx4GOM9r1qH+5R6ZF58M4SWFHNFquOk+TQGHPbISynlCtkkazb6/KRw85K+NaGneerXU7F/EwRzOCEhIMHCMUcIwHJFHyLULAJLRJJRWIJIkQgkRXCLuvqJm+kbp+1qX77+2kXfGVkP//uSZFcDBIJtSCsjNtAvoBjNACIAkJ2xFQwxB0i1gGG8AIgARf//2tPP/1f3bmKTLJOtEAweALCCaSfT4AEA6E3HYo7xkEpYBsOxKJ32mUxk2YrVp6DUFQCwjQ012LHKtSSKirbMzMzKtcMxR0NMNftWzMzNCqqqsSrftfUeqrWtcNbNqrMU0wULCxqrDSKr//Nbckipqr3DXxaqrftqtftxeyrUiqrWx01c7MoqDU2LXgkGqCwscULMKBmeGYFh/+K0YEw6mHeRxLg16j3LHv1fUsFXazv+HeJUf//Wd//I/+JToNA0DKpMQU1FMy45OS4zqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxBTUUzLjk5LjOqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7kmRAj/AAAGkAAAAIAAANIAAAAQAAAaQAAAAgAAA0gAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo="; //http://www.openairlib.net/ + var me = this; + this.audioContext = audioContext; + this.output = audioContext.createGain(); + this.input = this.audioContext.createBiquadFilter(); + this.compressor = audioContext.createDynamicsCompressor(); + this.compressorWet = audioContext.createGain(); + this.compressorDry = audioContext.createGain(); + this.convolver = null; + this.convolverInput = audioContext.createGain(); + this.dry = audioContext.createGain(); + this.wet = audioContext.createGain(); + this.input.type = "lowpass"; + this.input.frequency.setTargetAtTime(18000, 0, 0.0001); + this.compressorWet.gain.setTargetAtTime(1.0, 0, 0.0001); + this.compressorDry.gain.setTargetAtTime(0.0, 0, 0.0001); + var threshold = -35; + var knee = 35; + var ratio = 8; + var attack = 0.02; + var release = 0.1; + this.compressor.threshold.setValueAtTime(threshold, 0.0001); //-100,0 + this.compressor.knee.setValueAtTime(knee, 0.0001); //0,40 + this.compressor.ratio.setValueAtTime(ratio, 0.0001); //2,20 + this.compressor.attack.setValueAtTime(attack, 0.0001); //0,1 + this.compressor.release.setValueAtTime(release, 0.0001); //0,1 + this.dry.gain.setTargetAtTime(0.6, 0, 0.0001); + this.wet.gain.setTargetAtTime(0.4, 0, 0.0001); + this.input.connect(this.compressorDry); + this.compressorDry.connect(this.convolverInput); + this.input.connect(this.compressorWet); + this.compressorWet.connect(this.compressor); + this.compressor.connect(this.convolverInput); + this.convolverInput.connect(this.dry); + this.dry.connect(this.output); + this.convolverInput.connect(this.wet); + var datalen = this.irr.length / 2; + this.irrArrayBuffer = new ArrayBuffer(datalen); + var view = new Uint8Array(this.irrArrayBuffer); + var decoded = atob(this.irr); + var b; + for (var i = 0; i < decoded.length; i++) { + b = decoded.charCodeAt(i); + view[i] = b; + } + this.audioContext.decodeAudioData(this.irrArrayBuffer, function (audioBuffer) { + var c = audioContext.createConvolver(); + c.buffer = audioBuffer; + me.wet.connect(c); + c.connect(me.output); + me.convolver = c; + console.log('convolver audioBuffer', audioBuffer); + }); + } + return WebAudioFontReverberator; +}()); +var WebAudioFontTicker = /** @class */ (function () { + function WebAudioFontTicker() { + this.stateStop = 1; + this.statePlay = 2; + this.stateEnd = 3; + this.state = this.stateStop; + this.stepDuration = 0.1; + this.lastPosition = 0; + } + WebAudioFontTicker.prototype.playLoop = function (player, audioContext, loopStart, loopPosition, loopEnd, queue) { + this.startTicks(audioContext, function (when, from, to) { + for (var i = 0; i < queue.length; i++) { + var note = queue[i]; + if (note.when >= from && note.when < to) { + var start = when + note.when - from; + player.queueWaveTable(audioContext, note.destination, note.preset, start, note.pitch, note.duration, note.volume, note.slides); + } + } + }, loopStart, loopPosition, loopEnd, function (at) { + player.cancelQueue(audioContext); + }); + }; + ; + WebAudioFontTicker.prototype.startTicks = function (audioContext, onTick, loopStart, loopPosition, loopEnd, onEnd) { + if (this.state == this.stateStop) { + this.state = this.statePlay; + this.tick(audioContext, audioContext.currentTime, onTick, loopStart, loopPosition, loopEnd, onEnd); + } + }; + ; + WebAudioFontTicker.prototype.tick = function (audioContext, nextAudioTime, onTick, loopStart, loopPosition, loopEnd, onEnd) { + this.lastPosition = loopPosition; + if (this.state == this.stateEnd) { + this.state = this.stateStop; + onEnd(loopPosition); + } + else { + if (this.state == this.statePlay) { + if (nextAudioTime - this.stepDuration < audioContext.currentTime) { + if (loopPosition + this.stepDuration < loopEnd) { + var from = loopPosition; + var to = loopPosition + this.stepDuration; + onTick(nextAudioTime, from, to); + loopPosition = to; + } + else { + var from = loopPosition; + var to = loopEnd; + onTick(nextAudioTime, from, to); + from = loopStart; + to = loopStart + this.stepDuration - (loopEnd - loopPosition); + if (to < loopEnd) { + onTick(nextAudioTime + (loopEnd - loopPosition), from, to); + loopPosition = to; + } + else { + loopPosition = loopEnd; + } + } + nextAudioTime = nextAudioTime + this.stepDuration; + if (nextAudioTime < audioContext.currentTime) { + nextAudioTime = audioContext.currentTime; + } + } + var me = this; + window.requestAnimationFrame(function (time) { + me.tick(audioContext, nextAudioTime, onTick, loopStart, loopPosition, loopEnd, onEnd); + }); + } + } + }; + WebAudioFontTicker.prototype.cancel = function () { + if (this.state == this.statePlay) { + this.state = this.stateEnd; + } + }; + ; + return WebAudioFontTicker; +}()); diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/LICENSE.md b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/LICENSE.md new file mode 100644 index 00000000..c015913e --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/LICENSE.md @@ -0,0 +1,21 @@ +[The MIT License](http://opensource.org/licenses/MIT) + +Copyright © 2016 Yotam Mann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/README.md b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/README.md new file mode 100644 index 00000000..2e89bf91 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/README.md @@ -0,0 +1,170 @@ +[![Build Status](https://travis-ci.org/Tonejs/Midi.svg?branch=master)](https://travis-ci.org/Tonejs/Midi) +[![codecov](https://codecov.io/gh/Tonejs/Midi/branch/master/graph/badge.svg)](https://codecov.io/gh/Tonejs/Midi) + +## Installation + +`npm install @tonejs/midi` + +## [DEMO](https://tonejs.github.io/Midi/) + +Midi makes it straightforward to read and write MIDI files with Javascript. It uses [midi-file](https://github.com/carter-thaxton/midi-file) for parsing and writing. + +## Import + +Node.js: + +```javascript +const { Midi } = require('@tonejs/midi') +``` + +Typescript / ES6 + +```javascript +import { Midi } from '@tonejs/midi' +``` + +Browser + +```html + +``` +```javascript +const midi = new Midi() +``` + +## Basic Example + + +```javascript +// load a midi file in the browser +const midi = await Midi.fromUrl("path/to/midi.mid") +//the file name decoded from the first track +const name = midi.name +//get the tracks +midi.tracks.forEach(track => { + //tracks have notes and controlChanges + + //notes are an array + const notes = track.notes + notes.forEach(note => { + //note.midi, note.time, note.duration, note.name + }) + + //the control changes are an object + //the keys are the CC number + track.controlChanges[64] + //they are also aliased to the CC number's common name (if it has one) + track.controlChanges.sustain.forEach(cc => { + // cc.ticks, cc.value, cc.time + }) + + //the track also has a channel and instrument + //track.instrument.name +}) +``` + +### Format + +The data parsed from the midi file looks like this: + +```javascript +{ + // the transport and timing data + header: { + name: String, // the name of the first empty track, + // which is usually the song name + tempos: TempoEvent[], // the tempo, e.g. 120 + timeSignatures: TimeSignatureEvent[], // the time signature, e.g. [4, 4], + + PPQ: Number // the Pulses Per Quarter of the midi file + // this is read only + }, + + duration: Number, // the time until the last note finishes + + // an array of midi tracks + tracks: [ + { + name: String, // the track name if one was given + + channel: Number, // channel + // the ID for this channel; 9 and 10 are + // reserved for percussion + notes: [ + { + midi: Number, // midi number, e.g. 60 + time: Number, // time in seconds + ticks: Number, // time in ticks + name: String, // note name, e.g. "C4", + pitch: String, // the pitch class, e.g. "C", + octave : Number, // the octave, e.g. 4 + velocity: Number, // normalized 0-1 velocity + duration: Number, // duration in seconds between noteOn and noteOff + } + ], + + // midi control changes + controlChanges: { + // if there are control changes in the midi file + '91': [ + { + number: Number, // the cc number + ticks: Number, // time in ticks + time: Number, // time in seconds + value: Number, // normalized 0-1 + } + ], + }, + + instrument: { // and object representing the program change events + number : Number, // the instrument number 0-127 + family: String, // the family of instruments, read only. + name : String, // the name of the instrument + percussion: Boolean, // if the instrument is a percussion instrument + }, + } + ] +} +``` + +### Raw Midi Parsing + +If you are using Node.js or have the raw binary string from the midi file, just use the `parse` method: + +```javascript +const midiData = fs.readFileSync("test.mid") +const midi = new Midi(midiData) +``` + +### Encoding Midi + +You can also create midi files from scratch or by modifying an existing file. + +```javascript +// create a new midi file +var midi = new Midi() +// add a track +const track = midi.addTrack() +track.addNote({ + midi : 60, + time : 0, + duration: 0.2 +}) +.addNote({ + name : 'C5', + time : 0.3, + duration: 0.1 +}) +.addCC({ + number : 64, + value : 127, + time : 0.2 +}) + +// write the output +fs.writeFileSync("output.mid", new Buffer(midi.toArray())) +``` + +### Acknowledgment + +Thank you [midi-file](https://github.com/carter-thaxton/midi-file)! diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/build/Midi.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/build/Midi.js new file mode 100644 index 00000000..ddf4a123 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/build/Midi.js @@ -0,0 +1,2 @@ +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r=e();for(var n in r)("object"==typeof exports?exports:t)[n]=r[n]}}("undefined"!=typeof self?self:this,(function(){return(()=>{var t={507:(t,e,r)=>{"use strict";function n(t){var e=[];return i(t,e),e}function i(t,e){for(var r=0;rn})},289:(t,e,r)=>{e.parseMidi=r(666),e.writeMidi=r(865)},666:t=>{function e(t){for(var e,n=new r(t),i=[];!n.eof();){var a=o();i.push(a)}return i;function o(){var t={};t.deltaTime=n.readVarInt();var r=n.readUInt8();if(240==(240&r)){if(255!==r){if(240==r)return t.type="sysEx",a=n.readVarInt(),t.data=n.readBytes(a),t;if(247==r)return t.type="endSysEx",a=n.readVarInt(),t.data=n.readBytes(a),t;throw"Unrecognised MIDI event type byte: "+r}t.meta=!0;var i=n.readUInt8(),a=n.readVarInt();switch(i){case 0:if(t.type="sequenceNumber",2!==a)throw"Expected length for sequenceNumber event is 2, got "+a;return t.number=n.readUInt16(),t;case 1:return t.type="text",t.text=n.readString(a),t;case 2:return t.type="copyrightNotice",t.text=n.readString(a),t;case 3:return t.type="trackName",t.text=n.readString(a),t;case 4:return t.type="instrumentName",t.text=n.readString(a),t;case 5:return t.type="lyrics",t.text=n.readString(a),t;case 6:return t.type="marker",t.text=n.readString(a),t;case 7:return t.type="cuePoint",t.text=n.readString(a),t;case 32:if(t.type="channelPrefix",1!=a)throw"Expected length for channelPrefix event is 1, got "+a;return t.channel=n.readUInt8(),t;case 33:if(t.type="portPrefix",1!=a)throw"Expected length for portPrefix event is 1, got "+a;return t.port=n.readUInt8(),t;case 47:if(t.type="endOfTrack",0!=a)throw"Expected length for endOfTrack event is 0, got "+a;return t;case 81:if(t.type="setTempo",3!=a)throw"Expected length for setTempo event is 3, got "+a;return t.microsecondsPerBeat=n.readUInt24(),t;case 84:if(t.type="smpteOffset",5!=a)throw"Expected length for smpteOffset event is 5, got "+a;var o=n.readUInt8();return t.frameRate={0:24,32:25,64:29,96:30}[96&o],t.hour=31&o,t.min=n.readUInt8(),t.sec=n.readUInt8(),t.frame=n.readUInt8(),t.subFrame=n.readUInt8(),t;case 88:if(t.type="timeSignature",4!=a)throw"Expected length for timeSignature event is 4, got "+a;return t.numerator=n.readUInt8(),t.denominator=1<>4;switch(t.channel=15&r,c){case 8:return t.type="noteOff",t.noteNumber=s,t.velocity=n.readUInt8(),t;case 9:var u=n.readUInt8();return t.type=0===u?"noteOff":"noteOn",t.noteNumber=s,t.velocity=u,0===u&&(t.byte9=!0),t;case 10:return t.type="noteAftertouch",t.noteNumber=s,t.amount=n.readUInt8(),t;case 11:return t.type="controller",t.controllerType=s,t.value=n.readUInt8(),t;case 12:return t.type="programChange",t.programNumber=s,t;case 13:return t.type="channelAftertouch",t.amount=s,t;case 14:return t.type="pitchBend",t.value=s+(n.readUInt8()<<7)-8192,t;default:throw"Unrecognised MIDI event type: "+c}}}}function r(t){this.buffer=t,this.bufferLen=this.buffer.length,this.pos=0}r.prototype.eof=function(){return this.pos>=this.bufferLen},r.prototype.readUInt8=function(){var t=this.buffer[this.pos];return this.pos+=1,t},r.prototype.readInt8=function(){var t=this.readUInt8();return 128&t?t-256:t},r.prototype.readUInt16=function(){return(this.readUInt8()<<8)+this.readUInt8()},r.prototype.readInt16=function(){var t=this.readUInt16();return 32768&t?t-65536:t},r.prototype.readUInt24=function(){return(this.readUInt8()<<16)+(this.readUInt8()<<8)+this.readUInt8()},r.prototype.readInt24=function(){var t=this.readUInt24();return 8388608&t?t-16777216:t},r.prototype.readUInt32=function(){return(this.readUInt8()<<24)+(this.readUInt8()<<16)+(this.readUInt8()<<8)+this.readUInt8()},r.prototype.readBytes=function(t){var e=this.buffer.slice(this.pos,this.pos+t);return this.pos+=t,e},r.prototype.readString=function(t){var e=this.readBytes(t);return String.fromCharCode.apply(null,e)},r.prototype.readVarInt=function(){for(var t=0;!this.eof();){var e=this.readUInt8();if(!(128&e))return t+e;t+=127&e,t<<=7}return t},r.prototype.readChunk=function(){var t=this.readString(4),e=this.readUInt32();return{id:t,length:e,data:this.readBytes(e)}},t.exports=function(t){var n=new r(t),i=n.readChunk();if("MThd"!=i.id)throw"Bad MIDI file. Expected 'MHdr', got: '"+i.id+"'";for(var a=function(t){var e=new r(t),n={format:e.readUInt16(),numTracks:e.readUInt16()},i=e.readUInt16();return 32768&i?(n.framesPerSecond=256-(i>>8),n.ticksPerFrame=255&i):n.ticksPerBeat=i,n}(i.data),o=[],s=0;!n.eof()&&s{function e(t,e,i){var a,o=new n,s=e.length,c=null;for(a=0;a>7&127;t.writeUInt8(p),t.writeUInt8(l);break;default:throw"Unrecognized event type: "+i}return c}function n(){this.buffer=[]}n.prototype.writeUInt8=function(t){this.buffer.push(255&t)},n.prototype.writeInt8=n.prototype.writeUInt8,n.prototype.writeUInt16=function(t){var e=t>>8&255,r=255&t;this.writeUInt8(e),this.writeUInt8(r)},n.prototype.writeInt16=n.prototype.writeUInt16,n.prototype.writeUInt24=function(t){var e=t>>16&255,r=t>>8&255,n=255&t;this.writeUInt8(e),this.writeUInt8(r),this.writeUInt8(n)},n.prototype.writeInt24=n.prototype.writeUInt24,n.prototype.writeUInt32=function(t){var e=t>>24&255,r=t>>16&255,n=t>>8&255,i=255&t;this.writeUInt8(e),this.writeUInt8(r),this.writeUInt8(n),this.writeUInt8(i)},n.prototype.writeInt32=n.prototype.writeUInt32,n.prototype.writeBytes=function(t){this.buffer=this.buffer.concat(Array.prototype.slice.call(t,0))},n.prototype.writeString=function(t){var e,r=t.length,n=[];for(e=0;e>=7;e;){var n=127&e|128;r.push(n),e>>=7}this.writeBytes(r.reverse())}},n.prototype.writeChunk=function(t,e){this.writeString(t),this.writeUInt32(e.length),this.writeBytes(e)},t.exports=function(t,r){if("object"!=typeof t)throw"Invalid MIDI data";r=r||{};var i,a=t.header||{},o=t.tracks||[],s=o.length,c=new n;for(function(t,e,r){var i=null==e.format?1:e.format,a=128;e.timeDivision?a=e.timeDivision:e.ticksPerFrame&&e.framesPerSecond?a=-(255&e.framesPerSecond)<<8|255&e.ticksPerFrame:e.ticksPerBeat&&(a=32767&e.ticksPerBeat);var o=new n;o.writeUInt16(i),o.writeUInt16(r),o.writeUInt16(a),t.writeChunk("MThd",o.buffer)}(c,a,s),i=0;i{"use strict";function r(t,e,r){void 0===r&&(r="ticks");var n=0,i=t.length,a=i;if(i>0&&t[i-1][r]<=e)return i-1;for(;ne)return o;s[r]>e?a=o:s[r]{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.ControlChange=e.controlChangeIds=e.controlChangeNames=void 0,e.controlChangeNames={1:"modulationWheel",2:"breath",4:"footController",5:"portamentoTime",7:"volume",8:"balance",10:"pan",64:"sustain",65:"portamentoTime",66:"sostenuto",67:"softPedal",68:"legatoFootswitch",84:"portamentoControl"},e.controlChangeIds=Object.keys(e.controlChangeNames).reduce((function(t,r){return t[e.controlChangeNames[r]]=r,t}),{});var r=new WeakMap,n=new WeakMap,i=function(){function t(t,e){r.set(this,e),n.set(this,t.controllerType),this.ticks=t.absoluteTime,this.value=t.value}return Object.defineProperty(t.prototype,"number",{get:function(){return n.get(this)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"name",{get:function(){return e.controlChangeNames[this.number]?e.controlChangeNames[this.number]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"time",{get:function(){return r.get(this).ticksToSeconds(this.ticks)},set:function(t){var e=r.get(this);this.ticks=e.secondsToTicks(t)},enumerable:!1,configurable:!0}),t.prototype.toJSON=function(){return{number:this.number,ticks:this.ticks,time:this.time,value:this.value}},t}();e.ControlChange=i},906:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.createControlChanges=void 0;var n=r(543);e.createControlChanges=function(){return new Proxy({},{get:function(t,e){return t[e]?t[e]:n.controlChangeIds.hasOwnProperty(e)?t[n.controlChangeIds[e]]:void 0},set:function(t,e,r){return n.controlChangeIds.hasOwnProperty(e)?t[n.controlChangeIds[e]]=r:t[e]=r,!0}})}},54:function(t,e,r){"use strict";var n=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,i=0,a=e.length;i{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Header=e.keySignatureKeys=void 0;var n=r(805),i=new WeakMap;e.keySignatureKeys=["Cb","Gb","Db","Ab","Eb","Bb","F","C","G","D","A","E","B","F#","C#"];var a=function(){function t(t){var r=this;if(this.tempos=[],this.timeSignatures=[],this.keySignatures=[],this.meta=[],this.name="",i.set(this,480),t){i.set(this,t.header.ticksPerBeat),t.tracks.forEach((function(t){t.forEach((function(t){t.meta&&("timeSignature"===t.type?r.timeSignatures.push({ticks:t.absoluteTime,timeSignature:[t.numerator,t.denominator]}):"setTempo"===t.type?r.tempos.push({bpm:6e7/t.microsecondsPerBeat,ticks:t.absoluteTime}):"keySignature"===t.type&&r.keySignatures.push({key:e.keySignatureKeys[t.key+7],scale:0===t.scale?"major":"minor",ticks:t.absoluteTime}))}))}));var n=0;t.tracks[0].forEach((function(t){n+=t.deltaTime,t.meta&&("trackName"===t.type?r.name=t.text:"text"!==t.type&&"cuePoint"!==t.type&&"marker"!==t.type&&"lyrics"!==t.type||r.meta.push({text:t.text,ticks:n,type:t.type}))})),this.update()}}return t.prototype.update=function(){var t=this,e=0,r=0;this.tempos.sort((function(t,e){return t.ticks-e.ticks})),this.tempos.forEach((function(n,i){var a=i>0?t.tempos[i-1].bpm:t.tempos[0].bpm,o=n.ticks/t.ppq-r,s=60/a*o;n.time=s+e,e=n.time,r+=o})),this.timeSignatures.sort((function(t,e){return t.ticks-e.ticks})),this.timeSignatures.forEach((function(e,r){var n=r>0?t.timeSignatures[r-1]:t.timeSignatures[0],i=(e.ticks-n.ticks)/t.ppq/n.timeSignature[0]/(n.timeSignature[1]/4);n.measures=n.measures||0,e.measures=i+n.measures}))},t.prototype.ticksToSeconds=function(t){var e=(0,n.search)(this.tempos,t);if(-1!==e){var r=this.tempos[e],i=r.time,a=(t-r.ticks)/this.ppq;return i+60/r.bpm*a}return t/this.ppq*.5},t.prototype.ticksToMeasures=function(t){var e=(0,n.search)(this.timeSignatures,t);if(-1!==e){var r=this.timeSignatures[e],i=(t-r.ticks)/this.ppq;return r.measures+i/(r.timeSignature[0]/r.timeSignature[1])/4}return t/this.ppq/4},Object.defineProperty(t.prototype,"ppq",{get:function(){return i.get(this)},enumerable:!1,configurable:!0}),t.prototype.secondsToTicks=function(t){var e=(0,n.search)(this.tempos,t,"time");if(-1!==e){var r=this.tempos[e],i=(t-r.time)/(60/r.bpm);return Math.round(r.ticks+i*this.ppq)}var a=t/.5;return Math.round(a*this.ppq)},t.prototype.toJSON=function(){return{keySignatures:this.keySignatures,meta:this.meta,name:this.name,ppq:this.ppq,tempos:this.tempos.map((function(t){return{bpm:t.bpm,ticks:t.ticks}})),timeSignatures:this.timeSignatures}},t.prototype.fromJSON=function(t){this.name=t.name,this.tempos=t.tempos.map((function(t){return Object.assign({},t)})),this.timeSignatures=t.timeSignatures.map((function(t){return Object.assign({},t)})),this.keySignatures=t.keySignatures.map((function(t){return Object.assign({},t)})),this.meta=t.meta.map((function(t){return Object.assign({},t)})),i.set(this,t.ppq),this.update()},t.prototype.setTempo=function(t){this.tempos=[{bpm:t,ticks:0}],this.update()},t}();e.Header=a},362:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Instrument=void 0;var n=r(438),i=new WeakMap,a=function(){function t(t,e){if(this.number=0,i.set(this,e),this.number=0,t){var r=t.find((function(t){return"programChange"===t.type}));r&&(this.number=r.programNumber)}}return Object.defineProperty(t.prototype,"name",{get:function(){return this.percussion?n.DrumKitByPatchID[this.number]:n.instrumentByPatchID[this.number]},set:function(t){var e=n.instrumentByPatchID.indexOf(t);-1!==e&&(this.number=e)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"family",{get:function(){return this.percussion?"drums":n.InstrumentFamilyByID[Math.floor(this.number/8)]},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"percussion",{get:function(){return 9===i.get(this).channel},enumerable:!1,configurable:!0}),t.prototype.toJSON=function(){return{family:this.family,number:this.number,name:this.name}},t.prototype.fromJSON=function(t){this.number=t.number},t}();e.Instrument=a},438:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.DrumKitByPatchID=e.InstrumentFamilyByID=e.instrumentByPatchID=void 0,e.instrumentByPatchID=["acoustic grand piano","bright acoustic piano","electric grand piano","honky-tonk piano","electric piano 1","electric piano 2","harpsichord","clavi","celesta","glockenspiel","music box","vibraphone","marimba","xylophone","tubular bells","dulcimer","drawbar organ","percussive organ","rock organ","church organ","reed organ","accordion","harmonica","tango accordion","acoustic guitar (nylon)","acoustic guitar (steel)","electric guitar (jazz)","electric guitar (clean)","electric guitar (muted)","overdriven guitar","distortion guitar","guitar harmonics","acoustic bass","electric bass (finger)","electric bass (pick)","fretless bass","slap bass 1","slap bass 2","synth bass 1","synth bass 2","violin","viola","cello","contrabass","tremolo strings","pizzicato strings","orchestral harp","timpani","string ensemble 1","string ensemble 2","synthstrings 1","synthstrings 2","choir aahs","voice oohs","synth voice","orchestra hit","trumpet","trombone","tuba","muted trumpet","french horn","brass section","synthbrass 1","synthbrass 2","soprano sax","alto sax","tenor sax","baritone sax","oboe","english horn","bassoon","clarinet","piccolo","flute","recorder","pan flute","blown bottle","shakuhachi","whistle","ocarina","lead 1 (square)","lead 2 (sawtooth)","lead 3 (calliope)","lead 4 (chiff)","lead 5 (charang)","lead 6 (voice)","lead 7 (fifths)","lead 8 (bass + lead)","pad 1 (new age)","pad 2 (warm)","pad 3 (polysynth)","pad 4 (choir)","pad 5 (bowed)","pad 6 (metallic)","pad 7 (halo)","pad 8 (sweep)","fx 1 (rain)","fx 2 (soundtrack)","fx 3 (crystal)","fx 4 (atmosphere)","fx 5 (brightness)","fx 6 (goblins)","fx 7 (echoes)","fx 8 (sci-fi)","sitar","banjo","shamisen","koto","kalimba","bag pipe","fiddle","shanai","tinkle bell","agogo","steel drums","woodblock","taiko drum","melodic tom","synth drum","reverse cymbal","guitar fret noise","breath noise","seashore","bird tweet","telephone ring","helicopter","applause","gunshot"],e.InstrumentFamilyByID=["piano","chromatic percussion","organ","guitar","bass","strings","ensemble","brass","reed","pipe","synth lead","synth pad","synth effects","world","percussive","sound effects"],e.DrumKitByPatchID={0:"standard kit",8:"room kit",16:"power kit",24:"electronic kit",25:"tr-808 kit",32:"jazz kit",40:"brush kit",48:"orchestra kit",56:"sound fx kit"}},233:function(t,e,r){"use strict";var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(i,a){function o(t){try{c(n.next(t))}catch(t){a(t)}}function s(t){try{c(n.throw(t))}catch(t){a(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(o,s)}c((n=n.apply(t,e||[])).next())}))},i=this&&this.__generator||function(t,e){var r,n,i,a,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;o;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,n=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!((i=(i=o.trys).length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]{"use strict";function r(t){return["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"][t%12]}Object.defineProperty(e,"__esModule",{value:!0}),e.Note=void 0;var n,i,a=(n=/^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i,i={cbb:-2,cb:-1,c:0,"c#":1,cx:2,dbb:0,db:1,d:2,"d#":3,dx:4,ebb:2,eb:3,e:4,"e#":5,ex:6,fbb:3,fb:4,f:5,"f#":6,fx:7,gbb:5,gb:6,g:7,"g#":8,gx:9,abb:7,ab:8,a:9,"a#":10,ax:11,bbb:9,bb:10,b:11,"b#":12,bx:13},function(t){var e=n.exec(t),r=e[1],a=e[2];return i[r.toLowerCase()]+12*(parseInt(a,10)+1)}),o=new WeakMap,s=function(){function t(t,e,r){o.set(this,r),this.midi=t.midi,this.velocity=t.velocity,this.noteOffVelocity=e.velocity,this.ticks=t.ticks,this.durationTicks=e.ticks-t.ticks}return Object.defineProperty(t.prototype,"name",{get:function(){return t=this.midi,e=Math.floor(t/12)-1,r(t)+e.toString();var t,e},set:function(t){this.midi=a(t)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"octave",{get:function(){return Math.floor(this.midi/12)-1},set:function(t){var e=t-this.octave;this.midi+=12*e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"pitch",{get:function(){return r(this.midi)},set:function(t){this.midi=12*(this.octave+1)+["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"].indexOf(t)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"duration",{get:function(){var t=o.get(this);return t.ticksToSeconds(this.ticks+this.durationTicks)-t.ticksToSeconds(this.ticks)},set:function(t){var e=o.get(this).secondsToTicks(this.time+t);this.durationTicks=e-this.ticks},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"time",{get:function(){return o.get(this).ticksToSeconds(this.ticks)},set:function(t){var e=o.get(this);this.ticks=e.secondsToTicks(t)},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"bars",{get:function(){return o.get(this).ticksToMeasures(this.ticks)},enumerable:!1,configurable:!0}),t.prototype.toJSON=function(){return{duration:this.duration,durationTicks:this.durationTicks,midi:this.midi,name:this.name,ticks:this.ticks,time:this.time,velocity:this.velocity}},t}();e.Note=s},882:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.PitchBend=void 0;var r=new WeakMap,n=function(){function t(t,e){r.set(this,e),this.ticks=t.absoluteTime,this.value=t.value}return Object.defineProperty(t.prototype,"time",{get:function(){return r.get(this).ticksToSeconds(this.ticks)},set:function(t){var e=r.get(this);this.ticks=e.secondsToTicks(t)},enumerable:!1,configurable:!0}),t.prototype.toJSON=function(){return{ticks:this.ticks,time:this.time,value:this.value}},t}();e.PitchBend=n},334:(t,e,r)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.Track=void 0;var n=r(805),i=r(543),a=r(906),o=r(882),s=r(362),c=r(518),u=new WeakMap,h=function(){function t(t,e){var r=this;if(this.name="",this.notes=[],this.controlChanges=(0,a.createControlChanges)(),this.pitchBends=[],u.set(this,e),t){var n=t.find((function(t){return"trackName"===t.type}));this.name=n?n.text:""}if(this.instrument=new s.Instrument(t,this),this.channel=0,t){for(var i=t.filter((function(t){return"noteOn"===t.type})),o=t.filter((function(t){return"noteOff"===t.type})),c=function(){var t=i.shift();h.channel=t.channel;var e=o.findIndex((function(e){return e.noteNumber===t.noteNumber&&e.absoluteTime>=t.absoluteTime}));if(-1!==e){var r=o.splice(e,1)[0];h.addNote({durationTicks:r.absoluteTime-t.absoluteTime,midi:t.noteNumber,noteOffVelocity:r.velocity/127,ticks:t.absoluteTime,velocity:t.velocity/127})}},h=this;i.length;)c();t.filter((function(t){return"controller"===t.type})).forEach((function(t){r.addCC({number:t.controllerType,ticks:t.absoluteTime,value:t.value/127})})),t.filter((function(t){return"pitchBend"===t.type})).forEach((function(t){r.addPitchBend({ticks:t.absoluteTime,value:t.value/Math.pow(2,13)})}));var f=t.find((function(t){return"endOfTrack"===t.type}));this.endOfTrackTicks=void 0!==f?f.absoluteTime:void 0}}return t.prototype.addNote=function(t){var e=u.get(this),r=new c.Note({midi:0,ticks:0,velocity:1},{ticks:0,velocity:0},e);return Object.assign(r,t),(0,n.insert)(this.notes,r,"ticks"),this},t.prototype.addCC=function(t){var e=u.get(this),r=new i.ControlChange({controllerType:t.number},e);return delete t.number,Object.assign(r,t),Array.isArray(this.controlChanges[r.number])||(this.controlChanges[r.number]=[]),(0,n.insert)(this.controlChanges[r.number],r,"ticks"),this},t.prototype.addPitchBend=function(t){var e=u.get(this),r=new o.PitchBend({},e);return Object.assign(r,t),(0,n.insert)(this.pitchBends,r,"ticks"),this},Object.defineProperty(t.prototype,"duration",{get:function(){if(!this.notes.length)return 0;for(var t=this.notes[this.notes.length-1].time+this.notes[this.notes.length-1].duration,e=0;e{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r(233)})()})); +//# sourceMappingURL=Midi.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/build/Midi.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/build/Midi.js.map new file mode 100644 index 00000000..f51e657d --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/build/Midi.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Midi.js","mappings":"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","sources":["webpack://@tonejs/midi/webpack/universalModuleDefinition","webpack://@tonejs/midi/./node_modules/array-flatten/dist.es2015/index.js","webpack://@tonejs/midi/./node_modules/midi-file/index.js","webpack://@tonejs/midi/./node_modules/midi-file/lib/midi-parser.js","webpack://@tonejs/midi/./node_modules/midi-file/lib/midi-writer.js","webpack://@tonejs/midi/./src/BinarySearch.ts","webpack://@tonejs/midi/./src/ControlChange.ts","webpack://@tonejs/midi/./src/ControlChanges.ts","webpack://@tonejs/midi/./src/Encode.ts","webpack://@tonejs/midi/./src/Header.ts","webpack://@tonejs/midi/./src/Instrument.ts","webpack://@tonejs/midi/./src/InstrumentMaps.ts","webpack://@tonejs/midi/./src/Midi.ts","webpack://@tonejs/midi/./src/Note.ts","webpack://@tonejs/midi/./src/PitchBend.ts","webpack://@tonejs/midi/./src/Track.ts","webpack://@tonejs/midi/webpack/bootstrap","webpack://@tonejs/midi/webpack/runtime/define property getters","webpack://@tonejs/midi/webpack/runtime/hasOwnProperty shorthand","webpack://@tonejs/midi/webpack/runtime/make namespace object","webpack://@tonejs/midi/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn ","/**\n * Flatten an array indefinitely.\n */\nexport function flatten(array) {\n var result = [];\n $flatten(array, result);\n return result;\n}\n/**\n * Internal flatten function recursively passes `result`.\n */\nfunction $flatten(array, result) {\n for (var i = 0; i < array.length; i++) {\n var value = array[i];\n if (Array.isArray(value)) {\n $flatten(value, result);\n }\n else {\n result.push(value);\n }\n }\n}\n//# sourceMappingURL=index.js.map","exports.parseMidi = require('./lib/midi-parser')\nexports.writeMidi = require('./lib/midi-writer')\n","// data can be any array-like object. It just needs to support .length, .slice, and an element getter []\n\nfunction parseMidi(data) {\n var p = new Parser(data)\n\n var headerChunk = p.readChunk()\n if (headerChunk.id != 'MThd')\n throw \"Bad MIDI file. Expected 'MHdr', got: '\" + headerChunk.id + \"'\"\n var header = parseHeader(headerChunk.data)\n\n var tracks = []\n for (var i=0; !p.eof() && i < header.numTracks; i++) {\n var trackChunk = p.readChunk()\n if (trackChunk.id != 'MTrk')\n throw \"Bad MIDI file. Expected 'MTrk', got: '\" + trackChunk.id + \"'\"\n var track = parseTrack(trackChunk.data)\n tracks.push(track)\n }\n\n return {\n header: header,\n tracks: tracks\n }\n}\n\n\nfunction parseHeader(data) {\n var p = new Parser(data)\n\n var format = p.readUInt16()\n var numTracks = p.readUInt16()\n\n var result = {\n format: format,\n numTracks: numTracks\n }\n\n var timeDivision = p.readUInt16()\n if (timeDivision & 0x8000) {\n result.framesPerSecond = 0x100 - (timeDivision >> 8)\n result.ticksPerFrame = timeDivision & 0xFF\n } else {\n result.ticksPerBeat = timeDivision\n }\n\n return result\n}\n\nfunction parseTrack(data) {\n var p = new Parser(data)\n\n var events = []\n while (!p.eof()) {\n var event = readEvent()\n events.push(event)\n }\n\n return events\n\n var lastEventTypeByte = null\n\n function readEvent() {\n var event = {}\n event.deltaTime = p.readVarInt()\n\n var eventTypeByte = p.readUInt8()\n\n if ((eventTypeByte & 0xf0) === 0xf0) {\n // system / meta event\n if (eventTypeByte === 0xff) {\n // meta event\n event.meta = true\n var metatypeByte = p.readUInt8()\n var length = p.readVarInt()\n switch (metatypeByte) {\n case 0x00:\n event.type = 'sequenceNumber'\n if (length !== 2) throw \"Expected length for sequenceNumber event is 2, got \" + length\n event.number = p.readUInt16()\n return event\n case 0x01:\n event.type = 'text'\n event.text = p.readString(length)\n return event\n case 0x02:\n event.type = 'copyrightNotice'\n event.text = p.readString(length)\n return event\n case 0x03:\n event.type = 'trackName'\n event.text = p.readString(length)\n return event\n case 0x04:\n event.type = 'instrumentName'\n event.text = p.readString(length)\n return event\n case 0x05:\n event.type = 'lyrics'\n event.text = p.readString(length)\n return event\n case 0x06:\n event.type = 'marker'\n event.text = p.readString(length)\n return event\n case 0x07:\n event.type = 'cuePoint'\n event.text = p.readString(length)\n return event\n case 0x20:\n event.type = 'channelPrefix'\n if (length != 1) throw \"Expected length for channelPrefix event is 1, got \" + length\n event.channel = p.readUInt8()\n return event\n case 0x21:\n event.type = 'portPrefix'\n if (length != 1) throw \"Expected length for portPrefix event is 1, got \" + length\n event.port = p.readUInt8()\n return event\n case 0x2f:\n event.type = 'endOfTrack'\n if (length != 0) throw \"Expected length for endOfTrack event is 0, got \" + length\n return event\n case 0x51:\n event.type = 'setTempo';\n if (length != 3) throw \"Expected length for setTempo event is 3, got \" + length\n event.microsecondsPerBeat = p.readUInt24()\n return event\n case 0x54:\n event.type = 'smpteOffset';\n if (length != 5) throw \"Expected length for smpteOffset event is 5, got \" + length\n var hourByte = p.readUInt8()\n var FRAME_RATES = { 0x00: 24, 0x20: 25, 0x40: 29, 0x60: 30 }\n event.frameRate = FRAME_RATES[hourByte & 0x60]\n event.hour = hourByte & 0x1f\n event.min = p.readUInt8()\n event.sec = p.readUInt8()\n event.frame = p.readUInt8()\n event.subFrame = p.readUInt8()\n return event\n case 0x58:\n event.type = 'timeSignature'\n if (length != 4) throw \"Expected length for timeSignature event is 4, got \" + length\n event.numerator = p.readUInt8()\n event.denominator = (1 << p.readUInt8())\n event.metronome = p.readUInt8()\n event.thirtyseconds = p.readUInt8()\n return event\n case 0x59:\n event.type = 'keySignature'\n if (length != 2) throw \"Expected length for keySignature event is 2, got \" + length\n event.key = p.readInt8()\n event.scale = p.readUInt8()\n return event\n case 0x7f:\n event.type = 'sequencerSpecific'\n event.data = p.readBytes(length)\n return event\n default:\n event.type = 'unknownMeta'\n event.data = p.readBytes(length)\n event.metatypeByte = metatypeByte\n return event\n }\n } else if (eventTypeByte == 0xf0) {\n event.type = 'sysEx'\n var length = p.readVarInt()\n event.data = p.readBytes(length)\n return event\n } else if (eventTypeByte == 0xf7) {\n event.type = 'endSysEx'\n var length = p.readVarInt()\n event.data = p.readBytes(length)\n return event\n } else {\n throw \"Unrecognised MIDI event type byte: \" + eventTypeByte\n }\n } else {\n // channel event\n var param1\n if ((eventTypeByte & 0x80) === 0) {\n // running status - reuse lastEventTypeByte as the event type.\n // eventTypeByte is actually the first parameter\n if (lastEventTypeByte === null)\n throw \"Running status byte encountered before status byte\"\n param1 = eventTypeByte\n eventTypeByte = lastEventTypeByte\n event.running = true\n } else {\n param1 = p.readUInt8()\n lastEventTypeByte = eventTypeByte\n }\n var eventType = eventTypeByte >> 4\n event.channel = eventTypeByte & 0x0f\n switch (eventType) {\n case 0x08:\n event.type = 'noteOff'\n event.noteNumber = param1\n event.velocity = p.readUInt8()\n return event\n case 0x09:\n var velocity = p.readUInt8()\n event.type = velocity === 0 ? 'noteOff' : 'noteOn'\n event.noteNumber = param1\n event.velocity = velocity\n if (velocity === 0) event.byte9 = true\n return event\n case 0x0a:\n event.type = 'noteAftertouch'\n event.noteNumber = param1\n event.amount = p.readUInt8()\n return event\n case 0x0b:\n event.type = 'controller'\n event.controllerType = param1\n event.value = p.readUInt8()\n return event\n case 0x0c:\n event.type = 'programChange'\n event.programNumber = param1\n return event\n case 0x0d:\n event.type = 'channelAftertouch'\n event.amount = param1\n return event\n case 0x0e:\n event.type = 'pitchBend'\n event.value = (param1 + (p.readUInt8() << 7)) - 0x2000\n return event\n default:\n throw \"Unrecognised MIDI event type: \" + eventType\n }\n }\n }\n}\n\nfunction Parser(data) {\n this.buffer = data\n this.bufferLen = this.buffer.length\n this.pos = 0\n}\n\nParser.prototype.eof = function() {\n return this.pos >= this.bufferLen\n}\n\nParser.prototype.readUInt8 = function() {\n var result = this.buffer[this.pos]\n this.pos += 1\n return result\n}\n\nParser.prototype.readInt8 = function() {\n var u = this.readUInt8()\n if (u & 0x80)\n return u - 0x100\n else\n return u\n}\n\nParser.prototype.readUInt16 = function() {\n var b0 = this.readUInt8(),\n b1 = this.readUInt8()\n\n return (b0 << 8) + b1\n}\n\nParser.prototype.readInt16 = function() {\n var u = this.readUInt16()\n if (u & 0x8000)\n return u - 0x10000\n else\n return u\n}\n\nParser.prototype.readUInt24 = function() {\n var b0 = this.readUInt8(),\n b1 = this.readUInt8(),\n b2 = this.readUInt8()\n\n return (b0 << 16) + (b1 << 8) + b2\n}\n\nParser.prototype.readInt24 = function() {\n var u = this.readUInt24()\n if (u & 0x800000)\n return u - 0x1000000\n else\n return u\n}\n\nParser.prototype.readUInt32 = function() {\n var b0 = this.readUInt8(),\n b1 = this.readUInt8(),\n b2 = this.readUInt8(),\n b3 = this.readUInt8()\n\n return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3\n}\n\nParser.prototype.readBytes = function(len) {\n var bytes = this.buffer.slice(this.pos, this.pos + len)\n this.pos += len\n return bytes\n}\n\nParser.prototype.readString = function(len) {\n var bytes = this.readBytes(len)\n return String.fromCharCode.apply(null, bytes)\n}\n\nParser.prototype.readVarInt = function() {\n var result = 0\n while (!this.eof()) {\n var b = this.readUInt8()\n if (b & 0x80) {\n result += (b & 0x7f)\n result <<= 7\n } else {\n // b is last byte\n return result + b\n }\n }\n // premature eof\n return result\n}\n\nParser.prototype.readChunk = function() {\n var id = this.readString(4)\n var length = this.readUInt32()\n var data = this.readBytes(length)\n return {\n id: id,\n length: length,\n data: data\n }\n}\n\nmodule.exports = parseMidi\n","// data should be the same type of format returned by parseMidi\n// for maximum compatibililty, returns an array of byte values, suitable for conversion to Buffer, Uint8Array, etc.\n\n// opts:\n// - running reuse previous eventTypeByte when possible, to compress file\n// - useByte9ForNoteOff use 0x09 for noteOff when velocity is zero\n\nfunction writeMidi(data, opts) {\n if (typeof data !== 'object')\n throw 'Invalid MIDI data'\n\n opts = opts || {}\n\n var header = data.header || {}\n var tracks = data.tracks || []\n var i, len = tracks.length\n\n var w = new Writer()\n writeHeader(w, header, len)\n\n for (i=0; i < len; i++) {\n writeTrack(w, tracks[i], opts)\n }\n\n return w.buffer\n}\n\nfunction writeHeader(w, header, numTracks) {\n var format = header.format == null ? 1 : header.format\n\n var timeDivision = 128\n if (header.timeDivision) {\n timeDivision = header.timeDivision\n } else if (header.ticksPerFrame && header.framesPerSecond) {\n timeDivision = (-(header.framesPerSecond & 0xFF) << 8) | (header.ticksPerFrame & 0xFF)\n } else if (header.ticksPerBeat) {\n timeDivision = header.ticksPerBeat & 0x7FFF\n }\n\n var h = new Writer()\n h.writeUInt16(format)\n h.writeUInt16(numTracks)\n h.writeUInt16(timeDivision)\n\n w.writeChunk('MThd', h.buffer)\n}\n\nfunction writeTrack(w, track, opts) {\n var t = new Writer()\n var i, len = track.length\n var eventTypeByte = null\n for (i=0; i < len; i++) {\n // Reuse last eventTypeByte when opts.running is set, or event.running is explicitly set on it.\n // parseMidi will set event.running for each event, so that we can get an exact copy by default.\n // Explicitly set opts.running to false, to override event.running and never reuse last eventTypeByte.\n if (opts.running === false || !opts.running && !track[i].running) eventTypeByte = null\n\n eventTypeByte = writeEvent(t, track[i], eventTypeByte, opts.useByte9ForNoteOff)\n }\n w.writeChunk('MTrk', t.buffer)\n}\n\nfunction writeEvent(w, event, lastEventTypeByte, useByte9ForNoteOff) {\n var type = event.type\n var deltaTime = event.deltaTime\n var text = event.text || ''\n var data = event.data || []\n var eventTypeByte = null\n w.writeVarInt(deltaTime)\n\n switch (type) {\n // meta events\n case 'sequenceNumber':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x00)\n w.writeVarInt(2)\n w.writeUInt16(event.number)\n break;\n\n case 'text':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x01)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'copyrightNotice':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x02)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'trackName':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x03)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'instrumentName':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x04)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'lyrics':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x05)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'marker':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x06)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'cuePoint':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x07)\n w.writeVarInt(text.length)\n w.writeString(text)\n break;\n\n case 'channelPrefix':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x20)\n w.writeVarInt(1)\n w.writeUInt8(event.channel)\n break;\n\n case 'portPrefix':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x21)\n w.writeVarInt(1)\n w.writeUInt8(event.port)\n break;\n\n case 'endOfTrack':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x2F)\n w.writeVarInt(0)\n break;\n\n case 'setTempo':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x51)\n w.writeVarInt(3)\n w.writeUInt24(event.microsecondsPerBeat)\n break;\n\n case 'smpteOffset':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x54)\n w.writeVarInt(5)\n var FRAME_RATES = { 24: 0x00, 25: 0x20, 29: 0x40, 30: 0x60 }\n var hourByte = (event.hour & 0x1F) | FRAME_RATES[event.frameRate]\n w.writeUInt8(hourByte)\n w.writeUInt8(event.min)\n w.writeUInt8(event.sec)\n w.writeUInt8(event.frame)\n w.writeUInt8(event.subFrame)\n break;\n\n case 'timeSignature':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x58)\n w.writeVarInt(4)\n w.writeUInt8(event.numerator)\n var denominator = Math.floor((Math.log(event.denominator) / Math.LN2)) & 0xFF\n w.writeUInt8(denominator)\n w.writeUInt8(event.metronome)\n w.writeUInt8(event.thirtyseconds || 8)\n break;\n\n case 'keySignature':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x59)\n w.writeVarInt(2)\n w.writeInt8(event.key)\n w.writeUInt8(event.scale)\n break;\n\n case 'sequencerSpecific':\n w.writeUInt8(0xFF)\n w.writeUInt8(0x7F)\n w.writeVarInt(data.length)\n w.writeBytes(data)\n break;\n\n case 'unknownMeta':\n if (event.metatypeByte != null) {\n w.writeUInt8(0xFF)\n w.writeUInt8(event.metatypeByte)\n w.writeVarInt(data.length)\n w.writeBytes(data)\n }\n break;\n\n // system-exclusive\n case 'sysEx':\n w.writeUInt8(0xF0)\n w.writeVarInt(data.length)\n w.writeBytes(data)\n break;\n\n case 'endSysEx':\n w.writeUInt8(0xF7)\n w.writeVarInt(data.length)\n w.writeBytes(data)\n break;\n\n // channel events\n case 'noteOff':\n // Use 0x90 when opts.useByte9ForNoteOff is set and velocity is zero, or when event.byte9 is explicitly set on it.\n // parseMidi will set event.byte9 for each event, so that we can get an exact copy by default.\n // Explicitly set opts.useByte9ForNoteOff to false, to override event.byte9 and always use 0x80 for noteOff events.\n var noteByte = ((useByte9ForNoteOff !== false && event.byte9) || (useByte9ForNoteOff && event.velocity == 0)) ? 0x90 : 0x80\n\n eventTypeByte = noteByte | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n w.writeUInt8(event.noteNumber)\n w.writeUInt8(event.velocity)\n break;\n\n case 'noteOn':\n eventTypeByte = 0x90 | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n w.writeUInt8(event.noteNumber)\n w.writeUInt8(event.velocity)\n break;\n\n case 'noteAftertouch':\n eventTypeByte = 0xA0 | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n w.writeUInt8(event.noteNumber)\n w.writeUInt8(event.amount)\n break;\n\n case 'controller':\n eventTypeByte = 0xB0 | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n w.writeUInt8(event.controllerType)\n w.writeUInt8(event.value)\n break;\n\n case 'programChange':\n eventTypeByte = 0xC0 | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n w.writeUInt8(event.programNumber)\n break;\n\n case 'channelAftertouch':\n eventTypeByte = 0xD0 | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n w.writeUInt8(event.amount)\n break;\n\n case 'pitchBend':\n eventTypeByte = 0xE0 | event.channel\n if (eventTypeByte !== lastEventTypeByte) w.writeUInt8(eventTypeByte)\n var value14 = 0x2000 + event.value\n var lsb14 = (value14 & 0x7F)\n var msb14 = (value14 >> 7) & 0x7F\n w.writeUInt8(lsb14)\n w.writeUInt8(msb14)\n break;\n\n default:\n throw 'Unrecognized event type: ' + type\n }\n return eventTypeByte\n}\n\n\nfunction Writer() {\n this.buffer = []\n}\n\nWriter.prototype.writeUInt8 = function(v) {\n this.buffer.push(v & 0xFF)\n}\nWriter.prototype.writeInt8 = Writer.prototype.writeUInt8\n\nWriter.prototype.writeUInt16 = function(v) {\n var b0 = (v >> 8) & 0xFF,\n b1 = v & 0xFF\n\n this.writeUInt8(b0)\n this.writeUInt8(b1)\n}\nWriter.prototype.writeInt16 = Writer.prototype.writeUInt16\n\nWriter.prototype.writeUInt24 = function(v) {\n var b0 = (v >> 16) & 0xFF,\n b1 = (v >> 8) & 0xFF,\n b2 = v & 0xFF\n\n this.writeUInt8(b0)\n this.writeUInt8(b1)\n this.writeUInt8(b2)\n}\nWriter.prototype.writeInt24 = Writer.prototype.writeUInt24\n\nWriter.prototype.writeUInt32 = function(v) {\n var b0 = (v >> 24) & 0xFF,\n b1 = (v >> 16) & 0xFF,\n b2 = (v >> 8) & 0xFF,\n b3 = v & 0xFF\n\n this.writeUInt8(b0)\n this.writeUInt8(b1)\n this.writeUInt8(b2)\n this.writeUInt8(b3)\n}\nWriter.prototype.writeInt32 = Writer.prototype.writeUInt32\n\n\nWriter.prototype.writeBytes = function(arr) {\n this.buffer = this.buffer.concat(Array.prototype.slice.call(arr, 0))\n}\n\nWriter.prototype.writeString = function(str) {\n var i, len = str.length, arr = []\n for (i=0; i < len; i++) {\n arr.push(str.codePointAt(i))\n }\n this.writeBytes(arr)\n}\n\nWriter.prototype.writeVarInt = function(v) {\n if (v < 0) throw \"Cannot write negative variable-length integer\"\n\n if (v <= 0x7F) {\n this.writeUInt8(v)\n } else {\n var i = v\n var bytes = []\n bytes.push(i & 0x7F)\n i >>= 7\n while (i) {\n var b = i & 0x7F | 0x80\n bytes.push(b)\n i >>= 7\n }\n this.writeBytes(bytes.reverse())\n }\n}\n\nWriter.prototype.writeChunk = function(id, data) {\n this.writeString(id)\n this.writeUInt32(data.length)\n this.writeBytes(data)\n}\n\nmodule.exports = writeMidi\n","/**\n * Return the index of the element at or before the given property\n * @hidden\n */\nexport function search(array: any[], value: any, prop = \"ticks\"): number {\n\tlet beginning = 0;\n\tconst len = array.length;\n\tlet end = len;\n\tif (len > 0 && array[len - 1][prop] <= value) {\n\t\treturn len - 1;\n\t}\n\twhile (beginning < end) {\n\t\t// calculate the midpoint for roughly equal partition\n\t\tlet midPoint = Math.floor(beginning + (end - beginning) / 2);\n\t\tconst event = array[midPoint];\n\t\tconst nextEvent = array[midPoint + 1];\n\t\tif (event[prop] === value) {\n\t\t\t// choose the last one that has the same value\n\t\t\tfor (let i = midPoint; i < array.length; i++) {\n\t\t\t\tconst testEvent = array[i];\n\t\t\t\tif (testEvent[prop] === value) {\n\t\t\t\t\tmidPoint = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn midPoint;\n\t\t} else if (event[prop] < value && nextEvent[prop] > value) {\n\t\t\treturn midPoint;\n\t\t} else if (event[prop] > value) {\n\t\t\t// search lower\n\t\t\tend = midPoint;\n\t\t} else if (event[prop] < value) {\n\t\t\t// search upper\n\t\t\tbeginning = midPoint + 1;\n\t\t}\n\t}\n\treturn -1;\n}\n\n/**\n * Does a binary search to insert the note\n * in the correct spot in the array\n * @hidden\n */\nexport function insert(array: any[], event: object, prop = \"ticks\"): void {\n\tif (array.length) {\n\t\tconst index = search(array, event[prop], prop);\n\t\tarray.splice(index + 1, 0, event);\n\t} else {\n\t\tarray.push(event);\n\t}\n}\n","import type { MidiControllerEvent } from \"midi-file\";\nimport { Header } from \"./Header\";\n\n/**\n * @hidden\n */\nexport type ControlChangeName =\n\t| \"modulationWheel\"\n\t| \"breath\"\n\t| \"footController\"\n\t| \"portamentoTime\"\n\t| \"volume\"\n\t| \"balance\"\n\t| \"pan\"\n\t| \"sustain\"\n\t| \"portamentoTime\"\n\t| \"sostenuto\"\n\t| \"softPedal\"\n\t| \"legatoFootswitch\"\n\t| \"portamentoControl\";\n\ninterface ControlChangeMap {\n\t[key: number]: ControlChangeName;\n}\n/**\n * A map of values to control change names\n * @hidden\n */\nexport const controlChangeNames: ControlChangeMap = {\n\t1: \"modulationWheel\",\n\t2: \"breath\",\n\t4: \"footController\",\n\t5: \"portamentoTime\",\n\t7: \"volume\",\n\t8: \"balance\",\n\t10: \"pan\",\n\t64: \"sustain\",\n\t65: \"portamentoTime\",\n\t66: \"sostenuto\",\n\t67: \"softPedal\",\n\t68: \"legatoFootswitch\",\n\t84: \"portamentoControl\",\n};\n\n/**\n * swap the keys and values\n * @hidden\n */\nexport const controlChangeIds = Object.keys(controlChangeNames).reduce((obj, key) => {\n\tobj[controlChangeNames[key]] = key;\n\treturn obj;\n}, {});\n\nconst privateHeaderMap = new WeakMap();\nconst privateCCNumberMap = new WeakMap();\n\n/**\n * Represents a control change event\n */\nexport class ControlChange implements ControlChangeInterface {\n\n\t/**\n\t * The number value of the event\n\t */\n\tvalue: number;\n\n\t/**\n\t * The tick time of the event\n\t */\n\tticks: number;\n\n\t/**\n\t * @param event\n\t * @param header\n\t */\n\tconstructor(event: Partial, header: Header) {\n\t\tprivateHeaderMap.set(this, header);\n\t\tprivateCCNumberMap.set(this, event.controllerType);\n\n\t\tthis.ticks = event.absoluteTime;\n\t\tthis.value = event.value;\n\t}\n\n\t/**\n\t * The controller number\n\t */\n\tget number(): number {\n\t\treturn privateCCNumberMap.get(this);\n\t}\n\n\t/**\n\t * return the common name of the control number if it exists\n\t */\n\tget name(): ControlChangeName {\n\t\tif (controlChangeNames[this.number]) {\n\t\t\treturn controlChangeNames[this.number];\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * The time of the event in seconds\n\t */\n\tget time(): number {\n\t\tconst header = privateHeaderMap.get(this);\n\t\treturn header.ticksToSeconds(this.ticks);\n\t}\n\n\tset time(t: number) {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tthis.ticks = header.secondsToTicks(t);\n\t}\n\n\ttoJSON(): ControlChangeJSON {\n\t\treturn {\n\t\t\tnumber: this.number,\n\t\t\tticks: this.ticks,\n\t\t\ttime: this.time,\n\t\t\tvalue: this.value,\n\t\t};\n\t}\n}\n\nexport interface ControlChangeJSON {\n\tnumber: number;\n\tticks: number;\n\ttime: number;\n\tvalue: number;\n}\n\nexport interface ControlChangeInterface {\n\tnumber: number;\n\tticks: number;\n\ttime: number;\n\tvalue: number;\n}\n","import { controlChangeIds } from \"./ControlChange\";\nimport { ControlChange, ControlChangeJSON } from \"./ControlChange\";\n\nexport interface ControlChanges {\n\t[key: string]: ControlChange[];\n\t[key: number]: ControlChange[];\n}\n\nexport interface ControlChangesJSON {\n\t[key: string]: ControlChangeJSON[];\n\t[key: number]: ControlChangeJSON[];\n}\n\n/**\n * Automatically creates an alias for named control values using Proxies\n * @hidden\n */\nexport function createControlChanges(): ControlChanges {\n\treturn new Proxy({}, {\n\t\t// tslint:disable-next-line: typedef\n\t\tget(target, handler) {\n\t\t\tif (target[handler]) {\n\t\t\t\treturn target[handler];\n\t\t\t} else if (controlChangeIds.hasOwnProperty(handler)) {\n\t\t\t\treturn target[controlChangeIds[handler]];\n\t\t\t}\n\t\t},\n\t\t// tslint:disable-next-line: typedef\n\t\tset(target, handler, value) {\n\t\t\tif (controlChangeIds.hasOwnProperty(handler)) {\n\t\t\t\ttarget[controlChangeIds[handler]] = value;\n\t\t\t} else {\n\t\t\t\ttarget[handler] = value;\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t});\n}\n","import { writeMidi } from \"midi-file\";\n\nimport type {\n\tMidiControllerEvent, MidiData, MidiEndOfTrackEvent,\n\tMidiEvent, MidiKeySignatureEvent,\n\tMidiNoteOffEvent, MidiNoteOnEvent, MidiPitchBendEvent,\n\tMidiProgramChangeEvent, MidiSetTempoEvent, MidiTextEvent,\n\tMidiTimeSignatureEvent, MidiTrackNameEvent\n} from \"midi-file\";\n\nimport { KeySignatureEvent, keySignatureKeys, MetaEvent, TempoEvent, TimeSignatureEvent } from \"./Header\";\nimport { ControlChange } from \"./ControlChange\";\nimport { PitchBend } from \"./PitchBend\";\nimport { Midi } from \"./Midi\";\nimport { Note } from \"./Note\";\nimport { Track } from \"./Track\";\n\nimport { flatten } from \"array-flatten\";\n\n/** Used to add `absoluteTime` property. */\ntype WithAbsoluteTime = { absoluteTime: number };\n\nfunction encodeNote(note: Note, channel: number): [\n\t(MidiNoteOnEvent & WithAbsoluteTime),\n\t(MidiNoteOffEvent & WithAbsoluteTime)\n] {\n\treturn [{\n\t\tabsoluteTime: note.ticks,\n\t\tchannel,\n\t\tdeltaTime: 0,\n\t\tnoteNumber: note.midi,\n\t\ttype: \"noteOn\",\n\t\tvelocity: Math.floor(note.velocity * 127),\n\t},\n\t{\n\t\tabsoluteTime: note.ticks + note.durationTicks,\n\t\tchannel,\n\t\tdeltaTime: 0,\n\t\tnoteNumber: note.midi,\n\t\ttype: \"noteOff\",\n\t\tvelocity: Math.floor(note.noteOffVelocity * 127),\n\t}];\n}\n\nfunction encodeNotes(track: Track): Array {\n\treturn flatten(track.notes.map(note => encodeNote(note, track.channel))) as unknown as Array;\n}\n\nfunction encodeControlChange(\n\tcc: ControlChange,\n\tchannel: number\n): (MidiControllerEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: cc.ticks,\n\t\tchannel,\n\t\tcontrollerType: cc.number,\n\t\tdeltaTime: 0,\n\t\ttype: \"controller\",\n\t\tvalue: Math.floor(cc.value * 127),\n\t};\n}\n\nfunction encodeControlChanges(track: Track): MidiControllerEvent[] {\n\tconst controlChanges: MidiControllerEvent[] = [];\n\tfor (let i = 0; i < 127; i++) {\n\t\tif (track.controlChanges.hasOwnProperty(i)) {\n\t\t\ttrack.controlChanges[i].forEach((cc: ControlChange) => {\n\t\t\t\tcontrolChanges.push(encodeControlChange(cc, track.channel));\n\t\t\t});\n\t\t}\n\t}\n\treturn controlChanges;\n}\n\nfunction encodePitchBend(\n\tpb: PitchBend,\n\tchannel: number\n): (MidiPitchBendEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: pb.ticks,\n\t\tchannel,\n\t\tdeltaTime: 0,\n\t\ttype: \"pitchBend\",\n\t\tvalue: pb.value,\n\t};\n}\n\nfunction encodePitchBends(track: Track): MidiPitchBendEvent[] {\n\tconst pitchBends: MidiPitchBendEvent[] = [];\n\ttrack.pitchBends.forEach((pb: PitchBend) => {\n\t\tpitchBends.push(encodePitchBend(pb, track.channel));\n\t});\t\n\treturn pitchBends;\n}\n\nfunction encodeInstrument(track: Track): (MidiProgramChangeEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: 0,\n\t\tchannel: track.channel,\n\t\tdeltaTime: 0,\n\t\tprogramNumber: track.instrument.number,\n\t\ttype: \"programChange\",\n\t};\n}\n\nfunction encodeTrackName(name: string): (MidiTrackNameEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: 0,\n\t\tdeltaTime: 0,\n\t\tmeta: true,\n\t\ttext: name,\n\t\ttype: \"trackName\",\n\t};\n}\n\nfunction encodeTempo(tempo: TempoEvent): (MidiSetTempoEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: tempo.ticks,\n\t\tdeltaTime: 0,\n\t\tmeta: true,\n\t\tmicrosecondsPerBeat: Math.floor(60000000 / tempo.bpm),\n\t\ttype: \"setTempo\",\n\t};\n}\n\nfunction encodeTimeSignature(timeSig: TimeSignatureEvent): (MidiTimeSignatureEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: timeSig.ticks,\n\t\tdeltaTime: 0,\n\t\tdenominator: timeSig.timeSignature[1],\n\t\tmeta: true,\n\t\tmetronome: 24,\n\t\tnumerator: timeSig.timeSignature[0],\n\t\tthirtyseconds: 8,\n\t\ttype: \"timeSignature\",\n\t};\n}\n\n// function encodeMeta(event: )\n\nfunction encodeKeySignature(keySig: KeySignatureEvent): (MidiKeySignatureEvent & WithAbsoluteTime) {\n\tconst keyIndex = keySignatureKeys.indexOf(keySig.key);\n\treturn {\n\t\tabsoluteTime: keySig.ticks,\n\t\tdeltaTime: 0,\n\t\tkey: keyIndex + 7,\n\t\tmeta: true,\n\t\tscale: keySig.scale === \"major\" ? 0 : 1,\n\t\ttype: \"keySignature\",\n\t};\n}\n\nfunction encodeText(\n\ttextEvent: (MetaEvent & { ticks: number; })\n): (MidiTextEvent & WithAbsoluteTime) {\n\treturn {\n\t\tabsoluteTime: textEvent.ticks,\n\t\tdeltaTime: 0,\n\t\tmeta: true,\n\t\ttext: textEvent.text,\n\t\ttype: textEvent.type,\n\t} as (MidiTextEvent & WithAbsoluteTime);\n}\n\n/**\n * Convert the MIDI object to an array.\n */\nexport function encode(midi: Midi): Uint8Array {\n\tconst midiData: MidiData = {\n\t\theader: {\n\t\t\tformat: 1,\n\t\t\tnumTracks: midi.tracks.length + 1,\n\t\t\tticksPerBeat: midi.header.ppq,\n\t\t},\n\t\ttracks: [\n\t\t\t[\n\t\t\t\t// The name data.\n\t\t\t\t{\n\t\t\t\t\tabsoluteTime: 0,\n\t\t\t\t\tdeltaTime: 0,\n\t\t\t\t\tmeta: true,\n\t\t\t\t\ttext: midi.header.name,\n\t\t\t\t\ttype: \"trackName\",\n\t\t\t\t} as MidiTrackNameEvent,\n\t\t\t\t...midi.header.keySignatures.map(keySig => encodeKeySignature(keySig)),\n\t\t\t\t// and all the meta events (cloned for safety)\n\t\t\t\t...midi.header.meta.map(e => encodeText(e)),\n\t\t\t\t// the first track is all the tempo data\n\t\t\t\t...midi.header.tempos.map(tempo => encodeTempo(tempo)),\n\t\t\t\t// and the time signature data.\n\t\t\t\t...midi.header.timeSignatures.map(timeSig => encodeTimeSignature(timeSig)),\n\t\t\t],\n\t\t\t// The remaining tracks.\n\t\t\t...midi.tracks.map((track) => {\n\t\t\t\treturn [\n\t\t\t\t\t// Add the name\n\t\t\t\t\tencodeTrackName(track.name),\n\t\t\t\t\t// the instrument\n\t\t\t\t\tencodeInstrument(track),\n\t\t\t\t\t// add the notes\n\t\t\t\t\t...encodeNotes(track),\n\t\t\t\t\t// and the control changes\n\t\t\t\t\t...encodeControlChanges(track),\n\t\t\t\t\t// and the pitch bends.\n\t\t\t\t\t...encodePitchBends(track)\n\t\t\t\t];\n\t\t\t}),\n\t\t],\n\t};\n\n\t// Sort and set `deltaTime` of all of the tracks.\n\tmidiData.tracks = midiData.tracks.map((track: (MidiEvent & WithAbsoluteTime)[]) => {\n\t\ttrack = track.sort((a, b) => a.absoluteTime - b.absoluteTime);\n\t\t\n\t\tlet lastTime = 0;\n\t\ttrack.forEach(note => {\n\t\t\tnote.deltaTime = note.absoluteTime - lastTime;\n\t\t\tlastTime = note.absoluteTime;\n\t\t\tdelete note.absoluteTime;\n\t\t});\n\n\t\t// End of track.\n\t\ttrack.push({\n\t\t\tdeltaTime: 0,\n\t\t\tmeta: true,\n\t\t\ttype: \"endOfTrack\",\n\t\t} as (MidiEndOfTrackEvent & WithAbsoluteTime));\n\t\treturn track;\n\t});\n\n\t// Rreturn `midiData`.\n\treturn new Uint8Array(writeMidi(midiData));\n}\n","import type { MidiData, MidiEvent } from \"midi-file\";\nimport { search } from \"./BinarySearch\";\n\nconst privatePPQMap = new WeakMap();\n\nexport interface TempoEvent {\n\tticks: number;\n\tbpm: number;\n\ttime?: number;\n}\n\nexport interface TimeSignatureEvent {\n\tticks: number;\n\ttimeSignature: number[];\n\tmeasures?: number;\n}\n\nexport interface MetaEvent {\n\ttext: string;\n\ttype: string;\n\tticks: number;\n}\n\nexport interface KeySignatureEvent {\n\tticks: number;\n\tkey: string;\n\tscale: string;\n}\n\n/**\n * @hidden\n */\nexport const keySignatureKeys = [\n\t\"Cb\",\n\t\"Gb\",\n\t\"Db\",\n\t\"Ab\",\n\t\"Eb\",\n\t\"Bb\",\n\t\"F\",\n\t\"C\",\n\t\"G\",\n\t\"D\",\n\t\"A\",\n\t\"E\",\n\t\"B\",\n\t\"F#\",\n\t\"C#\",\n];\n\n/**\n * The parsed MIDI file header.\n */\nexport class Header {\n\t/**\n\t * The array of all the tempo events.\n\t */\n\ttempos: TempoEvent[] = [];\n\n\t/**\n\t * The time signatures.\n\t */\n\ttimeSignatures: TimeSignatureEvent[] = [];\n\n\t/**\n\t * The time signatures.\n\t */\n\tkeySignatures: KeySignatureEvent[] = [];\n\n\t/**\n\t * Additional meta events.\n\t */\n\tmeta: MetaEvent[] = [];\n\n\t/**\n\t * The name of the MIDI file;\n\t */\n\tname = \"\";\n\n\tconstructor(midiData?: MidiData) {\n\t\t// Look through all the tracks for tempo changes.\n\t\tprivatePPQMap.set(this, 480);\n\n\t\tif (midiData) {\n\t\t\tprivatePPQMap.set(this, midiData.header.ticksPerBeat);\n\t\t\t\n\t\t\t// Check time signature and tempo events from all of the tracks.\n\t\t\tmidiData.tracks.forEach(track => {\n\t\t\t\ttrack.forEach((event: MidiEvent & { absoluteTime: number; meta?: boolean; }) => {\n\t\t\t\t\tif (event.meta) {\n\t\t\t\t\t\tif (event.type === \"timeSignature\") {\n\t\t\t\t\t\t\tthis.timeSignatures.push({\n\t\t\t\t\t\t\t\tticks: event.absoluteTime,\n\t\t\t\t\t\t\t\ttimeSignature: [\n\t\t\t\t\t\t\t\t\tevent.numerator,\n\t\t\t\t\t\t\t\t\tevent.denominator,\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (event.type === \"setTempo\") {\n\t\t\t\t\t\t\tthis.tempos.push({\n\t\t\t\t\t\t\t\tbpm: 60000000 / event.microsecondsPerBeat,\n\t\t\t\t\t\t\t\tticks: event.absoluteTime,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (event.type === \"keySignature\") {\n\t\t\t\t\t\t\tthis.keySignatures.push({\n\t\t\t\t\t\t\t\tkey: keySignatureKeys[event.key + 7],\n\t\t\t\t\t\t\t\tscale: event.scale === 0 ? \"major\" : \"minor\",\n\t\t\t\t\t\t\t\tticks: event.absoluteTime,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Check the first track for other relevant data.\n\t\t\tlet firstTrackCurrentTicks = 0; // Used for absolute times.\n\t\t\tmidiData.tracks[0].forEach((event: MidiEvent & { meta?: boolean; }) => {\n\t\t\t\tfirstTrackCurrentTicks += event.deltaTime;\n\n\t\t\t\tif (event.meta) {\n\t\t\t\t\tif (event.type === \"trackName\") {\n\t\t\t\t\t\tthis.name = event.text;\n\t\t\t\t\t} else if (\n\t\t\t\t\t\tevent.type === \"text\" ||\n\t\t\t\t\t\tevent.type === \"cuePoint\" ||\n\t\t\t\t\t\tevent.type === \"marker\" ||\n\t\t\t\t\t\tevent.type === \"lyrics\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis.meta.push({\n\t\t\t\t\t\t\ttext: event.text,\n\t\t\t\t\t\t\tticks: firstTrackCurrentTicks,\n\t\t\t\t\t\t\ttype: event.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\t/**\n\t * This must be invoked after any changes are made to the tempo array\n\t * or the timeSignature array for the updated values to be reflected.\n\t */\n\tupdate(): void {\n\t\tlet currentTime = 0;\n\t\tlet lastEventBeats = 0;\n\n\t\t// Make sure it's sorted;\n\t\tthis.tempos.sort((a, b) => a.ticks - b.ticks);\n\t\tthis.tempos.forEach((event, index) => {\n\t\t\tconst lastBPM =\n\t\t\t\tindex > 0 ? this.tempos[index - 1].bpm : this.tempos[0].bpm;\n\t\t\tconst beats = event.ticks / this.ppq - lastEventBeats;\n\t\t\tconst elapsedSeconds = (60 / lastBPM) * beats;\n\n\t\t\tevent.time = elapsedSeconds + currentTime;\n\t\t\tcurrentTime = event.time;\n\t\t\tlastEventBeats += beats;\n\t\t});\n\n\t\tthis.timeSignatures.sort((a, b) => a.ticks - b.ticks);\n\t\tthis.timeSignatures.forEach((event, index) => {\n\t\t\tconst lastEvent =\n\t\t\t\tindex > 0\n\t\t\t\t\t? this.timeSignatures[index - 1]\n\t\t\t\t\t: this.timeSignatures[0];\n\n\t\t\tconst elapsedBeats = (event.ticks - lastEvent.ticks) / this.ppq;\n\t\t\tconst elapsedMeasures =\n\t\t\t\telapsedBeats /\n\t\t\t\tlastEvent.timeSignature[0] /\n\t\t\t\t(lastEvent.timeSignature[1] / 4);\n\n\t\t\tlastEvent.measures = lastEvent.measures || 0;\n\t\t\tevent.measures = elapsedMeasures + lastEvent.measures;\n\t\t});\n\t}\n\n\t/**\n\t * Convert ticks into seconds based on the tempo changes.\n\t */\n\tticksToSeconds(ticks: number): number {\n\t\t// Find the relevant position.\n\t\tconst index = search(this.tempos, ticks);\n\n\t\tif (index !== -1) {\n\t\t\tconst tempo = this.tempos[index];\n\t\t\tconst tempoTime = tempo.time;\n\t\t\tconst elapsedBeats = (ticks - tempo.ticks) / this.ppq;\n\n\t\t\treturn tempoTime + (60 / tempo.bpm) * elapsedBeats;\n\t\t} else {\n\t\t\t// Assume 120.\n\t\t\tconst beats = ticks / this.ppq;\n\t\t\treturn (60 / 120) * beats;\n\t\t}\n\t}\n\n\t/**\n\t * Convert ticks into measures based off of the time signatures.\n\t */\n\tticksToMeasures(ticks: number): number {\n\t\tconst index = search(this.timeSignatures, ticks);\n\n\t\tif (index !== -1) {\n\t\t\tconst timeSigEvent = this.timeSignatures[index];\n\t\t\tconst elapsedBeats = (ticks - timeSigEvent.ticks) / this.ppq;\n\n\t\t\treturn (\n\t\t\t\ttimeSigEvent.measures +\n\t\t\t\telapsedBeats /\n\t\t\t\t\t(timeSigEvent.timeSignature[0] /\n\t\t\t\t\t\ttimeSigEvent.timeSignature[1]) /\n\t\t\t\t\t4\n\t\t\t);\n\t\t} else {\n\t\t\treturn ticks / this.ppq / 4;\n\t\t}\n\t}\n\n\t/**\n\t * The number of ticks per quarter note.\n\t */\n\tget ppq(): number {\n\t\treturn privatePPQMap.get(this);\n\t}\n\n\t/**\n\t * Convert seconds to ticks based on the tempo events.\n\t */\n\tsecondsToTicks(seconds: number): number {\n\t\t// Find the relevant position.\n\t\tconst index = search(this.tempos, seconds, \"time\");\n\n\t\tif (index !== -1) {\n\t\t\tconst tempo = this.tempos[index];\n\t\t\tconst tempoTime = tempo.time;\n\t\t\tconst elapsedTime = seconds - tempoTime;\n\t\t\tconst elapsedBeats = elapsedTime / (60 / tempo.bpm);\n\n\t\t\treturn Math.round(tempo.ticks + elapsedBeats * this.ppq);\n\t\t} else {\n\t\t\t// Assume 120.\n\t\t\tconst beats = seconds / (60 / 120);\n\t\t\treturn Math.round(beats * this.ppq);\n\t\t}\n\t}\n\n\t/**\n\t * Convert the header into an object.\n\t */\n\ttoJSON(): HeaderJSON {\n\t\treturn {\n\t\t\tkeySignatures: this.keySignatures,\n\t\t\tmeta: this.meta,\n\t\t\tname: this.name,\n\t\t\tppq: this.ppq,\n\t\t\ttempos: this.tempos.map((t) => {\n\t\t\t\treturn {\n\t\t\t\t\tbpm: t.bpm,\n\t\t\t\t\tticks: t.ticks,\n\t\t\t\t};\n\t\t\t}),\n\t\t\ttimeSignatures: this.timeSignatures,\n\t\t};\n\t}\n\n\t/**\n\t * Parse a header json object.\n\t */\n\tfromJSON(json: HeaderJSON): void {\n\t\tthis.name = json.name;\n\t\t\n\t\t// Clone all the attributes.\n\t\tthis.tempos = json.tempos.map((t) => Object.assign({}, t));\n\t\tthis.timeSignatures = json.timeSignatures.map((t) =>\n\t\t\tObject.assign({}, t)\n\t\t);\n\t\tthis.keySignatures = json.keySignatures.map((t) =>\n\t\t\tObject.assign({}, t)\n\t\t);\n\t\tthis.meta = json.meta.map((t) => Object.assign({}, t));\n\n\t\tprivatePPQMap.set(this, json.ppq);\n\t\tthis.update();\n\t}\n\n\t/**\n\t * Update the tempo of the midi to a single tempo. Will remove and replace\n\t * any other tempos currently set and update all of the event timing.\n\t * @param bpm The tempo in beats per second.\n\t */\n\tsetTempo(bpm: number): void {\n\t\tthis.tempos = [\n\t\t\t{\n\t\t\t\tbpm,\n\t\t\t\tticks: 0,\n\t\t\t},\n\t\t];\n\t\tthis.update();\n\t}\n}\n\nexport interface HeaderJSON {\n\tname: string;\n\tppq: number;\n\tmeta: MetaEvent[];\n\ttempos: TempoEvent[];\n\ttimeSignatures: TimeSignatureEvent[];\n\tkeySignatures: KeySignatureEvent[];\n}\n","import type {\n\tMidiEvent,\n\tMidiProgramChangeEvent\n} from \"midi-file\";\n\nimport { DrumKitByPatchID, instrumentByPatchID, InstrumentFamilyByID } from \"./InstrumentMaps\";\nimport { Track } from \"./Track\";\n\n/**\n * @hidden\n */\nconst privateTrackMap = new WeakMap();\n\n/**\n * Describes the MIDI instrument of a track.\n */\nexport class Instrument {\n\n\t/**\n\t * The instrument number. Defaults to 0.\n\t */\n\tnumber = 0;\n\n\t/**\n\t * @param trackData\n\t * @param track \n\t */\n\tconstructor(trackData: MidiEvent[], track: Track) {\n\t\tprivateTrackMap.set(this, track);\n\t\tthis.number = 0;\n\n\t\tif (trackData) {\n\t\t\tconst programChange = trackData.find(\n\t\t\t\te => e.type === \"programChange\"\n\t\t\t) as MidiProgramChangeEvent;\n\n\t\t\t// Set 'number' from 'programNumber' if exists.\n\t\t\tif (programChange) {\n\t\t\t\tthis.number = programChange.programNumber;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The common name of the instrument.\n\t */\n\tget name(): string {\n\t\tif (this.percussion) {\n\t\t\treturn DrumKitByPatchID[this.number];\n\t\t} else {\n\t\t\treturn instrumentByPatchID[this.number];\n\t\t}\n\t}\n\n\tset name(n: string) {\n\t\tconst patchNumber = instrumentByPatchID.indexOf(n);\n\t\tif (patchNumber !== -1) {\n\t\t\tthis.number = patchNumber;\n\t\t}\n\t}\n\n\t/**\n\t * The instrument family, e.g. \"piano\".\n\t */\n\tget family(): string {\n\t\tif (this.percussion) {\n\t\t\treturn \"drums\";\n\t\t} else {\n\t\t\treturn InstrumentFamilyByID[Math.floor(this.number / 8)];\n\t\t}\n\t}\n\n\t/**\n\t * If the instrument is a percussion instrument.\n\t */\n\tget percussion(): boolean {\n\t\tconst track = privateTrackMap.get(this);\n\t\treturn track.channel === 9;\n\t}\n\n\t/**\n\t * Convert it to JSON form.\n\t */\n\ttoJSON(): InstrumentJSON {\n\t\treturn {\n\t\t\tfamily: this.family,\n\t\t\tnumber: this.number,\n\t\t\tname: this.name\n\t\t};\n\t}\n\n\t/**\n\t * Convert from JSON form.\n\t */\n\tfromJSON(json: InstrumentJSON): void {\n\t\tthis.number = json.number;\n\t}\n}\n\nexport interface InstrumentJSON {\n\tfamily: string;\n\tnumber: number;\n\tname: string;\n}\n","export const instrumentByPatchID = [\n\t\"acoustic grand piano\",\n\t\"bright acoustic piano\",\n\t\"electric grand piano\",\n\t\"honky-tonk piano\",\n\t\"electric piano 1\",\n\t\"electric piano 2\",\n\t\"harpsichord\",\n\t\"clavi\",\n\t\"celesta\",\n\t\"glockenspiel\",\n\t\"music box\",\n\t\"vibraphone\",\n\t\"marimba\",\n\t\"xylophone\",\n\t\"tubular bells\",\n\t\"dulcimer\",\n\t\"drawbar organ\",\n\t\"percussive organ\",\n\t\"rock organ\",\n\t\"church organ\",\n\t\"reed organ\",\n\t\"accordion\",\n\t\"harmonica\",\n\t\"tango accordion\",\n\t\"acoustic guitar (nylon)\",\n\t\"acoustic guitar (steel)\",\n\t\"electric guitar (jazz)\",\n\t\"electric guitar (clean)\",\n\t\"electric guitar (muted)\",\n\t\"overdriven guitar\",\n\t\"distortion guitar\",\n\t\"guitar harmonics\",\n\t\"acoustic bass\",\n\t\"electric bass (finger)\",\n\t\"electric bass (pick)\",\n\t\"fretless bass\",\n\t\"slap bass 1\",\n\t\"slap bass 2\",\n\t\"synth bass 1\",\n\t\"synth bass 2\",\n\t\"violin\",\n\t\"viola\",\n\t\"cello\",\n\t\"contrabass\",\n\t\"tremolo strings\",\n\t\"pizzicato strings\",\n\t\"orchestral harp\",\n\t\"timpani\",\n\t\"string ensemble 1\",\n\t\"string ensemble 2\",\n\t\"synthstrings 1\",\n\t\"synthstrings 2\",\n\t\"choir aahs\",\n\t\"voice oohs\",\n\t\"synth voice\",\n\t\"orchestra hit\",\n\t\"trumpet\",\n\t\"trombone\",\n\t\"tuba\",\n\t\"muted trumpet\",\n\t\"french horn\",\n\t\"brass section\",\n\t\"synthbrass 1\",\n\t\"synthbrass 2\",\n\t\"soprano sax\",\n\t\"alto sax\",\n\t\"tenor sax\",\n\t\"baritone sax\",\n\t\"oboe\",\n\t\"english horn\",\n\t\"bassoon\",\n\t\"clarinet\",\n\t\"piccolo\",\n\t\"flute\",\n\t\"recorder\",\n\t\"pan flute\",\n\t\"blown bottle\",\n\t\"shakuhachi\",\n\t\"whistle\",\n\t\"ocarina\",\n\t\"lead 1 (square)\",\n\t\"lead 2 (sawtooth)\",\n\t\"lead 3 (calliope)\",\n\t\"lead 4 (chiff)\",\n\t\"lead 5 (charang)\",\n\t\"lead 6 (voice)\",\n\t\"lead 7 (fifths)\",\n\t\"lead 8 (bass + lead)\",\n\t\"pad 1 (new age)\",\n\t\"pad 2 (warm)\",\n\t\"pad 3 (polysynth)\",\n\t\"pad 4 (choir)\",\n\t\"pad 5 (bowed)\",\n\t\"pad 6 (metallic)\",\n\t\"pad 7 (halo)\",\n\t\"pad 8 (sweep)\",\n\t\"fx 1 (rain)\",\n\t\"fx 2 (soundtrack)\",\n\t\"fx 3 (crystal)\",\n\t\"fx 4 (atmosphere)\",\n\t\"fx 5 (brightness)\",\n\t\"fx 6 (goblins)\",\n\t\"fx 7 (echoes)\",\n\t\"fx 8 (sci-fi)\",\n\t\"sitar\",\n\t\"banjo\",\n\t\"shamisen\",\n\t\"koto\",\n\t\"kalimba\",\n\t\"bag pipe\",\n\t\"fiddle\",\n\t\"shanai\",\n\t\"tinkle bell\",\n\t\"agogo\",\n\t\"steel drums\",\n\t\"woodblock\",\n\t\"taiko drum\",\n\t\"melodic tom\",\n\t\"synth drum\",\n\t\"reverse cymbal\",\n\t\"guitar fret noise\",\n\t\"breath noise\",\n\t\"seashore\",\n\t\"bird tweet\",\n\t\"telephone ring\",\n\t\"helicopter\",\n\t\"applause\",\n\t\"gunshot\",\n];\n\nexport const InstrumentFamilyByID = [\n\t\"piano\",\n\t\"chromatic percussion\",\n\t\"organ\",\n\t\"guitar\",\n\t\"bass\",\n\t\"strings\",\n\t\"ensemble\",\n\t\"brass\",\n\t\"reed\",\n\t\"pipe\",\n\t\"synth lead\",\n\t\"synth pad\",\n\t\"synth effects\",\n\t\"world\",\n\t\"percussive\",\n\t\"sound effects\",\n];\n\nexport const DrumKitByPatchID = {\n\t0: \"standard kit\",\n\t8: \"room kit\",\n\t16: \"power kit\",\n\t24: \"electronic kit\",\n\t25: \"tr-808 kit\",\n\t32: \"jazz kit\",\n\t40: \"brush kit\",\n\t48: \"orchestra kit\",\n\t56: \"sound fx kit\",\n};\n","import type {\n\tMidiData,\n\tMidiEvent\n} from \"midi-file\";\n\nimport { parseMidi } from \"midi-file\";\n\nimport { Header, HeaderJSON } from \"./Header\";\nimport { Track, TrackJSON } from \"./Track\";\nimport { encode } from \"./Encode\";\n\n/**\n * The main midi parsing class.\n */\nexport class Midi {\n\n\t/**\n\t * Download and parse the MIDI file. Returns a promise\n\t * which resolves to the generated MIDI file.\n\t * @param url The URL to fetch.\n\t */\n\tstatic async fromUrl(url: string): Promise {\n\t\tconst response = await fetch(url);\n\t\tif (response.ok) {\n\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\treturn new Midi(arrayBuffer);\n\t\t} else {\n\t\t\tthrow new Error(`Could not load '${url}'`);\n\t\t}\n\t}\n\n\t/**\n\t * The header information, includes things like tempo and meta events.\n\t */\n\theader: Header;\n\n\t/**\n\t * The midi tracks.\n\t */\n\ttracks: Track[];\n\n\t/**\n\t * Parse the midi data\n\t */\n\tconstructor(midiArray?: (ArrayLike | ArrayBuffer)) {\n\t\t// Parse the MIDI data if there is any.\n\t\tlet midiData: (MidiData | null) = null;\n\t\tif (midiArray) {\n\t\t\t// Transform midiArray to ArrayLike\n\t\t\t// only if it's an ArrayBuffer.\n\t\t\tconst midiArrayLike: ArrayLike = midiArray instanceof ArrayBuffer\n\t\t\t\t? new Uint8Array(midiArray)\n\t\t\t\t: midiArray;\n\n\t\t\t// Parse MIDI data.\n\t\t\tmidiData = parseMidi(midiArrayLike);\n\n\t\t\t// Add the absolute times to each of the tracks.\n\t\t\tmidiData.tracks.forEach(track => {\n\t\t\t\tlet currentTicks = 0;\n\n\t\t\t\ttrack.forEach((event: MidiEvent & { absoluteTime: number; }) => {\n\t\t\t\t\tcurrentTicks += event.deltaTime;\n\t\t\t\t\tevent.absoluteTime = currentTicks;\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Ensure at most one instrument per track.\n\t\t\tmidiData.tracks = splitTracks(midiData.tracks);\n\t\t}\n\n\t\tthis.header = new Header(midiData);\n\t\tthis.tracks = [];\n\n\t\t// Parse MIDI data.\n\t\tif (midiArray) {\n\t\t\t// Format 0, everything is on the same track.\n\t\t\tthis.tracks = midiData.tracks.map(trackData => new Track(trackData, this.header));\n\n\t\t\t// If it's format 1 and there are no notes on the first track, remove it.\n\t\t\tif (midiData.header.format === 1 && this.tracks[0].duration === 0) {\n\t\t\t\tthis.tracks.shift();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * The name of the midi file, taken from the first track.\n\t */\n\tget name(): string {\n\t\treturn this.header.name;\n\t}\n\n\tset name(n) {\n\t\tthis.header.name = n;\n\t}\n\n\t/**\n\t * The total length of the file in seconds.\n\t */\n\tget duration(): number {\n\t\t// Get the max of the last note of all the tracks.\n\t\tconst durations = this.tracks.map(t => t.duration);\n\t\treturn Math.max(...durations);\n\t}\n\n\t/**\n\t * The total length of the file in ticks.\n\t */\n\tget durationTicks(): number {\n\t\t// Get the max of the last note of all the tracks.\n\t\tconst durationTicks = this.tracks.map(t => t.durationTicks);\n\t\treturn Math.max(...durationTicks);\n\t}\n\n\t/**\n\t * Add a track to the MIDI file.\n\t */\n\taddTrack(): Track {\n\t\tconst track = new Track(undefined, this.header);\n\t\tthis.tracks.push(track);\n\n\t\treturn track;\n\t}\n\n\t/**\n\t * Encode the MIDI as a Uint8Array.\n\t */\n\ttoArray(): Uint8Array {\n\t\treturn encode(this);\n\t}\n\n\t/**\n\t * Convert the MIDI object to JSON.\n\t */\n\ttoJSON(): MidiJSON {\n\t\treturn {\n\t\t\theader: this.header.toJSON(),\n\t\t\ttracks: this.tracks.map(track => track.toJSON()),\n\t\t};\n\t}\n\n\t/**\n\t * Parse a JSON representation of the object. Will overwrite the current\n\t * tracks and header.\n\t */\n\tfromJSON(json: MidiJSON): void {\n\t\tthis.header = new Header();\n\t\tthis.header.fromJSON(json.header);\n\t\tthis.tracks = json.tracks.map(trackJSON => {\n\t\t\tconst track = new Track(undefined, this.header);\n\t\t\ttrack.fromJSON(trackJSON);\n\n\t\t\treturn track;\n\t\t});\n\t}\n\n\t/**\n\t * Clone the entire object MIDI object.\n\t */\n\tclone(): Midi {\n\t\tconst midi = new Midi();\n\t\tmidi.fromJSON(this.toJSON());\n\n\t\treturn midi;\n\t}\n}\n\n/**\n * The MIDI data in JSON format.\n */\nexport interface MidiJSON {\n\theader: HeaderJSON;\n\ttracks: TrackJSON[];\n}\n\nexport { TrackJSON, Track } from \"./Track\";\nexport { HeaderJSON, Header } from \"./Header\";\n\n/**\n * Given a list of MIDI tracks, make sure that each channel corresponds to at\n * most one channel and at most one instrument. This means splitting up tracks\n * that contain more than one channel or instrument.\n */\nfunction splitTracks(tracks: Array): Array {\n\tconst newTracks = [];\n\n\tfor (let i = 0; i < tracks.length; i++) {\n\t\tconst defaultTrack = newTracks.length;\n\t\t// a map from [program, channel] tuples to new track numbers\n\t\tconst trackMap = new Map();\n\t\t// a map from channel numbers to current program numbers\n\t\tconst currentProgram = Array(16).fill(0) as Array;\n\n\t\tfor (const event of tracks[i]) {\n\t\t\tlet targetTrack = defaultTrack;\n\n\t\t\t// If the event has a channel, we need to find that channel's current\n\t\t\t// program number and the appropriate track for this [program, channel]\n\t\t\t// pair.\n\t\t\tconst channel = (event as (MidiEvent & { channel?: number })).channel;\n\t\t\tif (channel !== undefined) {\n\t\t\t\tif (event.type === \"programChange\") {\n\t\t\t\t\tcurrentProgram[channel] = event.programNumber;\n\t\t\t\t}\n\n\t\t\t\tconst program = currentProgram[channel];\n\t\t\t\tconst trackKey = `${program} ${channel}`;\n\t\t\t\t\n\t\t\t\tif (trackMap.has(trackKey)) {\n\t\t\t\t\ttargetTrack = trackMap.get(trackKey);\n\t\t\t\t} else {\n\t\t\t\t\ttargetTrack = defaultTrack + trackMap.size;\n\t\t\t\t\ttrackMap.set(trackKey, targetTrack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!newTracks[targetTrack]) {\n\t\t\t\tnewTracks.push([]);\n\t\t\t}\n\n\t\t\tnewTracks[targetTrack].push(event);\n\t\t}\n\t}\n\n\treturn newTracks;\n}\n","import { Header } from \"./Header\";\n\n/**\n * Convert a MIDI note into a pitch.\n */\nfunction midiToPitch(midi: number): string {\n\tconst octave = Math.floor(midi / 12) - 1;\n\treturn midiToPitchClass(midi) + octave.toString();\n}\n\n/**\n * Convert a MIDI note to a pitch class (just the pitch no octave).\n */\nfunction midiToPitchClass(midi: number): string {\n\tconst scaleIndexToNote = [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"];\n\tconst note = midi % 12;\n\treturn scaleIndexToNote[note];\n}\n\n/**\n * Convert a pitch class to a MIDI note.\n */\nfunction pitchClassToMidi(pitch: string): number {\n\tconst scaleIndexToNote = [\"C\", \"C#\", \"D\", \"D#\", \"E\", \"F\", \"F#\", \"G\", \"G#\", \"A\", \"A#\", \"B\"];\n\treturn scaleIndexToNote.indexOf(pitch);\n}\n\n/**\n * Convert a pitch to a MIDI number.\n */\n// tslint:disable-next-line: only-arrow-functions typedef\nconst pitchToMidi: (note: string) => number = (function() {\n\tconst regexp = /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i;\n\tconst noteToScaleIndex = {\n\t\t// tslint:disable-next-line: object-literal-sort-keys\n\t\tcbb: -2, cb: -1, c: 0, \"c#\": 1, cx: 2,\n\t\tdbb: 0, db: 1, d: 2, \"d#\": 3, dx: 4,\n\t\tebb: 2, eb: 3, e: 4, \"e#\": 5, ex: 6,\n\t\tfbb: 3, fb: 4, f: 5, \"f#\": 6, fx: 7,\n\t\tgbb: 5, gb: 6, g: 7, \"g#\": 8, gx: 9,\n\t\tabb: 7, ab: 8, a: 9, \"a#\": 10, ax: 11,\n\t\tbbb: 9, bb: 10, b: 11, \"b#\": 12, bx: 13,\n\t};\n\n\treturn (note) => {\n\t\tconst split = regexp.exec(note);\n\t\tconst pitch = split[1];\n\t\tconst octave = split[2];\n\t\tconst index = noteToScaleIndex[pitch.toLowerCase()];\n\t\treturn index + (parseInt(octave, 10) + 1) * 12;\n\t};\n}());\n\nconst privateHeaderMap = new WeakMap();\n\n/**\n * A Note consists of a `noteOn` and `noteOff` event.\n */\nexport class Note implements NoteInterface {\n\n\t/**\n\t * The notes MIDI value.\n\t */\n\tmidi: number;\n\n\t/**\n\t * The normalized velocity (0-1).\n\t */\n\tvelocity: number;\n\n\t/**\n\t * The velocity of the note off.\n\t */\n\tnoteOffVelocity: number;\n\n\t/**\n\t * The start time in ticks.\n\t */\n\tticks: number;\n\n\t/**\n\t * The duration in ticks.\n\t */\n\tdurationTicks: number;\n\n\tconstructor(noteOn: NoteOnEvent, noteOff: NoteOffEvent, header: Header) {\n\t\tprivateHeaderMap.set(this, header);\n\n\t\tthis.midi = noteOn.midi;\n\n\t\tthis.velocity = noteOn.velocity;\n\n\t\tthis.noteOffVelocity = noteOff.velocity;\n\n\t\tthis.ticks = noteOn.ticks;\n\n\t\tthis.durationTicks = noteOff.ticks - noteOn.ticks;\n\t}\n\n\t/**\n\t * The note name and octave in scientific pitch notation, e.g. \"C4\".\n\t */\n\tget name(): string {\n\t\treturn midiToPitch(this.midi);\n\t}\n\n\tset name(n: string) {\n\t\tthis.midi = pitchToMidi(n);\n\t}\n\n\t/**\n\t * The notes octave number.\n\t */\n\tget octave(): number {\n\t\treturn Math.floor(this.midi / 12) - 1;\n\t}\n\n\tset octave(o: number) {\n\t\tconst diff = o - this.octave;\n\t\tthis.midi += diff * 12;\n\t}\n\n\t/**\n\t * The pitch class name. e.g. \"A\".\n\t */\n\tget pitch(): string {\n\t\treturn midiToPitchClass(this.midi);\n\t}\n\n\tset pitch(p: string) {\n\t\tthis.midi = 12 * (this.octave + 1) + pitchClassToMidi(p);\n\t}\n\n\t/**\n\t * The duration of the segment in seconds.\n\t */\n\tget duration(): number {\n\t\tconst header = privateHeaderMap.get(this);\n\t\treturn header.ticksToSeconds(this.ticks + this.durationTicks) - header.ticksToSeconds(this.ticks);\n\t}\n\n\tset duration(d: number) {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tconst noteEndTicks = header.secondsToTicks(this.time + d);\n\t\tthis.durationTicks = noteEndTicks - this.ticks;\n\t}\n\n\t/**\n\t * The time of the event in seconds.\n\t */\n\tget time(): number {\n\t\tconst header = privateHeaderMap.get(this);\n\t\treturn header.ticksToSeconds(this.ticks);\n\t}\n\n\tset time(t: number) {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tthis.ticks = header.secondsToTicks(t);\n\t}\n\n\t/**\n\t * The number of measures (and partial measures) to this beat.\n\t * Takes into account time signature changes.\n\t * @readonly\n\t */\n\tget bars(): number {\n\t\tconst header = privateHeaderMap.get(this);\n\t\treturn header.ticksToMeasures(this.ticks);\n\t}\n\n\ttoJSON(): NoteJSON {\n\t\treturn {\n\t\t\tduration: this.duration,\n\t\t\tdurationTicks: this.durationTicks,\n\t\t\tmidi: this.midi,\n\t\t\tname: this.name,\n\t\t\tticks: this.ticks,\n\t\t\ttime: this.time,\n\t\t\tvelocity: this.velocity,\n\t\t};\n\t}\n}\n\nexport interface NoteJSON {\n\ttime: number;\n\tmidi: number;\n\tname: string;\n\tvelocity: number;\n\tduration: number;\n\tticks: number;\n\tdurationTicks: number;\n}\n\nexport interface NoteOnEvent {\n\tticks: number;\n\tvelocity: number;\n\tmidi: number;\n}\n\nexport interface NoteOffEvent {\n\tticks: number;\n\tvelocity: number;\n}\n\nexport interface NoteInterface {\n\ttime: number;\n\tticks: number;\n\tduration: number;\n\tdurationTicks: number;\n\tmidi: number;\n\tpitch: string;\n\toctave: number;\n\tname: string;\n\tnoteOffVelocity: number;\n\tvelocity: number;\n}\n\ntype PitchDescription = {\n\tname: string;\n} | {\n\tpitch: string;\n\toctave: number;\n} | {\n\tmidi: number;\n}\n\ntype VelocityDescription = {\n\tvelocity?: number;\n\tnoteOffVelocity?: number;\n}\n\ntype TimeDescription = {\n\ttime: number;\n\tduration?: number;\n} | {\n\tticks: number;\n\tdurationTicks?: number;\n}\n\n/**\n * @hidden\n */\nexport type NoteConstructorInterface = PitchDescription & VelocityDescription & TimeDescription\n","import { Header } from \"./Header\";\nimport { MidiPitchBendEvent } from \"midi-file\";\n\nconst privateHeaderMap = new WeakMap();\n\n/**\n * Represents a pitch bend event.\n */\nexport class PitchBend implements PitchBendInterface {\n\n\t/**\n\t * The pitch value from...\n\t */\n\tvalue: number;\n\n\t/**\n\t * The tick time of the event.\n\t */\n\tticks: number;\n\n\t/**\n\t * @param event\n\t * @param header\n\t */\n\tconstructor(event: Partial, header: Header) {\n\t\tprivateHeaderMap.set(this, header);\n\n\t\tthis.ticks = event.absoluteTime;\n\t\tthis.value = event.value;\n\t}\n\n\t/**\n\t * The time of the event in seconds\n\t */\n\tget time(): number {\n\t\tconst header = privateHeaderMap.get(this);\n\t\treturn header.ticksToSeconds(this.ticks);\n\t}\n\n\tset time(t: number) {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tthis.ticks = header.secondsToTicks(t);\n\t}\n\n\ttoJSON(): PitchBendJSON {\n\t\treturn {\n\t\t\tticks: this.ticks,\n\t\t\ttime: this.time,\n\t\t\tvalue: this.value,\n\t\t};\n\t}\n}\n\nexport interface PitchBendJSON {\n\tticks: number;\n\ttime: number;\n\tvalue: number;\n}\n\nexport interface PitchBendInterface {\n\tticks: number;\n\ttime: number;\n\tvalue: number;\n}\n","import type {\n\tMidiControllerEvent,\n\tMidiEndOfTrackEvent,\n\tMidiEvent,\n\tMidiNoteOffEvent, MidiNoteOnEvent,\n\tMidiPitchBendEvent, MidiTrackNameEvent\n} from \"midi-file\";\n\n// Used to add `absoluteTime` property to 'MidiEvent's.\ntype WithAbsoluteTime = { absoluteTime: number; };\n\nimport { insert } from \"./BinarySearch\";\nimport { ControlChange, ControlChangeInterface } from \"./ControlChange\";\nimport { ControlChangesJSON, createControlChanges } from \"./ControlChanges\";\nimport { PitchBend, PitchBendInterface, PitchBendJSON } from \"./PitchBend\";\n\nimport { Header } from \"./Header\";\nimport { Instrument, InstrumentJSON } from \"./Instrument\";\nimport { Note, NoteConstructorInterface, NoteJSON } from \"./Note\";\n\nconst privateHeaderMap = new WeakMap();\n\n/**\n * A Track is a collection of 'notes' and 'controlChanges'.\n */\nexport class Track {\n\t/**\n\t * The name of the track.\n\t */\n\tname = \"\";\n\n\t/**\n\t * The instrument associated with the track.\n\t */\n\tinstrument: Instrument;\n\n\t/**\n\t * The track's note events.\n\t */\n\tnotes: Note[] = [];\n\n\t/**\n\t * The channel number of the track. Applies this channel\n\t * to all events associated with the channel.\n\t */\n\tchannel: number;\n\n\t/**\n\t * The control change events.\n\t */\n\tcontrolChanges = createControlChanges();\n\n\t/**\n\t * The end of track event (if it exists) in ticks.\n\t */\n\tendOfTrackTicks?: number;\n\n\t/**\n\t * The pitch bend events.\n\t */\n\tpitchBends: PitchBend[] = [];\n\n\tconstructor(trackData: MidiEvent[], header: Header) {\n\t\tprivateHeaderMap.set(this, header);\n\n\t\tif (trackData) {\n\t\t\t// Get the name of the track.\n\t\t\tconst nameEvent = trackData.find(\n\t\t\t\t(e) => e.type === \"trackName\"\n\t\t\t) as MidiTrackNameEvent;\n\n\t\t\t// Set empty name if 'trackName' event isn't found.\n\t\t\tthis.name = nameEvent ? nameEvent.text : \"\";\n\t\t}\n\n\t\tthis.instrument = new Instrument(trackData, this);\n\n\t\t// Defaults to 0.\n\t\tthis.channel = 0;\n\n\t\tif (trackData) {\n\t\t\tconst noteOns = trackData.filter(\n\t\t\t\t(event) => event.type === \"noteOn\"\n\t\t\t) as (MidiNoteOnEvent & WithAbsoluteTime)[];\n\n\t\t\tconst noteOffs = trackData.filter(\n\t\t\t\t(event) => event.type === \"noteOff\"\n\t\t\t) as (MidiNoteOffEvent & WithAbsoluteTime)[];\n\n\t\t\twhile (noteOns.length) {\n\t\t\t\tconst currentNote = noteOns.shift();\n\n\t\t\t\t// Set the channel based on the note.\n\t\t\t\tthis.channel = currentNote.channel;\n\n\t\t\t\t// Find the corresponding note off.\n\t\t\t\tconst offIndex = noteOffs.findIndex(\n\t\t\t\t\t(note) =>\n\t\t\t\t\t\tnote.noteNumber === currentNote.noteNumber &&\n\t\t\t\t\t\tnote.absoluteTime >= currentNote.absoluteTime\n\t\t\t\t);\n\n\t\t\t\tif (offIndex !== -1) {\n\t\t\t\t\t// Once it's got the note off, add it.\n\t\t\t\t\tconst noteOff = noteOffs.splice(offIndex, 1)[0];\n\n\t\t\t\t\tthis.addNote({\n\t\t\t\t\t\tdurationTicks:\n\t\t\t\t\t\t\tnoteOff.absoluteTime - currentNote.absoluteTime,\n\t\t\t\t\t\tmidi: currentNote.noteNumber,\n\t\t\t\t\t\tnoteOffVelocity: noteOff.velocity / 127,\n\t\t\t\t\t\tticks: currentNote.absoluteTime,\n\t\t\t\t\t\tvelocity: currentNote.velocity / 127,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst controlChanges = trackData.filter(\n\t\t\t\t(event) => event.type === \"controller\"\n\t\t\t) as (MidiControllerEvent & WithAbsoluteTime)[];\n\t\t\tcontrolChanges.forEach((event) => {\n\t\t\t\tthis.addCC({\n\t\t\t\t\tnumber: event.controllerType,\n\t\t\t\t\tticks: event.absoluteTime,\n\t\t\t\t\tvalue: event.value / 127,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst pitchBends = trackData.filter(\n\t\t\t\t(event) => event.type === \"pitchBend\"\n\t\t\t) as (MidiPitchBendEvent & WithAbsoluteTime)[];\n\t\t\tpitchBends.forEach((event) => {\n\t\t\t\tthis.addPitchBend({\n\t\t\t\t\tticks: event.absoluteTime,\n\t\t\t\t\t// Scale the value between -2^13 to 2^13 to -2 to 2.\n\t\t\t\t\tvalue: event.value / Math.pow(2, 13),\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst endOfTrackEvent:\n\t\t\t| (MidiEndOfTrackEvent & WithAbsoluteTime)\n\t\t\t| undefined = trackData.find(\n\t\t\t\t(event): event is (MidiEndOfTrackEvent & WithAbsoluteTime) =>\n\t\t\t\t\tevent.type === \"endOfTrack\"\n\t\t\t);\n\n\t\t\tthis.endOfTrackTicks =\n\t\t\t\tendOfTrackEvent !== undefined\n\t\t\t\t\t? endOfTrackEvent.absoluteTime\n\t\t\t\t\t: undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Add a note to the notes array.\n\t * @param props The note properties to add.\n\t */\n\taddNote(props: NoteConstructorInterface): this {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tconst note = new Note(\n\t\t\t{\n\t\t\t\tmidi: 0,\n\t\t\t\tticks: 0,\n\t\t\t\tvelocity: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\tticks: 0,\n\t\t\t\tvelocity: 0,\n\t\t\t},\n\t\t\theader\n\t\t);\n\n\t\tObject.assign(note, props);\n\t\tinsert(this.notes, note, \"ticks\");\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add a control change to the track.\n\t * @param props\n\t */\n\taddCC(\n\t\tprops:\n\t\t| Omit\n\t\t| Omit\n\t): this {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tconst cc = new ControlChange(\n\t\t\t{\n\t\t\t\tcontrollerType: props.number,\n\t\t\t},\n\t\t\theader\n\t\t);\n\t\tdelete props.number;\n\t\tObject.assign(cc, props);\n\t\tif (!Array.isArray(this.controlChanges[cc.number])) {\n\t\t\tthis.controlChanges[cc.number] = [];\n\t\t}\n\t\tinsert(this.controlChanges[cc.number], cc, \"ticks\");\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add a control change to the track.\n\t */\n\taddPitchBend(\n\t\tprops:\n\t\t| Omit\n\t\t| Omit\n\t): this {\n\t\tconst header = privateHeaderMap.get(this);\n\t\tconst pb = new PitchBend({}, header);\n\t\tObject.assign(pb, props);\n\t\tinsert(this.pitchBends, pb, \"ticks\");\n\t\treturn this;\n\t}\n\n\t/**\n\t * The end time of the last event in the track.\n\t */\n\tget duration(): number {\n\t\tif (!this.notes.length) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet maxDuration =\n\t\t\tthis.notes[this.notes.length - 1].time +\n\t\t\tthis.notes[this.notes.length - 1].duration;\n\n\t\tfor (let i = 0; i < this.notes.length - 1; i++) {\n\t\t\tconst duration = this.notes[i].time + this.notes[i].duration;\n\t\t\tif (maxDuration < duration) {\n\t\t\t\tmaxDuration = duration;\n\t\t\t}\n\t\t}\n\n\t\treturn maxDuration;\n\t}\n\n\t/**\n\t * The end time of the last event in the track in ticks.\n\t */\n\tget durationTicks(): number {\n\t\tif (!this.notes.length) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tlet maxDuration =\n\t\t\tthis.notes[this.notes.length - 1].ticks +\n\t\t\tthis.notes[this.notes.length - 1].durationTicks;\n\t\tfor (let i = 0; i < this.notes.length - 1; i++) {\n\t\t\tconst duration = this.notes[i].ticks + this.notes[i].durationTicks;\n\t\t\tif (maxDuration < duration) {\n\t\t\t\tmaxDuration = duration;\n\t\t\t}\n\t\t}\n\n\t\treturn maxDuration;\n\t}\n\n\t/**\n\t * Assign the JSON values to this track.\n\t */\n\tfromJSON(json: TrackJSON): void {\n\t\tthis.name = json.name;\n\t\tthis.channel = json.channel;\n\t\tthis.instrument = new Instrument(undefined, this);\n\t\tthis.instrument.fromJSON(json.instrument);\n\n\t\tif (json.endOfTrackTicks !== undefined) {\n\t\t\tthis.endOfTrackTicks = json.endOfTrackTicks;\n\t\t}\n\n\t\tfor (const number in json.controlChanges) {\n\t\t\tif (json.controlChanges[number]) {\n\t\t\t\tjson.controlChanges[number].forEach((cc) => {\n\t\t\t\t\tthis.addCC({\n\t\t\t\t\t\tnumber: cc.number,\n\t\t\t\t\t\tticks: cc.ticks,\n\t\t\t\t\t\tvalue: cc.value,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tjson.notes.forEach((n) => {\n\t\t\tthis.addNote({\n\t\t\t\tdurationTicks: n.durationTicks,\n\t\t\t\tmidi: n.midi,\n\t\t\t\tticks: n.ticks,\n\t\t\t\tvelocity: n.velocity,\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Convert the track into a JSON format.\n\t */\n\ttoJSON(): TrackJSON {\n\t\t// Convert all the CCs to JSON.\n\t\tconst controlChanges = {};\n\t\tfor (let i = 0; i < 127; i++) {\n\t\t\tif (this.controlChanges.hasOwnProperty(i)) {\n\t\t\t\tcontrolChanges[i] = this.controlChanges[i].map((c) =>\n\t\t\t\t\tc.toJSON()\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst json: TrackJSON = {\n\t\t\tchannel: this.channel,\n\t\t\tcontrolChanges,\n\t\t\tpitchBends: this.pitchBends.map((pb) => pb.toJSON()),\n\t\t\tinstrument: this.instrument.toJSON(),\n\t\t\tname: this.name,\n\t\t\tnotes: this.notes.map((n) => n.toJSON()),\n\t\t};\n\n\t\tif (this.endOfTrackTicks !== undefined) {\n\t\t\tjson.endOfTrackTicks = this.endOfTrackTicks;\n\t\t}\n\n\t\treturn json;\n\t}\n}\n\nexport interface TrackJSON {\n\tname: string;\n\tnotes: NoteJSON[];\n\tchannel: number;\n\tinstrument: InstrumentJSON;\n\tcontrolChanges: ControlChangesJSON;\n\tpitchBends: PitchBendJSON[];\n\tendOfTrackTicks?: number;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(233);\n"],"names":["root","factory","exports","module","define","amd","a","i","self","this","flatten","array","result","$flatten","length","value","Array","isArray","push","parseMidi","writeMidi","parseTrack","data","lastEventTypeByte","p","Parser","events","eof","event","readEvent","deltaTime","readVarInt","eventTypeByte","readUInt8","type","readBytes","meta","metatypeByte","number","readUInt16","text","readString","channel","port","microsecondsPerBeat","readUInt24","hourByte","frameRate","hour","min","sec","frame","subFrame","numerator","denominator","metronome","thirtyseconds","key","readInt8","scale","param1","running","eventType","noteNumber","velocity","byte9","amount","controllerType","programNumber","buffer","bufferLen","pos","prototype","u","readInt16","readInt24","readUInt32","len","bytes","slice","String","fromCharCode","apply","b","readChunk","id","headerChunk","header","format","numTracks","timeDivision","framesPerSecond","ticksPerFrame","ticksPerBeat","parseHeader","tracks","trackChunk","track","writeTrack","w","opts","t","Writer","writeEvent","useByte9ForNoteOff","writeChunk","writeVarInt","writeUInt8","writeUInt16","writeString","writeUInt24","Math","floor","log","LN2","writeInt8","writeBytes","value14","lsb14","msb14","v","b0","b1","writeInt16","b2","writeInt24","writeUInt32","b3","writeInt32","arr","concat","call","str","codePointAt","reverse","h","writeHeader","search","prop","beginning","end","midPoint","nextEvent","index","splice","controlChangeNames","controlChangeIds","Object","keys","reduce","obj","privateHeaderMap","WeakMap","privateCCNumberMap","set","ticks","absoluteTime","get","ticksToSeconds","secondsToTicks","toJSON","time","ControlChange","Proxy","target","handler","hasOwnProperty","encodeControlChange","cc","encodeInstrument","instrument","midi","midiData","ppq","name","keySignatures","map","keySig","keyIndex","keySignatureKeys","indexOf","encodeKeySignature","e","textEvent","tempos","tempo","bpm","encodeTempo","timeSignatures","timeSig","timeSignature","encodeTimeSignature","notes","note","durationTicks","noteOffVelocity","encodeNote","encodeNotes","controlChanges","forEach","encodeControlChanges","pitchBends","pb","encodePitchBend","encodePitchBends","sort","lastTime","Uint8Array","privatePPQMap","update","currentTime","lastEventBeats","lastBPM","beats","elapsedSeconds","lastEvent","elapsedMeasures","measures","tempoTime","elapsedBeats","ticksToMeasures","timeSigEvent","seconds","round","fromJSON","json","assign","setTempo","Header","privateTrackMap","trackData","programChange","find","percussion","DrumKitByPatchID","instrumentByPatchID","n","patchNumber","InstrumentFamilyByID","family","Instrument","midiArray","midiArrayLike","ArrayBuffer","currentTicks","newTracks","defaultTrack","trackMap","Map","currentProgram","fill","targetTrack","undefined","program","trackKey","has","size","splitTracks","Track","duration","shift","fromUrl","url","fetch","response","ok","arrayBuffer","Midi","Error","durations","max","addTrack","toArray","encode","trackJSON","clone","midiToPitchClass","regexp","noteToScaleIndex","pitchToMidi","cbb","cb","c","cx","dbb","db","d","dx","ebb","eb","ex","fbb","fb","f","fx","gbb","gb","g","gx","abb","ab","ax","bbb","bb","bx","split","exec","pitch","octave","toLowerCase","parseInt","noteOn","noteOff","toString","o","diff","noteEndTicks","Note","PitchBend","createControlChanges","nameEvent","noteOns","filter","noteOffs","currentNote","offIndex","findIndex","addNote","addCC","addPitchBend","pow","endOfTrackEvent","endOfTrackTicks","props","insert","maxDuration","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","defineProperty","enumerable","r","Symbol","toStringTag"],"sourceRoot":""} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.d.ts new file mode 100644 index 00000000..baf3198a --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.d.ts @@ -0,0 +1,11 @@ +/** + * Return the index of the element at or before the given property + * @hidden + */ +export declare function search(array: any[], value: any, prop?: string): number; +/** + * Does a binary search to insert the note + * in the correct spot in the array + * @hidden + */ +export declare function insert(array: any[], event: object, prop?: string): void; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.js new file mode 100644 index 00000000..8b48c951 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.insert = exports.search = void 0; +/** + * Return the index of the element at or before the given property + * @hidden + */ +function search(array, value, prop) { + if (prop === void 0) { prop = "ticks"; } + var beginning = 0; + var len = array.length; + var end = len; + if (len > 0 && array[len - 1][prop] <= value) { + return len - 1; + } + while (beginning < end) { + // calculate the midpoint for roughly equal partition + var midPoint = Math.floor(beginning + (end - beginning) / 2); + var event_1 = array[midPoint]; + var nextEvent = array[midPoint + 1]; + if (event_1[prop] === value) { + // choose the last one that has the same value + for (var i = midPoint; i < array.length; i++) { + var testEvent = array[i]; + if (testEvent[prop] === value) { + midPoint = i; + } + } + return midPoint; + } + else if (event_1[prop] < value && nextEvent[prop] > value) { + return midPoint; + } + else if (event_1[prop] > value) { + // search lower + end = midPoint; + } + else if (event_1[prop] < value) { + // search upper + beginning = midPoint + 1; + } + } + return -1; +} +exports.search = search; +/** + * Does a binary search to insert the note + * in the correct spot in the array + * @hidden + */ +function insert(array, event, prop) { + if (prop === void 0) { prop = "ticks"; } + if (array.length) { + var index = search(array, event[prop], prop); + array.splice(index + 1, 0, event); + } + else { + array.push(event); + } +} +exports.insert = insert; +//# sourceMappingURL=BinarySearch.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.js.map new file mode 100644 index 00000000..98590bda --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/BinarySearch.js.map @@ -0,0 +1 @@ +{"version":3,"file":"BinarySearch.js","sourceRoot":"","sources":["../src/BinarySearch.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,MAAM,CAAC,KAAY,EAAE,KAAU,EAAE,IAAc;IAAd,qBAAA,EAAA,cAAc;IAC9D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACzB,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,EAAE;QAC7C,OAAO,GAAG,GAAG,CAAC,CAAC;KACf;IACD,OAAO,SAAS,GAAG,GAAG,EAAE;QACvB,qDAAqD;QACrD,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAM,OAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,OAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE;YAC1B,8CAA8C;YAC9C,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC7C,IAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE;oBAC9B,QAAQ,GAAG,CAAC,CAAC;iBACb;aACD;YACD,OAAO,QAAQ,CAAC;SAChB;aAAM,IAAI,OAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE;YAC1D,OAAO,QAAQ,CAAC;SAChB;aAAM,IAAI,OAAK,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE;YAC/B,eAAe;YACf,GAAG,GAAG,QAAQ,CAAC;SACf;aAAM,IAAI,OAAK,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE;YAC/B,eAAe;YACf,SAAS,GAAG,QAAQ,GAAG,CAAC,CAAC;SACzB;KACD;IACD,OAAO,CAAC,CAAC,CAAC;AACX,CAAC;AAhCD,wBAgCC;AAED;;;;GAIG;AACH,SAAgB,MAAM,CAAC,KAAY,EAAE,KAAa,EAAE,IAAc;IAAd,qBAAA,EAAA,cAAc;IACjE,IAAI,KAAK,CAAC,MAAM,EAAE;QACjB,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;KAClC;SAAM;QACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAClB;AACF,CAAC;AAPD,wBAOC"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.d.ts new file mode 100644 index 00000000..70b74d21 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.d.ts @@ -0,0 +1,66 @@ +import type { MidiControllerEvent } from "midi-file"; +import { Header } from "./Header"; +/** + * @hidden + */ +export declare type ControlChangeName = "modulationWheel" | "breath" | "footController" | "portamentoTime" | "volume" | "balance" | "pan" | "sustain" | "portamentoTime" | "sostenuto" | "softPedal" | "legatoFootswitch" | "portamentoControl"; +interface ControlChangeMap { + [key: number]: ControlChangeName; +} +/** + * A map of values to control change names + * @hidden + */ +export declare const controlChangeNames: ControlChangeMap; +/** + * swap the keys and values + * @hidden + */ +export declare const controlChangeIds: {}; +/** + * Represents a control change event + */ +export declare class ControlChange implements ControlChangeInterface { + /** + * The number value of the event + */ + value: number; + /** + * The tick time of the event + */ + ticks: number; + /** + * @param event + * @param header + */ + constructor(event: Partial, header: Header); + /** + * The controller number + */ + get number(): number; + /** + * return the common name of the control number if it exists + */ + get name(): ControlChangeName; + /** + * The time of the event in seconds + */ + get time(): number; + set time(t: number); + toJSON(): ControlChangeJSON; +} +export interface ControlChangeJSON { + number: number; + ticks: number; + time: number; + value: number; +} +export interface ControlChangeInterface { + number: number; + ticks: number; + time: number; + value: number; +} +export {}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.js new file mode 100644 index 00000000..72ad7eeb --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.js @@ -0,0 +1,98 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ControlChange = exports.controlChangeIds = exports.controlChangeNames = void 0; +/** + * A map of values to control change names + * @hidden + */ +exports.controlChangeNames = { + 1: "modulationWheel", + 2: "breath", + 4: "footController", + 5: "portamentoTime", + 7: "volume", + 8: "balance", + 10: "pan", + 64: "sustain", + 65: "portamentoTime", + 66: "sostenuto", + 67: "softPedal", + 68: "legatoFootswitch", + 84: "portamentoControl", +}; +/** + * swap the keys and values + * @hidden + */ +exports.controlChangeIds = Object.keys(exports.controlChangeNames).reduce(function (obj, key) { + obj[exports.controlChangeNames[key]] = key; + return obj; +}, {}); +var privateHeaderMap = new WeakMap(); +var privateCCNumberMap = new WeakMap(); +/** + * Represents a control change event + */ +var ControlChange = /** @class */ (function () { + /** + * @param event + * @param header + */ + function ControlChange(event, header) { + privateHeaderMap.set(this, header); + privateCCNumberMap.set(this, event.controllerType); + this.ticks = event.absoluteTime; + this.value = event.value; + } + Object.defineProperty(ControlChange.prototype, "number", { + /** + * The controller number + */ + get: function () { + return privateCCNumberMap.get(this); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ControlChange.prototype, "name", { + /** + * return the common name of the control number if it exists + */ + get: function () { + if (exports.controlChangeNames[this.number]) { + return exports.controlChangeNames[this.number]; + } + else { + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(ControlChange.prototype, "time", { + /** + * The time of the event in seconds + */ + get: function () { + var header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks); + }, + set: function (t) { + var header = privateHeaderMap.get(this); + this.ticks = header.secondsToTicks(t); + }, + enumerable: false, + configurable: true + }); + ControlChange.prototype.toJSON = function () { + return { + number: this.number, + ticks: this.ticks, + time: this.time, + value: this.value, + }; + }; + return ControlChange; +}()); +exports.ControlChange = ControlChange; +//# sourceMappingURL=ControlChange.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.js.map new file mode 100644 index 00000000..76e1d319 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChange.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ControlChange.js","sourceRoot":"","sources":["../src/ControlChange.ts"],"names":[],"mappings":";;;AAwBA;;;GAGG;AACU,QAAA,kBAAkB,GAAqB;IACnD,CAAC,EAAE,iBAAiB;IACpB,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,gBAAgB;IACnB,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,SAAS;IACZ,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,kBAAkB;IACtB,EAAE,EAAE,mBAAmB;CACvB,CAAC;AAEF;;;GAGG;AACU,QAAA,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,0BAAkB,CAAC,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,GAAG;IAC/E,GAAG,CAAC,0BAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACnC,OAAO,GAAG,CAAC;AACZ,CAAC,EAAE,EAAE,CAAC,CAAC;AAEP,IAAM,gBAAgB,GAAG,IAAI,OAAO,EAAyB,CAAC;AAC9D,IAAM,kBAAkB,GAAG,IAAI,OAAO,EAAyB,CAAC;AAEhE;;GAEG;AACH;IAYC;;;OAGG;IACH,uBAAY,KAA8D,EAAE,MAAc;QACzF,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;QAEnD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAKD,sBAAI,iCAAM;QAHV;;WAEG;aACH;YACC,OAAO,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;;;OAAA;IAKD,sBAAI,+BAAI;QAHR;;WAEG;aACH;YACC,IAAI,0BAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBACpC,OAAO,0BAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACvC;iBAAM;gBACN,OAAO,IAAI,CAAC;aACZ;QACF,CAAC;;;OAAA;IAKD,sBAAI,+BAAI;QAHR;;WAEG;aACH;YACC,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAED,UAAS,CAAS;YACjB,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;;;OALA;IAOD,8BAAM,GAAN;QACC,OAAO;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SACjB,CAAC;IACH,CAAC;IACF,oBAAC;AAAD,CAAC,AA/DD,IA+DC;AA/DY,sCAAa"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.d.ts new file mode 100644 index 00000000..f80880da --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.d.ts @@ -0,0 +1,14 @@ +import { ControlChange, ControlChangeJSON } from "./ControlChange"; +export interface ControlChanges { + [key: string]: ControlChange[]; + [key: number]: ControlChange[]; +} +export interface ControlChangesJSON { + [key: string]: ControlChangeJSON[]; + [key: number]: ControlChangeJSON[]; +} +/** + * Automatically creates an alias for named control values using Proxies + * @hidden + */ +export declare function createControlChanges(): ControlChanges; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.js new file mode 100644 index 00000000..7d876406 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createControlChanges = void 0; +var ControlChange_1 = require("./ControlChange"); +/** + * Automatically creates an alias for named control values using Proxies + * @hidden + */ +function createControlChanges() { + return new Proxy({}, { + // tslint:disable-next-line: typedef + get: function (target, handler) { + if (target[handler]) { + return target[handler]; + } + else if (ControlChange_1.controlChangeIds.hasOwnProperty(handler)) { + return target[ControlChange_1.controlChangeIds[handler]]; + } + }, + // tslint:disable-next-line: typedef + set: function (target, handler, value) { + if (ControlChange_1.controlChangeIds.hasOwnProperty(handler)) { + target[ControlChange_1.controlChangeIds[handler]] = value; + } + else { + target[handler] = value; + } + return true; + }, + }); +} +exports.createControlChanges = createControlChanges; +//# sourceMappingURL=ControlChanges.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.js.map new file mode 100644 index 00000000..992bfe90 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/ControlChanges.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ControlChanges.js","sourceRoot":"","sources":["../src/ControlChanges.ts"],"names":[],"mappings":";;;AAAA,iDAAmD;AAanD;;;GAGG;AACH,SAAgB,oBAAoB;IACnC,OAAO,IAAI,KAAK,CAAC,EAAE,EAAE;QACpB,oCAAoC;QACpC,GAAG,YAAC,MAAM,EAAE,OAAO;YAClB,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE;gBACpB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;aACvB;iBAAM,IAAI,gCAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;gBACpD,OAAO,MAAM,CAAC,gCAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;aACzC;QACF,CAAC;QACD,oCAAoC;QACpC,GAAG,YAAC,MAAM,EAAE,OAAO,EAAE,KAAK;YACzB,IAAI,gCAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;gBAC7C,MAAM,CAAC,gCAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC;aAC1C;iBAAM;gBACN,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;aACxB;YACD,OAAO,IAAI,CAAC;QACb,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AApBD,oDAoBC"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.d.ts new file mode 100644 index 00000000..d8ef31ad --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.d.ts @@ -0,0 +1,5 @@ +import { Midi } from "./Midi"; +/** + * Convert the MIDI object to an array. + */ +export declare function encode(midi: Midi): Uint8Array; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.js new file mode 100644 index 00000000..4cc54f5f --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.js @@ -0,0 +1,185 @@ +"use strict"; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.encode = void 0; +var midi_file_1 = require("midi-file"); +var Header_1 = require("./Header"); +var array_flatten_1 = require("array-flatten"); +function encodeNote(note, channel) { + return [{ + absoluteTime: note.ticks, + channel: channel, + deltaTime: 0, + noteNumber: note.midi, + type: "noteOn", + velocity: Math.floor(note.velocity * 127), + }, + { + absoluteTime: note.ticks + note.durationTicks, + channel: channel, + deltaTime: 0, + noteNumber: note.midi, + type: "noteOff", + velocity: Math.floor(note.noteOffVelocity * 127), + }]; +} +function encodeNotes(track) { + return (0, array_flatten_1.flatten)(track.notes.map(function (note) { return encodeNote(note, track.channel); })); +} +function encodeControlChange(cc, channel) { + return { + absoluteTime: cc.ticks, + channel: channel, + controllerType: cc.number, + deltaTime: 0, + type: "controller", + value: Math.floor(cc.value * 127), + }; +} +function encodeControlChanges(track) { + var controlChanges = []; + for (var i = 0; i < 127; i++) { + if (track.controlChanges.hasOwnProperty(i)) { + track.controlChanges[i].forEach(function (cc) { + controlChanges.push(encodeControlChange(cc, track.channel)); + }); + } + } + return controlChanges; +} +function encodePitchBend(pb, channel) { + return { + absoluteTime: pb.ticks, + channel: channel, + deltaTime: 0, + type: "pitchBend", + value: pb.value, + }; +} +function encodePitchBends(track) { + var pitchBends = []; + track.pitchBends.forEach(function (pb) { + pitchBends.push(encodePitchBend(pb, track.channel)); + }); + return pitchBends; +} +function encodeInstrument(track) { + return { + absoluteTime: 0, + channel: track.channel, + deltaTime: 0, + programNumber: track.instrument.number, + type: "programChange", + }; +} +function encodeTrackName(name) { + return { + absoluteTime: 0, + deltaTime: 0, + meta: true, + text: name, + type: "trackName", + }; +} +function encodeTempo(tempo) { + return { + absoluteTime: tempo.ticks, + deltaTime: 0, + meta: true, + microsecondsPerBeat: Math.floor(60000000 / tempo.bpm), + type: "setTempo", + }; +} +function encodeTimeSignature(timeSig) { + return { + absoluteTime: timeSig.ticks, + deltaTime: 0, + denominator: timeSig.timeSignature[1], + meta: true, + metronome: 24, + numerator: timeSig.timeSignature[0], + thirtyseconds: 8, + type: "timeSignature", + }; +} +// function encodeMeta(event: ) +function encodeKeySignature(keySig) { + var keyIndex = Header_1.keySignatureKeys.indexOf(keySig.key); + return { + absoluteTime: keySig.ticks, + deltaTime: 0, + key: keyIndex + 7, + meta: true, + scale: keySig.scale === "major" ? 0 : 1, + type: "keySignature", + }; +} +function encodeText(textEvent) { + return { + absoluteTime: textEvent.ticks, + deltaTime: 0, + meta: true, + text: textEvent.text, + type: textEvent.type, + }; +} +/** + * Convert the MIDI object to an array. + */ +function encode(midi) { + var midiData = { + header: { + format: 1, + numTracks: midi.tracks.length + 1, + ticksPerBeat: midi.header.ppq, + }, + tracks: __spreadArray([ + __spreadArray(__spreadArray(__spreadArray(__spreadArray([ + // The name data. + { + absoluteTime: 0, + deltaTime: 0, + meta: true, + text: midi.header.name, + type: "trackName", + } + ], midi.header.keySignatures.map(function (keySig) { return encodeKeySignature(keySig); }), true), midi.header.meta.map(function (e) { return encodeText(e); }), true), midi.header.tempos.map(function (tempo) { return encodeTempo(tempo); }), true), midi.header.timeSignatures.map(function (timeSig) { return encodeTimeSignature(timeSig); }), true) + ], midi.tracks.map(function (track) { + return __spreadArray(__spreadArray(__spreadArray([ + // Add the name + encodeTrackName(track.name), + // the instrument + encodeInstrument(track) + ], encodeNotes(track), true), encodeControlChanges(track), true), encodePitchBends(track), true); + }), true), + }; + // Sort and set `deltaTime` of all of the tracks. + midiData.tracks = midiData.tracks.map(function (track) { + track = track.sort(function (a, b) { return a.absoluteTime - b.absoluteTime; }); + var lastTime = 0; + track.forEach(function (note) { + note.deltaTime = note.absoluteTime - lastTime; + lastTime = note.absoluteTime; + delete note.absoluteTime; + }); + // End of track. + track.push({ + deltaTime: 0, + meta: true, + type: "endOfTrack", + }); + return track; + }); + // Rreturn `midiData`. + return new Uint8Array((0, midi_file_1.writeMidi)(midiData)); +} +exports.encode = encode; +//# sourceMappingURL=Encode.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.js.map new file mode 100644 index 00000000..84b037e5 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Encode.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Encode.js","sourceRoot":"","sources":["../src/Encode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.d.ts new file mode 100644 index 00000000..d7629670 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.d.ts @@ -0,0 +1,94 @@ +import type { MidiData } from "midi-file"; +export interface TempoEvent { + ticks: number; + bpm: number; + time?: number; +} +export interface TimeSignatureEvent { + ticks: number; + timeSignature: number[]; + measures?: number; +} +export interface MetaEvent { + text: string; + type: string; + ticks: number; +} +export interface KeySignatureEvent { + ticks: number; + key: string; + scale: string; +} +/** + * @hidden + */ +export declare const keySignatureKeys: string[]; +/** + * The parsed MIDI file header. + */ +export declare class Header { + /** + * The array of all the tempo events. + */ + tempos: TempoEvent[]; + /** + * The time signatures. + */ + timeSignatures: TimeSignatureEvent[]; + /** + * The time signatures. + */ + keySignatures: KeySignatureEvent[]; + /** + * Additional meta events. + */ + meta: MetaEvent[]; + /** + * The name of the MIDI file; + */ + name: string; + constructor(midiData?: MidiData); + /** + * This must be invoked after any changes are made to the tempo array + * or the timeSignature array for the updated values to be reflected. + */ + update(): void; + /** + * Convert ticks into seconds based on the tempo changes. + */ + ticksToSeconds(ticks: number): number; + /** + * Convert ticks into measures based off of the time signatures. + */ + ticksToMeasures(ticks: number): number; + /** + * The number of ticks per quarter note. + */ + get ppq(): number; + /** + * Convert seconds to ticks based on the tempo events. + */ + secondsToTicks(seconds: number): number; + /** + * Convert the header into an object. + */ + toJSON(): HeaderJSON; + /** + * Parse a header json object. + */ + fromJSON(json: HeaderJSON): void; + /** + * Update the tempo of the midi to a single tempo. Will remove and replace + * any other tempos currently set and update all of the event timing. + * @param bpm The tempo in beats per second. + */ + setTempo(bpm: number): void; +} +export interface HeaderJSON { + name: string; + ppq: number; + meta: MetaEvent[]; + tempos: TempoEvent[]; + timeSignatures: TimeSignatureEvent[]; + keySignatures: KeySignatureEvent[]; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.js new file mode 100644 index 00000000..11c1dc6f --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.js @@ -0,0 +1,256 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Header = exports.keySignatureKeys = void 0; +var BinarySearch_1 = require("./BinarySearch"); +var privatePPQMap = new WeakMap(); +/** + * @hidden + */ +exports.keySignatureKeys = [ + "Cb", + "Gb", + "Db", + "Ab", + "Eb", + "Bb", + "F", + "C", + "G", + "D", + "A", + "E", + "B", + "F#", + "C#", +]; +/** + * The parsed MIDI file header. + */ +var Header = /** @class */ (function () { + function Header(midiData) { + var _this = this; + /** + * The array of all the tempo events. + */ + this.tempos = []; + /** + * The time signatures. + */ + this.timeSignatures = []; + /** + * The time signatures. + */ + this.keySignatures = []; + /** + * Additional meta events. + */ + this.meta = []; + /** + * The name of the MIDI file; + */ + this.name = ""; + // Look through all the tracks for tempo changes. + privatePPQMap.set(this, 480); + if (midiData) { + privatePPQMap.set(this, midiData.header.ticksPerBeat); + // Check time signature and tempo events from all of the tracks. + midiData.tracks.forEach(function (track) { + track.forEach(function (event) { + if (event.meta) { + if (event.type === "timeSignature") { + _this.timeSignatures.push({ + ticks: event.absoluteTime, + timeSignature: [ + event.numerator, + event.denominator, + ], + }); + } + else if (event.type === "setTempo") { + _this.tempos.push({ + bpm: 60000000 / event.microsecondsPerBeat, + ticks: event.absoluteTime, + }); + } + else if (event.type === "keySignature") { + _this.keySignatures.push({ + key: exports.keySignatureKeys[event.key + 7], + scale: event.scale === 0 ? "major" : "minor", + ticks: event.absoluteTime, + }); + } + } + }); + }); + // Check the first track for other relevant data. + var firstTrackCurrentTicks_1 = 0; // Used for absolute times. + midiData.tracks[0].forEach(function (event) { + firstTrackCurrentTicks_1 += event.deltaTime; + if (event.meta) { + if (event.type === "trackName") { + _this.name = event.text; + } + else if (event.type === "text" || + event.type === "cuePoint" || + event.type === "marker" || + event.type === "lyrics") { + _this.meta.push({ + text: event.text, + ticks: firstTrackCurrentTicks_1, + type: event.type, + }); + } + } + }); + this.update(); + } + } + /** + * This must be invoked after any changes are made to the tempo array + * or the timeSignature array for the updated values to be reflected. + */ + Header.prototype.update = function () { + var _this = this; + var currentTime = 0; + var lastEventBeats = 0; + // Make sure it's sorted; + this.tempos.sort(function (a, b) { return a.ticks - b.ticks; }); + this.tempos.forEach(function (event, index) { + var lastBPM = index > 0 ? _this.tempos[index - 1].bpm : _this.tempos[0].bpm; + var beats = event.ticks / _this.ppq - lastEventBeats; + var elapsedSeconds = (60 / lastBPM) * beats; + event.time = elapsedSeconds + currentTime; + currentTime = event.time; + lastEventBeats += beats; + }); + this.timeSignatures.sort(function (a, b) { return a.ticks - b.ticks; }); + this.timeSignatures.forEach(function (event, index) { + var lastEvent = index > 0 + ? _this.timeSignatures[index - 1] + : _this.timeSignatures[0]; + var elapsedBeats = (event.ticks - lastEvent.ticks) / _this.ppq; + var elapsedMeasures = elapsedBeats / + lastEvent.timeSignature[0] / + (lastEvent.timeSignature[1] / 4); + lastEvent.measures = lastEvent.measures || 0; + event.measures = elapsedMeasures + lastEvent.measures; + }); + }; + /** + * Convert ticks into seconds based on the tempo changes. + */ + Header.prototype.ticksToSeconds = function (ticks) { + // Find the relevant position. + var index = (0, BinarySearch_1.search)(this.tempos, ticks); + if (index !== -1) { + var tempo = this.tempos[index]; + var tempoTime = tempo.time; + var elapsedBeats = (ticks - tempo.ticks) / this.ppq; + return tempoTime + (60 / tempo.bpm) * elapsedBeats; + } + else { + // Assume 120. + var beats = ticks / this.ppq; + return (60 / 120) * beats; + } + }; + /** + * Convert ticks into measures based off of the time signatures. + */ + Header.prototype.ticksToMeasures = function (ticks) { + var index = (0, BinarySearch_1.search)(this.timeSignatures, ticks); + if (index !== -1) { + var timeSigEvent = this.timeSignatures[index]; + var elapsedBeats = (ticks - timeSigEvent.ticks) / this.ppq; + return (timeSigEvent.measures + + elapsedBeats / + (timeSigEvent.timeSignature[0] / + timeSigEvent.timeSignature[1]) / + 4); + } + else { + return ticks / this.ppq / 4; + } + }; + Object.defineProperty(Header.prototype, "ppq", { + /** + * The number of ticks per quarter note. + */ + get: function () { + return privatePPQMap.get(this); + }, + enumerable: false, + configurable: true + }); + /** + * Convert seconds to ticks based on the tempo events. + */ + Header.prototype.secondsToTicks = function (seconds) { + // Find the relevant position. + var index = (0, BinarySearch_1.search)(this.tempos, seconds, "time"); + if (index !== -1) { + var tempo = this.tempos[index]; + var tempoTime = tempo.time; + var elapsedTime = seconds - tempoTime; + var elapsedBeats = elapsedTime / (60 / tempo.bpm); + return Math.round(tempo.ticks + elapsedBeats * this.ppq); + } + else { + // Assume 120. + var beats = seconds / (60 / 120); + return Math.round(beats * this.ppq); + } + }; + /** + * Convert the header into an object. + */ + Header.prototype.toJSON = function () { + return { + keySignatures: this.keySignatures, + meta: this.meta, + name: this.name, + ppq: this.ppq, + tempos: this.tempos.map(function (t) { + return { + bpm: t.bpm, + ticks: t.ticks, + }; + }), + timeSignatures: this.timeSignatures, + }; + }; + /** + * Parse a header json object. + */ + Header.prototype.fromJSON = function (json) { + this.name = json.name; + // Clone all the attributes. + this.tempos = json.tempos.map(function (t) { return Object.assign({}, t); }); + this.timeSignatures = json.timeSignatures.map(function (t) { + return Object.assign({}, t); + }); + this.keySignatures = json.keySignatures.map(function (t) { + return Object.assign({}, t); + }); + this.meta = json.meta.map(function (t) { return Object.assign({}, t); }); + privatePPQMap.set(this, json.ppq); + this.update(); + }; + /** + * Update the tempo of the midi to a single tempo. Will remove and replace + * any other tempos currently set and update all of the event timing. + * @param bpm The tempo in beats per second. + */ + Header.prototype.setTempo = function (bpm) { + this.tempos = [ + { + bpm: bpm, + ticks: 0, + }, + ]; + this.update(); + }; + return Header; +}()); +exports.Header = Header; +//# sourceMappingURL=Header.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.js.map new file mode 100644 index 00000000..c4106e57 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Header.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Header.js","sourceRoot":"","sources":["../src/Header.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.d.ts new file mode 100644 index 00000000..96f90ff1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.d.ts @@ -0,0 +1,42 @@ +import type { MidiEvent } from "midi-file"; +import { Track } from "./Track"; +/** + * Describes the MIDI instrument of a track. + */ +export declare class Instrument { + /** + * The instrument number. Defaults to 0. + */ + number: number; + /** + * @param trackData + * @param track + */ + constructor(trackData: MidiEvent[], track: Track); + /** + * The common name of the instrument. + */ + get name(): string; + set name(n: string); + /** + * The instrument family, e.g. "piano". + */ + get family(): string; + /** + * If the instrument is a percussion instrument. + */ + get percussion(): boolean; + /** + * Convert it to JSON form. + */ + toJSON(): InstrumentJSON; + /** + * Convert from JSON form. + */ + fromJSON(json: InstrumentJSON): void; +} +export interface InstrumentJSON { + family: string; + number: number; + name: string; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.js new file mode 100644 index 00000000..fb13b98a --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.js @@ -0,0 +1,98 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Instrument = void 0; +var InstrumentMaps_1 = require("./InstrumentMaps"); +/** + * @hidden + */ +var privateTrackMap = new WeakMap(); +/** + * Describes the MIDI instrument of a track. + */ +var Instrument = /** @class */ (function () { + /** + * @param trackData + * @param track + */ + function Instrument(trackData, track) { + /** + * The instrument number. Defaults to 0. + */ + this.number = 0; + privateTrackMap.set(this, track); + this.number = 0; + if (trackData) { + var programChange = trackData.find(function (e) { return e.type === "programChange"; }); + // Set 'number' from 'programNumber' if exists. + if (programChange) { + this.number = programChange.programNumber; + } + } + } + Object.defineProperty(Instrument.prototype, "name", { + /** + * The common name of the instrument. + */ + get: function () { + if (this.percussion) { + return InstrumentMaps_1.DrumKitByPatchID[this.number]; + } + else { + return InstrumentMaps_1.instrumentByPatchID[this.number]; + } + }, + set: function (n) { + var patchNumber = InstrumentMaps_1.instrumentByPatchID.indexOf(n); + if (patchNumber !== -1) { + this.number = patchNumber; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Instrument.prototype, "family", { + /** + * The instrument family, e.g. "piano". + */ + get: function () { + if (this.percussion) { + return "drums"; + } + else { + return InstrumentMaps_1.InstrumentFamilyByID[Math.floor(this.number / 8)]; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Instrument.prototype, "percussion", { + /** + * If the instrument is a percussion instrument. + */ + get: function () { + var track = privateTrackMap.get(this); + return track.channel === 9; + }, + enumerable: false, + configurable: true + }); + /** + * Convert it to JSON form. + */ + Instrument.prototype.toJSON = function () { + return { + family: this.family, + number: this.number, + name: this.name + }; + }; + /** + * Convert from JSON form. + */ + Instrument.prototype.fromJSON = function (json) { + this.number = json.number; + }; + return Instrument; +}()); +exports.Instrument = Instrument; +//# sourceMappingURL=Instrument.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.js.map new file mode 100644 index 00000000..8c3571ea --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Instrument.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Instrument.js","sourceRoot":"","sources":["../src/Instrument.ts"],"names":[],"mappings":";;;AAKA,mDAA+F;AAG/F;;GAEG;AACH,IAAM,eAAe,GAAG,IAAI,OAAO,EAAqB,CAAC;AAEzD;;GAEG;AACH;IAOC;;;OAGG;IACH,oBAAY,SAAsB,EAAE,KAAY;QAThD;;WAEG;QACH,WAAM,GAAG,CAAC,CAAC;QAOV,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAEhB,IAAI,SAAS,EAAE;YACd,IAAM,aAAa,GAAG,SAAS,CAAC,IAAI,CACnC,UAAA,CAAC,IAAI,OAAA,CAAC,CAAC,IAAI,KAAK,eAAe,EAA1B,CAA0B,CACL,CAAC;YAE5B,+CAA+C;YAC/C,IAAI,aAAa,EAAE;gBAClB,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,aAAa,CAAC;aAC1C;SACD;IACF,CAAC;IAKD,sBAAI,4BAAI;QAHR;;WAEG;aACH;YACC,IAAI,IAAI,CAAC,UAAU,EAAE;gBACpB,OAAO,iCAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACrC;iBAAM;gBACN,OAAO,oCAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACxC;QACF,CAAC;aAED,UAAS,CAAS;YACjB,IAAM,WAAW,GAAG,oCAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACnD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE;gBACvB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;aAC1B;QACF,CAAC;;;OAPA;IAYD,sBAAI,8BAAM;QAHV;;WAEG;aACH;YACC,IAAI,IAAI,CAAC,UAAU,EAAE;gBACpB,OAAO,OAAO,CAAC;aACf;iBAAM;gBACN,OAAO,qCAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;aACzD;QACF,CAAC;;;OAAA;IAKD,sBAAI,kCAAU;QAHd;;WAEG;aACH;YACC,IAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QAC5B,CAAC;;;OAAA;IAED;;OAEG;IACH,2BAAM,GAAN;QACC,OAAO;YACN,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;SACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,6BAAQ,GAAR,UAAS,IAAoB;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,CAAC;IACF,iBAAC;AAAD,CAAC,AAjFD,IAiFC;AAjFY,gCAAU"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.d.ts new file mode 100644 index 00000000..b298e99e --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.d.ts @@ -0,0 +1,13 @@ +export declare const instrumentByPatchID: string[]; +export declare const InstrumentFamilyByID: string[]; +export declare const DrumKitByPatchID: { + 0: string; + 8: string; + 16: string; + 24: string; + 25: string; + 32: string; + 40: string; + 48: string; + 56: string; +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.js new file mode 100644 index 00000000..15ec864b --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.js @@ -0,0 +1,163 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DrumKitByPatchID = exports.InstrumentFamilyByID = exports.instrumentByPatchID = void 0; +exports.instrumentByPatchID = [ + "acoustic grand piano", + "bright acoustic piano", + "electric grand piano", + "honky-tonk piano", + "electric piano 1", + "electric piano 2", + "harpsichord", + "clavi", + "celesta", + "glockenspiel", + "music box", + "vibraphone", + "marimba", + "xylophone", + "tubular bells", + "dulcimer", + "drawbar organ", + "percussive organ", + "rock organ", + "church organ", + "reed organ", + "accordion", + "harmonica", + "tango accordion", + "acoustic guitar (nylon)", + "acoustic guitar (steel)", + "electric guitar (jazz)", + "electric guitar (clean)", + "electric guitar (muted)", + "overdriven guitar", + "distortion guitar", + "guitar harmonics", + "acoustic bass", + "electric bass (finger)", + "electric bass (pick)", + "fretless bass", + "slap bass 1", + "slap bass 2", + "synth bass 1", + "synth bass 2", + "violin", + "viola", + "cello", + "contrabass", + "tremolo strings", + "pizzicato strings", + "orchestral harp", + "timpani", + "string ensemble 1", + "string ensemble 2", + "synthstrings 1", + "synthstrings 2", + "choir aahs", + "voice oohs", + "synth voice", + "orchestra hit", + "trumpet", + "trombone", + "tuba", + "muted trumpet", + "french horn", + "brass section", + "synthbrass 1", + "synthbrass 2", + "soprano sax", + "alto sax", + "tenor sax", + "baritone sax", + "oboe", + "english horn", + "bassoon", + "clarinet", + "piccolo", + "flute", + "recorder", + "pan flute", + "blown bottle", + "shakuhachi", + "whistle", + "ocarina", + "lead 1 (square)", + "lead 2 (sawtooth)", + "lead 3 (calliope)", + "lead 4 (chiff)", + "lead 5 (charang)", + "lead 6 (voice)", + "lead 7 (fifths)", + "lead 8 (bass + lead)", + "pad 1 (new age)", + "pad 2 (warm)", + "pad 3 (polysynth)", + "pad 4 (choir)", + "pad 5 (bowed)", + "pad 6 (metallic)", + "pad 7 (halo)", + "pad 8 (sweep)", + "fx 1 (rain)", + "fx 2 (soundtrack)", + "fx 3 (crystal)", + "fx 4 (atmosphere)", + "fx 5 (brightness)", + "fx 6 (goblins)", + "fx 7 (echoes)", + "fx 8 (sci-fi)", + "sitar", + "banjo", + "shamisen", + "koto", + "kalimba", + "bag pipe", + "fiddle", + "shanai", + "tinkle bell", + "agogo", + "steel drums", + "woodblock", + "taiko drum", + "melodic tom", + "synth drum", + "reverse cymbal", + "guitar fret noise", + "breath noise", + "seashore", + "bird tweet", + "telephone ring", + "helicopter", + "applause", + "gunshot", +]; +exports.InstrumentFamilyByID = [ + "piano", + "chromatic percussion", + "organ", + "guitar", + "bass", + "strings", + "ensemble", + "brass", + "reed", + "pipe", + "synth lead", + "synth pad", + "synth effects", + "world", + "percussive", + "sound effects", +]; +exports.DrumKitByPatchID = { + 0: "standard kit", + 8: "room kit", + 16: "power kit", + 24: "electronic kit", + 25: "tr-808 kit", + 32: "jazz kit", + 40: "brush kit", + 48: "orchestra kit", + 56: "sound fx kit", +}; +//# sourceMappingURL=InstrumentMaps.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.js.map new file mode 100644 index 00000000..baf42154 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/InstrumentMaps.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InstrumentMaps.js","sourceRoot":"","sources":["../src/InstrumentMaps.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG;IAClC,sBAAsB;IACtB,uBAAuB;IACvB,sBAAsB;IACtB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,aAAa;IACb,OAAO;IACP,SAAS;IACT,cAAc;IACd,WAAW;IACX,YAAY;IACZ,SAAS;IACT,WAAW;IACX,eAAe;IACf,UAAU;IACV,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ,cAAc;IACd,YAAY;IACZ,WAAW;IACX,WAAW;IACX,iBAAiB;IACjB,yBAAyB;IACzB,yBAAyB;IACzB,wBAAwB;IACxB,yBAAyB;IACzB,yBAAyB;IACzB,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,eAAe;IACf,wBAAwB;IACxB,sBAAsB;IACtB,eAAe;IACf,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,QAAQ;IACR,OAAO;IACP,OAAO;IACP,YAAY;IACZ,iBAAiB;IACjB,mBAAmB;IACnB,iBAAiB;IACjB,SAAS;IACT,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,gBAAgB;IAChB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,eAAe;IACf,SAAS;IACT,UAAU;IACV,MAAM;IACN,eAAe;IACf,aAAa;IACb,eAAe;IACf,cAAc;IACd,cAAc;IACd,aAAa;IACb,UAAU;IACV,WAAW;IACX,cAAc;IACd,MAAM;IACN,cAAc;IACd,SAAS;IACT,UAAU;IACV,SAAS;IACT,OAAO;IACP,UAAU;IACV,WAAW;IACX,cAAc;IACd,YAAY;IACZ,SAAS;IACT,SAAS;IACT,iBAAiB;IACjB,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,sBAAsB;IACtB,iBAAiB;IACjB,cAAc;IACd,mBAAmB;IACnB,eAAe;IACf,eAAe;IACf,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,aAAa;IACb,mBAAmB;IACnB,gBAAgB;IAChB,mBAAmB;IACnB,mBAAmB;IACnB,gBAAgB;IAChB,eAAe;IACf,eAAe;IACf,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,SAAS;IACT,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,OAAO;IACP,aAAa;IACb,WAAW;IACX,YAAY;IACZ,aAAa;IACb,YAAY;IACZ,gBAAgB;IAChB,mBAAmB;IACnB,cAAc;IACd,UAAU;IACV,YAAY;IACZ,gBAAgB;IAChB,YAAY;IACZ,UAAU;IACV,SAAS;CACT,CAAC;AAEW,QAAA,oBAAoB,GAAG;IACnC,OAAO;IACP,sBAAsB;IACtB,OAAO;IACP,QAAQ;IACR,MAAM;IACN,SAAS;IACT,UAAU;IACV,OAAO;IACP,MAAM;IACN,MAAM;IACN,YAAY;IACZ,WAAW;IACX,eAAe;IACf,OAAO;IACP,YAAY;IACZ,eAAe;CACf,CAAC;AAEW,QAAA,gBAAgB,GAAG;IAC/B,CAAC,EAAE,cAAc;IACjB,CAAC,EAAE,UAAU;IACb,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,gBAAgB;IACpB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,eAAe;IACnB,EAAE,EAAE,cAAc;CAClB,CAAC"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.d.ts new file mode 100644 index 00000000..44adab3d --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.d.ts @@ -0,0 +1,68 @@ +import { Header, HeaderJSON } from "./Header"; +import { Track, TrackJSON } from "./Track"; +/** + * The main midi parsing class. + */ +export declare class Midi { + /** + * Download and parse the MIDI file. Returns a promise + * which resolves to the generated MIDI file. + * @param url The URL to fetch. + */ + static fromUrl(url: string): Promise; + /** + * The header information, includes things like tempo and meta events. + */ + header: Header; + /** + * The midi tracks. + */ + tracks: Track[]; + /** + * Parse the midi data + */ + constructor(midiArray?: (ArrayLike | ArrayBuffer)); + /** + * The name of the midi file, taken from the first track. + */ + get name(): string; + set name(n: string); + /** + * The total length of the file in seconds. + */ + get duration(): number; + /** + * The total length of the file in ticks. + */ + get durationTicks(): number; + /** + * Add a track to the MIDI file. + */ + addTrack(): Track; + /** + * Encode the MIDI as a Uint8Array. + */ + toArray(): Uint8Array; + /** + * Convert the MIDI object to JSON. + */ + toJSON(): MidiJSON; + /** + * Parse a JSON representation of the object. Will overwrite the current + * tracks and header. + */ + fromJSON(json: MidiJSON): void; + /** + * Clone the entire object MIDI object. + */ + clone(): Midi; +} +/** + * The MIDI data in JSON format. + */ +export interface MidiJSON { + header: HeaderJSON; + tracks: TrackJSON[]; +} +export { TrackJSON, Track } from "./Track"; +export { HeaderJSON, Header } from "./Header"; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.js new file mode 100644 index 00000000..cd3a375b --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.js @@ -0,0 +1,240 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Header = exports.Track = exports.Midi = void 0; +var midi_file_1 = require("midi-file"); +var Header_1 = require("./Header"); +var Track_1 = require("./Track"); +var Encode_1 = require("./Encode"); +/** + * The main midi parsing class. + */ +var Midi = /** @class */ (function () { + /** + * Parse the midi data + */ + function Midi(midiArray) { + var _this = this; + // Parse the MIDI data if there is any. + var midiData = null; + if (midiArray) { + // Transform midiArray to ArrayLike + // only if it's an ArrayBuffer. + var midiArrayLike = midiArray instanceof ArrayBuffer + ? new Uint8Array(midiArray) + : midiArray; + // Parse MIDI data. + midiData = (0, midi_file_1.parseMidi)(midiArrayLike); + // Add the absolute times to each of the tracks. + midiData.tracks.forEach(function (track) { + var currentTicks = 0; + track.forEach(function (event) { + currentTicks += event.deltaTime; + event.absoluteTime = currentTicks; + }); + }); + // Ensure at most one instrument per track. + midiData.tracks = splitTracks(midiData.tracks); + } + this.header = new Header_1.Header(midiData); + this.tracks = []; + // Parse MIDI data. + if (midiArray) { + // Format 0, everything is on the same track. + this.tracks = midiData.tracks.map(function (trackData) { return new Track_1.Track(trackData, _this.header); }); + // If it's format 1 and there are no notes on the first track, remove it. + if (midiData.header.format === 1 && this.tracks[0].duration === 0) { + this.tracks.shift(); + } + } + } + /** + * Download and parse the MIDI file. Returns a promise + * which resolves to the generated MIDI file. + * @param url The URL to fetch. + */ + Midi.fromUrl = function (url) { + return __awaiter(this, void 0, void 0, function () { + var response, arrayBuffer; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, fetch(url)]; + case 1: + response = _a.sent(); + if (!response.ok) return [3 /*break*/, 3]; + return [4 /*yield*/, response.arrayBuffer()]; + case 2: + arrayBuffer = _a.sent(); + return [2 /*return*/, new Midi(arrayBuffer)]; + case 3: throw new Error("Could not load '".concat(url, "'")); + } + }); + }); + }; + Object.defineProperty(Midi.prototype, "name", { + /** + * The name of the midi file, taken from the first track. + */ + get: function () { + return this.header.name; + }, + set: function (n) { + this.header.name = n; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Midi.prototype, "duration", { + /** + * The total length of the file in seconds. + */ + get: function () { + // Get the max of the last note of all the tracks. + var durations = this.tracks.map(function (t) { return t.duration; }); + return Math.max.apply(Math, durations); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Midi.prototype, "durationTicks", { + /** + * The total length of the file in ticks. + */ + get: function () { + // Get the max of the last note of all the tracks. + var durationTicks = this.tracks.map(function (t) { return t.durationTicks; }); + return Math.max.apply(Math, durationTicks); + }, + enumerable: false, + configurable: true + }); + /** + * Add a track to the MIDI file. + */ + Midi.prototype.addTrack = function () { + var track = new Track_1.Track(undefined, this.header); + this.tracks.push(track); + return track; + }; + /** + * Encode the MIDI as a Uint8Array. + */ + Midi.prototype.toArray = function () { + return (0, Encode_1.encode)(this); + }; + /** + * Convert the MIDI object to JSON. + */ + Midi.prototype.toJSON = function () { + return { + header: this.header.toJSON(), + tracks: this.tracks.map(function (track) { return track.toJSON(); }), + }; + }; + /** + * Parse a JSON representation of the object. Will overwrite the current + * tracks and header. + */ + Midi.prototype.fromJSON = function (json) { + var _this = this; + this.header = new Header_1.Header(); + this.header.fromJSON(json.header); + this.tracks = json.tracks.map(function (trackJSON) { + var track = new Track_1.Track(undefined, _this.header); + track.fromJSON(trackJSON); + return track; + }); + }; + /** + * Clone the entire object MIDI object. + */ + Midi.prototype.clone = function () { + var midi = new Midi(); + midi.fromJSON(this.toJSON()); + return midi; + }; + return Midi; +}()); +exports.Midi = Midi; +var Track_2 = require("./Track"); +Object.defineProperty(exports, "Track", { enumerable: true, get: function () { return Track_2.Track; } }); +var Header_2 = require("./Header"); +Object.defineProperty(exports, "Header", { enumerable: true, get: function () { return Header_2.Header; } }); +/** + * Given a list of MIDI tracks, make sure that each channel corresponds to at + * most one channel and at most one instrument. This means splitting up tracks + * that contain more than one channel or instrument. + */ +function splitTracks(tracks) { + var newTracks = []; + for (var i = 0; i < tracks.length; i++) { + var defaultTrack = newTracks.length; + // a map from [program, channel] tuples to new track numbers + var trackMap = new Map(); + // a map from channel numbers to current program numbers + var currentProgram = Array(16).fill(0); + for (var _i = 0, _a = tracks[i]; _i < _a.length; _i++) { + var event_1 = _a[_i]; + var targetTrack = defaultTrack; + // If the event has a channel, we need to find that channel's current + // program number and the appropriate track for this [program, channel] + // pair. + var channel = event_1.channel; + if (channel !== undefined) { + if (event_1.type === "programChange") { + currentProgram[channel] = event_1.programNumber; + } + var program = currentProgram[channel]; + var trackKey = "".concat(program, " ").concat(channel); + if (trackMap.has(trackKey)) { + targetTrack = trackMap.get(trackKey); + } + else { + targetTrack = defaultTrack + trackMap.size; + trackMap.set(trackKey, targetTrack); + } + } + if (!newTracks[targetTrack]) { + newTracks.push([]); + } + newTracks[targetTrack].push(event_1); + } + } + return newTracks; +} +//# sourceMappingURL=Midi.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.js.map new file mode 100644 index 00000000..c3635885 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Midi.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Midi.js","sourceRoot":"","sources":["../src/Midi.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.d.ts new file mode 100644 index 00000000..6d7b4614 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.d.ts @@ -0,0 +1,113 @@ +import { Header } from "./Header"; +/** + * A Note consists of a `noteOn` and `noteOff` event. + */ +export declare class Note implements NoteInterface { + /** + * The notes MIDI value. + */ + midi: number; + /** + * The normalized velocity (0-1). + */ + velocity: number; + /** + * The velocity of the note off. + */ + noteOffVelocity: number; + /** + * The start time in ticks. + */ + ticks: number; + /** + * The duration in ticks. + */ + durationTicks: number; + constructor(noteOn: NoteOnEvent, noteOff: NoteOffEvent, header: Header); + /** + * The note name and octave in scientific pitch notation, e.g. "C4". + */ + get name(): string; + set name(n: string); + /** + * The notes octave number. + */ + get octave(): number; + set octave(o: number); + /** + * The pitch class name. e.g. "A". + */ + get pitch(): string; + set pitch(p: string); + /** + * The duration of the segment in seconds. + */ + get duration(): number; + set duration(d: number); + /** + * The time of the event in seconds. + */ + get time(): number; + set time(t: number); + /** + * The number of measures (and partial measures) to this beat. + * Takes into account time signature changes. + * @readonly + */ + get bars(): number; + toJSON(): NoteJSON; +} +export interface NoteJSON { + time: number; + midi: number; + name: string; + velocity: number; + duration: number; + ticks: number; + durationTicks: number; +} +export interface NoteOnEvent { + ticks: number; + velocity: number; + midi: number; +} +export interface NoteOffEvent { + ticks: number; + velocity: number; +} +export interface NoteInterface { + time: number; + ticks: number; + duration: number; + durationTicks: number; + midi: number; + pitch: string; + octave: number; + name: string; + noteOffVelocity: number; + velocity: number; +} +declare type PitchDescription = { + name: string; +} | { + pitch: string; + octave: number; +} | { + midi: number; +}; +declare type VelocityDescription = { + velocity?: number; + noteOffVelocity?: number; +}; +declare type TimeDescription = { + time: number; + duration?: number; +} | { + ticks: number; + durationTicks?: number; +}; +/** + * @hidden + */ +export declare type NoteConstructorInterface = PitchDescription & VelocityDescription & TimeDescription; +export {}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.js new file mode 100644 index 00000000..60aaedaa --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.js @@ -0,0 +1,161 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Note = void 0; +/** + * Convert a MIDI note into a pitch. + */ +function midiToPitch(midi) { + var octave = Math.floor(midi / 12) - 1; + return midiToPitchClass(midi) + octave.toString(); +} +/** + * Convert a MIDI note to a pitch class (just the pitch no octave). + */ +function midiToPitchClass(midi) { + var scaleIndexToNote = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; + var note = midi % 12; + return scaleIndexToNote[note]; +} +/** + * Convert a pitch class to a MIDI note. + */ +function pitchClassToMidi(pitch) { + var scaleIndexToNote = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; + return scaleIndexToNote.indexOf(pitch); +} +/** + * Convert a pitch to a MIDI number. + */ +// tslint:disable-next-line: only-arrow-functions typedef +var pitchToMidi = (function () { + var regexp = /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i; + var noteToScaleIndex = { + // tslint:disable-next-line: object-literal-sort-keys + cbb: -2, cb: -1, c: 0, "c#": 1, cx: 2, + dbb: 0, db: 1, d: 2, "d#": 3, dx: 4, + ebb: 2, eb: 3, e: 4, "e#": 5, ex: 6, + fbb: 3, fb: 4, f: 5, "f#": 6, fx: 7, + gbb: 5, gb: 6, g: 7, "g#": 8, gx: 9, + abb: 7, ab: 8, a: 9, "a#": 10, ax: 11, + bbb: 9, bb: 10, b: 11, "b#": 12, bx: 13, + }; + return function (note) { + var split = regexp.exec(note); + var pitch = split[1]; + var octave = split[2]; + var index = noteToScaleIndex[pitch.toLowerCase()]; + return index + (parseInt(octave, 10) + 1) * 12; + }; +}()); +var privateHeaderMap = new WeakMap(); +/** + * A Note consists of a `noteOn` and `noteOff` event. + */ +var Note = /** @class */ (function () { + function Note(noteOn, noteOff, header) { + privateHeaderMap.set(this, header); + this.midi = noteOn.midi; + this.velocity = noteOn.velocity; + this.noteOffVelocity = noteOff.velocity; + this.ticks = noteOn.ticks; + this.durationTicks = noteOff.ticks - noteOn.ticks; + } + Object.defineProperty(Note.prototype, "name", { + /** + * The note name and octave in scientific pitch notation, e.g. "C4". + */ + get: function () { + return midiToPitch(this.midi); + }, + set: function (n) { + this.midi = pitchToMidi(n); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Note.prototype, "octave", { + /** + * The notes octave number. + */ + get: function () { + return Math.floor(this.midi / 12) - 1; + }, + set: function (o) { + var diff = o - this.octave; + this.midi += diff * 12; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Note.prototype, "pitch", { + /** + * The pitch class name. e.g. "A". + */ + get: function () { + return midiToPitchClass(this.midi); + }, + set: function (p) { + this.midi = 12 * (this.octave + 1) + pitchClassToMidi(p); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Note.prototype, "duration", { + /** + * The duration of the segment in seconds. + */ + get: function () { + var header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks + this.durationTicks) - header.ticksToSeconds(this.ticks); + }, + set: function (d) { + var header = privateHeaderMap.get(this); + var noteEndTicks = header.secondsToTicks(this.time + d); + this.durationTicks = noteEndTicks - this.ticks; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Note.prototype, "time", { + /** + * The time of the event in seconds. + */ + get: function () { + var header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks); + }, + set: function (t) { + var header = privateHeaderMap.get(this); + this.ticks = header.secondsToTicks(t); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Note.prototype, "bars", { + /** + * The number of measures (and partial measures) to this beat. + * Takes into account time signature changes. + * @readonly + */ + get: function () { + var header = privateHeaderMap.get(this); + return header.ticksToMeasures(this.ticks); + }, + enumerable: false, + configurable: true + }); + Note.prototype.toJSON = function () { + return { + duration: this.duration, + durationTicks: this.durationTicks, + midi: this.midi, + name: this.name, + ticks: this.ticks, + time: this.time, + velocity: this.velocity, + }; + }; + return Note; +}()); +exports.Note = Note; +//# sourceMappingURL=Note.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.js.map new file mode 100644 index 00000000..67b1e7c8 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Note.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Note.js","sourceRoot":"","sources":["../src/Note.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAChC,IAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACzC,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACrC,IAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3F,IAAM,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;IACvB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACtC,IAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3F,OAAO,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,yDAAyD;AACzD,IAAM,WAAW,GAA6B,CAAC;IAC9C,IAAM,MAAM,GAAG,qCAAqC,CAAC;IACrD,IAAM,gBAAgB,GAAG;QACxB,qDAAqD;QACrD,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACrC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACnC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACnC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACnC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACnC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACrC,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;KACvC,CAAC;IAEF,OAAO,UAAC,IAAI;QACX,IAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,IAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,IAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACpD,OAAO,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,CAAC,CAAC;AACH,CAAC,EAAE,CAAC,CAAC;AAEL,IAAM,gBAAgB,GAAG,IAAI,OAAO,EAAgB,CAAC;AAErD;;GAEG;AACH;IA2BC,cAAY,MAAmB,EAAE,OAAqB,EAAE,MAAc;QACrE,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAExB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEhC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;QAExC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAE1B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACnD,CAAC;IAKD,sBAAI,sBAAI;QAHR;;WAEG;aACH;YACC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;aAED,UAAS,CAAS;YACjB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;;;OAJA;IASD,sBAAI,wBAAM;QAHV;;WAEG;aACH;YACC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;aAED,UAAW,CAAS;YACnB,IAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QACxB,CAAC;;;OALA;IAUD,sBAAI,uBAAK;QAHT;;WAEG;aACH;YACC,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;aAED,UAAU,CAAS;YAClB,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;;;OAJA;IASD,sBAAI,0BAAQ;QAHZ;;WAEG;aACH;YACC,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnG,CAAC;aAED,UAAa,CAAS;YACrB,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAM,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,aAAa,GAAG,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC;QAChD,CAAC;;;OANA;IAWD,sBAAI,sBAAI;QAHR;;WAEG;aACH;YACC,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAED,UAAS,CAAS;YACjB,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;;;OALA;IAYD,sBAAI,sBAAI;QALR;;;;WAIG;aACH;YACC,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;;;OAAA;IAED,qBAAM,GAAN;QACC,OAAO;YACN,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACvB,CAAC;IACH,CAAC;IACF,WAAC;AAAD,CAAC,AA3HD,IA2HC;AA3HY,oBAAI"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.d.ts new file mode 100644 index 00000000..ebfd4143 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.d.ts @@ -0,0 +1,38 @@ +import { Header } from "./Header"; +import { MidiPitchBendEvent } from "midi-file"; +/** + * Represents a pitch bend event. + */ +export declare class PitchBend implements PitchBendInterface { + /** + * The pitch value from... + */ + value: number; + /** + * The tick time of the event. + */ + ticks: number; + /** + * @param event + * @param header + */ + constructor(event: Partial, header: Header); + /** + * The time of the event in seconds + */ + get time(): number; + set time(t: number); + toJSON(): PitchBendJSON; +} +export interface PitchBendJSON { + ticks: number; + time: number; + value: number; +} +export interface PitchBendInterface { + ticks: number; + time: number; + value: number; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.js new file mode 100644 index 00000000..995a643c --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PitchBend = void 0; +var privateHeaderMap = new WeakMap(); +/** + * Represents a pitch bend event. + */ +var PitchBend = /** @class */ (function () { + /** + * @param event + * @param header + */ + function PitchBend(event, header) { + privateHeaderMap.set(this, header); + this.ticks = event.absoluteTime; + this.value = event.value; + } + Object.defineProperty(PitchBend.prototype, "time", { + /** + * The time of the event in seconds + */ + get: function () { + var header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks); + }, + set: function (t) { + var header = privateHeaderMap.get(this); + this.ticks = header.secondsToTicks(t); + }, + enumerable: false, + configurable: true + }); + PitchBend.prototype.toJSON = function () { + return { + ticks: this.ticks, + time: this.time, + value: this.value, + }; + }; + return PitchBend; +}()); +exports.PitchBend = PitchBend; +//# sourceMappingURL=PitchBend.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.js.map new file mode 100644 index 00000000..ae80f3fb --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/PitchBend.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PitchBend.js","sourceRoot":"","sources":["../src/PitchBend.ts"],"names":[],"mappings":";;;AAGA,IAAM,gBAAgB,GAAG,IAAI,OAAO,EAAqB,CAAC;AAE1D;;GAEG;AACH;IAYC;;;OAGG;IACH,mBAAY,KAA8D,EAAE,MAAc;QACzF,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAKD,sBAAI,2BAAI;QAHR;;WAEG;aACH;YACC,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAED,UAAS,CAAS;YACjB,IAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;;;OALA;IAOD,0BAAM,GAAN;QACC,OAAO;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SACjB,CAAC;IACH,CAAC;IACF,gBAAC;AAAD,CAAC,AA3CD,IA2CC;AA3CY,8BAAS"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.d.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.d.ts new file mode 100644 index 00000000..27de2adf --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.d.ts @@ -0,0 +1,81 @@ +import type { MidiEvent } from "midi-file"; +import { ControlChangeInterface } from "./ControlChange"; +import { ControlChangesJSON } from "./ControlChanges"; +import { PitchBend, PitchBendInterface, PitchBendJSON } from "./PitchBend"; +import { Header } from "./Header"; +import { Instrument, InstrumentJSON } from "./Instrument"; +import { Note, NoteConstructorInterface, NoteJSON } from "./Note"; +/** + * A Track is a collection of 'notes' and 'controlChanges'. + */ +export declare class Track { + /** + * The name of the track. + */ + name: string; + /** + * The instrument associated with the track. + */ + instrument: Instrument; + /** + * The track's note events. + */ + notes: Note[]; + /** + * The channel number of the track. Applies this channel + * to all events associated with the channel. + */ + channel: number; + /** + * The control change events. + */ + controlChanges: import("./ControlChanges").ControlChanges; + /** + * The end of track event (if it exists) in ticks. + */ + endOfTrackTicks?: number; + /** + * The pitch bend events. + */ + pitchBends: PitchBend[]; + constructor(trackData: MidiEvent[], header: Header); + /** + * Add a note to the notes array. + * @param props The note properties to add. + */ + addNote(props: NoteConstructorInterface): this; + /** + * Add a control change to the track. + * @param props + */ + addCC(props: Omit | Omit): this; + /** + * Add a control change to the track. + */ + addPitchBend(props: Omit | Omit): this; + /** + * The end time of the last event in the track. + */ + get duration(): number; + /** + * The end time of the last event in the track in ticks. + */ + get durationTicks(): number; + /** + * Assign the JSON values to this track. + */ + fromJSON(json: TrackJSON): void; + /** + * Convert the track into a JSON format. + */ + toJSON(): TrackJSON; +} +export interface TrackJSON { + name: string; + notes: NoteJSON[]; + channel: number; + instrument: InstrumentJSON; + controlChanges: ControlChangesJSON; + pitchBends: PitchBendJSON[]; + endOfTrackTicks?: number; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.js b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.js new file mode 100644 index 00000000..a95c8fd1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.js @@ -0,0 +1,244 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Track = void 0; +var BinarySearch_1 = require("./BinarySearch"); +var ControlChange_1 = require("./ControlChange"); +var ControlChanges_1 = require("./ControlChanges"); +var PitchBend_1 = require("./PitchBend"); +var Instrument_1 = require("./Instrument"); +var Note_1 = require("./Note"); +var privateHeaderMap = new WeakMap(); +/** + * A Track is a collection of 'notes' and 'controlChanges'. + */ +var Track = /** @class */ (function () { + function Track(trackData, header) { + var _this = this; + /** + * The name of the track. + */ + this.name = ""; + /** + * The track's note events. + */ + this.notes = []; + /** + * The control change events. + */ + this.controlChanges = (0, ControlChanges_1.createControlChanges)(); + /** + * The pitch bend events. + */ + this.pitchBends = []; + privateHeaderMap.set(this, header); + if (trackData) { + // Get the name of the track. + var nameEvent = trackData.find(function (e) { return e.type === "trackName"; }); + // Set empty name if 'trackName' event isn't found. + this.name = nameEvent ? nameEvent.text : ""; + } + this.instrument = new Instrument_1.Instrument(trackData, this); + // Defaults to 0. + this.channel = 0; + if (trackData) { + var noteOns = trackData.filter(function (event) { return event.type === "noteOn"; }); + var noteOffs = trackData.filter(function (event) { return event.type === "noteOff"; }); + var _loop_1 = function () { + var currentNote = noteOns.shift(); + // Set the channel based on the note. + this_1.channel = currentNote.channel; + // Find the corresponding note off. + var offIndex = noteOffs.findIndex(function (note) { + return note.noteNumber === currentNote.noteNumber && + note.absoluteTime >= currentNote.absoluteTime; + }); + if (offIndex !== -1) { + // Once it's got the note off, add it. + var noteOff = noteOffs.splice(offIndex, 1)[0]; + this_1.addNote({ + durationTicks: noteOff.absoluteTime - currentNote.absoluteTime, + midi: currentNote.noteNumber, + noteOffVelocity: noteOff.velocity / 127, + ticks: currentNote.absoluteTime, + velocity: currentNote.velocity / 127, + }); + } + }; + var this_1 = this; + while (noteOns.length) { + _loop_1(); + } + var controlChanges = trackData.filter(function (event) { return event.type === "controller"; }); + controlChanges.forEach(function (event) { + _this.addCC({ + number: event.controllerType, + ticks: event.absoluteTime, + value: event.value / 127, + }); + }); + var pitchBends = trackData.filter(function (event) { return event.type === "pitchBend"; }); + pitchBends.forEach(function (event) { + _this.addPitchBend({ + ticks: event.absoluteTime, + // Scale the value between -2^13 to 2^13 to -2 to 2. + value: event.value / Math.pow(2, 13), + }); + }); + var endOfTrackEvent = trackData.find(function (event) { + return event.type === "endOfTrack"; + }); + this.endOfTrackTicks = + endOfTrackEvent !== undefined + ? endOfTrackEvent.absoluteTime + : undefined; + } + } + /** + * Add a note to the notes array. + * @param props The note properties to add. + */ + Track.prototype.addNote = function (props) { + var header = privateHeaderMap.get(this); + var note = new Note_1.Note({ + midi: 0, + ticks: 0, + velocity: 1, + }, { + ticks: 0, + velocity: 0, + }, header); + Object.assign(note, props); + (0, BinarySearch_1.insert)(this.notes, note, "ticks"); + return this; + }; + /** + * Add a control change to the track. + * @param props + */ + Track.prototype.addCC = function (props) { + var header = privateHeaderMap.get(this); + var cc = new ControlChange_1.ControlChange({ + controllerType: props.number, + }, header); + delete props.number; + Object.assign(cc, props); + if (!Array.isArray(this.controlChanges[cc.number])) { + this.controlChanges[cc.number] = []; + } + (0, BinarySearch_1.insert)(this.controlChanges[cc.number], cc, "ticks"); + return this; + }; + /** + * Add a control change to the track. + */ + Track.prototype.addPitchBend = function (props) { + var header = privateHeaderMap.get(this); + var pb = new PitchBend_1.PitchBend({}, header); + Object.assign(pb, props); + (0, BinarySearch_1.insert)(this.pitchBends, pb, "ticks"); + return this; + }; + Object.defineProperty(Track.prototype, "duration", { + /** + * The end time of the last event in the track. + */ + get: function () { + if (!this.notes.length) { + return 0; + } + var maxDuration = this.notes[this.notes.length - 1].time + + this.notes[this.notes.length - 1].duration; + for (var i = 0; i < this.notes.length - 1; i++) { + var duration = this.notes[i].time + this.notes[i].duration; + if (maxDuration < duration) { + maxDuration = duration; + } + } + return maxDuration; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Track.prototype, "durationTicks", { + /** + * The end time of the last event in the track in ticks. + */ + get: function () { + if (!this.notes.length) { + return 0; + } + var maxDuration = this.notes[this.notes.length - 1].ticks + + this.notes[this.notes.length - 1].durationTicks; + for (var i = 0; i < this.notes.length - 1; i++) { + var duration = this.notes[i].ticks + this.notes[i].durationTicks; + if (maxDuration < duration) { + maxDuration = duration; + } + } + return maxDuration; + }, + enumerable: false, + configurable: true + }); + /** + * Assign the JSON values to this track. + */ + Track.prototype.fromJSON = function (json) { + var _this = this; + this.name = json.name; + this.channel = json.channel; + this.instrument = new Instrument_1.Instrument(undefined, this); + this.instrument.fromJSON(json.instrument); + if (json.endOfTrackTicks !== undefined) { + this.endOfTrackTicks = json.endOfTrackTicks; + } + for (var number in json.controlChanges) { + if (json.controlChanges[number]) { + json.controlChanges[number].forEach(function (cc) { + _this.addCC({ + number: cc.number, + ticks: cc.ticks, + value: cc.value, + }); + }); + } + } + json.notes.forEach(function (n) { + _this.addNote({ + durationTicks: n.durationTicks, + midi: n.midi, + ticks: n.ticks, + velocity: n.velocity, + }); + }); + }; + /** + * Convert the track into a JSON format. + */ + Track.prototype.toJSON = function () { + // Convert all the CCs to JSON. + var controlChanges = {}; + for (var i = 0; i < 127; i++) { + if (this.controlChanges.hasOwnProperty(i)) { + controlChanges[i] = this.controlChanges[i].map(function (c) { + return c.toJSON(); + }); + } + } + var json = { + channel: this.channel, + controlChanges: controlChanges, + pitchBends: this.pitchBends.map(function (pb) { return pb.toJSON(); }), + instrument: this.instrument.toJSON(), + name: this.name, + notes: this.notes.map(function (n) { return n.toJSON(); }), + }; + if (this.endOfTrackTicks !== undefined) { + json.endOfTrackTicks = this.endOfTrackTicks; + } + return json; + }; + return Track; +}()); +exports.Track = Track; +//# sourceMappingURL=Track.js.map \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.js.map b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.js.map new file mode 100644 index 00000000..c42c9a69 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/dist/Track.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Track.js","sourceRoot":"","sources":["../src/Track.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/package.json b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/package.json new file mode 100644 index 00000000..6824d5b0 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/package.json @@ -0,0 +1,91 @@ +{ + "name": "@tonejs/midi", + "version": "2.0.28", + "description": "Convert binary midi into JSON", + "main": "build/Midi.js", + "module": "dist/Midi.js", + "jsnext:main": "dist/Midi.js", + "types": "dist/Midi.d.ts", + "scripts": { + "build": "tsc && webpack --mode=production", + "codecov": "nyc report --reporter=text-lcov > coverage.lcov && codecov", + "docs": "typedoc", + "increment": "node scripts/increment_version.js", + "lint": "eslint --ext ts ./src", + "lint:fix": "npm run lint -- --fix", + "watch": "webpack -w --mode=development", + "test": "nyc mocha --timeout=10000 --require ts-node/register ./test/*.ts" + }, + "files": [ + "build", + "dist", + "src", + "LICENSE.md", + "README.md" + ], + "repository": { + "type": "git", + "url": "https://github.com/Tonejs/Midi.git" + }, + "author": "Yotam Mann", + "license": "MIT", + "bugs": { + "url": "https://github.com/Tonejs/Midi/issues" + }, + "homepage": "https://tonejs.github.com/Midi/", + "devDependencies": { + "@babel/core": "^7.2.2", + "@babel/polyfill": "^7.2.5", + "@babel/preset-env": "^7.3.1", + "@babel/register": "^7.9.0", + "@types/chai": "^4.1.7", + "@types/mocha": "^8.0.1", + "@types/node": "^14.18.9", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", + "chai": "^4.2.0", + "codecov": "^3.2.0", + "eslint": "^8.7.0", + "glob": "^7.2.0", + "http-server": "^14.1.0", + "mocha": "^8.1.0", + "node-fetch": "^2.6.7", + "nyc": "^15.1.0", + "semver": "^5.6.0", + "source-map-support": "^0.5.12", + "ts-loader": "^9.2.6", + "ts-node": "^10.4.0", + "typedoc": "^0.22.11", + "typescript": "^4.5.4", + "webpack": "^5.66.0", + "webpack-cli": "^4.9.1" + }, + "dependencies": { + "array-flatten": "^3.0.0", + "midi-file": "^1.2.2" + }, + "nyc": { + "include": [ + "src/**/*.ts" + ], + "extension": [ + ".ts" + ], + "require": [ + "ts-node/register" + ], + "reporter": [ + "lcov", + "html" + ], + "sourceMap": true, + "instrument": true + }, + "prettier": { + "trailingComma": "es5", + "tabWidth": 4, + "semi": true, + "useTabs": true, + "singleQuote": false + } +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/BinarySearch.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/BinarySearch.ts new file mode 100644 index 00000000..1a51f974 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/BinarySearch.ts @@ -0,0 +1,51 @@ +/** + * Return the index of the element at or before the given property + * @hidden + */ +export function search(array: any[], value: any, prop = "ticks"): number { + let beginning = 0; + const len = array.length; + let end = len; + if (len > 0 && array[len - 1][prop] <= value) { + return len - 1; + } + while (beginning < end) { + // calculate the midpoint for roughly equal partition + let midPoint = Math.floor(beginning + (end - beginning) / 2); + const event = array[midPoint]; + const nextEvent = array[midPoint + 1]; + if (event[prop] === value) { + // choose the last one that has the same value + for (let i = midPoint; i < array.length; i++) { + const testEvent = array[i]; + if (testEvent[prop] === value) { + midPoint = i; + } + } + return midPoint; + } else if (event[prop] < value && nextEvent[prop] > value) { + return midPoint; + } else if (event[prop] > value) { + // search lower + end = midPoint; + } else if (event[prop] < value) { + // search upper + beginning = midPoint + 1; + } + } + return -1; +} + +/** + * Does a binary search to insert the note + * in the correct spot in the array + * @hidden + */ +export function insert(array: any[], event: object, prop = "ticks"): void { + if (array.length) { + const index = search(array, event[prop], prop); + array.splice(index + 1, 0, event); + } else { + array.push(event); + } +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/ControlChange.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/ControlChange.ts new file mode 100644 index 00000000..dfbeeca1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/ControlChange.ts @@ -0,0 +1,137 @@ +import type { MidiControllerEvent } from "midi-file"; +import { Header } from "./Header"; + +/** + * @hidden + */ +export type ControlChangeName = + | "modulationWheel" + | "breath" + | "footController" + | "portamentoTime" + | "volume" + | "balance" + | "pan" + | "sustain" + | "portamentoTime" + | "sostenuto" + | "softPedal" + | "legatoFootswitch" + | "portamentoControl"; + +interface ControlChangeMap { + [key: number]: ControlChangeName; +} +/** + * A map of values to control change names + * @hidden + */ +export const controlChangeNames: ControlChangeMap = { + 1: "modulationWheel", + 2: "breath", + 4: "footController", + 5: "portamentoTime", + 7: "volume", + 8: "balance", + 10: "pan", + 64: "sustain", + 65: "portamentoTime", + 66: "sostenuto", + 67: "softPedal", + 68: "legatoFootswitch", + 84: "portamentoControl", +}; + +/** + * swap the keys and values + * @hidden + */ +export const controlChangeIds = Object.keys(controlChangeNames).reduce((obj, key) => { + obj[controlChangeNames[key]] = key; + return obj; +}, {}); + +const privateHeaderMap = new WeakMap(); +const privateCCNumberMap = new WeakMap(); + +/** + * Represents a control change event + */ +export class ControlChange implements ControlChangeInterface { + + /** + * The number value of the event + */ + value: number; + + /** + * The tick time of the event + */ + ticks: number; + + /** + * @param event + * @param header + */ + constructor(event: Partial, header: Header) { + privateHeaderMap.set(this, header); + privateCCNumberMap.set(this, event.controllerType); + + this.ticks = event.absoluteTime; + this.value = event.value; + } + + /** + * The controller number + */ + get number(): number { + return privateCCNumberMap.get(this); + } + + /** + * return the common name of the control number if it exists + */ + get name(): ControlChangeName { + if (controlChangeNames[this.number]) { + return controlChangeNames[this.number]; + } else { + return null; + } + } + + /** + * The time of the event in seconds + */ + get time(): number { + const header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks); + } + + set time(t: number) { + const header = privateHeaderMap.get(this); + this.ticks = header.secondsToTicks(t); + } + + toJSON(): ControlChangeJSON { + return { + number: this.number, + ticks: this.ticks, + time: this.time, + value: this.value, + }; + } +} + +export interface ControlChangeJSON { + number: number; + ticks: number; + time: number; + value: number; +} + +export interface ControlChangeInterface { + number: number; + ticks: number; + time: number; + value: number; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/ControlChanges.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/ControlChanges.ts new file mode 100644 index 00000000..1c5bcfe1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/ControlChanges.ts @@ -0,0 +1,38 @@ +import { controlChangeIds } from "./ControlChange"; +import { ControlChange, ControlChangeJSON } from "./ControlChange"; + +export interface ControlChanges { + [key: string]: ControlChange[]; + [key: number]: ControlChange[]; +} + +export interface ControlChangesJSON { + [key: string]: ControlChangeJSON[]; + [key: number]: ControlChangeJSON[]; +} + +/** + * Automatically creates an alias for named control values using Proxies + * @hidden + */ +export function createControlChanges(): ControlChanges { + return new Proxy({}, { + // tslint:disable-next-line: typedef + get(target, handler) { + if (target[handler]) { + return target[handler]; + } else if (controlChangeIds.hasOwnProperty(handler)) { + return target[controlChangeIds[handler]]; + } + }, + // tslint:disable-next-line: typedef + set(target, handler, value) { + if (controlChangeIds.hasOwnProperty(handler)) { + target[controlChangeIds[handler]] = value; + } else { + target[handler] = value; + } + return true; + }, + }); +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Encode.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Encode.ts new file mode 100644 index 00000000..1ff21226 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Encode.ts @@ -0,0 +1,233 @@ +import { writeMidi } from "midi-file"; + +import type { + MidiControllerEvent, MidiData, MidiEndOfTrackEvent, + MidiEvent, MidiKeySignatureEvent, + MidiNoteOffEvent, MidiNoteOnEvent, MidiPitchBendEvent, + MidiProgramChangeEvent, MidiSetTempoEvent, MidiTextEvent, + MidiTimeSignatureEvent, MidiTrackNameEvent +} from "midi-file"; + +import { KeySignatureEvent, keySignatureKeys, MetaEvent, TempoEvent, TimeSignatureEvent } from "./Header"; +import { ControlChange } from "./ControlChange"; +import { PitchBend } from "./PitchBend"; +import { Midi } from "./Midi"; +import { Note } from "./Note"; +import { Track } from "./Track"; + +import { flatten } from "array-flatten"; + +/** Used to add `absoluteTime` property. */ +type WithAbsoluteTime = { absoluteTime: number }; + +function encodeNote(note: Note, channel: number): [ + (MidiNoteOnEvent & WithAbsoluteTime), + (MidiNoteOffEvent & WithAbsoluteTime) +] { + return [{ + absoluteTime: note.ticks, + channel, + deltaTime: 0, + noteNumber: note.midi, + type: "noteOn", + velocity: Math.floor(note.velocity * 127), + }, + { + absoluteTime: note.ticks + note.durationTicks, + channel, + deltaTime: 0, + noteNumber: note.midi, + type: "noteOff", + velocity: Math.floor(note.noteOffVelocity * 127), + }]; +} + +function encodeNotes(track: Track): Array { + return flatten(track.notes.map(note => encodeNote(note, track.channel))) as unknown as Array; +} + +function encodeControlChange( + cc: ControlChange, + channel: number +): (MidiControllerEvent & WithAbsoluteTime) { + return { + absoluteTime: cc.ticks, + channel, + controllerType: cc.number, + deltaTime: 0, + type: "controller", + value: Math.floor(cc.value * 127), + }; +} + +function encodeControlChanges(track: Track): MidiControllerEvent[] { + const controlChanges: MidiControllerEvent[] = []; + for (let i = 0; i < 127; i++) { + if (track.controlChanges.hasOwnProperty(i)) { + track.controlChanges[i].forEach((cc: ControlChange) => { + controlChanges.push(encodeControlChange(cc, track.channel)); + }); + } + } + return controlChanges; +} + +function encodePitchBend( + pb: PitchBend, + channel: number +): (MidiPitchBendEvent & WithAbsoluteTime) { + return { + absoluteTime: pb.ticks, + channel, + deltaTime: 0, + type: "pitchBend", + value: pb.value, + }; +} + +function encodePitchBends(track: Track): MidiPitchBendEvent[] { + const pitchBends: MidiPitchBendEvent[] = []; + track.pitchBends.forEach((pb: PitchBend) => { + pitchBends.push(encodePitchBend(pb, track.channel)); + }); + return pitchBends; +} + +function encodeInstrument(track: Track): (MidiProgramChangeEvent & WithAbsoluteTime) { + return { + absoluteTime: 0, + channel: track.channel, + deltaTime: 0, + programNumber: track.instrument.number, + type: "programChange", + }; +} + +function encodeTrackName(name: string): (MidiTrackNameEvent & WithAbsoluteTime) { + return { + absoluteTime: 0, + deltaTime: 0, + meta: true, + text: name, + type: "trackName", + }; +} + +function encodeTempo(tempo: TempoEvent): (MidiSetTempoEvent & WithAbsoluteTime) { + return { + absoluteTime: tempo.ticks, + deltaTime: 0, + meta: true, + microsecondsPerBeat: Math.floor(60000000 / tempo.bpm), + type: "setTempo", + }; +} + +function encodeTimeSignature(timeSig: TimeSignatureEvent): (MidiTimeSignatureEvent & WithAbsoluteTime) { + return { + absoluteTime: timeSig.ticks, + deltaTime: 0, + denominator: timeSig.timeSignature[1], + meta: true, + metronome: 24, + numerator: timeSig.timeSignature[0], + thirtyseconds: 8, + type: "timeSignature", + }; +} + +// function encodeMeta(event: ) + +function encodeKeySignature(keySig: KeySignatureEvent): (MidiKeySignatureEvent & WithAbsoluteTime) { + const keyIndex = keySignatureKeys.indexOf(keySig.key); + return { + absoluteTime: keySig.ticks, + deltaTime: 0, + key: keyIndex + 7, + meta: true, + scale: keySig.scale === "major" ? 0 : 1, + type: "keySignature", + }; +} + +function encodeText( + textEvent: (MetaEvent & { ticks: number; }) +): (MidiTextEvent & WithAbsoluteTime) { + return { + absoluteTime: textEvent.ticks, + deltaTime: 0, + meta: true, + text: textEvent.text, + type: textEvent.type, + } as (MidiTextEvent & WithAbsoluteTime); +} + +/** + * Convert the MIDI object to an array. + */ +export function encode(midi: Midi): Uint8Array { + const midiData: MidiData = { + header: { + format: 1, + numTracks: midi.tracks.length + 1, + ticksPerBeat: midi.header.ppq, + }, + tracks: [ + [ + // The name data. + { + absoluteTime: 0, + deltaTime: 0, + meta: true, + text: midi.header.name, + type: "trackName", + } as MidiTrackNameEvent, + ...midi.header.keySignatures.map(keySig => encodeKeySignature(keySig)), + // and all the meta events (cloned for safety) + ...midi.header.meta.map(e => encodeText(e)), + // the first track is all the tempo data + ...midi.header.tempos.map(tempo => encodeTempo(tempo)), + // and the time signature data. + ...midi.header.timeSignatures.map(timeSig => encodeTimeSignature(timeSig)), + ], + // The remaining tracks. + ...midi.tracks.map((track) => { + return [ + // Add the name + encodeTrackName(track.name), + // the instrument + encodeInstrument(track), + // add the notes + ...encodeNotes(track), + // and the control changes + ...encodeControlChanges(track), + // and the pitch bends. + ...encodePitchBends(track) + ]; + }), + ], + }; + + // Sort and set `deltaTime` of all of the tracks. + midiData.tracks = midiData.tracks.map((track: (MidiEvent & WithAbsoluteTime)[]) => { + track = track.sort((a, b) => a.absoluteTime - b.absoluteTime); + + let lastTime = 0; + track.forEach(note => { + note.deltaTime = note.absoluteTime - lastTime; + lastTime = note.absoluteTime; + delete note.absoluteTime; + }); + + // End of track. + track.push({ + deltaTime: 0, + meta: true, + type: "endOfTrack", + } as (MidiEndOfTrackEvent & WithAbsoluteTime)); + return track; + }); + + // Rreturn `midiData`. + return new Uint8Array(writeMidi(midiData)); +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Header.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Header.ts new file mode 100644 index 00000000..bfe694c4 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Header.ts @@ -0,0 +1,313 @@ +import type { MidiData, MidiEvent } from "midi-file"; +import { search } from "./BinarySearch"; + +const privatePPQMap = new WeakMap(); + +export interface TempoEvent { + ticks: number; + bpm: number; + time?: number; +} + +export interface TimeSignatureEvent { + ticks: number; + timeSignature: number[]; + measures?: number; +} + +export interface MetaEvent { + text: string; + type: string; + ticks: number; +} + +export interface KeySignatureEvent { + ticks: number; + key: string; + scale: string; +} + +/** + * @hidden + */ +export const keySignatureKeys = [ + "Cb", + "Gb", + "Db", + "Ab", + "Eb", + "Bb", + "F", + "C", + "G", + "D", + "A", + "E", + "B", + "F#", + "C#", +]; + +/** + * The parsed MIDI file header. + */ +export class Header { + /** + * The array of all the tempo events. + */ + tempos: TempoEvent[] = []; + + /** + * The time signatures. + */ + timeSignatures: TimeSignatureEvent[] = []; + + /** + * The time signatures. + */ + keySignatures: KeySignatureEvent[] = []; + + /** + * Additional meta events. + */ + meta: MetaEvent[] = []; + + /** + * The name of the MIDI file; + */ + name = ""; + + constructor(midiData?: MidiData) { + // Look through all the tracks for tempo changes. + privatePPQMap.set(this, 480); + + if (midiData) { + privatePPQMap.set(this, midiData.header.ticksPerBeat); + + // Check time signature and tempo events from all of the tracks. + midiData.tracks.forEach(track => { + track.forEach((event: MidiEvent & { absoluteTime: number; meta?: boolean; }) => { + if (event.meta) { + if (event.type === "timeSignature") { + this.timeSignatures.push({ + ticks: event.absoluteTime, + timeSignature: [ + event.numerator, + event.denominator, + ], + }); + } else if (event.type === "setTempo") { + this.tempos.push({ + bpm: 60000000 / event.microsecondsPerBeat, + ticks: event.absoluteTime, + }); + } else if (event.type === "keySignature") { + this.keySignatures.push({ + key: keySignatureKeys[event.key + 7], + scale: event.scale === 0 ? "major" : "minor", + ticks: event.absoluteTime, + }); + } + } + }); + }); + + // Check the first track for other relevant data. + let firstTrackCurrentTicks = 0; // Used for absolute times. + midiData.tracks[0].forEach((event: MidiEvent & { meta?: boolean; }) => { + firstTrackCurrentTicks += event.deltaTime; + + if (event.meta) { + if (event.type === "trackName") { + this.name = event.text; + } else if ( + event.type === "text" || + event.type === "cuePoint" || + event.type === "marker" || + event.type === "lyrics" + ) { + this.meta.push({ + text: event.text, + ticks: firstTrackCurrentTicks, + type: event.type, + }); + } + } + }); + + this.update(); + } + } + + /** + * This must be invoked after any changes are made to the tempo array + * or the timeSignature array for the updated values to be reflected. + */ + update(): void { + let currentTime = 0; + let lastEventBeats = 0; + + // Make sure it's sorted; + this.tempos.sort((a, b) => a.ticks - b.ticks); + this.tempos.forEach((event, index) => { + const lastBPM = + index > 0 ? this.tempos[index - 1].bpm : this.tempos[0].bpm; + const beats = event.ticks / this.ppq - lastEventBeats; + const elapsedSeconds = (60 / lastBPM) * beats; + + event.time = elapsedSeconds + currentTime; + currentTime = event.time; + lastEventBeats += beats; + }); + + this.timeSignatures.sort((a, b) => a.ticks - b.ticks); + this.timeSignatures.forEach((event, index) => { + const lastEvent = + index > 0 + ? this.timeSignatures[index - 1] + : this.timeSignatures[0]; + + const elapsedBeats = (event.ticks - lastEvent.ticks) / this.ppq; + const elapsedMeasures = + elapsedBeats / + lastEvent.timeSignature[0] / + (lastEvent.timeSignature[1] / 4); + + lastEvent.measures = lastEvent.measures || 0; + event.measures = elapsedMeasures + lastEvent.measures; + }); + } + + /** + * Convert ticks into seconds based on the tempo changes. + */ + ticksToSeconds(ticks: number): number { + // Find the relevant position. + const index = search(this.tempos, ticks); + + if (index !== -1) { + const tempo = this.tempos[index]; + const tempoTime = tempo.time; + const elapsedBeats = (ticks - tempo.ticks) / this.ppq; + + return tempoTime + (60 / tempo.bpm) * elapsedBeats; + } else { + // Assume 120. + const beats = ticks / this.ppq; + return (60 / 120) * beats; + } + } + + /** + * Convert ticks into measures based off of the time signatures. + */ + ticksToMeasures(ticks: number): number { + const index = search(this.timeSignatures, ticks); + + if (index !== -1) { + const timeSigEvent = this.timeSignatures[index]; + const elapsedBeats = (ticks - timeSigEvent.ticks) / this.ppq; + + return ( + timeSigEvent.measures + + elapsedBeats / + (timeSigEvent.timeSignature[0] / + timeSigEvent.timeSignature[1]) / + 4 + ); + } else { + return ticks / this.ppq / 4; + } + } + + /** + * The number of ticks per quarter note. + */ + get ppq(): number { + return privatePPQMap.get(this); + } + + /** + * Convert seconds to ticks based on the tempo events. + */ + secondsToTicks(seconds: number): number { + // Find the relevant position. + const index = search(this.tempos, seconds, "time"); + + if (index !== -1) { + const tempo = this.tempos[index]; + const tempoTime = tempo.time; + const elapsedTime = seconds - tempoTime; + const elapsedBeats = elapsedTime / (60 / tempo.bpm); + + return Math.round(tempo.ticks + elapsedBeats * this.ppq); + } else { + // Assume 120. + const beats = seconds / (60 / 120); + return Math.round(beats * this.ppq); + } + } + + /** + * Convert the header into an object. + */ + toJSON(): HeaderJSON { + return { + keySignatures: this.keySignatures, + meta: this.meta, + name: this.name, + ppq: this.ppq, + tempos: this.tempos.map((t) => { + return { + bpm: t.bpm, + ticks: t.ticks, + }; + }), + timeSignatures: this.timeSignatures, + }; + } + + /** + * Parse a header json object. + */ + fromJSON(json: HeaderJSON): void { + this.name = json.name; + + // Clone all the attributes. + this.tempos = json.tempos.map((t) => Object.assign({}, t)); + this.timeSignatures = json.timeSignatures.map((t) => + Object.assign({}, t) + ); + this.keySignatures = json.keySignatures.map((t) => + Object.assign({}, t) + ); + this.meta = json.meta.map((t) => Object.assign({}, t)); + + privatePPQMap.set(this, json.ppq); + this.update(); + } + + /** + * Update the tempo of the midi to a single tempo. Will remove and replace + * any other tempos currently set and update all of the event timing. + * @param bpm The tempo in beats per second. + */ + setTempo(bpm: number): void { + this.tempos = [ + { + bpm, + ticks: 0, + }, + ]; + this.update(); + } +} + +export interface HeaderJSON { + name: string; + ppq: number; + meta: MetaEvent[]; + tempos: TempoEvent[]; + timeSignatures: TimeSignatureEvent[]; + keySignatures: KeySignatureEvent[]; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Instrument.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Instrument.ts new file mode 100644 index 00000000..ee5a26ba --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Instrument.ts @@ -0,0 +1,104 @@ +import type { + MidiEvent, + MidiProgramChangeEvent +} from "midi-file"; + +import { DrumKitByPatchID, instrumentByPatchID, InstrumentFamilyByID } from "./InstrumentMaps"; +import { Track } from "./Track"; + +/** + * @hidden + */ +const privateTrackMap = new WeakMap(); + +/** + * Describes the MIDI instrument of a track. + */ +export class Instrument { + + /** + * The instrument number. Defaults to 0. + */ + number = 0; + + /** + * @param trackData + * @param track + */ + constructor(trackData: MidiEvent[], track: Track) { + privateTrackMap.set(this, track); + this.number = 0; + + if (trackData) { + const programChange = trackData.find( + e => e.type === "programChange" + ) as MidiProgramChangeEvent; + + // Set 'number' from 'programNumber' if exists. + if (programChange) { + this.number = programChange.programNumber; + } + } + } + + /** + * The common name of the instrument. + */ + get name(): string { + if (this.percussion) { + return DrumKitByPatchID[this.number]; + } else { + return instrumentByPatchID[this.number]; + } + } + + set name(n: string) { + const patchNumber = instrumentByPatchID.indexOf(n); + if (patchNumber !== -1) { + this.number = patchNumber; + } + } + + /** + * The instrument family, e.g. "piano". + */ + get family(): string { + if (this.percussion) { + return "drums"; + } else { + return InstrumentFamilyByID[Math.floor(this.number / 8)]; + } + } + + /** + * If the instrument is a percussion instrument. + */ + get percussion(): boolean { + const track = privateTrackMap.get(this); + return track.channel === 9; + } + + /** + * Convert it to JSON form. + */ + toJSON(): InstrumentJSON { + return { + family: this.family, + number: this.number, + name: this.name + }; + } + + /** + * Convert from JSON form. + */ + fromJSON(json: InstrumentJSON): void { + this.number = json.number; + } +} + +export interface InstrumentJSON { + family: string; + number: number; + name: string; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/InstrumentMaps.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/InstrumentMaps.ts new file mode 100644 index 00000000..f0e45f6e --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/InstrumentMaps.ts @@ -0,0 +1,161 @@ +export const instrumentByPatchID = [ + "acoustic grand piano", + "bright acoustic piano", + "electric grand piano", + "honky-tonk piano", + "electric piano 1", + "electric piano 2", + "harpsichord", + "clavi", + "celesta", + "glockenspiel", + "music box", + "vibraphone", + "marimba", + "xylophone", + "tubular bells", + "dulcimer", + "drawbar organ", + "percussive organ", + "rock organ", + "church organ", + "reed organ", + "accordion", + "harmonica", + "tango accordion", + "acoustic guitar (nylon)", + "acoustic guitar (steel)", + "electric guitar (jazz)", + "electric guitar (clean)", + "electric guitar (muted)", + "overdriven guitar", + "distortion guitar", + "guitar harmonics", + "acoustic bass", + "electric bass (finger)", + "electric bass (pick)", + "fretless bass", + "slap bass 1", + "slap bass 2", + "synth bass 1", + "synth bass 2", + "violin", + "viola", + "cello", + "contrabass", + "tremolo strings", + "pizzicato strings", + "orchestral harp", + "timpani", + "string ensemble 1", + "string ensemble 2", + "synthstrings 1", + "synthstrings 2", + "choir aahs", + "voice oohs", + "synth voice", + "orchestra hit", + "trumpet", + "trombone", + "tuba", + "muted trumpet", + "french horn", + "brass section", + "synthbrass 1", + "synthbrass 2", + "soprano sax", + "alto sax", + "tenor sax", + "baritone sax", + "oboe", + "english horn", + "bassoon", + "clarinet", + "piccolo", + "flute", + "recorder", + "pan flute", + "blown bottle", + "shakuhachi", + "whistle", + "ocarina", + "lead 1 (square)", + "lead 2 (sawtooth)", + "lead 3 (calliope)", + "lead 4 (chiff)", + "lead 5 (charang)", + "lead 6 (voice)", + "lead 7 (fifths)", + "lead 8 (bass + lead)", + "pad 1 (new age)", + "pad 2 (warm)", + "pad 3 (polysynth)", + "pad 4 (choir)", + "pad 5 (bowed)", + "pad 6 (metallic)", + "pad 7 (halo)", + "pad 8 (sweep)", + "fx 1 (rain)", + "fx 2 (soundtrack)", + "fx 3 (crystal)", + "fx 4 (atmosphere)", + "fx 5 (brightness)", + "fx 6 (goblins)", + "fx 7 (echoes)", + "fx 8 (sci-fi)", + "sitar", + "banjo", + "shamisen", + "koto", + "kalimba", + "bag pipe", + "fiddle", + "shanai", + "tinkle bell", + "agogo", + "steel drums", + "woodblock", + "taiko drum", + "melodic tom", + "synth drum", + "reverse cymbal", + "guitar fret noise", + "breath noise", + "seashore", + "bird tweet", + "telephone ring", + "helicopter", + "applause", + "gunshot", +]; + +export const InstrumentFamilyByID = [ + "piano", + "chromatic percussion", + "organ", + "guitar", + "bass", + "strings", + "ensemble", + "brass", + "reed", + "pipe", + "synth lead", + "synth pad", + "synth effects", + "world", + "percussive", + "sound effects", +]; + +export const DrumKitByPatchID = { + 0: "standard kit", + 8: "room kit", + 16: "power kit", + 24: "electronic kit", + 25: "tr-808 kit", + 32: "jazz kit", + 40: "brush kit", + 48: "orchestra kit", + 56: "sound fx kit", +}; diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Midi.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Midi.ts new file mode 100644 index 00000000..7687a1fe --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Midi.ts @@ -0,0 +1,227 @@ +import type { + MidiData, + MidiEvent +} from "midi-file"; + +import { parseMidi } from "midi-file"; + +import { Header, HeaderJSON } from "./Header"; +import { Track, TrackJSON } from "./Track"; +import { encode } from "./Encode"; + +/** + * The main midi parsing class. + */ +export class Midi { + + /** + * Download and parse the MIDI file. Returns a promise + * which resolves to the generated MIDI file. + * @param url The URL to fetch. + */ + static async fromUrl(url: string): Promise { + const response = await fetch(url); + if (response.ok) { + const arrayBuffer = await response.arrayBuffer(); + return new Midi(arrayBuffer); + } else { + throw new Error(`Could not load '${url}'`); + } + } + + /** + * The header information, includes things like tempo and meta events. + */ + header: Header; + + /** + * The midi tracks. + */ + tracks: Track[]; + + /** + * Parse the midi data + */ + constructor(midiArray?: (ArrayLike | ArrayBuffer)) { + // Parse the MIDI data if there is any. + let midiData: (MidiData | null) = null; + if (midiArray) { + // Transform midiArray to ArrayLike + // only if it's an ArrayBuffer. + const midiArrayLike: ArrayLike = midiArray instanceof ArrayBuffer + ? new Uint8Array(midiArray) + : midiArray; + + // Parse MIDI data. + midiData = parseMidi(midiArrayLike); + + // Add the absolute times to each of the tracks. + midiData.tracks.forEach(track => { + let currentTicks = 0; + + track.forEach((event: MidiEvent & { absoluteTime: number; }) => { + currentTicks += event.deltaTime; + event.absoluteTime = currentTicks; + }); + }); + + // Ensure at most one instrument per track. + midiData.tracks = splitTracks(midiData.tracks); + } + + this.header = new Header(midiData); + this.tracks = []; + + // Parse MIDI data. + if (midiArray) { + // Format 0, everything is on the same track. + this.tracks = midiData.tracks.map(trackData => new Track(trackData, this.header)); + + // If it's format 1 and there are no notes on the first track, remove it. + if (midiData.header.format === 1 && this.tracks[0].duration === 0) { + this.tracks.shift(); + } + } + } + + /** + * The name of the midi file, taken from the first track. + */ + get name(): string { + return this.header.name; + } + + set name(n) { + this.header.name = n; + } + + /** + * The total length of the file in seconds. + */ + get duration(): number { + // Get the max of the last note of all the tracks. + const durations = this.tracks.map(t => t.duration); + return Math.max(...durations); + } + + /** + * The total length of the file in ticks. + */ + get durationTicks(): number { + // Get the max of the last note of all the tracks. + const durationTicks = this.tracks.map(t => t.durationTicks); + return Math.max(...durationTicks); + } + + /** + * Add a track to the MIDI file. + */ + addTrack(): Track { + const track = new Track(undefined, this.header); + this.tracks.push(track); + + return track; + } + + /** + * Encode the MIDI as a Uint8Array. + */ + toArray(): Uint8Array { + return encode(this); + } + + /** + * Convert the MIDI object to JSON. + */ + toJSON(): MidiJSON { + return { + header: this.header.toJSON(), + tracks: this.tracks.map(track => track.toJSON()), + }; + } + + /** + * Parse a JSON representation of the object. Will overwrite the current + * tracks and header. + */ + fromJSON(json: MidiJSON): void { + this.header = new Header(); + this.header.fromJSON(json.header); + this.tracks = json.tracks.map(trackJSON => { + const track = new Track(undefined, this.header); + track.fromJSON(trackJSON); + + return track; + }); + } + + /** + * Clone the entire object MIDI object. + */ + clone(): Midi { + const midi = new Midi(); + midi.fromJSON(this.toJSON()); + + return midi; + } +} + +/** + * The MIDI data in JSON format. + */ +export interface MidiJSON { + header: HeaderJSON; + tracks: TrackJSON[]; +} + +export { TrackJSON, Track } from "./Track"; +export { HeaderJSON, Header } from "./Header"; + +/** + * Given a list of MIDI tracks, make sure that each channel corresponds to at + * most one channel and at most one instrument. This means splitting up tracks + * that contain more than one channel or instrument. + */ +function splitTracks(tracks: Array): Array { + const newTracks = []; + + for (let i = 0; i < tracks.length; i++) { + const defaultTrack = newTracks.length; + // a map from [program, channel] tuples to new track numbers + const trackMap = new Map(); + // a map from channel numbers to current program numbers + const currentProgram = Array(16).fill(0) as Array; + + for (const event of tracks[i]) { + let targetTrack = defaultTrack; + + // If the event has a channel, we need to find that channel's current + // program number and the appropriate track for this [program, channel] + // pair. + const channel = (event as (MidiEvent & { channel?: number })).channel; + if (channel !== undefined) { + if (event.type === "programChange") { + currentProgram[channel] = event.programNumber; + } + + const program = currentProgram[channel]; + const trackKey = `${program} ${channel}`; + + if (trackMap.has(trackKey)) { + targetTrack = trackMap.get(trackKey); + } else { + targetTrack = defaultTrack + trackMap.size; + trackMap.set(trackKey, targetTrack); + } + } + + if (!newTracks[targetTrack]) { + newTracks.push([]); + } + + newTracks[targetTrack].push(event); + } + } + + return newTracks; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Note.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Note.ts new file mode 100644 index 00000000..6dc02eca --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Note.ts @@ -0,0 +1,243 @@ +import { Header } from "./Header"; + +/** + * Convert a MIDI note into a pitch. + */ +function midiToPitch(midi: number): string { + const octave = Math.floor(midi / 12) - 1; + return midiToPitchClass(midi) + octave.toString(); +} + +/** + * Convert a MIDI note to a pitch class (just the pitch no octave). + */ +function midiToPitchClass(midi: number): string { + const scaleIndexToNote = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; + const note = midi % 12; + return scaleIndexToNote[note]; +} + +/** + * Convert a pitch class to a MIDI note. + */ +function pitchClassToMidi(pitch: string): number { + const scaleIndexToNote = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; + return scaleIndexToNote.indexOf(pitch); +} + +/** + * Convert a pitch to a MIDI number. + */ +// tslint:disable-next-line: only-arrow-functions typedef +const pitchToMidi: (note: string) => number = (function() { + const regexp = /^([a-g]{1}(?:b|#|x|bb)?)(-?[0-9]+)/i; + const noteToScaleIndex = { + // tslint:disable-next-line: object-literal-sort-keys + cbb: -2, cb: -1, c: 0, "c#": 1, cx: 2, + dbb: 0, db: 1, d: 2, "d#": 3, dx: 4, + ebb: 2, eb: 3, e: 4, "e#": 5, ex: 6, + fbb: 3, fb: 4, f: 5, "f#": 6, fx: 7, + gbb: 5, gb: 6, g: 7, "g#": 8, gx: 9, + abb: 7, ab: 8, a: 9, "a#": 10, ax: 11, + bbb: 9, bb: 10, b: 11, "b#": 12, bx: 13, + }; + + return (note) => { + const split = regexp.exec(note); + const pitch = split[1]; + const octave = split[2]; + const index = noteToScaleIndex[pitch.toLowerCase()]; + return index + (parseInt(octave, 10) + 1) * 12; + }; +}()); + +const privateHeaderMap = new WeakMap(); + +/** + * A Note consists of a `noteOn` and `noteOff` event. + */ +export class Note implements NoteInterface { + + /** + * The notes MIDI value. + */ + midi: number; + + /** + * The normalized velocity (0-1). + */ + velocity: number; + + /** + * The velocity of the note off. + */ + noteOffVelocity: number; + + /** + * The start time in ticks. + */ + ticks: number; + + /** + * The duration in ticks. + */ + durationTicks: number; + + constructor(noteOn: NoteOnEvent, noteOff: NoteOffEvent, header: Header) { + privateHeaderMap.set(this, header); + + this.midi = noteOn.midi; + + this.velocity = noteOn.velocity; + + this.noteOffVelocity = noteOff.velocity; + + this.ticks = noteOn.ticks; + + this.durationTicks = noteOff.ticks - noteOn.ticks; + } + + /** + * The note name and octave in scientific pitch notation, e.g. "C4". + */ + get name(): string { + return midiToPitch(this.midi); + } + + set name(n: string) { + this.midi = pitchToMidi(n); + } + + /** + * The notes octave number. + */ + get octave(): number { + return Math.floor(this.midi / 12) - 1; + } + + set octave(o: number) { + const diff = o - this.octave; + this.midi += diff * 12; + } + + /** + * The pitch class name. e.g. "A". + */ + get pitch(): string { + return midiToPitchClass(this.midi); + } + + set pitch(p: string) { + this.midi = 12 * (this.octave + 1) + pitchClassToMidi(p); + } + + /** + * The duration of the segment in seconds. + */ + get duration(): number { + const header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks + this.durationTicks) - header.ticksToSeconds(this.ticks); + } + + set duration(d: number) { + const header = privateHeaderMap.get(this); + const noteEndTicks = header.secondsToTicks(this.time + d); + this.durationTicks = noteEndTicks - this.ticks; + } + + /** + * The time of the event in seconds. + */ + get time(): number { + const header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks); + } + + set time(t: number) { + const header = privateHeaderMap.get(this); + this.ticks = header.secondsToTicks(t); + } + + /** + * The number of measures (and partial measures) to this beat. + * Takes into account time signature changes. + * @readonly + */ + get bars(): number { + const header = privateHeaderMap.get(this); + return header.ticksToMeasures(this.ticks); + } + + toJSON(): NoteJSON { + return { + duration: this.duration, + durationTicks: this.durationTicks, + midi: this.midi, + name: this.name, + ticks: this.ticks, + time: this.time, + velocity: this.velocity, + }; + } +} + +export interface NoteJSON { + time: number; + midi: number; + name: string; + velocity: number; + duration: number; + ticks: number; + durationTicks: number; +} + +export interface NoteOnEvent { + ticks: number; + velocity: number; + midi: number; +} + +export interface NoteOffEvent { + ticks: number; + velocity: number; +} + +export interface NoteInterface { + time: number; + ticks: number; + duration: number; + durationTicks: number; + midi: number; + pitch: string; + octave: number; + name: string; + noteOffVelocity: number; + velocity: number; +} + +type PitchDescription = { + name: string; +} | { + pitch: string; + octave: number; +} | { + midi: number; +} + +type VelocityDescription = { + velocity?: number; + noteOffVelocity?: number; +} + +type TimeDescription = { + time: number; + duration?: number; +} | { + ticks: number; + durationTicks?: number; +} + +/** + * @hidden + */ +export type NoteConstructorInterface = PitchDescription & VelocityDescription & TimeDescription diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/PitchBend.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/PitchBend.ts new file mode 100644 index 00000000..f8bc71a0 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/PitchBend.ts @@ -0,0 +1,64 @@ +import { Header } from "./Header"; +import { MidiPitchBendEvent } from "midi-file"; + +const privateHeaderMap = new WeakMap(); + +/** + * Represents a pitch bend event. + */ +export class PitchBend implements PitchBendInterface { + + /** + * The pitch value from... + */ + value: number; + + /** + * The tick time of the event. + */ + ticks: number; + + /** + * @param event + * @param header + */ + constructor(event: Partial, header: Header) { + privateHeaderMap.set(this, header); + + this.ticks = event.absoluteTime; + this.value = event.value; + } + + /** + * The time of the event in seconds + */ + get time(): number { + const header = privateHeaderMap.get(this); + return header.ticksToSeconds(this.ticks); + } + + set time(t: number) { + const header = privateHeaderMap.get(this); + this.ticks = header.secondsToTicks(t); + } + + toJSON(): PitchBendJSON { + return { + ticks: this.ticks, + time: this.time, + value: this.value, + }; + } +} + +export interface PitchBendJSON { + ticks: number; + time: number; + value: number; +} + +export interface PitchBendInterface { + ticks: number; + time: number; + value: number; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Track.ts b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Track.ts new file mode 100644 index 00000000..8bdb59aa --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/tonejs/package/src/Track.ts @@ -0,0 +1,335 @@ +import type { + MidiControllerEvent, + MidiEndOfTrackEvent, + MidiEvent, + MidiNoteOffEvent, MidiNoteOnEvent, + MidiPitchBendEvent, MidiTrackNameEvent +} from "midi-file"; + +// Used to add `absoluteTime` property to 'MidiEvent's. +type WithAbsoluteTime = { absoluteTime: number; }; + +import { insert } from "./BinarySearch"; +import { ControlChange, ControlChangeInterface } from "./ControlChange"; +import { ControlChangesJSON, createControlChanges } from "./ControlChanges"; +import { PitchBend, PitchBendInterface, PitchBendJSON } from "./PitchBend"; + +import { Header } from "./Header"; +import { Instrument, InstrumentJSON } from "./Instrument"; +import { Note, NoteConstructorInterface, NoteJSON } from "./Note"; + +const privateHeaderMap = new WeakMap(); + +/** + * A Track is a collection of 'notes' and 'controlChanges'. + */ +export class Track { + /** + * The name of the track. + */ + name = ""; + + /** + * The instrument associated with the track. + */ + instrument: Instrument; + + /** + * The track's note events. + */ + notes: Note[] = []; + + /** + * The channel number of the track. Applies this channel + * to all events associated with the channel. + */ + channel: number; + + /** + * The control change events. + */ + controlChanges = createControlChanges(); + + /** + * The end of track event (if it exists) in ticks. + */ + endOfTrackTicks?: number; + + /** + * The pitch bend events. + */ + pitchBends: PitchBend[] = []; + + constructor(trackData: MidiEvent[], header: Header) { + privateHeaderMap.set(this, header); + + if (trackData) { + // Get the name of the track. + const nameEvent = trackData.find( + (e) => e.type === "trackName" + ) as MidiTrackNameEvent; + + // Set empty name if 'trackName' event isn't found. + this.name = nameEvent ? nameEvent.text : ""; + } + + this.instrument = new Instrument(trackData, this); + + // Defaults to 0. + this.channel = 0; + + if (trackData) { + const noteOns = trackData.filter( + (event) => event.type === "noteOn" + ) as (MidiNoteOnEvent & WithAbsoluteTime)[]; + + const noteOffs = trackData.filter( + (event) => event.type === "noteOff" + ) as (MidiNoteOffEvent & WithAbsoluteTime)[]; + + while (noteOns.length) { + const currentNote = noteOns.shift(); + + // Set the channel based on the note. + this.channel = currentNote.channel; + + // Find the corresponding note off. + const offIndex = noteOffs.findIndex( + (note) => + note.noteNumber === currentNote.noteNumber && + note.absoluteTime >= currentNote.absoluteTime + ); + + if (offIndex !== -1) { + // Once it's got the note off, add it. + const noteOff = noteOffs.splice(offIndex, 1)[0]; + + this.addNote({ + durationTicks: + noteOff.absoluteTime - currentNote.absoluteTime, + midi: currentNote.noteNumber, + noteOffVelocity: noteOff.velocity / 127, + ticks: currentNote.absoluteTime, + velocity: currentNote.velocity / 127, + }); + } + } + + const controlChanges = trackData.filter( + (event) => event.type === "controller" + ) as (MidiControllerEvent & WithAbsoluteTime)[]; + controlChanges.forEach((event) => { + this.addCC({ + number: event.controllerType, + ticks: event.absoluteTime, + value: event.value / 127, + }); + }); + + const pitchBends = trackData.filter( + (event) => event.type === "pitchBend" + ) as (MidiPitchBendEvent & WithAbsoluteTime)[]; + pitchBends.forEach((event) => { + this.addPitchBend({ + ticks: event.absoluteTime, + // Scale the value between -2^13 to 2^13 to -2 to 2. + value: event.value / Math.pow(2, 13), + }); + }); + + const endOfTrackEvent: + | (MidiEndOfTrackEvent & WithAbsoluteTime) + | undefined = trackData.find( + (event): event is (MidiEndOfTrackEvent & WithAbsoluteTime) => + event.type === "endOfTrack" + ); + + this.endOfTrackTicks = + endOfTrackEvent !== undefined + ? endOfTrackEvent.absoluteTime + : undefined; + } + } + + /** + * Add a note to the notes array. + * @param props The note properties to add. + */ + addNote(props: NoteConstructorInterface): this { + const header = privateHeaderMap.get(this); + const note = new Note( + { + midi: 0, + ticks: 0, + velocity: 1, + }, + { + ticks: 0, + velocity: 0, + }, + header + ); + + Object.assign(note, props); + insert(this.notes, note, "ticks"); + return this; + } + + /** + * Add a control change to the track. + * @param props + */ + addCC( + props: + | Omit + | Omit + ): this { + const header = privateHeaderMap.get(this); + const cc = new ControlChange( + { + controllerType: props.number, + }, + header + ); + delete props.number; + Object.assign(cc, props); + if (!Array.isArray(this.controlChanges[cc.number])) { + this.controlChanges[cc.number] = []; + } + insert(this.controlChanges[cc.number], cc, "ticks"); + return this; + } + + /** + * Add a control change to the track. + */ + addPitchBend( + props: + | Omit + | Omit + ): this { + const header = privateHeaderMap.get(this); + const pb = new PitchBend({}, header); + Object.assign(pb, props); + insert(this.pitchBends, pb, "ticks"); + return this; + } + + /** + * The end time of the last event in the track. + */ + get duration(): number { + if (!this.notes.length) { + return 0; + } + + let maxDuration = + this.notes[this.notes.length - 1].time + + this.notes[this.notes.length - 1].duration; + + for (let i = 0; i < this.notes.length - 1; i++) { + const duration = this.notes[i].time + this.notes[i].duration; + if (maxDuration < duration) { + maxDuration = duration; + } + } + + return maxDuration; + } + + /** + * The end time of the last event in the track in ticks. + */ + get durationTicks(): number { + if (!this.notes.length) { + return 0; + } + + let maxDuration = + this.notes[this.notes.length - 1].ticks + + this.notes[this.notes.length - 1].durationTicks; + for (let i = 0; i < this.notes.length - 1; i++) { + const duration = this.notes[i].ticks + this.notes[i].durationTicks; + if (maxDuration < duration) { + maxDuration = duration; + } + } + + return maxDuration; + } + + /** + * Assign the JSON values to this track. + */ + fromJSON(json: TrackJSON): void { + this.name = json.name; + this.channel = json.channel; + this.instrument = new Instrument(undefined, this); + this.instrument.fromJSON(json.instrument); + + if (json.endOfTrackTicks !== undefined) { + this.endOfTrackTicks = json.endOfTrackTicks; + } + + for (const number in json.controlChanges) { + if (json.controlChanges[number]) { + json.controlChanges[number].forEach((cc) => { + this.addCC({ + number: cc.number, + ticks: cc.ticks, + value: cc.value, + }); + }); + } + } + + json.notes.forEach((n) => { + this.addNote({ + durationTicks: n.durationTicks, + midi: n.midi, + ticks: n.ticks, + velocity: n.velocity, + }); + }); + } + + /** + * Convert the track into a JSON format. + */ + toJSON(): TrackJSON { + // Convert all the CCs to JSON. + const controlChanges = {}; + for (let i = 0; i < 127; i++) { + if (this.controlChanges.hasOwnProperty(i)) { + controlChanges[i] = this.controlChanges[i].map((c) => + c.toJSON() + ); + } + } + + const json: TrackJSON = { + channel: this.channel, + controlChanges, + pitchBends: this.pitchBends.map((pb) => pb.toJSON()), + instrument: this.instrument.toJSON(), + name: this.name, + notes: this.notes.map((n) => n.toJSON()), + }; + + if (this.endOfTrackTicks !== undefined) { + json.endOfTrackTicks = this.endOfTrackTicks; + } + + return json; + } +} + +export interface TrackJSON { + name: string; + notes: NoteJSON[]; + channel: number; + instrument: InstrumentJSON; + controlChanges: ControlChangesJSON; + pitchBends: PitchBendJSON[]; + endOfTrackTicks?: number; +} diff --git a/elements/pl-snap/Snap/libraries/TuneScope/webmidi.iife.js b/elements/pl-snap/Snap/libraries/TuneScope/webmidi.iife.js new file mode 100644 index 00000000..828fbefa --- /dev/null +++ b/elements/pl-snap/Snap/libraries/TuneScope/webmidi.iife.js @@ -0,0 +1,9440 @@ +/** + * WEBMIDI.js v3.0.19 + * A JavaScript library to kickstart your MIDI projects + * https://webmidijs.org + * Build generated on April 3rd, 2022. + * + * © Copyright 2015-2022, Jean-Philippe Côté. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ + +/* Version: 3.0.19 - April 3, 2022 11:02:25 */ +(function (exports) { + 'use strict'; + + /** + * The `EventEmitter` class provides methods to implement the _observable_ design pattern. This + * pattern allows one to _register_ a function to execute when a specific event is _emitted_ by the + * emitter. + * + * It is intended to be an abstract class meant to be extended by (or mixed into) other objects. + */ + class EventEmitter { + /** + * Creates a new `EventEmitter`object. + * + * @param {boolean} [eventsSuspended=false] Whether the `EventEmitter` is initially in a suspended + * state (i.e. not executing callbacks). + */ + constructor(eventsSuspended = false) { + /** + * An object containing a property for each event with at least one registered listener. Each + * event property contains an array of all the [`Listener`]{@link Listener} objects registered + * for the event. + * + * @type {Object} + * @readonly + */ + this.eventMap = {}; + /** + * Whether or not the execution of callbacks is currently suspended for this emitter. + * + * @type {boolean} + */ + + this.eventsSuspended = eventsSuspended == true ? true : false; + } + /** + * The callback function is executed when the associated event is triggered via [`emit()`](#emit). + * The [`emit()`](#emit) method relays all additional arguments it received to the callback + * functions. Since [`emit()`](#emit) can be passed a variable number of arguments, it is up to + * the developer to make sure the arguments match those of the associated callback. In addition, + * the callback also separately receives all the arguments present in the listener's + * [`arguments`](Listener#arguments) property. This makes it easy to pass data from where the + * listener is added to where the listener is executed. + * + * @callback EventEmitter~callback + * @param {...*} [args] A variable number of arguments matching the ones (if any) that were passed + * to the [`emit()`](#emit) method (except, the first one) followed by the arguments found in the + * listener's [`arguments`](Listener#arguments) array. + */ + + /** + * Adds a listener for the specified event. It returns the [`Listener`]{@link Listener} object + * that was created and attached to the event. + * + * To attach a global listener that will be triggered for any events, use + * [`EventEmitter.ANY_EVENT`]{@link #ANY_EVENT} as the first parameter. Note that a global + * listener will also be triggered by non-registered events. + * + * @param {string|Symbol} event The event to listen to. + * @param {EventEmitter~callback} callback The callback function to execute when the event occurs. + * @param {Object} [options={}] + * @param {Object} [options.context=this] The value of `this` in the callback function. + * @param {boolean} [options.prepend=false] Whether the listener should be added at the beginning + * of the listeners array and thus executed first. + * @param {number} [options.duration=Infinity] The number of milliseconds before the listener + * automatically expires. + * @param {number} [options.remaining=Infinity] The number of times after which the callback + * should automatically be removed. + * @param {array} [options.arguments] An array of arguments which will be passed separately to the + * callback function. This array is stored in the [`arguments`]{@link Listener#arguments} + * property of the [`Listener`]{@link Listener} object and can be retrieved or modified as + * desired. + * + * @returns {Listener} The newly created [`Listener`]{@link Listener} object. + * + * @throws {TypeError} The `event` parameter must be a string or + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}. + * @throws {TypeError} The `callback` parameter must be a function. + */ + + + addListener(event, callback, options = {}) { + if (typeof event === "string" && event.length < 1 || event instanceof String && event.length < 1 || typeof event !== "string" && !(event instanceof String) && event !== EventEmitter.ANY_EVENT) { + throw new TypeError("The 'event' parameter must be a string or EventEmitter.ANY_EVENT."); + } + + if (typeof callback !== "function") throw new TypeError("The callback must be a function."); + const listener = new Listener(event, this, callback, options); + if (!this.eventMap[event]) this.eventMap[event] = []; + + if (options.prepend) { + this.eventMap[event].unshift(listener); + } else { + this.eventMap[event].push(listener); + } + + return listener; + } + /** + * Adds a one-time listener for the specified event. The listener will be executed once and then + * destroyed. It returns the [`Listener`]{@link Listener} object that was created and attached + * to the event. + * + * To attach a global listener that will be triggered for any events, use + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} as the first parameter. Note that a + * global listener will also be triggered by non-registered events. + * + * @param {string|Symbol} event The event to listen to + * @param {EventEmitter~callback} callback The callback function to execute when the event occurs + * @param {Object} [options={}] + * @param {Object} [options.context=this] The context to invoke the callback function in. + * @param {boolean} [options.prepend=false] Whether the listener should be added at the beginning + * of the listeners array and thus executed first. + * @param {number} [options.duration=Infinity] The number of milliseconds before the listener + * automatically expires. + * @param {array} [options.arguments] An array of arguments which will be passed separately to the + * callback function. This array is stored in the [`arguments`]{@link Listener#arguments} + * property of the [`Listener`]{@link Listener} object and can be retrieved or modified as + * desired. + * + * @returns {Listener} The newly created [`Listener`]{@link Listener} object. + * + * @throws {TypeError} The `event` parameter must be a string or + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}. + * @throws {TypeError} The `callback` parameter must be a function. + */ + + + addOneTimeListener(event, callback, options = {}) { + options.remaining = 1; + this.addListener(event, callback, options); + } + /** + * Identifier to use when adding or removing a listener that should be triggered when any events + * occur. + * + * @type {Symbol} + */ + + + static get ANY_EVENT() { + return Symbol.for("Any event"); + } + /** + * Returns `true` if the specified event has at least one registered listener. If no event is + * specified, the method returns `true` if any event has at least one listener registered (this + * includes global listeners registered to + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}). + * + * Note: to specifically check for global listeners added with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}, use + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} as the parameter. + * + * @param {string|Symbol} [event=(any event)] The event to check + * @param {function|Listener} [callback=(any callback)] The actual function that was added to the + * event or the {@link Listener} object returned by `addListener()`. + * @returns {boolean} + */ + + + hasListener(event, callback) { + if (event === undefined) { + // Check for ANY_EVENT + if (this.eventMap[EventEmitter.ANY_EVENT] && this.eventMap[EventEmitter.ANY_EVENT].length > 0) { + return true; + } // Check for any regular events + + + return Object.entries(this.eventMap).some(([, value]) => { + return value.length > 0; + }); + } else { + if (this.eventMap[event] && this.eventMap[event].length > 0) { + if (callback instanceof Listener) { + let result = this.eventMap[event].filter(listener => listener === callback); + return result.length > 0; + } else if (typeof callback === "function") { + let result = this.eventMap[event].filter(listener => listener.callback === callback); + return result.length > 0; + } else if (callback != undefined) { + return false; + } + + return true; + } else { + return false; + } + } + } + /** + * An array of all the unique event names for which the emitter has at least one registered + * listener. + * + * Note: this excludes global events registered with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} because they are not tied to a + * specific event. + * + * @type {string[]} + * @readonly + */ + + + get eventNames() { + return Object.keys(this.eventMap); + } + /** + * Returns an array of all the [`Listener`]{@link Listener} objects that have been registered for + * a specific event. + * + * Please note that global events (those added with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}) are not returned for "regular" + * events. To get the list of global listeners, specifically use + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} as the parameter. + * + * @param {string|Symbol} event The event to get listeners for. + * @returns {Listener[]} An array of [`Listener`]{@link Listener} objects. + */ + + + getListeners(event) { + return this.eventMap[event] || []; + } + /** + * Suspends execution of all callbacks functions registered for the specified event type. + * + * You can suspend execution of callbacks registered with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} by passing + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} to `suspendEvent()`. Beware that this + * will not suspend all callbacks but only those registered with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}. While this may seem counter-intuitive + * at first glance, it allows the selective suspension of global listeners while leaving other + * listeners alone. If you truly want to suspends all callbacks for a specific + * [`EventEmitter`]{@link EventEmitter}, simply set its `eventsSuspended` property to `true`. + * + * @param {string|Symbol} event The event name (or `EventEmitter.ANY_EVENT`) for which to suspend + * execution of all callback functions. + */ + + + suspendEvent(event) { + this.getListeners(event).forEach(listener => { + listener.suspended = true; + }); + } + /** + * Resumes execution of all suspended callback functions registered for the specified event type. + * + * You can resume execution of callbacks registered with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} by passing + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} to `unsuspendEvent()`. Beware that + * this will not resume all callbacks but only those registered with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}. While this may seem + * counter-intuitive, it allows the selective unsuspension of global listeners while leaving other + * callbacks alone. + * + * @param {string|Symbol} event The event name (or `EventEmitter.ANY_EVENT`) for which to resume + * execution of all callback functions. + */ + + + unsuspendEvent(event) { + this.getListeners(event).forEach(listener => { + listener.suspended = false; + }); + } + /** + * Returns the number of listeners registered for a specific event. + * + * Please note that global events (those added with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}) do not count towards the remaining + * number for a "regular" event. To get the number of global listeners, specifically use + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} as the parameter. + * + * @param {string|Symbol} event The event which is usually a string but can also be the special + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} symbol. + * @returns {number} An integer representing the number of listeners registered for the specified + * event. + */ + + + getListenerCount(event) { + return this.getListeners(event).length; + } + /** + * Executes the callback function of all the [`Listener`]{@link Listener} objects registered for + * a given event. The callback functions are passed the additional arguments passed to `emit()` + * (if any) followed by the arguments present in the [`arguments`](Listener#arguments) property of + * the [`Listener`](Listener) object (if any). + * + * If the [`eventsSuspended`]{@link #eventsSuspended} property is `true` or the + * [`Listener.suspended`]{@link Listener#suspended} property is `true`, the callback functions + * will not be executed. + * + * This function returns an array containing the return values of each of the callbacks. + * + * It should be noted that the regular listeners are triggered first followed by the global + * listeners (those added with [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}). + * + * @param {string} event The event + * @param {...*} args Arbitrary number of arguments to pass along to the callback functions + * + * @returns {Array} An array containing the return value of each of the executed listener + * functions. + * + * @throws {TypeError} The `event` parameter must be a string. + */ + + + emit(event, ...args) { + if (typeof event !== "string" && !(event instanceof String)) { + throw new TypeError("The 'event' parameter must be a string."); + } + + if (this.eventsSuspended) return; // We collect return values from all listeners here + + let results = []; // We must make sure that we do not have undefined otherwise concat() will add an undefined + // entry in the array. + + let listeners = this.eventMap[EventEmitter.ANY_EVENT] || []; + if (this.eventMap[event]) listeners = listeners.concat(this.eventMap[event]); + listeners.forEach(listener => { + // This is the per-listener suspension check + if (listener.suspended) return; + let params = [...args]; + if (Array.isArray(listener.arguments)) params = params.concat(listener.arguments); + + if (listener.remaining > 0) { + results.push(listener.callback.apply(listener.context, params)); + listener.count++; + } + + if (--listener.remaining < 1) listener.remove(); + }); + return results; + } + /** + * Removes all the listeners that match the specified criterias. If no parameters are passed, all + * listeners will be removed. If only the `event` parameter is passed, all listeners for that + * event will be removed. You can remove global listeners by using + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} as the first parameter. + * + * To use more granular options, you must at least define the `event`. Then, you can specify the + * callback to match or one or more of the additional options. + * + * @param {string} [event] The event name. + * @param {EventEmitter~callback} [callback] Only remove the listeners that match this exact + * callback function. + * @param {Object} [options] + * @param {*} [options.context] Only remove the listeners that have this exact context. + * @param {number} [options.remaining] Only remove the listener if it has exactly that many + * remaining times to be executed. + */ + + + removeListener(event, callback, options = {}) { + if (event === undefined) { + this.eventMap = {}; + return; + } else if (!this.eventMap[event]) { + return; + } // Find listeners that do not match the criterias (those are the ones we will keep) + + + let listeners = this.eventMap[event].filter(listener => { + return callback && listener.callback !== callback || options.remaining && options.remaining !== listener.remaining || options.context && options.context !== listener.context; + }); + + if (listeners.length) { + this.eventMap[event] = listeners; + } else { + delete this.eventMap[event]; + } + } + /** + * The `waitFor()` method is an async function which returns a promise. The promise is fulfilled + * when the specified event occurs. The event can be a regular event or + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} (if you want to resolve as soon as any + * event is emitted). + * + * If the `duration` option is set, the promise will only be fulfilled if the event is emitted + * within the specified duration. If the event has not been fulfilled after the specified + * duration, the promise is rejected. This makes it super easy to wait for an event and timeout + * after a certain time if the event is not triggered. + * + * @param {string|Symbol} event The event to wait for + * @param {Object} [options={}] + * @param {number} [options.duration=Infinity] The number of milliseconds to wait before the + * promise is automatically rejected. + */ + + + async waitFor(event, options = {}) { + options.duration = parseInt(options.duration); + if (isNaN(options.duration) || options.duration <= 0) options.duration = Infinity; + return new Promise((resolve, reject) => { + let timeout; + let listener = this.addListener(event, () => { + clearTimeout(timeout); + resolve(); + }, { + remaining: 1 + }); + + if (options.duration !== Infinity) { + timeout = setTimeout(() => { + listener.remove(); + reject("The duration expired before the event was emitted."); + }, options.duration); + } + }); + } + /** + * The number of unique events that have registered listeners. + * + * Note: this excludes global events registered with + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT} because they are not tied to a + * specific event. + * + * @type {number} + * @readonly + */ + + + get eventCount() { + return Object.keys(this.eventMap).length; + } + + } + /** + * The `Listener` class represents a single event listener object. Such objects keep all relevant + * contextual information such as the event being listened to, the object the listener was attached + * to, the callback function and so on. + * + */ + + class Listener { + /** + * Creates a new `Listener` object + * + * @param {string|Symbol} event The event being listened to + * @param {EventEmitter} target The [`EventEmitter`]{@link EventEmitter} object that the listener + * is attached to. + * @param {EventEmitter~callback} callback The function to call when the listener is triggered + * @param {Object} [options={}] + * @param {Object} [options.context=target] The context to invoke the listener in (a.k.a. the + * value of `this` inside the callback function). + * @param {number} [options.remaining=Infinity] The remaining number of times after which the + * callback should automatically be removed. + * @param {array} [options.arguments] An array of arguments that will be passed separately to the + * callback function upon execution. The array is stored in the [`arguments`]{@link #arguments} + * property and can be retrieved or modified as desired. + * + * @throws {TypeError} The `event` parameter must be a string or + * [`EventEmitter.ANY_EVENT`]{@link EventEmitter#ANY_EVENT}. + * @throws {ReferenceError} The `target` parameter is mandatory. + * @throws {TypeError} The `callback` must be a function. + */ + constructor(event, target, callback, options = {}) { + if (typeof event !== "string" && !(event instanceof String) && event !== EventEmitter.ANY_EVENT) { + throw new TypeError("The 'event' parameter must be a string or EventEmitter.ANY_EVENT."); + } + + if (!target) { + throw new ReferenceError("The 'target' parameter is mandatory."); + } + + if (typeof callback !== "function") { + throw new TypeError("The 'callback' must be a function."); + } // Convert single value argument to array + + + if (options.arguments !== undefined && !Array.isArray(options.arguments)) { + options.arguments = [options.arguments]; + } // Define default options and merge declared options into them, + + + options = Object.assign({ + context: target, + remaining: Infinity, + arguments: undefined, + duration: Infinity + }, options); // Make sure it is eventually deleted if a duration is supplied + + if (options.duration !== Infinity) { + setTimeout(() => this.remove(), options.duration); + } + /** + * An array of arguments to pass to the callback function upon execution. + * @type {array} + */ + + + this.arguments = options.arguments; + /** + * The callback function to execute. + * @type {Function} + */ + + this.callback = callback; + /** + * The context to execute the callback function in (a.k.a. the value of `this` inside the + * callback function) + * @type {Object} + */ + + this.context = options.context; + /** + * The number of times the listener function was executed. + * @type {number} + */ + + this.count = 0; + /** + * The event name. + * @type {string} + */ + + this.event = event; + /** + * The remaining number of times after which the callback should automatically be removed. + * @type {number} + */ + + this.remaining = parseInt(options.remaining) >= 1 ? parseInt(options.remaining) : Infinity; + /** + * Whether this listener is currently suspended or not. + * @type {boolean} + */ + + this.suspended = false; + /** + * The object that the event is attached to (or that emitted the event). + * @type {EventEmitter} + */ + + this.target = target; + } + /** + * Removes the listener from its target. + */ + + + remove() { + this.target.removeListener(this.event, this.callback, { + context: this.context, + remaining: this.remaining + }); + } + + } + + /** + * The `Enumerations` class contains enumerations and arrays of elements used throughout the + * library. All properties are static and should be referenced using the class name. For example: + * `Enumerations.MIDI_CHANNEL_MESSAGES`. + * + * @license Apache-2.0 + * @since 3.0.0 + */ + class Enumerations { + /** + * Enumeration of all MIDI channel message names and their associated 4-bit numerical value: + * + * | Message Name | Hexadecimal | Decimal | + * |---------------------|-------------|---------| + * | `noteoff` | 0x8 | 8 | + * | `noteon` | 0x9 | 9 | + * | `keyaftertouch` | 0xA | 10 | + * | `controlchange` | 0xB | 11 | + * | `programchange` | 0xC | 12 | + * | `channelaftertouch` | 0xD | 13 | + * | `pitchbend` | 0xE | 14 | + * + * @enum {Object.} + * @readonly + * @static + */ + static get MIDI_CHANNEL_MESSAGES() { + return { + noteoff: 0x8, + // 8 + noteon: 0x9, + // 9 + keyaftertouch: 0xA, + // 10 + controlchange: 0xB, + // 11 + programchange: 0xC, + // 12 + channelaftertouch: 0xD, + // 13 + pitchbend: 0xE // 14 + + }; + } + /** + * A simple array of the 16 valid MIDI channel numbers (`1` to `16`): + * + * @type {number[]} + * @readonly + * @static + */ + + + static get MIDI_CHANNEL_NUMBERS() { + return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + } + /** + * Enumeration of all MIDI channel mode message names and their associated numerical value: + * + * + * | Message Name | Hexadecimal | Decimal | + * |-----------------------|-------------|---------| + * | `allsoundoff` | 0x78 | 120 | + * | `resetallcontrollers` | 0x79 | 121 | + * | `localcontrol` | 0x7A | 122 | + * | `allnotesoff` | 0x7B | 123 | + * | `omnimodeoff` | 0x7C | 124 | + * | `omnimodeon` | 0x7D | 125 | + * | `monomodeon` | 0x7E | 126 | + * | `polymodeon` | 0x7F | 127 | + * + * @enum {Object.} + * @readonly + * @static + */ + + + static get MIDI_CHANNEL_MODE_MESSAGES() { + return { + allsoundoff: 120, + resetallcontrollers: 121, + localcontrol: 122, + allnotesoff: 123, + omnimodeoff: 124, + omnimodeon: 125, + monomodeon: 126, + polymodeon: 127 + }; + } + /** + * Enumeration of all control change messages identifying the control function associated to its + * control number. + * + * Not all numbers have a preassigned control function. For those that don't, the control function + * is identified as the word "controller" followed by the number (e.g. `controller123`). + * + * | Control Function | Control Number | + * |--------------------------------|----------------| + * | `bankselectcoarse` | 0 | + * | `modulationwheelcoarse` | 1 | + * | `breathcontrollercoarse` | 2 | + * | `controller3` | 3 | + * | `footcontrollercoarse` | 4 | + * | `portamentotimecoarse` | 5 | + * | `dataentrycoarse` | 6 | + * | `volumecoarse` | 7 | + * | `balancecoarse` | 8 | + * | `controller9` | 9 | + * | `pancoarse` | 10 | + * | `expressioncoarse` | 11 | + * | `effectcontrol1coarse` | 12 | + * | `effectcontrol2coarse` | 13 | + * | `controller14` | 14 | + * | `controller15` | 15 | + * | `generalpurposeslider1` | 16 | + * | `generalpurposeslider2` | 17 | + * | `generalpurposeslider3` | 18 | + * | `generalpurposeslider4` | 19 | + * | `controller20` | 20 | + * | `controller21` | 21 | + * | `controller22` | 22 | + * | `controller23` | 23 | + * | `controller24` | 24 | + * | `controller25` | 25 | + * | `controller26` | 26 | + * | `controller27` | 27 | + * | `controller28` | 28 | + * | `controller29` | 29 | + * | `controller30` | 30 | + * | `controller31` | 31 | + * | `bankselectfine` | 32 | + * | `modulationwheelfine` | 33 | + * | `breathcontrollerfine` | 34 | + * | `controller35` | 35 | + * | `footcontrollerfine` | 36 | + * | `portamentotimefine` | 37 | + * | `dataentryfine` | 38 | + * | `volumefine` | 39 | + * | `balancefine` | 40 | + * | `controller41` | 41 | + * | `panfine` | 42 | + * | `expressionfine` | 43 | + * | `effectcontrol1fine` | 44 | + * | `effectcontrol2fine` | 45 | + * | `controller46` | 46 | + * | `controller47` | 47 | + * | `controller48` | 48 | + * | `controller49` | 49 | + * | `controller50` | 50 | + * | `controller51` | 51 | + * | `controller52` | 52 | + * | `controller53` | 53 | + * | `controller54` | 54 | + * | `controller55` | 55 | + * | `controller56` | 56 | + * | `controller57` | 57 | + * | `controller58` | 58 | + * | `controller59` | 59 | + * | `controller60` | 60 | + * | `controller61` | 61 | + * | `controller62` | 62 | + * | `controller63` | 63 | + * | `holdpedal` | 64 | + * | `portamento` | 65 | + * | `sustenutopedal` | 66 | + * | `softpedal` | 67 | + * | `legatopedal` | 68 | + * | `hold2pedal` | 69 | + * | `soundvariation` | 70 | + * | `resonance` | 71 | + * | `soundreleasetime` | 72 | + * | `soundattacktime` | 73 | + * | `brightness` | 74 | + * | `soundcontrol6` | 75 | + * | `soundcontrol7` | 76 | + * | `soundcontrol8` | 77 | + * | `soundcontrol9` | 78 | + * | `soundcontrol10` | 79 | + * | `generalpurposebutton1` | 80 | + * | `generalpurposebutton2` | 81 | + * | `generalpurposebutton3` | 82 | + * | `generalpurposebutton4` | 83 | + * | `controller84` | 84 | + * | `controller85` | 85 | + * | `controller86` | 86 | + * | `controller87` | 87 | + * | `controller88` | 88 | + * | `controller89` | 89 | + * | `controller90` | 90 | + * | `reverblevel` | 91 | + * | `tremololevel` | 92 | + * | `choruslevel` | 93 | + * | `celestelevel` | 94 | + * | `phaserlevel` | 95 | + * | `databuttonincrement` | 96 | + * | `databuttondecrement` | 97 | + * | `nonregisteredparametercoarse` | 98 | + * | `nonregisteredparameterfine` | 99 | + * | `registeredparametercoarse` | 100 | + * | `registeredparameterfine` | 101 | + * | `controller102` | 102 | + * | `controller103` | 103 | + * | `controller104` | 104 | + * | `controller105` | 105 | + * | `controller106` | 106 | + * | `controller107` | 107 | + * | `controller108` | 108 | + * | `controller109` | 109 | + * | `controller110` | 110 | + * | `controller111` | 111 | + * | `controller112` | 112 | + * | `controller113` | 113 | + * | `controller114` | 114 | + * | `controller115` | 115 | + * | `controller116` | 116 | + * | `controller117` | 117 | + * | `controller118` | 118 | + * | `controller119` | 119 | + * | `allsoundoff` | 120 | + * | `resetallcontrollers` | 121 | + * | `localcontrol` | 122 | + * | `allnotesoff` | 123 | + * | `omnimodeoff` | 124 | + * | `omnimodeon` | 125 | + * | `monomodeon` | 126 | + * | `polymodeon` | 127 | + * + * @enum {Object.} + * @readonly + * @static + */ + + + static get MIDI_CONTROL_CHANGE_MESSAGES() { + return { + bankselectcoarse: 0, + modulationwheelcoarse: 1, + breathcontrollercoarse: 2, + controller3: 3, + footcontrollercoarse: 4, + portamentotimecoarse: 5, + dataentrycoarse: 6, + volumecoarse: 7, + balancecoarse: 8, + controller9: 9, + pancoarse: 10, + expressioncoarse: 11, + effectcontrol1coarse: 12, + effectcontrol2coarse: 13, + controller14: 14, + controller15: 15, + generalpurposeslider1: 16, + generalpurposeslider2: 17, + generalpurposeslider3: 18, + generalpurposeslider4: 19, + controller20: 20, + controller21: 21, + controller22: 22, + controller23: 23, + controller24: 24, + controller25: 25, + controller26: 26, + controller27: 27, + controller28: 28, + controller29: 29, + controller30: 30, + controller31: 31, + bankselectfine: 32, + modulationwheelfine: 33, + breathcontrollerfine: 34, + controller35: 35, + footcontrollerfine: 36, + portamentotimefine: 37, + dataentryfine: 38, + volumefine: 39, + balancefine: 40, + controller41: 41, + panfine: 42, + expressionfine: 43, + effectcontrol1fine: 44, + effectcontrol2fine: 45, + controller46: 46, + controller47: 47, + controller48: 48, + controller49: 49, + controller50: 50, + controller51: 51, + controller52: 52, + controller53: 53, + controller54: 54, + controller55: 55, + controller56: 56, + controller57: 57, + controller58: 58, + controller59: 59, + controller60: 60, + controller61: 61, + controller62: 62, + controller63: 63, + holdpedal: 64, + portamento: 65, + sustenutopedal: 66, + softpedal: 67, + legatopedal: 68, + hold2pedal: 69, + soundvariation: 70, + resonance: 71, + soundreleasetime: 72, + soundattacktime: 73, + brightness: 74, + soundcontrol6: 75, + soundcontrol7: 76, + soundcontrol8: 77, + soundcontrol9: 78, + soundcontrol10: 79, + generalpurposebutton1: 80, + generalpurposebutton2: 81, + generalpurposebutton3: 82, + generalpurposebutton4: 83, + controller84: 84, + controller85: 85, + controller86: 86, + controller87: 87, + controller88: 88, + controller89: 89, + controller90: 90, + reverblevel: 91, + tremololevel: 92, + choruslevel: 93, + celestelevel: 94, + phaserlevel: 95, + databuttonincrement: 96, + databuttondecrement: 97, + nonregisteredparametercoarse: 98, + nonregisteredparameterfine: 99, + registeredparametercoarse: 100, + registeredparameterfine: 101, + controller102: 102, + controller103: 103, + controller104: 104, + controller105: 105, + controller106: 106, + controller107: 107, + controller108: 108, + controller109: 109, + controller110: 110, + controller111: 111, + controller112: 112, + controller113: 113, + controller114: 114, + controller115: 115, + controller116: 116, + controller117: 117, + controller118: 118, + controller119: 119, + allsoundoff: 120, + resetallcontrollers: 121, + localcontrol: 122, + allnotesoff: 123, + omnimodeoff: 124, + omnimodeon: 125, + monomodeon: 126, + polymodeon: 127 + }; + } + /** + * Enumeration of all MIDI registered parameters and their associated pair of numerical values. + * MIDI registered parameters extend the original list of control change messages. Currently, + * there are only a limited number of them: + * + * + * | Control Function | [LSB, MSB] | + * |------------------------------|--------------| + * | `pitchbendrange` | [0x00, 0x00] | + * | `channelfinetuning` | [0x00, 0x01] | + * | `channelcoarsetuning` | [0x00, 0x02] | + * | `tuningprogram` | [0x00, 0x03] | + * | `tuningbank` | [0x00, 0x04] | + * | `modulationrange` | [0x00, 0x05] | + * | `azimuthangle` | [0x3D, 0x00] | + * | `elevationangle` | [0x3D, 0x01] | + * | `gain` | [0x3D, 0x02] | + * | `distanceratio` | [0x3D, 0x03] | + * | `maximumdistance` | [0x3D, 0x04] | + * | `maximumdistancegain` | [0x3D, 0x05] | + * | `referencedistanceratio` | [0x3D, 0x06] | + * | `panspreadangle` | [0x3D, 0x07] | + * | `rollangle` | [0x3D, 0x08] | + * + * @enum {Object.} + * @readonly + * @static + */ + + + static get MIDI_REGISTERED_PARAMETERS() { + return { + pitchbendrange: [0x00, 0x00], + channelfinetuning: [0x00, 0x01], + channelcoarsetuning: [0x00, 0x02], + tuningprogram: [0x00, 0x03], + tuningbank: [0x00, 0x04], + modulationrange: [0x00, 0x05], + azimuthangle: [0x3D, 0x00], + elevationangle: [0x3D, 0x01], + gain: [0x3D, 0x02], + distanceratio: [0x3D, 0x03], + maximumdistance: [0x3D, 0x04], + maximumdistancegain: [0x3D, 0x05], + referencedistanceratio: [0x3D, 0x06], + panspreadangle: [0x3D, 0x07], + rollangle: [0x3D, 0x08] + }; + } + /** + * Enumeration of all valid MIDI system messages and matching numerical values. WebMidi.js also + * uses two additional custom messages. + * + * **System Common Messages** + * + * | Function | Hexadecimal | Decimal | + * |------------------------|-------------|---------| + * | `sysex` | 0xF0 | 240 | + * | `timecode` | 0xF1 | 241 | + * | `songposition` | 0xF2 | 242 | + * | `songselect` | 0xF3 | 243 | + * | `tunerequest` | 0xF6 | 246 | + * | `sysexend` | 0xF7 | 247 | + * + * The `sysexend` message is never actually received. It simply ends a sysex stream. + * + * **System Real-Time Messages** + * + * | Function | Hexadecimal | Decimal | + * |------------------------|-------------|---------| + * | `clock` | 0xF8 | 248 | + * | `start` | 0xFA | 250 | + * | `continue` | 0xFB | 251 | + * | `stop` | 0xFC | 252 | + * | `activesensing` | 0xFE | 254 | + * | `reset` | 0xFF | 255 | + * + * Values 249 and 253 are relayed by the + * [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web_MIDI_API) but they do not + * serve any specific purpose. The + * [MIDI 1.0 spec](https://www.midi.org/specifications/item/table-1-summary-of-midi-message) + * simply states that they are undefined/reserved. + * + * **Custom WebMidi.js Messages** + * + * These two messages are mostly for internal use. They are not MIDI messages and cannot be sent + * or forwarded. + * + * | Function | Hexadecimal | Decimal | + * |------------------------|-------------|---------| + * | `midimessage` | | 0 | + * | `unknownsystemmessage` | | -1 | + * + * @enum {Object.} + * @readonly + * @static + */ + + + static get MIDI_SYSTEM_MESSAGES() { + return { + // System common messages + sysex: 0xF0, + // 240 + timecode: 0xF1, + // 241 + songposition: 0xF2, + // 242 + songselect: 0xF3, + // 243 + tunerequest: 0xF6, + // 246 + tuningrequest: 0xF6, + // for backwards-compatibility (deprecated in version 3.0) + sysexend: 0xF7, + // 247 (never actually received - simply ends a sysex) + // System real-time messages + clock: 0xF8, + // 248 + start: 0xFA, + // 250 + continue: 0xFB, + // 251 + stop: 0xFC, + // 252 + activesensing: 0xFE, + // 254 + reset: 0xFF, + // 255 + // Custom WebMidi.js messages + midimessage: 0, + unknownsystemmessage: -1 + }; + } + /** + * Array of channel-specific event names that can be listened for. This includes channel mode + * events and RPN/NRPN events. + * + * @type {string[]} + * @readonly + */ + + + static get CHANNEL_EVENTS() { + return [// MIDI channel message events + "noteoff", "controlchange", "noteon", "keyaftertouch", "programchange", "channelaftertouch", "pitchbend", // MIDI channel mode events + "allnotesoff", "allsoundoff", "localcontrol", "monomode", "omnimode", "resetallcontrollers", // RPN/NRPN events + "nrpn", "nrpn-dataentrycoarse", "nrpn-dataentryfine", "nrpn-databuttonincrement", "nrpn-databuttondecrement", "rpn", "rpn-dataentrycoarse", "rpn-dataentryfine", "rpn-databuttonincrement", "rpn-databuttondecrement"]; + } + + } + + /** + * The `Note` class represents a single musical note such as `"D3"`, `"G#4"`, `"F-1"`, `"Gb7"`, etc. + * + * `Note` objects can be played back on a single channel by calling + * [`OutputChannel.playNote()`]{@link OutputChannel#playNote} or, on multiple channels of the same + * output, by calling [`Output.playNote()`]{@link Output#playNote}. + * + * The note has [`attack`](#attack) and [`release`](#release) velocities set at `0.5` by default. + * These can be changed by passing in the appropriate option. It is also possible to set a + * system-wide default for attack and release velocities by using the + * [`WebMidi.defaults`](WebMidi#defaults) property. + * + * If you prefer to work with raw MIDI values (`0` to `127`), you can use [`rawAttack`](#rawAttack) and + * [`rawRelease`](#rawRelease) to both get and set the values. + * + * The note may have a [`duration`](#duration). If it does, playback will be automatically stopped + * when the duration has elapsed by sending a `"noteoff"` event. By default, the duration is set to + * `Infinity`. In this case, it will never stop playing unless explicitly stopped by calling a + * method such as [`OutputChannel.stopNote()`]{@link OutputChannel#stopNote}, + * [`Output.stopNote()`]{@link Output#stopNote} or similar. + * + * @license Apache-2.0 + * @since 3.0.0 + */ + + class TS_WebMIDI_Note { + /** + * Creates a `Note` object. + * + * @param value {string|number} The value used to create the note. If an identifier string is used, + * it must start with the note letter, optionally followed by an accidental and followed by the + * octave number (`"C3"`, `"G#4"`, `"F-1"`, `"Db7"`, etc.). If a number is used, it must be an + * integer between 0 and 127. In this case, middle C is considered to be C4 (note number 60). + * + * @param {object} [options={}] + * + * @param {number} [options.duration=Infinity] The number of milliseconds before the note should be + * explicitly stopped. + * + * @param {number} [options.attack=0.5] The note's attack velocity as a float between 0 and 1. If + * you wish to use an integer between 0 and 127, use the `rawAttack` option instead. If both + * `attack` and `rawAttack` are specified, the latter has precedence. + * + * @param {number} [options.release=0.5] The note's release velocity as a float between 0 and 1. If + * you wish to use an integer between 0 and 127, use the `rawRelease` option instead. If both + * `release` and `rawRelease` are specified, the latter has precedence. + * + * @param {number} [options.rawAttack=64] The note's attack velocity as an integer between 0 and + * 127. If you wish to use a float between 0 and 1, use the `release` option instead. If both + * `attack` and `rawAttack` are specified, the latter has precedence. + * + * @param {number} [options.rawRelease=64] The note's release velocity as an integer between 0 and + * 127. If you wish to use a float between 0 and 1, use the `release` option instead. If both + * `release` and `rawRelease` are specified, the latter has precedence. + * + * @throws {Error} Invalid note identifier + * @throws {RangeError} Invalid name value + * @throws {RangeError} Invalid accidental value + * @throws {RangeError} Invalid octave value + * @throws {RangeError} Invalid duration value + * @throws {RangeError} Invalid attack value + * @throws {RangeError} Invalid release value + */ + constructor(value, options = {}) { + // Assign property defaults + this.duration = wm.defaults.note.duration; + this.attack = wm.defaults.note.attack; + this.release = wm.defaults.note.release; // Assign property values from options (validation occurs in setter) + + if (options.duration != undefined) this.duration = options.duration; + if (options.attack != undefined) this.attack = options.attack; + if (options.rawAttack != undefined) this.attack = Utilities.from7bitToFloat(options.rawAttack); + if (options.release != undefined) this.release = options.release; + + if (options.rawRelease != undefined) { + this.release = Utilities.from7bitToFloat(options.rawRelease); + } // Assign note depending on the way it was specified (name or number) + + + if (Number.isInteger(value)) { + this.identifier = Utilities.toNoteIdentifier(value); + } else { + this.identifier = value; + } + } + /** + * The name, optional accidental and octave of the note, as a string. + * @type {string} + * @since 3.0.0 + */ + + + get identifier() { + return this._name + (this._accidental || "") + this._octave; + } + + set identifier(value) { + const fragments = Utilities.getNoteDetails(value); + + if (wm.validation) { + if (!value) throw new Error("Invalid note identifier"); + } + + this._name = fragments.name; + this._accidental = fragments.accidental; + this._octave = fragments.octave; + } + /** + * The name (letter) of the note + * @type {string} + * @since 3.0.0 + */ + + + get name() { + return this._name; + } + + set name(value) { + if (wm.validation) { + value = value.toUpperCase(); + + if (!["C", "D", "E", "F", "G", "A", "B"].includes(value)) { + throw new Error("Invalid name value"); + } + } + + this._name = value; + } + /** + * The accidental (#, ##, b or bb) of the note. + * @type {string} + * @since 3.0.0 + */ + + + get accidental() { + return this._accidental; + } + + set accidental(value) { + if (wm.validation) { + value = value.toLowerCase(); + if (!["#", "##", "b", "bb"].includes(value)) throw new Error("Invalid accidental value"); + } + + this._accidental = value; + } + /** + * The octave of the note. + * @type {number} + * @since 3.0.0 + */ + + + get octave() { + return this._octave; + } + + set octave(value) { + if (wm.validation) { + value = parseInt(value); + if (isNaN(value)) throw new Error("Invalid octave value"); + } + + this._octave = value; + } + /** + * The duration of the note as a positive decimal number representing the number of milliseconds + * that the note should play for. + * + * @type {number} + * @since 3.0.0 + */ + + + get duration() { + return this._duration; + } + + set duration(value) { + if (wm.validation) { + value = parseFloat(value); + + if (isNaN(value) || value === null || value < 0) { + throw new RangeError("Invalid duration value."); + } + } + + this._duration = value; + } + /** + * The attack velocity of the note as an integer between 0 and 1. + * @type {number} + * @since 3.0.0 + */ + + + get attack() { + return this._attack; + } + + set attack(value) { + if (wm.validation) { + value = parseFloat(value); + + if (isNaN(value) || !(value >= 0 && value <= 1)) { + throw new RangeError("Invalid attack value."); + } + } + + this._attack = value; + } + /** + * The release velocity of the note as an integer between 0 and 1. + * @type {number} + * @since 3.0.0 + */ + + + get release() { + return this._release; + } + + set release(value) { + if (wm.validation) { + value = parseFloat(value); + + if (isNaN(value) || !(value >= 0 && value <= 1)) { + throw new RangeError("Invalid release value."); + } + } + + this._release = value; + } + /** + * The attack velocity of the note as a positive integer between 0 and 127. + * @type {number} + * @since 3.0.0 + */ + + + get rawAttack() { + return Utilities.fromFloatTo7Bit(this._attack); + } + + set rawAttack(value) { + this._attack = Utilities.from7bitToFloat(value); + } + /** + * The release velocity of the note as a positive integer between 0 and 127. + * @type {number} + * @since 3.0.0 + */ + + + get rawRelease() { + return Utilities.fromFloatTo7Bit(this._release); + } + + set rawRelease(value) { + this._release = Utilities.from7bitToFloat(value); + } + /** + * The MIDI number of the note (`0` - `127`). This number is derived from the note identifier + * using C4 as a reference for middle C. + * + * @type {number} + * @readonly + * @since 3.0.0 + */ + + + get number() { + return Utilities.toNoteNumber(this.identifier); + } + /** + * Returns a MIDI note number offset by octave and/or semitone. If the calculated value is less + * than 0, 0 will be returned. If the calculated value is more than 127, 127 will be returned. If + * an invalid value is supplied, 0 will be used. + * + * @param [octaveOffset] {number} An integer to offset the note number by octave. + * @param [semitoneOffset] {number} An integer to offset the note number by semitone. + * @returns {number} An integer between 0 and 127 + */ + + + getOffsetNumber(octaveOffset = 0, semitoneOffset = 0) { + if (wm.validation) { + octaveOffset = parseInt(octaveOffset) || 0; + semitoneOffset = parseInt(semitoneOffset) || 0; + } + + return Math.min(Math.max(this.number + octaveOffset * 12 + semitoneOffset, 0), 127); + } + + } + + /** + * The `Utilities` class contains general-purpose utility methods. All methods are static and + * should be called using the class name. For example: `Utilities.getNoteDetails("C4")`. + * + * @license Apache-2.0 + * @since 3.0.0 + */ + + class Utilities { + /** + * Returns a MIDI note number matching the identifier passed in the form of a string. The + * identifier must include the octave number. The identifier also optionally include a sharp (#), + * a double sharp (##), a flat (b) or a double flat (bb) symbol. For example, these are all valid + * identifiers: C5, G4, D#-1, F0, Gb7, Eb-1, Abb4, B##6, etc. + * + * When converting note identifiers to numbers, C4 is considered to be middle C (MIDI note number + * 60) as per the scientific pitch notation standard. + * + * The resulting note number can be offset by using the `octaveOffset` parameter. + * + * @param identifier {string} The identifier in the form of a letter, followed by an optional "#", + * "##", "b" or "bb" followed by the octave number. For exemple: C5, G4, D#-1, F0, Gb7, Eb-1, + * Abb4, B##6, etc. + * + * @param {number} [octaveOffset=0] A integer to offset the octave by. + * + * @returns {number} The MIDI note number (an integer between 0 and 127). + * + * @throws RangeError Invalid 'octaveOffset' value + * + * @throws TypeError Invalid note identifier + * + * @license Apache-2.0 + * @since 3.0.0 + * @static + */ + static toNoteNumber(identifier, octaveOffset = 0) { + // Validation + octaveOffset = octaveOffset == undefined ? 0 : parseInt(octaveOffset); + if (isNaN(octaveOffset)) throw new RangeError("Invalid 'octaveOffset' value"); + if (typeof identifier !== "string") identifier = ""; + const fragments = this.getNoteDetails(identifier); + if (!fragments) throw new TypeError("Invalid note identifier"); + const notes = { + C: 0, + D: 2, + E: 4, + F: 5, + G: 7, + A: 9, + B: 11 + }; + let result = (fragments.octave + 1 + octaveOffset) * 12; + result += notes[fragments.name]; + + if (fragments.accidental) { + if (fragments.accidental.startsWith("b")) { + result -= fragments.accidental.length; + } else { + result += fragments.accidental.length; + } + } + + if (result < 0 || result > 127) throw new RangeError("Invalid octaveOffset value"); + return result; + } + /** + * Given a proper note identifier (`C#4`, `Gb-1`, etc.) or a valid MIDI note number (0-127), this + * method returns an object containing broken down details about the specified note (uppercase + * letter, accidental and octave). + * + * When a number is specified, the translation to note is done using a value of 60 for middle C + * (C4 = middle C). + * + * @param value {string|number} A note identifier A atring ("C#4", "Gb-1", etc.) or a MIDI note + * number (0-127). + * + * @returns {{accidental: string, identifier: string, name: string, octave: number }} + * + * @throws TypeError Invalid note identifier + * + * @since 3.0.0 + * @static + */ + + + static getNoteDetails(value) { + if (Number.isInteger(value)) value = this.toNoteIdentifier(value); + const matches = value.match(/^([CDEFGAB])(#{0,2}|b{0,2})(-?\d+)$/i); + if (!matches) throw new TypeError("Invalid note identifier"); + const name = matches[1].toUpperCase(); + const octave = parseInt(matches[3]); + let accidental = matches[2].toLowerCase(); + accidental = accidental === "" ? undefined : accidental; + const fragments = { + accidental: accidental, + identifier: name + (accidental || "") + octave, + name: name, + octave: octave + }; + return fragments; + } + /** + * Returns a sanitized array of valid MIDI channel numbers (1-16). The parameter should be a + * single integer or an array of integers. + * + * For backwards-compatibility, passing `undefined` as a parameter to this method results in all + * channels being returned (1-16). Otherwise, parameters that cannot successfully be parsed to + * integers between 1 and 16 are silently ignored. + * + * @param [channel] {number|number[]} An integer or an array of integers to parse as channel + * numbers. + * + * @returns {number[]} An array of 0 or more valid MIDI channel numbers. + * + * @since 3.0.0 + * @static + */ + + + static sanitizeChannels(channel) { + let channels; + + if (this.validation) { + if (channel === "all") { + // backwards-compatibility + channels = ["all"]; + } else if (channel === "none") { + // backwards-compatibility + return []; + } + } + + if (!Array.isArray(channel)) { + channels = [channel]; + } else { + channels = channel; + } // In order to preserve backwards-compatibility, we let this assignment as it is. + + + if (channels.indexOf("all") > -1) { + channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return channels.map(function (ch) { + return parseInt(ch); + }).filter(function (ch) { + return ch >= 1 && ch <= 16; + }); + } + /** + * Returns a valid timestamp, relative to the navigation start of the document, derived from the + * `time` parameter. If the parameter is a string starting with the "+" sign and followed by a + * number, the resulting timestamp will be the sum of the current timestamp plus that number. If + * the parameter is a positive number, it will be returned as is. Otherwise, false will be + * returned. + * + * @param [time] {number|string} The time string (e.g. `"+2000"`) or number to parse + * @return {number|false} A positive number or `false` (if the time cannot be converted) + * + * @since 3.0.0 + * @static + */ + + + static toTimestamp(time) { + let value = false; + const parsed = parseFloat(time); + if (isNaN(parsed)) return false; + + if (typeof time === "string" && time.substring(0, 1) === "+") { + if (parsed >= 0) value = wm.time + parsed; + } else { + if (parsed >= 0) value = parsed; + } + + return value; + } + /** + * Returns a valid MIDI note number (0-127) given the specified input. The input usually is a + * string containing a note identifier (`"C3"`, `"F#4"`, `"D-2"`, `"G8"`, etc.). If an integer + * between 0 and 127 is passed, it will simply be returned as is (for convenience). Other strings + * will be parsed for integer value, if possible. + * + * If the input is an identifier, the resulting note number is offset by the `octaveOffset` + * parameter. For example, if you pass in "C4" (note number 60) and the `octaveOffset` value is + * -2, the resulting MIDI note number will be 36. + * + * @param input {string|number} A string or number to extract the MIDI note number from. + * @param octaveOffset {number} An integer to offset the octave by + * + * @returns {number|false} A valid MIDI note number (0-127) or `false` if the input could not + * successfully be parsed to a note number. + * + * @since 3.0.0 + * @static + */ + + + static guessNoteNumber(input, octaveOffset) { + // Validate and, if necessary, assign default + octaveOffset = parseInt(octaveOffset) || 0; + let output = false; // Check input type + + if (Number.isInteger(input) && input >= 0 && input <= 127) { + // uint + output = parseInt(input); + } else if (parseInt(input) >= 0 && parseInt(input) <= 127) { + // float or uint as string + output = parseInt(input); + } else if (typeof input === "string" || input instanceof String) { + // string + try { + output = this.toNoteNumber(input.trim(), octaveOffset); + } catch (e) { + return false; + } + } + + return output; + } + /** + * Returns an identifier string representing a note name (with optional accidental) followed by an + * octave number. The octave can be offset by using the `octaveOffset` parameter. + * + * @param {number} number The MIDI note number to convert to a note identifier + * @param {number} octaveOffset An offset to apply to the resulting octave + * + * @returns {string} + * + * @throws RangeError Invalid note number + * @throws RangeError Invalid octaveOffset value + * + * @since 3.0.0 + * @static + */ + + + static toNoteIdentifier(number, octaveOffset) { + number = parseInt(number); + if (isNaN(number) || number < 0 || number > 127) throw new RangeError("Invalid note number"); + octaveOffset = octaveOffset == undefined ? 0 : parseInt(octaveOffset); + if (isNaN(octaveOffset)) throw new RangeError("Invalid octaveOffset value"); + const notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; + const octave = Math.floor(number / 12 - 1) + octaveOffset; + return notes[number % 12] + octave.toString(); + } + /** + * Converts the `input` parameter to a valid [`Note`]{@link Note} object. The input usually is an + * unsigned integer (0-127) or a note identifier (`"C4"`, `"G#5"`, etc.). If the input is a + * [`Note`]{@link Note} object, it will be returned as is. + * + * If the input is a note number or identifier, it is possible to specify options by providing the + * `options` parameter. + * + * @param [input] {number|string|Note} + * + * @param {object} [options={}] + * + * @param {number} [options.duration=Infinity] The number of milliseconds before the note should + * be explicitly stopped. + * + * @param {number} [options.attack=0.5] The note's attack velocity as a float between 0 and 1. If + * you wish to use an integer between 0 and 127, use the `rawAttack` option instead. If both + * `attack` and `rawAttack` are specified, the latter has precedence. + * + * @param {number} [options.release=0.5] The note's release velocity as a float between 0 and 1. If + * you wish to use an integer between 0 and 127, use the `rawRelease` option instead. If both + * `release` and `rawRelease` are specified, the latter has precedence. + * + * @param {number} [options.rawAttack=64] The note's attack velocity as an integer between 0 and + * 127. If you wish to use a float between 0 and 1, use the `release` option instead. If both + * `attack` and `rawAttack` are specified, the latter has precedence. + * + * @param {number} [options.rawRelease=64] The note's release velocity as an integer between 0 and + * 127. If you wish to use a float between 0 and 1, use the `release` option instead. If both + * `release` and `rawRelease` are specified, the latter has precedence. + * + * @param {number} [options.octaveOffset=0] An integer to offset the octave by. **This is only + * used when the input value is a note identifier.** + * + * @returns {TS_WebMIDI_Note} + * + * @throws TypeError The input could not be parsed to a note + * + * @since version 3.0.0 + * @static + */ + + + static buildNote(input, options = {}) { + options.octaveOffset = parseInt(options.octaveOffset) || 0; // If it's already a Note, we're done + + if (input instanceof TS_WebMIDI_Note) return input; + let number = this.guessNoteNumber(input, options.octaveOffset); + + if (number === false) { + // We use a comparison b/c the note can be 0 (which equates to false) + throw new TypeError(`The input could not be parsed as a note (${input})`); + } // If we got here, we have a proper note number. Before creating the new note, we strip out + // 'octaveOffset' because it has already been factored in when calling guessNoteNumber(). + + + options.octaveOffset = undefined; + return new TS_WebMIDI_Note(number, options); + } + /** + * Converts an input value, which can be an unsigned integer (0-127), a note identifier, a + * [`Note`]{@link TS_WebMIDI_Note} object or an array of the previous types, to an array of + * [`Note`]{@link Note} objects. + * + * [`Note`]{@link Note} objects are returned as is. For note numbers and identifiers, a + * [`Note`]{@link Note} object is created with the options specified. An error will be thrown when + * encountering invalid input. + * + * Note: if both the `attack` and `rawAttack` options are specified, the later has priority. The + * same goes for `release` and `rawRelease`. + * + * @param [notes] {number|string|Note|number[]|string[]|Note[]} + * + * @param {object} [options={}] + * + * @param {number} [options.duration=Infinity] The number of milliseconds before the note should + * be explicitly stopped. + * + * @param {number} [options.attack=0.5] The note's attack velocity as a float between 0 and 1. If + * you wish to use an integer between 0 and 127, use the `rawAttack` option instead. If both + * `attack` and `rawAttack` are specified, the latter has precedence. + * + * @param {number} [options.release=0.5] The note's release velocity as a float between 0 and 1. If + * you wish to use an integer between 0 and 127, use the `rawRelease` option instead. If both + * `release` and `rawRelease` are specified, the latter has precedence. + * + * @param {number} [options.rawAttack=64] The note's attack velocity as an integer between 0 and + * 127. If you wish to use a float between 0 and 1, use the `release` option instead. If both + * `attack` and `rawAttack` are specified, the latter has precedence. + * + * @param {number} [options.rawRelease=64] The note's release velocity as an integer between 0 and + * 127. If you wish to use a float between 0 and 1, use the `release` option instead. If both + * `release` and `rawRelease` are specified, the latter has precedence. + * + * @param {number} [options.octaveOffset=0] An integer to offset the octave by. **This is only + * used when the input value is a note identifier.** + * + * @returns {Note[]} + * + * @throws TypeError An element could not be parsed as a note. + * + * @since 3.0.0 + * @static + */ + + + static buildNoteArray(notes, options = {}) { + let result = []; + if (!Array.isArray(notes)) notes = [notes]; + notes.forEach(note => { + result.push(this.buildNote(note, options)); + }); + return result; + } + /** + * Returns a number between 0 and 1 representing the ratio of the input value divided by 127 (7 + * bit). The returned value is restricted between 0 and 1 even if the input is greater than 127 or + * smaller than 0. + * + * Passing `Infinity` will return `1` and passing `-Infinity` will return `0`. Otherwise, when the + * input value cannot be converted to an integer, the method returns 0. + * + * @param value {number} A positive integer between 0 and 127 (inclusive) + * @returns {number} A number between 0 and 1 (inclusive) + * @static + */ + + + static from7bitToFloat(value) { + if (value === Infinity) value = 127; + value = parseInt(value) || 0; + return Math.min(Math.max(value / 127, 0), 1); + } + /** + * Returns an integer between 0 and 127 which is the result of multiplying the input value by + * 127. The input value should be a number between 0 and 1 (inclusively). The returned value is + * restricted between 0 and 127 even if the input is greater than 1 or smaller than 0. + * + * Passing `Infinity` will return `127` and passing `-Infinity` will return `0`. Otherwise, when + * the input value cannot be converted to a number, the method returns 0. + * + * @param value {number} A positive float between 0 and 1 (inclusive) + * @returns {number} A number between 0 and 127 (inclusive) + * @static + */ + + + static fromFloatTo7Bit(value) { + if (value === Infinity) value = 1; + value = parseFloat(value) || 0; + return Math.min(Math.max(Math.round(value * 127), 0), 127); + } + /** + * Combines and converts MSB and LSB values (0-127) to a float between 0 and 1. The returned value + * is within between 0 and 1 even if the result is greater than 1 or smaller than 0. + * + * @param msb {number} The most significant byte as a integer between 0 and 127. + * @param [lsb=0] {number} The least significant byte as a integer between 0 and 127. + * @returns {number} A float between 0 and 1. + */ + + + static fromMsbLsbToFloat(msb, lsb = 0) { + if (wm.validation) { + msb = Math.min(Math.max(parseInt(msb) || 0, 0), 127); + lsb = Math.min(Math.max(parseInt(lsb) || 0, 0), 127); + } + + const value = ((msb << 7) + lsb) / 16383; + return Math.min(Math.max(value, 0), 1); + } + /** + * Extracts 7bit MSB and LSB values from the supplied float. + * + * @param value {number} A float between 0 and 1 + * @returns {{lsb: number, msb: number}} + */ + + + static fromFloatToMsbLsb(value) { + if (wm.validation) { + value = Math.min(Math.max(parseFloat(value) || 0, 0), 1); + } + + const multiplied = Math.round(value * 16383); + return { + msb: multiplied >> 7, + lsb: multiplied & 0x7F + }; + } + /** + * Returns the supplied MIDI note number offset by the requested octave and semitone values. If + * the calculated value is less than 0, 0 will be returned. If the calculated value is more than + * 127, 127 will be returned. If an invalid offset value is supplied, 0 will be used. + * + * @param number {number} The MIDI note to offset as an integer between 0 and 127. + * @param octaveOffset {number} An integer to offset the note by (in octave) + * @param octaveOffset {number} An integer to offset the note by (in semitones) + * @returns {number} An integer between 0 and 127 + * + * @throws {Error} Invalid note number + * @static + */ + + + static offsetNumber(number, octaveOffset = 0, semitoneOffset = 0) { + if (wm.validation) { + number = parseInt(number); + if (isNaN(number)) throw new Error("Invalid note number"); + octaveOffset = parseInt(octaveOffset) || 0; + semitoneOffset = parseInt(semitoneOffset) || 0; + } + + return Math.min(Math.max(number + octaveOffset * 12 + semitoneOffset, 0), 127); + } + /** + * Returns the name of the first property of the supplied object whose value is equal to the one + * supplied. If nothing is found, `undefined` is returned. + * + * @param object {object} The object to look for the property in. + * @param value {*} Any value that can be expected to be found in the object's properties. + * @returns {string|undefined} The name of the matching property or `undefined` if nothing is + * found. + * @static + */ + + + static getPropertyByValue(object, value) { + return Object.keys(object).find(key => object[key] === value); + } + /** + * Returns the name of a control change message matching the specified number (0-127). Some valid + * control change numbers do not have a specific name or purpose assigned in the MIDI + * [spec](https://midi.org/specifications-old/item/table-3-control-change-messages-data-bytes-2). + * In these cases, the method returns `controllerXXX` (where XXX is the number). + * + * @param {number} number An integer (0-127) representing the control change message + * @returns {string|undefined} The matching control change name or `undefined` if no match was + * found. + * + * @static + */ + + + static getCcNameByNumber(number) { + return Utilities.getPropertyByValue(Enumerations.MIDI_CONTROL_CHANGE_MESSAGES, number); + } + /** + * Returns the channel mode name matching the specified number. If no match is found, the function + * returns `false`. + * + * @param {number} number An integer representing the channel mode message (120-127) + * @returns {string|false} The name of the matching channel mode or `false` if no match could be + * found. + * + * @since 2.0.0 + */ + + + static getChannelModeByNumber(number) { + if (!(number >= 120 && number <= 127)) return false; + + for (let cm in Enumerations.MIDI_CHANNEL_MODE_MESSAGES) { + if (Enumerations.MIDI_CHANNEL_MODE_MESSAGES.hasOwnProperty(cm) && number === Enumerations.MIDI_CHANNEL_MODE_MESSAGES[cm]) { + return cm; + } + } + + return false; + } + /** + * Indicates whether the execution environment is Node.js (`true`) or not (`false`) + * @type {boolean} + */ + + + static get isNode() { + return new Function("try { return this === global; } catch(e) { return false; }")(); + } + /** + * Indicates whether the execution environment is a browser (`true`) or not (`false`) + * @type {boolean} + */ + + + static get isBrowser() { + return new Function("try { return this === window; } catch(e) { return false; }")(); + } + + } + + /** + * The `OutputChannel` class represents a single output MIDI channel. `OutputChannel` objects are + * provided by an [`Output`](Output) port which, itself, is made available by a device. The + * `OutputChannel` object is derived from the host's MIDI subsystem and should not be instantiated + * directly. + * + * All 16 `OutputChannel` objects can be found inside the parent output's + * [`channels`]{@link Output#channels} property. + * + * @param {Output} output The [`Output`](Output) this channel belongs to. + * @param {number} number The MIDI channel number (`1` - `16`). + * + * @extends EventEmitter + * @license Apache-2.0 + * @since 3.0.0 + */ + + class OutputChannel extends EventEmitter { + /** + * Creates an `OutputChannel` object. + * + * @param {Output} output The [`Output`](Output) this channel belongs to. + * @param {number} number The MIDI channel number (`1` - `16`). + */ + constructor(output, number) { + super(); + /** + * @type {Output} + * @private + */ + + this._output = output; + /** + * @type {number} + * @private + */ + + this._number = number; + /** + * @type {number} + * @private + */ + + this._octaveOffset = 0; + } + /** + * Unlinks the MIDI subsystem, removes all listeners attached to the channel and nulls the channel + * number. This method is mostly for internal use. It has not been prefixed with an underscore + * since it is called by other objects such as the `Output` object. + * + * @private + */ + + + destroy() { + this._output = null; + this._number = null; + this._octaveOffset = 0; + this.removeListener(); + } + /** + * Sends a MIDI message on the MIDI output port. If no time is specified, the message will be + * sent immediately. The message should be an array of 8-bit unsigned integers (`0` - `225`), + * a + * [`Uint8Array`]{@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array} + * object or a [`Message`](Message) object. + * + * It is usually not necessary to use this method directly as you can use one of the simpler + * helper methods such as [`playNote()`](#playNote), [`stopNote()`](#stopNote), + * [`sendControlChange()`](#sendControlChange), etc. + * + * Details on the format of MIDI messages are available in the summary of + * [MIDI messages]{@link https://www.midi.org/specifications-old/item/table-1-summary-of-midi-message} + * from the MIDI Manufacturers Association. + * + * @param message {number[]|Uint8Array|Message} A `Message` object, an array of 8-bit unsigned + * integers or a `Uint8Array` object (not available in Node.js) containing the message bytes. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The first byte (status) must be an integer between 128 and 255. + * + * @throws {RangeError} Data bytes must be integers between 0 and 255. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + send(message, options = { + time: 0 + }) { + this.output.send(message, options); + return this; + } + /** + * Sends a MIDI **key aftertouch** message at the scheduled time. This is a key-specific + * aftertouch. For a channel-wide aftertouch message, use + * [`sendChannelAftertouch()`]{@link #sendChannelAftertouch}. + * + * @param target {number|Note|string|number[]|Note[]|string[]} The note(s) for which you are sending + * an aftertouch value. The notes can be specified by using a MIDI note number (`0` - `127`), a + * [`Note`](Note) object, a note identifier (e.g. `C3`, `G#4`, `F-1`, `Db7`) or an array of the + * previous types. When using a note identifier, octave range must be between `-1` and `9`. The + * lowest note is `C-1` (MIDI note number `0`) and the highest note is `G9` (MIDI note number + * `127`). + * + * When using a note identifier, the octave value will be offset by the local + * [`octaveOffset`](#octaveOffset) and by + * [`Output.octaveOffset`](Output#octaveOffset) and [`WebMidi.octaveOffset`](WebMidi#octaveOffset) + * (if those values are not `0`). When using a key number, `octaveOffset` values are ignored. + * + * @param [pressure=0.5] {number} The pressure level (between `0` and `1`). An invalid pressure + * value will silently trigger the default behaviour. If the `rawValue` option is set to `true`, + * the pressure is defined by using an integer between `0` and `127`. + * + * @param {object} [options={}] + * + * @param {boolean} [options.rawValue=false] A boolean indicating whether the value should be + * considered a float between `0` and `1.0` (default) or a raw integer between `0` and `127`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @return {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + * + * @throws RangeError Invalid key aftertouch value. + */ + + + sendKeyAftertouch(target, pressure, options = {}) { + if (wm.validation) { + // Legacy support + if (options.useRawValue) options.rawValue = options.useRawValue; + + if (isNaN(parseFloat(pressure))) { + throw new RangeError("Invalid key aftertouch value."); + } + + if (options.rawValue) { + if (!(pressure >= 0 && pressure <= 127 && Number.isInteger(pressure))) { + throw new RangeError("Key aftertouch raw value must be an integer between 0 and 127."); + } + } else { + if (!(pressure >= 0 && pressure <= 1)) { + throw new RangeError("Key aftertouch value must be a float between 0 and 1."); + } + } + } // Normalize pressure to integer + + + if (!options.rawValue) pressure = Utilities.fromFloatTo7Bit(pressure); // Plot total offset + + const offset = wm.octaveOffset + this.output.octaveOffset + this.octaveOffset; // Make sure we are dealing with an array + + if (!Array.isArray(target)) target = [target]; + Utilities.buildNoteArray(target).forEach(n => { + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.keyaftertouch << 4) + (this.number - 1), n.getOffsetNumber(offset), pressure], { + time: Utilities.toTimestamp(options.time) + }); + }); + return this; + } + /** + * Sends a MIDI **control change** message to the channel at the scheduled time. The control + * change message to send can be specified numerically (`0` to `127`) or by using one of the + * following common names: + * + * | Number | Name | + * |--------|-------------------------------| + * | 0 |`bankselectcoarse` | + * | 1 |`modulationwheelcoarse` | + * | 2 |`breathcontrollercoarse` | + * | 4 |`footcontrollercoarse` | + * | 5 |`portamentotimecoarse` | + * | 6 |`dataentrycoarse` | + * | 7 |`volumecoarse` | + * | 8 |`balancecoarse` | + * | 10 |`pancoarse` | + * | 11 |`expressioncoarse` | + * | 12 |`effectcontrol1coarse` | + * | 13 |`effectcontrol2coarse` | + * | 18 |`generalpurposeslider3` | + * | 19 |`generalpurposeslider4` | + * | 32 |`bankselectfine` | + * | 33 |`modulationwheelfine` | + * | 34 |`breathcontrollerfine` | + * | 36 |`footcontrollerfine` | + * | 37 |`portamentotimefine` | + * | 38 |`dataentryfine` | + * | 39 |`volumefine` | + * | 40 |`balancefine` | + * | 42 |`panfine` | + * | 43 |`expressionfine` | + * | 44 |`effectcontrol1fine` | + * | 45 |`effectcontrol2fine` | + * | 64 |`holdpedal` | + * | 65 |`portamento` | + * | 66 |`sustenutopedal` | + * | 67 |`softpedal` | + * | 68 |`legatopedal` | + * | 69 |`hold2pedal` | + * | 70 |`soundvariation` | + * | 71 |`resonance` | + * | 72 |`soundreleasetime` | + * | 73 |`soundattacktime` | + * | 74 |`brightness` | + * | 75 |`soundcontrol6` | + * | 76 |`soundcontrol7` | + * | 77 |`soundcontrol8` | + * | 78 |`soundcontrol9` | + * | 79 |`soundcontrol10` | + * | 80 |`generalpurposebutton1` | + * | 81 |`generalpurposebutton2` | + * | 82 |`generalpurposebutton3` | + * | 83 |`generalpurposebutton4` | + * | 91 |`reverblevel` | + * | 92 |`tremololevel` | + * | 93 |`choruslevel` | + * | 94 |`celestelevel` | + * | 95 |`phaserlevel` | + * | 96 |`databuttonincrement` | + * | 97 |`databuttondecrement` | + * | 98 |`nonregisteredparametercoarse` | + * | 99 |`nonregisteredparameterfine` | + * | 100 |`registeredparametercoarse` | + * | 101 |`registeredparameterfine` | + * | 120 |`allsoundoff` | + * | 121 |`resetallcontrollers` | + * | 122 |`localcontrol` | + * | 123 |`allnotesoff` | + * | 124 |`omnimodeoff` | + * | 125 |`omnimodeon` | + * | 126 |`monomodeon` | + * | 127 |`polymodeon` | + * + * As you can see above, not all control change message have a matching name. This does not mean + * you cannot use the others. It simply means you will need to use their number + * (`0` to `127`) instead of their name. While you can still use them, numbers `120` to `127` are + * usually reserved for *channel mode* messages. See + * [`sendChannelMode()`]{@link OutputChannel#sendChannelMode} method for more info. + * + * To view a detailed list of all available **control change** messages, please consult "Table 3 - + * Control Change Messages" from the [MIDI Messages]( + * https://www.midi.org/specifications/item/table-3-control-change-messages-data-bytes-2) + * specification. + * + * **Note**: messages #0-31 (MSB) are paired with messages #32-63 (LSB). For example, message #1 + * (`modulationwheelcoarse`) can be accompanied by a second control change message for + * `modulationwheelfine` to achieve a greater level of precision. if you want to specify both MSB + * and LSB for messages between `0` and `31`, you can do so by passing a 2-value array as the + * second parameter. + * + * @param {number|string} controller The MIDI controller name or number (`0` - `127`). + * + * @param {number|number[]} value The value to send (0-127). You can also use a two-position array + * for controllers 0 to 31. In this scenario, the first value will be sent as usual and the second + * value will be sent to the matching LSB controller (which is obtained by adding 32 to the first + * controller) + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} Controller numbers must be between 0 and 127. + * @throws {RangeError} Invalid controller name. + * @throws {TypeError} The value array must have a length of 2. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + * + * @license Apache-2.0 + * @since 3.0.0 + */ + + + sendControlChange(controller, value, options = {}) { + if (typeof controller === "string") { + controller = Enumerations.MIDI_CONTROL_CHANGE_MESSAGES[controller]; + } + + if (!Array.isArray(value)) value = [value]; + + if (wm.validation) { + if (controller === undefined) { + throw new TypeError("Control change must be identified with a valid name or an integer between 0 and 127."); + } + + if (!Number.isInteger(controller) || !(controller >= 0 && controller <= 127)) { + throw new TypeError("Control change number must be an integer between 0 and 127."); + } + + value = value.map(item => { + const output = Math.min(Math.max(parseInt(item), 0), 127); + if (isNaN(output)) throw new TypeError("Values must be integers between 0 and 127"); + return output; + }); + + if (value.length === 2 && controller >= 32) { + throw new TypeError("To use a value array, the controller must be between 0 and 31"); + } + } + + value.forEach((item, index) => { + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.controlchange << 4) + (this.number - 1), controller + index * 32, value[index]], { + time: Utilities.toTimestamp(options.time) + }); + }); + return this; + } + /** + * Selects a MIDI non-registered parameter so it is affected by upcoming data entry, data + * increment and data decrement messages. + * + * @param parameter {number[]} A two-position array specifying the two control bytes that identify + * the registered parameter. The NRPN MSB (99 or 0x63) is a position 0. The NRPN LSB (98 or 0x62) + * is at position 1. + * + * @private + * + * @param {object} [options={}] + * + * @param {number|string} [options.time] If `time` is a string prefixed with `"+"` and followed by + * a number, the message will be delayed by that many milliseconds. If the value is a number, the + * operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + _selectNonRegisteredParameter(parameter, options = {}) { + // parameter[0] = Math.floor(parameter[0]); + // if (!(parameter[0] >= 0 && parameter[0] <= 127)) { + // throw new RangeError("The control63 value must be between 0 and 127."); + // } + // + // parameter[1] = Math.floor(parameter[1]); + // if (!(parameter[1] >= 0 && parameter[1] <= 127)) { + // throw new RangeError("The control62 value must be between 0 and 127."); + // } + this.sendControlChange(0x63, parameter[0], options); + this.sendControlChange(0x62, parameter[1], options); + return this; + } + /** + * Deselects the currently active MIDI registered parameter so it is no longer affected by data + * entry, data increment and data decrement messages. + * + * Current best practice recommends doing that after each call to + * [_setCurrentParameter()]{@link #_setCurrentParameter}. + * + * @private + * + * @param {object} [options={}] + * + * @param {number|string} [options.time] If `time` is a string prefixed with `"+"` and followed by + * a number, the message will be delayed by that many milliseconds. If the value is a number, the + * operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + _deselectRegisteredParameter(options = {}) { + this.sendControlChange(0x65, 0x7F, options); + this.sendControlChange(0x64, 0x7F, options); + return this; + } + /** + * Deselects the currently active MIDI non-registered parameter so it is no longer affected by + * data entry, data increment and data decrement messages. + * + * @private + * + * @param {object} [options={}] + * + * @param {number|string} [options.time] If `time` is a string prefixed with `"+"` and followed by + * a number, the message will be delayed by that many milliseconds. If the value is a number, the + * operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + _deselectNonRegisteredParameter(options = {}) { + this.sendControlChange(0x65, 0x7F, options); + this.sendControlChange(0x64, 0x7F, options); + return this; + } + /** + * Selects a MIDI registered parameter so it is affected by upcoming data entry, data increment + * and data decrement messages. + * + * @private + * + * @param parameter {number[]} A two-position array of integers specifying the two control bytes + * (0x65, 0x64) that identify the registered parameter. The integers must be between 0 and 127. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time] If `time` is a string prefixed with `"+"` and followed by + * a number, the message will be delayed by that many milliseconds. If the value is a number, the + * operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + _selectRegisteredParameter(parameter, options = {}) { + this.sendControlChange(0x65, parameter[0], options); + this.sendControlChange(0x64, parameter[1], options); + return this; + } + /** + * Sets the value of the currently selected MIDI registered parameter. + * + * @private + * + * @param data {number|number[]} + * + * @param {object} [options={}] + * + * @param {number|string} [options.time] If `time` is a string prefixed with `"+"` and followed by + * a number, the message will be delayed by that many milliseconds. If the value is a number, the + * operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + _setCurrentParameter(data, options = {}) { + data = [].concat(data); // MSB + // data[0] = parseInt(data[0]); + // if (!isNaN(data[0]) && data[0] >= 0 && data[0] <= 127) { + + this.sendControlChange(0x06, data[0], options); // } else { + // throw new RangeError("The msb value must be between 0 and 127."); + // } + + if (data.length < 2) return this; // LSB + // data[1] = parseInt(data[1]); + // if (!isNaN(data[1]) && data[1] >= 0 && data[1] <= 127) { + + this.sendControlChange(0x26, data[1], options); // } else { + // throw new RangeError("The lsb value must be between 0 and 127."); + // } + + return this; + } + /** + * Decrements the specified MIDI registered parameter by 1. Here is the full list of parameter + * names that can be used with this function: + * + * * Pitchbend Range (0x00, 0x00): `"pitchbendrange"` + * * Channel Fine Tuning (0x00, 0x01): `"channelfinetuning"` + * * Channel Coarse Tuning (0x00, 0x02): `"channelcoarsetuning"` + * * Tuning Program (0x00, 0x03): `"tuningprogram"` + * * Tuning Bank (0x00, 0x04): `"tuningbank"` + * * Modulation Range (0x00, 0x05): `"modulationrange"` + * * Azimuth Angle (0x3D, 0x00): `"azimuthangle"` + * * Elevation Angle (0x3D, 0x01): `"elevationangle"` + * * Gain (0x3D, 0x02): `"gain"` + * * Distance Ratio (0x3D, 0x03): `"distanceratio"` + * * Maximum Distance (0x3D, 0x04): `"maximumdistance"` + * * Maximum Distance Gain (0x3D, 0x05): `"maximumdistancegain"` + * * Reference Distance Ratio (0x3D, 0x06): `"referencedistanceratio"` + * * Pan Spread Angle (0x3D, 0x07): `"panspreadangle"` + * * Roll Angle (0x3D, 0x08): `"rollangle"` + * + * @param parameter {String|number[]} A string identifying the parameter's name (see above) or a + * two-position array specifying the two control bytes (0x65, 0x64) that identify the registered + * parameter. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws TypeError The specified registered parameter is invalid. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendRpnDecrement(parameter, options = {}) { + if (!Array.isArray(parameter)) parameter = Enumerations.MIDI_REGISTERED_PARAMETERS[parameter]; + + if (wm.validation) { + if (parameter === undefined) { + throw new TypeError("The specified registered parameter is invalid."); + } + + let valid = false; + Object.getOwnPropertyNames(Enumerations.MIDI_REGISTERED_PARAMETERS).forEach(p => { + if (Enumerations.MIDI_REGISTERED_PARAMETERS[p][0] === parameter[0] && Enumerations.MIDI_REGISTERED_PARAMETERS[p][1] === parameter[1]) { + valid = true; + } + }); + if (!valid) throw new TypeError("The specified registered parameter is invalid."); + } + + this._selectRegisteredParameter(parameter, options); + + this.sendControlChange(0x61, 0, options); + + this._deselectRegisteredParameter(options); + + return this; + } + /** + * Increments the specified MIDI registered parameter by 1. Here is the full list of parameter + * names that can be used with this function: + * + * * Pitchbend Range (0x00, 0x00): `"pitchbendrange"` + * * Channel Fine Tuning (0x00, 0x01): `"channelfinetuning"` + * * Channel Coarse Tuning (0x00, 0x02): `"channelcoarsetuning"` + * * Tuning Program (0x00, 0x03): `"tuningprogram"` + * * Tuning Bank (0x00, 0x04): `"tuningbank"` + * * Modulation Range (0x00, 0x05): `"modulationrange"` + * * Azimuth Angle (0x3D, 0x00): `"azimuthangle"` + * * Elevation Angle (0x3D, 0x01): `"elevationangle"` + * * Gain (0x3D, 0x02): `"gain"` + * * Distance Ratio (0x3D, 0x03): `"distanceratio"` + * * Maximum Distance (0x3D, 0x04): `"maximumdistance"` + * * Maximum Distance Gain (0x3D, 0x05): `"maximumdistancegain"` + * * Reference Distance Ratio (0x3D, 0x06): `"referencedistanceratio"` + * * Pan Spread Angle (0x3D, 0x07): `"panspreadangle"` + * * Roll Angle (0x3D, 0x08): `"rollangle"` + * + * @param parameter {String|number[]} A string identifying the parameter's name (see above) or a + * two-position array specifying the two control bytes (0x65, 0x64) that identify the registered + * parameter. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws TypeError The specified registered parameter is invalid. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendRpnIncrement(parameter, options = {}) { + if (!Array.isArray(parameter)) parameter = Enumerations.MIDI_REGISTERED_PARAMETERS[parameter]; + + if (wm.validation) { + if (parameter === undefined) { + throw new TypeError("The specified registered parameter is invalid."); + } + + let valid = false; + Object.getOwnPropertyNames(Enumerations.MIDI_REGISTERED_PARAMETERS).forEach(p => { + if (Enumerations.MIDI_REGISTERED_PARAMETERS[p][0] === parameter[0] && Enumerations.MIDI_REGISTERED_PARAMETERS[p][1] === parameter[1]) { + valid = true; + } + }); + if (!valid) throw new TypeError("The specified registered parameter is invalid."); + } + + this._selectRegisteredParameter(parameter, options); + + this.sendControlChange(0x60, 0, options); + + this._deselectRegisteredParameter(options); + + return this; + } + /** + * Plays a note or an array of notes on the channel. The first parameter is the note to play. It + * can be a single value or an array of the following valid values: + * + * - A [`Note`]{@link Note} object + * - A MIDI note number (integer between `0` and `127`) + * - A note name, followed by the octave (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * + * The `playNote()` method sends a **note on** MIDI message for all specified notes. If a + * `duration` is set in the `options` parameter or in the [`Note`]{@link Note} object's + * [`duration`]{@link Note#duration} property, it will also schedule a **note off** message + * to end the note after said duration. If no `duration` is set, the note will simply play until + * a matching **note off** message is sent with [`stopNote()`]{@link OutputChannel#stopNote} or + * [`sendNoteOff()`]{@link OutputChannel#sendNoteOff}. + * + * The execution of the **note on** command can be delayed by using the `time` property of the + * `options` parameter. + * + * When using [`Note`]{@link Note} objects, the durations and velocities defined in the + * [`Note`]{@link Note} objects have precedence over the ones specified via the method's `options` + * parameter. + * + * **Note**: per the MIDI standard, a **note on** message with an attack velocity of `0` is + * functionally equivalent to a **note off** message. + * + * @param note {number|string|Note|number[]|string[]|Note[]} The note(s) to play. The notes can be + * specified by using a MIDI note number (`0` - `127`), a note identifier (e.g. `C3`, `G#4`, + * `F-1`, `Db7`), a [`Note`]{@link Note} object or an array of the previous types. When using a + * note identifier, the octave range must be between `-1` and `9`. The lowest note is `C-1` (MIDI + * note number `0`) and the highest note is `G9` (MIDI note number `127`). + * + * @param {object} [options={}] + * + * @param {number} [options.duration] A positive decimal number larger than `0` representing the + * number of milliseconds to wait before sending a **note off** message. If invalid or left + * undefined, only a **note on** message will be sent. + * + * @param {number} [options.attack=0.5] The velocity at which to play the note (between `0` and + * `1`). If the `rawAttack` option is also defined, it will have priority. An invalid velocity + * value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawAttack=64] The attack velocity at which to play the note (between + * `0` and `127`). This has priority over the `attack` property. An invalid velocity value will + * silently trigger the default of 64. + * + * @param {number} [options.release=0.5] The velocity at which to release the note (between `0` + * and `1`). If the `rawRelease` option is also defined, it will have priority. An invalid + * velocity value will silently trigger the default of `0.5`. This is only used with the + * **note off** event triggered when `options.duration` is set. + * + * @param {number} [options.rawRelease=64] The velocity at which to release the note (between `0` + * and `127`). This has priority over the `release` property. An invalid velocity value will + * silently trigger the default of 64. This is only used with the **note off** event triggered + * when `options.duration` is set. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + playNote(note, options = {}) { + // Send note on and, optionally, note off message (if duration is a positive number) + this.sendNoteOn(note, options); // https://stackoverflow.com/questions/600763#answer-601877 + + if (options.duration > 0 && isFinite(String(options.duration).trim() || NaN)) { + let noteOffOptions = { + time: (Utilities.toTimestamp(options.time) || wm.time) + options.duration, + release: options.release, + rawRelease: options.rawRelease + }; + this.sendNoteOff(note, noteOffOptions); + } + + return this; + } + /** + * Sends a **note off** message for the specified notes on the channel. The first parameter is the + * note. It can be a single value or an array of the following valid values: + * + * - A MIDI note number (integer between `0` and `127`) + * - A note name, followed by the octave (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * - A [`Note`]{@link Note} object + * + * The execution of the **note off** command can be delayed by using the `time` property of the + * `options` parameter. + * + * When using [`Note`]{@link Note} objects, the release velocity defined in the + * [`Note`]{@link Note} objects has precedence over the one specified via the method's `options` + * parameter. + * + * @param note {number|string|Note|number[]|string[]|Note[]} The note(s) to stop. The notes can be + * specified by using a MIDI note number (0-127), a note identifier (e.g. C3, G#4, F-1, Db7), a + * [`Note`]{@link Note} object or an array of the previous types. When using a note name, octave + * range must be between -1 and 9. The lowest note is C-1 (MIDI note number 0) and the highest + * note is G9 (MIDI note number 127). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @param {number} [options.release=0.5] The velocity at which to release the note + * (between `0` and `1`). If the `rawRelease` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawRelease=64] The velocity at which to release the note + * (between `0` and `127`). If the `release` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `64`. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendNoteOff(note, options = {}) { + if (wm.validation) { + if (options.rawRelease != undefined && !(options.rawRelease >= 0 && options.rawRelease <= 127)) { + throw new RangeError("The 'rawRelease' option must be an integer between 0 and 127"); + } + + if (options.release != undefined && !(options.release >= 0 && options.release <= 1)) { + throw new RangeError("The 'release' option must be an number between 0 and 1"); + } // Legacy compatibility warnings + + + if (options.rawVelocity) { + options.rawRelease = options.velocity; + console.warn("The 'rawVelocity' option is deprecated. Use 'rawRelease' instead."); + } + + if (options.velocity) { + options.release = options.velocity; + console.warn("The 'velocity' option is deprecated. Use 'attack' instead."); + } + } + + let nVelocity = 64; + + if (options.rawRelease != undefined) { + nVelocity = options.rawRelease; + } else { + if (!isNaN(options.release)) nVelocity = Math.round(options.release * 127); + } // Plot total octave offset + + + const offset = wm.octaveOffset + this.output.octaveOffset + this.octaveOffset; + Utilities.buildNoteArray(note, { + rawRelease: parseInt(nVelocity) + }).forEach(n => { + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.noteoff << 4) + (this.number - 1), n.getOffsetNumber(offset), n.rawRelease], { + time: Utilities.toTimestamp(options.time) + }); + }); + return this; + } + /** + * Sends a **note off** message for the specified MIDI note number. The first parameter is the + * note to stop. It can be a single value or an array of the following valid values: + * + * - A MIDI note number (integer between `0` and `127`) + * - A note identifier (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * - A [`Note`](Note) object + * + * The execution of the **note off** command can be delayed by using the `time` property of the + * `options` parameter. + * + * @param note {number|Note|string|number[]|Note[]|string[]} The note(s) to stop. The notes can be + * specified by using a MIDI note number (`0` - `127`), a note identifier (e.g. `C3`, `G#4`, `F-1`, + * `Db7`) or an array of the previous types. When using a note identifier, octave range must be + * between `-1` and `9`. The lowest note is `C-1` (MIDI note number `0`) and the highest note is + * `G9` (MIDI note number `127`). + * + * @param {Object} [options={}] + * + * @param {number} [options.release=0.5] The velocity at which to release the note + * (between `0` and `1`). If the `rawRelease` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawRelease=64] The velocity at which to release the note + * (between `0` and `127`). If the `release` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `64`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + stopNote(note, options = {}) { + return this.sendNoteOff(note, options); + } + /** + * Sends a **note on** message for the specified note(s) on the channel. The first parameter is + * the note. It can be a single value or an array of the following valid values: + * + * - A [`Note`]{@link Note} object + * - A MIDI note number (integer between `0` and `127`) + * - A note identifier (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * + * When passing a [`Note`]{@link Note}object or a note name, the `octaveOffset` will be applied. + * This is not the case when using a note number. In this case, we assume you know exactly which + * MIDI note number should be sent out. + * + * The execution of the **note on** command can be delayed by using the `time` property of the + * `options` parameter. + * + * When using [`Note`]{@link Note} objects, the attack velocity defined in the + * [`Note`]{@link Note} objects has precedence over the one specified via the method's `options` + * parameter. Also, the `duration` is ignored. If you want to also send a **note off** message, + * use the [`playNote()`]{@link #playNote} method instead. + * + * **Note**: As per the MIDI standard, a **note on** message with an attack velocity of `0` is + * functionally equivalent to a **note off** message. + * + * @param note {number|string|Note|number[]|string[]|Note[]} The note(s) to play. The notes can be + * specified by using a MIDI note number (0-127), a note identifier (e.g. C3, G#4, F-1, Db7), a + * [`Note`]{@link Note} object or an array of the previous types. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @param {number} [options.attack=0.5] The velocity at which to play the note (between `0` and + * `1`). If the `rawAttack` option is also defined, `rawAttack` will have priority. An invalid + * velocity value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawAttack=64] The velocity at which to release the note (between `0` + * and `127`). If the `attack` option is also defined, `rawAttack` will have priority. An invalid + * velocity value will silently trigger the default of `64`. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendNoteOn(note, options = {}) { + if (wm.validation) { + if (options.rawAttack != undefined && !(options.rawAttack >= 0 && options.rawAttack <= 127)) { + throw new RangeError("The 'rawAttack' option must be an integer between 0 and 127"); + } + + if (options.attack != undefined && !(options.attack >= 0 && options.attack <= 1)) { + throw new RangeError("The 'attack' option must be an number between 0 and 1"); + } // Legacy compatibility warnings + + + if (options.rawVelocity) { + options.rawAttack = options.velocity; + options.rawRelease = options.release; + console.warn("The 'rawVelocity' option is deprecated. Use 'rawAttack' or 'rawRelease'."); + } + + if (options.velocity) { + options.attack = options.velocity; + console.warn("The 'velocity' option is deprecated. Use 'attack' instead."); + } + } + + let nVelocity = 64; + + if (options.rawAttack != undefined) { + nVelocity = options.rawAttack; + } else { + if (!isNaN(options.attack)) nVelocity = Math.round(options.attack * 127); + } // Plot total octave offset + + + const offset = wm.octaveOffset + this.output.octaveOffset + this.octaveOffset; + Utilities.buildNoteArray(note, { + rawAttack: nVelocity + }).forEach(n => { + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.noteon << 4) + (this.number - 1), n.getOffsetNumber(offset), n.rawAttack], { + time: Utilities.toTimestamp(options.time) + }); + }); + return this; + } + /** + * Sends a MIDI **channel mode** message. The channel mode message to send can be specified + * numerically or by using one of the following common names: + * + * | Type |Number| Shortcut Method | + * | ---------------------|------|-------------------------------------------------------------- | + * | `allsoundoff` | 120 | [`sendAllSoundOff()`]{@link #sendAllSoundOff} | + * | `resetallcontrollers`| 121 | [`sendResetAllControllers()`]{@link #sendResetAllControllers} | + * | `localcontrol` | 122 | [`sendLocalControl()`]{@link #sendLocalControl} | + * | `allnotesoff` | 123 | [`sendAllNotesOff()`]{@link #sendAllNotesOff} | + * | `omnimodeoff` | 124 | [`sendOmniMode(false)`]{@link #sendOmniMode} | + * | `omnimodeon` | 125 | [`sendOmniMode(true)`]{@link #sendOmniMode} | + * | `monomodeon` | 126 | [`sendPolyphonicMode("mono")`]{@link #sendPolyphonicMode} | + * | `polymodeon` | 127 | [`sendPolyphonicMode("poly")`]{@link #sendPolyphonicMode} | + * + * **Note**: as you can see above, to make it easier, all channel mode messages also have a matching + * helper method. + * + * It should be noted that, per the MIDI specification, only `localcontrol` and `monomodeon` may + * require a value that's not zero. For that reason, the `value` parameter is optional and + * defaults to 0. + * + * @param {number|string} command The numerical identifier of the channel mode message (integer + * between `120` and `127`) or its name as a string. + * + * @param {number} [value=0] The value to send (integer between `0` - `127`). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendChannelMode(command, value = 0, options = {}) { + // Normalize command to integer + if (typeof command === "string") command = Enumerations.MIDI_CHANNEL_MODE_MESSAGES[command]; + + if (wm.validation) { + if (command === undefined) { + throw new TypeError("Invalid channel mode message name or number."); + } + + if (isNaN(command) || !(command >= 120 && command <= 127)) { + throw new TypeError("Invalid channel mode message number."); + } + + if (isNaN(parseInt(value)) || value < 0 || value > 127) { + throw new RangeError("Value must be an integer between 0 and 127."); + } + } + + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.controlchange << 4) + (this.number - 1), command, value], { + time: Utilities.toTimestamp(options.time) + }); + return this; + } + /** + * Sets OMNI mode to `"on"` or `"off"`. MIDI's OMNI mode causes the instrument to respond to + * messages from all channels. + * + * It should be noted that support for OMNI mode is not as common as it used to be. + * + * @param [state=true] {boolean} Whether to activate OMNI mode (`true`) or not (`false`). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {TypeError} Invalid channel mode message name. + * @throws {RangeError} Channel mode controller numbers must be between 120 and 127. + * @throws {RangeError} Value must be an integer between 0 and 127. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendOmniMode(state, options = {}) { + if (state === undefined || state) { + this.sendChannelMode("omnimodeon", 0, options); + } else { + this.sendChannelMode("omnimodeoff", 0, options); + } + + return this; + } + /** + * Sends a MIDI **channel aftertouch** message. For key-specific aftertouch, you should instead + * use [`sendKeyAftertouch()`]{@link #sendKeyAftertouch}. + * + * @param [pressure] {number} The pressure level (between `0` and `1`). If the `rawValue` option + * is set to `true`, the pressure can be defined by using an integer between `0` and `127`. + * + * @param {object} [options={}] + * + * @param {boolean} [options.rawValue=false] A boolean indicating whether the value should be + * considered a float between `0` and `1.0` (default) or a raw integer between `0` and `127`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + * + * @throws RangeError Invalid channel aftertouch value. + */ + + + sendChannelAftertouch(pressure, options = {}) { + if (wm.validation) { + if (isNaN(parseFloat(pressure))) { + throw new RangeError("Invalid channel aftertouch value."); + } + + if (options.rawValue) { + if (!(pressure >= 0 && pressure <= 127 && Number.isInteger(pressure))) { + throw new RangeError("Channel aftertouch raw value must be an integer between 0 and 127."); + } + } else { + if (!(pressure >= 0 && pressure <= 1)) { + throw new RangeError("Channel aftertouch value must be a float between 0 and 1."); + } + } + } + + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.channelaftertouch << 4) + (this.number - 1), Math.round(pressure * 127)], { + time: Utilities.toTimestamp(options.time) + }); + return this; + } + /** + * Sends a **master tuning** message. The value is decimal and must be larger than -65 semitones + * and smaller than 64 semitones. + * + * Because of the way the MIDI specification works, the decimal portion of the value will be + * encoded with a resolution of 14bit. The integer portion must be between -64 and 63 + * inclusively. This function actually generates two MIDI messages: a **Master Coarse Tuning** and + * a **Master Fine Tuning** RPN messages. + * + * @param [value=0.0] {number} The desired decimal adjustment value in semitones (-65 < x < 64) + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The value must be a decimal number between larger than -65 and smaller + * than 64. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendMasterTuning(value, options = {}) { + // @todo allow passing value as msb/lsb pair (the same as pitch bend range) + value = parseFloat(value) || 0.0; + + if (wm.validation) { + if (!(value > -65 && value < 64)) { + throw new RangeError("The value must be a decimal number larger than -65 and smaller than 64."); + } + } + + let coarse = Math.floor(value) + 64; + let fine = value - Math.floor(value); // Calculate MSB and LSB for fine adjustment (14bit resolution) + + fine = Math.round((fine + 1) / 2 * 16383); + let msb = fine >> 7 & 0x7F; + let lsb = fine & 0x7F; + this.sendRpnValue("channelcoarsetuning", coarse, options); + this.sendRpnValue("channelfinetuning", [msb, lsb], options); + return this; + } + /** + * Sends a **modulation depth range** message to adjust the depth of the modulation wheel's range. + * The range can be specified with the `semitones` parameter, the `cents` parameter or by + * specifying both parameters at the same time. + * + * @param {number} semitones The desired adjustment value in semitones (integer between 0 and + * 127). + * + * @param {number} [cents=0] The desired adjustment value in cents (integer between 0 and 127). + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendModulationRange(semitones, cents, options = {}) { + // @todo allow passing value as msb/lsb pair (the same as pitch bend range) + // when passing a single argument, semitones and cents shoud be combined + if (wm.validation) { + if (!Number.isInteger(semitones) || !(semitones >= 0 && semitones <= 127)) { + throw new RangeError("The semitones value must be an integer between 0 and 127."); + } + + if (!(cents == undefined) && (!Number.isInteger(cents) || !(cents >= 0 && cents <= 127))) { + throw new RangeError("If specified, the cents value must be an integer between 0 and 127."); + } + } // Default value for cents + + + if (!(cents >= 0 && cents <= 127)) cents = 0; + this.sendRpnValue("modulationrange", [semitones, cents], options); + return this; + } + /** + * Sets a non-registered parameter (NRPN) to the specified value. The NRPN is selected by passing + * in a two-position array specifying the values of the two control bytes. The value is specified + * by passing in a single integer (most cases) or an array of two integers. + * + * NRPNs are not standardized in any way. Each manufacturer is free to implement them any way + * they see fit. For example, according to the Roland GS specification, you can control the + * **vibrato rate** using NRPN (1, 8). Therefore, to set the **vibrato rate** value to **123** you + * would use: + * + * ```js + * WebMidi.outputs[0].channels[0].sendNrpnValue([1, 8], 123); + * ``` + * + * In some rarer cases, you need to send two values with your NRPN messages. In such cases, you + * would use a 2-position array. For example, for its **ClockBPM** parameter (2, 63), Novation + * uses a 14-bit value that combines an MSB and an LSB (7-bit values). So, for example, if the + * value to send was 10, you could use: + * + * ```js + * WebMidi.outputs[0].channels[0].sendNrpnValue([2, 63], [0, 10]); + * ``` + * + * For further implementation details, refer to the manufacturer's documentation. + * + * @param nrpn {number[]} A two-position array specifying the two control bytes (0x63, + * 0x62) that identify the non-registered parameter. + * + * @param [data=[]] {number|number[]} An integer or an array of integers with a length of 1 or 2 + * specifying the desired data. + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The control value must be between 0 and 127. + * @throws {RangeError} The msb value must be between 0 and 127 + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendNrpnValue(nrpn, data, options = {}) { + data = [].concat(data); + + if (wm.validation) { + if (!Array.isArray(nrpn) || !Number.isInteger(nrpn[0]) || !Number.isInteger(nrpn[1])) { + throw new TypeError("The specified NRPN is invalid."); + } + + if (!(nrpn[0] >= 0 && nrpn[0] <= 127)) { + throw new RangeError("The first byte of the NRPN must be between 0 and 127."); + } + + if (!(nrpn[1] >= 0 && nrpn[1] <= 127)) { + throw new RangeError("The second byte of the NRPN must be between 0 and 127."); + } + + data.forEach(value => { + if (!(value >= 0 && value <= 127)) { + throw new RangeError("The data bytes of the NRPN must be between 0 and 127."); + } + }); + } + + this._selectNonRegisteredParameter(nrpn, options); + + this._setCurrentParameter(data, options); + + this._deselectNonRegisteredParameter(options); + + return this; + } + /** + * Sends a MIDI **pitch bend** message at the scheduled time. The resulting bend is relative to + * the pitch bend range that has been defined. The range can be set with + * [`sendPitchBendRange()`]{@link #sendPitchBendRange}. So, for example, if the pitch + * bend range has been set to 12 semitones, using a bend value of -1 will bend the note 1 octave + * below its nominal value. + * + * @param {number|number[]} [value] The intensity of the bend (between -1.0 and 1.0). A value of + * zero means no bend. If the `rawValue` option is set to `true`, the intensity of the bend can be + * defined by either using a single integer between 0 and 127 (MSB) or an array of two integers + * between 0 and 127 representing, respectively, the MSB (most significant byte) and the LSB + * (least significant byte). The MSB is expressed in semitones with `64` meaning no bend. A value + * lower than `64` bends downwards while a value higher than `64` bends upwards. The LSB is + * expressed in cents (1/100 of a semitone). An LSB of `64` also means no bend. + * + * @param {Object} [options={}] + * + * @param {boolean} [options.rawValue=false] A boolean indicating whether the value should be + * considered as a float between -1.0 and 1.0 (default) or as raw integer between 0 and 127 (or + * an array of 2 integers if using both MSB and LSB). + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendPitchBend(value, options = {}) { + // @todo standardize the way msb/lsb are passed in + if (wm.validation) { + if (options.rawValue && Array.isArray(value)) { + if (!(value[0] >= 0 && value[0] <= 127)) { + throw new RangeError("The pitch bend MSB must be an integer between 0 and 127."); + } + + if (!(value[1] >= 0 && value[1] <= 127)) { + throw new RangeError("The pitch bend LSB must be an integer between 0 and 127."); + } + } else if (options.rawValue && !Array.isArray(value)) { + if (!(value >= 0 && value <= 127)) { + throw new RangeError("The pitch bend MSB must be an integer between 0 and 127."); + } + } else { + if (isNaN(value) || value === null) { + throw new RangeError("Invalid pitch bend value."); + } + + if (!(value >= -1 && value <= 1)) { + throw new RangeError("The pitch bend MSB must be an integer between 0 and 127."); + } + } + } + + let msb = 0; + let lsb = 0; // Calculate MSB and LSB for both scenarios + + if (options.rawValue && Array.isArray(value)) { + msb = value[0]; + lsb = value[1]; + } else if (options.rawValue && !Array.isArray(value)) { + msb = value; + } else { + const result = Utilities.fromFloatToMsbLsb((value + 1) / 2); // b/c value is -1 to 1 + + msb = result.msb; + lsb = result.lsb; + } + + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.pitchbend << 4) + (this.number - 1), lsb, msb], { + time: Utilities.toTimestamp(options.time) + }); + return this; + } + /** + * Sends a **pitch bend range** message at the scheduled time to adjust the range used by the + * pitch bend lever. The range is specified by using the `semitones` and `cents` parameters. For + * example, setting the `semitones` parameter to `12` means that the pitch bend range will be 12 + * semitones above and below the nominal pitch. + * + * @param semitones {number} The desired adjustment value in semitones (between 0 and 127). While + * nothing imposes that in the specification, it is very common for manufacturers to limit the + * range to 2 octaves (-12 semitones to 12 semitones). + * + * @param [cents=0] {number} The desired adjustment value in cents (integer between 0-127). + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The semitones value must be an integer between 0 and 127. + * @throws {RangeError} The cents value must be an integer between 0 and 127. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendPitchBendRange(semitones, cents, options = {}) { + // @todo use single value as parameter or pair of msb/lsb + if (wm.validation) { + if (!Number.isInteger(semitones) || !(semitones >= 0 && semitones <= 127)) { + throw new RangeError("The semitones value must be an integer between 0 and 127."); + } + + if (!Number.isInteger(cents) || !(cents >= 0 && cents <= 127)) { + throw new RangeError("The cents value must be an integer between 0 and 127."); + } + } + + this.sendRpnValue("pitchbendrange", [semitones, cents], options); + return this; + } + /** + * Sends a MIDI **program change** message at the scheduled time. + * + * @param [program=1] {number} The MIDI patch (program) number (integer between `0` and `127`). + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {TypeError} Failed to execute 'send' on 'MIDIOutput': The value at index 1 is greater + * than 0xFF. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + * + */ + + + sendProgramChange(program, options = {}) { + program = parseInt(program) || 0; + + if (wm.validation) { + if (!(program >= 0 && program <= 127)) { + throw new RangeError("The program number must be between 0 and 127."); + } + } + + this.send([(Enumerations.MIDI_CHANNEL_MESSAGES.programchange << 4) + (this.number - 1), program], { + time: Utilities.toTimestamp(options.time) + }); + return this; + } + /** + * Sets the specified MIDI registered parameter to the desired value. The value is defined with + * up to two bytes of data (msb, lsb) that each can go from 0 to 127. + * + * MIDI + * [registered parameters](https://www.midi.org/specifications-old/item/table-3-control-change-messages-data-bytes-2) + * extend the original list of control change messages. The MIDI 1.0 specification lists only a + * limited number of them: + * + * | Numbers | Function | + * |--------------|--------------------------| + * | (0x00, 0x00) | `pitchbendrange` | + * | (0x00, 0x01) | `channelfinetuning` | + * | (0x00, 0x02) | `channelcoarsetuning` | + * | (0x00, 0x03) | `tuningprogram` | + * | (0x00, 0x04) | `tuningbank` | + * | (0x00, 0x05) | `modulationrange` | + * | (0x3D, 0x00) | `azimuthangle` | + * | (0x3D, 0x01) | `elevationangle` | + * | (0x3D, 0x02) | `gain` | + * | (0x3D, 0x03) | `distanceratio` | + * | (0x3D, 0x04) | `maximumdistance` | + * | (0x3D, 0x05) | `maximumdistancegain` | + * | (0x3D, 0x06) | `referencedistanceratio` | + * | (0x3D, 0x07) | `panspreadangle` | + * | (0x3D, 0x08) | `rollangle` | + * + * Note that the **Tuning Program** and **Tuning Bank** parameters are part of the *MIDI Tuning + * Standard*, which is not widely implemented. + * + * @param rpn {string|number[]} A string identifying the parameter's name (see above) or a + * two-position array specifying the two control bytes (e.g. `[0x65, 0x64]`) that identify the + * registered parameter. + * + * @param [data=[]] {number|number[]} An single integer or an array of integers with a maximum + * length of 2 specifying the desired data. + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendRpnValue(rpn, data, options = {}) { + if (!Array.isArray(rpn)) rpn = Enumerations.MIDI_REGISTERED_PARAMETERS[rpn]; + + if (wm.validation) { + if (!Number.isInteger(rpn[0]) || !Number.isInteger(rpn[1])) { + throw new TypeError("The specified NRPN is invalid."); + } + + if (!(rpn[0] >= 0 && rpn[0] <= 127)) { + throw new RangeError("The first byte of the RPN must be between 0 and 127."); + } + + if (!(rpn[1] >= 0 && rpn[1] <= 127)) { + throw new RangeError("The second byte of the RPN must be between 0 and 127."); + } + + [].concat(data).forEach(value => { + if (!(value >= 0 && value <= 127)) { + throw new RangeError("The data bytes of the RPN must be between 0 and 127."); + } + }); + } + + this._selectRegisteredParameter(rpn, options); + + this._setCurrentParameter(data, options); + + this._deselectRegisteredParameter(options); + + return this; + } + /** + * Sets the MIDI tuning bank to use. Note that the **Tuning Bank** parameter is part of the + * *MIDI Tuning Standard*, which is not widely implemented. + * + * @param value {number} The desired tuning bank (integer between `0` and `127`). + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The bank value must be between 0 and 127. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendTuningBank(value, options = {}) { + if (wm.validation) { + if (!Number.isInteger(value) || !(value >= 0 && value <= 127)) { + throw new RangeError("The tuning bank number must be between 0 and 127."); + } + } + + this.sendRpnValue("tuningbank", value, options); + return this; + } + /** + * Sets the MIDI tuning program to use. Note that the **Tuning Program** parameter is part of the + * *MIDI Tuning Standard*, which is not widely implemented. + * + * @param value {number} The desired tuning program (integer between `0` and `127`). + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The program value must be between 0 and 127. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendTuningProgram(value, options = {}) { + if (wm.validation) { + if (!Number.isInteger(value) || !(value >= 0 && value <= 127)) { + throw new RangeError("The tuning program number must be between 0 and 127."); + } + } + + this.sendRpnValue("tuningprogram", value, options); + return this; + } + /** + * Turns local control on or off. Local control is usually enabled by default. If you disable it, + * the instrument will no longer trigger its own sounds. It will only send the MIDI messages to + * its out port. + * + * @param [state=false] {boolean} Whether to activate local control (`true`) or disable it + * (`false`). + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendLocalControl(state, options = {}) { + if (state) { + return this.sendChannelMode("localcontrol", 127, options); + } else { + return this.sendChannelMode("localcontrol", 0, options); + } + } + /** + * Sends an **all notes off** channel mode message. This will make all currently playing notes + * fade out just as if their key had been released. This is different from the + * [`sendAllSoundOff()`]{@link #sendAllSoundOff} method which mutes all sounds immediately. + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendAllNotesOff(options = {}) { + return this.sendChannelMode("allnotesoff", 0, options); + } + /** + * Sends an **all sound off** channel mode message. This will silence all sounds playing on that + * channel but will not prevent new sounds from being triggered. + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendAllSoundOff(options = {}) { + return this.sendChannelMode("allsoundoff", 0, options); + } + /** + * Sends a **reset all controllers** channel mode message. This resets all controllers, such as + * the pitch bend, to their default value. + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendResetAllControllers(options = {}) { + return this.sendChannelMode("resetallcontrollers", 0, options); + } + /** + * Sets the polyphonic mode. In `"poly"` mode (usually the default), multiple notes can be played + * and heard at the same time. In `"mono"` mode, only one note will be heard at once even if + * multiple notes are being played. + * + * @param {string} [mode=poly] The mode to use: `"mono"` or `"poly"`. + * + * @param {Object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {OutputChannel} Returns the `OutputChannel` object so methods can be chained. + */ + + + sendPolyphonicMode(mode, options = {}) { + if (mode === "mono") { + return this.sendChannelMode("monomodeon", 0, options); + } else { + return this.sendChannelMode("polymodeon", 0, options); + } + } + /** + * An integer to offset the reported octave of outgoing note-specific messages (`noteon`, + * `noteoff` and `keyaftertouch`). By default, middle C (MIDI note number 60) is placed on the 4th + * octave (C4). + * + * Note that this value is combined with the global offset value defined in + * [`WebMidi.octaveOffset`](WebMidi#octaveOffset) and with the parent value defined in + * [`Output.octaveOffset`]{@link Output#octaveOffset}. + * + * @type {number} + * + * @since 3.0 + */ + + + get octaveOffset() { + return this._octaveOffset; + } + + set octaveOffset(value) { + if (this.validation) { + value = parseInt(value); + if (isNaN(value)) throw new TypeError("The 'octaveOffset' property must be an integer."); + } + + this._octaveOffset = value; + } + /** + * The parent [`Output`]{@link Output} this channel belongs to. + * @type {Output} + * @since 3.0 + */ + + + get output() { + return this._output; + } + /** + * This channel's MIDI number (`1` - `16`). + * @type {number} + * @since 3.0 + */ + + + get number() { + return this._number; + } + + } + + /** + * The `Output` class represents a single MIDI output port (not to be confused with a MIDI channel). + * A port is made available by a MIDI device. A MIDI device can advertise several input and output + * ports. Each port has 16 MIDI channels which can be accessed via the [`channels`](#channels) + * property. + * + * The `Output` object is automatically instantiated by the library according to the host's MIDI + * subsystem and should not be directly instantiated. + * + * You can access all available `Output` objects by referring to the + * [`WebMidi.outputs`](WebMidi#outputs) array or by using methods such as + * [`WebMidi.getOutputByName()`](WebMidi#getOutputByName) or + * [`WebMidi.getOutputById()`](WebMidi#getOutputById). + * + * @fires Output#opened + * @fires Output#disconnected + * @fires Output#closed + * + * @extends EventEmitter + * @license Apache-2.0 + */ + + class Output extends EventEmitter { + /** + * Creates an `Output` object. + * + * @param {MIDIOutput} midiOutput [`MIDIOutput`](https://developer.mozilla.org/en-US/docs/Web/API/MIDIOutput) + * object as provided by the MIDI subsystem. + */ + constructor(midiOutput) { + super(); + /** + * A reference to the `MIDIOutput` object + * @type {MIDIOutput} + * @private + */ + + this._midiOutput = midiOutput; + /** + * @type {number} + * @private + */ + + this._octaveOffset = 0; + /** + * Array containing the 16 [`OutputChannel`]{@link OutputChannel} objects available provided by + * this `Output`. The channels are numbered 1 through 16. + * + * @type {OutputChannel[]} + */ + + this.channels = []; + + for (let i = 1; i <= 16; i++) this.channels[i] = new OutputChannel(this, i); + + this._midiOutput.onstatechange = this._onStateChange.bind(this); + } + /** + * Destroys the `Output`. All listeners are removed, all channels are destroyed and the MIDI + * subsystem is unlinked. + * @returns {Promise} + */ + + + async destroy() { + this.removeListener(); + this.channels.forEach(ch => ch.destroy()); + this.channels = []; + this._midiOutput.onstatechange = null; + await this.close(); + this._midiOutput = null; + } + /** + * @private + */ + + + _onStateChange(e) { + let event = { + timestamp: wm.time + }; + + if (e.port.connection === "open") { + /** + * Event emitted when the {@link Output} has been opened by calling the + * [open()]{@link Output#open} method. + * + * @event Output#opened + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `"opened"` + * @property {Output} target The object to which the listener was originally added (`Output`). + * @property {Output} port The port that was opened + */ + event.type = "opened"; + event.target = this; + event.port = event.target; // for consistency + + this.emit("opened", event); + } else if (e.port.connection === "closed" && e.port.state === "connected") { + /** + * Event emitted when the {@link Output} has been closed by calling the + * [close()]{@link Output#close} method. + * + * @event Output#closed + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `"closed"` + * @property {Output} target The object to which the listener was originally added (`Output`). + * @property {Output} port The port that was closed + */ + event.type = "closed"; + event.target = this; + event.port = event.target; // for consistency + + this.emit("closed", event); + } else if (e.port.connection === "closed" && e.port.state === "disconnected") { + /** + * Event emitted when the {@link Output} becomes unavailable. This event is typically fired + * when the MIDI device is unplugged. + * + * @event Output#disconnected + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp0 when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `"disconnected"` + * @property {Output} target The object to which the listener was originally added (`Output`). + * @property {object} port Object with properties describing the {@link Output} that was + * disconnected. This is not the actual `Output` as it is no longer available. + */ + event.type = "disconnected"; + event.port = { + connection: e.port.connection, + id: e.port.id, + manufacturer: e.port.manufacturer, + name: e.port.name, + state: e.port.state, + type: e.port.type + }; + this.emit("disconnected", event); + } else if (e.port.connection === "pending" && e.port.state === "disconnected") ; else { + console.warn("This statechange event was not caught:", e.port.connection, e.port.state); + } + } + /** + * Opens the output for usage. When the library is enabled, all ports are automatically opened. + * This method is only useful for ports that have been manually closed. + * + * @returns {Promise} The promise is fulfilled with the `Output` object. + */ + + + async open() { + // Explicitly opens the port for usage. This is not mandatory. When the port is not explicitly + // opened, it is implicitly opened (asynchronously) when calling `send()` on the `MIDIOutput`. + // We do it explicitly so that 'connected' events are dispatched immediately and we are ready to + // send. + try { + await this._midiOutput.open(); + return Promise.resolve(this); + } catch (err) { + return Promise.reject(err); + } + } + /** + * Closes the output connection. When an output is closed, it cannot be used to send MIDI messages + * until the output is opened again by calling [`open()`]{@link #open}. You can check + * the connection status by looking at the [`connection`]{@link #connection} property. + * + * @returns {Promise} + */ + + + async close() { + // We close the port. This triggers a 'statechange' event which we listen to to re-trigger the + // 'closed' event. + if (this._midiOutput) { + await this._midiOutput.close(); + } else { + await Promise.resolve(); + } + } + /** + * Sends a MIDI message on the MIDI output port. If no time is specified, the message will be + * sent immediately. The message should be an array of 8 bit unsigned integers (0-225), a + * [`Uint8Array`]{@link https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array} + * object or a [`Message`](Message) object. + * + * It is usually not necessary to use this method directly as you can use one of the simpler + * helper methods such as [`playNote()`](#playNote), [`stopNote()`](#stopNote), + * [`sendControlChange()`](#sendControlChange), etc. + * + * Details on the format of MIDI messages are available in the summary of + * [MIDI messages]{@link https://www.midi.org/specifications-old/item/table-1-summary-of-midi-message} + * from the MIDI Manufacturers Association. + * + * @param message {number[]|Uint8Array|Message} An array of 8bit unsigned integers, a `Uint8Array` + * object (not available in Node.js) containing the message bytes or a `Message` object. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The first byte (status) must be an integer between 128 and 255. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + * + * @license Apache-2.0 + */ + + + send(message, options = { + time: 0 + }, legacy = 0) { + // If a Message object is passed in we extract the message data (the jzz plugin used on Node.js + // does not support using Uint8Array). + if (message instanceof Message) { + message = Utilities.isNode ? message.data : message.rawData; + } // If the data is a Uint8Array and we are on Node, we must convert it to array so it works with + // the jzz module. + + + if (message instanceof Uint8Array && Utilities.isNode) { + message = Array.from(message); + } // Validation + + + if (wm.validation) { + // If message is neither an array nor a Uint8Array, then we are in legacy mode + if (!Array.isArray(message) && !(message instanceof Uint8Array)) { + message = [message]; + if (Array.isArray(options)) message = message.concat(options); + options = isNaN(legacy) ? { + time: 0 + } : { + time: legacy + }; + } + + if (!(parseInt(message[0]) >= 128 && parseInt(message[0]) <= 255)) { + throw new RangeError("The first byte (status) must be an integer between 128 and 255."); + } + + message.slice(1).forEach(value => { + value = parseInt(value); + + if (!(value >= 0 && value <= 255)) { + throw new RangeError("Data bytes must be integers between 0 and 255."); + } + }); + if (!options) options = { + time: 0 + }; + } // Send message and return `Output` for chaining + + + this._midiOutput.send(message, Utilities.toTimestamp(options.time)); + + return this; + } + /** + * Sends a MIDI [**system exclusive**]{@link + * https://www.midi.org/specifications-old/item/table-4-universal-system-exclusive-messages} + * (*sysex*) message. There are two categories of system exclusive messages: manufacturer-specific + * messages and universal messages. Universal messages are further divided into three subtypes: + * + * * Universal non-commercial (for research and testing): `0x7D` + * * Universal non-realtime: `0x7E` + * * Universal realtime: `0x7F` + * + * The method's first parameter (`identification`) identifies the type of message. If the value of + * `identification` is `0x7D` (125), `0x7E` (126) or `0x7F` (127), the message will be identified + * as a **universal non-commercial**, **universal non-realtime** or **universal realtime** message + * (respectively). + * + * If the `identification` value is an array or an integer between 0 and 124, it will be used to + * identify the manufacturer targeted by the message. The *MIDI Manufacturers Association* + * maintains a full list of + * [Manufacturer ID Numbers](https://www.midi.org/specifications-old/item/manufacturer-id-numbers). + * + * The `data` parameter should only contain the data of the message. When sending out the actual + * MIDI message, WEBMIDI.js will automatically prepend the data with the **sysex byte** (`0xF0`) + * and the identification byte(s). It will also automatically terminate the message with the + * **sysex end byte** (`0xF7`). + * + * To use the `sendSysex()` method, system exclusive message support must have been enabled. To + * do so, you must set the `sysex` option to `true` when calling + * [`WebMidi.enable()`]{@link WebMidi#enable}: + * + * ```js + * WebMidi.enable({sysex: true}) + * .then(() => console.log("System exclusive messages are enabled"); + * ``` + * + * ##### Examples of manufacturer-specific system exclusive messages + * + * If you want to send a sysex message to a Korg device connected to the first output, you would + * use the following code: + * + * ```js + * WebMidi.outputs[0].sendSysex(0x42, [0x1, 0x2, 0x3, 0x4, 0x5]); + * ``` + * In this case `0x42` is the ID of the manufacturer (Korg) and `[0x1, 0x2, 0x3, 0x4, 0x5]` is the + * data being sent. + * + * The parameters can be specified using any number notation (decimal, hex, binary, etc.). + * Therefore, the code above is equivalent to this code: + * + * ```js + * WebMidi.outputs[0].sendSysex(66, [1, 2, 3, 4, 5]); + * ``` + * + * Some manufacturers are identified using 3 bytes. In this case, you would use a 3-position array + * as the first parameter. For example, to send the same sysex message to a + * *Native Instruments* device: + * + * ```js + * WebMidi.outputs[0].sendSysex([0x00, 0x21, 0x09], [0x1, 0x2, 0x3, 0x4, 0x5]); + * ``` + * + * There is no limit for the length of the data array. However, it is generally suggested to keep + * system exclusive messages to 64Kb or less. + * + * ##### Example of universal system exclusive message + * + * If you want to send a universal sysex message, simply assign the correct identification number + * in the first parameter. Number `0x7D` (125) is for non-commercial, `0x7E` (126) is for + * non-realtime and `0x7F` (127) is for realtime. + * + * So, for example, if you wanted to send an identity request non-realtime message (`0x7E`), you + * could use the following: + * + * ```js + * WebMidi.outputs[0].sendSysex(0x7E, [0x7F, 0x06, 0x01]); + * ``` + * + * For more details on the format of universal messages, consult the list of + * [universal sysex messages](https://www.midi.org/specifications-old/item/table-4-universal-system-exclusive-messages). + * + * @param {number|number[]} identification An unsigned integer or an array of three unsigned + * integers between `0` and `127` that either identify the manufacturer or sets the message to be + * a **universal non-commercial message** (`0x7D`), a **universal non-realtime message** (`0x7E`) + * or a **universal realtime message** (`0x7F`). The *MIDI Manufacturers Association* maintains a + * full list of + * [Manufacturer ID Numbers](https://www.midi.org/specifications-old/item/manufacturer-id-numbers). + * + * @param {number[]|Uint8Array} [data] A `Uint8Array` or an array of unsigned integers between `0` + * and `127`. This is the data you wish to transfer. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {DOMException} Failed to execute 'send' on 'MIDIOutput': System exclusive message is + * not allowed. + * + * @throws {TypeError} Failed to execute 'send' on 'MIDIOutput': The value at index x is greater + * than 0xFF. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendSysex(identification, data = [], options = {}) { + identification = [].concat(identification); // Check if data is Uint8Array + + if (data instanceof Uint8Array) { + const merged = new Uint8Array(1 + identification.length + data.length + 1); + merged[0] = Enumerations.MIDI_SYSTEM_MESSAGES.sysex; + merged.set(Uint8Array.from(identification), 1); + merged.set(data, 1 + identification.length); + merged[merged.length - 1] = Enumerations.MIDI_SYSTEM_MESSAGES.sysexend; + this.send(merged, { + time: options.time + }); + } else { + const merged = identification.concat(data, Enumerations.MIDI_SYSTEM_MESSAGES.sysexend); + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.sysex].concat(merged), { + time: options.time + }); + } + + return this; + } + + /** + * Clears all messages that have been queued but not yet delivered. + * + * **Warning**: this method has been defined in the specification but has not been implemented + * yet. As soon as browsers implement it, it will work. + * + * You can check out the current status of this feature for Chromium (Chrome) here: + * https://bugs.chromium.org/p/chromium/issues/detail?id=471798 + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + clear() { + if (this._midiOutput.clear) { + this._midiOutput.clear(); + } else { + if (wm.validation) { + console.warn("The 'clear()' method has not yet been implemented in your environment."); + } + } + + return this; + } + /** + * Sends a MIDI **timecode quarter frame** message. Please note that no processing is being done + * on the data. It is up to the developer to format the data according to the + * [MIDI Timecode](https://en.wikipedia.org/wiki/MIDI_timecode) format. + * + * @param value {number} The quarter frame message content (integer between 0 and 127). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendTimecodeQuarterFrame(value, options = {}) { + if (wm.validation) { + value = parseInt(value); + + if (isNaN(value) || !(value >= 0 && value <= 127)) { + throw new RangeError("The value must be an integer between 0 and 127."); + } + } + + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.timecode, value], { + time: options.time + }); + return this; + } + + /** + * Sends a **song position** MIDI message. The value is expressed in MIDI beats (between `0` and + * `16383`) which are 16th note. Position `0` is always the start of the song. + * + * @param {number} [value=0] The MIDI beat to cue to (integer between `0` and `16383`). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + sendSongPosition(value = 0, options = {}) { + // @todo allow passing in 2-entries array for msb/lsb + value = Math.floor(value) || 0; + var msb = value >> 7 & 0x7F; + var lsb = value & 0x7F; + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.songposition, msb, lsb], { + time: options.time + }); + return this; + } + /** + * Sends a **song select** MIDI message. + * + * @param {number} [value=0] The number of the song to select (integer between `0` and `127`). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws The song number must be between 0 and 127. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendSongSelect(value = 0, options = {}) { + if (wm.validation) { + value = parseInt(value); + + if (isNaN(value) || !(value >= 0 && value <= 127)) { + throw new RangeError("The program value must be between 0 and 127"); + } + } + + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.songselect, value], { + time: options.time + }); + return this; + } + /** + * Sends a MIDI **tune request** real-time message. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendTuneRequest(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.tunerequest], { + time: options.time + }); + return this; + } + /** + * Sends a MIDI **clock** real-time message. According to the standard, there are 24 MIDI clocks + * for every quarter note. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendClock(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.clock], { + time: options.time + }); + return this; + } + /** + * Sends a **start** real-time message. A MIDI Start message starts the playback of the current + * song at beat 0. To start playback elsewhere in the song, use the + * [`sendContinue()`]{@link #sendContinue} method. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendStart(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.start], { + time: options.time + }); + return this; + } + /** + * Sends a **continue** real-time message. This resumes song playback where it was previously + * stopped or where it was last cued with a song position message. To start playback from the + * start, use the [`sendStart()`]{@link Output#sendStart}` method. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendContinue(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.continue], { + time: options.time + }); + return this; + } + /** + * Sends a **stop** real-time message. This tells the device connected to this output to stop + * playback immediately (or at the scheduled time, if specified). + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendStop(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.stop], { + time: options.time + }); + return this; + } + /** + * Sends an **active sensing** real-time message. This tells the device connected to this port + * that the connection is still good. Active sensing messages are often sent every 300 ms if there + * was no other activity on the MIDI port. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendActiveSensing(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.activesensing], { + time: options.time + }); + return this; + } + /** + * Sends a **reset** real-time message. This tells the device connected to this output that it + * should reset itself to a default state. + * + * @param {object} [options={}] + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendReset(options = {}) { + this.send([Enumerations.MIDI_SYSTEM_MESSAGES.reset], { + time: options.time + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + sendTuningRequest(options = {}) { + if (wm.validation) { + console.warn("The sendTuningRequest() method has been deprecated. Use sendTuningRequest() instead."); + } + + return this.sendTuneRequest(options); + } + /** + * Sends a MIDI **key aftertouch** message to the specified channel(s) at the scheduled time. This + * is a key-specific aftertouch. For a channel-wide aftertouch message, use + * [`setChannelAftertouch()`]{@link #setChannelAftertouch}. + * + * @param note {number|Note|string|number[]|Note[]|string[]} The note(s) for which you are sending + * an aftertouch value. The notes can be specified by using a MIDI note number (`0` - `127`), a + * [`Note`](Note) object, a note identifier (e.g. `C3`, `G#4`, `F-1`, `Db7`) or an array of the + * previous types. When using a note identifier, octave range must be between `-1` and `9`. The + * lowest note is `C-1` (MIDI note number `0`) and the highest note is `G9` (MIDI note number + * `127`). + * + * @param [pressure=0.5] {number} The pressure level (between 0 and 1). An invalid pressure value + * will silently trigger the default behaviour. If the `rawValue` option is set to `true`, the + * pressure can be defined by using an integer between 0 and 127. + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {boolean} [options.rawValue=false] A boolean indicating whether the value should be + * considered a float between `0` and `1.0` (default) or a raw integer between `0` and `127`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendKeyAftertouch(note, pressure, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendKeyAftertouch(note, pressure, options); + }); + return this; + } + + /** + * Sends a MIDI **control change** message to the specified channel(s) at the scheduled time. The + * control change message to send can be specified numerically (0-127) or by using one of the + * following common names: + * + * | Number | Name | + * |--------|-------------------------------| + * | 0 |`bankselectcoarse` | + * | 1 |`modulationwheelcoarse` | + * | 2 |`breathcontrollercoarse` | + * | 4 |`footcontrollercoarse` | + * | 5 |`portamentotimecoarse` | + * | 6 |`dataentrycoarse` | + * | 7 |`volumecoarse` | + * | 8 |`balancecoarse` | + * | 10 |`pancoarse` | + * | 11 |`expressioncoarse` | + * | 12 |`effectcontrol1coarse` | + * | 13 |`effectcontrol2coarse` | + * | 18 |`generalpurposeslider3` | + * | 19 |`generalpurposeslider4` | + * | 32 |`bankselectfine` | + * | 33 |`modulationwheelfine` | + * | 34 |`breathcontrollerfine` | + * | 36 |`footcontrollerfine` | + * | 37 |`portamentotimefine` | + * | 38 |`dataentryfine` | + * | 39 |`volumefine` | + * | 40 |`balancefine` | + * | 42 |`panfine` | + * | 43 |`expressionfine` | + * | 44 |`effectcontrol1fine` | + * | 45 |`effectcontrol2fine` | + * | 64 |`holdpedal` | + * | 65 |`portamento` | + * | 66 |`sustenutopedal` | + * | 67 |`softpedal` | + * | 68 |`legatopedal` | + * | 69 |`hold2pedal` | + * | 70 |`soundvariation` | + * | 71 |`resonance` | + * | 72 |`soundreleasetime` | + * | 73 |`soundattacktime` | + * | 74 |`brightness` | + * | 75 |`soundcontrol6` | + * | 76 |`soundcontrol7` | + * | 77 |`soundcontrol8` | + * | 78 |`soundcontrol9` | + * | 79 |`soundcontrol10` | + * | 80 |`generalpurposebutton1` | + * | 81 |`generalpurposebutton2` | + * | 82 |`generalpurposebutton3` | + * | 83 |`generalpurposebutton4` | + * | 91 |`reverblevel` | + * | 92 |`tremololevel` | + * | 93 |`choruslevel` | + * | 94 |`celestelevel` | + * | 95 |`phaserlevel` | + * | 96 |`databuttonincrement` | + * | 97 |`databuttondecrement` | + * | 98 |`nonregisteredparametercoarse` | + * | 99 |`nonregisteredparameterfine` | + * | 100 |`registeredparametercoarse` | + * | 101 |`registeredparameterfine` | + * | 120 |`allsoundoff` | + * | 121 |`resetallcontrollers` | + * | 122 |`localcontrol` | + * | 123 |`allnotesoff` | + * | 124 |`omnimodeoff` | + * | 125 |`omnimodeon` | + * | 126 |`monomodeon` | + * | 127 |`polymodeon` | + * + * Note: as you can see above, not all control change message have a matching name. This does not + * mean you cannot use the others. It simply means you will need to use their number (`0` - `127`) + * instead of their name. While you can still use them, numbers `120` to `127` are usually + * reserved for *channel mode* messages. See [`sendChannelMode()`]{@link #sendChannelMode} method + * for more info. + * + * To view a list of all available **control change** messages, please consult [Table 3 - Control + * Change Messages](https://www.midi.org/specifications-old/item/table-3-control-change-messages-data-bytes-2) + * from the MIDI specification. + * + * @param controller {number|string} The MIDI controller name or number (0-127). + * + * @param [value=0] {number} The value to send (0-127). + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} Controller numbers must be between 0 and 127. + * @throws {RangeError} Invalid controller name. + * + * @return {Output} Returns the `Output` object so methods can be chained. + */ + sendControlChange(controller, value, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendControlChange(controller, value, options); + }); + return this; + } + + /** + * Sends a **pitch bend range** message to the specified channel(s) at the scheduled time so that + * they adjust the range used by their pitch bend lever. The range is specified by using the + * `semitones` and `cents` parameters. For example, setting the `semitones` parameter to `12` + * means that the pitch bend range will be 12 semitones above and below the nominal pitch. + * + * @param {number} [semitones=0] The desired adjustment value in semitones (between `0` and `127`). + * While nothing imposes that in the specification, it is very common for manufacturers to limit + * the range to 2 octaves (-12 semitones to 12 semitones). + * + * @param {number} [cents=0] The desired adjustment value in cents (integer between `0` and + * `127`). + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The msb value must be between 0 and 127. + * @throws {RangeError} The lsb value must be between 0 and 127. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + sendPitchBendRange(semitones = 0, cents = 0, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendPitchBendRange(semitones, cents, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + setPitchBendRange(semitones = 0, cents = 0, channel = "all", options = {}) { + if (wm.validation) { + console.warn("The setPitchBendRange() method is deprecated. Use sendPitchBendRange() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendPitchBendRange(semitones, cents, options); + } + /** + * Sets the specified MIDI registered parameter to the desired value. The value is defined with + * up to two bytes of data (msb, lsb) that each can go from `0` to `127`. + * + * MIDI + * [registered parameters](https://www.midi.org/specifications-old/item/table-3-control-change-messages-data-bytes-2) + * extend the original list of control change messages. The MIDI 1.0 specification lists only a + * limited number of them: + * + * | Numbers | Function | + * |--------------|--------------------------| + * | (0x00, 0x00) | `pitchbendrange` | + * | (0x00, 0x01) | `channelfinetuning` | + * | (0x00, 0x02) | `channelcoarsetuning` | + * | (0x00, 0x03) | `tuningprogram` | + * | (0x00, 0x04) | `tuningbank` | + * | (0x00, 0x05) | `modulationrange` | + * | (0x3D, 0x00) | `azimuthangle` | + * | (0x3D, 0x01) | `elevationangle` | + * | (0x3D, 0x02) | `gain` | + * | (0x3D, 0x03) | `distanceratio` | + * | (0x3D, 0x04) | `maximumdistance` | + * | (0x3D, 0x05) | `maximumdistancegain` | + * | (0x3D, 0x06) | `referencedistanceratio` | + * | (0x3D, 0x07) | `panspreadangle` | + * | (0x3D, 0x08) | `rollangle` | + * + * Note that the `tuningprogram` and `tuningbank` parameters are part of the *MIDI Tuning + * Standard*, which is not widely implemented. + * + * @param parameter {string|number[]} A string identifying the parameter's name (see above) or a + * two-position array specifying the two control bytes (e.g. `[0x65, 0x64]`) that identify the + * registered parameter. + * + * @param [data=[]] {number|number[]} A single integer or an array of integers with a maximum + * length of 2 specifying the desired data. + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendRpnValue(parameter, data, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendRpnValue(parameter, data, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + setRegisteredParameter(parameter, data = [], channel = "all", options = {}) { + if (wm.validation) { + console.warn("The setRegisteredParameter() method is deprecated. Use sendRpnValue() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendRpnValue(parameter, data, options); + } + /** + * Sends a MIDI **channel aftertouch** message to the specified channel(s). For key-specific + * aftertouch, you should instead use [`setKeyAftertouch()`]{@link #setKeyAftertouch}. + * + * @param [pressure=0.5] {number} The pressure level (between `0` and `1`). An invalid pressure + * value will silently trigger the default behaviour. If the `rawValue` option is set to `true`, + * the pressure can be defined by using an integer between `0` and `127`. + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {boolean} [options.rawValue=false] A boolean indicating whether the value should be + * considered a float between `0` and `1.0` (default) or a raw integer between `0` and `127`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * @since 3.0.0 + */ + + + sendChannelAftertouch(pressure, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendChannelAftertouch(pressure, options); + }); + return this; + } + /** + * Sends a MIDI **pitch bend** message to the specified channel(s) at the scheduled time. + * + * The resulting bend is relative to the pitch bend range that has been defined. The range can be + * set with [`sendPitchBendRange()`]{@link #sendPitchBendRange}. So, for example, if the pitch + * bend range has been set to 12 semitones, using a bend value of `-1` will bend the note 1 octave + * below its nominal value. + * + * @param {number|number[]} value The intensity of the bend (between `-1.0` and `1.0`). A value of + * `0` means no bend. If an invalid value is specified, the nearest valid value will be used + * instead. If the `rawValue` option is set to `true`, the intensity of the bend can be defined by + * either using a single integer between `0` and `127` (MSB) or an array of two integers between + * `0` and `127` representing, respectively, the MSB (most significant byte) and the LSB (least + * significant byte). The MSB is expressed in semitones with `64` meaning no bend. A value lower + * than `64` bends downwards while a value higher than `64` bends upwards. The LSB is expressed + * in cents (1/100 of a semitone). An LSB of `64` also means no bend. + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {boolean} [options.rawValue=false] A boolean indicating whether the value should be + * considered as a float between `-1.0` and `1.0` (default) or as raw integer between `0` and + * 127` (or an array of 2 integers if using both MSB and LSB). + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendPitchBend(value, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendPitchBend(value, options); + }); + return this; + } + /** + * Sends a MIDI **program change** message to the specified channel(s) at the scheduled time. + * + * @param {number} [program=0] The MIDI patch (program) number (integer between `0` and `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {TypeError} Failed to execute 'send' on 'MIDIOutput': The value at index 1 is greater + * than 0xFF. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendProgramChange(program = 0, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendProgramChange(program, options); + }); + return this; + } + /** + * Sends a **modulation depth range** message to the specified channel(s) so that they adjust the + * depth of their modulation wheel's range. The range can be specified with the `semitones` + * parameter, the `cents` parameter or by specifying both parameters at the same time. + * + * @param [semitones=0] {number} The desired adjustment value in semitones (integer between + * 0 and 127). + * + * @param [cents=0] {number} The desired adjustment value in cents (integer between 0 and 127). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The msb value must be between 0 and 127 + * @throws {RangeError} The lsb value must be between 0 and 127 + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendModulationRange(semitones, cents, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendModulationRange(semitones, cents, options); + }); + return this; + } + + /** + * @private + * @deprecated since version 3.0 + */ + setModulationRange(semitones = 0, cents = 0, channel = "all", options = {}) { + if (wm.validation) { + console.warn("The setModulationRange() method is deprecated. Use sendModulationRange() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendModulationRange(semitones, cents, options); + } + /** + * Sends a master tuning message to the specified channel(s). The value is decimal and must be + * larger than `-65` semitones and smaller than `64` semitones. + * + * Because of the way the MIDI specification works, the decimal portion of the value will be + * encoded with a resolution of 14bit. The integer portion must be between -64 and 63 + * inclusively. This function actually generates two MIDI messages: a **Master Coarse Tuning** and + * a **Master Fine Tuning** RPN messages. + * + * @param [value=0.0] {number} The desired decimal adjustment value in semitones (-65 < x < 64) + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The value must be a decimal number between larger than -65 and smaller + * than 64. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendMasterTuning(value, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendMasterTuning(value, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + setMasterTuning(value, channel = {}, options = {}) { + if (wm.validation) { + console.warn("The setMasterTuning() method is deprecated. Use sendMasterTuning() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendMasterTuning(value, options); + } + /** + * Sets the MIDI tuning program to use. Note that the **Tuning Program** parameter is part of the + * *MIDI Tuning Standard*, which is not widely implemented. + * + * @param value {number} The desired tuning program (integer between `0` and `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The program value must be between 0 and 127. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendTuningProgram(value, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendTuningProgram(value, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + setTuningProgram(value, channel = "all", options = {}) { + if (wm.validation) { + console.warn("The setTuningProgram() method is deprecated. Use sendTuningProgram() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendTuningProgram(value, options); + } + /** + * Sets the MIDI tuning bank to use. Note that the **Tuning Bank** parameter is part of the + * *MIDI Tuning Standard*, which is not widely implemented. + * + * @param {number} [value=0] The desired tuning bank (integer between `0` and `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The bank value must be between 0 and 127. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendTuningBank(value = 0, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendTuningBank(value, options); + }); + return this; + } + + /** + * @private + * @deprecated since version 3.0 + */ + setTuningBank(parameter, channel = "all", options = {}) { + if (wm.validation) { + console.warn("The setTuningBank() method is deprecated. Use sendTuningBank() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendTuningBank(parameter, options); + } + /** + * Sends a MIDI **channel mode** message to the specified channel(s). The channel mode message to + * send can be specified numerically or by using one of the following common names: + * + * | Type |Number| Shortcut Method | + * | ---------------------|------|-------------------------------------------------------------- | + * | `allsoundoff` | 120 | [`sendAllSoundOff()`]{@link #sendAllSoundOff} | + * | `resetallcontrollers`| 121 | [`sendResetAllControllers()`]{@link #sendResetAllControllers} | + * | `localcontrol` | 122 | [`sendLocalControl()`]{@link #sendLocalControl} | + * | `allnotesoff` | 123 | [`sendAllNotesOff()`]{@link #sendAllNotesOff} | + * | `omnimodeoff` | 124 | [`sendOmniMode(false)`]{@link #sendOmniMode} | + * | `omnimodeon` | 125 | [`sendOmniMode(true)`]{@link #sendOmniMode} | + * | `monomodeon` | 126 | [`sendPolyphonicMode("mono")`]{@link #sendPolyphonicMode} | + * | `polymodeon` | 127 | [`sendPolyphonicMode("poly")`]{@link #sendPolyphonicMode} | + * + * Note: as you can see above, to make it easier, all channel mode messages also have a matching + * helper method. + * + * It should also be noted that, per the MIDI specification, only `localcontrol` and `monomodeon` + * may require a value that's not zero. For that reason, the `value` parameter is optional and + * defaults to 0. + * + * @param {number|string} command The numerical identifier of the channel mode message (integer + * between 120-127) or its name as a string. + * + * @param {number} [value=0] The value to send (integer between 0-127). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {TypeError} Invalid channel mode message name. + * @throws {RangeError} Channel mode controller numbers must be between 120 and 127. + * @throws {RangeError} Value must be an integer between 0 and 127. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + */ + + + sendChannelMode(command, value = 0, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendChannelMode(command, value, options); + }); + return this; + } + /** + * Sends an **all sound off** channel mode message. This will silence all sounds playing on that + * channel but will not prevent new sounds from being triggered. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} + * + * @since 3.0.0 + */ + + + sendAllSoundOff(options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendAllSoundOff(options); + }); + return this; + } + /** + * Sends an **all notes off** channel mode message. This will make all currently playing notes + * fade out just as if their key had been released. This is different from the + * [`turnSoundOff()`]{@link #turnSoundOff} method which mutes all sounds immediately. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} + * + * @since 3.0.0 + */ + + + sendAllNotesOff(options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendAllNotesOff(options); + }); + return this; + } + /** + * Sends a **reset all controllers** channel mode message. This resets all controllers, such as + * the pitch bend, to their default value. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} + */ + + + sendResetAllControllers(options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendResetAllControllers(options); + }); + return this; + } + /** + * Sets the polyphonic mode. In `poly` mode (usually the default), multiple notes can be played + * and heard at the same time. In `mono` mode, only one note will be heard at once even if + * multiple notes are being played. + * + * @param mode {string} The mode to use: `mono` or `poly`. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendPolyphonicMode(mode, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendPolyphonicMode(mode, options); + }); + return this; + } + /** + * Turns local control on or off. Local control is usually enabled by default. If you disable it, + * the instrument will no longer trigger its own sounds. It will only send the MIDI messages to + * its out port. + * + * @param [state=false] {boolean} Whether to activate local control (`true`) or disable it + * (`false`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendLocalControl(state, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendLocalControl(state, options); + }); + return this; + } + /** + * Sets OMNI mode to **on** or **off** for the specified channel(s). MIDI's OMNI mode causes the + * instrument to respond to messages from all channels. + * + * It should be noted that support for OMNI mode is not as common as it used to be. + * + * @param [state] {boolean} Whether to activate OMNI mode (`true`) or not (`false`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {TypeError} Invalid channel mode message name. + * @throws {RangeError} Channel mode controller numbers must be between 120 and 127. + * @throws {RangeError} Value must be an integer between 0 and 127. + * + * @return {Output} Returns the `Output` object so methods can be chained. + * + * @since 3.0.0 + */ + + + sendOmniMode(state, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendOmniMode(state, options); + }); + return this; + } + /** + * Sets a non-registered parameter to the specified value. The NRPN is selected by passing a + * two-position array specifying the values of the two control bytes. The value is specified by + * passing a single integer (most cases) or an array of two integers. + * + * NRPNs are not standardized in any way. Each manufacturer is free to implement them any way + * they see fit. For example, according to the Roland GS specification, you can control the + * **vibrato rate** using NRPN (`1`, `8`). Therefore, to set the **vibrato rate** value to `123` + * you would use: + * + * ```js + * WebMidi.outputs[0].sendNrpnValue([1, 8], 123); + * ``` + * + * You probably want to should select a channel so the message is not sent to all channels. For + * instance, to send to channel `1` of the first output port, you would use: + * + * ```js + * WebMidi.outputs[0].sendNrpnValue([1, 8], 123, 1); + * ``` + * + * In some rarer cases, you need to send two values with your NRPN messages. In such cases, you + * would use a 2-position array. For example, for its **ClockBPM** parameter (`2`, `63`), Novation + * uses a 14-bit value that combines an MSB and an LSB (7-bit values). So, for example, if the + * value to send was `10`, you could use: + * + * ```js + * WebMidi.outputs[0].sendNrpnValue([2, 63], [0, 10], 1); + * ``` + * + * For further implementation details, refer to the manufacturer's documentation. + * + * @param parameter {number[]} A two-position array specifying the two control bytes (`0x63`, + * `0x62`) that identify the non-registered parameter. + * + * @param [data=[]] {number|number[]} An integer or an array of integers with a length of 1 or 2 + * specifying the desired data. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws {RangeError} The control value must be between 0 and 127. + * @throws {RangeError} The msb value must be between 0 and 127 + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendNrpnValue(parameter, data, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendNrpnValue(parameter, data, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + setNonRegisteredParameter(parameter, data = [], channel = "all", options = {}) { + if (wm.validation) { + console.warn("The setNonRegisteredParameter() method is deprecated. Use sendNrpnValue() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendNrpnValue(parameter, data, options); + } + /** + * Increments the specified MIDI registered parameter by 1. Here is the full list of parameter + * names that can be used with this method: + * + * * Pitchbend Range (0x00, 0x00): `"pitchbendrange"` + * * Channel Fine Tuning (0x00, 0x01): `"channelfinetuning"` + * * Channel Coarse Tuning (0x00, 0x02): `"channelcoarsetuning"` + * * Tuning Program (0x00, 0x03): `"tuningprogram"` + * * Tuning Bank (0x00, 0x04): `"tuningbank"` + * * Modulation Range (0x00, 0x05): `"modulationrange"` + * * Azimuth Angle (0x3D, 0x00): `"azimuthangle"` + * * Elevation Angle (0x3D, 0x01): `"elevationangle"` + * * Gain (0x3D, 0x02): `"gain"` + * * Distance Ratio (0x3D, 0x03): `"distanceratio"` + * * Maximum Distance (0x3D, 0x04): `"maximumdistance"` + * * Maximum Distance Gain (0x3D, 0x05): `"maximumdistancegain"` + * * Reference Distance Ratio (0x3D, 0x06): `"referencedistanceratio"` + * * Pan Spread Angle (0x3D, 0x07): `"panspreadangle"` + * * Roll Angle (0x3D, 0x08): `"rollangle"` + * + * @param parameter {String|number[]} A string identifying the parameter's name (see above) or a + * two-position array specifying the two control bytes (0x65, 0x64) that identify the registered + * parameter. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendRpnIncrement(parameter, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendRpnIncrement(parameter, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + incrementRegisteredParameter(parameter, channel = "all", options = {}) { + if (wm.validation) { + console.warn("The incrementRegisteredParameter() method is deprecated. Use sendRpnIncrement() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendRpnIncrement(parameter, options); + } + /** + * Decrements the specified MIDI registered parameter by 1. Here is the full list of parameter + * names that can be used with this method: + * + * * Pitchbend Range (0x00, 0x00): `"pitchbendrange"` + * * Channel Fine Tuning (0x00, 0x01): `"channelfinetuning"` + * * Channel Coarse Tuning (0x00, 0x02): `"channelcoarsetuning"` + * * Tuning Program (0x00, 0x03): `"tuningprogram"` + * * Tuning Bank (0x00, 0x04): `"tuningbank"` + * * Modulation Range (0x00, 0x05): `"modulationrange"` + * * Azimuth Angle (0x3D, 0x00): `"azimuthangle"` + * * Elevation Angle (0x3D, 0x01): `"elevationangle"` + * * Gain (0x3D, 0x02): `"gain"` + * * Distance Ratio (0x3D, 0x03): `"distanceratio"` + * * Maximum Distance (0x3D, 0x04): `"maximumdistance"` + * * Maximum Distance Gain (0x3D, 0x05): `"maximumdistancegain"` + * * Reference Distance Ratio (0x3D, 0x06): `"referencedistanceratio"` + * * Pan Spread Angle (0x3D, 0x07): `"panspreadangle"` + * * Roll Angle (0x3D, 0x08): `"rollangle"` + * + * @param parameter {String|number[]} A string identifying the parameter's name (see above) or a + * two-position array specifying the two control bytes (0x65, 0x64) that identify the registered + * parameter. + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @throws TypeError The specified parameter is not available. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendRpnDecrement(parameter, options = {}) { + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendRpnDecrement(parameter, options); + }); + return this; + } + /** + * @private + * @deprecated since version 3.0 + */ + + + decrementRegisteredParameter(parameter, channel = "all", options = {}) { + if (wm.validation) { + console.warn("The decrementRegisteredParameter() method is deprecated. Use sendRpnDecrement() instead."); + options.channels = channel; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + + return this.sendRpnDecrement(parameter, options); + } + /** + * Sends a **note off** message for the specified MIDI note number on the specified channel(s). + * The first parameter is the note to stop. It can be a single value or an array of the following + * valid values: + * + * - A MIDI note number (integer between `0` and `127`) + * - A note identifier (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * - A [`Note`](Note) object + * + * The execution of the **note off** command can be delayed by using the `time` property of the + * `options` parameter. + * + * @param note {number|Note|string|number[]|Note[]|string[]} The note(s) to stop. The notes can be + * specified by using a MIDI note number (`0` - `127`), a note identifier (e.g. `C3`, `G#4`, + * `F-1`, `Db7`) or an array of the previous types. When using a note identifier, octave range + * must be between `-1` and `9`. The lowest note is `C-1` (MIDI note number `0`) and the highest + * note is `G9` (MIDI note number `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number} [options.release=0.5] The velocity at which to release the note + * (between `0` and `1`). If the `rawRelease` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawRelease=64] The velocity at which to release the note + * (between `0` and `127`). If the `release` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `64`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendNoteOff(note, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendNoteOff(note, options); + }); + return this; + } + /** + * Sends a **note off** message for the specified MIDI note number on the specified channel(s). + * The first parameter is the note to stop. It can be a single value or an array of the following + * valid values: + * + * - A MIDI note number (integer between `0` and `127`) + * - A note identifier (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * - A [`Note`](Note) object + * + * The execution of the **note off** command can be delayed by using the `time` property of the + * `options` parameter. + * + * @param note {number|Note|string|number[]|Note[]|string[]} The note(s) to stop. The notes can be + * specified by using a MIDI note number (`0` - `127`), a note identifier (e.g. `C3`, `G#4`, `F-1`, + * `Db7`) or an array of the previous types. When using a note identifier, octave range must be + * between `-1` and `9`. The lowest note is `C-1` (MIDI note number `0`) and the highest note is + * `G9` (MIDI note number `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number} [options.release=0.5] The velocity at which to release the note + * (between `0` and `1`). If the `rawRelease` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawRelease=64] The velocity at which to release the note + * (between `0` and `127`). If the `release` option is also defined, `rawRelease` will have + * priority. An invalid velocity value will silently trigger the default of `64`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + stopNote(note, options) { + return this.sendNoteOff(note, options); + } + /** + * Plays a note or an array of notes on one or more channels of this output. If you intend to play + * notes on a single channel, you should probably use + * [`OutputChannel.playNote()`](OutputChannel#playNote) instead. + * + * The first parameter is the note to play. It can be a single value or an array of the following + * valid values: + * + * - A MIDI note number (integer between `0` and `127`) + * - A note identifier (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * - A [`Note`]{@link Note} object + * + * The `playNote()` method sends a **note on** MIDI message for all specified notes on all + * specified channels. If no channel is specified, it will send to all channels. If a `duration` + * is set in the `options` parameter or in the [`Note`]{@link Note} object's + * [`duration`]{@link Note#duration} property, it will also schedule a **note off** message to end + * the note after said duration. If no `duration` is set, the note will simply play until a + * matching **note off** message is sent with [`stopNote()`]{@link #stopNote}. + * + * The execution of the **note on** command can be delayed by using the `time` property of the + * `options` parameter. + * + * When using [`Note`]{@link Note} objects, the durations and velocities defined in the + * [`Note`]{@link Note} objects have precedence over the ones specified via the method's `options` + * parameter. + * + * **Note**: As per the MIDI standard, a **note on** message with an attack velocity of `0` is + * functionally equivalent to a **note off** message. + * + * @param note {number|string|Note|number[]|string[]|Note[]} The note(s) to play. The notes can be + * specified by using a MIDI note number (0-127), a note identifier (e.g. C3, G#4, F-1, Db7), a + * [`Note`]{@link Note} object or an array of the previous types. When using a note identifier, + * octave range must be between -1 and 9. The lowest note is C-1 (MIDI note number `0`) and the + * highest note is G9 (MIDI note number `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number} [options.duration=undefined] The number of milliseconds after which a + * **note off** message will be scheduled. If left undefined, only a **note on** message is sent. + * + * @param {number} [options.attack=0.5] The velocity at which to play the note (between `0` and + * `1`). If the `rawAttack` option is also defined, it will have priority. An invalid velocity + * value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawAttack=64] The attack velocity at which to play the note (between + * `0` and `127`). This has priority over the `attack` property. An invalid velocity value will + * silently trigger the default of 64. + * + * @param {number} [options.release=0.5] The velocity at which to release the note (between `0` + * and `1`). If the `rawRelease` option is also defined, it will have priority. An invalid + * velocity value will silently trigger the default of `0.5`. This is only used with the + * **note off** event triggered when `options.duration` is set. + * + * @param {number} [options.rawRelease=64] The velocity at which to release the note (between `0` + * and `127`). This has priority over the `release` property. An invalid velocity value will + * silently trigger the default of 64. This is only used with the **note off** event triggered + * when `options.duration` is set. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + playNote(note, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy-compatibility warnings + if (options.rawVelocity) { + console.warn("The 'rawVelocity' option is deprecated. Use 'rawAttack' instead."); + } + + if (options.velocity) { + console.warn("The 'velocity' option is deprecated. Use 'velocity' instead."); + } // Legacy compatibility + + + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].playNote(note, options); + }); + return this; + } + /** + * Sends a **note on** message for the specified MIDI note number on the specified channel(s). The + * first parameter is the number. It can be a single value or an array of the following valid + * values: + * + * - A MIDI note number (integer between `0` and `127`) + * - A note identifier (e.g. `"C3"`, `"G#4"`, `"F-1"`, `"Db7"`) + * - A [`Note`](Note) object + * + * The execution of the **note on** command can be delayed by using the `time` property of the + * `options` parameter. + * + * **Note**: As per the MIDI standard, a **note on** message with an attack velocity of `0` is + * functionally equivalent to a **note off** message. + * + * @param note {number|Note|string|number[]|Note[]|string[]} The note(s) to stop. The notes can be + * specified by using a MIDI note number (`0` - `127`), a note identifier (e.g. `C3`, `G#4`, `F-1`, + * `Db7`) or an array of the previous types. When using a note identifier, octave range must be + * between `-1` and `9`. The lowest note is `C-1` (MIDI note number `0`) and the highest note is + * `G9` (MIDI note number `127`). + * + * @param {Object} [options={}] + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * The MIDI channel number (between `1` and `16`) or an array of channel numbers to use. If no + * channel is specified, all channels will be used. + * + * @param {number} [options.attack=0.5] The velocity at which to play the note (between `0` and + * `1`). If the `rawAttack` option is also defined, `rawAttack` will have priority. An invalid + * velocity value will silently trigger the default of `0.5`. + * + * @param {number} [options.rawAttack=64] The velocity at which to release the note (between `0` + * and `127`). If the `attack` option is also defined, `rawAttack` will have priority. An invalid + * velocity value will silently trigger the default of `64`. + * + * @param {number|string} [options.time=(now)] If `time` is a string prefixed with `"+"` and + * followed by a number, the message will be delayed by that many milliseconds. If the value is a + * positive number + * ([`DOMHighResTimeStamp`]{@link https://developer.mozilla.org/docs/Web/API/DOMHighResTimeStamp}), + * the operation will be scheduled for that time. The current time can be retrieved with + * [`WebMidi.time`]{@link WebMidi#time}. If `options.time` is omitted, or in the past, the + * operation will be carried out as soon as possible. + * + * @returns {Output} Returns the `Output` object so methods can be chained. + */ + + + sendNoteOn(note, options = {}, legacy = {}) { + if (wm.validation) { + // Legacy compatibility + if (Array.isArray(options) || Number.isInteger(options) || options === "all") { + const channels = options; + options = legacy; + options.channels = channels; + if (options.channels === "all") options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + } + } + + if (options.channels == undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; // This actually supports passing a Note object even if, semantically, this does not make sense. + + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].sendNoteOn(note, options); + }); + return this; + } + /** + * Name of the MIDI output. + * + * @type {string} + * @readonly + */ + + + get name() { + return this._midiOutput.name; + } + /** + * ID string of the MIDI output. The ID is host-specific. Do not expect the same ID on different + * platforms. For example, Google Chrome and the Jazz-Plugin report completely different IDs for + * the same port. + * + * @type {string} + * @readonly + */ + + + get id() { + return this._midiOutput.id; + } + /** + * Output port's connection state: `pending`, `open` or `closed`. + * + * @type {string} + * @readonly + */ + + + get connection() { + return this._midiOutput.connection; + } + /** + * Name of the manufacturer of the device that makes this output port available. + * + * @type {string} + * @readonly + */ + + + get manufacturer() { + return this._midiOutput.manufacturer; + } + /** + * State of the output port: `connected` or `disconnected`. + * + * @type {string} + * @readonly + */ + + + get state() { + return this._midiOutput.state; + } + /** + * Type of the output port (it will always be: `output`). + * + * @type {string} + * @readonly + */ + + + get type() { + return this._midiOutput.type; + } + /** + * An integer to offset the octave of outgoing notes. By default, middle C (MIDI note number 60) + * is placed on the 4th octave (C4). + * + * Note that this value is combined with the global offset value defined in + * [`WebMidi.octaveOffset`](WebMidi#octaveOffset) (if any). + * + * @type {number} + * + * @since 3.0 + */ + + + get octaveOffset() { + return this._octaveOffset; + } + + set octaveOffset(value) { + if (this.validation) { + value = parseInt(value); + if (isNaN(value)) throw new TypeError("The 'octaveOffset' property must be an integer."); + } + + this._octaveOffset = value; + } + + } + + /** + * The `Forwarder` class allows the forwarding of MIDI messages to predetermined outputs. When you + * call its [`forward()`](#forward) method, it will send the specified [`Message`](Message) object + * to all the outputs listed in its [`destinations`](#destinations) property. + * + * If specific channels or message types have been defined in the [`channels`](#channels) or + * [`types`](#types) properties, only messages matching the channels/types will be forwarded. + * + * While it can be manually instantiated, you are more likely to come across a `Forwarder` object as + * the return value of the [`Input.addForwarder()`](Input#addForwarder) method. + * + * @license Apache-2.0 + * @since 3.0.0 + */ + + class Forwarder { + /** + * Creates a `Forwarder` object. + * + * @param {Output|Output[]} [destinations=\[\]] An [`Output`](Output) object, or an array of such + * objects, to forward the message to. + * + * @param {object} [options={}] + * @param {string|string[]} [options.types=(all messages)] A MIDI message type or an array of such + * types (`"noteon"`, `"controlchange"`, etc.), that the specified message must match in order to + * be forwarded. If this option is not specified, all types of messages will be forwarded. Valid + * messages are the ones found in either + * [`MIDI_SYSTEM_MESSAGES`](Enumerations#MIDI_SYSTEM_MESSAGES) + * or [`MIDI_CHANNEL_MESSAGES`](Enumerations#MIDI_CHANNEL_MESSAGES). + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * A MIDI channel number or an array of channel numbers that the message must match in order to be + * forwarded. By default all MIDI channels are included (`1` to `16`). + */ + constructor(destinations = [], options = {}) { + /** + * An array of [`Output`](Output) objects to forward the message to. + * @type {Output[]} + */ + this.destinations = []; + /** + * An array of message types (`"noteon"`, `"controlchange"`, etc.) that must be matched in order + * for messages to be forwarded. By default, this array includes all + * [`Enumerations.MIDI_SYSTEM_MESSAGES`](Enumerations#MIDI_SYSTEM_MESSAGES) and + * [`Enumerations.MIDI_CHANNEL_MESSAGES`](Enumerations#MIDI_CHANNEL_MESSAGES). + * @type {string[]} + */ + + this.types = [...Object.keys(Enumerations.MIDI_SYSTEM_MESSAGES), ...Object.keys(Enumerations.MIDI_CHANNEL_MESSAGES)]; + /** + * An array of MIDI channel numbers that the message must match in order to be forwarded. By + * default, this array includes all MIDI channels (`1` to `16`). + * @type {number[]} + */ + + this.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + /** + * Indicates whether message forwarding is currently suspended or not in this forwarder. + * @type {boolean} + */ + + this.suspended = false; // Make sure parameters are arrays + + if (!Array.isArray(destinations)) destinations = [destinations]; + if (options.types && !Array.isArray(options.types)) options.types = [options.types]; + if (options.channels && !Array.isArray(options.channels)) options.channels = [options.channels]; + + if (wm.validation) { + // Validate destinations + destinations.forEach(destination => { + if (!(destination instanceof Output)) { + throw new TypeError("Destinations must be of type 'Output'."); + } + }); // Validate types + + if (options.types !== undefined) { + options.types.forEach(type => { + if (!Enumerations.MIDI_SYSTEM_MESSAGES.hasOwnProperty(type) && !Enumerations.MIDI_CHANNEL_MESSAGES.hasOwnProperty(type)) { + throw new TypeError("Type must be a valid message type."); + } + }); + } // Validate channels + + + if (options.channels !== undefined) { + options.channels.forEach(channel => { + if (!Enumerations.MIDI_CHANNEL_NUMBERS.includes(channel)) { + throw new TypeError("MIDI channel must be between 1 and 16."); + } + }); + } + } + + this.destinations = destinations; + if (options.types) this.types = options.types; + if (options.channels) this.channels = options.channels; + } + /** + * Sends the specified message to the forwarder's destination(s) if it matches the specified + * type(s) and channel(s). + * + * @param {Message} message The [`Message`](Message) object to forward. + */ + + + forward(message) { + // Abort if forwarding is currently suspended + if (this.suspended) return; // Abort if this message type should not be forwarded + + if (!this.types.includes(message.type)) return; // Abort if this channel should not be forwarded + + if (message.channel && !this.channels.includes(message.channel)) return; // Forward + + this.destinations.forEach(destination => { + if (wm.validation && !(destination instanceof Output)) return; + destination.send(message); + }); + } + + } + + /** + * The `InputChannel` class represents a single MIDI input channel (1-16) from a single input + * device. This object is derived from the host's MIDI subsystem and should not be instantiated + * directly. + * + * All 16 `InputChannel` objects can be found inside the input's [`channels`](Input#channels) + * property. + * + * @fires InputChannel#midimessage + * @fires InputChannel#unknownmessage + * + * @fires InputChannel#noteoff + * @fires InputChannel#noteon + * @fires InputChannel#keyaftertouch + * @fires InputChannel#programchange + * @fires InputChannel#event:controlchange-controllerxxx + * @fires InputChannel#channelaftertouch + * @fires InputChannel#pitchbend + * @fires InputChannel#controlchange + * + * @fires InputChannel#allnotesoff + * @fires InputChannel#allsoundoff + * @fires InputChannel#localcontrol + * @fires InputChannel#monomode + * @fires InputChannel#omnimode + * @fires InputChannel#resetallcontrollers + * + * @fires InputChannel#event:nrpn + * @fires InputChannel#event:nrpn-dataentrycoarse + * @fires InputChannel#event:nrpn-dataentryfine + * @fires InputChannel#event:nrpn-databuttonincrement + * @fires InputChannel#event:nrpn-databuttondecrement + * @fires InputChannel#event:rpn + * @fires InputChannel#event:rpn-dataentrycoarse + * @fires InputChannel#event:rpn-dataentryfine + * @fires InputChannel#event:rpn-databuttonincrement + * @fires InputChannel#event:rpn-databuttondecrement + * + * @extends EventEmitter + * @license Apache-2.0 + * @since 3.0.0 + */ + + class InputChannel extends EventEmitter { + /** + * Creates an `InputChannel` object. + * + * @param {Input} input The [`Input`](Input) object this channel belongs to. + * @param {number} number The channel's MIDI number (1-16). + */ + constructor(input, number) { + super(); + /** + * @type {Input} + * @private + */ + + this._input = input; + /** + * @type {number} + * @private + */ + + this._number = number; + /** + * @type {number} + * @private + */ + + this._octaveOffset = 0; + /** + * An array of messages that form the current NRPN sequence + * @private + * @type {Message[]} + */ + + this._nrpnBuffer = []; + /** + * An array of messages that form the current RPN sequence + * @private + * @type {Message[]} + */ + + this._rpnBuffer = []; + /** + * Indicates whether events for **Registered Parameter Number** and **Non-Registered Parameter + * Number** should be dispatched. RPNs and NRPNs are composed of a sequence of specific + * **control change** messages. When a valid sequence of such control change messages is + * received, an [`rpn`](#event-rpn) or [`nrpn`](#event-nrpn) event will fire. + * + * If an invalid or out-of-order **control change** message is received, it will fall through + * the collector logic and all buffered **control change** messages will be discarded as + * incomplete. + * + * @type {boolean} + */ + + this.parameterNumberEventsEnabled = true; + /** + * Contains the current playing state of all MIDI notes of this channel (0-127). The state is + * `true` for a currently playing note and `false` otherwise. + * @type {boolean[]} + */ + + this.notesState = new Array(128).fill(false); + } + /** + * Destroys the `InputChannel` by removing all listeners and severing the link with the MIDI + * subsystem's input. + */ + + + destroy() { + this._input = null; + this._number = null; + this._octaveOffset = 0; + this._nrpnBuffer = []; + this.notesState = new Array(128).fill(false); + this.parameterNumberEventsEnabled = false; + this.removeListener(); + } + /** + * @param e MIDIMessageEvent + * @private + */ + + + _processMidiMessageEvent(e) { + // Create and emit a new 'midimessage' event based on the incoming one + const event = Object.assign({}, e); + event.port = this.input; + event.target = this; + event.type = "midimessage"; + /** + * Event emitted when a MIDI message of any kind is received by an `InputChannel` + * + * @event InputChannel#midimessage + * + * @type {object} + * + * @property {string} type `midimessage` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + */ + + this.emit(event.type, event); // Parse the inbound event for regular MIDI messages + + this._parseEventForStandardMessages(event); + } + /** + * Parses incoming channel events and emit standard MIDI message events (noteon, noteoff, etc.) + * @param e Event + * @private + */ + + + _parseEventForStandardMessages(e) { + const event = Object.assign({}, e); + event.type = event.message.type || "unknownmessage"; + const data1 = e.message.dataBytes[0]; + const data2 = e.message.dataBytes[1]; + + if (event.type === "noteoff" || event.type === "noteon" && data2 === 0) { + this.notesState[data1] = false; + event.type = "noteoff"; // necessary for note on with 0 velocity + + /** + * Event emitted when a **note off** MIDI message has been received on the channel. + * + * @event InputChannel#noteoff + * + * @type {object} + * @property {string} type `noteoff` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the incoming + * MIDI message. + * @property {number} timestamp The moment + * ([`DOMHighResTimeStamp`](https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp)) + * when the event occurred (in milliseconds since the navigation start of the document). + * + * @property {object} note A [`Note`](Note) object containing information such as note name, + * octave and release velocity. + * @property {number} value The release velocity amount expressed as a float between 0 and 1. + * @property {number} rawValue The release velocity amount expressed as an integer (between 0 + * and 127). + */ + // The object created when a noteoff event arrives is a Note with an attack velocity of 0. + + event.note = new TS_WebMIDI_Note(Utilities.offsetNumber(data1, this.octaveOffset + this.input.octaveOffset + wm.octaveOffset), { + rawAttack: 0, + rawRelease: data2 + }); + event.value = Utilities.from7bitToFloat(data2); + event.rawValue = data2; // Those are kept for backwards-compatibility but are gone from the documentation. They will + // be removed in future versions (@deprecated). + + event.velocity = event.note.release; + event.rawVelocity = event.note.rawRelease; + } else if (event.type === "noteon") { + this.notesState[data1] = true; + /** + * Event emitted when a **note on** MIDI message has been received. + * + * @event InputChannel#noteon + * + * @type {object} + * @property {string} type `noteon` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {object} note A [`Note`](Note) object containing information such as note name, + * octave and release velocity. + * @property {number} value The attack velocity amount expressed as a float between 0 and 1. + * @property {number} rawValue The attack velocity amount expressed as an integer (between 0 + * and 127). + */ + + event.note = new TS_WebMIDI_Note(Utilities.offsetNumber(data1, this.octaveOffset + this.input.octaveOffset + wm.octaveOffset), { + rawAttack: data2 + }); + event.value = Utilities.from7bitToFloat(data2); + event.rawValue = data2; // Those are kept for backwards-compatibility but are gone from the documentation. They will + // be removed in future versions (@deprecated). + + event.velocity = event.note.attack; + event.rawVelocity = event.note.rawAttack; + } else if (event.type === "keyaftertouch") { + /** + * Event emitted when a **key-specific aftertouch** MIDI message has been received. + * + * @event InputChannel#keyaftertouch + * + * @type {object} + * @property {string} type `"keyaftertouch"` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {object} note A [`Note`](Note) object containing information such as note name + * and number. + * @property {number} value The aftertouch amount expressed as a float between 0 and 1. + * @property {number} rawValue The aftertouch amount expressed as an integer (between 0 and + * 127). + */ + event.note = new TS_WebMIDI_Note(Utilities.offsetNumber(data1, this.octaveOffset + this.input.octaveOffset + wm.octaveOffset)); // Aftertouch value + + event.value = Utilities.from7bitToFloat(data2); + event.rawValue = data2; // @deprecated + + event.identifier = event.note.identifier; + event.key = event.note.number; + event.rawKey = data1; + } else if (event.type === "controlchange") { + /** + * Event emitted when a **control change** MIDI message has been received. + * + * @event InputChannel#controlchange + * + * @type {object} + * @property {string} type `controlchange` + * @property {string} subtype The type of control change message that was received. + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {object} controller + * @property {object} controller.number The number of the controller. + * @property {object} controller.name The usual name or function of the controller. + * @property {number} value The value expressed as a float between 0 and 1. + * @property {number} rawValue The value expressed as an integer (between 0 and 127). + */ + event.controller = { + number: data1, + name: Utilities.getCcNameByNumber(data1) + }; + event.subtype = event.controller.name || "controller" + data1; + event.value = Utilities.from7bitToFloat(data2); + event.rawValue = data2; + /** + * Event emitted when a **control change** MIDI message has been received and that message is + * targeting the controller numbered "xxx". Of course, "xxx" should be replaced by a valid + * controller number (0-127). + * + * @event InputChannel#controlchange-controllerxxx + * + * @type {object} + * @property {string} type `controlchange-controllerxxx` + * @property {string} subtype The type of control change message that was received. + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {object} controller + * @property {object} controller.number The number of the controller. + * @property {object} controller.name The usual name or function of the controller. + * @property {number} value The value expressed as a float between 0 and 1. + * @property {number} rawValue The value expressed as an integer (between 0 and 127). + */ + + const specificEvent = Object.assign({}, event); + specificEvent.type = `${event.type}-controller${data1}`; + delete specificEvent.subtype; + this.emit(specificEvent.type, specificEvent); // Trigger channel mode message events (if appropriate) + + if (event.message.dataBytes[0] >= 120) this._parseChannelModeMessage(event); // Parse the inbound event to see if its part of an RPN/NRPN sequence + + if (this.parameterNumberEventsEnabled && this._isRpnOrNrpnController(event.message.dataBytes[0])) { + this._parseEventForParameterNumber(event); + } + } else if (event.type === "programchange") { + /** + * Event emitted when a **program change** MIDI message has been received. + * + * @event InputChannel#programchange + * + * @type {object} + * @property {string} type `programchange` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {number} value The value expressed as an integer between 0 and 127. + * @property {number} rawValue The raw MIDI value expressed as an integer between 0 and 127. + */ + event.value = data1; + event.rawValue = event.value; + } else if (event.type === "channelaftertouch") { + /** + * Event emitted when a control change MIDI message has been received. + * + * @event InputChannel#channelaftertouch + * + * @type {object} + * @property {string} type `channelaftertouch` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {number} value The value expressed as a float between 0 and 1. + * @property {number} rawValue The raw MIDI value expressed as an integer between 0 and 127. + */ + event.value = Utilities.from7bitToFloat(data1); + event.rawValue = data1; + } else if (event.type === "pitchbend") { + /** + * Event emitted when a pitch bend MIDI message has been received. + * + * @event InputChannel#pitchbend + * + * @type {object} + * @property {string} type `pitchbend` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {number} value The value expressed as a float between 0 and 1. + * @property {number} rawValue The raw MIDI value expressed as an integer (between 0 and + * 16383). + */ + event.value = ((data2 << 7) + data1 - 8192) / 8192; + event.rawValue = (data2 << 7) + data1; + } else { + event.type = "unknownmessage"; + } + + this.emit(event.type, event); + } + /** + * @param e {Object} + * @private + */ + + + _parseChannelModeMessage(e) { + // Make a shallow copy of the incoming event so we can use it as the new event. + const event = Object.assign({}, e); + event.type = event.controller.name; + /** + * Event emitted when an "all sound off" channel-mode MIDI message has been received. + * + * @event InputChannel#allsoundoff + * + * @type {object} + * @property {string} type `allsoundoff` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + */ + + /** + * Event emitted when a "reset all controllers" channel-mode MIDI message has been received. + * + * @event InputChannel#resetallcontrollers + * + * @type {object} + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + */ + + /** + * Event emitted when a "local control" channel-mode MIDI message has been received. The value + * property of the event is set to either `true` (local control on) of `false` (local control + * off). + * + * @event InputChannel#localcontrol + * + * @type {object} + * @property {string} type `localcontrol` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {boolean} value For local control on, the value is `true`. For local control off, + * the value is `false`. + * @property {boolean} rawValue For local control on, the value is `127`. For local control off, + * the value is `0`. + */ + + if (event.type === "localcontrol") { + event.value = event.message.data[2] === 127 ? true : false; + event.rawValue = event.message.data[2]; + } + /** + * Event emitted when an "all notes off" channel-mode MIDI message has been received. + * + * @event InputChannel#allnotesoff + * + * @type {object} + * @property {string} type `allnotesoff` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + */ + + /** + * Event emitted when an "omni mode" channel-mode MIDI message has been received. The value + * property of the event is set to either `true` (omni mode on) of `false` (omni mode off). + * + * @event InputChannel#omnimode + * + * @type {object} + * @property {string} type `"omnimode"` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {boolean} value The value is `true` for omni mode on and false for omni mode off. + * @property {boolean} rawValue The raw MIDI value + */ + + + if (event.type === "omnimodeon") { + event.type = "omnimode"; + event.value = true; + event.rawValue = event.message.data[2]; + } else if (event.type === "omnimodeoff") { + event.type = "omnimode"; + event.value = false; + event.rawValue = event.message.data[2]; + } + /** + * Event emitted when a "mono/poly mode" MIDI message has been received. The value property of + * the event is set to either `true` (mono mode on / poly mode off) or `false` (mono mode off / + * poly mode on). + * + * @event InputChannel#monomode + * + * @type {object} + * @property {string} type `monomode` + * + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * + * @property {boolean} value The value is `true` for omni mode on and false for omni mode off. + * @property {boolean} rawValue The raw MIDI value + */ + + + if (event.type === "monomodeon") { + event.type = "monomode"; + event.value = true; + event.rawValue = event.message.data[2]; + } else if (event.type === "polymodeon") { + event.type = "monomode"; + event.value = false; + event.rawValue = event.message.data[2]; + } + + this.emit(event.type, event); + } + /** + * Parses inbound events to identify RPN/NRPN sequences. + * @param e Event + * @private + */ + + + _parseEventForParameterNumber(event) { + // To make it more legible + const controller = event.message.dataBytes[0]; + const value = event.message.dataBytes[1]; + const list = Enumerations.MIDI_CONTROL_CHANGE_MESSAGES; // A. Check if the message is the start of an RPN (101) or NRPN (99) parameter declaration. + + if (controller === list.nonregisteredparameterfine || // 99 + controller === list.registeredparameterfine // 101 + ) { + this._nrpnBuffer = []; + this._rpnBuffer = []; + + if (controller === list.nonregisteredparameterfine) { + // 99 + this._nrpnBuffer = [event.message]; + } else { + // 101 + // 127 is a reset so we ignore it + if (value !== 127) this._rpnBuffer = [event.message]; + } // B. Check if the message is the end of an RPN (100) or NRPN (98) parameter declaration. + + } else if (controller === list.nonregisteredparametercoarse || // 98 + controller === list.registeredparametercoarse // 100 + ) { + if (controller === list.nonregisteredparametercoarse) { + // 98 + // Flush the other buffer (they are mutually exclusive) + this._rpnBuffer = []; // Check if we are in sequence + + if (this._nrpnBuffer.length === 1) { + this._nrpnBuffer.push(event.message); + } else { + this._nrpnBuffer = []; // out of sequence + } + } else { + // 100 + // Flush the other buffer (they are mutually exclusive) + this._nrpnBuffer = []; // 127 is a reset so we ignore it + + if (this._rpnBuffer.length === 1 && value !== 127) { + this._rpnBuffer.push(event.message); + } else { + this._rpnBuffer = []; // out of sequence or reset + } + } // C. Check if the message is for data entry (6, 38, 96 or 97). Those messages trigger events. + + } else if (controller === list.dataentrycoarse || // 6 + controller === list.dataentryfine || // 38 + controller === list.databuttonincrement || // 96 + controller === list.databuttondecrement // 97 + ) { + if (this._rpnBuffer.length === 2) { + this._dispatchParameterNumberEvent("rpn", this._rpnBuffer[0].dataBytes[1], this._rpnBuffer[1].dataBytes[1], event); + } else if (this._nrpnBuffer.length === 2) { + this._dispatchParameterNumberEvent("nrpn", this._nrpnBuffer[0].dataBytes[1], this._nrpnBuffer[1].dataBytes[1], event); + } else { + this._nrpnBuffer = []; + this._rpnBuffer = []; + } + } + } + /** + * Indicates whether the specified controller can be part of an RPN or NRPN sequence + * @param controller + * @returns {boolean} + * @private + */ + + + _isRpnOrNrpnController(controller) { + return controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.dataentrycoarse || // 6 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.dataentryfine || // 38 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.databuttonincrement || // 96 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.databuttondecrement || // 97 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.nonregisteredparametercoarse || // 98 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.nonregisteredparameterfine || // 99 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.registeredparametercoarse || // 100 + controller === Enumerations.MIDI_CONTROL_CHANGE_MESSAGES.registeredparameterfine; // 101 + } + /** + * @private + */ + + + _dispatchParameterNumberEvent(type, paramMsb, paramLsb, e) { + type = type === "nrpn" ? "nrpn" : "rpn"; + /** + * Event emitted when an **RPN data entry coarse** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#rpn-dataentrycoarse + * + * @type {object} + * + * @property {string} type `rpn-dataentrycoarse` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **RPN data entry fine** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#rpn-dataentryfine + * + * @type {object} + * + * @property {string} type `rpn-dataentryfine` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **RPN data button increment** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#rpn-databuttonincrement + * + * @type {object} + * + * @property {string} type `rpn-databuttonincrement` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **RPN data button decrement** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#rpn-databuttondecrement + * + * @type {object} + * + * @property {string} type `rpn-databuttondecrement` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **NRPN data entry coarse** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#nrpn-dataentrycoarse + * + * @type {object} + * + * @property {string} type `nrpn-dataentrycoarse` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **NRPN data entry fine** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#nrpn-dataentryfine + * + * @type {object} + * + * @property {string} type `nrpn-dataentryfine` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **NRPN data button increment** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#nrpn-databuttonincrement + * + * @type {object} + * + * @property {string} type `nrpn-databuttonincrement` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when an **NRPN data button decrement** message is received on the input. The + * specific parameter to which the message applies can be found in the event's `parameter` + * property. It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#nrpn-databuttondecrement + * + * @type {object} + * + * @property {string} type `nrpn-databuttondecrement` + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + const event = { + target: e.target, + timestamp: e.timestamp, + message: e.message, + parameterMsb: paramMsb, + parameterLsb: paramLsb, + value: Utilities.from7bitToFloat(e.message.dataBytes[1]), + rawValue: e.message.dataBytes[1] + }; // Identify the parameter (by name for RPN and by number for NRPN) + + if (type === "rpn") { + event.parameter = Object.keys(Enumerations.MIDI_REGISTERED_PARAMETERS).find(key => { + return Enumerations.MIDI_REGISTERED_PARAMETERS[key][0] === paramMsb && Enumerations.MIDI_REGISTERED_PARAMETERS[key][1] === paramLsb; + }); + } else { + event.parameter = (paramMsb << 7) + paramLsb; + } // Type and subtype + + + const subtype = Utilities.getPropertyByValue(Enumerations.MIDI_CONTROL_CHANGE_MESSAGES, e.message.dataBytes[0]); // Emit specific event + + event.type = `${type}-${subtype}`; + this.emit(event.type, event); + /** + * Event emitted when any NRPN message is received on the input. There are four subtypes of NRPN + * messages: + * + * * `nrpn-dataentrycoarse` + * * `nrpn-dataentryfine` + * * `nrpn-databuttonincrement` + * * `nrpn-databuttondecrement` + * + * The parameter to which the message applies can be found in the event's `parameter` property. + * + * @event InputChannel#nrpn + * + * @type {object} + * + * @property {string} type `nrpn` + * @property {string} subtype The precise type of NRPN message that was received. + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} parameter The non-registered parameter number (0-16383) + * @property {number} parameterMsb The MSB portion of the non-registered parameter number + * (0-127) + * @property {number} parameterLsb: The LSB portion of the non-registered parameter number + * (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + + /** + * Event emitted when any RPN message is received on the input. There are four subtypes of RPN + * messages: + * + * * `rpn-dataentrycoarse` + * * `rpn-dataentryfine` + * * `rpn-databuttonincrement` + * * `rpn-databuttondecrement` + * + * The parameter to which the message applies can be found in the event's `parameter` property. + * It is one of the ones defined in + * [`Enumerations.MIDI_REGISTERED_PARAMETERS`](Enumerations#MIDI_REGISTERED_PARAMETERS). + * + * @event InputChannel#rpn + * + * @type {object} + * + * @property {string} type `rpn` + * @property {string} subtype The precise type of RPN message that was received. + * @property {InputChannel} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {string} parameter The registered parameter's name + * @property {number} parameterMsb The MSB portion of the registered parameter (0-127) + * @property {number} parameterLsb: The LSB portion of the registered parameter (0-127) + * @property {number} value The received value as a normalized number between 0 and 1. + * @property {number} rawValue The value as received (0-127) + */ + // Emit general event + + event.type = type; + event.subtype = subtype; + this.emit(event.type, event); + } + /** + * @deprecated since version 3. + * @private + */ + + + getChannelModeByNumber(number) { + if (wm.validation) { + console.warn("The 'getChannelModeByNumber()' method has been moved to the 'Utilities' class."); + number = Math.floor(number); + } + + return Utilities.getChannelModeByNumber(number); + } + /** + * @deprecated since version 3. + * @private + */ + + + getCcNameByNumber(number) { + if (wm.validation) { + console.warn("The 'getCcNameByNumber()' method has been moved to the 'Utilities' class."); + number = parseInt(number); + if (!(number >= 0 && number <= 127)) throw new RangeError("Invalid control change number."); + } + + return Utilities.getCcNameByNumber(number); + } + /** + * Returns the playing status of the specified note (`true` if the note is currently playing, + * `false` if it is not). The `note` parameter can be an unsigned integer (0-127), a note + * identifier (`"C4"`, `"G#5"`, etc.) or a [`Note`]{@link Note} object. + * + * IF the note is specified using an integer (0-127), no octave offset will be applied. + * + * @param {number|string|Note} note The note to get the state for. The + * [`octaveOffset`](#octaveOffset) (channel, input and global) will be factored in for note + * identifiers and [`Note`]{@link Note} objects. + * @returns {boolean} + * @since version 3.0.0 + */ + + + getNoteState(note) { + // If it's a note object, we simply use the identifier + if (note instanceof TS_WebMIDI_Note) note = note.identifier; + const number = Utilities.guessNoteNumber(note, wm.octaveOffset + this.input.octaveOffset + this.octaveOffset); + return this.notesState[number]; + } + /** + * An integer to offset the reported octave of incoming note-specific messages (`noteon`, + * `noteoff` and `keyaftertouch`). By default, middle C (MIDI note number 60) is placed on the 4th + * octave (C4). + * + * If, for example, `octaveOffset` is set to 2, MIDI note number 60 will be reported as C6. If + * `octaveOffset` is set to -1, MIDI note number 60 will be reported as C3. + * + * Note that this value is combined with the global offset value defined by + * [`WebMidi.octaveOffset`](WebMidi#octaveOffset) object and with the value defined on the parent + * input object with [`Input.octaveOffset`](Input#octaveOffset). + * + * @type {number} + * + * @since 3.0 + */ + + + get octaveOffset() { + return this._octaveOffset; + } + + set octaveOffset(value) { + if (this.validation) { + value = parseInt(value); + if (isNaN(value)) throw new TypeError("The 'octaveOffset' property must be an integer."); + } + + this._octaveOffset = value; + } + /** + * The [`Input`](Input) this channel belongs to. + * @type {Input} + * @since 3.0 + */ + + + get input() { + return this._input; + } + /** + * This channel's MIDI number (1-16). + * @type {number} + * @since 3.0 + */ + + + get number() { + return this._number; + } + /** + * Whether RPN/NRPN events are parsed and dispatched. + * @type {boolean} + * @since 3.0 + * @deprecated Use parameterNumberEventsEnabled instead. + * @private + */ + + + get nrpnEventsEnabled() { + return this.parameterNumberEventsEnabled; + } + + set nrpnEventsEnabled(value) { + if (this.validation) { + value = !!value; + } + + this.parameterNumberEventsEnabled = value; + } + + } + + /** + * The `Message` class represents a single MIDI message. It has several properties that make it + * easy to make sense of the binary data it contains. + * + * @license Apache-2.0 + * @since 3.0.0 + */ + + class Message { + /** + * Creates a new `Message` object from raw MIDI data. + * + * @param {Uint8Array} data The raw data of the MIDI message as a + * [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) + * of integers between `0` and `255`. + */ + constructor(data) { + /** + * A + * [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) + * containing the bytes of the MIDI message. Each byte is an integer between `0` and `255`. + * + * @type {Uint8Array} + * @readonly + */ + this.rawData = data; + /** + * An array containing all the bytes of the MIDI message. Each byte is an integer between `0` + * and `255`. + * + * @type {number[]} + * @readonly + */ + + this.data = Array.from(this.rawData); + /** + * The MIDI status byte of the message as an integer between `0` and `255`. + * + * @type {number} + * @readonly + */ + + this.statusByte = this.rawData[0]; + /** + * A + * [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) + * of the data byte(s) of the MIDI message. When the message is a system exclusive message + * (sysex), `rawDataBytes` explicitly excludes the manufacturer ID and the sysex end byte so + * only the actual data is included. + * + * @type {Uint8Array} + * @readonly + */ + + this.rawDataBytes = this.rawData.slice(1); + /** + * An array of the the data byte(s) of the MIDI message (as opposed to the status byte). When + * the message is a system exclusive message (sysex), `dataBytes` explicitly excludes the + * manufacturer ID and the sysex end byte so only the actual data is included. + * + * @type {number[]} + * @readonly + */ + + this.dataBytes = this.data.slice(1); + /** + * A boolean indicating whether the MIDI message is a channel-specific message. + * + * @type {boolean} + * @readonly + */ + + this.isChannelMessage = false; + /** + * A boolean indicating whether the MIDI message is a system message (not specific to a + * channel). + * + * @type {boolean} + * @readonly + */ + + this.isSystemMessage = false; + /** + * An integer identifying the MIDI command. For channel-specific messages, the value is 4-bit + * and will be between `8` and `14`. For system messages, the value will be between `240` and + * `255`. + * + * @type {number} + * @readonly + */ + + this.command = undefined; + /** + * The MIDI channel number (`1` - `16`) that the message is targeting. This is only for + * channel-specific messages. For system messages, this will be left `undefined`. + * + * @type {number} + * @readonly + */ + + this.channel = undefined; + /** + * When the message is a system exclusive message (sysex), this property contains an array with + * either 1 or 3 entries that identify the manufacturer targeted by the message. + * + * To know how to translate these entries into manufacturer names, check out the official list: + * https://www.midi.org/specifications-old/item/manufacturer-id-numbers + * + * @type {number[]} + * @readonly + */ + + this.manufacturerId = undefined; + /** + * The type of message as a string (`"noteon"`, `"controlchange"`, `"sysex"`, etc.) + * + * @type {string} + * @readonly + */ + + this.type = undefined; // Assign values to property that vary according to whether they are channel-specific or system + + if (this.statusByte < 240) { + this.isChannelMessage = true; + this.command = this.statusByte >> 4; + this.channel = (this.statusByte & 0b00001111) + 1; + } else { + this.isSystemMessage = true; + this.command = this.statusByte; + } // Assign type (depending on whether the message is channel-specific or system) + + + if (this.isChannelMessage) { + this.type = Utilities.getPropertyByValue(Enumerations.MIDI_CHANNEL_MESSAGES, this.command); + } else if (this.isSystemMessage) { + this.type = Utilities.getPropertyByValue(Enumerations.MIDI_SYSTEM_MESSAGES, this.command); + } // When the message is a sysex message, we add a manufacturer property and strip out the id from + // dataBytes and rawDataBytes. + + + if (this.statusByte === Enumerations.MIDI_SYSTEM_MESSAGES.sysex) { + if (this.dataBytes[0] === 0) { + this.manufacturerId = this.dataBytes.slice(0, 3); + this.dataBytes = this.dataBytes.slice(3, this.rawDataBytes.length - 1); + this.rawDataBytes = this.rawDataBytes.slice(3, this.rawDataBytes.length - 1); + } else { + this.manufacturerId = [this.dataBytes[0]]; + this.dataBytes = this.dataBytes.slice(1, this.dataBytes.length - 1); + this.rawDataBytes = this.rawDataBytes.slice(1, this.rawDataBytes.length - 1); + } + } + } + + } + + /** + * The `Input` class represents a single MIDI input port. This object is automatically instantiated + * by the library according to the host's MIDI subsystem and does not need to be directly + * instantiated. Instead, you can access all `Input` objects by referring to the + * [`WebMidi.inputs`](WebMidi#inputs) array. You can also retrieve inputs by using methods such as + * [`WebMidi.getInputByName()`](WebMidi#getInputByName) and + * [`WebMidi.getInputById()`](WebMidi#getInputById). + * + * Note that a single MIDI device may expose several inputs and/or outputs. + * + * **Important**: the `Input` class does not directly fire channel-specific MIDI messages + * (such as [`noteon`](InputChannel#event:noteon) or + * [`controlchange`](InputChannel#event:controlchange), etc.). The [`InputChannel`](InputChannel) + * object does that. However, you can still use the + * [`Input.addListener()`](#addListener) method to listen to channel-specific events on multiple + * [`InputChannel`](InputChannel) objects at once. + * + * @fires Input#opened + * @fires Input#disconnected + * @fires Input#closed + * @fires Input#midimessage + * + * @fires Input#sysex + * @fires Input#timecode + * @fires Input#songposition + * @fires Input#songselect + * @fires Input#tunerequest + * @fires Input#clock + * @fires Input#start + * @fires Input#continue + * @fires Input#stop + * @fires Input#activesensing + * @fires Input#reset + * + * @fires Input#unknownmidimessage + * + * @extends EventEmitter + * @license Apache-2.0 + */ + + class Input extends EventEmitter { + /** + * Creates an `Input` object. + * + * @param {MIDIInput} midiInput [`MIDIInput`](https://developer.mozilla.org/en-US/docs/Web/API/MIDIInput) + * object as provided by the MIDI subsystem (Web MIDI API). + */ + constructor(midiInput) { + super(); + /** + * Reference to the actual MIDIInput object + * @private + */ + + this._midiInput = midiInput; + /** + * @type {number} + * @private + */ + + this._octaveOffset = 0; + /** + * Array containing the 16 [`InputChannel`](InputChannel) objects available for this `Input`. The + * channels are numbered 1 through 16. + * + * @type {InputChannel[]} + */ + + this.channels = []; + + for (let i = 1; i <= 16; i++) this.channels[i] = new InputChannel(this, i); + /** + * @type {Forwarder[]} + * @private + */ + + + this._forwarders = []; // Setup listeners + + this._midiInput.onstatechange = this._onStateChange.bind(this); + this._midiInput.onmidimessage = this._onMidiMessage.bind(this); + } + /** + * Destroys the `Input` by removing all listeners, emptying the [`channels`](#channels) array and + * unlinking the MIDI subsystem. This is mostly for internal use. + * + * @returns {Promise} + */ + + + async destroy() { + this.removeListener(); + this.channels.forEach(ch => ch.destroy()); + this.channels = []; + this._forwarders = []; + + if (this._midiInput) { + this._midiInput.onstatechange = null; + this._midiInput.onmidimessage = null; + } + + await this.close(); + this._midiInput = null; + } + /** + * Executed when a `"statechange"` event occurs. + * + * @param e + * @private + */ + + + _onStateChange(e) { + let event = { + timestamp: wm.time, + target: this, + port: this // for consistency + + }; + + if (e.port.connection === "open") { + /** + * Event emitted when the `Input` has been opened by calling the [`open()`]{@link #open} + * method. + * + * @event Input#opened + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `opened` + * @property {Input} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + */ + event.type = "opened"; + this.emit("opened", event); + } else if (e.port.connection === "closed" && e.port.state === "connected") { + /** + * Event emitted when the `Input` has been closed by calling the + * [`close()`]{@link #close} method. + * + * @event Input#closed + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `closed` + * @property {Input} target The object that dispatched the event. + * @property {Input} port The `Input` that triggered the event. + */ + event.type = "closed"; + this.emit("closed", event); + } else if (e.port.connection === "closed" && e.port.state === "disconnected") { + /** + * Event emitted when the `Input` becomes unavailable. This event is typically fired + * when the MIDI device is unplugged. + * + * @event Input#disconnected + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `disconnected` + * @property {Input} port Object with properties describing the {@link Input} that was + * disconnected. This is not the actual `Input` as it is no longer available. + * @property {Input} target The object that dispatched the event. + */ + event.type = "disconnected"; + event.port = { + connection: e.port.connection, + id: e.port.id, + manufacturer: e.port.manufacturer, + name: e.port.name, + state: e.port.state, + type: e.port.type + }; + this.emit("disconnected", event); + } else if (e.port.connection === "pending" && e.port.state === "disconnected") ; else { + console.warn("This statechange event was not caught: ", e.port.connection, e.port.state); + } + } + /** + * Executed when a `"midimessage"` event is received + * @param e + * @private + */ + + + _onMidiMessage(e) { + // Create Message object from MIDI data + const message = new Message(e.data); + /** + * Event emitted when any MIDI message is received on an `Input`. + * + * @event Input#midimessage + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `midimessage` + * + * @since 2.1 + */ + + const event = { + port: this, + target: this, + message: message, + timestamp: e.timeStamp, + type: "midimessage", + data: message.data, + // @deprecated (will be removed in v4) + rawData: message.data, + // @deprecated (will be removed in v4) + statusByte: message.data[0], + // @deprecated (will be removed in v4) + dataBytes: message.dataBytes // @deprecated (will be removed in v4) + + }; + this.emit("midimessage", event); // Messages are forwarded to InputChannel if they are channel messages or parsed locally for + // system messages. + + if (message.isSystemMessage) { + // system messages + this._parseEvent(event); + } else if (message.isChannelMessage) { + // channel messages + this.channels[message.channel]._processMidiMessageEvent(event); + } // Forward message if forwarders have been defined + + + this._forwarders.forEach(forwarder => forwarder.forward(message)); + } + /** + * @private + */ + + + _parseEvent(e) { + // Make a shallow copy of the incoming event so we can use it as the new event. + const event = Object.assign({}, e); + event.type = event.message.type || "unknownmidimessage"; // Add custom property for 'songselect' + + if (event.type === "songselect") { + event.song = e.data[1] + 1; // deprecated + + event.value = e.data[1]; + event.rawValue = event.value; + } // Emit event + + + this.emit(event.type, event); + } + /** + * Opens the input for usage. This is usually unnecessary as the port is opened automatically when + * WebMidi is enabled. + * + * @returns {Promise} The promise is fulfilled with the `Input` object. + */ + + + async open() { + // Explicitly opens the port for usage. This is not mandatory. When the port is not explicitly + // opened, it is implicitly opened (asynchronously) when assigning a listener to the + // `onmidimessage` property of the `MIDIInput`. We do it explicitly so that 'connected' events + // are dispatched immediately and that we are ready to listen. + try { + await this._midiInput.open(); + } catch (err) { + return Promise.reject(err); + } + + return Promise.resolve(this); + } + /** + * Closes the input. When an input is closed, it cannot be used to listen to MIDI messages until + * the input is opened again by calling [`Input.open()`](Input#open). + * + * **Note**: if what you want to do is stop events from being dispatched, you should use + * [`eventsSuspended`](#eventsSuspended) instead. + * + * @returns {Promise} The promise is fulfilled with the `Input` object + */ + + + async close() { + // We close the port. This triggers a statechange event which, in turn, will emit the 'closed' + // event. + if (!this._midiInput) return Promise.resolve(this); + + try { + await this._midiInput.close(); + } catch (err) { + return Promise.reject(err); + } + + return Promise.resolve(this); + } + /** + * @private + * @deprecated since v3.0.0 (moved to 'Utilities' class) + */ + + + getChannelModeByNumber() { + if (wm.validation) { + console.warn("The 'getChannelModeByNumber()' method has been moved to the 'Utilities' class."); + } + } + /** + * Adds an event listener that will trigger a function callback when the specified event is + * dispatched. The event usually is **input-wide** but can also be **channel-specific**. + * + * Input-wide events do not target a specific MIDI channel so it makes sense to listen for them + * at the `Input` level and not at the [`InputChannel`](InputChannel) level. Channel-specific + * events target a specific channel. Usually, in this case, you would add the listener to the + * [`InputChannel`](InputChannel) object. However, as a convenience, you can also listen to + * channel-specific events directly on an `Input`. This allows you to react to a channel-specific + * event no matter which channel it actually came through. + * + * When listening for an event, you simply need to specify the event name and the function to + * execute: + * + * ```javascript + * const listener = WebMidi.inputs[0].addListener("midimessage", e => { + * console.log(e); + * }); + * ``` + * + * Calling the function with an input-wide event (such as + * [`"midimessage"`]{@link #event:midimessage}), will return the [`Listener`](Listener) object + * that was created. + * + * If you call the function with a channel-specific event (such as + * [`"noteon"`]{@link InputChannel#event:noteon}), it will return an array of all + * [`Listener`](Listener) objects that were created (one for each channel): + * + * ```javascript + * const listeners = WebMidi.inputs[0].addListener("noteon", someFunction); + * ``` + * + * You can also specify which channels you want to add the listener to: + * + * ```javascript + * const listeners = WebMidi.inputs[0].addListener("noteon", someFunction, {channels: [1, 2, 3]}); + * ``` + * + * In this case, `listeners` is an array containing 3 [`Listener`](Listener) objects. + * + * Note that, when adding channel-specific listeners, it is the [`InputChannel`](InputChannel) + * instance that actually gets a listener added and not the `Input` instance. You can check that + * by calling [`InputChannel.hasListener()`](InputChannel#hasListener()). + * + * There are 8 families of events you can listen to: + * + * 1. **MIDI System Common** Events (input-wide) + * + * * [`songposition`]{@link Input#event:songposition} + * * [`songselect`]{@link Input#event:songselect} + * * [`sysex`]{@link Input#event:sysex} + * * [`timecode`]{@link Input#event:timecode} + * * [`tunerequest`]{@link Input#event:tunerequest} + * + * 2. **MIDI System Real-Time** Events (input-wide) + * + * * [`clock`]{@link Input#event:clock} + * * [`start`]{@link Input#event:start} + * * [`continue`]{@link Input#event:continue} + * * [`stop`]{@link Input#event:stop} + * * [`activesensing`]{@link Input#event:activesensing} + * * [`reset`]{@link Input#event:reset} + * + * 3. **State Change** Events (input-wide) + * + * * [`opened`]{@link Input#event:opened} + * * [`closed`]{@link Input#event:closed} + * * [`disconnected`]{@link Input#event:disconnected} + * + * 4. **Catch-All** Events (input-wide) + * + * * [`midimessage`]{@link Input#event:midimessage} + * * [`unknownmidimessage`]{@link Input#event:unknownmidimessage} + * + * 5. **Channel Voice** Events (channel-specific) + * + * * [`channelaftertouch`]{@link InputChannel#event:channelaftertouch} + * * [`controlchange`]{@link InputChannel#event:controlchange} + * * [`controlchange-controller0`]{@link InputChannel#event:controlchange-controller0} + * * [`controlchange-controller1`]{@link InputChannel#event:controlchange-controller1} + * * [`controlchange-controller2`]{@link InputChannel#event:controlchange-controller2} + * * (...) + * * [`controlchange-controller127`]{@link InputChannel#event:controlchange-controller127} + * * [`keyaftertouch`]{@link InputChannel#event:keyaftertouch} + * * [`noteoff`]{@link InputChannel#event:noteoff} + * * [`noteon`]{@link InputChannel#event:noteon} + * * [`pitchbend`]{@link InputChannel#event:pitchbend} + * * [`programchange`]{@link InputChannel#event:programchange} + * + * Note: you can listen for a specific control change message by using an event name like this: + * `controlchange-controller23`, `controlchange-controller99`, `controlchange-controller122`, + * etc. + * + * 6. **Channel Mode** Events (channel-specific) + * + * * [`allnotesoff`]{@link InputChannel#event:allnotesoff} + * * [`allsoundoff`]{@link InputChannel#event:allsoundoff} + * * [`localcontrol`]{@link InputChannel#event:localcontrol} + * * [`monomode`]{@link InputChannel#event:monomode} + * * [`omnimode`]{@link InputChannel#event:omnimode} + * * [`resetallcontrollers`]{@link InputChannel#event:resetallcontrollers} + * + * 7. **NRPN** Events (channel-specific) + * + * * [`nrpn`]{@link InputChannel#event:nrpn} + * * [`nrpn-dataentrycoarse`]{@link InputChannel#event:nrpn-dataentrycoarse} + * * [`nrpn-dataentryfine`]{@link InputChannel#event:nrpn-dataentryfine} + * * [`nrpn-databuttonincrement`]{@link InputChannel#event:nrpn-databuttonincrement} + * * [`nrpn-databuttondecrement`]{@link InputChannel#event:nrpn-databuttondecrement} + * + * 8. **RPN** Events (channel-specific) + * + * * [`rpn`]{@link InputChannel#event:rpn} + * * [`rpn-dataentrycoarse`]{@link InputChannel#event:rpn-dataentrycoarse} + * * [`rpn-dataentryfine`]{@link InputChannel#event:rpn-dataentryfine} + * * [`rpn-databuttonincrement`]{@link InputChannel#event:rpn-databuttonincrement} + * * [`rpn-databuttondecrement`]{@link InputChannel#event:rpn-databuttondecrement} + * + * @param event {string | EventEmitter.ANY_EVENT} The type of the event. + * + * @param listener {function} A callback function to execute when the specified event is detected. + * This function will receive an event parameter object. For details on this object's properties, + * check out the documentation for the various events (links above). + * + * @param {object} [options={}] + * + * @param {array} [options.arguments] An array of arguments which will be passed separately to the + * callback function. This array is stored in the [`arguments`](Listener#arguments) property of + * the [`Listener`](Listener) object and can be retrieved or modified as desired. + * + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * An integer between 1 and 16 or an array of such integers representing the MIDI channel(s) to + * listen on. If no channel is specified, all channels will be used. This parameter is ignored for + * input-wide events. + * + * @param {object} [options.context=this] The value of `this` in the callback function. + * + * @param {number} [options.duration=Infinity] The number of milliseconds before the listener + * automatically expires. + * + * @param {boolean} [options.prepend=false] Whether the listener should be added at the beginning + * of the listeners array and thus be triggered before others. + * + * @param {number} [options.remaining=Infinity] The number of times after which the callback + * should automatically be removed. + * + * @returns {Listener|Listener[]} If the event is input-wide, a single [`Listener`](Listener) + * object is returned. If the event is channel-specific, an array of all the + * [`Listener`](Listener) objects is returned (one for each channel). + */ + + + addListener(event, listener, options = {}) { + if (wm.validation) { + // Legacy compatibility + if (typeof options === "function") { + let channels = listener != undefined ? [].concat(listener) : undefined; // clone + + listener = options; + options = { + channels: channels + }; + } + } // Check if the event is channel-specific or input-wide + + + if (Enumerations.CHANNEL_EVENTS.includes(event)) { + // If no channel defined, use all. + if (options.channels === undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + let listeners = []; + Utilities.sanitizeChannels(options.channels).forEach(ch => { + listeners.push(this.channels[ch].addListener(event, listener, options)); + }); + return listeners; + } else { + return super.addListener(event, listener, options); + } + } + /** + * Adds a one-time event listener that will trigger a function callback when the specified event + * happens. The event can be **channel-bound** or **input-wide**. Channel-bound events are + * dispatched by [`InputChannel`]{@link InputChannel} objects and are tied to a specific MIDI + * channel while input-wide events are dispatched by the `Input` object itself and are not tied + * to a specific channel. + * + * Calling the function with an input-wide event (such as + * [`"midimessage"`]{@link #event:midimessage}), will return the [`Listener`](Listener) object + * that was created. + * + * If you call the function with a channel-specific event (such as + * [`"noteon"`]{@link InputChannel#event:noteon}), it will return an array of all + * [`Listener`](Listener) objects that were created (one for each channel): + * + * ```javascript + * const listeners = WebMidi.inputs[0].addOneTimeListener("noteon", someFunction); + * ``` + * + * You can also specify which channels you want to add the listener to: + * + * ```javascript + * const listeners = WebMidi.inputs[0].addOneTimeListener("noteon", someFunction, {channels: [1, 2, 3]}); + * ``` + * + * In this case, the `listeners` variable contains an array of 3 [`Listener`](Listener) objects. + * + * The code above will add a listener for the `"noteon"` event and call `someFunction` when the + * event is triggered on MIDI channels `1`, `2` or `3`. + * + * Note that, when adding events to channels, it is the [`InputChannel`](InputChannel) instance + * that actually gets a listener added and not the `Input` instance. + * + * Note: if you want to add a listener to a single MIDI channel you should probably do so directly + * on the [`InputChannel`](InputChannel) object itself. + * + * There are 8 families of events you can listen to: + * + * 1. **MIDI System Common** Events (input-wide) + * + * * [`songposition`]{@link Input#event:songposition} + * * [`songselect`]{@link Input#event:songselect} + * * [`sysex`]{@link Input#event:sysex} + * * [`timecode`]{@link Input#event:timecode} + * * [`tunerequest`]{@link Input#event:tunerequest} + * + * 2. **MIDI System Real-Time** Events (input-wide) + * + * * [`clock`]{@link Input#event:clock} + * * [`start`]{@link Input#event:start} + * * [`continue`]{@link Input#event:continue} + * * [`stop`]{@link Input#event:stop} + * * [`activesensing`]{@link Input#event:activesensing} + * * [`reset`]{@link Input#event:reset} + * + * 3. **State Change** Events (input-wide) + * + * * [`opened`]{@link Input#event:opened} + * * [`closed`]{@link Input#event:closed} + * * [`disconnected`]{@link Input#event:disconnected} + * + * 4. **Catch-All** Events (input-wide) + * + * * [`midimessage`]{@link Input#event:midimessage} + * * [`unknownmidimessage`]{@link Input#event:unknownmidimessage} + * + * 5. **Channel Voice** Events (channel-specific) + * + * * [`channelaftertouch`]{@link InputChannel#event:channelaftertouch} + * * [`controlchange`]{@link InputChannel#event:controlchange} + * * [`controlchange-controller0`]{@link InputChannel#event:controlchange-controller0} + * * [`controlchange-controller1`]{@link InputChannel#event:controlchange-controller1} + * * [`controlchange-controller2`]{@link InputChannel#event:controlchange-controller2} + * * (...) + * * [`controlchange-controller127`]{@link InputChannel#event:controlchange-controller127} + * * [`keyaftertouch`]{@link InputChannel#event:keyaftertouch} + * * [`noteoff`]{@link InputChannel#event:noteoff} + * * [`noteon`]{@link InputChannel#event:noteon} + * * [`pitchbend`]{@link InputChannel#event:pitchbend} + * * [`programchange`]{@link InputChannel#event:programchange} + * + * Note: you can listen for a specific control change message by using an event name like this: + * `controlchange-controller23`, `controlchange-controller99`, `controlchange-controller122`, + * etc. + * + * 6. **Channel Mode** Events (channel-specific) + * + * * [`allnotesoff`]{@link InputChannel#event:allnotesoff} + * * [`allsoundoff`]{@link InputChannel#event:allsoundoff} + * * [`localcontrol`]{@link InputChannel#event:localcontrol} + * * [`monomode`]{@link InputChannel#event:monomode} + * * [`omnimode`]{@link InputChannel#event:omnimode} + * * [`resetallcontrollers`]{@link InputChannel#event:resetallcontrollers} + * + * 7. **NRPN** Events (channel-specific) + * + * * [`nrpn`]{@link InputChannel#event:nrpn} + * * [`nrpn-dataentrycoarse`]{@link InputChannel#event:nrpn-dataentrycoarse} + * * [`nrpn-dataentryfine`]{@link InputChannel#event:nrpn-dataentryfine} + * * [`nrpn-databuttonincrement`]{@link InputChannel#event:nrpn-databuttonincrement} + * * [`nrpn-databuttondecrement`]{@link InputChannel#event:nrpn-databuttondecrement} + * + * 8. **RPN** Events (channel-specific) + * + * * [`rpn`]{@link InputChannel#event:rpn} + * * [`rpn-dataentrycoarse`]{@link InputChannel#event:rpn-dataentrycoarse} + * * [`rpn-dataentryfine`]{@link InputChannel#event:rpn-dataentryfine} + * * [`rpn-databuttonincrement`]{@link InputChannel#event:rpn-databuttonincrement} + * * [`rpn-databuttondecrement`]{@link InputChannel#event:rpn-databuttondecrement} + * + * @param event {string} The type of the event. + * + * @param listener {function} A callback function to execute when the specified event is detected. + * This function will receive an event parameter object. For details on this object's properties, + * check out the documentation for the various events (links above). + * + * @param {object} [options={}] + * + * @param {array} [options.arguments] An array of arguments which will be passed separately to the + * callback function. This array is stored in the [`arguments`](Listener#arguments) property of + * the [`Listener`](Listener) object and can be retrieved or modified as desired. + * + * @param {number|number[]} [options.channels] An integer between 1 and 16 or an array of + * such integers representing the MIDI channel(s) to listen on. This parameter is ignored for + * input-wide events. + * + * @param {object} [options.context=this] The value of `this` in the callback function. + * + * @param {number} [options.duration=Infinity] The number of milliseconds before the listener + * automatically expires. + * + * @param {boolean} [options.prepend=false] Whether the listener should be added at the beginning + * of the listeners array and thus be triggered before others. + * + * @returns {Listener[]} An array of all [`Listener`](Listener) objects that were created. + */ + + + addOneTimeListener(event, listener, options = {}) { + options.remaining = 1; + return this.addListener(event, listener, options); + } + /** + * This is an alias to the [Input.addListener()]{@link Input#addListener} method. + * @since 2.0.0 + * @deprecated since v3.0 + * @private + */ + + + on(event, channel, listener, options) { + return this.addListener(event, channel, listener, options); + } + /** + * Checks if the specified event type is already defined to trigger the specified callback + * function. For channel-specific events, the function will return `true` only if all channels + * have the listener defined. + * + * @param event {string|Symbol} The type of the event. + * + * @param listener {function} The callback function to check for. + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels] An integer between 1 and 16 or an array of such + * integers representing the MIDI channel(s) to check. This parameter is ignored for input-wide + * events. + * + * @returns {boolean} Boolean value indicating whether or not the `Input` or + * [`InputChannel`](InputChannel) already has this listener defined. + */ + + + hasListener(event, listener, options = {}) { + if (wm.validation) { + // Legacy compatibility + if (typeof options === "function") { + let channels = [].concat(listener); // clone + + listener = options; + options = { + channels: channels + }; + } + } + + if (Enumerations.CHANNEL_EVENTS.includes(event)) { + // If no channel defined, use all. + if (options.channels === undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; + return Utilities.sanitizeChannels(options.channels).every(ch => { + return this.channels[ch].hasListener(event, listener); + }); + } else { + return super.hasListener(event, listener); + } + } + /** + * Removes the specified listener for the specified event. If no listener is specified, all + * listeners for the specified event will be removed. If no event is specified, all listeners for + * the `Input` as well as all listeners for all [`InputChannel`]{@link InputChannel} objects will + * be removed. + * + * By default, channel-specific listeners will be removed from all channels unless the + * `options.channel` narrows it down. + * + * @param [type] {string} The type of the event. + * + * @param [listener] {function} The callback function to check for. + * + * @param {object} [options={}] + * + * @param {number|number[]} [options.channels] An integer between 1 and 16 or an array of + * such integers representing the MIDI channel(s) to match. This parameter is ignored for + * input-wide events. + * + * @param {*} [options.context] Only remove the listeners that have this exact context. + * + * @param {number} [options.remaining] Only remove the listener if it has exactly that many + * remaining times to be executed. + */ + + + removeListener(event, listener, options = {}) { + if (wm.validation) { + // Legacy compatibility + if (typeof options === "function") { + let channels = [].concat(listener); // clone + + listener = options; + options = { + channels: channels + }; + } + } + + if (options.channels === undefined) options.channels = Enumerations.MIDI_CHANNEL_NUMBERS; // If the event is not specified, remove everything (channel-specific and input-wide)! + + if (event == undefined) { + Utilities.sanitizeChannels(options.channels).forEach(ch => { + if (this.channels[ch]) this.channels[ch].removeListener(); + }); + return super.removeListener(); + } // If the event is specified, check if it's channel-specific or input-wide. + + + if (Enumerations.CHANNEL_EVENTS.includes(event)) { + Utilities.sanitizeChannels(options.channels).forEach(ch => { + this.channels[ch].removeListener(event, listener, options); + }); + } else { + super.removeListener(event, listener, options); + } + } + /** + * Adds a forwarder that will forward all incoming MIDI messages matching the criteria to the + * specified [`Output`](Output) destination(s). This is akin to the hardware MIDI THRU port, with + * the added benefit of being able to filter which data is forwarded. + * + * @param {Output|Output[]} output An [`Output`](Output) object, or an array of such + * objects, to forward messages to. + * @param {object} [options={}] + * @param {string|string[]} [options.types=(all messages)] A message type, or an array of such + * types (`noteon`, `controlchange`, etc.), that the message type must match in order to be + * forwarded. If this option is not specified, all types of messages will be forwarded. Valid + * messages are the ones found in either + * [`MIDI_SYSTEM_MESSAGES`](Enumerations#MIDI_SYSTEM_MESSAGES) or + * [`MIDI_CHANNEL_MESSAGES`](Enumerations#MIDI_CHANNEL_MESSAGES). + * @param {number|number[]} [options.channels=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]] + * A MIDI channel number or an array of channel numbers that the message must match in order to be + * forwarded. By default all MIDI channels are included (`1` to `16`). + * + * @returns {Forwarder} The [`Forwarder`](Forwarder) object created to handle the forwarding. This + * is useful if you wish to manipulate or remove the [`Forwarder`](Forwarder) later on. + */ + + + addForwarder(output, options = {}) { + let forwarder; // Unless 'output' is a forwarder, create a new forwarder + + if (output instanceof Forwarder) { + forwarder = output; + } else { + forwarder = new Forwarder(output, options); + } + + this._forwarders.push(forwarder); + + return forwarder; + } + /** + * Removes the specified [`Forwarder`](Forwarder) object from the input. + * + * @param {Forwarder} forwarder The [`Forwarder`](Forwarder) to remove (the + * [`Forwarder`](Forwarder) object is returned when calling `addForwarder()`. + */ + + + removeForwarder(forwarder) { + this._forwarders = this._forwarders.filter(item => item !== forwarder); + } + /** + * Checks whether the specified [`Forwarder`](Forwarder) object has already been attached to this + * input. + * + * @param {Forwarder} forwarder The [`Forwarder`](Forwarder) to check for (the + * [`Forwarder`](Forwarder) object is returned when calling [`addForwarder()`](#addForwarder). + * @returns {boolean} + */ + + + hasForwarder(forwarder) { + return this._forwarders.includes(forwarder); + } + /** + * Name of the MIDI input. + * + * @type {string} + * @readonly + */ + + + get name() { + return this._midiInput.name; + } + /** + * ID string of the MIDI port. The ID is host-specific. Do not expect the same ID on different + * platforms. For example, Google Chrome and the Jazz-Plugin report completely different IDs for + * the same port. + * + * @type {string} + * @readonly + */ + + + get id() { + return this._midiInput.id; + } + /** + * Input port's connection state: `pending`, `open` or `closed`. + * + * @type {string} + * @readonly + */ + + + get connection() { + return this._midiInput.connection; + } + /** + * Name of the manufacturer of the device that makes this input port available. + * + * @type {string} + * @readonly + */ + + + get manufacturer() { + return this._midiInput.manufacturer; + } + /** + * An integer to offset the reported octave of incoming notes. By default, middle C (MIDI note + * number 60) is placed on the 4th octave (C4). + * + * If, for example, `octaveOffset` is set to 2, MIDI note number 60 will be reported as C6. If + * `octaveOffset` is set to -1, MIDI note number 60 will be reported as C3. + * + * Note that this value is combined with the global offset value defined in the + * [`WebMidi.octaveOffset`](WebMidi#octaveOffset) property (if any). + * + * @type {number} + * + * @since 3.0 + */ + + + get octaveOffset() { + return this._octaveOffset; + } + + set octaveOffset(value) { + if (this.validation) { + value = parseInt(value); + if (isNaN(value)) throw new TypeError("The 'octaveOffset' property must be an integer."); + } + + this._octaveOffset = value; + } + /** + * State of the input port: `connected` or `disconnected`. + * + * @type {string} + * @readonly + */ + + + get state() { + return this._midiInput.state; + } + /** + * The port type. In the case of the `Input` object, this is always: `input`. + * + * @type {string} + * @readonly + */ + + + get type() { + return this._midiInput.type; + } + /** + * @type {boolean} + * @private + * @deprecated since v3.0.0 (moved to 'InputChannel' class) + */ + + + get nrpnEventsEnabled() { + if (wm.validation) { + console.warn("The 'nrpnEventsEnabled' property has been moved to the 'InputChannel' class."); + } + + return false; + } + + } // Events that do not have code below them must be placed outside the class definition (?!) + + /** + * Input-wide (system) event emitted when a **system exclusive** message has been received. + * You should note that, to receive `sysex` events, you must call the + * [`WebMidi.enable()`](WebMidi#enable()) method with the `sysex` option set to `true`: + * + * ```js + * WebMidi.enable({sysex: true}) + * .then(() => console.log("WebMidi has been enabled with sysex support.")) + * ``` + * + * @event Input#sysex + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `sysex` + * + */ + + /** + * Input-wide (system) event emitted when a **time code quarter frame** message has been + * received. + * + * @event Input#timecode + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `timecode` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **song position** message has been received. + * + * @event Input#songposition + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `songposition` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **song select** message has been received. + * + * @event Input#songselect + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} value Song (or sequence) number to select (0-127) + * @property {string} rawValue Song (or sequence) number to select (0-127) + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **tune request** message has been received. + * + * @event Input#tunerequest + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `tunerequest` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **timing clock** message has been received. + * + * @event Input#clock + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `clock` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **start** message has been received. + * + * @event Input#start + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `start` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **continue** message has been received. + * + * @event Input#continue + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `continue` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **stop** message has been received. + * + * @event Input#stop + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `stop` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when an **active sensing** message has been received. + * + * @event Input#activesensing + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `activesensing` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when a **reset** message has been received. + * + * @event Input#reset + * + * @type {object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `reset` + * + * @since 2.1 + */ + + /** + * Input-wide (system) event emitted when an unknown MIDI message has been received. It could + * be, for example, one of the undefined/reserved messages. + * + * @event Input#unknownmessage + * + * @type {Object} + * + * @property {Input} port The `Input` that triggered the event. + * @property {Input} target The object that dispatched the event. + * @property {Message} message A [`Message`](Message) object containing information about the + * incoming MIDI message. + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {string} type `unknownmessage` + * + * @since 2.1 + */ + + /** + * The `WebMidi` object makes it easier to work with the low-level Web MIDI API. Basically, it + * simplifies sending outgoing MIDI messages and reacting to incoming MIDI messages. + * + * When using the WebMidi.js library, you should know that the `WebMidi` class has already been + * instantiated. You cannot instantiate it yourself. If you use the **IIFE** version, you should + * simply use the global object called `WebMidi`. If you use the **CJS** (CommonJS) or **ESM** (ES6 + * module) version, you get an already-instantiated object when you import the module. + * + * @fires WebMidi#connected + * @fires WebMidi#disabled + * @fires WebMidi#disconnected + * @fires WebMidi#enabled + * @fires WebMidi#error + * @fires WebMidi#midiaccessgranted + * @fires WebMidi#portschanged + * + * @extends EventEmitter + * @license Apache-2.0 + */ + + class WebMidi extends EventEmitter { + /** + * The WebMidi class is a singleton and you cannot instantiate it directly. It has already been + * instantiated for you. + */ + constructor() { + super(); + /** + * Object containing system-wide default values that can be changed to customize how the library + * works. + * + * @type {object} + * + * @property {object} defaults.note - Default values relating to note + * @property {number} defaults.note.attack - A number between 0 and 127 representing the + * default attack velocity of notes. Initial value is 64. + * @property {number} defaults.note.release - A number between 0 and 127 representing the + * default release velocity of notes. Initial value is 64. + * @property {number} defaults.note.duration - A number representing the default duration of + * notes (in seconds). Initial value is Infinity. + */ + + this.defaults = { + note: { + attack: Utilities.from7bitToFloat(64), + release: Utilities.from7bitToFloat(64), + duration: Infinity + } + }; + /** + * The [`MIDIAccess`](https://developer.mozilla.org/en-US/docs/Web/API/MIDIAccess) + * instance used to talk to the lower-level Web MIDI API. This should not be used directly + * unless you know what you are doing. + * + * @type {MIDIAccess} + * @readonly + */ + + this.interface = null; + /** + * Indicates whether argument validation and backwards-compatibility checks are performed + * throughout the WebMidi.js library for object methods and property setters. + * + * This is an advanced setting that should be used carefully. Setting `validation` to `false` + * improves performance but should only be done once the project has been thoroughly tested with + * `validation` turned on. + * + * @type {boolean} + */ + + this.validation = true; + /** + * Array of all (Input) objects + * @type {Input[]} + * @private + */ + + this._inputs = []; + /** + * Array of disconnected [`Input`](Input) objects. This is used when inputs are plugged back in + * to retain their previous state. + * @type {Input[]} + * @private + */ + + this._disconnectedInputs = []; + /** + * Array of all [`Output`](Output) objects + * @type {Output[]} + * @private + */ + + this._outputs = []; + /** + * Array of disconnected [`Output`](Output) objects. This is used when outputs are plugged back + * in to retain their previous state. + * @type {Output[]} + * @private + */ + + this._disconnectedOutputs = []; + /** + * Array of statechange events to process. These events must be parsed synchronously so they do + * not override each other. + * + * @type {string[]} + * @private + */ + + this._stateChangeQueue = []; + /** + * @type {number} + * @private + */ + + this._octaveOffset = 0; + } + /** + * Checks if the Web MIDI API is available in the current environment and then tries to connect to + * the host's MIDI subsystem. This is an asynchronous operation and it causes a security prompt to + * be displayed to the user. + * + * To enable the use of MIDI system exclusive messages, the `sysex` option should be set to + * `true`. However, under some environments (e.g. Jazz-Plugin), the `sysex` option is ignored + * and system exclusive messages are always enabled. You can check the + * [`sysexEnabled`](#sysexEnabled) property to confirm. + * + * To enable access to software synthesizers available on the host, you would set the `software` + * option to `true`. However, this option is only there to future-proof the library as support for + * software synths has not yet been implemented in any browser (as of September 2021). + * + * By the way, if you call the [`enable()`](#enable) method while WebMidi.js is already enabled, + * the callback function will be executed (if any), the promise will resolve but the events + * ([`"midiaccessgranted"`](#event:midiaccessgranted), [`"connected"`](#event:connected) and + * [`"enabled"`](#event:enabled)) will not be fired. + * + * There are 3 ways to execute code after `WebMidi` has been enabled: + * + * - Pass a callback function in the `options` + * - Listen to the [`"enabled"`](#event:enabled) event + * - Wait for the promise to resolve + * + * In order, this is what happens towards the end of the enabling process: + * + * 1. [`"midiaccessgranted"`](#event:midiaccessgranted) event is triggered once the user has + * granted access to use MIDI. + * 2. [`"connected"`](#event:connected) events are triggered (for each available input and output) + * 3. [`"enabled"`](#event:enabled) event is triggered when WebMidi.js is fully ready + * 4. specified callback (if any) is executed + * 5. promise is resolved and fulfilled with the `WebMidi` object. + * + * **Important note**: starting with Chrome v77, a page using Web MIDI API must be hosted on a + * secure origin (`https://`, `localhost` or `file:///`) and the user will always be prompted to + * authorize the operation (no matter if the `sysex` option is `true` or not). + * + * ##### Example + * ```js + * // Enabling WebMidi and using the promise + * WebMidi.enable().then(() => { + * console.log("WebMidi.js has been enabled!"); + * }) + * ``` + * + * @param [options] {object} + * + * @param [options.callback] {function} A function to execute once the operation completes. This + * function will receive an `Error` object if enabling the Web MIDI API failed. + * + * @param [options.sysex=false] {boolean} Whether to enable MIDI system exclusive messages or not. + * + * @param [options.validation=true] {boolean} Whether to enable library-wide validation of method + * arguments and setter values. This is an advanced setting that should be used carefully. Setting + * [`validation`](#validation) to `false` improves performance but should only be done once the + * project has been thoroughly tested with [`validation`](#validation) turned on. + * + * @param [options.software=false] {boolean} Whether to request access to software synthesizers on + * the host system. This is part of the spec but has not yet been implemented by most browsers as + * of April 2020. + * + * @param [options.requestMIDIAccessFunction] {function} A custom function to use to return + * the MIDIAccess object. This is useful if you want to use a polyfill for the Web MIDI API + * or if you want to use a custom implementation of the Web MIDI API - probably for testing + * purposes. + * + * @async + * + * @returns {Promise.} The promise is fulfilled with the `WebMidi` object fro + * chainability + * + * @throws {Error} The Web MIDI API is not supported in your environment. + * @throws {Error} Jazz-Plugin must be installed to use WebMIDIAPIShim. + */ + + + async enable(options = {}, legacy = false) { + this.validation = options.validation !== false; + + if (this.validation) { + // Backwards-compatibility. Previous syntax was: enable(callback, sysex) + if (typeof options === "function") options = { + callback: options, + sysex: legacy + }; + if (legacy) options.sysex = true; + } // If already enabled, trigger callback and resolve promise but do not dispatch events. + + + if (this.enabled) { + if (typeof options.callback === "function") options.callback(); + return Promise.resolve(); + } // The Jazz-Plugin takes a while to be available (even after the Window's 'load' event has been + // fired). Therefore, we wait a little while to give it time to finish loading (initiqted in + // constructor). + // if (!this.supported) { + // + // await new Promise((resolve, reject) => { + // + // const start = this.time; + // + // const intervalID = setInterval(() => { + // + // if (this.supported) { + // clearInterval(intervalID); + // resolve(); + // } else { + // if (this.time > start + 1500) { + // clearInterval(intervalID); + // let error = new Error("The Web MIDI API is not available in your environment."); + // if (typeof options.callback === "function") options.callback(error); + // reject(error); + // } + // } + // + // }, 25); + // + // }); + // + // } + + /** + * Event emitted when an error occurs trying to enable `WebMidi` + * + * @event WebMidi#error + * @type {object} + * @property {DOMHighResTimeStamp} timestamp The moment when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {WebMidi} target The object that triggered the event + * @property {string} type `error` + * @property {*} error Actual error that occurred + */ + + + const errorEvent = { + timestamp: this.time, + target: this, + type: "error", + error: undefined + }; + /** + * Event emitted once the MIDI interface has been successfully created (which implies user has + * granted access to MIDI). + * + * @event WebMidi#midiaccessgranted + * @type {object} + * @property {DOMHighResTimeStamp} timestamp The moment when the event occurred (in milliseconds + * since the navigation start of the document). + * @property {WebMidi} target The object that triggered the event + * @property {string} type `midiaccessgranted` + */ + + const midiAccessGrantedEvent = { + timestamp: this.time, + target: this, + type: "midiaccessgranted" + }; + /** + * Event emitted once `WebMidi` has been fully enabled + * + * @event WebMidi#enabled + * @type {object} + * @property {DOMHighResTimeStamp} timestamp The moment when the event occurred (in milliseconds + * since the navigation start of the document). + * @property {WebMidi} target The object that triggered the event + * @property {string} type `"enabled"` + */ + + const enabledEvent = { + timestamp: this.time, + target: this, + type: "enabled" + }; // Request MIDI access (this iw where the prompt will appear) + + try { + if (typeof options.requestMIDIAccessFunction === "function") { + this.interface = await options.requestMIDIAccessFunction({ + sysex: options.sysex, + software: options.software + }); + } else { + this.interface = await navigator.requestMIDIAccess({ + sysex: options.sysex, + software: options.software + }); + } + } catch (err) { + errorEvent.error = err; + this.emit("error", errorEvent); + if (typeof options.callback === "function") options.callback(err); + return Promise.reject(err); + } // Now that the Web MIDI API interface has been created, we trigger the 'midiaccessgranted' + // event. This allows the developer an occasion to assign listeners on 'connected' events. + + + this.emit("midiaccessgranted", midiAccessGrantedEvent); // We setup the state change listener before creating the ports so that it properly catches the + // the ports' `connected` events + + this.interface.onstatechange = this._onInterfaceStateChange.bind(this); // Update inputs and outputs (this is where `Input` and `Output` objects are created). + + try { + await this._updateInputsAndOutputs(); + } catch (err) { + errorEvent.error = err; + this.emit("error", errorEvent); + if (typeof options.callback === "function") options.callback(err); + return Promise.reject(err); + } // If we make it here, the ports have been successfully created, so we trigger the 'enabled' + // event. + + + this.emit("enabled", enabledEvent); // Execute the callback (if any) and resolve the promise with 'this' (for chainability) + + if (typeof options.callback === "function") options.callback(); + return Promise.resolve(this); + } + /** + * Completely disables **WebMidi.js** by unlinking the MIDI subsystem's interface and closing all + * [`Input`](Input) and [`Output`](Output) objects that may have been opened. This also means that + * listeners added to [`Input`](Input) objects, [`Output`](Output) objects or to `WebMidi` itself + * are also destroyed. + * + * @async + * @returns {Promise} + * + * @throws {Error} The Web MIDI API is not supported by your environment. + * + * @since 2.0.0 + */ + + + async disable() { + return this._destroyInputsAndOutputs().then(() => { + if (navigator && typeof navigator.close === "function") navigator.close(); // jzz + + if (this.interface) this.interface.onstatechange = undefined; + this.interface = null; // also resets enabled, sysexEnabled + + /** + * Event emitted once `WebMidi` has been successfully disabled. + * + * @event WebMidi#disabled + * @type {object} + * @property {DOMHighResTimeStamp} timestamp The moment when the event occurred (in + * milliseconds since the navigation start of the document). + * @property {WebMidi} target The object that triggered the event + * @property {string} type `"disabled"` + */ + + let event = { + timestamp: this.time, + target: this, + type: "disabled" + }; // Finally, trigger the 'disabled' event and then remove all listeners. + + this.emit("disabled", event); + this.removeListener(); + }); + } + + /** + * Returns the [`Input`](Input) object that matches the specified ID string or `false` if no + * matching input is found. As per the Web MIDI API specification, IDs are strings (not integers). + * + * Please note that IDs change from one host to another. For example, Chrome does not use the same + * kind of IDs as Jazz-Plugin. + * + * @param id {string} The ID string of the input. IDs can be viewed by looking at the + * [`WebMidi.inputs`](WebMidi#inputs) array. Even though they sometimes look like integers, IDs + * are strings. + * @param [options] {object} + * @param [options.disconnected] {boolean} Whether to retrieve a disconnected input + * + * @returns {Input} An [`Input`](Input) object matching the specified ID string or `undefined` + * if no matching input can be found. + * + * @throws {Error} WebMidi is not enabled. + * + * @since 2.0.0 + */ + getInputById(id, options = { + disconnected: false + }) { + if (this.validation) { + if (!this.enabled) throw new Error("WebMidi is not enabled."); + if (!id) return; + } + + if (options.disconnected) { + for (let i = 0; i < this._disconnectedInputs.length; i++) { + if (this._disconnectedInputs[i].id === id.toString()) return this._disconnectedInputs[i]; + } + } else { + for (let i = 0; i < this.inputs.length; i++) { + if (this.inputs[i].id === id.toString()) return this.inputs[i]; + } + } + } + + /** + * Returns the first [`Input`](Input) object whose name **contains** the specified string. Note + * that the port names change from one environment to another. For example, Chrome does not report + * input names in the same way as the Jazz-Plugin does. + * + * @param name {string} The non-empty string to look for within the name of MIDI inputs (such as + * those visible in the [inputs](WebMidi#inputs) array). + * + * @returns {Input} The [`Input`](Input) that was found or `undefined` if no input contained the + * specified name. + * @param [options] {object} + * @param [options.disconnected] {boolean} Whether to retrieve a disconnected input + * + * @throws {Error} WebMidi is not enabled. + * + * @since 2.0.0 + */ + getInputByName(name, options = { + disconnected: false + }) { + if (this.validation) { + if (!this.enabled) throw new Error("WebMidi is not enabled."); + if (!name) return; + name = name.toString(); + } + + if (options.disconnected) { + for (let i = 0; i < this._disconnectedInputs.length; i++) { + if (~this._disconnectedInputs[i].name.indexOf(name)) return this._disconnectedInputs[i]; + } + } else { + for (let i = 0; i < this.inputs.length; i++) { + if (~this.inputs[i].name.indexOf(name)) return this.inputs[i]; + } + } + } + + /** + * Returns the first [`Output`](Output) object whose name **contains** the specified string. Note + * that the port names change from one environment to another. For example, Chrome does not report + * input names in the same way as the Jazz-Plugin does. + * + * @param name {string} The non-empty string to look for within the name of MIDI inputs (such as + * those visible in the [`outputs`](#outputs) array). + * @param [options] {object} + * @param [options.disconnected] {boolean} Whether to retrieve a disconnected output + * + * @returns {Output} The [`Output`](Output) that was found or `undefined` if no output matched + * the specified name. + * + * @throws {Error} WebMidi is not enabled. + * + * @since 2.0.0 + */ + getOutputByName(name, options = { + disconnected: false + }) { + if (this.validation) { + if (!this.enabled) throw new Error("WebMidi is not enabled."); + if (!name) return; + name = name.toString(); + } + + if (options.disconnected) { + for (let i = 0; i < this._disconnectedOutputs.length; i++) { + if (~this._disconnectedOutputs[i].name.indexOf(name)) return this._disconnectedOutputs[i]; + } + } else { + for (let i = 0; i < this.outputs.length; i++) { + if (~this.outputs[i].name.indexOf(name)) return this.outputs[i]; + } + } + } + + /** + * Returns the [`Output`](Output) object that matches the specified ID string or `false` if no + * matching output is found. As per the Web MIDI API specification, IDs are strings (not + * integers). + * + * Please note that IDs change from one host to another. For example, Chrome does not use the same + * kind of IDs as Jazz-Plugin. + * + * @param id {string} The ID string of the port. IDs can be viewed by looking at the + * [`WebMidi.outputs`](WebMidi#outputs) array. + * @param [options] {object} + * @param [options.disconnected] {boolean} Whether to retrieve a disconnected output + * + * @returns {Output} An [`Output`](Output) object matching the specified ID string. If no + * matching output can be found, the method returns `undefined`. + * + * @throws {Error} WebMidi is not enabled. + * + * @since 2.0.0 + */ + getOutputById(id, options = { + disconnected: false + }) { + if (this.validation) { + if (!this.enabled) throw new Error("WebMidi is not enabled."); + if (!id) return; + } + + if (options.disconnected) { + for (let i = 0; i < this._disconnectedOutputs.length; i++) { + if (this._disconnectedOutputs[i].id === id.toString()) return this._disconnectedOutputs[i]; + } + } else { + for (let i = 0; i < this.outputs.length; i++) { + if (this.outputs[i].id === id.toString()) return this.outputs[i]; + } + } + } + + /** + * @private + * @deprecated since version 3.0.0, use Utilities.toNoteNumber() instead. + */ + noteNameToNumber(name) { + if (this.validation) { + console.warn("The noteNameToNumber() method is deprecated. Use " + "Utilities.toNoteNumber() instead."); + } + + return Utilities.toNoteNumber(name, this.octaveOffset); + } + /** + * @private + * @deprecated since 3.0.0, use Utilities.getNoteDetails() instead. + */ + + + getOctave(number) { + if (this.validation) { + console.warn("The getOctave()is deprecated. Use Utilities.getNoteDetails() instead"); + number = parseInt(number); + } + + if (!isNaN(number) && number >= 0 && number <= 127) { + return Utilities.getNoteDetails(Utilities.offsetNumber(number, this.octaveOffset)).octave; + } else { + return false; + } + } + /** + * @private + * @deprecated since 3.0.0, use Utilities.sanitizeChannels() instead. + */ + + + sanitizeChannels(channel) { + if (this.validation) { + console.warn("The sanitizeChannels() method has been moved to the utilities class."); + } + + return Utilities.sanitizeChannels(channel); + } + /** + * @private + * @deprecated since version 3.0.0, use Utilities.sanitizeChannels() instead. + */ + + + toMIDIChannels(channel) { + if (this.validation) { + console.warn("The toMIDIChannels() method has been deprecated. Use Utilities.sanitizeChannels() instead."); + } + + return Utilities.sanitizeChannels(channel); + } + /** + * @private + * @deprecated since version 3.0.0, use Utilities.guessNoteNumber() instead. + */ + + + guessNoteNumber(input) { + if (this.validation) { + console.warn("The guessNoteNumber() method has been deprecated. Use Utilities.guessNoteNumber() instead."); + } + + return Utilities.guessNoteNumber(input, this.octaveOffset); + } + /** + * @private + * @deprecated since version 3.0.0, use Utilities.buildNoteArray() instead. + */ + + + getValidNoteArray(notes, options = {}) { + if (this.validation) { + console.warn("The getValidNoteArray() method has been moved to the Utilities.buildNoteArray()"); + } + + return Utilities.buildNoteArray(notes, options); + } + /** + * @private + * @deprecated since version 3.0.0, use Utilities.toTimestamp() instead. + */ + + + convertToTimestamp(time) { + if (this.validation) { + console.warn("The convertToTimestamp() method has been moved to Utilities.toTimestamp()."); + } + + return Utilities.toTimestamp(time); + } + /** + * @return {Promise} + * @private + */ + + + async _destroyInputsAndOutputs() { + let promises = []; + this.inputs.forEach(input => promises.push(input.destroy())); + this.outputs.forEach(output => promises.push(output.destroy())); + return Promise.all(promises).then(() => { + this._inputs = []; + this._outputs = []; + }); + } + /** + * @private + */ + + + _onInterfaceStateChange(e) { + this._updateInputsAndOutputs(); + /** + * Event emitted when an [`Input`](Input) or [`Output`](Output) port is connected or + * disconnected. This event is typically fired whenever a MIDI device is plugged in or + * unplugged. Please note that it may fire several times if a device possesses multiple inputs + * and/or outputs (which is often the case). + * + * @event WebMidi#portschanged + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred + * (in milliseconds since the navigation start of the document). + * @property {string} type `portschanged` + * @property {WebMidi} target The object to which the listener was originally added (`WebMidi`) + * @property {Input|Output} port The [`Input`](Input) or [`Output`](Output) object that + * triggered the event. + * + * @since 3.0.2 + */ + + /** + * Event emitted when an [`Input`](Input) or [`Output`](Output) becomes available. This event is + * typically fired whenever a MIDI device is plugged in. Please note that it may fire several + * times if a device possesses multiple inputs and/or outputs (which is often the case). + * + * @event WebMidi#connected + * @type {object} + * @property {number} timestamp The moment (DOMHighResTimeStamp) when the event occurred + * (in milliseconds since the navigation start of the document). + * @property {string} type `connected` + * @property {WebMidi} target The object to which the listener was originally added (`WebMidi`) + * @property {Input|Output} port The [`Input`](Input) or [`Output`](Output) object that + * triggered the event. + */ + + /** + * Event emitted when an [`Input`](Input) or [`Output`](Output) becomes unavailable. This event + * is typically fired whenever a MIDI device is unplugged. Please note that it may fire several + * times if a device possesses multiple inputs and/or outputs (which is often the case). + * + * @event WebMidi#disconnected + * @type {object} + * @property {DOMHighResTimeStamp} timestamp The moment when the event occurred (in milliseconds + * since the navigation start of the document). + * @property {string} type `disconnected` + * @property {WebMidi} target The object to which the listener was originally added (`WebMidi`) + * @property {Input|Output} port The [`Input`](Input) or [`Output`](Output) object that + * triggered the event. + */ + + + let event = { + timestamp: e.timeStamp, + type: e.port.state, + target: this + }; // We check if "connection" is "open" because connected events are also triggered with + // "connection=closed" + + if (e.port.state === "connected" && e.port.connection === "open") { + if (e.port.type === "output") { + event.port = this.getOutputById(e.port.id); + } else if (e.port.type === "input") { + event.port = this.getInputById(e.port.id); + } // Emit "connected" event + + + this.emit(e.port.state, event); // Make a shallow copy of the event so we can use it for the "portschanged" event + + const portsChangedEvent = Object.assign({}, event); + portsChangedEvent.type = "portschanged"; + this.emit(portsChangedEvent.type, portsChangedEvent); // We check if "connection" is "pending" because we do not always get the "closed" event + } else if (e.port.state === "disconnected" && e.port.connection === "pending") { + if (e.port.type === "input") { + event.port = this.getInputById(e.port.id, { + disconnected: true + }); + } else if (e.port.type === "output") { + event.port = this.getOutputById(e.port.id, { + disconnected: true + }); + } // Emit "disconnected" event + + + this.emit(e.port.state, event); // Make a shallow copy of the event so we can use it for the "portschanged" event + + const portsChangedEvent = Object.assign({}, event); + portsChangedEvent.type = "portschanged"; + this.emit(portsChangedEvent.type, portsChangedEvent); + } + } + + /** + * @private + */ + async _updateInputsAndOutputs() { + return Promise.all([this._updateInputs(), this._updateOutputs()]); + } + + /** + * @private + */ + async _updateInputs() { + // We must check for the existence of this.interface because it might have been closed via + // WebMidi.disable(). + if (!this.interface) return; // Check for items to remove from the existing array (because they are no longer being reported + // by the MIDI back-end). + + for (let i = this._inputs.length - 1; i >= 0; i--) { + const current = this._inputs[i]; + const inputs = Array.from(this.interface.inputs.values()); + + if (!inputs.find(input => input === current._midiInput)) { + // Instead of destroying removed inputs, we stash them in case they come back (which is the + // case when the computer goes to sleep and is later brought back online). + this._disconnectedInputs.push(current); + + this._inputs.splice(i, 1); + } + } // Array to hold pending promises from trying to open all input ports + + + let promises = []; // Add new inputs (if not already present) + + this.interface.inputs.forEach(nInput => { + // Check if the input is currently absent from the 'inputs' array. + if (!this._inputs.find(input => input._midiInput === nInput)) { + // If the input has previously been stashed away, reuse it. If not, create a new one. + let input = this._disconnectedInputs.find(input => input._midiInput === nInput); + + if (!input) input = new Input(nInput); + + this._inputs.push(input); + + promises.push(input.open()); + } + }); // Return a promise that resolves when all promises have resolved + + return Promise.all(promises); + } + + /** + * @private + */ + async _updateOutputs() { + // We must check for the existence of this.interface because it might have been closed via + // WebMidi.disable(). + if (!this.interface) return; // Check for items to remove from the existing array (because they are no longer being reported + // by the MIDI back-end). + + for (let i = this._outputs.length - 1; i >= 0; i--) { + const current = this._outputs[i]; + const outputs = Array.from(this.interface.outputs.values()); + + if (!outputs.find(output => output === current._midiOutput)) { + // Instead of destroying removed inputs, we stash them in case they come back (which is the + // case when the computer goes to sleep and is later brought back online). + this._disconnectedOutputs.push(current); + + this._outputs.splice(i, 1); + } + } // Array to hold pending promises from trying to open all output ports + + + let promises = []; // Add new outputs (if not already present) + + this.interface.outputs.forEach(nOutput => { + // Check if the output is currently absent from the 'outputs' array. + if (!this._outputs.find(output => output._midiOutput === nOutput)) { + // If the output has previously been stashed away, reuse it. If not, create a new one. + let output = this._disconnectedOutputs.find(output => output._midiOutput === nOutput); + + if (!output) output = new Output(nOutput); + + this._outputs.push(output); + + promises.push(output.open()); + } + }); // Return a promise that resolves when all sub-promises have resolved + + return Promise.all(promises); + } + + // injectPluginMarkup(parent) { + // + // // Silently ignore on Node.js + // if (Utilities.isNode) return; + // + // // Default to if no parent is specified + // if (!(parent instanceof Element) && !(parent instanceof HTMLDocument)) { + // parent = document.body; + // } + // + // // IE10 needs this: + // // + // + // // Create markup and add to parent + // const obj = document.createElement("object"); + // obj.classid = "CLSID:1ACE1618-1C7D-4561-AEE1-34842AA85E90"; // IE + // if (!obj.isJazz) obj.type = "audio/x-jazz"; // Standards-compliant + // obj.style.visibility = "hidden"; + // obj.style.width = obj.style.height = "0px"; + // parent.appendChild(obj); + // + // } + + /** + * Indicates whether access to the host's MIDI subsystem is active or not. + * + * @readonly + * @type {boolean} + */ + get enabled() { + return this.interface !== null; + } + /** + * An array of all currently available MIDI inputs. + * + * @readonly + * @type {Input[]} + */ + + + get inputs() { + return this._inputs; + } + /** + * @private + * @deprecated + */ + + + get isNode() { + if (this.validation) { + console.warn("WebMidi.isNode has been deprecated. Use Utilities.isNode instead."); + } + + return Utilities.isNode; + } + /** + * @private + * @deprecated + */ + + + get isBrowser() { + if (this.validation) { + console.warn("WebMidi.isBrowser has been deprecated. Use Utilities.isBrowser instead."); + } + + return Utilities.isBrowser; + } + /** + * An integer to offset the octave of notes received from external devices or sent to external + * devices. + * + * When a MIDI message comes in on an input channel the reported note name will be offset. For + * example, if the `octaveOffset` is set to `-1` and a [`"noteon"`](InputChannel#event:noteon) + * message with MIDI number 60 comes in, the note will be reported as C3 (instead of C4). + * + * By the same token, when [`OutputChannel.playNote()`](OutputChannel#playNote) is called, the + * MIDI note number being sent will be offset. If `octaveOffset` is set to `-1`, the MIDI note + * number sent will be 72 (instead of 60). + * + * @type {number} + * + * @since 2.1 + */ + + + get octaveOffset() { + return this._octaveOffset; + } + + set octaveOffset(value) { + if (this.validation) { + value = parseInt(value); + if (isNaN(value)) throw new TypeError("The 'octaveOffset' property must be an integer."); + } + + this._octaveOffset = value; + } + /** + * An array of all currently available MIDI outputs as [`Output`](Output) objects. + * + * @readonly + * @type {Output[]} + */ + + + get outputs() { + return this._outputs; + } + /** + * Indicates whether the environment provides support for the Web MIDI API or not. + * + * **Note**: in environments that do not offer built-in MIDI support, this will report `true` if + * the + * [`navigator.requestMIDIAccess`](https://developer.mozilla.org/en-US/docs/Web/API/MIDIAccess) + * function is available. For example, if you have installed WebMIDIAPIShim.js but no plugin, this + * property will be `true` even though actual support might not be there. + * + * @readonly + * @type {boolean} + */ + + + get supported() { + return typeof navigator !== "undefined" && navigator.requestMIDIAccess; + } + /** + * Indicates whether MIDI system exclusive messages have been activated when WebMidi.js was + * enabled via the [`enable()`](#enable) method. + * + * @readonly + * @type boolean + */ + + + get sysexEnabled() { + return !!(this.interface && this.interface.sysexEnabled); + } + /** + * The elapsed time, in milliseconds, since the time + * [origin](https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp#The_time_origin). + * Said simply, it is the number of milliseconds that passed since the page was loaded. Being a + * floating-point number, it has sub-millisecond accuracy. According to the + * [documentation](https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp), the + * time should be accurate to 5 µs (microseconds). However, due to various constraints, the + * browser might only be accurate to one millisecond. + * + * Note: `WebMidi.time` is simply an alias to `performance.now()`. + * + * @type {DOMHighResTimeStamp} + * @readonly + */ + + + get time() { + return performance.now(); + } + /** + * The version of the library as a [semver](https://semver.org/) string. + * + * @readonly + * @type string + */ + + + get version() { + return "3.0.19"; + } + /** + * @private + * @deprecated since 3.0.0. Use Enumerations.CHANNEL_EVENTS instead. + */ + + + get CHANNEL_EVENTS() { + if (this.validation) { + console.warn("The CHANNEL_EVENTS enum has been moved to Enumerations.CHANNEL_EVENTS."); + } + + return Enumerations.CHANNEL_EVENTS; + } + /** + * @private + * @deprecated since 3.0.0. Use Enumerations.MIDI_SYSTEM_MESSAGES instead. + */ + + + get MIDI_SYSTEM_MESSAGES() { + if (this.validation) { + console.warn("The MIDI_SYSTEM_MESSAGES enum has been moved to " + "Enumerations.MIDI_SYSTEM_MESSAGES."); + } + + return Enumerations.MIDI_SYSTEM_MESSAGES; + } + /** + * @private + * @deprecated since 3.0.0. Use Enumerations.MIDI_CHANNEL_MODE_MESSAGES instead + */ + + + get MIDI_CHANNEL_MODE_MESSAGES() { + if (this.validation) { + console.warn("The MIDI_CHANNEL_MODE_MESSAGES enum has been moved to " + "Enumerations.MIDI_CHANNEL_MODE_MESSAGES."); + } + + return Enumerations.MIDI_CHANNEL_MODE_MESSAGES; + } + /** + * @private + * @deprecated since 3.0.0. Use Enumerations.MIDI_CONTROL_CHANGE_MESSAGES instead. + */ + + + get MIDI_CONTROL_CHANGE_MESSAGES() { + if (this.validation) { + console.warn("The MIDI_CONTROL_CHANGE_MESSAGES enum has been moved to " + "Enumerations.MIDI_CONTROL_CHANGE_MESSAGES."); + } + + return Enumerations.MIDI_CONTROL_CHANGE_MESSAGES; + } + /** + * @deprecated since 3.0.0. Use Enumerations.MIDI_REGISTERED_PARAMETERS instead. + * @private + */ + + + get MIDI_REGISTERED_PARAMETER() { + if (this.validation) { + console.warn("The MIDI_REGISTERED_PARAMETER enum has been moved to " + "Enumerations.MIDI_REGISTERED_PARAMETERS."); + } + + return this.MIDI_REGISTERED_PARAMETERS; + } + /** + * @deprecated since 3.0.0. + * @private + */ + + + get NOTES() { + if (this.validation) { + console.warn("The NOTES enum has been deprecated."); + } + + return ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]; + } + + } // Export singleton instance of WebMidi class. The 'constructor' is nulled so that it cannot be used + // to instantiate a new WebMidi object or extend it. However, it is not freezed so it remains + // extensible (properties can be added at will). + + + const wm = new WebMidi(); + wm.constructor = null; + + exports.Enumerations = Enumerations; + exports.Forwarder = Forwarder; + exports.Input = Input; + exports.InputChannel = InputChannel; + exports.Message = Message; + exports.TS_WebMIDI_Note = TS_WebMIDI_Note; + exports.Output = Output; + exports.OutputChannel = OutputChannel; + exports.Utilities = Utilities; + exports.WebMidi = wm; + +}(this.window = this.window || {})); diff --git a/elements/pl-snap/Snap/libraries/animation_module.xml b/elements/pl-snap/Snap/libraries/animation_module.xml new file mode 100644 index 00000000..85d31fc2 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/animation_module.xml @@ -0,0 +1 @@ +
de:animiere Setter _ Getter _ Delta _ über _ Sek. beschleunigt _ ca:modifica setter _ i getter _ amb delta _ en _ segons de forma _ pt:anima com modificador _ e inspector _ de _ em _ s de forma _ 501
de:Grad _ ca:graus de _ radians pt:_ radianos em graus 0.5
de:Fehler _ pt:assinala o erro _
de:gleite _ in _ Sek. beschleunigt: _ ca:llisca _ en _ segons de forma _ fr:glisser _ en _ sec. accélérer _ pt:desliza _ em _ s de forma _ 501linearlinear quadratic={ quadratic-in quadratic-out quadratic-in-out } cubic={ cubic-in cubic-out cubic-in-out } quart={ quart-in quart-out quart-in-out } sinusoidal={ sine-in sine-out sine-in-out } elastic
de:animiere _ um _ in _ Sek. beschleunigt: _ ca:modifica _ amb _ en _ segons de forma _ pt:anima _ de _ em _ s de forma _ x positionsteps x position y position direction size ghost effect color effect saturation effect brightness effect fisheye effect whirl effect pixelate effect mosaic effect negative effect tempo volume balance501linearlinear quadratic={ quadratic-in quadratic-out quadratic-in-out } cubic={ cubic-in cubic-out cubic-in-out } quart={ quart-in quart-out quart-in-out } sinusoidal={ sine-in sine-out sine-in-out } elasticdeltay positiondirectionsizetempovolumebalance1 12
de:Beschleunigung _ ca:de forma _ pt:a forma _ linearlinear quadratic={ quadratic-in quadratic-out quadratic-in-out } cubic={ cubic-in cubic-out cubic-in-out } quart={ quart-in quart-out quart-in-out } sinusoidal={ sine-in sine-out sine-in-out } elasticquadratic-outquadratic-inquadratic-in-outcubic-outcubic-incubic-in-outquart-outquart-inquart-in-outsine-outsine-insine-in-outelasticunknown easing function ""
de:für _ = _ bis _ _ in _ Sek. beschleunigt: _ _ ca:per _ = _ fins _ _ en _ segons de forma _ _ pt:para _ de _ a _ _ em _ s de forma _ _ 01001linearlinear quadratic={ quadratic-in quadratic-out quadratic-in-out } cubic={ cubic-in cubic-out cubic-in-out } quart={ quart-in quart-out quart-in-out } sinusoidal={ sine-in sine-out sine-in-out } elastic
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/apl.xml b/elements/pl-snap/Snap/libraries/apl.xml new file mode 100644 index 00000000..0eae836c --- /dev/null +++ b/elements/pl-snap/Snap/libraries/apl.xml @@ -0,0 +1 @@ +The first input is a shape list as in SHAPE OF. The output is an array with those dimensions containing the atomic items of the second input, repeating values if more are needed.
Reports a flat list of the maximum size of the input array along each dimension: number of rows, number of columns, etc. "Maximum" because it works even if the array isn't uniformly shaped.
Reports the greater of its two inputs. Works on strings too.
Reports a flat list of all the atomic elements of sublists of the input list.
Reports the number of dimensions of the input.
111
Takes a multidimensional array, and reports an array whose dimensions are reversed (as reported by SHAPE OF). In the case of a two-dimensional array, does the usual transposition of rows and columns.
Reverses the order of the (toplevel) items of the input. If the input is a matrix, this means it reverses the order of the rows, which is a reflection through a horizontal axis, as the ⦵ symbol suggests.
Like MAP, but can take any number of lists as inputs. The lists must all be the same size. The function input must take a number of inputs equal to the number of lists. MULTIMAP calls the function with all the first items, then all the second items, and so on.
cols
Computes a generalized matrix multiplication. In normal matrix multiplication, each cell of the result is computed by multiplying individual numbers within a row of the left input and a column of the right input, and then adding those products. In APL terms this is +.× ("plus dot times") Any dyadic functions can replace addition and multiplication in this algorithm; a common case is ∨.∧ ("or dot and")
111111
Reports the smaller of its two inputs.
This function has two names because there are two ways to understand it. Lisp way: A matrix is a list of rows. This block combines the numbers in each row, producing one value for the entire row. APL way: A matrix is made of vectors. This block takes each column as a vector, and does vector arithmetic on the columns, producing one column as the result.
choicesindexchoices
Reports 1 if the input is positive, 0 if the input is zero, or -1 if the input is negative.
0false
reports 1 divided by its input.
This block reports a random integer between 1 and its input. To roll more than one die, use (for three dice) roll (reshape as 3 items of 6) APL: ?3⍴6 Don't use reshape as 3 items of (roll 6), because that would roll one die and report 3 copies of the same random roll.
Reports True if the input is an APL scalar, i.e., either an atomic (non-list) value, or an array (list of lists) of any depth with only one atomic item, e.g., (list (list (list (3)))).
1
The input must be a value for which SCALAR? reports true, i.e., either an atom or a list of any depth but only one scalar item of item of... etc. This function returns the underlying scalar (number, etc.).
1
Reports the not-and of its inputs, in the form 0 for false, 1 for true.
Reports the not-and of its inputs, in the form 0 for false, 1 for true.
Reports True if the left input is less than or equal to the right input. Reports a Snap! Boolean, not an integer 0 or 1.
Reports True if the left input is greater than than or equal to the right input. Reports a Snap! Boolean, not an integer 0 or 1.
Reports False if its inputs are equal; reports True if its inputs are not equal. The inputs can have any non-list values. (Lists are hyperized.) If the inputs are Booleans (True/False or 1/0), this is also the exclusive-or function.
reports True iff the input is 0 or False.
Reports a Snap! Boolean False if the input is False or 0; reports True otherwise.
0
Turns list of list of ... a single scalar (e.g., ((((x)))) ) into just the scalar. Error if called with anything else.
Make scalar called with non-singleton input
If the input is a positive integer, reports a list of the numbers from 1 to that input. (If the input is 0, reports an empty list.) If the input is a list of positive integers, reports an array with the shape specified by the input (as in ⍴ reshape) in which each item is a list of the indices of that item in the array (so technically the shape has one more dimension than the input, whose size is the size of the input). If the input is a list that includes 0, the result is an array whose shape is the part of the input list before the 0, in which every element is empty. If you'd like some other value in every element, MD-MAP a constant function over the result. For list inputs, the size of the result grows very quickly, more or less the factorial of the size of the input. Snap! will not attempt to compute a result bigger than a few million atomic items. ⍳(⍳ 9) will work (≈ 3 million atoms) but ⍳(⍳ 10) will give an error.
If the rank of the left input is one more than the rank of the right input, reports the index of the right input in the left input, or if not found, reports one more than the length of the left input. If the rank of the left input is equal to the rank of the right input, reports a vector of the indices of the items of the right input in the left input (mapping this function over the right input). If the rank of the left input is more than that of the right input by 2 or more, reports a vector, the location of the right input in the left in each dimension. It is an error if the rank of the left input is less than that of the right input.
1result
This isn't an APL function, although it's related to the outer product. It takes any number of lists, and reports a list of all possible tuples with one item from each of the lists. The length of the result is the product of the lengths of the inputs. The result gets very big very quickly. Snap! will refuse to do this computation if the result would be more than a few million atomic items. (crossproduct (⍳(⍳9))) makes about 3 million atomic items; (crossproduct (⍳(⍳10))) gives an error message.
Reports an array of Booleans the same shape as the left input, indicating which of the atoms in the left input appear anywhere in the right input. (The structure of the right input doesn't matter.)
Like append, but: A scalar input is treated as an array the same shape as the other input except that the last item of the shape is 1. If the two inputs are of different ranks, the function is mapped over the larger ranked input. Catenate adds new columns, by appending to each row.
If the input is a nesting of length=1 lists, which APL treats as a scalar (the innermost item) for many purposes, report that innermost scalar. Otherwise, report the input as is. Exposing this block for users is important because Snap! /does not/ treat such a nesting as a scalar, so you might need to use this in translating an APL program to Snap!. (But the functions in the APL library already use this block as needed.)
Reports a vector of indices of the items of the input, in order of the values of the items, so that item (grade up (foo)) of (foo) reports the items in sorted order, smallest to largest. For a matrix, sorts the rows based on their first items, or if those are equal, based on their second items, etc.
Compares two vectors for sorting. Compare first items; if those are equal compare second items; etc.
1111
Reports a vector of indices of the items of the input, in order of the values of the items, so that item (grade down (foo)) of (foo) reports the items in sorted order, largest to smallest. For a matrix, sorts the rows based on their first items, or if those are equal, based on their second items, etc.
The left input must be a vector of Booleans (either Snap! form or APL form); the right input must be an array whose first dimension is equal to the length of the left input. The block reports an array of the same rank as the right input, containing only those items (rows, for a matrix) for which the corresponding Boolean is True (or 1).
The left input must be a vector of Booleans (either Snap! form or APL form); the right input must be an array whose last dimension is equal to the length of the left input. The block reports an array of the same rank as the right input, containing only those items (columns, for a matrix) for which the corresponding Boolean is True (or 1).
Turns a row-wise (in Lisp terminology) function into a column-wise one.
Reverses the order of the columns of the input, which is a reflection through a vertical axis, as the ⏀ symbol suggests.
This function has two names because there are two ways to understand it. Lisp way: A matrix is a list of rows. This block turns it into a list of columns, and combines the numbers in each column, producing one value for the entire column. APL way: A matrix is made of vectors. This block takes each row as a vector, and does vector arithmetic on the rows, producing one row as the result.
Like append, but: A scalar input is treated as a vector of length 1. If the two inputs are of different ranks, the function is mapped over the larger ranked input. Catenate vertically adds new rows, by appending to each column.
A hyperblock version of JOIN. The regular JOIN isn't hyperized because it can accept a list as input, representing it as text.
A positive left input selects the first n items of the right input. A negative left input selects the last abs(n) items of the right input. If the right input is a matrix, a numeric left input selects rows; the left input may also be a two-item vector, in which case the first number is applied to the rows and the second number is applied to the columns. Similarly for higher-dimension arrays.
10valueindex
A positive left input selects all but the first n items of the right input. A negative left input selects all but the last abs(n) items of the right input. If the right input is a matrix, a numeric left input selects rows; the left input may also be a two-item vector, in which case the first number is applied to the rows and the second number is applied to the columns. Similarly for higher-dimension arrays.
0valueindex
Throw an error. Makes a red halo appear around the script that runs it, with the input text shown in a speech balloon next to the script, just like any Snap! error. This is useful to put in the second script of SAFELY TRY after some other instructions to undo the partial work of the first script.
pt:lança o erro _
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 < as the comparison function will sort from low to high; using > will sort from high to low.
ca:ordena _ segons criteri _ copy of datasplitmerge11#1#2
1
Takes a (possibly deep) list as input, and reports a human-readable text form of the list (namely, Lisp notation). Will not work on circular lists.
( )
The identity function reports its input.
Takes as input a function of N inputs and N lists. 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.)
Takes a dyadic scalar function as input, and hyperizes it, so that it can take lists as inputs. Don't use on slow functions (this has compiled map calls). Meant for use on primitives.
ab
Computes logarithms in any base. The base is the left input. It's usual in APL that if there's a main data input and some sort of control input, the latter comes on the left. This is because APL syntax, unless you use parentheses, groups computations from right to left. APL has a monadic version of this function that computes natural logs (log to the base e).
Computes the number of combinations of right-input things taken left-input at a time, otherwise known as the elements of Pascal's triangle. This block shares the ! symbol with the monadic factorial function, because the formula for computing this function uses factorials.
The factorial of a positive integer n is the product of the integers from 1 to n. In real APL, the domain of this function is extended beyond integers to compute the gamma function.
Acts just like the function selected from the pulldown menu, but hyperized, so comparing two equal-sized lists reports a list of the same length as the inputs, with the results of item-by-item comparisons.
﹦ ≠ identical to and or is _ a _?
Reports the greatest common divisor of its inputs. If the inputs are values in {0,1} then this is equivalent to the logical OR of the values, with 0=False, 1=True. Hence the APL symbol ∨. Also accepts Snap! Booleans as inputs.
Reports the least common multiple of its inputs. If the inputs are values in {0,1} then this is equivalent to the logical AND of the values, with 0=False, 1=True. Hence the APL symbol ∧. Also accepts Snap! Booleans as inputs.
Reports 1 if the input is False or 0; otherwise reports 0.
Reports its input. This is useful to fit a value into a different-type input slot, e.g., number into list slot.
Report a list with left-input random integers in the range 1 to right-input. No number appears more than once in the result. The left input must be less than or equal to the right input.
Given two arrays A and B, reports an array whose dimensions are APPEND(SHAPE OF (A), SHAPE OF (B)) in which each atomic item of the result is computed by applying the dyadic function input to an item of A and an item of B.
11
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/arcs_module.xml b/elements/pl-snap/Snap/libraries/arcs_module.xml new file mode 100644 index 00000000..65118e1e --- /dev/null +++ b/elements/pl-snap/Snap/libraries/arcs_module.xml @@ -0,0 +1 @@ +
de:Bogen $turnRight _ ° Radius _ 905090
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/audioComp_module.xml b/elements/pl-snap/Snap/libraries/audioComp_module.xml new file mode 100644 index 00000000..b7316e76 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/audioComp_module.xml @@ -0,0 +1 @@ +
pt:executa no modo turbo _
pt:as amostras de som com _ Hz de _ s amostrado a _ Hz ca:_ Hz durant _ segons amb mostreig de _ Hz 440a 55=55 a 110=110 a 220=220 a 440=440 a 880=880 a 1760=1760 a 3520=352014410022.05 kHz=22050 44.1 kHz=44100 88.2 kHz=88200 96 kHz=96000
pt:π
pt:_ radianos em graus ca:graus de _ radiants 0.5
pt:o som _ ca:so de nom _ §_soundsMenu
quickly plot the samples of a sound, a list of samples (single channel), or a list of lists (multiple channels) to the stage at a lower resolution.
pt:desenha o gráfico do som _ ca:dibuixa el so _ §_soundsMenu1offset-2
records an audio snippet and reports it as a new sound, or zero if the user cancels
pt:$circleSolid-1-255-0-0 uma nova gravação ca:$circleSolid-1-255-0-0 enregistra
pt:a nota com _ Hz ca:nota de _ Hz 440
pt:a frequência da nota _ ca:freqüència (hz) de la nota _ 69
pt:o nome da nota _ ca:nom de la nota _ 69
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/bar-charts.xml b/elements/pl-snap/Snap/libraries/bar-charts.xml new file mode 100644 index 00000000..69847ec7 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/bar-charts.xml @@ -0,0 +1 @@ +Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the "Frequency Distribution Analysis" library instead.
ca:gràfica de la taula _ agrupada pel camp: _ des de: _ fins: _ interval: _ 1110
add missing entries to a sorted list. Used for histograms
pt:os itens de _ com a chave _ entre _ e _ com passo _ completados por _ ca:gràfica omplint _ amb clau: _ des de: _ fins: _ interval: _ amb _ 11
pt:desenha gráfico de barras de _ em (x: _ , y: _ ) com largura _ e altura _ ca:dibuixa gràfic _ a x: _ y: _ amplada: _ alçada: _ -200-100400200If smallest value < 0, the x axis isn't at the bottom. Note that sort is by > not by <. Not clear this can happen in a histogram!max y1ratio1label delta y5010step2190draw x axis at y=00draw y axis902012i15Ready to draw bars.2data90
ca:ordena taula _ pel camp _ en ordre _ ascending descending
ca:agrupa taula _ pel camp _ per intervals de _
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/bbtSnapExtension.js b/elements/pl-snap/Snap/libraries/bbtSnapExtension.js new file mode 100644 index 00000000..8ebedf94 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/bbtSnapExtension.js @@ -0,0 +1,1029 @@ + +window.birdbrain = {}; +window.birdbrain.sensorData = {}; +window.birdbrain.sensorData.A = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; +window.birdbrain.sensorData.B = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; +window.birdbrain.sensorData.C = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; +window.birdbrain.microbitIsV2 = {}; +window.birdbrain.microbitIsV2.A = false; +window.birdbrain.microbitIsV2.B = false; +window.birdbrain.microbitIsV2.C = false; +window.birdbrain.currentBeak = {}; +window.birdbrain.currentBeak.A = [0,0,0]; +window.birdbrain.currentBeak.B = [0,0,0]; +window.birdbrain.currentBeak.C = [0,0,0]; +window.birdbrain.robotType = { + FINCH: 1, + HUMMINGBIRDBIT: 2, + MICROBIT: 3, + GLOWBOARD: 4, + //connected robots default to type MICROBIT + A: 3, + B: 3, + C: 3 +}; + +//For the old style robots that connect over hid. +window.bbtLegacy = {}; +window.bbtLegacy.sensorData = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + +console.log("setting up message channel") +window.birdbrain.messageChannel = new MessageChannel(); +window.birdbrain.messageChannel.port1.onmessage = function (e) { + //console.log("Got a message: "); + //console.log(e.data); + if (e.data.sensorData != null && e.data.robot != null) { + let robot = e.data.robot; + window.birdbrain.sensorData[robot] = e.data.sensorData; + window.birdbrain.robotType[robot] = e.data.robotType; + window.birdbrain.microbitIsV2[robot] = e.data.hasV2Microbit; + } + + if (e.data.hidSensorData != null ) { + window.bbtLegacy.sensorData = e.data.hidSensorData; + } +} +window.parent.postMessage("hello from snap", "*", [window.birdbrain.messageChannel.port2]); + +window.birdbrain.sendCommand = function(command) { + window.parent.postMessage(command, "*"); +} + +// Converts byte range 0 - 255 to -127 - 127 represented as a 32 bit signe int +function byteToSignedInt8 (byte) { + var sign = (byte & (1 << 7)); + var value = byte & 0x7F; + if (sign) { value = byte | 0xFFFFFF00; } + return value; +} + +// Converts byte range 0 - 255 to -127 - 127 represented as a 32 bit signe int +function byteToSignedInt16 (msb, lsb) { + var sign = msb & (1 << 7); + var value = (((msb & 0xFF) << 8) | (lsb & 0xFF)); + if (sign) { + value = 0xFFFF0000 | value; // fill in most significant bits with 1's + } + return value; +} + +window.birdbrain.getMicrobitAcceleration = function(axis, robot) { + const rawToMperS = 196/1280; //convert to meters per second squared + let sensorData = window.birdbrain.sensorData[robot]; + let accVal = 0; + switch (axis) { + case 'X': + accVal = byteToSignedInt8(sensorData[4]); + break; + case 'Y': + accVal = byteToSignedInt8(sensorData[5]); + break; + case 'Z': + accVal = byteToSignedInt8(sensorData[6]); + break; + } + return (accVal * rawToMperS); +} + +window.birdbrain.getMicrobitMagnetometer = function(axis, finch) { + const rawToUT = 1/10; //convert to uT + let sensorData = window.birdbrain.sensorData[finch]; + let msb = 0; + let lsb = 0; + switch (axis) { + case 'X': + msb = sensorData[8]; + lsb = sensorData[9]; + break; + case 'Y': + msb = sensorData[10]; + lsb = sensorData[11]; + break; + case 'Z': + msb = sensorData[12]; + lsb = sensorData[13]; + break; + } + let magVal = byteToSignedInt16(msb, lsb); + return Math.round(magVal * rawToUT); +} + +window.birdbrain.getFinchAcceleration = function(axis, finch) { + let sensorData = window.birdbrain.sensorData[finch]; + let accVal = 0; + switch (axis) { + case 'X': + accVal = byteToSignedInt8(sensorData[13]); + break; + case 'Y': + case 'Z': + const rawY = byteToSignedInt8(sensorData[14]); + const rawZ = byteToSignedInt8(sensorData[15]); + const rad = 40 * Math.PI / 180; //40° in radians + + switch(axis) { + case 'Y': + accVal = (rawY*Math.cos(rad) - rawZ*Math.sin(rad)); + break; + case 'Z': + accVal = (rawY*Math.sin(rad) + rawZ*Math.cos(rad)); + break; + } + } + return (accVal * 196/1280); +} + +window.birdbrain.getFinchMagnetometer = function(axis, finch) { + let sensorData = window.birdbrain.sensorData[finch]; + switch (axis) { + case 'X': + return byteToSignedInt8(sensorData[17]); + case 'Y': + case 'Z': + const rawY = byteToSignedInt8(sensorData[18]); + const rawZ = byteToSignedInt8(sensorData[19]); + const rad = 40 * Math.PI / 180 //40° in radians + + let magVal = 0; + switch(axis) { + case 'Y': + magVal = (rawY*Math.cos(rad) + rawZ*Math.sin(rad)); + break; + case 'Z': + magVal = (rawZ*Math.cos(rad) - rawY*Math.sin(rad)); + break; + } + return Math.round(magVal); + } +} + + + + +//// Motion Blocks //// + +SnapExtensions.primitives.set( + 'bbt_bitpositionservo(robot, port, position)', + function (robot, port, position) { + position = Math.max(0, Math.min(180, position)); + position = Math.round(1.41 * position);//254/180 Scaling Factor + + var thisCommand = { + robot: robot, + cmd: "servo", + port: port, + value: position + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +SnapExtensions.primitives.set( + 'bbt_bitrotationservo(robot, port, speed)', + function (robot, port, speed) { + speed = Math.max(-100, Math.min(100, speed)); + if (speed < 10 && speed > -10) { + speed = 255; + } else { + speed = Math.round((speed * 23/100) + 122) + } + + var thisCommand = { + robot: robot, + cmd: "servo", + port: port, + value: speed + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +SnapExtensions.primitives.set( + 'bbt_finchismoving(robot)', + function (robot) { + return (window.birdbrain.sensorData[robot][4] > 127); + } +); + +SnapExtensions.primitives.set( + 'bbt_finchmove(robot, direction, distance, speed)', + function (robot, direction, distance, speed) { + distance = Math.max(-10000, Math.min(10000, distance)); + speed = Math.max(0, Math.min(100, speed)); + + var thisCommand = { + robot: robot, + cmd: "move", + direction: direction, + distance: distance, + speed: speed + } + window.birdbrain.sendCommand(thisCommand) + } +); + +SnapExtensions.primitives.set( + 'bbt_finchstop(robot)', + function (robot) { + var thisCommand = { + robot: robot, + cmd: "stopFinch" + } + window.birdbrain.sendCommand(thisCommand) + } +); + +SnapExtensions.primitives.set( + 'bbt_finchturn(robot, direction, angle, speed)', + function (robot, direction, angle, speed) { + angle = Math.max(-360000, Math.min(360000, angle)); + speed = Math.max(0, Math.min(100, speed)); + + var thisCommand = { + robot: robot, + cmd: "turn", + direction: direction, + angle: angle, + speed: speed + } + window.birdbrain.sendCommand(thisCommand) + } +); + +SnapExtensions.primitives.set( + 'bbt_finchwheels(robot, left, right)', + function (robot, left, right) { + left = Math.max(-100, Math.min(100, left)); + right = Math.max(-100, Math.min(100, right)); + + var thisCommand = { + robot: robot, + cmd: "wheels", + speedL: left, + speedR: right + } + window.birdbrain.sendCommand(thisCommand) + } +); + +//// Looks Blocks //// + +SnapExtensions.primitives.set( + 'bbt_display(robot, symbol)', + function (robot, symbolString) { + var thisCommand = { + robot: robot, + cmd: "symbol", + symbolString: symbolString + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +SnapExtensions.primitives.set( + 'bbt_led(robot, port, intensity)', + function (robot, port, intensity) { + var thisCommand = { + robot: robot, + cmd: "led", + port: port, + intensity: Math.floor(Math.max(Math.min(intensity*2.55, 255), 0)) + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +SnapExtensions.primitives.set( + 'bbt_print(robot, string)', + function (robot, string) { + var thisCommand = { + robot: robot, + cmd: "print", + printString: string + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +SnapExtensions.primitives.set( + 'bbt_triled(robot, port, red, green, blue)', + function (robot, port, red, green, blue) { + var thisCommand = { + robot: robot, + cmd: "triled", + port: port, + red: Math.floor(Math.max(Math.min(red*2.55, 255), 0)), + green: Math.floor(Math.max(Math.min(green*2.55, 255), 0)), + blue: Math.floor(Math.max(Math.min(blue*2.55, 255), 0)) + } + if (port == 1) { + window.birdbrain.currentBeak[robot] = [thisCommand.red, thisCommand.green, thisCommand.blue]; + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +//// Control Blocks //// + +SnapExtensions.primitives.set( + 'bbt_stop(robot)', + function (robot) { + var thisCommand = { + robot: robot, + cmd: "stopAll" + } + window.birdbrain.sendCommand(thisCommand) + } +); + +//// Sound Blocks //// + +SnapExtensions.primitives.set( + 'bbt_playnote(robot, note, duration)', + function (robot, note, duration) { + note = Math.round(Math.max(32, Math.min(135, note))); + console.log("playing note " + note); + + var thisCommand = { + robot: robot, + cmd: "playNote", + note: note, + duration: duration + } + window.birdbrain.sendCommand(thisCommand) + } +); + +//// Sensing Blocks //// + +SnapExtensions.primitives.set( + 'bbt_accelerometer(robot, dimension)', + function (robot, dim) { + let acc = window.birdbrain.getMicrobitAcceleration(dim, robot); + return Math.round(acc * 10) / 10; + } +); + +SnapExtensions.primitives.set( + 'bbt_bitsensor(robot, sensor, port)', + function (robot, sensor, port) { + const distanceScaling = 117/100; + const dialScaling = 100/230; + const lightScaling = 100/255; + const soundScaling = 200/255; + const voltageScaling = 3.3/255; + + let value = window.birdbrain.sensorData[robot][port - 1]; + + switch(sensor) { + case "Distance (cm)": + return Math.round(value * distanceScaling); + case "Dial": + if (value > 230) { value = 230; } + return Math.round(value * dialScaling); + case "Light": + return Math.round(value * lightScaling); + case "Sound": + return Math.round(value * soundScaling); + case "Other (V)": + return Math.round(value * voltageScaling * 100) / 100; + default: + console.log("Unknown sensor: " + sensor); + return 0; + } + } +); + +SnapExtensions.primitives.set( + 'bbt_button(robot, button)', + function (robot, button) { + const type = window.birdbrain.robotType[robot]; + const index = (type == window.birdbrain.robotType.FINCH) ? 16 : 7; + var buttonState = window.birdbrain.sensorData[robot][index] & 0xF0; //Button Byte position = 7, clear LS Bits as it is for shake and calibrate + + switch (button) { + case 'A': + return (buttonState == 0x00 || buttonState == 0x20) + case 'B': + return (buttonState == 0x00 || buttonState == 0x10) + case 'Logo (V2)': + if(window.birdbrain.microbitIsV2[robot]) { + return (((window.birdbrain.sensorData[robot][index] >> 1) & 0x1) == 0x0) + } else { + return "micro:bit V2 required"; + } + default: + console.log("unknown button " + button); + return false; + } + } +); + +SnapExtensions.primitives.set( + 'bbt_compass(robot)', + function (robot) { + const ax = window.birdbrain.getMicrobitAcceleration('X', robot); + const ay = window.birdbrain.getMicrobitAcceleration('Y', robot); + const az = window.birdbrain.getMicrobitAcceleration('Z', robot); + const mx = window.birdbrain.getMicrobitMagnetometer('X', robot); + const my = window.birdbrain.getMicrobitMagnetometer('Y', robot); + const mz = window.birdbrain.getMicrobitMagnetometer('Z', robot); + + const phi = Math.atan(-ay / az) + const theta = Math.atan(ax / (ay * Math.sin(phi) + az * Math.cos(phi))) + + const xp = mx + const yp = my * Math.cos(phi) - mz * Math.sin(phi) + const zp = my * Math.sin(phi) + mz * Math.cos(phi) + + const xpp = xp * Math.cos(theta) + zp * Math.sin(theta) + const ypp = yp + + const angle = 180.0 + ((Math.atan2(xpp, ypp)) * (180 / Math.PI)) //convert result to degrees + + return Math.round(angle) + } +); + +SnapExtensions.primitives.set( + 'bbt_finchaccelerometer(robot, dimension)', + function (robot, dim) { + let acc = window.birdbrain.getFinchAcceleration(dim, robot); + return Math.round(acc * 10) / 10; + } +); + +SnapExtensions.primitives.set( + 'bbt_finchcompass(robot)', + function (robot) { + const ax = window.birdbrain.getFinchAcceleration('X', robot); + const ay = window.birdbrain.getFinchAcceleration('Y', robot); + const az = window.birdbrain.getFinchAcceleration('Z', robot); + const mx = window.birdbrain.getFinchMagnetometer('X', robot); + const my = window.birdbrain.getFinchMagnetometer('Y', robot); + const mz = window.birdbrain.getFinchMagnetometer('Z', robot); + + const phi = Math.atan(-ay / az) + const theta = Math.atan(ax / (ay * Math.sin(phi) + az * Math.cos(phi))) + + const xp = mx + const yp = my * Math.cos(phi) - mz * Math.sin(phi) + const zp = my * Math.sin(phi) + mz * Math.cos(phi) + + const xpp = xp * Math.cos(theta) + zp * Math.sin(theta) + const ypp = yp + + const angle = 180.0 + ((Math.atan2(xpp, ypp)) * (180 / Math.PI)) //convert result to degrees + + return ((Math.round(angle) + 180) % 360) //turn so that beak points north + } +); + +SnapExtensions.primitives.set( + 'bbt_finchdistance(robot)', + function (robot) { + if (window.birdbrain.microbitIsV2[robot]) { + return window.birdbrain.sensorData[robot][1]; + } else { + const cmPerDistance = 0.0919; + const msb = window.birdbrain.sensorData[robot][0]; + const lsb = window.birdbrain.sensorData[robot][1]; + + const distance = msb << 8 | lsb; + return Math.round(distance * cmPerDistance); + } + } +); + +SnapExtensions.primitives.set( + 'bbt_finchencoder(robot, port)', + function (robot, port) { + let TICKS_PER_ROTATION = 792 + var msb = 0; + var ssb = 0; + var lsb = 0; + switch (port) { + case 'Right': + msb = window.birdbrain.sensorData[robot][10]; + ssb = window.birdbrain.sensorData[robot][11]; + lsb = window.birdbrain.sensorData[robot][12]; + break; + case 'Left': + msb = window.birdbrain.sensorData[robot][7]; + ssb = window.birdbrain.sensorData[robot][8]; + lsb = window.birdbrain.sensorData[robot][9]; + break; + default: + console.log("unknown encoder port " + port); + } + var encoder = msb << 16 | ssb << 8 | lsb + if (encoder >= 0x800000) { + encoder = encoder | 0xFF000000; + } + return Math.round( encoder * 10 / TICKS_PER_ROTATION ) / 10 + } +); + +SnapExtensions.primitives.set( + 'bbt_finchencoderreset(robot)', + function (robot) { + var thisCommand = { + robot: robot, + cmd: "resetEncoders" + } + window.birdbrain.sendCommand(thisCommand) + } +); + +SnapExtensions.primitives.set( + 'bbt_finchlight(robot, port)', + function (robot, port) { + const beak = window.birdbrain.currentBeak[robot] || [0,0,0]; + const R = beak[0]*100/255; + const G = beak[1]*100/255; + const B = beak[2]*100/255; + var raw = 0; + var correction = 0; + switch (port) { + case 'Right': + raw = window.birdbrain.sensorData[robot][3]; + correction = 6.40473070e-03*R + 1.41015162e-02*G + 5.05547817e-02*B + 3.98301391e-04*R*G + 4.41091223e-04*R*B + 6.40756862e-04*G*B + -4.76971242e-06*R*G*B; + break; + case 'Left': + raw = window.birdbrain.sensorData[robot][2]; + correction = 1.06871493e-02*R + 1.94526614e-02*G + 6.12409825e-02*B + 4.01343475e-04*R*G + 4.25761981e-04*R*B + 6.46091068e-04*G*B + -4.41056971e-06*R*G*B; + break; + default: + console.log("unknown light port " + port); + return 0; + } + + return Math.round(Math.max(0, Math.min(100, (raw - correction)))); + } +); + +SnapExtensions.primitives.set( + 'bbt_finchline(robot, port)', + function (robot, port) { + var rawVal = 0; + switch (port) { + case 'Right': + rawVal = window.birdbrain.sensorData[robot][5]; + break; + case 'Left': + rawVal = window.birdbrain.sensorData[robot][4]; + //first bit is for position control + rawVal = (0x7F & rawVal) + break; + default: + console.log("unknown line port " + port); + } + var returnVal = 100 - ((rawVal - 6) * 100/121); + return Math.min(100, Math.max(0, Math.round(returnVal))); + } +); + +SnapExtensions.primitives.set( + 'bbt_finchmagnetometer(robot, dimension)', + function (robot, dim) { + return window.birdbrain.getFinchMagnetometer(dim, robot); + } +); + +SnapExtensions.primitives.set( + 'bbt_finchorientation(robot, dimension)', + function (robot, dim) { + if (dim == "Shake") { + let shake = window.birdbrain.sensorData[robot][16]; + return ((shake & 0x01) > 0); + } + const threshold = 7.848; + let acceleration = 0; + switch(dim) { + case "Tilt Left": + case "Tilt Right": + acceleration = window.birdbrain.getFinchAcceleration('X', robot); + break; + case "Beak Up": + case "Beak Down": + acceleration = window.birdbrain.getFinchAcceleration('Y', robot); + break; + case "Level": + case "Upside Down": + acceleration = window.birdbrain.getFinchAcceleration('Z', robot); + break; + } + switch(dim) { + case "Tilt Right": + case "Beak Up": + case "Upside Down": + return (acceleration > threshold); + case "Tilt Left": + case "Beak Down": + case "Level": + return (acceleration < -threshold); + } + + console.log("Unknown dimension " + dim); + return false; + } +); + +SnapExtensions.primitives.set( + 'bbt_magnetometer(robot, dimension)', + function (robot, dim) { + return window.birdbrain.getMicrobitMagnetometer(dim, robot); + } +); + +SnapExtensions.primitives.set( + 'bbt_orientation(robot, dimension)', + function (robot, dim) { + if (dim == "Shake") { + const index = 7; + let shake = window.birdbrain.sensorData[robot][index]; + return ((shake & 0x01) > 0); + } + const threshold = 7.848; + let acceleration = 0; + switch(dim) { + case "Tilt Left": + case "Tilt Right": + acceleration = window.birdbrain.getMicrobitAcceleration('X', robot); + break; + case "Logo Up": + case "Logo Down": + acceleration = window.birdbrain.getMicrobitAcceleration('Y', robot); + break; + case "Screen Up": + case "Screen Down": + acceleration = window.birdbrain.getMicrobitAcceleration('Z', robot); + break; + } + switch(dim) { + case "Tilt Left": + case "Logo Down": + case "Screen Down": + return (acceleration > threshold); + case "Tilt Right": + case "Logo Up": + case "Screen Up": + return (acceleration < -threshold); + } + + console.log("Unknown dimension " + dim); + return false; + } +); + +SnapExtensions.primitives.set( + 'bbt_sound(robot)', + function (robot) { + if (window.birdbrain.microbitIsV2[robot]) { + const type = window.birdbrain.robotType[robot]; + if (type == window.birdbrain.robotType.FINCH) { + return window.birdbrain.sensorData[robot][0]; + } else { + return window.birdbrain.sensorData[robot][14]; + } + } else { + return "micro:bit V2 required" + } + } +); + +SnapExtensions.primitives.set( + 'bbt_temperature(robot)', + function (robot) { + if (window.birdbrain.microbitIsV2[robot]) { + const type = window.birdbrain.robotType[robot]; + if (type == window.birdbrain.robotType.FINCH) { + return (window.birdbrain.sensorData[robot][6] >> 2); + } else { + return window.birdbrain.sensorData[robot][15]; + } + } else { + return "micro:bit V2 required" + } + } +); + +//// GlowBoard Blocks //// + +SnapExtensions.primitives.set( + 'bbt_gbbutton(robot, button)', + function (robot, button) { + var buttonState = window.birdbrain.sensorData[robot][5] & 0xF0; //Button Byte position = 7, clear LS Bits as it is for shake and calibrate + + switch (button) { + case 'right': + return (buttonState == 0x00 || buttonState == 0x20) + case 'left': + return (buttonState == 0x00 || buttonState == 0x10) + default: + console.log("unknown button " + button); + return false; + } + } +); + +SnapExtensions.primitives.set( + 'bbt_gbdial(robot, dial)', + function (robot, sensor) { + let index = 1 + if (sensor == "Right") { index = 3 } + const msb = window.birdbrain.sensorData[robot][index]; + const lsb = window.birdbrain.sensorData[robot][index + 1]; + const value = msb << 8 | lsb; + return value; + } +); + +SnapExtensions.primitives.set( + 'bbt_gbdisplay(robot, color, brightness, symbol)', + function (robot, color, brightness, symbolString) { + var thisCommand = { + robot: robot, + cmd: "glowboard", + color: color, + brightness: brightness, + symbolString: symbolString + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +SnapExtensions.primitives.set( + 'bbt_gbsetpoint(robot, X, Y, color, brightness)', + function (robot, xPos, yPos, color, brightness) { + var thisCommand = { + robot: robot, + cmd: "setPoint", + xPos: Math.round(Math.max(Math.min(xPos, 12), 1)), + yPos: Math.round(Math.max(Math.min(yPos, 12), 1)), + color: color, + brightness: brightness + } + + window.birdbrain.sendCommand(thisCommand); + } +); + +//// Blocks for old style robots //// + +SnapExtensions.primitives.set( + 'bbt_legacyled(port, intensity)', + function (portnum, intensitynum) { + var realPort = portnum-1; + var realIntensity = Math.floor(intensitynum*2.55); + + var report = { + message:"L".charCodeAt(0), + port: realPort.toString().charCodeAt(0), + intensity: realIntensity + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacytriled(port, red, green, blue)', + function (portnum, rednum, greennum, bluenum) { + var realPort = portnum-1; + var realIntensities = [rednum, greennum, bluenum].map(function(intensity) { + return Math.floor(Math.max(Math.min(intensity*2.55, 255), 0)); + }); + + var report = { + message:"O".charCodeAt(0), + port: realPort.toString().charCodeAt(0), + red: realIntensities[0], + green: realIntensities[1], + blue: realIntensities[2] + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyservo(port, position)', + function (portnum, ang) { + var realPort = portnum-1; + var realAngle = Math.floor(ang*1.25); + realAngle = Math.max(Math.min(realAngle,225.0),0.0); + + var report = { + message: "S".charCodeAt(0), + port: realPort.toString().charCodeAt(0), + angle: realAngle + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacymotor(port, speed)', + function (portnum, velocity) { + var realPort = portnum-1; + var realVelocity = Math.floor(velocity*2.55); + realVelocity = Math.max(Math.min(realVelocity,255), -255); + + var report = { + message: "M".charCodeAt(0), + port: realPort.toString().charCodeAt(0), + direction: (realVelocity < 0 ? 1 : 0).toString().charCodeAt(0), + velocity: Math.abs(realVelocity) + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyvibration(port, intensity)', + function (portnum, intensitynum) { + var realPort = portnum-1; + var realIntensity = Math.floor(intensitynum*2.55); + realIntensity = Math.max(Math.min(realIntensity,255.0),0.0); + + var report = { + message: "V".charCodeAt(0), + port: realPort.toString().charCodeAt(0), + intensity: realIntensity + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacysaythis(phrase)', + function (phrase) { + var report = { message: "SPEAK", val: phrase}; + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyhbsensor(sensor, port)', + function (sensor, port) { + var realport = port - 1; + var sensorvalue = window.bbtLegacy.sensorData[realport] + + switch(sensor) { + case "Light": + return parseInt(sensorvalue / 2.55); + case "Temperature": //Celsius + return Math.floor(((sensorvalue-127)/2.4+25)*100/100); + case "Distance": //cm + var reading = sensorvalue*4; + if (reading < 130) { + sensorvalue = 100; + } else { //formula based on mathematical regression + reading = reading - 120; + var distance; + if (reading > 680) { + distance = 5.0; + } else { + var sensor_val_square = reading*reading; + distance = sensor_val_square*sensor_val_square*reading*-0.000000000004789 + + sensor_val_square*sensor_val_square*0.000000010057143 + - sensor_val_square*reading*0.000008279033021 + + sensor_val_square*0.003416264518201 + - reading*0.756893112198934 + + 90.707167605683000; + } + sensorvalue = parseInt(distance); + } + return sensorvalue; + case "Dial": + return parseInt(sensorvalue / 2.55); + case "Sound": + if (sensorvalue > 14) { + return (sensorvalue - 15) * 3/2 + } else { + return 0 + } + case "Raw": + return parseInt(sensorvalue / 2.55); + default: + console.log("Unknown sensor: " + sensor); + return 0; + } + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyfinchmove(left, right)', + function (left, right) { + function constrain(n) { + return Math.max(Math.min(n, 255), -255); + } + var speeds = [constrain(Math.round(left * 2.55)), constrain(Math.round(right * 2.55))]; + + var report = { + message: "M".charCodeAt(0), + leftDirection: speeds[0] < 0 ? 1 : 0, + leftSpeed: Math.abs(speeds[0]), + rightDirection: speeds[1] < 0 ? 1 : 0, + rightSpeed: Math.abs(speeds[1]), + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyfinchled(red, green, blue)', + function (red, green, blue) { + // constrain n to the range [0..255] + function constrain(n) { + return Math.max(Math.min(n, 255), 0); + } + + var values = [constrain(Math.round(red * 2.55)), constrain(Math.round(green * 2.55)), constrain(Math.round(blue * 2.55))]; + + var report = { + message: "O".charCodeAt(0), + red: values[0], + green: values[1], + blue: values[2] + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyfinchbuzzer(frequency, duration)', + function (freq, time) { + //constrain n to the range [0..65535] + function constrain(n) { + return Math.max(Math.min(n, 0xFFFF), 0); + } + var value = { + freq: constrain(Math.round(freq)), + time: constrain(Math.round(time)) + }; + + var report = { + message: "B".charCodeAt(0), + timeHigh: value.time >> 8, // Since the report must be in bytes + timeLow: value.time & 0xFF, // and these values are bigger than a byte + freqHigh: value.freq >> 8, // they are split into two bytes + freqLow: value.freq & 0xFF + }; + + window.birdbrain.sendCommand( report ); + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyfinchsensor(port)', + function (port) { + //Ports: Left Light = 0; Right Light = 1; + // Acceleration (X, Y, Z) = (2, 3, 4); + // Left Obstacle = 5; Right Obstacle = 6; + // Temperature C = 7; + return window.bbtLegacy.sensorData[port]; + } +); + +SnapExtensions.primitives.set( + 'bbt_legacyfinchorientation()', + function () { + var acceleration = Array(3); + acceleration[0] = window.bbtLegacy.sensorData[2] + acceleration[1] = window.bbtLegacy.sensorData[3] + acceleration[2] = window.bbtLegacy.sensorData[4] + + var orientation; + + if(acceleration[0] > -0.5 && acceleration[0] < 0.5 && acceleration[1] < 0.5 && acceleration[1] > -0.5 && acceleration[2] > 0.65 && acceleration[2] < 1.5) + orientation = "level"; + else if(acceleration[0] > -0.5 && acceleration[0] < 0.5 && acceleration[1] < 0.5 && acceleration[1] > -0.5 && acceleration[2] > -1.5 && acceleration[2] < -0.65) + orientation = "upside down"; + else if(acceleration[0] < 1.5 && acceleration[0] > 0.8 && acceleration[1] > -0.3 && acceleration[1] < 0.3 && acceleration[2] > -0.3 && acceleration[2] < 0.3) + orientation = "beak down"; + else if(acceleration[0] < -0.8 && acceleration[0] > -1.5 && acceleration[1] > -0.3 && acceleration[1] < 0.3 && acceleration[2] > -0.3 && acceleration[2] < 0.3) + orientation = "beak up"; + else if(acceleration[0] > -0.5 && acceleration[0] < 0.5 && acceleration[1] > 0.7 && acceleration[1] < 1.5 && acceleration[2] > -0.5 && acceleration[2] < 0.5) + orientation = "left wing down"; + else if(acceleration[0] > -0.5 && acceleration[0] < 0.5 && acceleration[1] > -1.5 && acceleration[1] < -0.7 && acceleration[2] > -0.5 && acceleration[2] < 0.5) + orientation = "right wing down"; + else + orientation = "in between"; + + return orientation + } +); diff --git a/elements/pl-snap/Snap/libraries/biginteger.js b/elements/pl-snap/Snap/libraries/biginteger.js new file mode 100644 index 00000000..f6fec468 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/biginteger.js @@ -0,0 +1,1621 @@ +/* + JavaScript BigInteger library version 0.9 + http://silentmatt.com/biginteger/ + + Copyright (c) 2009 Matthew Crumley + Copyright (c) 2010,2011 by John Tobey + Licensed under the MIT license. + + Support for arbitrary internal representation base was added by + Vitaly Magerya. +*/ + +/* + File: biginteger.js + + Exports: + + +*/ + +/* + Class: BigInteger + An arbitrarily-large integer. + + objects should be considered immutable. None of the "built-in" + methods modify *this* or their arguments. All properties should be + considered private. + + All the methods of instances can be called "statically". The + static versions are convenient if you don't already have a + object. + + As an example, these calls are equivalent. + + > BigInteger(4).multiply(5); // returns BigInteger(20); + > BigInteger.multiply(4, 5); // returns BigInteger(20); + + > var a = 42; + > var a = BigInteger.toJSValue("0b101010"); // Not completely useless... +*/ + +// IE doesn't support Array.prototype.map +if (!Array.prototype.map) { + Array.prototype.map = function(fun /*, thisp*/) { + var len = this.length >>> 0; + if (typeof fun !== "function") { + throw new TypeError(); + } + + var res = new Array(len); + var thisp = arguments[1]; + for (var i = 0; i < len; i++) { + if (i in this) { + res[i] = fun.call(thisp, this[i], i, this); + } + } + + return res; + }; +} + +/* + Constructor: BigInteger() + Convert a value to a . + + Although is the constructor for objects, it is + best not to call it as a constructor. If *n* is a object, it is + simply returned as-is. Otherwise, is equivalent to + without a radix argument. + + > var n0 = BigInteger(); // Same as + > var n1 = BigInteger("123"); // Create a new with value 123 + > var n2 = BigInteger(123); // Create a new with value 123 + > var n3 = BigInteger(n2); // Return n2, unchanged + + The constructor form only takes an array and a sign. *n* must be an + array of numbers in little-endian order, where each digit is between 0 + and BigInteger.base. The second parameter sets the sign: -1 for + negative, +1 for positive, or 0 for zero. The array is *not copied and + may be modified*. If the array contains only zeros, the sign parameter + is ignored and is forced to zero. + + > new BigInteger([5], -1): create a new BigInteger with value -5 + + Parameters: + + n - Value to convert to a . + + Returns: + + A value. + + See Also: + + , +*/ +function BigInteger(n, s) { + if (!(this instanceof BigInteger)) { + if (n instanceof BigInteger) { + return n; + } + else if (typeof n === "undefined") { + return BigInteger.ZERO; + } + return BigInteger.parse(n); + } + + n = n || []; // Provide the nullary constructor for subclasses. + while (n.length && !n[n.length - 1]) { + --n.length; + } + this._d = n; + this._s = n.length ? (s || 1) : 0; +} + +// Base-10 speedup hacks in parse, toString, exp10 and log functions +// require base to be a power of 10. 10^7 is the largest such power +// that won't cause a precision loss when digits are multiplied. +BigInteger.base = 10000000; +BigInteger.base_log10 = 7; + +BigInteger.init = function() { + +// Constant: ZERO +// 0. +BigInteger.ZERO = new BigInteger([], 0); + +// Constant: ONE +// 1. +BigInteger.ONE = new BigInteger([1], 1); + +// Constant: M_ONE +// -1. +BigInteger.M_ONE = new BigInteger(BigInteger.ONE._d, -1); + +// Constant: _0 +// Shortcut for . +BigInteger._0 = BigInteger.ZERO; + +// Constant: _1 +// Shortcut for . +BigInteger._1 = BigInteger.ONE; + +/* + Constant: small + Array of from 0 to 36. + + These are used internally for parsing, but useful when you need a "small" + . + + See Also: + + , , <_0>, <_1> +*/ +BigInteger.small = [ + BigInteger.ZERO, + BigInteger.ONE, + /* Assuming BigInteger.base > 36 */ + new BigInteger( [2], 1), + new BigInteger( [3], 1), + new BigInteger( [4], 1), + new BigInteger( [5], 1), + new BigInteger( [6], 1), + new BigInteger( [7], 1), + new BigInteger( [8], 1), + new BigInteger( [9], 1), + new BigInteger([10], 1), + new BigInteger([11], 1), + new BigInteger([12], 1), + new BigInteger([13], 1), + new BigInteger([14], 1), + new BigInteger([15], 1), + new BigInteger([16], 1), + new BigInteger([17], 1), + new BigInteger([18], 1), + new BigInteger([19], 1), + new BigInteger([20], 1), + new BigInteger([21], 1), + new BigInteger([22], 1), + new BigInteger([23], 1), + new BigInteger([24], 1), + new BigInteger([25], 1), + new BigInteger([26], 1), + new BigInteger([27], 1), + new BigInteger([28], 1), + new BigInteger([29], 1), + new BigInteger([30], 1), + new BigInteger([31], 1), + new BigInteger([32], 1), + new BigInteger([33], 1), + new BigInteger([34], 1), + new BigInteger([35], 1), + new BigInteger([36], 1) +]; +} +BigInteger.init(); + +// Used for parsing/radix conversion +BigInteger.digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".split(""); + +/* + Method: toString + Convert a to a string. + + When *base* is greater than 10, letters are upper case. + + Parameters: + + base - Optional base to represent the number in (default is base 10). + Must be between 2 and 36 inclusive, or an Error will be thrown. + + Returns: + + The string representation of the . +*/ +BigInteger.prototype.toString = function(base) { + base = +base || 10; + if (base < 2 || base > 36) { + throw new Error("illegal radix " + base + "."); + } + if (this._s === 0) { + return "0"; + } + if (base === 10) { + var str = this._s < 0 ? "-" : ""; + str += this._d[this._d.length - 1].toString(); + for (var i = this._d.length - 2; i >= 0; i--) { + var group = this._d[i].toString(); + while (group.length < BigInteger.base_log10) group = '0' + group; + str += group; + } + return str; + } + else { + var numerals = BigInteger.digits; + base = BigInteger.small[base]; + var sign = this._s; + + var n = this.abs(); + var digits = []; + var digit; + + while (n._s !== 0) { + var divmod = n.divRem(base); + n = divmod[0]; + digit = divmod[1]; + // TODO: This could be changed to unshift instead of reversing at the end. + // Benchmark both to compare speeds. + digits.push(numerals[digit.valueOf()]); + } + return (sign < 0 ? "-" : "") + digits.reverse().join(""); + } +}; + +// Verify strings for parsing +BigInteger.radixRegex = [ + /^$/, + /^$/, + /^[01]*$/, + /^[012]*$/, + /^[0-3]*$/, + /^[0-4]*$/, + /^[0-5]*$/, + /^[0-6]*$/, + /^[0-7]*$/, + /^[0-8]*$/, + /^[0-9]*$/, + /^[0-9aA]*$/, + /^[0-9abAB]*$/, + /^[0-9abcABC]*$/, + /^[0-9a-dA-D]*$/, + /^[0-9a-eA-E]*$/, + /^[0-9a-fA-F]*$/, + /^[0-9a-gA-G]*$/, + /^[0-9a-hA-H]*$/, + /^[0-9a-iA-I]*$/, + /^[0-9a-jA-J]*$/, + /^[0-9a-kA-K]*$/, + /^[0-9a-lA-L]*$/, + /^[0-9a-mA-M]*$/, + /^[0-9a-nA-N]*$/, + /^[0-9a-oA-O]*$/, + /^[0-9a-pA-P]*$/, + /^[0-9a-qA-Q]*$/, + /^[0-9a-rA-R]*$/, + /^[0-9a-sA-S]*$/, + /^[0-9a-tA-T]*$/, + /^[0-9a-uA-U]*$/, + /^[0-9a-vA-V]*$/, + /^[0-9a-wA-W]*$/, + /^[0-9a-xA-X]*$/, + /^[0-9a-yA-Y]*$/, + /^[0-9a-zA-Z]*$/ +]; + +/* + Function: parse + Parse a string into a . + + *base* is optional but, if provided, must be from 2 to 36 inclusive. If + *base* is not provided, it will be guessed based on the leading characters + of *s* as follows: + + - "0x" or "0X": *base* = 16 + - "0c" or "0C": *base* = 8 + - "0b" or "0B": *base* = 2 + - else: *base* = 10 + + If no base is provided, or *base* is 10, the number can be in exponential + form. For example, these are all valid: + + > BigInteger.parse("1e9"); // Same as "1000000000" + > BigInteger.parse("1.234*10^3"); // Same as 1234 + > BigInteger.parse("56789 * 10 ** -2"); // Same as 567 + + If any characters fall outside the range defined by the radix, an exception + will be thrown. + + Parameters: + + s - The string to parse. + base - Optional radix (default is to guess based on *s*). + + Returns: + + a instance. +*/ +BigInteger.parse = function(s, base) { + // Expands a number in exponential form to decimal form. + // expandExponential("-13.441*10^5") === "1344100"; + // expandExponential("1.12300e-1") === "0.112300"; + // expandExponential(1000000000000000000000000000000) === "1000000000000000000000000000000"; + function expandExponential(str) { + str = str.replace(/\s*[*xX]\s*10\s*(\^|\*\*)\s*/, "e"); + + return str.replace(/^([+\-])?(\d+)\.?(\d*)[eE]([+\-]?\d+)$/, function(x, s, n, f, c) { + c = +c; + var l = c < 0; + var i = n.length + c; + x = (l ? n : f).length; + c = ((c = Math.abs(c)) >= x ? c - x + l : 0); + var z = (new Array(c + 1)).join("0"); + var r = n + f; + return (s || "") + (l ? r = z + r : r += z).substr(0, i += l ? z.length : 0) + (i < r.length ? "." + r.substr(i) : ""); + }); + } + + s = s.toString(); + if (typeof base === "undefined" || +base === 10) { + s = expandExponential(s); + } + + var parts = /^([+\-]?)(0[xXcCbB])?([0-9A-Za-z]*)(?:\.\d*)?$/.exec(s); + if (parts) { + var sign = parts[1] || "+"; + var baseSection = parts[2] || ""; + var digits = parts[3] || ""; + + if (typeof base === "undefined") { + // Guess base + if (baseSection === "0x" || baseSection === "0X") { // Hex + base = 16; + } + else if (baseSection === "0c" || baseSection === "0C") { // Octal + base = 8; + } + else if (baseSection === "0b" || baseSection === "0B") { // Binary + base = 2; + } + else { + base = 10; + } + } + else if (base < 2 || base > 36) { + throw new Error("Illegal radix " + base + "."); + } + + base = +base; + + // Check for digits outside the range + if (!(BigInteger.radixRegex[base].test(digits))) { + throw new Error("Bad digit for radix " + base); + } + + // Strip leading zeros, and convert to array + digits = digits.replace(/^0+/, "").split(""); + if (digits.length === 0) { + return BigInteger.ZERO; + } + + // Get the sign (we know it's not zero) + sign = (sign === "-") ? -1 : 1; + + // Optimize 10 + if (base == 10) { + var d = []; + while (digits.length >= BigInteger.base_log10) { + d.push(parseInt(digits.splice(-BigInteger.base_log10).join(''), 10)); + } + d.push(parseInt(digits.join(''), 10)); + return new BigInteger(d, sign); + } + + // Optimize base + if (base === BigInteger.base) { + return new BigInteger(digits.map(Number).reverse(), sign); + } + + // Do the conversion + var d = BigInteger.ZERO; + base = BigInteger.small[base]; + var small = BigInteger.small; + for (var i = 0; i < digits.length; i++) { + d = d.multiply(base).add(small[parseInt(digits[i], 36)]); + } + return new BigInteger(d._d, sign); + } + else { + throw new Error("Invalid BigInteger format: " + s); + } +}; + +/* + Function: add + Add two . + + Parameters: + + n - The number to add to *this*. Will be converted to a . + + Returns: + + The numbers added together. + + See Also: + + , , , +*/ +BigInteger.prototype.add = function(n) { + if (this._s === 0) { + return BigInteger(n); + } + + n = BigInteger(n); + if (n._s === 0) { + return this; + } + if (this._s !== n._s) { + n = n.negate(); + return this.subtract(n); + } + + var a = this._d; + var b = n._d; + var al = a.length; + var bl = b.length; + var sum = new Array(Math.max(al, bl) + 1); + var size = Math.min(al, bl); + var carry = 0; + var digit; + + for (var i = 0; i < size; i++) { + digit = a[i] + b[i] + carry; + sum[i] = digit % BigInteger.base; + carry = (digit / BigInteger.base) | 0; + } + if (bl > al) { + a = b; + al = bl; + } + for (i = size; carry && i < al; i++) { + digit = a[i] + carry; + sum[i] = digit % BigInteger.base; + carry = (digit / BigInteger.base) | 0; + } + if (carry) { + sum[i] = carry; + } + + for ( ; i < al; i++) { + sum[i] = a[i]; + } + + return new BigInteger(sum, this._s); +}; + +/* + Function: negate + Get the additive inverse of a . + + Returns: + + A with the same magnatude, but with the opposite sign. + + See Also: + + +*/ +BigInteger.prototype.negate = function() { + return new BigInteger(this._d, -this._s); +}; + +/* + Function: abs + Get the absolute value of a . + + Returns: + + A with the same magnatude, but always positive (or zero). + + See Also: + + +*/ +BigInteger.prototype.abs = function() { + return (this._s < 0) ? this.negate() : this; +}; + +/* + Function: subtract + Subtract two . + + Parameters: + + n - The number to subtract from *this*. Will be converted to a . + + Returns: + + The *n* subtracted from *this*. + + See Also: + + , , , +*/ +BigInteger.prototype.subtract = function(n) { + if (this._s === 0) { + return BigInteger(n).negate(); + } + + n = BigInteger(n); + if (n._s === 0) { + return this; + } + if (this._s !== n._s) { + n = n.negate(); + return this.add(n); + } + + var m = this; + var t; + // negative - negative => -|a| - -|b| => -|a| + |b| => |b| - |a| + if (this._s < 0) { + t = m; + m = new BigInteger(n._d, 1); + n = new BigInteger(t._d, 1); + } + + // Both are positive => a - b + var sign = m.compareAbs(n); + if (sign === 0) { + return BigInteger.ZERO; + } + else if (sign < 0) { + // swap m and n + t = n; + n = m; + m = t; + } + + // a > b + var a = m._d; + var b = n._d; + var al = a.length; + var bl = b.length; + var diff = new Array(al); // al >= bl since a > b + var borrow = 0; + var i; + var digit; + + for (i = 0; i < bl; i++) { + digit = a[i] - borrow - b[i]; + if (digit < 0) { + digit += BigInteger.base; + borrow = 1; + } + else { + borrow = 0; + } + diff[i] = digit; + } + for (i = bl; i < al; i++) { + digit = a[i] - borrow; + if (digit < 0) { + digit += BigInteger.base; + } + else { + diff[i++] = digit; + break; + } + diff[i] = digit; + } + for ( ; i < al; i++) { + diff[i] = a[i]; + } + + return new BigInteger(diff, sign); +}; + +(function() { + function addOne(n, sign) { + var a = n._d; + var sum = a.slice(); + var carry = true; + var i = 0; + + while (true) { + var digit = (a[i] || 0) + 1; + sum[i] = digit % BigInteger.base; + if (digit <= BigInteger.base - 1) { + break; + } + ++i; + } + + return new BigInteger(sum, sign); + } + + function subtractOne(n, sign) { + var a = n._d; + var sum = a.slice(); + var borrow = true; + var i = 0; + + while (true) { + var digit = (a[i] || 0) - 1; + if (digit < 0) { + sum[i] = digit + BigInteger.base; + } + else { + sum[i] = digit; + break; + } + ++i; + } + + return new BigInteger(sum, sign); + } + + /* + Function: next + Get the next (add one). + + Returns: + + *this* + 1. + + See Also: + + , + */ + BigInteger.prototype.next = function() { + switch (this._s) { + case 0: + return BigInteger.ONE; + case -1: + return subtractOne(this, -1); + // case 1: + default: + return addOne(this, 1); + } + }; + + /* + Function: prev + Get the previous (subtract one). + + Returns: + + *this* - 1. + + See Also: + + , + */ + BigInteger.prototype.prev = function() { + switch (this._s) { + case 0: + return BigInteger.M_ONE; + case -1: + return addOne(this, -1); + // case 1: + default: + return subtractOne(this, 1); + } + }; +})(); + +/* + Function: compareAbs + Compare the absolute value of two . + + Calling is faster than calling twice, then . + + Parameters: + + n - The number to compare to *this*. Will be converted to a . + + Returns: + + -1, 0, or +1 if *|this|* is less than, equal to, or greater than *|n|*. + + See Also: + + , +*/ +BigInteger.prototype.compareAbs = function(n) { + if (this === n) { + return 0; + } + + if (!(n instanceof BigInteger)) { + if (!isFinite(n)) { + return(isNaN(n) ? n : -1); + } + n = BigInteger(n); + } + + if (this._s === 0) { + return (n._s !== 0) ? -1 : 0; + } + if (n._s === 0) { + return 1; + } + + var l = this._d.length; + var nl = n._d.length; + if (l < nl) { + return -1; + } + else if (l > nl) { + return 1; + } + + var a = this._d; + var b = n._d; + for (var i = l-1; i >= 0; i--) { + if (a[i] !== b[i]) { + return a[i] < b[i] ? -1 : 1; + } + } + + return 0; +}; + +/* + Function: compare + Compare two . + + Parameters: + + n - The number to compare to *this*. Will be converted to a . + + Returns: + + -1, 0, or +1 if *this* is less than, equal to, or greater than *n*. + + See Also: + + , , , +*/ +BigInteger.prototype.compare = function(n) { + if (this === n) { + return 0; + } + + n = BigInteger(n); + + if (this._s === 0) { + return -n._s; + } + + if (this._s === n._s) { // both positive or both negative + var cmp = this.compareAbs(n); + return cmp * this._s; + } + else { + return this._s; + } +}; + +/* + Function: isUnit + Return true iff *this* is either 1 or -1. + + Returns: + + true if *this* compares equal to or . + + See Also: + + , , , , , + , +*/ +BigInteger.prototype.isUnit = function() { + return this === BigInteger.ONE || + this === BigInteger.M_ONE || + (this._d.length === 1 && this._d[0] === 1); +}; + +/* + Function: multiply + Multiply two . + + Parameters: + + n - The number to multiply *this* by. Will be converted to a + . + + Returns: + + The numbers multiplied together. + + See Also: + + , , , +*/ +BigInteger.prototype.multiply = function(n) { + // TODO: Consider adding Karatsuba multiplication for large numbers + if (this._s === 0) { + return BigInteger.ZERO; + } + + n = BigInteger(n); + if (n._s === 0) { + return BigInteger.ZERO; + } + if (this.isUnit()) { + if (this._s < 0) { + return n.negate(); + } + return n; + } + if (n.isUnit()) { + if (n._s < 0) { + return this.negate(); + } + return this; + } + if (this === n) { + return this.square(); + } + + var r = (this._d.length >= n._d.length); + var a = (r ? this : n)._d; // a will be longer than b + var b = (r ? n : this)._d; + var al = a.length; + var bl = b.length; + + var pl = al + bl; + var partial = new Array(pl); + var i; + for (i = 0; i < pl; i++) { + partial[i] = 0; + } + + for (i = 0; i < bl; i++) { + var carry = 0; + var bi = b[i]; + var jlimit = al + i; + var digit; + for (var j = i; j < jlimit; j++) { + digit = partial[j] + bi * a[j - i] + carry; + carry = (digit / BigInteger.base) | 0; + partial[j] = (digit % BigInteger.base) | 0; + } + if (carry) { + digit = partial[j] + carry; + carry = (digit / BigInteger.base) | 0; + partial[j] = digit % BigInteger.base; + } + } + return new BigInteger(partial, this._s * n._s); +}; + +// Multiply a BigInteger by a single-digit native number +// Assumes that this and n are >= 0 +// This is not really intended to be used outside the library itself +BigInteger.prototype.multiplySingleDigit = function(n) { + if (n === 0 || this._s === 0) { + return BigInteger.ZERO; + } + if (n === 1) { + return this; + } + + var digit; + if (this._d.length === 1) { + digit = this._d[0] * n; + if (digit >= BigInteger.base) { + return new BigInteger([(digit % BigInteger.base)|0, + (digit / BigInteger.base)|0], 1); + } + return new BigInteger([digit], 1); + } + + if (n === 2) { + return this.add(this); + } + if (this.isUnit()) { + return new BigInteger([n], 1); + } + + var a = this._d; + var al = a.length; + + var pl = al + 1; + var partial = new Array(pl); + for (var i = 0; i < pl; i++) { + partial[i] = 0; + } + + var carry = 0; + for (var j = 0; j < al; j++) { + digit = n * a[j] + carry; + carry = (digit / BigInteger.base) | 0; + partial[j] = (digit % BigInteger.base) | 0; + } + if (carry) { + digit = carry; + carry = (digit / BigInteger.base) | 0; + partial[j] = digit % BigInteger.base; + } + + return new BigInteger(partial, 1); +}; + +/* + Function: square + Multiply a by itself. + + This is slightly faster than regular multiplication, since it removes the + duplicated multiplcations. + + Returns: + + > this.multiply(this) + + See Also: + +*/ +BigInteger.prototype.square = function() { + // Normally, squaring a 10-digit number would take 100 multiplications. + // Of these 10 are unique diagonals, of the remaining 90 (100-10), 45 are repeated. + // This procedure saves (N*(N-1))/2 multiplications, (e.g., 45 of 100 multiplies). + // Based on code by Gary Darby, Intellitech Systems Inc., www.DelphiForFun.org + + if (this._s === 0) { + return BigInteger.ZERO; + } + if (this.isUnit()) { + return BigInteger.ONE; + } + + var digits = this._d; + var length = digits.length; + var imult1 = new Array(length + length + 1); + var product, carry, k; + var i; + + // Calculate diagonal + for (i = 0; i < length; i++) { + k = i * 2; + product = digits[i] * digits[i]; + carry = (product / BigInteger.base) | 0; + imult1[k] = product % BigInteger.base; + imult1[k + 1] = carry; + } + + // Calculate repeating part + for (i = 0; i < length; i++) { + carry = 0; + k = i * 2 + 1; + for (var j = i + 1; j < length; j++, k++) { + product = digits[j] * digits[i] * 2 + imult1[k] + carry; + carry = (product / BigInteger.base) | 0; + imult1[k] = product % BigInteger.base; + } + k = length + i; + var digit = carry + imult1[k]; + carry = (digit / BigInteger.base) | 0; + imult1[k] = digit % BigInteger.base; + imult1[k + 1] += carry; + } + + return new BigInteger(imult1, 1); +}; + +/* + Function: quotient + Divide two and truncate towards zero. + + throws an exception if *n* is zero. + + Parameters: + + n - The number to divide *this* by. Will be converted to a . + + Returns: + + The *this* / *n*, truncated to an integer. + + See Also: + + , , , , +*/ +BigInteger.prototype.quotient = function(n) { + return this.divRem(n)[0]; +}; + +/* + Function: divide + Deprecated synonym for . +*/ +BigInteger.prototype.divide = BigInteger.prototype.quotient; + +/* + Function: remainder + Calculate the remainder of two . + + throws an exception if *n* is zero. + + Parameters: + + n - The remainder after *this* is divided *this* by *n*. Will be + converted to a . + + Returns: + + *this* % *n*. + + See Also: + + , +*/ +BigInteger.prototype.remainder = function(n) { + return this.divRem(n)[1]; +}; + +/* + Function: divRem + Calculate the integer quotient and remainder of two . + + throws an exception if *n* is zero. + + Parameters: + + n - The number to divide *this* by. Will be converted to a . + + Returns: + + A two-element array containing the quotient and the remainder. + + > a.divRem(b) + + is exactly equivalent to + + > [a.quotient(b), a.remainder(b)] + + except it is faster, because they are calculated at the same time. + + See Also: + + , +*/ +BigInteger.prototype.divRem = function(n) { + n = BigInteger(n); + if (n._s === 0) { + throw new Error("Divide by zero"); + } + if (this._s === 0) { + return [BigInteger.ZERO, BigInteger.ZERO]; + } + if (n._d.length === 1) { + return this.divRemSmall(n._s * n._d[0]); + } + + // Test for easy cases -- |n1| <= |n2| + switch (this.compareAbs(n)) { + case 0: // n1 == n2 + return [this._s === n._s ? BigInteger.ONE : BigInteger.M_ONE, BigInteger.ZERO]; + case -1: // |n1| < |n2| + return [BigInteger.ZERO, this]; + } + + var sign = this._s * n._s; + var a = n.abs(); + var b_digits = this._d.slice(); + var digits = n._d.length; + var max = b_digits.length; + var quot = []; + var guess; + + var part = new BigInteger([], 1); + part._s = 1; + + while (b_digits.length) { + part._d.unshift(b_digits.pop()); + part = new BigInteger(part._d, 1); + + if (part.compareAbs(n) < 0) { + quot.push(0); + continue; + } + if (part._s === 0) { + guess = 0; + } + else { + var xlen = part._d.length, ylen = a._d.length; + var highx = part._d[xlen-1]*BigInteger.base + part._d[xlen-2]; + var highy = a._d[ylen-1]*BigInteger.base + a._d[ylen-2]; + if (part._d.length > a._d.length) { + // The length of part._d can either match a._d length, + // or exceed it by one. + highx = (highx+1)*BigInteger.base; + } + guess = Math.ceil(highx/highy); + } + do { + var check = a.multiplySingleDigit(guess); + if (check.compareAbs(part) <= 0) { + break; + } + guess--; + } while (guess); + + quot.push(guess); + if (!guess) { + continue; + } + var diff = part.subtract(check); + part._d = diff._d.slice(); + } + + return [new BigInteger(quot.reverse(), sign), + new BigInteger(part._d, this._s)]; +}; + +// Throws an exception if n is outside of (-BigInteger.base, -1] or +// [1, BigInteger.base). It's not necessary to call this, since the +// other division functions will call it if they are able to. +BigInteger.prototype.divRemSmall = function(n) { + var r; + n = +n; + if (n === 0) { + throw new Error("Divide by zero"); + } + + var n_s = n < 0 ? -1 : 1; + var sign = this._s * n_s; + n = Math.abs(n); + + if (n < 1 || n >= BigInteger.base) { + throw new Error("Argument out of range"); + } + + if (this._s === 0) { + return [BigInteger.ZERO, BigInteger.ZERO]; + } + + if (n === 1 || n === -1) { + return [(sign === 1) ? this.abs() : new BigInteger(this._d, sign), BigInteger.ZERO]; + } + + // 2 <= n < BigInteger.base + + // divide a single digit by a single digit + if (this._d.length === 1) { + var q = new BigInteger([(this._d[0] / n) | 0], 1); + r = new BigInteger([(this._d[0] % n) | 0], 1); + if (sign < 0) { + q = q.negate(); + } + if (this._s < 0) { + r = r.negate(); + } + return [q, r]; + } + + var digits = this._d.slice(); + var quot = new Array(digits.length); + var part = 0; + var diff = 0; + var i = 0; + var guess; + + while (digits.length) { + part = part * BigInteger.base + digits[digits.length - 1]; + if (part < n) { + quot[i++] = 0; + digits.pop(); + diff = BigInteger.base * diff + part; + continue; + } + if (part === 0) { + guess = 0; + } + else { + guess = (part / n) | 0; + } + + var check = n * guess; + diff = part - check; + quot[i++] = guess; + if (!guess) { + digits.pop(); + continue; + } + + digits.pop(); + part = diff; + } + + r = new BigInteger([diff], 1); + if (this._s < 0) { + r = r.negate(); + } + return [new BigInteger(quot.reverse(), sign), r]; +}; + +/* + Function: isEven + Return true iff *this* is divisible by two. + + Note that is even. + + Returns: + + true if *this* is even, false otherwise. + + See Also: + + +*/ +BigInteger.prototype.isEven = function() { + var digits = this._d; + return this._s === 0 || digits.length === 0 || (digits[0] % 2) === 0; +}; + +/* + Function: isOdd + Return true iff *this* is not divisible by two. + + Returns: + + true if *this* is odd, false otherwise. + + See Also: + + +*/ +BigInteger.prototype.isOdd = function() { + return !this.isEven(); +}; + +/* + Function: sign + Get the sign of a . + + Returns: + + * -1 if *this* < 0 + * 0 if *this* == 0 + * +1 if *this* > 0 + + See Also: + + , , , , +*/ +BigInteger.prototype.sign = function() { + return this._s; +}; + +/* + Function: isPositive + Return true iff *this* > 0. + + Returns: + + true if *this*.compare() == 1. + + See Also: + + , , , , , +*/ +BigInteger.prototype.isPositive = function() { + return this._s > 0; +}; + +/* + Function: isNegative + Return true iff *this* < 0. + + Returns: + + true if *this*.compare() == -1. + + See Also: + + , , , , , +*/ +BigInteger.prototype.isNegative = function() { + return this._s < 0; +}; + +/* + Function: isZero + Return true iff *this* == 0. + + Returns: + + true if *this*.compare() == 0. + + See Also: + + , , , , +*/ +BigInteger.prototype.isZero = function() { + return this._s === 0; +}; + +/* + Function: exp10 + Multiply a by a power of 10. + + This is equivalent to, but faster than + + > if (n >= 0) { + > return this.multiply(BigInteger("1e" + n)); + > } + > else { // n <= 0 + > return this.quotient(BigInteger("1e" + -n)); + > } + + Parameters: + + n - The power of 10 to multiply *this* by. *n* is converted to a + javascipt number and must be no greater than + (0x7FFFFFFF), or an exception will be thrown. + + Returns: + + *this* * (10 ** *n*), truncated to an integer if necessary. + + See Also: + + , +*/ +BigInteger.prototype.exp10 = function(n) { + n = +n; + if (n === 0) { + return this; + } + if (Math.abs(n) > Number(BigInteger.MAX_EXP)) { + throw new Error("exponent too large in BigInteger.exp10"); + } + if (n > 0) { + var k = new BigInteger(this._d.slice(), this._s); + + for (; n >= BigInteger.base_log10; n -= BigInteger.base_log10) { + k._d.unshift(0); + } + if (n == 0) + return k; + k._s = 1; + k = k.multiplySingleDigit(Math.pow(10, n)); + return (this._s < 0 ? k.negate() : k); + } else if (-n >= this._d.length*BigInteger.base_log10) { + return BigInteger.ZERO; + } else { + var k = new BigInteger(this._d.slice(), this._s); + + for (n = -n; n >= BigInteger.base_log10; n -= BigInteger.base_log10) { + k._d.shift(); + } + return (n == 0) ? k : k.divRemSmall(Math.pow(10, n))[0]; + } +}; + +/* + Function: pow + Raise a to a power. + + In this implementation, 0**0 is 1. + + Parameters: + + n - The exponent to raise *this* by. *n* must be no greater than + (0x7FFFFFFF), or an exception will be thrown. + + Returns: + + *this* raised to the *nth* power. + + See Also: + + +*/ +BigInteger.prototype.pow = function(n) { + if (this.isUnit()) { + if (this._s > 0) { + return this; + } + else { + return BigInteger(n).isOdd() ? this : this.negate(); + } + } + + n = BigInteger(n); + if (n._s === 0) { + return BigInteger.ONE; + } + else if (n._s < 0) { + if (this._s === 0) { + throw new Error("Divide by zero"); + } + else { + return BigInteger.ZERO; + } + } + if (this._s === 0) { + return BigInteger.ZERO; + } + if (n.isUnit()) { + return this; + } + + if (n.compareAbs(BigInteger.MAX_EXP) > 0) { + throw new Error("exponent too large in BigInteger.pow"); + } + var x = this; + var aux = BigInteger.ONE; + var two = BigInteger.small[2]; + + while (n.isPositive()) { + if (n.isOdd()) { + aux = aux.multiply(x); + if (n.isUnit()) { + return aux; + } + } + x = x.square(); + n = n.quotient(two); + } + + return aux; +}; + +/* + Function: modPow + Raise a to a power (mod m). + + Because it is reduced by a modulus, is not limited by + like . + + Parameters: + + exponent - The exponent to raise *this* by. Must be positive. + modulus - The modulus. + + Returns: + + *this* ^ *exponent* (mod *modulus*). + + See Also: + + , +*/ +BigInteger.prototype.modPow = function(exponent, modulus) { + var result = BigInteger.ONE; + var base = this; + + while (exponent.isPositive()) { + if (exponent.isOdd()) { + result = result.multiply(base).remainder(modulus); + } + + exponent = exponent.quotient(BigInteger.small[2]); + if (exponent.isPositive()) { + base = base.square().remainder(modulus); + } + } + + return result; +}; + +/* + Function: log + Get the natural logarithm of a as a native JavaScript number. + + This is equivalent to + + > Math.log(this.toJSValue()) + + but handles values outside of the native number range. + + Returns: + + log( *this* ) + + See Also: + + +*/ +BigInteger.prototype.log = function() { + switch (this._s) { + case 0: return -Infinity; + case -1: return NaN; + default: // Fall through. + } + + var l = this._d.length; + + if (l*BigInteger.base_log10 < 30) { + return Math.log(this.valueOf()); + } + + var N = Math.ceil(30/BigInteger.base_log10); + var firstNdigits = this._d.slice(l - N); + return Math.log((new BigInteger(firstNdigits, 1)).valueOf()) + (l - N) * Math.log(BigInteger.base); +}; + +/* + Function: valueOf + Convert a to a native JavaScript integer. + + This is called automatically by JavaScipt to convert a to a + native value. + + Returns: + + > parseInt(this.toString(), 10) + + See Also: + + , +*/ +BigInteger.prototype.valueOf = function() { + return parseInt(this.toString(), 10); +}; + +/* + Function: toJSValue + Convert a to a native JavaScript integer. + + This is the same as valueOf, but more explicitly named. + + Returns: + + > parseInt(this.toString(), 10) + + See Also: + + , +*/ +BigInteger.prototype.toJSValue = function() { + return parseInt(this.toString(), 10); +}; + +// Constant: MAX_EXP +// The largest exponent allowed in and (0x7FFFFFFF or 2147483647). +BigInteger.MAX_EXP = BigInteger(0x7FFFFFFF); + +(function() { + function makeUnary(fn) { + return function(a) { + return fn.call(BigInteger(a)); + }; + } + + function makeBinary(fn) { + return function(a, b) { + return fn.call(BigInteger(a), BigInteger(b)); + }; + } + + function makeTrinary(fn) { + return function(a, b, c) { + return fn.call(BigInteger(a), BigInteger(b), BigInteger(c)); + }; + } + + (function() { + var i, fn; + var unary = "toJSValue,isEven,isOdd,sign,isZero,isNegative,abs,isUnit,square,negate,isPositive,toString,next,prev,log".split(","); + var binary = "compare,remainder,divRem,subtract,add,quotient,divide,multiply,pow,compareAbs".split(","); + var trinary = ["modPow"]; + + for (i = 0; i < unary.length; i++) { + fn = unary[i]; + BigInteger[fn] = makeUnary(BigInteger.prototype[fn]); + } + + for (i = 0; i < binary.length; i++) { + fn = binary[i]; + BigInteger[fn] = makeBinary(BigInteger.prototype[fn]); + } + + for (i = 0; i < trinary.length; i++) { + fn = trinary[i]; + BigInteger[fn] = makeTrinary(BigInteger.prototype[fn]); + } + + BigInteger.exp10 = function(x, n) { + return BigInteger(x).exp10(n); + }; + })(); +})(); + +if (typeof exports !== 'undefined') { + exports.BigInteger = BigInteger; +} diff --git a/elements/pl-snap/Snap/libraries/bignumbers.xml b/elements/pl-snap/Snap/libraries/bignumbers.xml new file mode 100644 index 00000000..576a7bd5 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/bignumbers.xml @@ -0,0 +1 @@ +call with True to turn on the entire Scheme numeric tower, including infinite-precision integers, exact rationals, and complex numbers; call with False to restore native JavaScript arithmetic.
pt:altera utilização de aritmética do Scheme para _ ca:sistema numèric d'Scheme _
The factorial function, to make very large numbers, to demo bignums.
The identity function: reports its input. It's useful to get things like 3/4 or 5-2i into numeric input slots.
Provides Scheme arithmetic functions not in JavaScript
pt:_ de _ ca:Scheme _ de _ number? complex? real? rational? integer? exact? inexact? exact inexact finite? infinite? nan? numerator denominator real-part imag-part magnitude angle
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/bignums.js b/elements/pl-snap/Snap/libraries/bignums.js new file mode 100644 index 00000000..e5d34f09 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/bignums.js @@ -0,0 +1,364 @@ +makeGlobalObject(); + +SnapExtensions.primitives.set( + 'big_switch(bool)', + loadBlocks +); + +SnapExtensions.primitives.set( + 'big_scheme(fn, num)', + function (which, num) { + function parseNumber (n) { + var fn = SchemeNumber.fn; + if (!fn['number?'](n)) { + n = '' + n; + try { + return parseENotation(n) || SchemeNumber(n); + } catch (err) { + return NaN; + } + } + return n; + } + + function parseENotation (n) { + var fn = SchemeNumber.fn; + + var numbers = n.match(/^(-?\d+\.?\d*|-?\.\d+)e(-?\d+)$/i); + if (!numbers) return null; + + var coefficient = numbers[1]; + var exponent = numbers[2]; + return fn['*']( + coefficient, + fn.expt('10', exponent) + ); + } + var fn=SchemeNumber.fn, + number=parseNumber(num); + + switch (which) { + case 'number?': + case 'complex?': + return (fn['number?'](number)); + case 'real?': + return (fn['real?'](number) || fn['real-valued?'](number)); + case 'rational?': + return (fn['rational?'](number) || (fn['='](number, fn.rationalize(number, parseNumber('1.0e-5'))))); + case 'integer?': + return (fn['integer?'](number) || fn['integer-valued?'](number)); + case 'exact?': + case 'inexact?': + case 'finite?': + case 'infinite?': + case 'nan?': + case 'real-part': + case 'imag-part': + return (fn[which](number)); + case 'magnitude': + return (fn.magnitude(number)); + case 'angle': + return (fn.angle(number)); + case 'numerator': + return (fn.numerator(number)); + case 'denominator': + return (fn.denominator(number)); + case 'exact': + return (fn.exact(number)); + case 'inexact': + return (fn.inexact(number)); + } + } +); + +function makeGlobalObject () { + window.bigNumbers = { + originalEvaluate: InputSlotMorph.prototype.evaluate, + originalChangeVar: VariableFrame.prototype.changeVar, + originalPrims: { + reportBasicSum: Process.prototype.reportBasicSum, + reportBasicDifference: Process.prototype.reportBasicDifference, + reportBasicProduct: Process.prototype.reportBasicProduct, + reportBasicQuotient: Process.prototype.reportBasicQuotient, + reportBasicPower: Process.prototype.reportBasicPower, + reportBasicModulus: Process.prototype.reportBasicModulus, + reportBasicAtan2: Process.prototype.reportBasicAtan2, + reportBasicRound: Process.prototype.reportBasicRound, + reportBasicMin: Process.prototype.reportBasicMin, + reportBasicMax: Process.prototype.reportBasicMax, + reportBasicRandom: Process.prototype.reportBasicRandom, + reportBasicLessThan: Process.prototype.reportBasicLessThan, + reportBasicGreaterThan: Process.prototype.reportBasicGreaterThan, + reportEquals: Process.prototype.reportEquals, + reportIsIdentical: Process.prototype.reportIsIdentical, + reportBasicMonadic: Process.prototype.reportBasicMonadic + } + }; +} + +function loadBlocks (useBigNums) { + var fn = SchemeNumber.fn; + var originalPrims = window.bigNumbers.originalPrims; + if (useBigNums) { + InputSlotMorph.prototype.evaluate = function () { + var contents = this.contents(); + + if (this.selectedBlock) { + return this.selectedBlock; + } + + if (this.constant) { + return this.constant; + } + if (this.isNumeric) { + return parseNumber(contents.text || '0'); + } + return contents.text; + }; + VariableFrame.prototype.changeVar = function (name, delta, sender) { + var frame = this.find(name), + value, + newValue; + if (frame) { + value = parseNumber(frame.vars[name].value); + newValue = Number.isNaN(value) ? delta : fn['+'](value, parseNumber(delta)); + if (sender instanceof SpriteMorph && + (frame.owner instanceof SpriteMorph) && + (sender !== frame.owner)) { + sender.shadowVar(name, newValue); + } else { + frame.vars[name].value = newValue; + } + + } + }; + Object.assign(Process.prototype, { + reportBasicSum: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (Number.isNaN(a) || Number.isNaN(b)) return NaN; + return fn['+'](a, b); + }, + reportBasicDifference: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (Number.isNaN(a) || Number.isNaN(b)) return NaN; + return fn['-'](a, b); + }, + reportBasicProduct: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (Number.isNaN(a) || Number.isNaN(b)) return NaN; + return fn['*'](a, b); + }, + reportBasicQuotient: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (fn['='](b, '0') && !fn['='](a, '0')) { + return (fn['<'](a, '0') ? SchemeNumber('-inf.0') : SchemeNumber('+inf.0')) + }; + if (Number.isNaN(a) || Number.isNaN(b) || fn['='](b, '0')) return NaN; + return fn['/'](a, b); + }, + reportBasicPower: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (Number.isNaN(a) || Number.isNaN(b)) return NaN; + return fn['expt'](a, b); + }, + reportBasicModulus: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (Number.isNaN(a) || Number.isNaN(b)) return NaN; + var result = fn.mod(a, b); + if (fn['<'](b, '0') && fn['>'](result, '0')) { + result = fn['+'](result, b); + } + return result; + }, + reportBasicAtan2: function (a, b) { + a = parseNumber(a); + b = parseNumber(b); + if (Number.isNaN(a) || Number.isNaN(b)) return NaN; + return degrees(fn.atan2(a, b)); + }, + reportBasicRound: function (n) { + n = parseNumber(n); + if (Number.isNaN(n)) return NaN; + x = fn.round(n); + if (fn["integer?"](x)) return fn["exact"](x); + return x; + }, + reportBasicMin: function (a, b) { + x = parseNumber(a); + y = parseNumber(b); + if (Number.isNaN(x) || Number.isNaN(y)) { + return ab ? a : b; + } + return fn['>'](x, y) ? x : y; + }, + reportBasicRandom: function (min, max) { + var floor = parseNumber(min), + ceil = parseNumber(max); + if (Number.isNaN(floor) || Number.isNaN(ceil)) return NaN; + if (!fn['='](fn.mod(floor, '1'), '0') || !fn['='](fn.mod(ceil, '1'), '0')) { + // One of the numbers isn't whole. Include the decimal. + return fn['+']( + fn['*']( + Math.random(), + fn['-'](ceil, floor) + ), + floor + ); + } + var size = Math.ceil(max.toString(10).length/14); + const array = new Uint32Array(size); + window.crypto.getRandomValues(array); + var digits=""; + for (i=0;ib; + return fn['>'](x, y); + }, + reportEquals: function (a, b) { + x = parseNumber(a); + y = parseNumber(b); + if (Number.isNaN(x) || Number.isNaN(y)) return snapEquals(a, b); + return fn['='](x, y); + }, + reportIsIdentical: function (a, b) { + x = parseNumber(a); + y = parseNumber(b); + if (Number.isNaN(x) || Number.isNaN(y)) return originalPrims.reportIsIdentical.call(this, a, b); + return fn['='](x, y); + }, + reportBasicMonadic: function (fname, n) { + n = parseNumber(n); + if (Number.isNaN(n)) return NaN; + + switch (Process.prototype.inputOption(fname)) { + case 'abs': + return fn.abs(n); + case 'neg': + return fn['-'](n); + case 'sign': + if (fn['='](n,SchemeNumber('0'))) return SchemeNumber('0'); + return fn['/'](n, fn.abs(n)); + case 'ceiling': + return fn.ceiling(n); + case 'floor': + return fn.floor(n); + case 'sqrt': + return sqrt(n); + case 'sin': + return fn.sin(radians(n)); + case 'cos': + return fn.cos(radians(n)); + case 'tan': + return fn.tan(radians(n)); + case 'asin': + return degrees(fn.asin(n)); + case 'acos': + return degrees(fn.acos(n)); + case 'atan': + return degrees(fn.atan(n)); + case 'ln': + return fn.log(n); + case 'log': + return fn.log(n, '10'); + case 'lg': + return fn.log(n, '2'); + case 'e^': + return fn.exp(n); + case '10^': + return fn.expt('10', n); + case '2^': + return fn.expt('2', n); + case 'id': + return n; + default: + return SchemeNumber('0'); + } + } + }); + } else { + InputSlotMorph.prototype.evaluate = window.bigNumbers.originalEvaluate; + VariableFrame.prototype.changeVar = window.bigNumbers.originalChangeVar; + Object.assign(Process.prototype, originalPrims); + } + // +++ done = true; +} + +function parseNumber (n) { + var fn = SchemeNumber.fn; + if (!fn['number?'](n)) { + n = '' + n; + try { + return parseENotation(n) || SchemeNumber(n); + } catch (err) { + return NaN; + } + } + return n; +} + +function parseENotation (n) { + var fn = SchemeNumber.fn; + + var numbers = n.match(/^(-?\d+\.?\d*|-?\.\d+)e(-?\d+)$/i); + if (!numbers) return null; + + var coefficient = numbers[1]; + var exponent = numbers[2]; + return fn['*']( + coefficient, + fn.expt('10', exponent) + ); +} + +function sqrt (n) { + var fn = SchemeNumber.fn; + + if (!fn['exact?'](n) || !fn['rational?'](n) || fn['<'](n,'0')) return fn.sqrt(n); + + var rootNumerator = fn['exact-integer-sqrt'](fn.numerator(n)); + if (!fn['='](rootNumerator[1], '0')) return fn.sqrt(n); + + var rootDenominator = fn['exact-integer-sqrt'](fn.denominator(n)); + if (!fn['='](rootDenominator[1], '0')) return fn.sqrt(n); + + return fn['/'](rootNumerator[0], rootDenominator[0]); +} + diff --git a/elements/pl-snap/Snap/libraries/bitwise.xml b/elements/pl-snap/Snap/libraries/bitwise.xml new file mode 100644 index 00000000..69340a39 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/bitwise.xml @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/cases.xml b/elements/pl-snap/Snap/libraries/cases.xml new file mode 100644 index 00000000..e981df2c --- /dev/null +++ b/elements/pl-snap/Snap/libraries/cases.xml @@ -0,0 +1 @@ +Multi-branched conditional. If the first (Boolean) input is True, then the script in the second (C-slot) input is run, and this block stops. Additional tests can be added by putting one or more ELSE IF blocks in the third (variadic) Boolean slot. Use the arrowheads to get the number of Boolean slots you need. Each ELSE IF block provides a Boolean slot for a condition to test and a script slot for what to do if the condition is True. You can put an ELSE block in the last Boolean input to CASES for a script to run if all the tests turn out False. As soon as a condition is True, no further tests are done and no further scripts are run.
pt:se _ , então _ _ ca:casos: si _ llavors _ _
pt:captura _ _ ca:agafa _ _ cont
pt:lança _ ca:llança _ catchtag
For use with the CASES block. See its help message.
pt:senão, se _ , então _ ca:altrament si _ llavors _
For use with the CASES block. See its help message.
pt:senão, _ ca:si no _
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/colors.xml b/elements/pl-snap/Snap/libraries/colors.xml new file mode 100644 index 00000000..ff366878 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/colors.xml @@ -0,0 +1 @@ +This block allows you to set the pen's color, transparency (on a scale from 0=opaque to 100=invisible), or size (in pixels). The color can be set in many ways, including RGB values, HSV values, HSL values, fair HSV or HSL (based on a modified spectrum that gives each spectral color equal space and promotes brown to a color), color number, crayon, or X11/W3C color name. See Appendix A in the Snap! Reference Manual for details.
ca:$brush fixa el _ del llapis a _ _ color color number crayon fair hue ~1 size transparency X11/W3C name ~2 (3D color spaces)={ fair HSL={ fair hue fair saturation (HSL) fair lightness fair HSL vector } fair HSV={ fair hue fair saturation (HSV) fair value (brightness) fair HSV vector } HSL={ hue saturation (HSL) lightness HSL vector } HSV={ hue saturation (HSV) value (brightness) HSV vector } RGB (0-255)={ red green blue RGB(A) vector RGB(A) hex } }§_ext_clr_numbersNote to myself: When the user sets a fair dimension, say fair HSL, variable HSL contains the corresponding "unfair" values, and "raw HSL" contains the numbers the user actually gave. It has to be this way because in the case of HSV, there is no "HSV" variable; rather, we use the pen's actual remembered-by-Javascript color's HSV coordinates. So our HSL variable has to be analogous to that. In both cases "raw" means the numbers the user gave us.
1
HSV✐ raw HSL100HSV100
The identity function reports its input.
This block reports the pen size, color, or transparency, in all the same ways that the SET PEN block allows you to set those pen properties. (It will also report the current crayon number, if the pen color was most recently set with SET PEN TO CRAYON.) See Appendix A of the Snap! Reference Manual for details.
ca:$brush _ del llapis color color number crayon fair hue ~1 size transparency X11/W3C name ~2 (3D color spaces)={ fair HSL={ fair hue fair saturation (HSL) fair lightness fair HSL vector } fair HSV={ fair hue fair saturation (HSV) fair value (brightness) fair HSV vector } HSL={ hue saturation (HSL) lightness HSL vector } HSV={ hue saturation (HSV) value (brightness) HSV vector } RGB (0-255)={ red green blue RGB vector RGBA vector RGB(A) hex } }huesaturation (HSV)value (brightness)transparencyRGB vectorRGBA vectorredgreenblueRGB(A) hex1616HSV vectorHSL vectorsaturation (HSL)lightnesscolor numbercolorfair huenot setfair saturation (HSL)not setfair lightnessnot setfair HSL vectornot setfair saturation (HSV)2not setfair value (brightness)3not setfair HSV vectornot setcrayonX11/W3C name
Changes any pen property by the specified amount. Some color scales can't be adjusted this way unless the color was first SET using that scale. Vectors (e.g., RGB color as a list of three numbers) can be incremented by a vector as the amount. X11/W3C names can't be incremented.
ca:$brush augmenta _ del llapis en _ color number crayon fair hue ~1 size transparency ~2 (3D color spaces)={ fair HSL={ fair hue fair saturation (HSL) fair lightness fair HSL vector } fair HSV={ fair hue fair saturation (HSV) fair value (brightness) fair HSV vector } HSL={ hue saturation (HSL) lightness HSL vector } HSV={ hue saturation (HSV) value (brightness) HSV vector } RGB (0-255)={ red green blue RGB vector RGBA vector } }crayonRGB hexI don't know how to handle
pt:lança o erro _
de:fange _ _ ca:agafa _ _ es:atrapar _ _ fr:attrape _ _ pt:captura _ _ cont3
de:wirf _ ca:llança _ es:lanzar _ fr:lance _ pt:lança _ catchtag
de:ignoriere _ ca:ignora _ es:ignorar _ fr:ignore _ pt:ignora _
combines any number of colors, reporting the result of mixing them, either additively (like colored light beams) or subtractively (like paints). If the result is too bright (additive) or too dark (subtractive), try the "averaged" versions, which will make the brightness more like the brightnesses of the input colors.
ca:$brush barreja colors _ amb criteri _ additive (light) additive (averaged) subtractive (ideal) subtractive (averaged) simulated paint paint (sRGB corrected)waveformssum of weightscombined waveformweighted geometric mean of waveformssum of weightscombined waveformTback to RGBT5.47813E-05 0.000184722 0.000935514 0.003096265 0.009507714 0.017351596 0.022073595 0.016353161 0.002002407 -0.016177731 -0.033929391 -0.046158952 -0.06381706 -0.083911194 -0.091832385 -0.08258148 -0.052950086 -0.012727224 0.037413037 0.091701812 0.147964686 0.181542886 0.210684154 0.210058081 0.181312094 0.132064724 0.093723787 0.057159281 0.033469657 0.018235464 0.009298756 0.004023687 0.002068643 0.00109484 0.000454231 0.000255925-4.65552E-05 -0.000157894 -0.000806935 -0.002707449 -0.008477628 -0.016058258 -0.02200529 -0.020027434 -0.011137726 0.003784809 0.022138944 0.038965605 0.063361718 0.095981626 0.126280277 0.148575844 0.149044804 0.14239936 0.122084916 0.09544734 0.067421931 0.035691251 0.01313278 -0.002384996 -0.009409573 -0.009888983 -0.008379513 -0.005606153 -0.003444663 -0.001921041 -0.000995333 -0.000435322 -0.000224537 -0.000118838 -4.93038E-05 -2.77789E-050.00032594 0.001107914 0.005677477 0.01918448 0.060978641 0.121348231 0.184875618 0.208804428 0.197318551 0.147233899 0.091819086 0.046485543 0.022982618 0.00665036 -0.005816014 -0.012450334 -0.015524259 -0.016712927 -0.01570093 -0.013647887 -0.011317812 -0.008077223 -0.005863171 -0.003943485 -0.002490472 -0.001440876 -0.000852895 -0.000458929 -0.000248389 -0.000129773 -6.41985E-05 -2.71982E-05 -1.38913E-05 -7.35203E-06 -3.05024E-06 -1.71858E-06newsRGBRGB vector255addmax255RGB vector
This block reports a color. The color can be set in many ways, including RGB values, HSV values, HSL values, fair HSV or HSL (based on a modified spectrum that gives each spectral color equal space and promotes brown to a color), color number, crayon, or X11/W3C color name. See Appendix A in the Snap! Reference Manual for details.
ca:$brush color amb _ _ _ color color number crayon fair hue X11/W3C name ~ fair HSL=fair HSL vector fair HSV=fair HSV vector HSL=HSL vector HSV=HSV vector RGB (0-255)=RGB vector RGB hex§_ext_clr_numberscolor numbercolor300index15scale1515255fromto122crayon132X11/W3C nameRGB hexcolorRGB vectorHSV vectorHSL vectorfair HSV vectorindex-1scale1index1color100fair HSL vectorindex-1scale1index1color110050
ca:$brush _ del color _ nearest color number crayon number fair hue ~1 transparency X11/W3C name ~2 (3D color spaces)={ fair HSL={ fair hue fair saturation (HSL) fair lightness fair HSL vector } fair HSV={ fair hue fair saturation (HSV) fair value (brightness) fair HSV vector } HSL={ hue saturation (HSL) lightness HSL vector } HSV={ hue saturation (HSV) value (brightness) HSV vector } RGB (0-255)={ red green blue RGB vector RGBA vector RGB hex } }X11/W3C namenearest color numberrgbhslhsvrgbtransparencytransparencyRGB vectorRGBA vectorRGB hexredgreenbluehsvfalseHSV vectorhuesaturation (HSV)value (brightness)hsltrueHSL vectorsaturation (HSL)lightnessHSLlightnessfair lightness310030.9833.333333330.986.9444444516.944444451.96100fair lightnessfair saturation (HSL)210075.9493610075.949366.9444444516.944444451.96100fair saturation (HSL)fair HSL vectorfair lightness310030.9833.333333330.986.9444444516.944444458.823529100fair lightnessfair saturation (HSL)210075.9493610075.949366.9444444516.944444458.823529100fair saturation (HSL)fair HSL vectorfair hue11111111fair huefair saturation (HSL)fair lightnessfair HSL vectorbrownfair value (brightness)310054.5166.66666666754.516.9444444516.944444451.96100fair value (brightness)fair saturation (HSV)210086.3310086.336.9444444516.944444451.96100fair saturation (HSV)fair HSV vectorfair value (brightness)310054.5166.66666666754.516.9444444516.944444451.96100fair value (brightness)fair saturation (HSV)210086.3310086.336.9444444516.944444451.96100fair saturation (HSV)fair HSV vectorfair hue11111111fair huefair saturation (HSV)fair value (brightness)fair HSV vectorbrownfair somethingCan't get here -- please post project and screenshot to forum.
This block reports the pen color (as a color, not as a list of numbers).
ca:✐ color de llapis actual
de:fange _ _ ca:agafa _ _ es:atrapar _ _ fr:attrape _ _ pt:captura _ _ cont
de:wirf _ _ ca:llança _ _ es:lanzar _ _ fr:lance _ _ pt:lança _ _ catchtag
Sets the pen color to one of 100 preselected colors, like a box of 100 crayons. The colors have names that are meant to be evocative. They are organized in families, more or less corresponding to spectral (rainbow) colors; the input slot has a two-level menu in which you can hover over a family name to see the colors of that family, each including a crayon number and an RGB value. See Appendix A of the Snap! Reference Manual for more details.
ca:✐ fixa el llapis de color _ _ grays={ 0 black #000000=0 1 gray7 #121212=1 2 gray14 #242424=2 3 gray21 #363636=3 4 gray28 #484848=4 5 gray36 #5c5c5c=5 6 gray43 #6d6d6d=6 7 gray50 #7f7f7f=7 8 gray57 #919191=8 9 gray64 #a3a3a3=9 10 gray71 #b5b5b5=10 11 gray78 #c8c8c8=11 12 gray85 #dadada=12 13 gray92 #ececec=13 14 white #ffffff=14 } pinks={ 15 deep pink #ff1493=15 16 hot pink #ff69b4=16 17 bright pink #ff007f=17 18 raspberry #e30b5d=18 19 amaranth #e52b50=19 } reds={ 20 red #ff0000=20 21 burgundy #900020=21 22 cherry #990000=22 23 dark candy apple red #a40000=23 24 sanguine #c00000=24 25 maroon #800000=25 26 crimson #c90016=26 27 Lists #d94d11=27 28 candy apple red #ff0800=28 29 coquelicot #ff3800=29 } browns={ 30 saddle brown #8b4513=30 31 chocolate #7b3f00=31 32 kobicha #6b4423=32 33 sepia #704214=33 34 chestnut #954535=34 35 dark brown #654321=35 36 brown #964b00=36 37 golden brown #996515=37 38 cinnamon #b87333=38 39 copper #d2691e=39 } oranges={ 40 orange #ff7f00=40 41 Pantone orange #ff5800=41 42 pumpkin #ff7518=42 43 Variables #f3761d=43 44 Spanish orange #e86100=44 45 burnt orange #cc5500=45 46 sinopia #cb410b=46 47 ochre #cc7722=47 48 carrot #ed9121=48 49 tangerine #f28500=49 } yellows={ 50 yellow #ffff00=50 51 Control #e6a822=51 52 dark goldenrod #b8860b=52 53 goldenrod #daa520=53 54 saffron #f4c430=54 55 sandstorm #ecd540=55 56 mustard #ffdb58=56 57 gold #ffd700=57 58 egg yolk #fee33e=58 59 rubber duck #fbe108=59 } greens={ 60 lime #00ff00=60 61 apple green #8db600=61 62 Operators #62c213=62 63 forest green #228b22=63 64 green #008000=64 65 dark green #006400=65 66 dark pastel green #03c03c=66 67 emerald #50c878=67 68 mint #3eb489=68 69 Pen #00a178=69 } cyans={ 70 aqua (cyan) #00ffff=70 71 dark cyan #008b8b=71 72 cerulean #007ba7=72 73 iceberg #71a6d2=73 74 Sensing #0494dc=74 75 teal #008080=75 76 light sky blue #87cefa=76 77 deep sky blue #00bfff=77 78 dodger blue #1e90ff=78 79 azure #007fff=79 } blues={ 80 blue #0000ff=80 81 midnight blue #191970=81 82 dark powder blue #003399=82 83 cobalt #0047ab=83 84 denim #1560bd=84 85 navy blue #000080=85 86 steel blue #4682b4=86 87 Motion #4a6cd4=87 88 cornflower #6495ed=88 89 slate blue #6a5acd=89 } purples={ 90 violet #8000ff=90 91 Looks #8f56e3=91 92 grape #6f2da8=92 93 indigo #4b0082=93 94 x11 purple #a020f0=94 95 magenta (fuchia) #ff00ff=95 96 dark orchid #9932cc=96 97 Sound #cf4ad9=97 98 purple #7f007f=98 99 dark magenta #8b008b=99 }✐ last set ascrayon✐ fair?false1231
Takes three inputs for red, green, and blue values, each between 0 and 255. 0,0,0 is black; 255,255,255 is white. 255,255,0 is yellow, and so on. The SET PEN block in this library lets you set individual red, green, or blue without changing the others, lets you provide a list of three RGB color components, and lets you provide a six-digit hexadecimal number, the form in which RGB color values are usually found online. See Appendix A of the Snap! Reference Manual for details.
pt:altera a cor da tua caneta para vermelho _ , verde _ e azul _ (0 a 255) ca:fixa el llapis al color r: _ g: _ b: _ 25500
Takes three inputs for hue, saturation, and value ("brightness") values, each between 0 and 1. 0,0,0 is black; 0,0,1 is white. 0.15,1,1 is yellow, and so on. The SET PEN block in this library lets you set individual hue, saturation, or value without changing the others, lets you provide a list of three HSV color components, and lets you use the very much superior HSL (hue, saturation, lightness) color space. See Appendix A of the Snap! Reference Manual for details.
pt:altera a cor da caneta para matiz _ , saturação _ e brilho _ (0 a 1) ca:fixa el llapis al color h: _ s: _ v: _ 0.30.70.6
Reports the current pen color as a list of three RGB values in the range 0-255. The PEN block in this library provides a large set of ways to examine the color. See Appendix A in the Snap! Reference Manual for details.
pt:a cor da caneta em RGB (vermelho, verde e azul; 0 a 255)
Reports the current pen color as a list of three HSV values in the range 0-1. See Appendix A in the Snap! Reference Manual for details.
pt:a cor da caneta em HSV (matiz, saturação e brilho, 0 a 1)
Takes a value from 0 to 15 and reports the corresponding hexadecimal digit. For internal use of the color library.
Don't ask. Only for internal use by the SET PEN block.
truetrue
Creates a bunch of global variables. For internal use by Color library.
global✐ last set as✐ fair?✐ color scale✐ HSL✐ last crayon✐ last X11✐ raw HSL✐ raw HSV✐ X11✐ crayon colors✐ fair hue table✐ colors✐ brights✐ pivots✐ HSV brights✐ HSL brights✐ HSV colors✐ HSL colors✐ X11 catch✐ dimension names✐ dimension dispatch✐ last set asRGB✐ fair?false✐ raw HSV0100100✐ HSL010050✐ raw HSL010050
not a crayon
not an X11 color
11000hues1fair hues00hue101100021000✐ fair hue table10
11
1
smallest componentrgb255
smallest component2rgb255
2Red family8.7Brown/orange family17yellow501427.7522.334green52cyan67blue83.33333333purple9550505left of black
falsehue603.61001003.6100100
hue mod 100, other components cut off at [0, 100]
value100color3.6index1index-1scale1255fromto1newHSVHSL✐ fair?true
color300index15scale15grayscale15255fromto121✐ last set ascolor number✐ fair?true✐ raw HSL10050✐ raw HSV100100
015866161216341656✐ last set asRGB✐ fair?false1
44partial matchestrue4matchhead matchestrueSUBSET throws here if it handles a unique match1
44partial matchesfalse4matchhead matchesfalseSUBSET throws here if it handles a unique match2
015866161216341656
fair hue transparency ~2 (3D color spaces)={ fair HSL={ fair hue fair saturation (HSL) fair lightness } fair HSV={ fair hue fair saturation (HSV) fair value (brightness) } HSL={ hue saturation (HSL) lightness } HSV={ hue saturation (HSV) value (brightness) } RGB (0-255)={ red green blue } }255100We have to do this last test to rule out the vector options, which aren't numbers; their code makes three recursive calls and we catch range issues then.huesaturation (HSV)value (brightness)saturation (HSL)lightnesstransparencyredgreenbluefair huefair saturation (HSV)fair value (brightness)fair saturation (HSL)fair lightness
✐ last set asHSL33✐ fair?false1
✐ last set asRGB✐ fair?false
✐ last set asRGB✐ fair?false
✐ last set asRGB✐ fair?false
✐ last set asRGB✐ fair?false
0
4value0255131✐ last set asRGB✐ fair?false
✐ last set asHSL22✐ fair?false1
✐ last set asHSL✐ HSL11000100✐ raw HSL✐ fair?false1
✐ last set asHSV✐ fair?false✐ raw HSV1310031
100if USED TO BE fairHSL✐ fair?false1
✐ last set asHSL2222✐ fair?true1
✐ last set asHSL3333✐ fair?true1
2313
22✐ last set asHSV✐ fair?true1
33✐ last set asHSV✐ fair?true1
23131
pt:o texto multilinha _
Reports the part of the first string up to the first instance of the second string inside it. If the second string isn't found, reports the entire first string.
pt:o texto de _ antes de _
Reports the portion of the first input string starting after the first occurrence of the second string. If the second string isn't found in the first string, reports an empty string.
pt:o texto de _ depois de _
Reports the character position (starting from 1) of the beginning of the first input string inside the second input string. If it's not found, reports 0.
pt:a posição de _ em _
If input is TRUE, comparisons made by functions in the string library will be case-independent (so "FOO" = "foo"). This is the default. If input is FALSE, comparisons will be exact.
pt:altera comparações ignorando distinção minúsculas/maiúsculas para _
Reports the portion of the first input (string) starting at the position given by the second input (counting from 1, like LETTER n OF) and ending at the position given by the third input (also counting from 1). If the third input is empty, reports the portion from the first position to the end of the string. If a position number is negative, counts from the end backward, so -1 is the last character, -2 is the next to last, etc.
pt:o texto de _ entre as posições _ e _ , inclusive
Reports True if the first input string contains the second input string, otherwise false. Comparison is case-independent by default; use USE CASE-INDEPENDENT COMPARISONS to change that.
pt:o texto de _ antes de _
Reports the input text with lower case letters instead of capital letters in the input. Uses the user's locale's rules for case conversion.
pt:em minúsculas _
err_reset
This block creates new variables on the selected scope: global (for all sprites), sprite (for this sprite only) or script (only for that blocks stack) with the names given (in 'names' list). If there is already a variable with that name in that scope, it does nothing: no errors and no overwrites.
pt:cria as variáveis _ _ ca:crea les _ variables _ es:crear las _ variables _ de:erstellen _ var _ globalglobal sprite script
This block reports "true" if there is a variable with this given name (input slot) in that context. It can be a global, sprite or script variable. Otherwise it reports "false".
pt:a variável _ existe ca:existeix la variable _ ? es:existe la variable _ ? de:existiert var _ ? err_reset
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/crayons.xml b/elements/pl-snap/Snap/libraries/crayons.xml new file mode 100644 index 00000000..21eb6521 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/crayons.xml @@ -0,0 +1 @@ +Sets the pen color to one of 100 preselected colors, like a box of 100 crayons. The colors have names that are meant to be evocative. They are organized in families, more or less corresponding to spectral (rainbow) colors; the input slot has a two-level menu in which you can hover over a family name to see the colors of that family, each including a crayon number and an RGB value. See Appendix A of the Snap! Reference Manual for more details.
ca:fixa el llapis de color _ grays={ 0 black #000000=0 1 gray7 #121212=1 2 gray14 #242424=2 3 gray21 #363636=3 4 gray28 #484848=4 5 gray36 #5c5c5c=5 6 gray43 #6d6d6d=6 7 gray50 #7f7f7f=7 8 gray57 #919191=8 9 gray64 #a3a3a3=9 10 gray71 #b5b5b5=10 11 gray78 #c8c8c8=11 12 gray85 #dadada=12 13 gray92 #ececec=13 14 white #ffffff=14 } pinks={ 15 deep pink #ff1493=15 16 hot pink #ff69b4=16 17 bright pink #ff007f=17 18 raspberry #e30b5d=18 19 amaranth #e52b50=19 } reds={ 20 red #ff0000=20 21 burgundy #900020=21 22 cherry #990000=22 23 dark candy apple red #a40000=23 24 sanguine #c00000=24 25 maroon #800000=25 26 crimson #c90016=26 27 Lists #d94d11=27 28 candy apple red #ff0800=28 29 coquelicot #ff3800=29 } browns={ 30 saddle brown #8b4513=30 31 chocolate #7b3f00=31 32 kobicha #6b4423=32 33 sepia #704214=33 34 chestnut #954535=34 35 dark brown #654321=35 36 brown #964b00=36 37 golden brown #996515=37 38 cinnamon #b87333=38 39 copper #d2691e=39 } oranges={ 40 orange #ff7f00=40 41 Pantone orange #ff5800=41 42 pumpkin #ff7518=42 43 Variables #f3761d=43 44 Spanish orange #e86100=44 45 burnt orange #cc5500=45 46 sinopia #cb410b=46 47 ochre #cc7722=47 48 carrot #ed9121=48 49 tangerine #f28500=49 } yellows={ 50 yellow #ffff00=50 51 Control #e6a822=51 52 dark goldenrod #b8860b=52 53 goldenrod #daa520=53 54 saffron #f4c430=54 55 sandstorm #ecd540=55 56 mustard #ffdb58=56 57 gold #ffd700=57 58 egg yolk #fee33e=58 59 rubber duck #fbe108=59 } greens={ 60 lime #00ff00=60 61 apple green #8db600=61 62 Operators #62c213=62 63 forest green #228b22=63 64 green #008000=64 65 dark green #006400=65 66 dark pastel green #03c03c=66 67 emerald #50c878=67 68 mint #3eb489=68 69 Pen #00a178=69 } cyans={ 70 aqua (cyan) #00ffff=70 71 dark cyan #008b8b=71 72 cerulean #007ba7=72 73 iceberg #71a6d2=73 74 Sensing #0494dc=74 75 teal #008080=75 76 light sky blue #87cefa=76 77 deep sky blue #00bfff=77 78 dodger blue #1e90ff=78 79 azure #007fff=79 } blues={ 80 blue #0000ff=80 81 midnight blue #191970=81 82 dark powder blue #003399=82 83 cobalt #0047ab=83 84 denim #1560bd=84 85 navy blue #000080=85 86 steel blue #4682b4=86 87 Motion #4a6cd4=87 88 cornflower #6495ed=88 89 slate blue #6a5acd=89 } purples={ 90 violet #8000ff=90 91 Looks #8f56e3=91 92 grape #6f2da8=92 93 indigo #4b0082=93 94 x11 purple #a020f0=94 95 magenta (fuchia) #ff00ff=95 96 dark orchid #9932cc=96 97 Sound #cf4ad9=97 98 purple #7f007f=98 99 dark magenta #8b008b=99 }123
Takes three inputs for red, green, and blue values, each between 0 and 255. 0,0,0 is black; 255,255,255 is white. 255,255,0 is yellow, and so on. The SET PEN block in this library lets you set individual red, green, or blue without changing the others, lets you provide a list of three RGB color components, and lets you provide a six-digit hexadecimal number, the form in which RGB color values are usually found online. See Appendix A of the Snap! Reference Manual for details.
pt:altera a cor da tua caneta para vermelho _ , verde _ e azul _ (0 a 255) 25500
Creates a bunch of global variables. For internal use by Color library.
global✐ last crayon✐ crayon colors
ca:canvia de llapis de color saltant _
pt:lança o erro _
This block creates new variables on the selected scope: global (for all sprites), sprite (for this sprite only) or script (only for that blocks stack) with the names given (in 'names' list). If there is already a variable with that name in that scope, it does nothing: no errors and no overwrites.
pt:cria as variáveis _ _ ca:crea les _ variables _ es:crear las _ variables _ de:erstellen _ var _ globalglobal sprite script
This block reports "true" if there is a variable with this given name (input slot) in that context. It can be a global, sprite or script variable. Otherwise it reports "false".
pt:a variável _ existe ca:existeix la variable _ ? es:existe la variable _ ? de:existiert var _ ? err_reset
pt:o texto multilinha _
ca:llapis de color
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/frequency_distribution_module.xml b/elements/pl-snap/Snap/libraries/frequency_distribution_module.xml new file mode 100644 index 00000000..f5e019a0 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/frequency_distribution_module.xml @@ -0,0 +1 @@ +returns a frequency analysis of the argument list, represented as a two-column table, where the first column contains the unique values and the second column their occurrences
pt:$flash as frequências dos itens de _ ca:$flash analitza _
pt:o agrupamento dos itens de _ de acordo com _ ca:$flash agrupa _ per _
pt:uma ordenação de _ com critério _ ca:$flash ordena _ per _
pt:o histograma de _ entre _ e _ com intervalo _ ca:histograma de _ des de: _ fins: _ interval: _ 1
pt:o histograma de _ agrupado de acordo com _ entre _ e _ com passo _ ca:histograma de _ agrupat per: _ des de: _ fins: _ interval: _
add missing entries to a sorted list. Used for histograms
pt:os itens de _ com a chave _ entre _ e _ com passo _ completados por _ ca:omple _ clau: _ des de: _ fins: _ interval: _ amplada: _ 11
pt:_ em minúsculas ca:_ $arrowRight minúscules
pt:desenha gráfico de barras de _ em (x: _ , y: _ ) com largura _ e altura _ ca:dibuixa _ _ a x: _ y: _ i ample: _ alçada: _ barsbars lines pie chart-200-10040020022100startsettingratio1step2lines
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/httpBlocks.xml b/elements/pl-snap/Snap/libraries/httpBlocks.xml new file mode 100644 index 00000000..052efb75 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/httpBlocks.xml @@ -0,0 +1 @@ +
pt:os dados JSON _ em formato de lista
pt:o valor com chave _ em _
pt:a resposta a _ de _ enviando _ e cabeçalhos _ GETGET POST PUT DELETEhttps://snap.berkeley.edu
pt:um par (chave: _ , valor: _ )
Reports a three-item list containing the latitude and longitude of the user, and the precision of the measurements. Works only if the user allows snap.berkeley.edu access to location data. Some browsers also require an HTTPS connection to Snap!.
pt:a localização actual do dispositivo
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/iteration-composition.xml b/elements/pl-snap/Snap/libraries/iteration-composition.xml new file mode 100644 index 00000000..eabb3256 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/iteration-composition.xml @@ -0,0 +1 @@ +
de:fange _ _ ca:agafa _ _ es:atrapar _ _ fr:attrape _ _ pt:captura _ _ cont
de:wirf _ ca:llança _ es:lanzar _ fr:lance _ pt:lança _ catchtag
de:fange _ _ ca:agafa _ _ es:atrapar _ _ fr:attrape _ _ pt:captura _ _ cont
de:wirf _ _ ca:llança _ _ es:lanzar _ _ fr:lance _ _ pt:lança _ _ catchtag
This is a breakpoint block, to be used in debugging. The Boolean input specifies the condition under which the program should pause. (Use True for an unconditional breakpoint.) The intent is that the script should have SHOW VARIABLE blocks for the process's local variables. After the pause, this block automatically hides all temporary variables.
de:falls _ dann _ und pause $pause-1-255-220-0 ca:si _ fes _ i atura-ho tot $pause-1-255-220-0 es:si _ haz _ y páralo todo $pause-1-255-220-0 fr:si _ faire _ et mettre tout en pause $pause-1-255-220-0 pt:se _ , então _ e faz pausa em tudo $pause-1-255-220-0
This block does nothing. Use it when you are calling a reporter for its side effect and don't care about its return value.
de:ignoriere _ ca:ignora _ es:ignorar _ fr:ignore _ pt:ignora _
Call f(f(f(...(f(x))))) n times where the three input slots are n, f, and x from left to right. The # variable can be used inside f to represent how many times f has been called.
pt:o resultado de _ invocações em cascata de _ com argumento inicial _ _ ca:en cascada _ vegades _ _ _
Call f(f(f(...(f(x))))) until condition is true, where the three input slots are condition, f, and x from left to right. The # variable can be used inside f or condition to indicate how many times f has been called.
pt:o resultado da invocação em cascata até que _ de _ com argumento inicial _ _ ca:en cascada fins _ _ _ _
Returns the function x↦f(g(x)) where f and g are the two inputs.
pt:a composição de _ com _ ca:composa _ _
Like the built-in REPEAT UNTIL block, except that the ending condition is not tested until the script has been run the first time. So the script is run at least once.
pt:repete _ até que _ $loop-0.7 ca:repeteix _ fins _
Run the script repeatedly, as long as the given condition is true. Runs the script at least once before testing the condition.
pt:repete _ enquanto _ $loop-0.7 ca:repeteix _ mentre _
Runs the script repeatedly, as long as the condition is true. Tests the condition before the first time the script is run. Like the built in REPEAT UNTIL except that in this block the condition must be true, not false.
pt:enquanto _ , repete _ $loop-0.7
Runs the script the specified number of times, like the built-in REPEAT block, but this one provides the # variable that can be used inside the script. Try REPEAT (200) MOVE (#) STEPS RIGHT 92 with the pen down.
pt:repete _ vezes _ _ $loop-0.7 ca:repeteix _ _ _
The primitive FOR block uses an implicit step of ±1 depending on which of the starting and ending values is larger. This version allows you to provide an explicit step value. If the sign of the step input is incompatible with the ordering of the starting and ending values, the script will not be run at all.
pt:para _ de _ com passo _ a _ _ $loop-0.7 ca:per _ = _ incrementant _ fins _ _ 1110
Provides LOOP as a function of one input that runs the body of the LET with A set to the function input, so the body can run itself recursively. See COPY block in Variables for an example of use.
pt:tendo _ o valor inicial _ , executa _ definido como _ ca:fes que _ sigui _ al _ _ new value
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/leap-library.xml b/elements/pl-snap/Snap/libraries/leap-library.xml new file mode 100644 index 00000000..fab8de66 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/leap-library.xml @@ -0,0 +1,7 @@ +
xx +y +z1
yawyaw +pitch +roll1
xx +y +z1
1
1
testtestvar leapScript, done = false; leapScript = document.createElement('script'), leapScript.onload = function () { done = true; console.log('leap is ready'); }; document.head.appendChild(leapScript); leapScript.src = 'https://js.leapmotion.com/leap-0.6.4.min.js'; return function () {return done; }window.controller = new Leap.Controller({enableGestures: true, background: true}); window.controller.connect();
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/list-utilities.xml b/elements/pl-snap/Snap/libraries/list-utilities.xml new file mode 100644 index 00000000..d62d67ca --- /dev/null +++ b/elements/pl-snap/Snap/libraries/list-utilities.xml @@ -0,0 +1 @@ +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 < as the comparison function will sort from low to high; using > will sort from high to low.
ca:ordena _ segons criteri _
The second input is an "association list," a list of two-item lists. Each of those smaller lists has a "key" as its first item and a "value" as its second. ASSOC reports the first key-value pair in the association list whose key matches the first input.
ca:associació _ _
This block carries out the given script for each item of the given list, like the primitive FOR EACH. What'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.
ca:_ per cada _ de _ _
1
Takes a (possibly deep) list as input, and reports a human-readable text form of the list (namely, Lisp notation). Will not work on circular lists.
ca:notació textual de _ ( )
SENTENCE is the main constructor for sentences, represented as lists of words. It takes zero or more inputs, each of which can be either a list or a text string. If a list, the input is assumed to be a list of words. If a text string, it is converted to a list of words using SENTENCE→LIST. Then all the lists of words are appended to form a new list of words. If the inputs are lists of lists rather than lists of words, SENTENCE, like APPEND, does only one level of flattening, reporting a list of all the items of all the input lists.
ca:frase _
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. Viewing the inputs as the rows of a matrix, ZIP reports its transpose.
The identity function reports its input.
Takes as input a function of N inputs and N lists. 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.)
ca:multi-mapeja _ sobre _
Takes a sentence in text string form and reports the sentence as a list of its words.
de:Satz $arrowRight Liste _ ca:frase $arrowRight llista _ es:frase $arrowRight lista _ fr:phrase $arrowRight liste _ pt:uma lista com as palavras da frase _
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/list_comprehension_module.xml b/elements/pl-snap/Snap/libraries/list_comprehension_module.xml new file mode 100644 index 00000000..08291cac --- /dev/null +++ b/elements/pl-snap/Snap/libraries/list_comprehension_module.xml @@ -0,0 +1 @@ +
00
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/localstorage_module.xml b/elements/pl-snap/Snap/libraries/localstorage_module.xml new file mode 100644 index 00000000..1c607623 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/localstorage_module.xml @@ -0,0 +1 @@ +
ca:desa clau: _ amb valor: _ al navegador
ca:dades desades al navegador
ca:esborra clau: _ del navegador
ca:esborra dades del navegador
Reports the value previously stored under the input key in the browser's local storage. Reports False if the key is not found.
ca:obté valor de clau: _ al navegador
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/make-variables.xml b/elements/pl-snap/Snap/libraries/make-variables.xml new file mode 100644 index 00000000..cd49aabe --- /dev/null +++ b/elements/pl-snap/Snap/libraries/make-variables.xml @@ -0,0 +1 @@ +This block creates new variables on the selected scope: global (for all sprites), sprite (for this sprite only) or script (only for that blocks stack) with the names given (in 'names' list). If there is already a variable with that name in that scope, it does nothing: no errors and no overwrites.
pt:cria as variáveis _ _ ca:crea les _ variables _ es:crear las _ variables _ de:erstellen _ var _ globalglobal sprite script
This block deletes all the variables with the names given (inside input list). Each name will make only one variable deletion, and this will be the variable found following the scope order: 'script' -> 'sprite' -> 'global'. If we have a "testing" sprite variable and also a "testing" global one, deleting "testing" will delete only the sprite one (Yes! we can also do "delete var (testing, testing)" to delete both. If one variable does not exists (in any scope) an error happens, stopping block action in that point. You can check it before with the "does var (name) exists?"block.
pt:remove as variáveis _ ca:esborra les variables _ es:borrar variables _ de:löschen var _
This block sets the given value (last input) to the variable named with the name givent (var input). It looks for that variable following the scope order 'script' -> 'sprite' -> 'global' (the first match it finds). If that variable does not exist (in any scope) an error happens, stopping their script. You can check it before using the "does var (name) exists?" block.
ca:assigna a _ el valor _ es:asignar a _ el valor _ pt:altera _ para _ de:setze var _ auf _ §_getVarNamesDict
This block reports the value of the variable with the name given. It looks for that variable following the scope order 'script' -> 'sprite' -> 'global' (the first match it finds). If that variable does not exist (in any scope) an error happens, stopping their script. You can check it before using the "does var (name) exists?" block.
pt:o valor de _ §_getVarNamesDict
This block reports "true" if there is a variable with this given name (input slot) in that context. It can be a global, sprite or script variable. Otherwise it reports "false".
pt:a variável _ existe ca:existeix la variable _ ? es:existe la variable _ ? de:existiert var _ ? err_reset
This block turns on (show) the watcher view on stage (if it was not already activated) of the variable with the given name (slot input). It can only access to the closest variable scope (if there different variables with the same name in different scopes) following the order 'script' -> 'sprite' -> 'global'. No errors if that variable does not exist.
ca:mostra la variable _ es:mostrar variable _ pt:mostra a variável _ de:zeige var _ §_getVarNamesDict
This block turns off (hide) the watcher view on stage (if it was not already activated) of the variable with the given name (slot input). It can only access to the closest variable scope (if there different variables with the same name in different scopes) following the order 'script' -> 'sprite' -> 'global'. No errors if that variable does not exist.
ca:amaga la variable _ es:esconder variable _ pt:esconde a variável _ de:verstecke var _ §_getVarNamesDict
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/maps_module.xml b/elements/pl-snap/Snap/libraries/maps_module.xml new file mode 100644 index 00000000..57c6676e --- /dev/null +++ b/elements/pl-snap/Snap/libraries/maps_module.xml @@ -0,0 +1 @@ +
de:$globe zeige aktuellen Standort pt:mostra a localização corrente do dispositivo no $globe ca:$globe centra a la meva ubicació
de:$globe Zoom pt:o zoom do $globe ca:$globe zoom
de:setze $globe Zoom auf _ pt:altera o zoom do $globe para _ ca:$globe fixa el zoom a _ 10
de:$globe Längengrad von x _ pt:a longitude no $globe da coordenada x _ ca:$globe longitud per a x _ 0
de:$globe Breitengrad von y _ pt:a latitude no $globe da coordenada y _ ca:$globe latitud per a y _ 0
de:setze $globe auf Länge: _ Breite: _ pt:altera a posição no $globe para (longitude: _ , latitude: _ ) ca:$globe centra a longitud: _ latitud: _ -122.25785237.872099
de:y von $globe Breitengrad _ pt:a coordenada y da latitude _ no $globe ca:$globe y per a latitud _
de:x von $globe Längengrad _ pt:a coordenada x da longidude _ no $globe ca:$globe x per a longitud _
de:ändere $globe um x: _ y: _ Pixel pt:desloca a posição do mapa de (x: _ , y: _ ) ca:$globe canvia la ubicació en x: _ y: _ píxels 1010
de:$globe Entfernung in km zu _ pt:a tua distância em km a _ no $globo ca:$globe distància en km fins a _ §_objectsMenumap_dist(lat1, lon1, lat2, lon2)
de:$globe aktuelle Position pt:a localização corrente do dispositivo no $globe ca:$globe ubicació actual
de:$globe aktueller Breitengrad pt:a latitude corrente do dispositivo no $globe ca:$globe latitud actual
de:$globe aktueller Längengrad pt:a longitude corrente do dispositivo no $globe ca:$globe longitud actual
de:aktualisiere $globe pt:actualiza o $globe ca:$globe força refresc
de:$globe als Kostüm pt:a parte visível do $globe na forma de traje ca:$globe vestit del mapa actual
de:setze $globe Stil auf _ pt:altera o estilo do $globe para _ ca:$globe fixa l'estil de mapa a _ OpenStreetMapOpenStreetMap Wikimedia Watercolor Toner Terrain Topographic Satellite Streets Shading Mapbox (experimental)
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/menu_module.xml b/elements/pl-snap/Snap/libraries/menu_module.xml new file mode 100644 index 00000000..302b58ba --- /dev/null +++ b/elements/pl-snap/Snap/libraries/menu_module.xml @@ -0,0 +1 @@ +
what's your name?
Alert!
choose!
title
§_objectsMenuoption
leftleft righthey!
open my definition to look at examples how to use the menu blocks
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/mqtt.js b/elements/pl-snap/Snap/libraries/mqtt.js new file mode 100644 index 00000000..0f38d3e4 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/mqtt.js @@ -0,0 +1,15239 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mqtt = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i + this.emit('error', new Error('Packet has no Authentication Method') + )) + return this + } + if (this.options.properties.authenticationMethod && this.options.authPacket && typeof this.options.authPacket === 'object') { + var authPacket = xtend({cmd: 'auth', reasonCode: 0}, this.options.authPacket) + sendPacket(this, authPacket) + } + } + + // many drain listeners are needed for qos 1 callbacks if the connection is intermittent + this.stream.setMaxListeners(1000) + + clearTimeout(this.connackTimer) + this.connackTimer = setTimeout(function () { + debug('!!connectTimeout hit!! Calling _cleanUp with force `true`') + that._cleanUp(true) + }, this.options.connectTimeout) +} + +MqttClient.prototype._handlePacket = function (packet, done) { + var options = this.options + + if (options.protocolVersion === 5 && options.properties && options.properties.maximumPacketSize && options.properties.maximumPacketSize < packet.length) { + this.emit('error', new Error('exceeding packets size ' + packet.cmd)) + this.end({reasonCode: 149, properties: { reasonString: 'Maximum packet size was exceeded' }}) + return this + } + debug('_handlePacket :: emitting packetreceive') + this.emit('packetreceive', packet) + + switch (packet.cmd) { + case 'publish': + this._handlePublish(packet, done) + break + case 'puback': + case 'pubrec': + case 'pubcomp': + case 'suback': + case 'unsuback': + this._handleAck(packet) + done() + break + case 'pubrel': + this._handlePubrel(packet, done) + break + case 'connack': + this._handleConnack(packet) + done() + break + case 'pingresp': + this._handlePingresp(packet) + done() + break + case 'disconnect': + this._handleDisconnect(packet) + done() + break + default: + // do nothing + // maybe we should do an error handling + // or just log it + break + } +} + +MqttClient.prototype._checkDisconnecting = function (callback) { + if (this.disconnecting) { + if (callback) { + callback(new Error('client disconnecting')) + } else { + this.emit('error', new Error('client disconnecting')) + } + } + return this.disconnecting +} + +/** + * publish - publish to + * + * @param {String} topic - topic to publish to + * @param {String, Buffer} message - message to publish + * @param {Object} [opts] - publish options, includes: + * {Number} qos - qos level to publish on + * {Boolean} retain - whether or not to retain the message + * {Boolean} dup - whether or not mark a message as duplicate + * {Function} cbStorePut - function(){} called when message is put into `outgoingStore` + * @param {Function} [callback] - function(err){} + * called when publish succeeds or fails + * @returns {MqttClient} this - for chaining + * @api public + * + * @example client.publish('topic', 'message'); + * @example + * client.publish('topic', 'message', {qos: 1, retain: true, dup: true}); + * @example client.publish('topic', 'message', console.log); + */ +MqttClient.prototype.publish = function (topic, message, opts, callback) { + debug('publish :: message `%s` to topic `%s`', message, topic) + var packet + var options = this.options + + // .publish(topic, payload, cb); + if (typeof opts === 'function') { + callback = opts + opts = null + } + + // default opts + var defaultOpts = {qos: 0, retain: false, dup: false} + opts = xtend(defaultOpts, opts) + + if (this._checkDisconnecting(callback)) { + return this + } + + packet = { + cmd: 'publish', + topic: topic, + payload: message, + qos: opts.qos, + retain: opts.retain, + messageId: this._nextId(), + dup: opts.dup + } + + if (options.protocolVersion === 5) { + packet.properties = opts.properties + if ((!options.properties && packet.properties && packet.properties.topicAlias) || ((opts.properties && options.properties) && + ((opts.properties.topicAlias && options.properties.topicAliasMaximum && opts.properties.topicAlias > options.properties.topicAliasMaximum) || + (!options.properties.topicAliasMaximum && opts.properties.topicAlias)))) { + /* + if we are don`t setup topic alias or + topic alias maximum less than topic alias or + server don`t give topic alias maximum, + we are removing topic alias from packet + */ + delete packet.properties.topicAlias + } + } + + debug('publish :: qos', opts.qos) + switch (opts.qos) { + case 1: + case 2: + // Add to callbacks + this.outgoing[packet.messageId] = { + volatile: false, + cb: callback || nop + } + if (this._storeProcessing) { + debug('_storeProcessing enabled') + this._packetIdsDuringStoreProcessing[packet.messageId] = false + this._storePacket(packet, undefined, opts.cbStorePut) + } else { + debug('MqttClient:publish: packet cmd: %s', packet.cmd) + this._sendPacket(packet, undefined, opts.cbStorePut) + } + break + default: + if (this._storeProcessing) { + debug('_storeProcessing enabled') + this._storePacket(packet, callback, opts.cbStorePut) + } else { + debug('MqttClient:publish: packet cmd: %s', packet.cmd) + this._sendPacket(packet, callback, opts.cbStorePut) + } + break + } + + return this +} + +/** + * subscribe - subscribe to + * + * @param {String, Array, Object} topic - topic(s) to subscribe to, supports objects in the form {'topic': qos} + * @param {Object} [opts] - optional subscription options, includes: + * {Number} qos - subscribe qos level + * @param {Function} [callback] - function(err, granted){} where: + * {Error} err - subscription error (none at the moment!) + * {Array} granted - array of {topic: 't', qos: 0} + * @returns {MqttClient} this - for chaining + * @api public + * @example client.subscribe('topic'); + * @example client.subscribe('topic', {qos: 1}); + * @example client.subscribe({'topic': {qos: 0}, 'topic2': {qos: 1}}, console.log); + * @example client.subscribe('topic', console.log); + */ +MqttClient.prototype.subscribe = function () { + var packet + var args = new Array(arguments.length) + for (var i = 0; i < arguments.length; i++) { + args[i] = arguments[i] + } + var subs = [] + var obj = args.shift() + var resubscribe = obj.resubscribe + var callback = args.pop() || nop + var opts = args.pop() + var invalidTopic + var that = this + var version = this.options.protocolVersion + + delete obj.resubscribe + + if (typeof obj === 'string') { + obj = [obj] + } + + if (typeof callback !== 'function') { + opts = callback + callback = nop + } + + invalidTopic = validations.validateTopics(obj) + if (invalidTopic !== null) { + setImmediate(callback, new Error('Invalid topic ' + invalidTopic)) + return this + } + + if (this._checkDisconnecting(callback)) { + debug('subscribe: discconecting true') + return this + } + + var defaultOpts = { + qos: 0 + } + if (version === 5) { + defaultOpts.nl = false + defaultOpts.rap = false + defaultOpts.rh = 0 + } + opts = xtend(defaultOpts, opts) + + if (Array.isArray(obj)) { + obj.forEach(function (topic) { + debug('subscribe: array topic %s', topic) + if (!that._resubscribeTopics.hasOwnProperty(topic) || + that._resubscribeTopics[topic].qos < opts.qos || + resubscribe) { + var currentOpts = { + topic: topic, + qos: opts.qos + } + if (version === 5) { + currentOpts.nl = opts.nl + currentOpts.rap = opts.rap + currentOpts.rh = opts.rh + currentOpts.properties = opts.properties + } + debug('subscribe: pushing topic `%s` and qos `%s` to subs list', currentOpts.topic, currentOpts.qos) + subs.push(currentOpts) + } + }) + } else { + Object + .keys(obj) + .forEach(function (k) { + debug('subscribe: object topic %s', k) + if (!that._resubscribeTopics.hasOwnProperty(k) || + that._resubscribeTopics[k].qos < obj[k].qos || + resubscribe) { + var currentOpts = { + topic: k, + qos: obj[k].qos + } + if (version === 5) { + currentOpts.nl = obj[k].nl + currentOpts.rap = obj[k].rap + currentOpts.rh = obj[k].rh + currentOpts.properties = opts.properties + } + debug('subscribe: pushing `%s` to subs list', currentOpts) + subs.push(currentOpts) + } + }) + } + + packet = { + cmd: 'subscribe', + subscriptions: subs, + qos: 1, + retain: false, + dup: false, + messageId: this._nextId() + } + + if (opts.properties) { + packet.properties = opts.properties + } + + if (!subs.length) { + callback(null, []) + return + } + + // subscriptions to resubscribe to in case of disconnect + if (this.options.resubscribe) { + debug('subscribe :: resubscribe true') + var topics = [] + subs.forEach(function (sub) { + if (that.options.reconnectPeriod > 0) { + var topic = { qos: sub.qos } + if (version === 5) { + topic.nl = sub.nl || false + topic.rap = sub.rap || false + topic.rh = sub.rh || 0 + topic.properties = sub.properties + } + that._resubscribeTopics[sub.topic] = topic + topics.push(sub.topic) + } + }) + that.messageIdToTopic[packet.messageId] = topics + } + + this.outgoing[packet.messageId] = { + volatile: true, + cb: function (err, packet) { + if (!err) { + var granted = packet.granted + for (var i = 0; i < granted.length; i += 1) { + subs[i].qos = granted[i] + } + } + + callback(err, subs) + } + } + debug('subscribe :: call _sendPacket') + this._sendPacket(packet) + + return this +} + +/** + * unsubscribe - unsubscribe from topic(s) + * + * @param {String, Array} topic - topics to unsubscribe from + * @param {Object} [opts] - optional subscription options, includes: + * {Object} properties - properties of unsubscribe packet + * @param {Function} [callback] - callback fired on unsuback + * @returns {MqttClient} this - for chaining + * @api public + * @example client.unsubscribe('topic'); + * @example client.unsubscribe('topic', console.log); + */ +MqttClient.prototype.unsubscribe = function () { + var packet = { + cmd: 'unsubscribe', + qos: 1, + messageId: this._nextId() + } + var that = this + var args = new Array(arguments.length) + for (var i = 0; i < arguments.length; i++) { + args[i] = arguments[i] + } + var topic = args.shift() + var callback = args.pop() || nop + var opts = args.pop() + + if (typeof topic === 'string') { + topic = [topic] + } + + if (typeof callback !== 'function') { + opts = callback + callback = nop + } + + if (this._checkDisconnecting(callback)) { + return this + } + + if (typeof topic === 'string') { + packet.unsubscriptions = [topic] + } else if (Array.isArray(topic)) { + packet.unsubscriptions = topic + } + + if (this.options.resubscribe) { + packet.unsubscriptions.forEach(function (topic) { + delete that._resubscribeTopics[topic] + }) + } + + if (typeof opts === 'object' && opts.properties) { + packet.properties = opts.properties + } + + this.outgoing[packet.messageId] = { + volatile: true, + cb: callback + } + + debug('unsubscribe: call _sendPacket') + this._sendPacket(packet) + + return this +} + +/** + * end - close connection + * + * @returns {MqttClient} this - for chaining + * @param {Boolean} force - do not wait for all in-flight messages to be acked + * @param {Object} opts - added to the disconnect packet + * @param {Function} cb - called when the client has been closed + * + * @api public + */ +MqttClient.prototype.end = function (force, opts, cb) { + var that = this + + debug('end :: (%s)', this.options.clientId) + + if (force == null || typeof force !== 'boolean') { + cb = opts || nop + opts = force + force = false + if (typeof opts !== 'object') { + cb = opts + opts = null + if (typeof cb !== 'function') { + cb = nop + } + } + } + + if (typeof opts !== 'object') { + cb = opts + opts = null + } + + debug('end :: cb? %s', !!cb) + cb = cb || nop + + function closeStores () { + debug('end :: closeStores: closing incoming and outgoing stores') + that.disconnected = true + that.incomingStore.close(function (e1) { + that.outgoingStore.close(function (e2) { + debug('end :: closeStores: emitting end') + that.emit('end') + if (cb) { + let err = e1 || e2 + debug('end :: closeStores: invoking callback with args') + cb(err) + } + }) + }) + if (that._deferredReconnect) { + that._deferredReconnect() + } + } + + function finish () { + // defer closesStores of an I/O cycle, + // just to make sure things are + // ok for websockets + debug('end :: (%s) :: finish :: calling _cleanUp with force %s', that.options.clientId, force) + that._cleanUp(force, () => { + debug('end :: finish :: calling process.nextTick on closeStores') + // var boundProcess = nextTick.bind(null, closeStores) + nextTick(closeStores.bind(that)) + }, opts) + } + + if (this.disconnecting) { + cb() + return this + } + + this._clearReconnect() + + this.disconnecting = true + + if (!force && Object.keys(this.outgoing).length > 0) { + // wait 10ms, just to be sure we received all of it + debug('end :: (%s) :: calling finish in 10ms once outgoing is empty', that.options.clientId) + this.once('outgoingEmpty', setTimeout.bind(null, finish, 10)) + } else { + debug('end :: (%s) :: immediately calling finish', that.options.clientId) + finish() + } + + return this +} + +/** + * removeOutgoingMessage - remove a message in outgoing store + * the outgoing callback will be called withe Error('Message removed') if the message is removed + * + * @param {Number} messageId - messageId to remove message + * @returns {MqttClient} this - for chaining + * @api public + * + * @example client.removeOutgoingMessage(client.getLastMessageId()); + */ +MqttClient.prototype.removeOutgoingMessage = function (messageId) { + var cb = this.outgoing[messageId] ? this.outgoing[messageId].cb : null + delete this.outgoing[messageId] + this.outgoingStore.del({messageId: messageId}, function () { + cb(new Error('Message removed')) + }) + return this +} + +/** + * reconnect - connect again using the same options as connect() + * + * @param {Object} [opts] - optional reconnect options, includes: + * {Store} incomingStore - a store for the incoming packets + * {Store} outgoingStore - a store for the outgoing packets + * if opts is not given, current stores are used + * @returns {MqttClient} this - for chaining + * + * @api public + */ +MqttClient.prototype.reconnect = function (opts) { + debug('client reconnect') + var that = this + var f = function () { + if (opts) { + that.options.incomingStore = opts.incomingStore + that.options.outgoingStore = opts.outgoingStore + } else { + that.options.incomingStore = null + that.options.outgoingStore = null + } + that.incomingStore = that.options.incomingStore || new Store() + that.outgoingStore = that.options.outgoingStore || new Store() + that.disconnecting = false + that.disconnected = false + that._deferredReconnect = null + that._reconnect() + } + + if (this.disconnecting && !this.disconnected) { + this._deferredReconnect = f + } else { + f() + } + return this +} + +/** + * _reconnect - implement reconnection + * @api privateish + */ +MqttClient.prototype._reconnect = function () { + debug('_reconnect: emitting reconnect to client') + this.emit('reconnect') + if (this.connected) { + this.end(() => { this._setupStream() }) + debug('client already connected. disconnecting first.') + } else { + debug('_reconnect: calling _setupStream') + this._setupStream() + } +} + +/** + * _setupReconnect - setup reconnect timer + */ +MqttClient.prototype._setupReconnect = function () { + var that = this + + if (!that.disconnecting && !that.reconnectTimer && (that.options.reconnectPeriod > 0)) { + if (!this.reconnecting) { + debug('_setupReconnect :: emit `offline` state') + this.emit('offline') + debug('_setupReconnect :: set `reconnecting` to `true`') + this.reconnecting = true + } + debug('_setupReconnect :: setting reconnectTimer for %d ms', that.options.reconnectPeriod) + that.reconnectTimer = setInterval(function () { + debug('reconnectTimer :: reconnect triggered!') + that._reconnect() + }, that.options.reconnectPeriod) + } else { + debug('_setupReconnect :: doing nothing...') + } +} + +/** + * _clearReconnect - clear the reconnect timer + */ +MqttClient.prototype._clearReconnect = function () { + debug('_clearReconnect : clearing reconnect timer') + if (this.reconnectTimer) { + clearInterval(this.reconnectTimer) + this.reconnectTimer = null + } +} + +/** + * _cleanUp - clean up on connection end + * @api private + */ +MqttClient.prototype._cleanUp = function (forced, done) { + var opts = arguments[2] + if (done) { + debug('_cleanUp :: done callback provided for on stream close') + this.stream.on('close', done) + } + + debug('_cleanUp :: forced? %s', forced) + if (forced) { + if ((this.options.reconnectPeriod === 0) && this.options.clean) { + flush(this.outgoing) + } + debug('_cleanUp :: (%s) :: destroying stream', this.options.clientId) + this.stream.destroy() + } else { + var packet = xtend({ cmd: 'disconnect' }, opts) + debug('_cleanUp :: (%s) :: call _sendPacket with disconnect packet', this.options.clientId) + this._sendPacket( + packet, + setImmediate.bind( + null, + this.stream.end.bind(this.stream) + ) + ) + } + + if (!this.disconnecting) { + debug('_cleanUp :: client not disconnecting. Clearing and resetting reconnect.') + this._clearReconnect() + this._setupReconnect() + } + + if (this.pingTimer !== null) { + debug('_cleanUp :: clearing pingTimer') + this.pingTimer.clear() + this.pingTimer = null + } + + if (done && !this.connected) { + debug('_cleanUp :: (%s) :: removing stream `done` callback `close` listener', this.options.clientId) + this.stream.removeListener('close', done) + done() + } +} + +/** + * _sendPacket - send or queue a packet + * @param {Object} packet - packet options + * @param {Function} cb - callback when the packet is sent + * @param {Function} cbStorePut - called when message is put into outgoingStore + * @api private + */ +MqttClient.prototype._sendPacket = function (packet, cb, cbStorePut) { + debug('_sendPacket :: (%s) :: start', this.options.clientId) + cbStorePut = cbStorePut || nop + + if (!this.connected) { + debug('_sendPacket :: client not connected. Storing packet offline.') + this._storePacket(packet, cb, cbStorePut) + return + } + + // When sending a packet, reschedule the ping timer + this._shiftPingInterval() + + switch (packet.cmd) { + case 'publish': + break + case 'pubrel': + storeAndSend(this, packet, cb, cbStorePut) + return + default: + sendPacket(this, packet, cb) + return + } + + switch (packet.qos) { + case 2: + case 1: + storeAndSend(this, packet, cb, cbStorePut) + break + /** + * no need of case here since it will be caught by default + * and jshint comply that before default it must be a break + * anyway it will result in -1 evaluation + */ + case 0: + /* falls through */ + default: + sendPacket(this, packet, cb) + break + } + debug('_sendPacket :: (%s) :: end', this.options.clientId) +} + +/** + * _storePacket - queue a packet + * @param {Object} packet - packet options + * @param {Function} cb - callback when the packet is sent + * @param {Function} cbStorePut - called when message is put into outgoingStore + * @api private + */ +MqttClient.prototype._storePacket = function (packet, cb, cbStorePut) { + debug('_storePacket :: packet: %o', packet) + debug('_storePacket :: cb? %s', !!cb) + cbStorePut = cbStorePut || nop + + // check that the packet is not a qos of 0, or that the command is not a publish + if (((packet.qos || 0) === 0 && this.queueQoSZero) || packet.cmd !== 'publish') { + this.queue.push({ packet: packet, cb: cb }) + } else if (packet.qos > 0) { + cb = this.outgoing[packet.messageId] ? this.outgoing[packet.messageId].cb : null + this.outgoingStore.put(packet, function (err) { + if (err) { + return cb && cb(err) + } + cbStorePut() + }) + } else if (cb) { + cb(new Error('No connection to broker')) + } +} + +/** + * _setupPingTimer - setup the ping timer + * + * @api private + */ +MqttClient.prototype._setupPingTimer = function () { + debug('_setupPingTimer :: keepalive %d (seconds)', this.options.keepalive) + var that = this + + if (!this.pingTimer && this.options.keepalive) { + this.pingResp = true + this.pingTimer = reInterval(function () { + that._checkPing() + }, this.options.keepalive * 1000) + } +} + +/** + * _shiftPingInterval - reschedule the ping interval + * + * @api private + */ +MqttClient.prototype._shiftPingInterval = function () { + if (this.pingTimer && this.options.keepalive && this.options.reschedulePings) { + this.pingTimer.reschedule(this.options.keepalive * 1000) + } +} +/** + * _checkPing - check if a pingresp has come back, and ping the server again + * + * @api private + */ +MqttClient.prototype._checkPing = function () { + debug('_checkPing :: checking ping...') + if (this.pingResp) { + debug('_checkPing :: ping response received. Clearing flag and sending `pingreq`') + this.pingResp = false + this._sendPacket({ cmd: 'pingreq' }) + } else { + // do a forced cleanup since socket will be in bad shape + debug('_checkPing :: calling _cleanUp with force true') + this._cleanUp(true) + } +} + +/** + * _handlePingresp - handle a pingresp + * + * @api private + */ +MqttClient.prototype._handlePingresp = function () { + this.pingResp = true +} + +/** + * _handleConnack + * + * @param {Object} packet + * @api private + */ +MqttClient.prototype._handleConnack = function (packet) { + debug('_handleConnack') + var options = this.options + var version = options.protocolVersion + var rc = version === 5 ? packet.reasonCode : packet.returnCode + + clearTimeout(this.connackTimer) + + if (packet.properties) { + if (packet.properties.topicAliasMaximum) { + if (!options.properties) { options.properties = {} } + options.properties.topicAliasMaximum = packet.properties.topicAliasMaximum + } + if (packet.properties.serverKeepAlive && options.keepalive) { + options.keepalive = packet.properties.serverKeepAlive + this._shiftPingInterval() + } + if (packet.properties.maximumPacketSize) { + if (!options.properties) { options.properties = {} } + options.properties.maximumPacketSize = packet.properties.maximumPacketSize + } + } + + if (rc === 0) { + this.reconnecting = false + this._onConnect(packet) + } else if (rc > 0) { + var err = new Error('Connection refused: ' + errors[rc]) + err.code = rc + this.emit('error', err) + } +} + +/** + * _handlePublish + * + * @param {Object} packet + * @api private + */ +/* +those late 2 case should be rewrite to comply with coding style: + +case 1: +case 0: + // do not wait sending a puback + // no callback passed + if (1 === qos) { + this._sendPacket({ + cmd: 'puback', + messageId: messageId + }); + } + // emit the message event for both qos 1 and 0 + this.emit('message', topic, message, packet); + this.handleMessage(packet, done); + break; +default: + // do nothing but every switch mus have a default + // log or throw an error about unknown qos + break; + +for now i just suppressed the warnings +*/ +MqttClient.prototype._handlePublish = function (packet, done) { + debug('_handlePublish: packet %o', packet) + done = typeof done !== 'undefined' ? done : nop + var topic = packet.topic.toString() + var message = packet.payload + var qos = packet.qos + var messageId = packet.messageId + var that = this + var options = this.options + var validReasonCodes = [0, 16, 128, 131, 135, 144, 145, 151, 153] + debug('_handlePublish: qos %d', qos) + switch (qos) { + case 2: { + options.customHandleAcks(topic, message, packet, function (error, code) { + if (!(error instanceof Error)) { + code = error + error = null + } + if (error) { return that.emit('error', error) } + if (validReasonCodes.indexOf(code) === -1) { return that.emit('error', new Error('Wrong reason code for pubrec')) } + if (code) { + that._sendPacket({cmd: 'pubrec', messageId: messageId, reasonCode: code}, done) + } else { + that.incomingStore.put(packet, function () { + that._sendPacket({cmd: 'pubrec', messageId: messageId}, done) + }) + } + }) + break + } + case 1: { + // emit the message event + options.customHandleAcks(topic, message, packet, function (error, code) { + if (!(error instanceof Error)) { + code = error + error = null + } + if (error) { return that.emit('error', error) } + if (validReasonCodes.indexOf(code) === -1) { return that.emit('error', new Error('Wrong reason code for puback')) } + if (!code) { that.emit('message', topic, message, packet) } + that.handleMessage(packet, function (err) { + if (err) { + return done && done(err) + } + that._sendPacket({cmd: 'puback', messageId: messageId, reasonCode: code}, done) + }) + }) + break + } + case 0: + // emit the message event + this.emit('message', topic, message, packet) + this.handleMessage(packet, done) + break + default: + // do nothing + debug('_handlePublish: unknown QoS. Doing nothing.') + // log or throw an error about unknown qos + break + } +} + +/** + * Handle messages with backpressure support, one at a time. + * Override at will. + * + * @param Packet packet the packet + * @param Function callback call when finished + * @api public + */ +MqttClient.prototype.handleMessage = function (packet, callback) { + callback() +} + +/** + * _handleAck + * + * @param {Object} packet + * @api private + */ + +MqttClient.prototype._handleAck = function (packet) { + /* eslint no-fallthrough: "off" */ + var messageId = packet.messageId + var type = packet.cmd + var response = null + var cb = this.outgoing[messageId] ? this.outgoing[messageId].cb : null + var that = this + var err + + if (!cb) { + debug('_handleAck :: Server sent an ack in error. Ignoring.') + // Server sent an ack in error, ignore it. + return + } + + // Process + debug('_handleAck :: packet type', type) + switch (type) { + case 'pubcomp': + // same thing as puback for QoS 2 + case 'puback': + var pubackRC = packet.reasonCode + // Callback - we're done + if (pubackRC && pubackRC > 0 && pubackRC !== 16) { + err = new Error('Publish error: ' + errors[pubackRC]) + err.code = pubackRC + cb(err, packet) + } + delete this.outgoing[messageId] + this.outgoingStore.del(packet, cb) + break + case 'pubrec': + response = { + cmd: 'pubrel', + qos: 2, + messageId: messageId + } + var pubrecRC = packet.reasonCode + + if (pubrecRC && pubrecRC > 0 && pubrecRC !== 16) { + err = new Error('Publish error: ' + errors[pubrecRC]) + err.code = pubrecRC + cb(err, packet) + } else { + this._sendPacket(response) + } + break + case 'suback': + delete this.outgoing[messageId] + for (var grantedI = 0; grantedI < packet.granted.length; grantedI++) { + if ((packet.granted[grantedI] & 0x80) !== 0) { + // suback with Failure status + var topics = this.messageIdToTopic[messageId] + if (topics) { + topics.forEach(function (topic) { + delete that._resubscribeTopics[topic] + }) + } + } + } + cb(null, packet) + break + case 'unsuback': + delete this.outgoing[messageId] + cb(null) + break + default: + that.emit('error', new Error('unrecognized packet type')) + } + + if (this.disconnecting && + Object.keys(this.outgoing).length === 0) { + this.emit('outgoingEmpty') + } +} + +/** + * _handlePubrel + * + * @param {Object} packet + * @api private + */ +MqttClient.prototype._handlePubrel = function (packet, callback) { + debug('handling pubrel packet') + callback = typeof callback !== 'undefined' ? callback : nop + var messageId = packet.messageId + var that = this + + var comp = {cmd: 'pubcomp', messageId: messageId} + + that.incomingStore.get(packet, function (err, pub) { + if (!err) { + that.emit('message', pub.topic, pub.payload, pub) + that.handleMessage(pub, function (err) { + if (err) { + return callback(err) + } + that.incomingStore.del(pub, nop) + that._sendPacket(comp, callback) + }) + } else { + that._sendPacket(comp, callback) + } + }) +} + +/** + * _handleDisconnect + * + * @param {Object} packet + * @api private + */ +MqttClient.prototype._handleDisconnect = function (packet) { + this.emit('disconnect', packet) +} + +/** + * _nextId + * @return unsigned int + */ +MqttClient.prototype._nextId = function () { + // id becomes current state of this.nextId and increments afterwards + var id = this.nextId++ + // Ensure 16 bit unsigned int (max 65535, nextId got one higher) + if (this.nextId === 65536) { + this.nextId = 1 + } + return id +} + +/** + * getLastMessageId + * @return unsigned int + */ +MqttClient.prototype.getLastMessageId = function () { + return (this.nextId === 1) ? 65535 : (this.nextId - 1) +} + +/** + * _resubscribe + * @api private + */ +MqttClient.prototype._resubscribe = function (connack) { + debug('_resubscribe') + var _resubscribeTopicsKeys = Object.keys(this._resubscribeTopics) + if (!this._firstConnection && + (this.options.clean || (this.options.protocolVersion === 5 && !connack.sessionPresent)) && + _resubscribeTopicsKeys.length > 0) { + if (this.options.resubscribe) { + if (this.options.protocolVersion === 5) { + debug('_resubscribe: protocolVersion 5') + for (var topicI = 0; topicI < _resubscribeTopicsKeys.length; topicI++) { + var resubscribeTopic = {} + resubscribeTopic[_resubscribeTopicsKeys[topicI]] = this._resubscribeTopics[_resubscribeTopicsKeys[topicI]] + resubscribeTopic.resubscribe = true + this.subscribe(resubscribeTopic, {properties: resubscribeTopic[_resubscribeTopicsKeys[topicI]].properties}) + } + } else { + this._resubscribeTopics.resubscribe = true + this.subscribe(this._resubscribeTopics) + } + } else { + this._resubscribeTopics = {} + } + } + + this._firstConnection = false +} + +/** + * _onConnect + * + * @api private + */ +MqttClient.prototype._onConnect = function (packet) { + if (this.disconnected) { + this.emit('connect', packet) + return + } + + var that = this + + this._setupPingTimer() + this._resubscribe(packet) + + this.connected = true + + function startStreamProcess () { + var outStore = that.outgoingStore.createStream() + + function clearStoreProcessing () { + that._storeProcessing = false + that._packetIdsDuringStoreProcessing = {} + } + + that.once('close', remove) + outStore.on('error', function (err) { + clearStoreProcessing() + that.removeListener('close', remove) + that.emit('error', err) + }) + + function remove () { + outStore.destroy() + outStore = null + clearStoreProcessing() + } + + function storeDeliver () { + // edge case, we wrapped this twice + if (!outStore) { + return + } + that._storeProcessing = true + + var packet = outStore.read(1) + + var cb + + if (!packet) { + // read when data is available in the future + outStore.once('readable', storeDeliver) + return + } + + // Skip already processed store packets + if (that._packetIdsDuringStoreProcessing[packet.messageId]) { + storeDeliver() + return + } + + // Avoid unnecessary stream read operations when disconnected + if (!that.disconnecting && !that.reconnectTimer) { + cb = that.outgoing[packet.messageId] ? that.outgoing[packet.messageId].cb : null + that.outgoing[packet.messageId] = { + volatile: false, + cb: function (err, status) { + // Ensure that the original callback passed in to publish gets invoked + if (cb) { + cb(err, status) + } + + storeDeliver() + } + } + that._packetIdsDuringStoreProcessing[packet.messageId] = true + that._sendPacket(packet) + } else if (outStore.destroy) { + outStore.destroy() + } + } + + outStore.on('end', function () { + var allProcessed = true + for (var id in that._packetIdsDuringStoreProcessing) { + if (!that._packetIdsDuringStoreProcessing[id]) { + allProcessed = false + break + } + } + if (allProcessed) { + clearStoreProcessing() + that.removeListener('close', remove) + that.emit('connect', packet) + } else { + startStreamProcess() + } + }) + storeDeliver() + } + // start flowing + startStreamProcess() +} + +module.exports = MqttClient + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./store":7,"./validations":8,"_process":44,"debug":14,"events":27,"inherits":29,"mqtt-packet":34,"readable-stream":59,"reinterval":60,"xtend":68}],2:[function(require,module,exports){ +(function (Buffer){ +'use strict' + +var Transform = require('readable-stream').Transform +var duplexify = require('duplexify') + +/* global FileReader */ +var my +var proxy +var stream +var isInitialized = false + +function buildProxy () { + var proxy = new Transform() + proxy._write = function (chunk, encoding, next) { + my.sendSocketMessage({ + data: chunk.buffer, + success: function () { + next() + }, + fail: function () { + next(new Error()) + } + }) + } + proxy._flush = function socketEnd (done) { + my.closeSocket({ + success: function () { + done() + } + }) + } + + return proxy +} + +function setDefaultOpts (opts) { + if (!opts.hostname) { + opts.hostname = 'localhost' + } + if (!opts.path) { + opts.path = '/' + } + + if (!opts.wsOptions) { + opts.wsOptions = {} + } +} + +function buildUrl (opts, client) { + var protocol = opts.protocol === 'alis' ? 'wss' : 'ws' + var url = protocol + '://' + opts.hostname + opts.path + if (opts.port && opts.port !== 80 && opts.port !== 443) { + url = protocol + '://' + opts.hostname + ':' + opts.port + opts.path + } + if (typeof (opts.transformWsUrl) === 'function') { + url = opts.transformWsUrl(url, opts, client) + } + return url +} + +function bindEventHandler () { + if (isInitialized) return + + isInitialized = true + + my.onSocketOpen(function () { + stream.setReadable(proxy) + stream.setWritable(proxy) + stream.emit('connect') + }) + + my.onSocketMessage(function (res) { + if (typeof res.data === 'string') { + var buffer = Buffer.from(res.data, 'base64') + proxy.push(buffer) + } else { + var reader = new FileReader() + reader.addEventListener('load', function () { + var data = reader.result + + if (data instanceof ArrayBuffer) data = Buffer.from(data) + else data = Buffer.from(data, 'utf8') + proxy.push(data) + }) + reader.readAsArrayBuffer(res.data) + } + }) + + my.onSocketClose(function () { + stream.end() + stream.destroy() + }) + + my.onSocketError(function (res) { + stream.destroy(res) + }) +} + +function buildStream (client, opts) { + opts.hostname = opts.hostname || opts.host + + if (!opts.hostname) { + throw new Error('Could not determine host. Specify host manually.') + } + + var websocketSubProtocol = + (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3) + ? 'mqttv3.1' + : 'mqtt' + + setDefaultOpts(opts) + + var url = buildUrl(opts, client) + my = opts.my + my.connectSocket({ + url: url, + protocols: websocketSubProtocol + }) + + proxy = buildProxy() + stream = duplexify.obj() + + bindEventHandler() + + return stream +} + +module.exports = buildStream + +}).call(this,require("buffer").Buffer) +},{"buffer":12,"duplexify":16,"readable-stream":59}],3:[function(require,module,exports){ +'use strict' +var net = require('net') +var debug = require('debug')('mqttjs:tcp') + +/* + variables port and host can be removed since + you have all required information in opts object +*/ +function streamBuilder (client, opts) { + var port, host + opts.port = opts.port || 1883 + opts.hostname = opts.hostname || opts.host || 'localhost' + + port = opts.port + host = opts.hostname + + debug('port %d and host %s', port, host) + return net.createConnection(port, host) +} + +module.exports = streamBuilder + +},{"debug":14,"net":11}],4:[function(require,module,exports){ +'use strict' +var tls = require('tls') +var debug = require('debug')('mqttjs:tls') + +function buildBuilder (mqttClient, opts) { + var connection + opts.port = opts.port || 8883 + opts.host = opts.hostname || opts.host || 'localhost' + opts.servername = opts.host + + opts.rejectUnauthorized = opts.rejectUnauthorized !== false + + delete opts.path + + debug('port %d host %s rejectUnauthorized %b', opts.port, opts.host, opts.rejectUnauthorized) + + connection = tls.connect(opts) + /* eslint no-use-before-define: [2, "nofunc"] */ + connection.on('secureConnect', function () { + if (opts.rejectUnauthorized && !connection.authorized) { + connection.emit('error', new Error('TLS not authorized')) + } else { + connection.removeListener('error', handleTLSerrors) + } + }) + + function handleTLSerrors (err) { + // How can I get verify this error is a tls error? + if (opts.rejectUnauthorized) { + mqttClient.emit('error', err) + } + + // close this connection to match the behaviour of net + // otherwise all we get is an error from the connection + // and close event doesn't fire. This is a work around + // to enable the reconnect code to work the same as with + // net.createConnection + connection.end() + } + + connection.on('error', handleTLSerrors) + return connection +} + +module.exports = buildBuilder + +},{"debug":14,"tls":11}],5:[function(require,module,exports){ +(function (process,Buffer){ +'use strict' + +const WS = require('ws') +const debug = require('debug')('mqttjs:ws') +const duplexify = require('duplexify') +const Transform = require('readable-stream').Transform + +let WSS_OPTIONS = [ + 'rejectUnauthorized', + 'ca', + 'cert', + 'key', + 'pfx', + 'passphrase' +] +// eslint-disable-next-line camelcase +const IS_BROWSER = (typeof process !== 'undefined' && process.title === 'browser') || typeof __webpack_require__ === 'function' +function buildUrl (opts, client) { + let url = opts.protocol + '://' + opts.hostname + ':' + opts.port + opts.path + if (typeof (opts.transformWsUrl) === 'function') { + url = opts.transformWsUrl(url, opts, client) + } + return url +} + +function setDefaultOpts (opts) { + let options = opts + if (!opts.hostname) { + options.hostname = 'localhost' + } + if (!opts.port) { + if (opts.protocol === 'wss') { + options.port = 443 + } else { + options.port = 80 + } + } + if (!opts.path) { + options.path = '/' + } + + if (!opts.wsOptions) { + options.wsOptions = {} + } + if (!IS_BROWSER && opts.protocol === 'wss') { + // Add cert/key/ca etc options + WSS_OPTIONS.forEach(function (prop) { + if (opts.hasOwnProperty(prop) && !opts.wsOptions.hasOwnProperty(prop)) { + options.wsOptions[prop] = opts[prop] + } + }) + } + + return options +} + +function setDefaultBrowserOpts (opts) { + let options = setDefaultOpts(opts) + + if (!options.hostname) { + options.hostname = options.host + } + + if (!options.hostname) { + // Throwing an error in a Web Worker if no `hostname` is given, because we + // can not determine the `hostname` automatically. If connecting to + // localhost, please supply the `hostname` as an argument. + if (typeof (document) === 'undefined') { + throw new Error('Could not determine host. Specify host manually.') + } + const parsed = new URL(document.URL) + options.hostname = parsed.hostname + + if (!options.port) { + options.port = parsed.port + } + } + + // objectMode should be defined for logic + if (options.objectMode === undefined) { + options.objectMode = !(options.binary === true || options.binary === undefined) + } + + return options +} + +function createWebSocket (client, url, opts) { + debug('createWebSocket') + debug('protocol: ' + opts.protocolId + ' ' + opts.protocolVersion) + const websocketSubProtocol = + (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3) + ? 'mqttv3.1' + : 'mqtt' + + debug('creating new Websocket for url: ' + url + ' and protocol: ' + websocketSubProtocol) + let socket = new WS(url, [websocketSubProtocol], opts.wsOptions) + return socket +} + +function createBrowserWebSocket (client, opts) { + const websocketSubProtocol = + (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3) + ? 'mqttv3.1' + : 'mqtt' + + let url = buildUrl(opts, client) + /* global WebSocket */ + let socket = new WebSocket(url, [websocketSubProtocol]) + socket.binaryType = 'arraybuffer' + return socket +} + +function streamBuilder (client, opts) { + debug('streamBuilder') + let options = setDefaultOpts(opts) + const url = buildUrl(options, client) + let socket = createWebSocket(client, url, options) + let webSocketStream = WS.createWebSocketStream(socket, options.wsOptions) + webSocketStream.url = url + return webSocketStream +} + +function browserStreamBuilder (client, opts) { + debug('browserStreamBuilder') + let stream + let options = setDefaultBrowserOpts(opts) + // sets the maximum socket buffer size before throttling + const bufferSize = options.browserBufferSize || 1024 * 512 + + const bufferTimeout = opts.browserBufferTimeout || 1000 + + const coerceToBuffer = !opts.objectMode + + let socket = createBrowserWebSocket(client, opts) + + let proxy = buildProxy(opts, socketWriteBrowser, socketEndBrowser) + + if (!opts.objectMode) { + proxy._writev = writev + } + proxy.on('close', () => { socket.close() }) + + const eventListenerSupport = (typeof socket.addEventListener === 'undefined') + + // was already open when passed in + if (socket.readyState === socket.OPEN) { + stream = proxy + } else { + stream = stream = duplexify(undefined, undefined, opts) + if (!opts.objectMode) { + stream._writev = writev + } + + if (eventListenerSupport) { + socket.addEventListener('open', onopen) + } else { + socket.onopen = onopen + } + } + + stream.socket = socket + + if (eventListenerSupport) { + socket.addEventListener('close', onclose) + socket.addEventListener('error', onerror) + socket.addEventListener('message', onmessage) + } else { + socket.onclose = onclose + socket.onerror = onerror + socket.onmessage = onmessage + } + + // methods for browserStreamBuilder + + function buildProxy (options, socketWrite, socketEnd) { + let proxy = new Transform({ + objectModeMode: options.objectMode + }) + + proxy._write = socketWrite + proxy._flush = socketEnd + + return proxy + } + + function onopen () { + stream.setReadable(proxy) + stream.setWritable(proxy) + stream.emit('connect') + } + + function onclose () { + stream.end() + stream.destroy() + } + + function onerror (err) { + stream.destroy(err) + } + + function onmessage (event) { + let data = event.data + if (data instanceof ArrayBuffer) data = Buffer.from(data) + else data = Buffer.from(data, 'utf8') + proxy.push(data) + } + + // this is to be enabled only if objectMode is false + function writev (chunks, cb) { + const buffers = new Array(chunks.length) + for (let i = 0; i < chunks.length; i++) { + if (typeof chunks[i].chunk === 'string') { + buffers[i] = Buffer.from(chunks[i], 'utf8') + } else { + buffers[i] = chunks[i].chunk + } + } + + this._write(Buffer.concat(buffers), 'binary', cb) + } + + function socketWriteBrowser (chunk, enc, next) { + if (socket.bufferedAmount > bufferSize) { + // throttle data until buffered amount is reduced. + setTimeout(socketWriteBrowser, bufferTimeout, chunk, enc, next) + } + + if (coerceToBuffer && typeof chunk === 'string') { + chunk = Buffer.from(chunk, 'utf8') + } + + try { + socket.send(chunk) + } catch (err) { + return next(err) + } + + next() + } + + function socketEndBrowser (done) { + socket.close() + done() + } + + // end methods for browserStreamBuilder + + return stream +} + +if (IS_BROWSER) { + module.exports = browserStreamBuilder +} else { + module.exports = streamBuilder +} + +}).call(this,require('_process'),require("buffer").Buffer) +},{"_process":44,"buffer":12,"debug":14,"duplexify":16,"readable-stream":59,"ws":67}],6:[function(require,module,exports){ +(function (Buffer){ +'use strict' + +var Transform = require('readable-stream').Transform +var duplexify = require('duplexify') + +/* global wx */ +var socketTask +var proxy +var stream + +function buildProxy () { + var proxy = new Transform() + proxy._write = function (chunk, encoding, next) { + socketTask.send({ + data: chunk.buffer, + success: function () { + next() + }, + fail: function (errMsg) { + next(new Error(errMsg)) + } + }) + } + proxy._flush = function socketEnd (done) { + socketTask.close({ + success: function () { + done() + } + }) + } + + return proxy +} + +function setDefaultOpts (opts) { + if (!opts.hostname) { + opts.hostname = 'localhost' + } + if (!opts.path) { + opts.path = '/' + } + + if (!opts.wsOptions) { + opts.wsOptions = {} + } +} + +function buildUrl (opts, client) { + var protocol = opts.protocol === 'wxs' ? 'wss' : 'ws' + var url = protocol + '://' + opts.hostname + opts.path + if (opts.port && opts.port !== 80 && opts.port !== 443) { + url = protocol + '://' + opts.hostname + ':' + opts.port + opts.path + } + if (typeof (opts.transformWsUrl) === 'function') { + url = opts.transformWsUrl(url, opts, client) + } + return url +} + +function bindEventHandler () { + socketTask.onOpen(function () { + stream.setReadable(proxy) + stream.setWritable(proxy) + stream.emit('connect') + }) + + socketTask.onMessage(function (res) { + var data = res.data + + if (data instanceof ArrayBuffer) data = Buffer.from(data) + else data = Buffer.from(data, 'utf8') + proxy.push(data) + }) + + socketTask.onClose(function () { + stream.end() + stream.destroy() + }) + + socketTask.onError(function (res) { + stream.destroy(new Error(res.errMsg)) + }) +} + +function buildStream (client, opts) { + opts.hostname = opts.hostname || opts.host + + if (!opts.hostname) { + throw new Error('Could not determine host. Specify host manually.') + } + + var websocketSubProtocol = + (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3) + ? 'mqttv3.1' + : 'mqtt' + + setDefaultOpts(opts) + + var url = buildUrl(opts, client) + socketTask = wx.connectSocket({ + url: url, + protocols: [websocketSubProtocol] + }) + + proxy = buildProxy() + stream = duplexify.obj() + stream._destroy = function (err, cb) { + socketTask.close({ + success: function () { + cb && cb(err) + } + }) + } + + var destroyRef = stream.destroy + stream.destroy = function () { + stream.destroy = destroyRef + + var self = this + setTimeout(function () { + socketTask.close({ + fail: function () { + self._destroy(new Error()) + } + }) + }, 0) + }.bind(stream) + + bindEventHandler() + + return stream +} + +module.exports = buildStream + +}).call(this,require("buffer").Buffer) +},{"buffer":12,"duplexify":16,"readable-stream":59}],7:[function(require,module,exports){ +'use strict' + +/** + * Module dependencies + */ +var xtend = require('xtend') + +var Readable = require('readable-stream').Readable +var streamsOpts = { objectMode: true } +var defaultStoreOptions = { + clean: true +} + +/** + * In-memory implementation of the message store + * This can actually be saved into files. + * + * @param {Object} [options] - store options + */ +function Store (options) { + if (!(this instanceof Store)) { + return new Store(options) + } + + this.options = options || {} + + // Defaults + this.options = xtend(defaultStoreOptions, options) + + this._inflights = new Map() +} + +/** + * Adds a packet to the store, a packet is + * anything that has a messageId property. + * + */ +Store.prototype.put = function (packet, cb) { + this._inflights.set(packet.messageId, packet) + + if (cb) { + cb() + } + + return this +} + +/** + * Creates a stream with all the packets in the store + * + */ +Store.prototype.createStream = function () { + var stream = new Readable(streamsOpts) + var destroyed = false + var values = [] + var i = 0 + + this._inflights.forEach(function (value, key) { + values.push(value) + }) + + stream._read = function () { + if (!destroyed && i < values.length) { + this.push(values[i++]) + } else { + this.push(null) + } + } + + stream.destroy = function () { + if (destroyed) { + return + } + + var self = this + + destroyed = true + + setTimeout(function () { + self.emit('close') + }, 0) + } + + return stream +} + +/** + * deletes a packet from the store. + */ +Store.prototype.del = function (packet, cb) { + packet = this._inflights.get(packet.messageId) + if (packet) { + this._inflights.delete(packet.messageId) + cb(null, packet) + } else if (cb) { + cb(new Error('missing packet')) + } + + return this +} + +/** + * get a packet from the store. + */ +Store.prototype.get = function (packet, cb) { + packet = this._inflights.get(packet.messageId) + if (packet) { + cb(null, packet) + } else if (cb) { + cb(new Error('missing packet')) + } + + return this +} + +/** + * Close the store + */ +Store.prototype.close = function (cb) { + if (this.options.clean) { + this._inflights = null + } + if (cb) { + cb() + } +} + +module.exports = Store + +},{"readable-stream":59,"xtend":68}],8:[function(require,module,exports){ +'use strict' + +/** + * Validate a topic to see if it's valid or not. + * A topic is valid if it follow below rules: + * - Rule #1: If any part of the topic is not `+` or `#`, then it must not contain `+` and '#' + * - Rule #2: Part `#` must be located at the end of the mailbox + * + * @param {String} topic - A topic + * @returns {Boolean} If the topic is valid, returns true. Otherwise, returns false. + */ +function validateTopic (topic) { + var parts = topic.split('/') + + for (var i = 0; i < parts.length; i++) { + if (parts[i] === '+') { + continue + } + + if (parts[i] === '#') { + // for Rule #2 + return i === parts.length - 1 + } + + if (parts[i].indexOf('+') !== -1 || parts[i].indexOf('#') !== -1) { + return false + } + } + + return true +} + +/** + * Validate an array of topics to see if any of them is valid or not + * @param {Array} topics - Array of topics + * @returns {String} If the topics is valid, returns null. Otherwise, returns the invalid one + */ +function validateTopics (topics) { + if (topics.length === 0) { + return 'empty_topic_list' + } + for (var i = 0; i < topics.length; i++) { + if (!validateTopic(topics[i])) { + return topics[i] + } + } + return null +} + +module.exports = { + validateTopics: validateTopics +} + +},{}],9:[function(require,module,exports){ +(function (process){ +'use strict' + +var MqttClient = require('../client') +var Store = require('../store') +var debug = require('debug')('mqttjs') + +var protocols = {} + +// eslint-disable-next-line camelcase +if ((typeof process !== 'undefined' && process.title !== 'browser') || typeof __webpack_require__ !== 'function') { + protocols.mqtt = require('./tcp') + protocols.tcp = require('./tcp') + protocols.ssl = require('./tls') + protocols.tls = require('./tls') + protocols.mqtts = require('./tls') +} else { + protocols.wx = require('./wx') + protocols.wxs = require('./wx') + + protocols.ali = require('./ali') + protocols.alis = require('./ali') +} + +protocols.ws = require('./ws') +protocols.wss = require('./ws') + +/** + * Parse the auth attribute and merge username and password in the options object. + * + * @param {Object} [opts] option object + */ +function parseAuthOptions (opts) { + var matches + if (opts.auth) { + matches = opts.auth.match(/^(.+):(.+)$/) + if (matches) { + opts.username = matches[1] + opts.password = matches[2] + } else { + opts.username = opts.auth + } + } +} + +/** + * connect - connect to an MQTT broker. + * + * @param {String} [brokerUrl] - url of the broker, optional + * @param {Object} opts - see MqttClient#constructor + */ +function connect (brokerUrl, opts) { + debug('connecting to an MQTT broker...') + if ((typeof brokerUrl === 'object') && !opts) { + opts = brokerUrl + brokerUrl = null + } + + opts = opts || {} + + if (brokerUrl) { + if (opts.protocol === null) { + throw new Error('Missing protocol') + } + var parsed = new URL(brokerUrl) + + // the URL object is a bit special, so copy individual + // items to the opts object + opts.hash = parsed.hash + opts.host = parsed.host + opts.hostname = parsed.hostname + opts.href = parsed.href + opts.origin = parsed.origin + opts.pathname = parsed.pathname + opts.port = Number(parsed.port) || null + opts.protocol = parsed.protocol + opts.username = opts.username || parsed.username || null + opts.password = opts.password || parsed.password || null + opts.search = parsed.search + opts.searchParams = parsed.searchParams + opts.path = parsed.pathname + parsed.search + opts.protocol = opts.protocol.replace(/:$/, '') + } + + // merge in the auth options if supplied + // legacy support for url.parse objects (now deprecated in node.js) + parseAuthOptions(opts) + + // support clientId passed in the query string of the url + if (opts.searchParams && typeof opts.searchParams.get('clientId') === 'string') { + opts.clientId = opts.searchParams.get('clientId') + } + + // legacy support for url.parse objects (now deprecated in node.js) + if (opts.query && typeof opts.query.clientId === 'string') { + opts.clientId = opts.query.clientId + } + + if (opts.cert && opts.key) { + if (opts.protocol) { + if (['mqtts', 'wss', 'wxs', 'alis'].indexOf(opts.protocol) === -1) { + switch (opts.protocol) { + case 'mqtt': + opts.protocol = 'mqtts' + break + case 'ws': + opts.protocol = 'wss' + break + case 'wx': + opts.protocol = 'wxs' + break + case 'ali': + opts.protocol = 'alis' + break + default: + throw new Error('Unknown protocol for secure connection: "' + opts.protocol + '"!') + } + } + } else { + // A cert and key was provided, however no protocol was specified, so we will throw an error. + throw new Error('Missing secure protocol key') + } + } + + if (!protocols[opts.protocol]) { + var isSecure = ['mqtts', 'wss'].indexOf(opts.protocol) !== -1 + opts.protocol = [ + 'mqtt', + 'mqtts', + 'ws', + 'wss', + 'wx', + 'wxs', + 'ali', + 'alis' + ].filter(function (key, index) { + if (isSecure && index % 2 === 0) { + // Skip insecure protocols when requesting a secure one. + return false + } + return (typeof protocols[key] === 'function') + })[0] + } + + if (opts.clean === false && !opts.clientId) { + throw new Error('Missing clientId for unclean clients') + } + + if (opts.protocol) { + opts.defaultProtocol = opts.protocol + } + + function wrapper (client) { + if (opts.servers) { + if (!client._reconnectCount || client._reconnectCount === opts.servers.length) { + client._reconnectCount = 0 + } + + opts.host = opts.servers[client._reconnectCount].host + opts.port = opts.servers[client._reconnectCount].port + opts.protocol = (!opts.servers[client._reconnectCount].protocol ? opts.defaultProtocol : opts.servers[client._reconnectCount].protocol) + opts.hostname = opts.host + + client._reconnectCount++ + } + + debug('calling streambuilder for', opts.protocol) + return protocols[opts.protocol](client, opts) + } + var client = new MqttClient(wrapper, opts) + client.on('error', function () { /* Automatically set up client error handling */ }) + return client +} + +module.exports = connect +module.exports.connect = connect +module.exports.MqttClient = MqttClient +module.exports.Store = Store + +}).call(this,require('_process')) +},{"../client":1,"../store":7,"./ali":2,"./tcp":3,"./tls":4,"./ws":5,"./wx":6,"_process":44,"debug":14}],10:[function(require,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +// Support decoding URL-safe base64 strings, as Node.js does. +// See: https://en.wikipedia.org/wiki/Base64#URL_applications +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function getLens (b64) { + var len = b64.length + + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // Trim off extra bytes after placeholder bytes are found + // See: https://github.com/beatgammit/base64-js/issues/42 + var validLen = b64.indexOf('=') + if (validLen === -1) validLen = len + + var placeHoldersLen = validLen === len + ? 0 + : 4 - (validLen % 4) + + return [validLen, placeHoldersLen] +} + +// base64 is 4/3 + up to two characters of the original data +function byteLength (b64) { + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function _byteLength (b64, validLen, placeHoldersLen) { + return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen +} + +function toByteArray (b64) { + var tmp + var lens = getLens(b64) + var validLen = lens[0] + var placeHoldersLen = lens[1] + + var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen)) + + var curByte = 0 + + // if there are placeholders, only get up to the last complete 4 chars + var len = placeHoldersLen > 0 + ? validLen - 4 + : validLen + + var i + for (i = 0; i < len; i += 4) { + tmp = + (revLookup[b64.charCodeAt(i)] << 18) | + (revLookup[b64.charCodeAt(i + 1)] << 12) | + (revLookup[b64.charCodeAt(i + 2)] << 6) | + revLookup[b64.charCodeAt(i + 3)] + arr[curByte++] = (tmp >> 16) & 0xFF + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 2) { + tmp = + (revLookup[b64.charCodeAt(i)] << 2) | + (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[curByte++] = tmp & 0xFF + } + + if (placeHoldersLen === 1) { + tmp = + (revLookup[b64.charCodeAt(i)] << 10) | + (revLookup[b64.charCodeAt(i + 1)] << 4) | + (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[curByte++] = (tmp >> 8) & 0xFF + arr[curByte++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + + lookup[num >> 12 & 0x3F] + + lookup[num >> 6 & 0x3F] + + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = + ((uint8[i] << 16) & 0xFF0000) + + ((uint8[i + 1] << 8) & 0xFF00) + + (uint8[i + 2] & 0xFF) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk( + uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength) + )) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + parts.push( + lookup[tmp >> 2] + + lookup[(tmp << 4) & 0x3F] + + '==' + ) + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + uint8[len - 1] + parts.push( + lookup[tmp >> 10] + + lookup[(tmp >> 4) & 0x3F] + + lookup[(tmp << 2) & 0x3F] + + '=' + ) + } + + return parts.join('') +} + +},{}],11:[function(require,module,exports){ + +},{}],12:[function(require,module,exports){ +(function (Buffer){ +/*! + * The buffer module from node.js, for the browser. + * + * @author Feross Aboukhadijeh + * @license MIT + */ +/* eslint-disable no-proto */ + +'use strict' + +var base64 = require('base64-js') +var ieee754 = require('ieee754') + +exports.Buffer = Buffer +exports.SlowBuffer = SlowBuffer +exports.INSPECT_MAX_BYTES = 50 + +var K_MAX_LENGTH = 0x7fffffff +exports.kMaxLength = K_MAX_LENGTH + +/** + * If `Buffer.TYPED_ARRAY_SUPPORT`: + * === true Use Uint8Array implementation (fastest) + * === false Print warning and recommend using `buffer` v4.x which has an Object + * implementation (most compatible, even IE6) + * + * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+, + * Opera 11.6+, iOS 4.2+. + * + * We report that the browser does not support typed arrays if the are not subclassable + * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array` + * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support + * for __proto__ and has a buggy typed array implementation. + */ +Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport() + +if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' && + typeof console.error === 'function') { + console.error( + 'This browser lacks typed array (Uint8Array) support which is required by ' + + '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.' + ) +} + +function typedArraySupport () { + // Can typed array instances can be augmented? + try { + var arr = new Uint8Array(1) + arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } } + return arr.foo() === 42 + } catch (e) { + return false + } +} + +Object.defineProperty(Buffer.prototype, 'parent', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.buffer + } +}) + +Object.defineProperty(Buffer.prototype, 'offset', { + enumerable: true, + get: function () { + if (!Buffer.isBuffer(this)) return undefined + return this.byteOffset + } +}) + +function createBuffer (length) { + if (length > K_MAX_LENGTH) { + throw new RangeError('The value "' + length + '" is invalid for option "size"') + } + // Return an augmented `Uint8Array` instance + var buf = new Uint8Array(length) + buf.__proto__ = Buffer.prototype + return buf +} + +/** + * The Buffer constructor returns instances of `Uint8Array` that have their + * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of + * `Uint8Array`, so the returned instances will have all the node `Buffer` methods + * and the `Uint8Array` methods. Square bracket notation works as expected -- it + * returns a single octet. + * + * The `Uint8Array` prototype remains unmodified. + */ + +function Buffer (arg, encodingOrOffset, length) { + // Common case. + if (typeof arg === 'number') { + if (typeof encodingOrOffset === 'string') { + throw new TypeError( + 'The "string" argument must be of type string. Received type number' + ) + } + return allocUnsafe(arg) + } + return from(arg, encodingOrOffset, length) +} + +// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97 +if (typeof Symbol !== 'undefined' && Symbol.species != null && + Buffer[Symbol.species] === Buffer) { + Object.defineProperty(Buffer, Symbol.species, { + value: null, + configurable: true, + enumerable: false, + writable: false + }) +} + +Buffer.poolSize = 8192 // not used by this implementation + +function from (value, encodingOrOffset, length) { + if (typeof value === 'string') { + return fromString(value, encodingOrOffset) + } + + if (ArrayBuffer.isView(value)) { + return fromArrayLike(value) + } + + if (value == null) { + throw TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) + } + + if (isInstance(value, ArrayBuffer) || + (value && isInstance(value.buffer, ArrayBuffer))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + + if (typeof value === 'number') { + throw new TypeError( + 'The "value" argument must not be of type number. Received type number' + ) + } + + var valueOf = value.valueOf && value.valueOf() + if (valueOf != null && valueOf !== value) { + return Buffer.from(valueOf, encodingOrOffset, length) + } + + var b = fromObject(value) + if (b) return b + + if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null && + typeof value[Symbol.toPrimitive] === 'function') { + return Buffer.from( + value[Symbol.toPrimitive]('string'), encodingOrOffset, length + ) + } + + throw new TypeError( + 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' + + 'or Array-like Object. Received type ' + (typeof value) + ) +} + +/** + * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError + * if value is a number. + * Buffer.from(str[, encoding]) + * Buffer.from(array) + * Buffer.from(buffer) + * Buffer.from(arrayBuffer[, byteOffset[, length]]) + **/ +Buffer.from = function (value, encodingOrOffset, length) { + return from(value, encodingOrOffset, length) +} + +// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug: +// https://github.com/feross/buffer/pull/148 +Buffer.prototype.__proto__ = Uint8Array.prototype +Buffer.__proto__ = Uint8Array + +function assertSize (size) { + if (typeof size !== 'number') { + throw new TypeError('"size" argument must be of type number') + } else if (size < 0) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } +} + +function alloc (size, fill, encoding) { + assertSize(size) + if (size <= 0) { + return createBuffer(size) + } + if (fill !== undefined) { + // Only pay attention to encoding if it's a string. This + // prevents accidentally sending in a number that would + // be interpretted as a start offset. + return typeof encoding === 'string' + ? createBuffer(size).fill(fill, encoding) + : createBuffer(size).fill(fill) + } + return createBuffer(size) +} + +/** + * Creates a new filled Buffer instance. + * alloc(size[, fill[, encoding]]) + **/ +Buffer.alloc = function (size, fill, encoding) { + return alloc(size, fill, encoding) +} + +function allocUnsafe (size) { + assertSize(size) + return createBuffer(size < 0 ? 0 : checked(size) | 0) +} + +/** + * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance. + * */ +Buffer.allocUnsafe = function (size) { + return allocUnsafe(size) +} +/** + * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance. + */ +Buffer.allocUnsafeSlow = function (size) { + return allocUnsafe(size) +} + +function fromString (string, encoding) { + if (typeof encoding !== 'string' || encoding === '') { + encoding = 'utf8' + } + + if (!Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + + var length = byteLength(string, encoding) | 0 + var buf = createBuffer(length) + + var actual = buf.write(string, encoding) + + if (actual !== length) { + // Writing a hex string, for example, that contains invalid characters will + // cause everything after the first invalid character to be ignored. (e.g. + // 'abxxcd' will be treated as 'ab') + buf = buf.slice(0, actual) + } + + return buf +} + +function fromArrayLike (array) { + var length = array.length < 0 ? 0 : checked(array.length) | 0 + var buf = createBuffer(length) + for (var i = 0; i < length; i += 1) { + buf[i] = array[i] & 255 + } + return buf +} + +function fromArrayBuffer (array, byteOffset, length) { + if (byteOffset < 0 || array.byteLength < byteOffset) { + throw new RangeError('"offset" is outside of buffer bounds') + } + + if (array.byteLength < byteOffset + (length || 0)) { + throw new RangeError('"length" is outside of buffer bounds') + } + + var buf + if (byteOffset === undefined && length === undefined) { + buf = new Uint8Array(array) + } else if (length === undefined) { + buf = new Uint8Array(array, byteOffset) + } else { + buf = new Uint8Array(array, byteOffset, length) + } + + // Return an augmented `Uint8Array` instance + buf.__proto__ = Buffer.prototype + return buf +} + +function fromObject (obj) { + if (Buffer.isBuffer(obj)) { + var len = checked(obj.length) | 0 + var buf = createBuffer(len) + + if (buf.length === 0) { + return buf + } + + obj.copy(buf, 0, 0, len) + return buf + } + + if (obj.length !== undefined) { + if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) { + return createBuffer(0) + } + return fromArrayLike(obj) + } + + if (obj.type === 'Buffer' && Array.isArray(obj.data)) { + return fromArrayLike(obj.data) + } +} + +function checked (length) { + // Note: cannot use `length < K_MAX_LENGTH` here because that fails when + // length is NaN (which is otherwise coerced to zero.) + if (length >= K_MAX_LENGTH) { + throw new RangeError('Attempt to allocate Buffer larger than maximum ' + + 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes') + } + return length | 0 +} + +function SlowBuffer (length) { + if (+length != length) { // eslint-disable-line eqeqeq + length = 0 + } + return Buffer.alloc(+length) +} + +Buffer.isBuffer = function isBuffer (b) { + return b != null && b._isBuffer === true && + b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false +} + +Buffer.compare = function compare (a, b) { + if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength) + if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength) + if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) { + throw new TypeError( + 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array' + ) + } + + if (a === b) return 0 + + var x = a.length + var y = b.length + + for (var i = 0, len = Math.min(x, y); i < len; ++i) { + if (a[i] !== b[i]) { + x = a[i] + y = b[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +Buffer.isEncoding = function isEncoding (encoding) { + switch (String(encoding).toLowerCase()) { + case 'hex': + case 'utf8': + case 'utf-8': + case 'ascii': + case 'latin1': + case 'binary': + case 'base64': + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return true + default: + return false + } +} + +Buffer.concat = function concat (list, length) { + if (!Array.isArray(list)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + + if (list.length === 0) { + return Buffer.alloc(0) + } + + var i + if (length === undefined) { + length = 0 + for (i = 0; i < list.length; ++i) { + length += list[i].length + } + } + + var buffer = Buffer.allocUnsafe(length) + var pos = 0 + for (i = 0; i < list.length; ++i) { + var buf = list[i] + if (isInstance(buf, Uint8Array)) { + buf = Buffer.from(buf) + } + if (!Buffer.isBuffer(buf)) { + throw new TypeError('"list" argument must be an Array of Buffers') + } + buf.copy(buffer, pos) + pos += buf.length + } + return buffer +} + +function byteLength (string, encoding) { + if (Buffer.isBuffer(string)) { + return string.length + } + if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) { + return string.byteLength + } + if (typeof string !== 'string') { + throw new TypeError( + 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' + + 'Received type ' + typeof string + ) + } + + var len = string.length + var mustMatch = (arguments.length > 2 && arguments[2] === true) + if (!mustMatch && len === 0) return 0 + + // Use a for loop to avoid recursion + var loweredCase = false + for (;;) { + switch (encoding) { + case 'ascii': + case 'latin1': + case 'binary': + return len + case 'utf8': + case 'utf-8': + return utf8ToBytes(string).length + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return len * 2 + case 'hex': + return len >>> 1 + case 'base64': + return base64ToBytes(string).length + default: + if (loweredCase) { + return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8 + } + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} +Buffer.byteLength = byteLength + +function slowToString (encoding, start, end) { + var loweredCase = false + + // No need to verify that "this.length <= MAX_UINT32" since it's a read-only + // property of a typed array. + + // This behaves neither like String nor Uint8Array in that we set start/end + // to their upper/lower bounds if the value passed is out of range. + // undefined is handled specially as per ECMA-262 6th Edition, + // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization. + if (start === undefined || start < 0) { + start = 0 + } + // Return early if start > this.length. Done here to prevent potential uint32 + // coercion fail below. + if (start > this.length) { + return '' + } + + if (end === undefined || end > this.length) { + end = this.length + } + + if (end <= 0) { + return '' + } + + // Force coersion to uint32. This will also coerce falsey/NaN values to 0. + end >>>= 0 + start >>>= 0 + + if (end <= start) { + return '' + } + + if (!encoding) encoding = 'utf8' + + while (true) { + switch (encoding) { + case 'hex': + return hexSlice(this, start, end) + + case 'utf8': + case 'utf-8': + return utf8Slice(this, start, end) + + case 'ascii': + return asciiSlice(this, start, end) + + case 'latin1': + case 'binary': + return latin1Slice(this, start, end) + + case 'base64': + return base64Slice(this, start, end) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return utf16leSlice(this, start, end) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = (encoding + '').toLowerCase() + loweredCase = true + } + } +} + +// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package) +// to detect a Buffer instance. It's not possible to use `instanceof Buffer` +// reliably in a browserify context because there could be multiple different +// copies of the 'buffer' package in use. This method works even for Buffer +// instances that were created from another copy of the `buffer` package. +// See: https://github.com/feross/buffer/issues/154 +Buffer.prototype._isBuffer = true + +function swap (b, n, m) { + var i = b[n] + b[n] = b[m] + b[m] = i +} + +Buffer.prototype.swap16 = function swap16 () { + var len = this.length + if (len % 2 !== 0) { + throw new RangeError('Buffer size must be a multiple of 16-bits') + } + for (var i = 0; i < len; i += 2) { + swap(this, i, i + 1) + } + return this +} + +Buffer.prototype.swap32 = function swap32 () { + var len = this.length + if (len % 4 !== 0) { + throw new RangeError('Buffer size must be a multiple of 32-bits') + } + for (var i = 0; i < len; i += 4) { + swap(this, i, i + 3) + swap(this, i + 1, i + 2) + } + return this +} + +Buffer.prototype.swap64 = function swap64 () { + var len = this.length + if (len % 8 !== 0) { + throw new RangeError('Buffer size must be a multiple of 64-bits') + } + for (var i = 0; i < len; i += 8) { + swap(this, i, i + 7) + swap(this, i + 1, i + 6) + swap(this, i + 2, i + 5) + swap(this, i + 3, i + 4) + } + return this +} + +Buffer.prototype.toString = function toString () { + var length = this.length + if (length === 0) return '' + if (arguments.length === 0) return utf8Slice(this, 0, length) + return slowToString.apply(this, arguments) +} + +Buffer.prototype.toLocaleString = Buffer.prototype.toString + +Buffer.prototype.equals = function equals (b) { + if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer') + if (this === b) return true + return Buffer.compare(this, b) === 0 +} + +Buffer.prototype.inspect = function inspect () { + var str = '' + var max = exports.INSPECT_MAX_BYTES + str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim() + if (this.length > max) str += ' ... ' + return '' +} + +Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) { + if (isInstance(target, Uint8Array)) { + target = Buffer.from(target, target.offset, target.byteLength) + } + if (!Buffer.isBuffer(target)) { + throw new TypeError( + 'The "target" argument must be one of type Buffer or Uint8Array. ' + + 'Received type ' + (typeof target) + ) + } + + if (start === undefined) { + start = 0 + } + if (end === undefined) { + end = target ? target.length : 0 + } + if (thisStart === undefined) { + thisStart = 0 + } + if (thisEnd === undefined) { + thisEnd = this.length + } + + if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) { + throw new RangeError('out of range index') + } + + if (thisStart >= thisEnd && start >= end) { + return 0 + } + if (thisStart >= thisEnd) { + return -1 + } + if (start >= end) { + return 1 + } + + start >>>= 0 + end >>>= 0 + thisStart >>>= 0 + thisEnd >>>= 0 + + if (this === target) return 0 + + var x = thisEnd - thisStart + var y = end - start + var len = Math.min(x, y) + + var thisCopy = this.slice(thisStart, thisEnd) + var targetCopy = target.slice(start, end) + + for (var i = 0; i < len; ++i) { + if (thisCopy[i] !== targetCopy[i]) { + x = thisCopy[i] + y = targetCopy[i] + break + } + } + + if (x < y) return -1 + if (y < x) return 1 + return 0 +} + +// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`, +// OR the last index of `val` in `buffer` at offset <= `byteOffset`. +// +// Arguments: +// - buffer - a Buffer to search +// - val - a string, Buffer, or number +// - byteOffset - an index into `buffer`; will be clamped to an int32 +// - encoding - an optional encoding, relevant is val is a string +// - dir - true for indexOf, false for lastIndexOf +function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) { + // Empty buffer means no match + if (buffer.length === 0) return -1 + + // Normalize byteOffset + if (typeof byteOffset === 'string') { + encoding = byteOffset + byteOffset = 0 + } else if (byteOffset > 0x7fffffff) { + byteOffset = 0x7fffffff + } else if (byteOffset < -0x80000000) { + byteOffset = -0x80000000 + } + byteOffset = +byteOffset // Coerce to Number. + if (numberIsNaN(byteOffset)) { + // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer + byteOffset = dir ? 0 : (buffer.length - 1) + } + + // Normalize byteOffset: negative offsets start from the end of the buffer + if (byteOffset < 0) byteOffset = buffer.length + byteOffset + if (byteOffset >= buffer.length) { + if (dir) return -1 + else byteOffset = buffer.length - 1 + } else if (byteOffset < 0) { + if (dir) byteOffset = 0 + else return -1 + } + + // Normalize val + if (typeof val === 'string') { + val = Buffer.from(val, encoding) + } + + // Finally, search either indexOf (if dir is true) or lastIndexOf + if (Buffer.isBuffer(val)) { + // Special case: looking for empty string/buffer always fails + if (val.length === 0) { + return -1 + } + return arrayIndexOf(buffer, val, byteOffset, encoding, dir) + } else if (typeof val === 'number') { + val = val & 0xFF // Search for a byte value [0-255] + if (typeof Uint8Array.prototype.indexOf === 'function') { + if (dir) { + return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset) + } else { + return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset) + } + } + return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir) + } + + throw new TypeError('val must be string, number or Buffer') +} + +function arrayIndexOf (arr, val, byteOffset, encoding, dir) { + var indexSize = 1 + var arrLength = arr.length + var valLength = val.length + + if (encoding !== undefined) { + encoding = String(encoding).toLowerCase() + if (encoding === 'ucs2' || encoding === 'ucs-2' || + encoding === 'utf16le' || encoding === 'utf-16le') { + if (arr.length < 2 || val.length < 2) { + return -1 + } + indexSize = 2 + arrLength /= 2 + valLength /= 2 + byteOffset /= 2 + } + } + + function read (buf, i) { + if (indexSize === 1) { + return buf[i] + } else { + return buf.readUInt16BE(i * indexSize) + } + } + + var i + if (dir) { + var foundIndex = -1 + for (i = byteOffset; i < arrLength; i++) { + if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) { + if (foundIndex === -1) foundIndex = i + if (i - foundIndex + 1 === valLength) return foundIndex * indexSize + } else { + if (foundIndex !== -1) i -= i - foundIndex + foundIndex = -1 + } + } + } else { + if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength + for (i = byteOffset; i >= 0; i--) { + var found = true + for (var j = 0; j < valLength; j++) { + if (read(arr, i + j) !== read(val, j)) { + found = false + break + } + } + if (found) return i + } + } + + return -1 +} + +Buffer.prototype.includes = function includes (val, byteOffset, encoding) { + return this.indexOf(val, byteOffset, encoding) !== -1 +} + +Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, true) +} + +Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) { + return bidirectionalIndexOf(this, val, byteOffset, encoding, false) +} + +function hexWrite (buf, string, offset, length) { + offset = Number(offset) || 0 + var remaining = buf.length - offset + if (!length) { + length = remaining + } else { + length = Number(length) + if (length > remaining) { + length = remaining + } + } + + var strLen = string.length + + if (length > strLen / 2) { + length = strLen / 2 + } + for (var i = 0; i < length; ++i) { + var parsed = parseInt(string.substr(i * 2, 2), 16) + if (numberIsNaN(parsed)) return i + buf[offset + i] = parsed + } + return i +} + +function utf8Write (buf, string, offset, length) { + return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length) +} + +function asciiWrite (buf, string, offset, length) { + return blitBuffer(asciiToBytes(string), buf, offset, length) +} + +function latin1Write (buf, string, offset, length) { + return asciiWrite(buf, string, offset, length) +} + +function base64Write (buf, string, offset, length) { + return blitBuffer(base64ToBytes(string), buf, offset, length) +} + +function ucs2Write (buf, string, offset, length) { + return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length) +} + +Buffer.prototype.write = function write (string, offset, length, encoding) { + // Buffer#write(string) + if (offset === undefined) { + encoding = 'utf8' + length = this.length + offset = 0 + // Buffer#write(string, encoding) + } else if (length === undefined && typeof offset === 'string') { + encoding = offset + length = this.length + offset = 0 + // Buffer#write(string, offset[, length][, encoding]) + } else if (isFinite(offset)) { + offset = offset >>> 0 + if (isFinite(length)) { + length = length >>> 0 + if (encoding === undefined) encoding = 'utf8' + } else { + encoding = length + length = undefined + } + } else { + throw new Error( + 'Buffer.write(string, encoding, offset[, length]) is no longer supported' + ) + } + + var remaining = this.length - offset + if (length === undefined || length > remaining) length = remaining + + if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) { + throw new RangeError('Attempt to write outside buffer bounds') + } + + if (!encoding) encoding = 'utf8' + + var loweredCase = false + for (;;) { + switch (encoding) { + case 'hex': + return hexWrite(this, string, offset, length) + + case 'utf8': + case 'utf-8': + return utf8Write(this, string, offset, length) + + case 'ascii': + return asciiWrite(this, string, offset, length) + + case 'latin1': + case 'binary': + return latin1Write(this, string, offset, length) + + case 'base64': + // Warning: maxLength not taken into account in base64Write + return base64Write(this, string, offset, length) + + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return ucs2Write(this, string, offset, length) + + default: + if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding) + encoding = ('' + encoding).toLowerCase() + loweredCase = true + } + } +} + +Buffer.prototype.toJSON = function toJSON () { + return { + type: 'Buffer', + data: Array.prototype.slice.call(this._arr || this, 0) + } +} + +function base64Slice (buf, start, end) { + if (start === 0 && end === buf.length) { + return base64.fromByteArray(buf) + } else { + return base64.fromByteArray(buf.slice(start, end)) + } +} + +function utf8Slice (buf, start, end) { + end = Math.min(buf.length, end) + var res = [] + + var i = start + while (i < end) { + var firstByte = buf[i] + var codePoint = null + var bytesPerSequence = (firstByte > 0xEF) ? 4 + : (firstByte > 0xDF) ? 3 + : (firstByte > 0xBF) ? 2 + : 1 + + if (i + bytesPerSequence <= end) { + var secondByte, thirdByte, fourthByte, tempCodePoint + + switch (bytesPerSequence) { + case 1: + if (firstByte < 0x80) { + codePoint = firstByte + } + break + case 2: + secondByte = buf[i + 1] + if ((secondByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F) + if (tempCodePoint > 0x7F) { + codePoint = tempCodePoint + } + } + break + case 3: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F) + if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) { + codePoint = tempCodePoint + } + } + break + case 4: + secondByte = buf[i + 1] + thirdByte = buf[i + 2] + fourthByte = buf[i + 3] + if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) { + tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F) + if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) { + codePoint = tempCodePoint + } + } + } + } + + if (codePoint === null) { + // we did not generate a valid codePoint so insert a + // replacement char (U+FFFD) and advance only 1 byte + codePoint = 0xFFFD + bytesPerSequence = 1 + } else if (codePoint > 0xFFFF) { + // encode to utf16 (surrogate pair dance) + codePoint -= 0x10000 + res.push(codePoint >>> 10 & 0x3FF | 0xD800) + codePoint = 0xDC00 | codePoint & 0x3FF + } + + res.push(codePoint) + i += bytesPerSequence + } + + return decodeCodePointsArray(res) +} + +// Based on http://stackoverflow.com/a/22747272/680742, the browser with +// the lowest limit is Chrome, with 0x10000 args. +// We go 1 magnitude less, for safety +var MAX_ARGUMENTS_LENGTH = 0x1000 + +function decodeCodePointsArray (codePoints) { + var len = codePoints.length + if (len <= MAX_ARGUMENTS_LENGTH) { + return String.fromCharCode.apply(String, codePoints) // avoid extra slice() + } + + // Decode in chunks to avoid "call stack size exceeded". + var res = '' + var i = 0 + while (i < len) { + res += String.fromCharCode.apply( + String, + codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH) + ) + } + return res +} + +function asciiSlice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i] & 0x7F) + } + return ret +} + +function latin1Slice (buf, start, end) { + var ret = '' + end = Math.min(buf.length, end) + + for (var i = start; i < end; ++i) { + ret += String.fromCharCode(buf[i]) + } + return ret +} + +function hexSlice (buf, start, end) { + var len = buf.length + + if (!start || start < 0) start = 0 + if (!end || end < 0 || end > len) end = len + + var out = '' + for (var i = start; i < end; ++i) { + out += toHex(buf[i]) + } + return out +} + +function utf16leSlice (buf, start, end) { + var bytes = buf.slice(start, end) + var res = '' + for (var i = 0; i < bytes.length; i += 2) { + res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256)) + } + return res +} + +Buffer.prototype.slice = function slice (start, end) { + var len = this.length + start = ~~start + end = end === undefined ? len : ~~end + + if (start < 0) { + start += len + if (start < 0) start = 0 + } else if (start > len) { + start = len + } + + if (end < 0) { + end += len + if (end < 0) end = 0 + } else if (end > len) { + end = len + } + + if (end < start) end = start + + var newBuf = this.subarray(start, end) + // Return an augmented `Uint8Array` instance + newBuf.__proto__ = Buffer.prototype + return newBuf +} + +/* + * Need to make sure that buffer isn't trying to write out of bounds. + */ +function checkOffset (offset, ext, length) { + if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint') + if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length') +} + +Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + + return val +} + +Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + checkOffset(offset, byteLength, this.length) + } + + var val = this[offset + --byteLength] + var mul = 1 + while (byteLength > 0 && (mul *= 0x100)) { + val += this[offset + --byteLength] * mul + } + + return val +} + +Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + return this[offset] +} + +Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return this[offset] | (this[offset + 1] << 8) +} + +Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + return (this[offset] << 8) | this[offset + 1] +} + +Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)) + + (this[offset + 3] * 0x1000000) +} + +Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] * 0x1000000) + + ((this[offset + 1] << 16) | + (this[offset + 2] << 8) | + this[offset + 3]) +} + +Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var val = this[offset] + var mul = 1 + var i = 0 + while (++i < byteLength && (mul *= 0x100)) { + val += this[offset + i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) { + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) checkOffset(offset, byteLength, this.length) + + var i = byteLength + var mul = 1 + var val = this[offset + --i] + while (i > 0 && (mul *= 0x100)) { + val += this[offset + --i] * mul + } + mul *= 0x80 + + if (val >= mul) val -= Math.pow(2, 8 * byteLength) + + return val +} + +Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 1, this.length) + if (!(this[offset] & 0x80)) return (this[offset]) + return ((0xff - this[offset] + 1) * -1) +} + +Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset] | (this[offset + 1] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 2, this.length) + var val = this[offset + 1] | (this[offset] << 8) + return (val & 0x8000) ? val | 0xFFFF0000 : val +} + +Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16) | + (this[offset + 3] << 24) +} + +Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + + return (this[offset] << 24) | + (this[offset + 1] << 16) | + (this[offset + 2] << 8) | + (this[offset + 3]) +} + +Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, true, 23, 4) +} + +Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 4, this.length) + return ieee754.read(this, offset, false, 23, 4) +} + +Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, true, 52, 8) +} + +Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) { + offset = offset >>> 0 + if (!noAssert) checkOffset(offset, 8, this.length) + return ieee754.read(this, offset, false, 52, 8) +} + +function checkInt (buf, value, offset, ext, max, min) { + if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance') + if (value > max || value < min) throw new RangeError('"value" argument is out of bounds') + if (offset + ext > buf.length) throw new RangeError('Index out of range') +} + +Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var mul = 1 + var i = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + byteLength = byteLength >>> 0 + if (!noAssert) { + var maxBytes = Math.pow(2, 8 * byteLength) - 1 + checkInt(this, value, offset, byteLength, maxBytes, 0) + } + + var i = byteLength - 1 + var mul = 1 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + this[offset + i] = (value / mul) & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0) + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset + 3] = (value >>> 24) + this[offset + 2] = (value >>> 16) + this[offset + 1] = (value >>> 8) + this[offset] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0) + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = 0 + var mul = 1 + var sub = 0 + this[offset] = value & 0xFF + while (++i < byteLength && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + var limit = Math.pow(2, (8 * byteLength) - 1) + + checkInt(this, value, offset, byteLength, limit - 1, -limit) + } + + var i = byteLength - 1 + var mul = 1 + var sub = 0 + this[offset + i] = value & 0xFF + while (--i >= 0 && (mul *= 0x100)) { + if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) { + sub = 1 + } + this[offset + i] = ((value / mul) >> 0) - sub & 0xFF + } + + return offset + byteLength +} + +Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80) + if (value < 0) value = 0xff + value + 1 + this[offset] = (value & 0xff) + return offset + 1 +} + +Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + return offset + 2 +} + +Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000) + this[offset] = (value >>> 8) + this[offset + 1] = (value & 0xff) + return offset + 2 +} + +Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + this[offset] = (value & 0xff) + this[offset + 1] = (value >>> 8) + this[offset + 2] = (value >>> 16) + this[offset + 3] = (value >>> 24) + return offset + 4 +} + +Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000) + if (value < 0) value = 0xffffffff + value + 1 + this[offset] = (value >>> 24) + this[offset + 1] = (value >>> 16) + this[offset + 2] = (value >>> 8) + this[offset + 3] = (value & 0xff) + return offset + 4 +} + +function checkIEEE754 (buf, value, offset, ext, max, min) { + if (offset + ext > buf.length) throw new RangeError('Index out of range') + if (offset < 0) throw new RangeError('Index out of range') +} + +function writeFloat (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38) + } + ieee754.write(buf, value, offset, littleEndian, 23, 4) + return offset + 4 +} + +Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) { + return writeFloat(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) { + return writeFloat(this, value, offset, false, noAssert) +} + +function writeDouble (buf, value, offset, littleEndian, noAssert) { + value = +value + offset = offset >>> 0 + if (!noAssert) { + checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308) + } + ieee754.write(buf, value, offset, littleEndian, 52, 8) + return offset + 8 +} + +Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) { + return writeDouble(this, value, offset, true, noAssert) +} + +Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) { + return writeDouble(this, value, offset, false, noAssert) +} + +// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length) +Buffer.prototype.copy = function copy (target, targetStart, start, end) { + if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer') + if (!start) start = 0 + if (!end && end !== 0) end = this.length + if (targetStart >= target.length) targetStart = target.length + if (!targetStart) targetStart = 0 + if (end > 0 && end < start) end = start + + // Copy 0 bytes; we're done + if (end === start) return 0 + if (target.length === 0 || this.length === 0) return 0 + + // Fatal error conditions + if (targetStart < 0) { + throw new RangeError('targetStart out of bounds') + } + if (start < 0 || start >= this.length) throw new RangeError('Index out of range') + if (end < 0) throw new RangeError('sourceEnd out of bounds') + + // Are we oob? + if (end > this.length) end = this.length + if (target.length - targetStart < end - start) { + end = target.length - targetStart + start + } + + var len = end - start + + if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') { + // Use built-in when available, missing from IE11 + this.copyWithin(targetStart, start, end) + } else if (this === target && start < targetStart && targetStart < end) { + // descending copy from end + for (var i = len - 1; i >= 0; --i) { + target[i + targetStart] = this[i + start] + } + } else { + Uint8Array.prototype.set.call( + target, + this.subarray(start, end), + targetStart + ) + } + + return len +} + +// Usage: +// buffer.fill(number[, offset[, end]]) +// buffer.fill(buffer[, offset[, end]]) +// buffer.fill(string[, offset[, end]][, encoding]) +Buffer.prototype.fill = function fill (val, start, end, encoding) { + // Handle string cases: + if (typeof val === 'string') { + if (typeof start === 'string') { + encoding = start + start = 0 + end = this.length + } else if (typeof end === 'string') { + encoding = end + end = this.length + } + if (encoding !== undefined && typeof encoding !== 'string') { + throw new TypeError('encoding must be a string') + } + if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) { + throw new TypeError('Unknown encoding: ' + encoding) + } + if (val.length === 1) { + var code = val.charCodeAt(0) + if ((encoding === 'utf8' && code < 128) || + encoding === 'latin1') { + // Fast path: If `val` fits into a single byte, use that numeric value. + val = code + } + } + } else if (typeof val === 'number') { + val = val & 255 + } + + // Invalid ranges are not set to a default, so can range check early. + if (start < 0 || this.length < start || this.length < end) { + throw new RangeError('Out of range index') + } + + if (end <= start) { + return this + } + + start = start >>> 0 + end = end === undefined ? this.length : end >>> 0 + + if (!val) val = 0 + + var i + if (typeof val === 'number') { + for (i = start; i < end; ++i) { + this[i] = val + } + } else { + var bytes = Buffer.isBuffer(val) + ? val + : Buffer.from(val, encoding) + var len = bytes.length + if (len === 0) { + throw new TypeError('The value "' + val + + '" is invalid for argument "value"') + } + for (i = 0; i < end - start; ++i) { + this[i + start] = bytes[i % len] + } + } + + return this +} + +// HELPER FUNCTIONS +// ================ + +var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g + +function base64clean (str) { + // Node takes equal signs as end of the Base64 encoding + str = str.split('=')[0] + // Node strips out invalid characters like \n and \t from the string, base64-js does not + str = str.trim().replace(INVALID_BASE64_RE, '') + // Node converts strings with length < 2 to '' + if (str.length < 2) return '' + // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not + while (str.length % 4 !== 0) { + str = str + '=' + } + return str +} + +function toHex (n) { + if (n < 16) return '0' + n.toString(16) + return n.toString(16) +} + +function utf8ToBytes (string, units) { + units = units || Infinity + var codePoint + var length = string.length + var leadSurrogate = null + var bytes = [] + + for (var i = 0; i < length; ++i) { + codePoint = string.charCodeAt(i) + + // is surrogate component + if (codePoint > 0xD7FF && codePoint < 0xE000) { + // last char was a lead + if (!leadSurrogate) { + // no lead yet + if (codePoint > 0xDBFF) { + // unexpected trail + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } else if (i + 1 === length) { + // unpaired lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + continue + } + + // valid lead + leadSurrogate = codePoint + + continue + } + + // 2 leads in a row + if (codePoint < 0xDC00) { + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + leadSurrogate = codePoint + continue + } + + // valid surrogate pair + codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000 + } else if (leadSurrogate) { + // valid bmp char, but last char was a lead + if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD) + } + + leadSurrogate = null + + // encode utf8 + if (codePoint < 0x80) { + if ((units -= 1) < 0) break + bytes.push(codePoint) + } else if (codePoint < 0x800) { + if ((units -= 2) < 0) break + bytes.push( + codePoint >> 0x6 | 0xC0, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x10000) { + if ((units -= 3) < 0) break + bytes.push( + codePoint >> 0xC | 0xE0, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else if (codePoint < 0x110000) { + if ((units -= 4) < 0) break + bytes.push( + codePoint >> 0x12 | 0xF0, + codePoint >> 0xC & 0x3F | 0x80, + codePoint >> 0x6 & 0x3F | 0x80, + codePoint & 0x3F | 0x80 + ) + } else { + throw new Error('Invalid code point') + } + } + + return bytes +} + +function asciiToBytes (str) { + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + // Node's code seems to be doing this and not & 0x7F.. + byteArray.push(str.charCodeAt(i) & 0xFF) + } + return byteArray +} + +function utf16leToBytes (str, units) { + var c, hi, lo + var byteArray = [] + for (var i = 0; i < str.length; ++i) { + if ((units -= 2) < 0) break + + c = str.charCodeAt(i) + hi = c >> 8 + lo = c % 256 + byteArray.push(lo) + byteArray.push(hi) + } + + return byteArray +} + +function base64ToBytes (str) { + return base64.toByteArray(base64clean(str)) +} + +function blitBuffer (src, dst, offset, length) { + for (var i = 0; i < length; ++i) { + if ((i + offset >= dst.length) || (i >= src.length)) break + dst[i + offset] = src[i] + } + return i +} + +// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass +// the `instanceof` check but they should be treated as of that type. +// See: https://github.com/feross/buffer/issues/166 +function isInstance (obj, type) { + return obj instanceof type || + (obj != null && obj.constructor != null && obj.constructor.name != null && + obj.constructor.name === type.name) +} +function numberIsNaN (obj) { + // For IE11 support + return obj !== obj // eslint-disable-line no-self-compare +} + +}).call(this,require("buffer").Buffer) +},{"base64-js":10,"buffer":12,"ieee754":28}],13:[function(require,module,exports){ +(function (Buffer){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. + +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = Buffer.isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + +}).call(this,{"isBuffer":require("../../is-buffer/index.js")}) +},{"../../is-buffer/index.js":30}],14:[function(require,module,exports){ +(function (process){ +/* eslint-env browser */ + +/** + * This is the web browser implementation of `debug()`. + */ + +exports.log = log; +exports.formatArgs = formatArgs; +exports.save = save; +exports.load = load; +exports.useColors = useColors; +exports.storage = localstorage(); + +/** + * Colors. + */ + +exports.colors = [ + '#0000CC', + '#0000FF', + '#0033CC', + '#0033FF', + '#0066CC', + '#0066FF', + '#0099CC', + '#0099FF', + '#00CC00', + '#00CC33', + '#00CC66', + '#00CC99', + '#00CCCC', + '#00CCFF', + '#3300CC', + '#3300FF', + '#3333CC', + '#3333FF', + '#3366CC', + '#3366FF', + '#3399CC', + '#3399FF', + '#33CC00', + '#33CC33', + '#33CC66', + '#33CC99', + '#33CCCC', + '#33CCFF', + '#6600CC', + '#6600FF', + '#6633CC', + '#6633FF', + '#66CC00', + '#66CC33', + '#9900CC', + '#9900FF', + '#9933CC', + '#9933FF', + '#99CC00', + '#99CC33', + '#CC0000', + '#CC0033', + '#CC0066', + '#CC0099', + '#CC00CC', + '#CC00FF', + '#CC3300', + '#CC3333', + '#CC3366', + '#CC3399', + '#CC33CC', + '#CC33FF', + '#CC6600', + '#CC6633', + '#CC9900', + '#CC9933', + '#CCCC00', + '#CCCC33', + '#FF0000', + '#FF0033', + '#FF0066', + '#FF0099', + '#FF00CC', + '#FF00FF', + '#FF3300', + '#FF3333', + '#FF3366', + '#FF3399', + '#FF33CC', + '#FF33FF', + '#FF6600', + '#FF6633', + '#FF9900', + '#FF9933', + '#FFCC00', + '#FFCC33' +]; + +/** + * Currently only WebKit-based Web Inspectors, Firefox >= v31, + * and the Firebug extension (any Firefox version) are known + * to support "%c" CSS customizations. + * + * TODO: add a `localStorage` variable to explicitly enable/disable colors + */ + +// eslint-disable-next-line complexity +function useColors() { + // NB: In an Electron preload script, document will be defined but not fully + // initialized. Since we know we're in Chrome, we'll just detect this case + // explicitly + if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { + return true; + } + + // Internet Explorer and Edge do not support colors. + if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + + // Is webkit? http://stackoverflow.com/a/16459606/376773 + // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 + return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || + // Is firebug? http://stackoverflow.com/a/398120/376773 + (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || + // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || + // Double check webkit in userAgent just in case we are in a worker + (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); +} + +/** + * Colorize log arguments if enabled. + * + * @api public + */ + +function formatArgs(args) { + args[0] = (this.useColors ? '%c' : '') + + this.namespace + + (this.useColors ? ' %c' : ' ') + + args[0] + + (this.useColors ? '%c ' : ' ') + + '+' + module.exports.humanize(this.diff); + + if (!this.useColors) { + return; + } + + const c = 'color: ' + this.color; + args.splice(1, 0, c, 'color: inherit'); + + // The final "%c" is somewhat tricky, because there could be other + // arguments passed either before or after the %c, so we need to + // figure out the correct index to insert the CSS into + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, match => { + if (match === '%%') { + return; + } + index++; + if (match === '%c') { + // We only are interested in the *last* %c + // (the user may have provided their own) + lastC = index; + } + }); + + args.splice(lastC, 0, c); +} + +/** + * Invokes `console.log()` when available. + * No-op when `console.log` is not a "function". + * + * @api public + */ +function log(...args) { + // This hackery is required for IE8/9, where + // the `console.log` function doesn't have 'apply' + return typeof console === 'object' && + console.log && + console.log(...args); +} + +/** + * Save `namespaces`. + * + * @param {String} namespaces + * @api private + */ +function save(namespaces) { + try { + if (namespaces) { + exports.storage.setItem('debug', namespaces); + } else { + exports.storage.removeItem('debug'); + } + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +/** + * Load `namespaces`. + * + * @return {String} returns the previously persisted debug modes + * @api private + */ +function load() { + let r; + try { + r = exports.storage.getItem('debug'); + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } + + // If debug isn't set in LS, and we're in Electron, try to load $DEBUG + if (!r && typeof process !== 'undefined' && 'env' in process) { + r = process.env.DEBUG; + } + + return r; +} + +/** + * Localstorage attempts to return the localstorage. + * + * This is necessary because safari throws + * when a user disables cookies/localstorage + * and you attempt to access it. + * + * @return {LocalStorage} + * @api private + */ + +function localstorage() { + try { + // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context + // The Browser also has localStorage in the global context. + return localStorage; + } catch (error) { + // Swallow + // XXX (@Qix-) should we be logging these? + } +} + +module.exports = require('./common')(exports); + +const {formatters} = module.exports; + +/** + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. + */ + +formatters.j = function (v) { + try { + return JSON.stringify(v); + } catch (error) { + return '[UnexpectedJSONParseError]: ' + error.message; + } +}; + +}).call(this,require('_process')) +},{"./common":15,"_process":44}],15:[function(require,module,exports){ + +/** + * This is the common logic for both the Node.js and web browser + * implementations of `debug()`. + */ + +function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require('ms'); + + Object.keys(env).forEach(key => { + createDebug[key] = env[key]; + }); + + /** + * Active `debug` instances. + */ + createDebug.instances = []; + + /** + * The currently active debug mode names, and names to skip. + */ + + createDebug.names = []; + createDebug.skips = []; + + /** + * Map of special "%n" handling functions, for the debug "format" argument. + * + * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". + */ + createDebug.formatters = {}; + + /** + * Selects a color for a debug namespace + * @param {String} namespace The namespace string for the for the debug instance to be colored + * @return {Number|String} An ANSI color code for the given namespace + * @api private + */ + function selectColor(namespace) { + let hash = 0; + + for (let i = 0; i < namespace.length; i++) { + hash = ((hash << 5) - hash) + namespace.charCodeAt(i); + hash |= 0; // Convert to 32bit integer + } + + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + + /** + * Create a debugger with the given `namespace`. + * + * @param {String} namespace + * @return {Function} + * @api public + */ + function createDebug(namespace) { + let prevTime; + + function debug(...args) { + // Disabled? + if (!debug.enabled) { + return; + } + + const self = debug; + + // Set `diff` timestamp + const curr = Number(new Date()); + const ms = curr - (prevTime || curr); + self.diff = ms; + self.prev = prevTime; + self.curr = curr; + prevTime = curr; + + args[0] = createDebug.coerce(args[0]); + + if (typeof args[0] !== 'string') { + // Anything else let's inspect with %O + args.unshift('%O'); + } + + // Apply any `formatters` transformations + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + // If we encounter an escaped % then don't increase the array index + if (match === '%%') { + return match; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === 'function') { + const val = args[index]; + match = formatter.call(self, val); + + // Now we need to remove `args[index]` since it's inlined in the `format` + args.splice(index, 1); + index--; + } + return match; + }); + + // Apply env-specific formatting (colors, etc.) + createDebug.formatArgs.call(self, args); + + const logFn = self.log || createDebug.log; + logFn.apply(self, args); + } + + debug.namespace = namespace; + debug.enabled = createDebug.enabled(namespace); + debug.useColors = createDebug.useColors(); + debug.color = selectColor(namespace); + debug.destroy = destroy; + debug.extend = extend; + // Debug.formatArgs = formatArgs; + // debug.rawLog = rawLog; + + // env-specific initialization logic for debug instances + if (typeof createDebug.init === 'function') { + createDebug.init(debug); + } + + createDebug.instances.push(debug); + + return debug; + } + + function destroy() { + const index = createDebug.instances.indexOf(this); + if (index !== -1) { + createDebug.instances.splice(index, 1); + return true; + } + return false; + } + + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + + /** + * Enables a debug mode by namespaces. This can include modes + * separated by a colon and wildcards. + * + * @param {String} namespaces + * @api public + */ + function enable(namespaces) { + createDebug.save(namespaces); + + createDebug.names = []; + createDebug.skips = []; + + let i; + const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); + const len = split.length; + + for (i = 0; i < len; i++) { + if (!split[i]) { + // ignore empty strings + continue; + } + + namespaces = split[i].replace(/\*/g, '.*?'); + + if (namespaces[0] === '-') { + createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); + } else { + createDebug.names.push(new RegExp('^' + namespaces + '$')); + } + } + + for (i = 0; i < createDebug.instances.length; i++) { + const instance = createDebug.instances[i]; + instance.enabled = createDebug.enabled(instance.namespace); + } + } + + /** + * Disable debug output. + * + * @return {String} namespaces + * @api public + */ + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) + ].join(','); + createDebug.enable(''); + return namespaces; + } + + /** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + function enabled(name) { + if (name[name.length - 1] === '*') { + return true; + } + + let i; + let len; + + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + + return false; + } + + /** + * Convert regexp to namespace + * + * @param {RegExp} regxep + * @return {String} namespace + * @api private + */ + function toNamespace(regexp) { + return regexp.toString() + .substring(2, regexp.toString().length - 2) + .replace(/\.\*\?$/, '*'); + } + + /** + * Coerce `val`. + * + * @param {Mixed} val + * @return {Mixed} + * @api private + */ + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + + createDebug.enable(createDebug.load()); + + return createDebug; +} + +module.exports = setup; + +},{"ms":41}],16:[function(require,module,exports){ +(function (process,Buffer){ +var stream = require('readable-stream') +var eos = require('end-of-stream') +var inherits = require('inherits') +var shift = require('stream-shift') + +var SIGNAL_FLUSH = (Buffer.from && Buffer.from !== Uint8Array.from) + ? Buffer.from([0]) + : new Buffer([0]) + +var onuncork = function(self, fn) { + if (self._corked) self.once('uncork', fn) + else fn() +} + +var autoDestroy = function (self, err) { + if (self._autoDestroy) self.destroy(err) +} + +var destroyer = function(self, end) { + return function(err) { + if (err) autoDestroy(self, err.message === 'premature close' ? null : err) + else if (end && !self._ended) self.end() + } +} + +var end = function(ws, fn) { + if (!ws) return fn() + if (ws._writableState && ws._writableState.finished) return fn() + if (ws._writableState) return ws.end(fn) + ws.end() + fn() +} + +var toStreams2 = function(rs) { + return new (stream.Readable)({objectMode:true, highWaterMark:16}).wrap(rs) +} + +var Duplexify = function(writable, readable, opts) { + if (!(this instanceof Duplexify)) return new Duplexify(writable, readable, opts) + stream.Duplex.call(this, opts) + + this._writable = null + this._readable = null + this._readable2 = null + + this._autoDestroy = !opts || opts.autoDestroy !== false + this._forwardDestroy = !opts || opts.destroy !== false + this._forwardEnd = !opts || opts.end !== false + this._corked = 1 // start corked + this._ondrain = null + this._drained = false + this._forwarding = false + this._unwrite = null + this._unread = null + this._ended = false + + this.destroyed = false + + if (writable) this.setWritable(writable) + if (readable) this.setReadable(readable) +} + +inherits(Duplexify, stream.Duplex) + +Duplexify.obj = function(writable, readable, opts) { + if (!opts) opts = {} + opts.objectMode = true + opts.highWaterMark = 16 + return new Duplexify(writable, readable, opts) +} + +Duplexify.prototype.cork = function() { + if (++this._corked === 1) this.emit('cork') +} + +Duplexify.prototype.uncork = function() { + if (this._corked && --this._corked === 0) this.emit('uncork') +} + +Duplexify.prototype.setWritable = function(writable) { + if (this._unwrite) this._unwrite() + + if (this.destroyed) { + if (writable && writable.destroy) writable.destroy() + return + } + + if (writable === null || writable === false) { + this.end() + return + } + + var self = this + var unend = eos(writable, {writable:true, readable:false}, destroyer(this, this._forwardEnd)) + + var ondrain = function() { + var ondrain = self._ondrain + self._ondrain = null + if (ondrain) ondrain() + } + + var clear = function() { + self._writable.removeListener('drain', ondrain) + unend() + } + + if (this._unwrite) process.nextTick(ondrain) // force a drain on stream reset to avoid livelocks + + this._writable = writable + this._writable.on('drain', ondrain) + this._unwrite = clear + + this.uncork() // always uncork setWritable +} + +Duplexify.prototype.setReadable = function(readable) { + if (this._unread) this._unread() + + if (this.destroyed) { + if (readable && readable.destroy) readable.destroy() + return + } + + if (readable === null || readable === false) { + this.push(null) + this.resume() + return + } + + var self = this + var unend = eos(readable, {writable:false, readable:true}, destroyer(this)) + + var onreadable = function() { + self._forward() + } + + var onend = function() { + self.push(null) + } + + var clear = function() { + self._readable2.removeListener('readable', onreadable) + self._readable2.removeListener('end', onend) + unend() + } + + this._drained = true + this._readable = readable + this._readable2 = readable._readableState ? readable : toStreams2(readable) + this._readable2.on('readable', onreadable) + this._readable2.on('end', onend) + this._unread = clear + + this._forward() +} + +Duplexify.prototype._read = function() { + this._drained = true + this._forward() +} + +Duplexify.prototype._forward = function() { + if (this._forwarding || !this._readable2 || !this._drained) return + this._forwarding = true + + var data + + while (this._drained && (data = shift(this._readable2)) !== null) { + if (this.destroyed) continue + this._drained = this.push(data) + } + + this._forwarding = false +} + +Duplexify.prototype.destroy = function(err) { + if (this.destroyed) return + this.destroyed = true + + var self = this + process.nextTick(function() { + self._destroy(err) + }) +} + +Duplexify.prototype._destroy = function(err) { + if (err) { + var ondrain = this._ondrain + this._ondrain = null + if (ondrain) ondrain(err) + else this.emit('error', err) + } + + if (this._forwardDestroy) { + if (this._readable && this._readable.destroy) this._readable.destroy() + if (this._writable && this._writable.destroy) this._writable.destroy() + } + + this.emit('close') +} + +Duplexify.prototype._write = function(data, enc, cb) { + if (this.destroyed) return cb() + if (this._corked) return onuncork(this, this._write.bind(this, data, enc, cb)) + if (data === SIGNAL_FLUSH) return this._finish(cb) + if (!this._writable) return cb() + + if (this._writable.write(data) === false) this._ondrain = cb + else cb() +} + +Duplexify.prototype._finish = function(cb) { + var self = this + this.emit('preend') + onuncork(this, function() { + end(self._forwardEnd && self._writable, function() { + // haxx to not emit prefinish twice + if (self._writableState.prefinished === false) self._writableState.prefinished = true + self.emit('prefinish') + onuncork(self, cb) + }) + }) +} + +Duplexify.prototype.end = function(data, enc, cb) { + if (typeof data === 'function') return this.end(null, null, data) + if (typeof enc === 'function') return this.end(data, null, enc) + this._ended = true + if (data) this.write(data) + if (!this._writableState.ending) this.write(SIGNAL_FLUSH) + return stream.Writable.prototype.end.call(this, cb) +} + +module.exports = Duplexify + +}).call(this,require('_process'),require("buffer").Buffer) +},{"_process":44,"buffer":12,"end-of-stream":26,"inherits":29,"readable-stream":25,"stream-shift":62}],17:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/**/ + +module.exports = Duplex; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // avoid scope creep, the keys array can then be collected + var keys = objectKeys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + pna.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); + +Duplex.prototype._destroy = function (err, cb) { + this.push(null); + this.end(); + + pna.nextTick(cb, err); +}; +},{"./_stream_readable":19,"./_stream_writable":21,"core-util-is":13,"inherits":29,"process-nextick-args":43}],18:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":20,"core-util-is":13,"inherits":29}],19:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + +/**/ +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; + +/**/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/**/ + +var BufferList = require('./internal/streams/BufferList'); +var destroyImpl = require('./internal/streams/destroy'); +var StringDecoder; + +util.inherits(Readable, Stream); + +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); + + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var readableHwm = options.readableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // has it been destroyed + this.destroyed = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + get: function () { + if (this._readableState === undefined) { + return false; + } + return this._readableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._readableState.destroyed = value; + } +}); + +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; +Readable.prototype._destroy = function (err, cb) { + this.push(null); + cb(err); +}; + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + var state = stream._readableState; + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); + } else if (state.ended) { + stream.emit('error', new Error('stream.push() after EOF')); + } else { + state.reading = false; + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + } + } + + return needMoreData(state); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + pna.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('_read() is not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { hasUnpiped: false }; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, unpipeInfo); + }return this; + } + + // try to find the right one. + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this, unpipeInfo); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + pna.nextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + pna.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + this._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._readableState.highWaterMark; + } +}); + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = Buffer.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + pna.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./_stream_duplex":17,"./internal/streams/BufferList":22,"./internal/streams/destroy":23,"./internal/streams/stream":24,"_process":44,"core-util-is":13,"events":27,"inherits":29,"isarray":31,"process-nextick-args":43,"safe-buffer":61,"string_decoder/":63,"util":11}],20:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) { + return this.emit('error', new Error('write callback called multiple times')); + } + + ts.writechunk = null; + ts.writecb = null; + + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + + cb(er); + + var rs = this._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + // When the writable side finishes, then flush out anything remaining. + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function') { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('_transform() is not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + var _this2 = this; + + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + _this2.emit('close'); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); + + if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +} +},{"./_stream_duplex":17,"core-util-is":13,"inherits":29}],21:[function(require,module,exports){ +(function (process,global,setImmediate){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +module.exports = Writable; + +/* */ +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; +/**/ + +/**/ +var Duplex; +/**/ + +Writable.WritableState = WritableState; + +/**/ +var util = Object.create(require('core-util-is')); +util.inherits = require('inherits'); +/**/ + +/**/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ +var Stream = require('./internal/streams/stream'); +/**/ + +/**/ + +var Buffer = require('safe-buffer').Buffer; +var OurUint8Array = global.Uint8Array || function () {}; +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +/**/ + +var destroyImpl = require('./internal/streams/destroy'); + +util.inherits(Writable, Stream); + +function nop() {} + +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + var isDuplex = stream instanceof Duplex; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var writableHwm = options.writableHighWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + + if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; + + // cast to ints. + this.highWaterMark = Math.floor(this.highWaterMark); + + // if _final has been called + this.finalCalled = false; + + // drain event flag. + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // has it been destroyed + this.destroyed = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); + +// Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. +var realHasInstance; +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function (object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function (object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { + return new Writable(options); + } + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + + if (typeof options.destroy === 'function') this._destroy = options.destroy; + + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + pna.nextTick(cb, er); +} + +// Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + pna.nextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function () { + return this._writableState.highWaterMark; + } +}); + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + pna.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + pna.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /**/ + asyncWrite(afterWrite, stream, state, finished, cb); + /**/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + var allBuffers = true; + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + buffer.allBuffers = allBuffers; + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('_write() is not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + if (err) { + stream.emit('error', err); + } + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function') { + state.pendingcb++; + state.finalCalled = true; + pna.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + prefinish(stream, state); + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = corkReq; + } else { + state.corkedRequestsFree = corkReq; + } +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + get: function () { + if (this._writableState === undefined) { + return false; + } + return this._writableState.destroyed; + }, + set: function (value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } + + // backward compatibility, the user is explicitly + // managing destroyed + this._writableState.destroyed = value; + } +}); + +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; +Writable.prototype._destroy = function (err, cb) { + this.end(); + cb(err); +}; +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate) +},{"./_stream_duplex":17,"./internal/streams/destroy":23,"./internal/streams/stream":24,"_process":44,"core-util-is":13,"inherits":29,"process-nextick-args":43,"safe-buffer":61,"timers":64,"util-deprecate":65}],22:[function(require,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var Buffer = require('safe-buffer').Buffer; +var util = require('util'); + +function copyBuffer(src, target, offset) { + src.copy(target, offset); +} + +module.exports = function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + BufferList.prototype.push = function push(v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + }; + + BufferList.prototype.unshift = function unshift(v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + }; + + BufferList.prototype.shift = function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + }; + + BufferList.prototype.clear = function clear() { + this.head = this.tail = null; + this.length = 0; + }; + + BufferList.prototype.join = function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; + }; + + BufferList.prototype.concat = function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + if (this.length === 1) return this.head.data; + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + return ret; + }; + + return BufferList; +}(); + +if (util && util.inspect && util.inspect.custom) { + module.exports.prototype[util.inspect.custom] = function () { + var obj = util.inspect({ length: this.length }); + return this.constructor.name + ' ' + obj; + }; +} +},{"safe-buffer":61,"util":11}],23:[function(require,module,exports){ +'use strict'; + +/**/ + +var pna = require('process-nextick-args'); +/**/ + +// undocumented cb() API, needed for core, not for public API +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { + pna.nextTick(emitErrorNT, this, err); + } + return this; + } + + // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + if (this._readableState) { + this._readableState.destroyed = true; + } + + // if this is a duplex stream mark the writable part as destroyed as well + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + pna.nextTick(emitErrorNT, _this, err); + if (_this._writableState) { + _this._writableState.errorEmitted = true; + } + } else if (cb) { + cb(err); + } + }); + + return this; +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy +}; +},{"process-nextick-args":43}],24:[function(require,module,exports){ +module.exports = require('events').EventEmitter; + +},{"events":27}],25:[function(require,module,exports){ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +},{"./lib/_stream_duplex.js":17,"./lib/_stream_passthrough.js":18,"./lib/_stream_readable.js":19,"./lib/_stream_transform.js":20,"./lib/_stream_writable.js":21}],26:[function(require,module,exports){ +(function (process){ +var once = require('once'); + +var noop = function() {}; + +var isRequest = function(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +}; + +var isChildProcess = function(stream) { + return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 +}; + +var eos = function(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + + callback = once(callback || noop); + + var ws = stream._writableState; + var rs = stream._readableState; + var readable = opts.readable || (opts.readable !== false && stream.readable); + var writable = opts.writable || (opts.writable !== false && stream.writable); + var cancelled = false; + + var onlegacyfinish = function() { + if (!stream.writable) onfinish(); + }; + + var onfinish = function() { + writable = false; + if (!readable) callback.call(stream); + }; + + var onend = function() { + readable = false; + if (!writable) callback.call(stream); + }; + + var onexit = function(exitCode) { + callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); + }; + + var onerror = function(err) { + callback.call(stream, err); + }; + + var onclose = function() { + process.nextTick(onclosenexttick); + }; + + var onclosenexttick = function() { + if (cancelled) return; + if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close')); + if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close')); + }; + + var onrequest = function() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest(); + else stream.on('request', onrequest); + } else if (writable && !ws) { // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + if (isChildProcess(stream)) stream.on('exit', onexit); + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + + return function() { + cancelled = true; + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('exit', onexit); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +}; + +module.exports = eos; + +}).call(this,require('_process')) +},{"_process":44,"once":42}],27:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var objectCreate = Object.create || objectCreatePolyfill +var objectKeys = Object.keys || objectKeysPolyfill +var bind = Function.prototype.bind || functionBindPolyfill + +function EventEmitter() { + if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) { + this._events = objectCreate(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +var hasDefineProperty; +try { + var o = {}; + if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 }); + hasDefineProperty = o.x === 0; +} catch (err) { hasDefineProperty = false } +if (hasDefineProperty) { + Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + // check whether the input is a positive number (whose value is zero or + // greater and not a NaN). + if (typeof arg !== 'number' || arg < 0 || arg !== arg) + throw new TypeError('"defaultMaxListeners" must be a positive number'); + defaultMaxListeners = arg; + } + }); +} else { + EventEmitter.defaultMaxListeners = defaultMaxListeners; +} + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || isNaN(n)) + throw new TypeError('"n" argument must be a positive number'); + this._maxListeners = n; + return this; +}; + +function $getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return $getMaxListeners(this); +}; + +// These standalone emit* functions are used to optimize calling of event +// handlers for fast cases because emit() itself often has a variable number of +// arguments and can be deoptimized because of that. These functions always have +// the same number of arguments and thus do not get deoptimized, so the code +// inside them can execute faster. +function emitNone(handler, isFn, self) { + if (isFn) + handler.call(self); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self); + } +} +function emitOne(handler, isFn, self, arg1) { + if (isFn) + handler.call(self, arg1); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1); + } +} +function emitTwo(handler, isFn, self, arg1, arg2) { + if (isFn) + handler.call(self, arg1, arg2); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2); + } +} +function emitThree(handler, isFn, self, arg1, arg2, arg3) { + if (isFn) + handler.call(self, arg1, arg2, arg3); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].call(self, arg1, arg2, arg3); + } +} + +function emitMany(handler, isFn, self, args) { + if (isFn) + handler.apply(self, args); + else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + listeners[i].apply(self, args); + } +} + +EventEmitter.prototype.emit = function emit(type) { + var er, handler, len, args, i, events; + var doError = (type === 'error'); + + events = this._events; + if (events) + doError = (doError && events.error == null); + else if (!doError) + return false; + + // If there is no 'error' event listener then throw. + if (doError) { + if (arguments.length > 1) + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Unhandled "error" event. (' + er + ')'); + err.context = er; + throw err; + } + return false; + } + + handler = events[type]; + + if (!handler) + return false; + + var isFn = typeof handler === 'function'; + len = arguments.length; + switch (len) { + // fast cases + case 1: + emitNone(handler, isFn, this); + break; + case 2: + emitOne(handler, isFn, this, arguments[1]); + break; + case 3: + emitTwo(handler, isFn, this, arguments[1], arguments[2]); + break; + case 4: + emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]); + break; + // slower + default: + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + emitMany(handler, isFn, this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = target._events; + if (!events) { + events = target._events = objectCreate(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener) { + target.emit('newListener', type, + listener.listener ? listener.listener : listener); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (!existing) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = + prepend ? [listener, existing] : [existing, listener]; + } else { + // If we've already got an array, just append. + if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + } + + // Check for listener leak + if (!existing.warned) { + m = $getMaxListeners(target); + if (m && m > 0 && existing.length > m) { + existing.warned = true; + var w = new Error('Possible EventEmitter memory leak detected. ' + + existing.length + ' "' + String(type) + '" listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit.'); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + if (typeof console === 'object' && console.warn) { + console.warn('%s: %s', w.name, w.message); + } + } + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = + function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + switch (arguments.length) { + case 0: + return this.listener.call(this.target); + case 1: + return this.listener.call(this.target, arguments[0]); + case 2: + return this.listener.call(this.target, arguments[0], arguments[1]); + case 3: + return this.listener.call(this.target, arguments[0], arguments[1], + arguments[2]); + default: + var args = new Array(arguments.length); + for (var i = 0; i < args.length; ++i) + args[i] = arguments[i]; + this.listener.apply(this.target, args); + } + } +} + +function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; + var wrapped = bind.call(onceWrapper, state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = + function prependOnceListener(type, listener) { + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = + function removeListener(type, listener) { + var list, events, position, i, originalListener; + + if (typeof listener !== 'function') + throw new TypeError('"listener" argument must be a function'); + + events = this._events; + if (!events) + return this; + + list = events[type]; + if (!list) + return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) + return this; + + if (position === 0) + list.shift(); + else + spliceOne(list, position); + + if (list.length === 1) + events[type] = list[0]; + + if (events.removeListener) + this.emit('removeListener', type, originalListener || listener); + } + + return this; + }; + +EventEmitter.prototype.removeAllListeners = + function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (!events) + return this; + + // not listening for removeListener, no need to emit + if (!events.removeListener) { + if (arguments.length === 0) { + this._events = objectCreate(null); + this._eventsCount = 0; + } else if (events[type]) { + if (--this._eventsCount === 0) + this._events = objectCreate(null); + else + delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = objectKeys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = objectCreate(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (!events) + return []; + + var evlistener = events[type]; + if (!evlistener) + return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : []; +}; + +// About 1.5x faster than the two-arg version of Array#splice(). +function spliceOne(list, index) { + for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1) + list[i] = list[k]; + list.pop(); +} + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function objectCreatePolyfill(proto) { + var F = function() {}; + F.prototype = proto; + return new F; +} +function objectKeysPolyfill(obj) { + var keys = []; + for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) { + keys.push(k); + } + return k; +} +function functionBindPolyfill(context) { + var fn = this; + return function () { + return fn.apply(context, arguments); + }; +} + +},{}],28:[function(require,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = (nBytes * 8) - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = ((value * c) - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],29:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }) + } + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } + } +} + +},{}],30:[function(require,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],31:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + +},{}],32:[function(require,module,exports){ +(function (Buffer){ +/* Protocol - protocol constants */ +const protocol = module.exports + +/* Command code => mnemonic */ +protocol.types = { + 0: 'reserved', + 1: 'connect', + 2: 'connack', + 3: 'publish', + 4: 'puback', + 5: 'pubrec', + 6: 'pubrel', + 7: 'pubcomp', + 8: 'subscribe', + 9: 'suback', + 10: 'unsubscribe', + 11: 'unsuback', + 12: 'pingreq', + 13: 'pingresp', + 14: 'disconnect', + 15: 'auth' +} + +/* Mnemonic => Command code */ +protocol.codes = {} +for (const k in protocol.types) { + const v = protocol.types[k] + protocol.codes[v] = k +} + +/* Header */ +protocol.CMD_SHIFT = 4 +protocol.CMD_MASK = 0xF0 +protocol.DUP_MASK = 0x08 +protocol.QOS_MASK = 0x03 +protocol.QOS_SHIFT = 1 +protocol.RETAIN_MASK = 0x01 + +/* Length */ +protocol.VARBYTEINT_MASK = 0x7F +protocol.VARBYTEINT_FIN_MASK = 0x80 + +/* Connack */ +protocol.SESSIONPRESENT_MASK = 0x01 +protocol.SESSIONPRESENT_HEADER = Buffer.from([protocol.SESSIONPRESENT_MASK]) +protocol.CONNACK_HEADER = Buffer.from([protocol.codes.connack << protocol.CMD_SHIFT]) + +/* Connect */ +protocol.USERNAME_MASK = 0x80 +protocol.PASSWORD_MASK = 0x40 +protocol.WILL_RETAIN_MASK = 0x20 +protocol.WILL_QOS_MASK = 0x18 +protocol.WILL_QOS_SHIFT = 3 +protocol.WILL_FLAG_MASK = 0x04 +protocol.CLEAN_SESSION_MASK = 0x02 +protocol.CONNECT_HEADER = Buffer.from([protocol.codes.connect << protocol.CMD_SHIFT]) + +/* Properties */ +protocol.properties = { + sessionExpiryInterval: 17, + willDelayInterval: 24, + receiveMaximum: 33, + maximumPacketSize: 39, + topicAliasMaximum: 34, + requestResponseInformation: 25, + requestProblemInformation: 23, + userProperties: 38, + authenticationMethod: 21, + authenticationData: 22, + payloadFormatIndicator: 1, + messageExpiryInterval: 2, + contentType: 3, + responseTopic: 8, + correlationData: 9, + maximumQoS: 36, + retainAvailable: 37, + assignedClientIdentifier: 18, + reasonString: 31, + wildcardSubscriptionAvailable: 40, + subscriptionIdentifiersAvailable: 41, + sharedSubscriptionAvailable: 42, + serverKeepAlive: 19, + responseInformation: 26, + serverReference: 28, + topicAlias: 35, + subscriptionIdentifier: 11 +} +protocol.propertiesCodes = {} +for (const prop in protocol.properties) { + const id = protocol.properties[prop] + protocol.propertiesCodes[id] = prop +} +protocol.propertiesTypes = { + sessionExpiryInterval: 'int32', + willDelayInterval: 'int32', + receiveMaximum: 'int16', + maximumPacketSize: 'int32', + topicAliasMaximum: 'int16', + requestResponseInformation: 'byte', + requestProblemInformation: 'byte', + userProperties: 'pair', + authenticationMethod: 'string', + authenticationData: 'binary', + payloadFormatIndicator: 'byte', + messageExpiryInterval: 'int32', + contentType: 'string', + responseTopic: 'string', + correlationData: 'binary', + maximumQoS: 'int8', + retainAvailable: 'byte', + assignedClientIdentifier: 'string', + reasonString: 'string', + wildcardSubscriptionAvailable: 'byte', + subscriptionIdentifiersAvailable: 'byte', + sharedSubscriptionAvailable: 'byte', + serverKeepAlive: 'int16', + responseInformation: 'string', + serverReference: 'string', + topicAlias: 'int16', + subscriptionIdentifier: 'var' +} + +function genHeader (type) { + return [0, 1, 2].map(qos => { + return [0, 1].map(dup => { + return [0, 1].map(retain => { + const buf = Buffer.alloc(1) + buf.writeUInt8( + protocol.codes[type] << protocol.CMD_SHIFT | + (dup ? protocol.DUP_MASK : 0) | + qos << protocol.QOS_SHIFT | retain, 0, true) + return buf + }) + }) + }) +} + +/* Publish */ +protocol.PUBLISH_HEADER = genHeader('publish') + +/* Subscribe */ +protocol.SUBSCRIBE_HEADER = genHeader('subscribe') +protocol.SUBSCRIBE_OPTIONS_QOS_MASK = 0x03 +protocol.SUBSCRIBE_OPTIONS_NL_MASK = 0x01 +protocol.SUBSCRIBE_OPTIONS_NL_SHIFT = 2 +protocol.SUBSCRIBE_OPTIONS_RAP_MASK = 0x01 +protocol.SUBSCRIBE_OPTIONS_RAP_SHIFT = 3 +protocol.SUBSCRIBE_OPTIONS_RH_MASK = 0x03 +protocol.SUBSCRIBE_OPTIONS_RH_SHIFT = 4 +protocol.SUBSCRIBE_OPTIONS_RH = [0x00, 0x10, 0x20] +protocol.SUBSCRIBE_OPTIONS_NL = 0x04 +protocol.SUBSCRIBE_OPTIONS_RAP = 0x08 +protocol.SUBSCRIBE_OPTIONS_QOS = [0x00, 0x01, 0x02] + +/* Unsubscribe */ +protocol.UNSUBSCRIBE_HEADER = genHeader('unsubscribe') + +/* Confirmations */ +protocol.ACKS = { + unsuback: genHeader('unsuback'), + puback: genHeader('puback'), + pubcomp: genHeader('pubcomp'), + pubrel: genHeader('pubrel'), + pubrec: genHeader('pubrec') +} + +protocol.SUBACK_HEADER = Buffer.from([protocol.codes.suback << protocol.CMD_SHIFT]) + +/* Protocol versions */ +protocol.VERSION3 = Buffer.from([3]) +protocol.VERSION4 = Buffer.from([4]) +protocol.VERSION5 = Buffer.from([5]) + +/* QoS */ +protocol.QOS = [0, 1, 2].map(qos => { + return Buffer.from([qos]) +}) + +/* Empty packets */ +protocol.EMPTY = { + pingreq: Buffer.from([protocol.codes.pingreq << 4, 0]), + pingresp: Buffer.from([protocol.codes.pingresp << 4, 0]), + disconnect: Buffer.from([protocol.codes.disconnect << 4, 0]) +} + +}).call(this,require("buffer").Buffer) +},{"buffer":12}],33:[function(require,module,exports){ +(function (Buffer){ +const writeToStream = require('./writeToStream') +const EventEmitter = require('events') + +function generate (packet, opts) { + const stream = new Accumulator() + writeToStream(packet, stream, opts) + return stream.concat() +} + +class Accumulator extends EventEmitter { + constructor () { + super() + this._array = new Array(20) + this._i = 0 + } + + write (chunk) { + this._array[this._i++] = chunk + return true + } + + concat () { + let length = 0 + const lengths = new Array(this._array.length) + const list = this._array + let pos = 0 + let i + + for (i = 0; i < list.length && list[i] !== undefined; i++) { + if (typeof list[i] !== 'string') lengths[i] = list[i].length + else lengths[i] = Buffer.byteLength(list[i]) + + length += lengths[i] + } + + const result = Buffer.allocUnsafe(length) + + for (i = 0; i < list.length && list[i] !== undefined; i++) { + if (typeof list[i] !== 'string') { + list[i].copy(result, pos) + pos += lengths[i] + } else { + result.write(list[i], pos) + pos += lengths[i] + } + } + + return result + } +} + +module.exports = generate + +}).call(this,require("buffer").Buffer) +},{"./writeToStream":40,"buffer":12,"events":27}],34:[function(require,module,exports){ +exports.parser = require('./parser').parser +exports.generate = require('./generate') +exports.writeToStream = require('./writeToStream') + +},{"./generate":33,"./parser":39,"./writeToStream":40}],35:[function(require,module,exports){ +'use strict' + +const { Buffer } = require('buffer') +const symbol = Symbol.for('BufferList') + +function BufferList (buf) { + if (!(this instanceof BufferList)) { + return new BufferList(buf) + } + + BufferList._init.call(this, buf) +} + +BufferList._init = function _init (buf) { + Object.defineProperty(this, symbol, { value: true }) + + this._bufs = [] + this.length = 0 + + if (buf) { + this.append(buf) + } +} + +BufferList.prototype._new = function _new (buf) { + return new BufferList(buf) +} + +BufferList.prototype._offset = function _offset (offset) { + if (offset === 0) { + return [0, 0] + } + + let tot = 0 + + for (let i = 0; i < this._bufs.length; i++) { + const _t = tot + this._bufs[i].length + if (offset < _t || i === this._bufs.length - 1) { + return [i, offset - tot] + } + tot = _t + } +} + +BufferList.prototype._reverseOffset = function (blOffset) { + const bufferId = blOffset[0] + let offset = blOffset[1] + + for (let i = 0; i < bufferId; i++) { + offset += this._bufs[i].length + } + + return offset +} + +BufferList.prototype.get = function get (index) { + if (index > this.length || index < 0) { + return undefined + } + + const offset = this._offset(index) + + return this._bufs[offset[0]][offset[1]] +} + +BufferList.prototype.slice = function slice (start, end) { + if (typeof start === 'number' && start < 0) { + start += this.length + } + + if (typeof end === 'number' && end < 0) { + end += this.length + } + + return this.copy(null, 0, start, end) +} + +BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) { + if (typeof srcStart !== 'number' || srcStart < 0) { + srcStart = 0 + } + + if (typeof srcEnd !== 'number' || srcEnd > this.length) { + srcEnd = this.length + } + + if (srcStart >= this.length) { + return dst || Buffer.alloc(0) + } + + if (srcEnd <= 0) { + return dst || Buffer.alloc(0) + } + + const copy = !!dst + const off = this._offset(srcStart) + const len = srcEnd - srcStart + let bytes = len + let bufoff = (copy && dstStart) || 0 + let start = off[1] + + // copy/slice everything + if (srcStart === 0 && srcEnd === this.length) { + if (!copy) { + // slice, but full concat if multiple buffers + return this._bufs.length === 1 + ? this._bufs[0] + : Buffer.concat(this._bufs, this.length) + } + + // copy, need to copy individual buffers + for (let i = 0; i < this._bufs.length; i++) { + this._bufs[i].copy(dst, bufoff) + bufoff += this._bufs[i].length + } + + return dst + } + + // easy, cheap case where it's a subset of one of the buffers + if (bytes <= this._bufs[off[0]].length - start) { + return copy + ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) + : this._bufs[off[0]].slice(start, start + bytes) + } + + if (!copy) { + // a slice, we need something to copy in to + dst = Buffer.allocUnsafe(len) + } + + for (let i = off[0]; i < this._bufs.length; i++) { + const l = this._bufs[i].length - start + + if (bytes > l) { + this._bufs[i].copy(dst, bufoff, start) + bufoff += l + } else { + this._bufs[i].copy(dst, bufoff, start, start + bytes) + bufoff += l + break + } + + bytes -= l + + if (start) { + start = 0 + } + } + + // safeguard so that we don't return uninitialized memory + if (dst.length > bufoff) return dst.slice(0, bufoff) + + return dst +} + +BufferList.prototype.shallowSlice = function shallowSlice (start, end) { + start = start || 0 + end = typeof end !== 'number' ? this.length : end + + if (start < 0) { + start += this.length + } + + if (end < 0) { + end += this.length + } + + if (start === end) { + return this._new() + } + + const startOffset = this._offset(start) + const endOffset = this._offset(end) + const buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1) + + if (endOffset[1] === 0) { + buffers.pop() + } else { + buffers[buffers.length - 1] = buffers[buffers.length - 1].slice(0, endOffset[1]) + } + + if (startOffset[1] !== 0) { + buffers[0] = buffers[0].slice(startOffset[1]) + } + + return this._new(buffers) +} + +BufferList.prototype.toString = function toString (encoding, start, end) { + return this.slice(start, end).toString(encoding) +} + +BufferList.prototype.consume = function consume (bytes) { + // first, normalize the argument, in accordance with how Buffer does it + bytes = Math.trunc(bytes) + // do nothing if not a positive number + if (Number.isNaN(bytes) || bytes <= 0) return this + + while (this._bufs.length) { + if (bytes >= this._bufs[0].length) { + bytes -= this._bufs[0].length + this.length -= this._bufs[0].length + this._bufs.shift() + } else { + this._bufs[0] = this._bufs[0].slice(bytes) + this.length -= bytes + break + } + } + + return this +} + +BufferList.prototype.duplicate = function duplicate () { + const copy = this._new() + + for (let i = 0; i < this._bufs.length; i++) { + copy.append(this._bufs[i]) + } + + return copy +} + +BufferList.prototype.append = function append (buf) { + if (buf == null) { + return this + } + + if (buf.buffer) { + // append a view of the underlying ArrayBuffer + this._appendBuffer(Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength)) + } else if (Array.isArray(buf)) { + for (let i = 0; i < buf.length; i++) { + this.append(buf[i]) + } + } else if (this._isBufferList(buf)) { + // unwrap argument into individual BufferLists + for (let i = 0; i < buf._bufs.length; i++) { + this.append(buf._bufs[i]) + } + } else { + // coerce number arguments to strings, since Buffer(number) does + // uninitialized memory allocation + if (typeof buf === 'number') { + buf = buf.toString() + } + + this._appendBuffer(Buffer.from(buf)) + } + + return this +} + +BufferList.prototype._appendBuffer = function appendBuffer (buf) { + this._bufs.push(buf) + this.length += buf.length +} + +BufferList.prototype.indexOf = function (search, offset, encoding) { + if (encoding === undefined && typeof offset === 'string') { + encoding = offset + offset = undefined + } + + if (typeof search === 'function' || Array.isArray(search)) { + throw new TypeError('The "value" argument must be one of type string, Buffer, BufferList, or Uint8Array.') + } else if (typeof search === 'number') { + search = Buffer.from([search]) + } else if (typeof search === 'string') { + search = Buffer.from(search, encoding) + } else if (this._isBufferList(search)) { + search = search.slice() + } else if (Array.isArray(search.buffer)) { + search = Buffer.from(search.buffer, search.byteOffset, search.byteLength) + } else if (!Buffer.isBuffer(search)) { + search = Buffer.from(search) + } + + offset = Number(offset || 0) + + if (isNaN(offset)) { + offset = 0 + } + + if (offset < 0) { + offset = this.length + offset + } + + if (offset < 0) { + offset = 0 + } + + if (search.length === 0) { + return offset > this.length ? this.length : offset + } + + const blOffset = this._offset(offset) + let blIndex = blOffset[0] // index of which internal buffer we're working on + let buffOffset = blOffset[1] // offset of the internal buffer we're working on + + // scan over each buffer + for (; blIndex < this._bufs.length; blIndex++) { + const buff = this._bufs[blIndex] + + while (buffOffset < buff.length) { + const availableWindow = buff.length - buffOffset + + if (availableWindow >= search.length) { + const nativeSearchResult = buff.indexOf(search, buffOffset) + + if (nativeSearchResult !== -1) { + return this._reverseOffset([blIndex, nativeSearchResult]) + } + + buffOffset = buff.length - search.length + 1 // end of native search window + } else { + const revOffset = this._reverseOffset([blIndex, buffOffset]) + + if (this._match(revOffset, search)) { + return revOffset + } + + buffOffset++ + } + } + + buffOffset = 0 + } + + return -1 +} + +BufferList.prototype._match = function (offset, search) { + if (this.length - offset < search.length) { + return false + } + + for (let searchOffset = 0; searchOffset < search.length; searchOffset++) { + if (this.get(offset + searchOffset) !== search[searchOffset]) { + return false + } + } + return true +} + +;(function () { + const methods = { + readDoubleBE: 8, + readDoubleLE: 8, + readFloatBE: 4, + readFloatLE: 4, + readInt32BE: 4, + readInt32LE: 4, + readUInt32BE: 4, + readUInt32LE: 4, + readInt16BE: 2, + readInt16LE: 2, + readUInt16BE: 2, + readUInt16LE: 2, + readInt8: 1, + readUInt8: 1, + readIntBE: null, + readIntLE: null, + readUIntBE: null, + readUIntLE: null + } + + for (const m in methods) { + (function (m) { + if (methods[m] === null) { + BufferList.prototype[m] = function (offset, byteLength) { + return this.slice(offset, offset + byteLength)[m](0, byteLength) + } + } else { + BufferList.prototype[m] = function (offset) { + return this.slice(offset, offset + methods[m])[m](0) + } + } + }(m)) + } +}()) + +// Used internally by the class and also as an indicator of this object being +// a `BufferList`. It's not possible to use `instanceof BufferList` in a browser +// environment because there could be multiple different copies of the +// BufferList class and some `BufferList`s might be `BufferList`s. +BufferList.prototype._isBufferList = function _isBufferList (b) { + return b instanceof BufferList || BufferList.isBufferList(b) +} + +BufferList.isBufferList = function isBufferList (b) { + return b != null && b[symbol] +} + +module.exports = BufferList + +},{"buffer":12}],36:[function(require,module,exports){ +'use strict' + +const DuplexStream = require('readable-stream').Duplex +const inherits = require('inherits') +const BufferList = require('./BufferList') + +function BufferListStream (callback) { + if (!(this instanceof BufferListStream)) { + return new BufferListStream(callback) + } + + if (typeof callback === 'function') { + this._callback = callback + + const piper = function piper (err) { + if (this._callback) { + this._callback(err) + this._callback = null + } + }.bind(this) + + this.on('pipe', function onPipe (src) { + src.on('error', piper) + }) + this.on('unpipe', function onUnpipe (src) { + src.removeListener('error', piper) + }) + + callback = null + } + + BufferList._init.call(this, callback) + DuplexStream.call(this) +} + +inherits(BufferListStream, DuplexStream) +Object.assign(BufferListStream.prototype, BufferList.prototype) + +BufferListStream.prototype._new = function _new (callback) { + return new BufferListStream(callback) +} + +BufferListStream.prototype._write = function _write (buf, encoding, callback) { + this._appendBuffer(buf) + + if (typeof callback === 'function') { + callback() + } +} + +BufferListStream.prototype._read = function _read (size) { + if (!this.length) { + return this.push(null) + } + + size = Math.min(size, this.length) + this.push(this.slice(0, size)) + this.consume(size) +} + +BufferListStream.prototype.end = function end (chunk) { + DuplexStream.prototype.end.call(this, chunk) + + if (this._callback) { + this._callback(null, this.slice()) + this._callback = null + } +} + +BufferListStream.prototype._destroy = function _destroy (err, cb) { + this._bufs.length = 0 + this.length = 0 + cb(err) +} + +BufferListStream.prototype._isBufferList = function _isBufferList (b) { + return b instanceof BufferListStream || b instanceof BufferList || BufferListStream.isBufferList(b) +} + +BufferListStream.isBufferList = BufferList.isBufferList + +module.exports = BufferListStream +module.exports.BufferListStream = BufferListStream +module.exports.BufferList = BufferList + +},{"./BufferList":35,"inherits":29,"readable-stream":59}],37:[function(require,module,exports){ +(function (Buffer){ +const max = 65536 +const cache = {} + +// in node 6 Buffer.subarray returns a Uint8Array instead of a Buffer +// later versions return a Buffer +// alternative is Buffer.slice but that creates a new buffer +// creating new buffers takes time +// SubOk is only false on node < 8 +const SubOk = Buffer.isBuffer(Buffer.from([1, 2]).subarray(0, 1)) + +function generateBuffer (i) { + const buffer = Buffer.allocUnsafe(2) + buffer.writeUInt8(i >> 8, 0) + buffer.writeUInt8(i & 0x00FF, 0 + 1) + + return buffer +} + +function generateCache () { + for (let i = 0; i < max; i++) { + cache[i] = generateBuffer(i) + } +} + +function genBufVariableByteInt (num) { + const maxLength = 4 // max 4 bytes + let digit = 0 + let pos = 0 + const buffer = Buffer.allocUnsafe(maxLength) + + do { + digit = num % 128 | 0 + num = num / 128 | 0 + if (num > 0) digit = digit | 0x80 + + buffer.writeUInt8(digit, pos++) + } while (num > 0 && pos < maxLength) + + if (num > 0) { + pos = 0 + } + + return SubOk ? buffer.subarray(0, pos) : buffer.slice(0, pos) +} + +function generate4ByteBuffer (num) { + const buffer = Buffer.allocUnsafe(4) + buffer.writeUInt32BE(num, 0) + return buffer +} + +module.exports = { + cache, + generateCache, + generateNumber: generateBuffer, + genBufVariableByteInt, + generate4ByteBuffer +} + +}).call(this,require("buffer").Buffer) +},{"buffer":12}],38:[function(require,module,exports){ +class Packet { + constructor () { + this.cmd = null + this.retain = false + this.qos = 0 + this.dup = false + this.length = -1 + this.topic = null + this.payload = null + } +} + +module.exports = Packet + +},{}],39:[function(require,module,exports){ +const bl = require('bl') +const EventEmitter = require('events') +const Packet = require('./packet') +const constants = require('./constants') +const debug = require('debug')('mqtt-packet:parser') + +class Parser extends EventEmitter { + constructor () { + super() + this.parser = this.constructor.parser + } + + static parser (opt) { + if (!(this instanceof Parser)) return (new Parser()).parser(opt) + + this.settings = opt || {} + + this._states = [ + '_parseHeader', + '_parseLength', + '_parsePayload', + '_newPacket' + ] + + this._resetState() + return this + } + + _resetState () { + debug('_resetState: resetting packet, error, _list, and _stateCounter') + this.packet = new Packet() + this.error = null + this._list = bl() + this._stateCounter = 0 + } + + parse (buf) { + if (this.error) this._resetState() + + this._list.append(buf) + debug('parse: current state: %s', this._states[this._stateCounter]) + while ((this.packet.length !== -1 || this._list.length > 0) && + this[this._states[this._stateCounter]]() && + !this.error) { + this._stateCounter++ + debug('parse: state complete. _stateCounter is now: %d', this._stateCounter) + debug('parse: packet.length: %d, buffer list length: %d', this.packet.length, this._list.length) + if (this._stateCounter >= this._states.length) this._stateCounter = 0 + } + debug('parse: exited while loop. packet: %d, buffer list length: %d', this.packet.length, this._list.length) + return this._list.length + } + + _parseHeader () { + // There is at least one byte in the buffer + const zero = this._list.readUInt8(0) + this.packet.cmd = constants.types[zero >> constants.CMD_SHIFT] + this.packet.retain = (zero & constants.RETAIN_MASK) !== 0 + this.packet.qos = (zero >> constants.QOS_SHIFT) & constants.QOS_MASK + this.packet.dup = (zero & constants.DUP_MASK) !== 0 + debug('_parseHeader: packet: %o', this.packet) + + this._list.consume(1) + + return true + } + + _parseLength () { + // There is at least one byte in the list + const result = this._parseVarByteNum(true) + + if (result) { + this.packet.length = result.value + this._list.consume(result.bytes) + } else { + this._emitError(new Error('Invalid length')) + } + debug('_parseLength %d', result.value) + return !!result + } + + _parsePayload () { + debug('_parsePayload: payload %O', this._list) + let result = false + + // Do we have a payload? Do we have enough data to complete the payload? + // PINGs have no payload + if (this.packet.length === 0 || this._list.length >= this.packet.length) { + this._pos = 0 + + switch (this.packet.cmd) { + case 'connect': + this._parseConnect() + break + case 'connack': + this._parseConnack() + break + case 'publish': + this._parsePublish() + break + case 'puback': + case 'pubrec': + case 'pubrel': + case 'pubcomp': + this._parseConfirmation() + break + case 'subscribe': + this._parseSubscribe() + break + case 'suback': + this._parseSuback() + break + case 'unsubscribe': + this._parseUnsubscribe() + break + case 'unsuback': + this._parseUnsuback() + break + case 'pingreq': + case 'pingresp': + // These are empty, nothing to do + break + case 'disconnect': + this._parseDisconnect() + break + case 'auth': + this._parseAuth() + break + default: + this._emitError(new Error('Not supported')) + } + + result = true + } + debug('_parsePayload complete result: %s', result) + return result + } + + _parseConnect () { + debug('_parseConnect') + let topic // Will topic + let payload // Will payload + let password // Password + let username // Username + const flags = {} + const packet = this.packet + + // Parse protocolId + const protocolId = this._parseString() + + if (protocolId === null) return this._emitError(new Error('Cannot parse protocolId')) + if (protocolId !== 'MQTT' && protocolId !== 'MQIsdp') { + return this._emitError(new Error('Invalid protocolId')) + } + + packet.protocolId = protocolId + + // Parse constants version number + if (this._pos >= this._list.length) return this._emitError(new Error('Packet too short')) + + packet.protocolVersion = this._list.readUInt8(this._pos) + + if (packet.protocolVersion !== 3 && packet.protocolVersion !== 4 && packet.protocolVersion !== 5) { + return this._emitError(new Error('Invalid protocol version')) + } + + this._pos++ + + if (this._pos >= this._list.length) { + return this._emitError(new Error('Packet too short')) + } + + // Parse connect flags + flags.username = (this._list.readUInt8(this._pos) & constants.USERNAME_MASK) + flags.password = (this._list.readUInt8(this._pos) & constants.PASSWORD_MASK) + flags.will = (this._list.readUInt8(this._pos) & constants.WILL_FLAG_MASK) + + if (flags.will) { + packet.will = {} + packet.will.retain = (this._list.readUInt8(this._pos) & constants.WILL_RETAIN_MASK) !== 0 + packet.will.qos = (this._list.readUInt8(this._pos) & + constants.WILL_QOS_MASK) >> constants.WILL_QOS_SHIFT + } + + packet.clean = (this._list.readUInt8(this._pos) & constants.CLEAN_SESSION_MASK) !== 0 + this._pos++ + + // Parse keepalive + packet.keepalive = this._parseNum() + if (packet.keepalive === -1) return this._emitError(new Error('Packet too short')) + + // parse properties + if (packet.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + // Parse clientId + const clientId = this._parseString() + if (clientId === null) return this._emitError(new Error('Packet too short')) + packet.clientId = clientId + debug('_parseConnect: packet.clientId: %s', packet.clientId) + + if (flags.will) { + if (packet.protocolVersion === 5) { + const willProperties = this._parseProperties() + if (Object.getOwnPropertyNames(willProperties).length) { + packet.will.properties = willProperties + } + } + // Parse will topic + topic = this._parseString() + if (topic === null) return this._emitError(new Error('Cannot parse will topic')) + packet.will.topic = topic + debug('_parseConnect: packet.will.topic: %s', packet.will.topic) + + // Parse will payload + payload = this._parseBuffer() + if (payload === null) return this._emitError(new Error('Cannot parse will payload')) + packet.will.payload = payload + debug('_parseConnect: packet.will.paylaod: %s', packet.will.payload) + } + + // Parse username + if (flags.username) { + username = this._parseString() + if (username === null) return this._emitError(new Error('Cannot parse username')) + packet.username = username + debug('_parseConnect: packet.username: %s', packet.username) + } + + // Parse password + if (flags.password) { + password = this._parseBuffer() + if (password === null) return this._emitError(new Error('Cannot parse password')) + packet.password = password + } + // need for right parse auth packet and self set up + this.settings = packet + debug('_parseConnect: complete') + return packet + } + + _parseConnack () { + debug('_parseConnack') + const packet = this.packet + + if (this._list.length < 2) return null + + packet.sessionPresent = !!(this._list.readUInt8(this._pos++) & constants.SESSIONPRESENT_MASK) + if (this.settings.protocolVersion === 5) { + packet.reasonCode = this._list.readUInt8(this._pos++) + } else { + packet.returnCode = this._list.readUInt8(this._pos++) + } + + if (packet.returnCode === -1 || packet.reasonCode === -1) return this._emitError(new Error('Cannot parse return code')) + // mqtt 5 properties + if (this.settings.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + debug('_parseConnack: complete') + } + + _parsePublish () { + debug('_parsePublish') + const packet = this.packet + packet.topic = this._parseString() + + if (packet.topic === null) return this._emitError(new Error('Cannot parse topic')) + + // Parse messageId + if (packet.qos > 0) if (!this._parseMessageId()) { return } + + // Properties mqtt 5 + if (this.settings.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + + packet.payload = this._list.slice(this._pos, packet.length) + debug('_parsePublish: payload from buffer list: %o', packet.payload) + } + + _parseSubscribe () { + debug('_parseSubscribe') + const packet = this.packet + let topic + let options + let qos + let rh + let rap + let nl + let subscription + + if (packet.qos !== 1) { + return this._emitError(new Error('Wrong subscribe header')) + } + + packet.subscriptions = [] + + if (!this._parseMessageId()) { return } + + // Properties mqtt 5 + if (this.settings.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + + while (this._pos < packet.length) { + // Parse topic + topic = this._parseString() + if (topic === null) return this._emitError(new Error('Cannot parse topic')) + if (this._pos >= packet.length) return this._emitError(new Error('Malformed Subscribe Payload')) + + options = this._parseByte() + qos = options & constants.SUBSCRIBE_OPTIONS_QOS_MASK + nl = ((options >> constants.SUBSCRIBE_OPTIONS_NL_SHIFT) & constants.SUBSCRIBE_OPTIONS_NL_MASK) !== 0 + rap = ((options >> constants.SUBSCRIBE_OPTIONS_RAP_SHIFT) & constants.SUBSCRIBE_OPTIONS_RAP_MASK) !== 0 + rh = (options >> constants.SUBSCRIBE_OPTIONS_RH_SHIFT) & constants.SUBSCRIBE_OPTIONS_RH_MASK + + subscription = { topic, qos } + + // mqtt 5 options + if (this.settings.protocolVersion === 5) { + subscription.nl = nl + subscription.rap = rap + subscription.rh = rh + } + + // Push pair to subscriptions + debug('_parseSubscribe: push subscription `%s` to subscription', subscription) + packet.subscriptions.push(subscription) + } + } + + _parseSuback () { + debug('_parseSuback') + const packet = this.packet + this.packet.granted = [] + + if (!this._parseMessageId()) { return } + + // Properties mqtt 5 + if (this.settings.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + + // Parse granted QoSes + while (this._pos < this.packet.length) { + this.packet.granted.push(this._list.readUInt8(this._pos++)) + } + } + + _parseUnsubscribe () { + debug('_parseUnsubscribe') + const packet = this.packet + + packet.unsubscriptions = [] + + // Parse messageId + if (!this._parseMessageId()) { return } + + // Properties mqtt 5 + if (this.settings.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + + while (this._pos < packet.length) { + // Parse topic + const topic = this._parseString() + if (topic === null) return this._emitError(new Error('Cannot parse topic')) + + // Push topic to unsubscriptions + debug('_parseUnsubscribe: push topic `%s` to unsubscriptions', topic) + packet.unsubscriptions.push(topic) + } + } + + _parseUnsuback () { + debug('_parseUnsuback') + const packet = this.packet + if (!this._parseMessageId()) return this._emitError(new Error('Cannot parse messageId')) + // Properties mqtt 5 + if (this.settings.protocolVersion === 5) { + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + // Parse granted QoSes + packet.granted = [] + while (this._pos < this.packet.length) { + this.packet.granted.push(this._list.readUInt8(this._pos++)) + } + } + } + + // parse packets like puback, pubrec, pubrel, pubcomp + _parseConfirmation () { + debug('_parseConfirmation: packet.cmd: `%s`', this.packet.cmd) + const packet = this.packet + + this._parseMessageId() + + if (this.settings.protocolVersion === 5) { + if (packet.length > 2) { + // response code + packet.reasonCode = this._parseByte() + debug('_parseConfirmation: packet.reasonCode `%d`', packet.reasonCode) + } + + if (packet.length > 3) { + // properies mqtt 5 + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + } + + return true + } + + // parse disconnect packet + _parseDisconnect () { + const packet = this.packet + debug('_parseDisconnect') + + if (this.settings.protocolVersion === 5) { + // response code + packet.reasonCode = this._parseByte() + // properies mqtt 5 + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + } + + debug('_parseDisconnect result: true') + return true + } + + // parse auth packet + _parseAuth () { + debug('_parseAuth') + const packet = this.packet + + if (this.settings.protocolVersion !== 5) { + return this._emitError(new Error('Not supported auth packet for this version MQTT')) + } + + // response code + packet.reasonCode = this._parseByte() + // properies mqtt 5 + const properties = this._parseProperties() + if (Object.getOwnPropertyNames(properties).length) { + packet.properties = properties + } + + debug('_parseAuth: result: true') + return true + } + + _parseMessageId () { + const packet = this.packet + + packet.messageId = this._parseNum() + + if (packet.messageId === null) { + this._emitError(new Error('Cannot parse messageId')) + return false + } + + debug('_parseMessageId: packet.messageId %d', packet.messageId) + return true + } + + _parseString (maybeBuffer) { + const length = this._parseNum() + const end = length + this._pos + + if (length === -1 || end > this._list.length || end > this.packet.length) return null + + const result = this._list.toString('utf8', this._pos, end) + this._pos += length + debug('_parseString: result: %s', result) + return result + } + + _parseStringPair () { + debug('_parseStringPair') + return { + name: this._parseString(), + value: this._parseString() + } + } + + _parseBuffer () { + const length = this._parseNum() + const end = length + this._pos + + if (length === -1 || end > this._list.length || end > this.packet.length) return null + + const result = this._list.slice(this._pos, end) + + this._pos += length + debug('_parseBuffer: result: %o', result) + return result + } + + _parseNum () { + if (this._list.length - this._pos < 2) return -1 + + const result = this._list.readUInt16BE(this._pos) + this._pos += 2 + debug('_parseNum: result: %s', result) + return result + } + + _parse4ByteNum () { + if (this._list.length - this._pos < 4) return -1 + + const result = this._list.readUInt32BE(this._pos) + this._pos += 4 + debug('_parse4ByteNum: result: %s', result) + return result + } + + _parseVarByteNum (fullInfoFlag) { + debug('_parseVarByteNum') + let bytes = 0 + let mul = 1 + let value = 0 + let result = false + let current + const padding = this._pos ? this._pos : 0 + + while (bytes < 5) { + current = this._list.readUInt8(padding + bytes++) + value += mul * (current & constants.VARBYTEINT_MASK) + mul *= 0x80 + + if ((current & constants.VARBYTEINT_FIN_MASK) === 0) { + result = true + break + } + if (this._list.length <= bytes) { + break + } + } + + if (padding) { + this._pos += bytes + } + + result = result + ? fullInfoFlag ? { + bytes, + value + } : value + : false + + debug('_parseVarByteNum: result: %o', result) + return result + } + + _parseByte () { + const result = this._list.readUInt8(this._pos) + this._pos++ + debug('_parseByte: result: %o', result) + return result + } + + _parseByType (type) { + debug('_parseByType: type: %s', type) + switch (type) { + case 'byte': { + return this._parseByte() !== 0 + } + case 'int8': { + return this._parseByte() + } + case 'int16': { + return this._parseNum() + } + case 'int32': { + return this._parse4ByteNum() + } + case 'var': { + return this._parseVarByteNum() + } + case 'string': { + return this._parseString() + } + case 'pair': { + return this._parseStringPair() + } + case 'binary': { + return this._parseBuffer() + } + } + } + + _parseProperties () { + debug('_parseProperties') + const length = this._parseVarByteNum() + const start = this._pos + const end = start + length + const result = {} + while (this._pos < end) { + const type = this._parseByte() + const name = constants.propertiesCodes[type] + if (!name) { + this._emitError(new Error('Unknown property')) + return false + } + // user properties process + if (name === 'userProperties') { + if (!result[name]) { + result[name] = Object.create(null) + } + const currentUserProperty = this._parseByType(constants.propertiesTypes[name]) + if (result[name][currentUserProperty.name]) { + if (Array.isArray(result[name][currentUserProperty.name])) { + result[name][currentUserProperty.name].push(currentUserProperty.value) + } else { + const currentValue = result[name][currentUserProperty.name] + result[name][currentUserProperty.name] = [currentValue] + result[name][currentUserProperty.name].push(currentUserProperty.value) + } + } else { + result[name][currentUserProperty.name] = currentUserProperty.value + } + continue + } + if (result[name]) { + if (Array.isArray(result[name])) { + result[name].push(this._parseByType(constants.propertiesTypes[name])) + } else { + result[name] = [result[name]] + result[name].push(this._parseByType(constants.propertiesTypes[name])) + } + } else { + result[name] = this._parseByType(constants.propertiesTypes[name]) + } + } + return result + } + + _newPacket () { + debug('_newPacket') + if (this.packet) { + this._list.consume(this.packet.length) + debug('_newPacket: parser emit packet: packet.cmd: %s, packet.payload: %s, packet.length: %d', this.packet.cmd, this.packet.payload, this.packet.length) + this.emit('packet', this.packet) + } + debug('_newPacket: new packet') + this.packet = new Packet() + + this._pos = 0 + + return true + } + + _emitError (err) { + debug('_emitError') + this.error = err + this.emit('error', err) + } +} + +module.exports = Parser + +},{"./constants":32,"./packet":38,"bl":36,"debug":14,"events":27}],40:[function(require,module,exports){ +(function (Buffer){ +const protocol = require('./constants') +const empty = Buffer.allocUnsafe(0) +const zeroBuf = Buffer.from([0]) +const numbers = require('./numbers') +const nextTick = require('process-nextick-args').nextTick +const debug = require('debug')('mqtt-packet:writeToStream') + +const numCache = numbers.cache +const generateNumber = numbers.generateNumber +const generateCache = numbers.generateCache +const genBufVariableByteInt = numbers.genBufVariableByteInt +const generate4ByteBuffer = numbers.generate4ByteBuffer +let writeNumber = writeNumberCached +let toGenerate = true + +function generate (packet, stream, opts) { + debug('generate called') + if (stream.cork) { + stream.cork() + nextTick(uncork, stream) + } + + if (toGenerate) { + toGenerate = false + generateCache() + } + debug('generate: packet.cmd: %s', packet.cmd) + switch (packet.cmd) { + case 'connect': + return connect(packet, stream, opts) + case 'connack': + return connack(packet, stream, opts) + case 'publish': + return publish(packet, stream, opts) + case 'puback': + case 'pubrec': + case 'pubrel': + case 'pubcomp': + return confirmation(packet, stream, opts) + case 'subscribe': + return subscribe(packet, stream, opts) + case 'suback': + return suback(packet, stream, opts) + case 'unsubscribe': + return unsubscribe(packet, stream, opts) + case 'unsuback': + return unsuback(packet, stream, opts) + case 'pingreq': + case 'pingresp': + return emptyPacket(packet, stream, opts) + case 'disconnect': + return disconnect(packet, stream, opts) + case 'auth': + return auth(packet, stream, opts) + default: + stream.emit('error', new Error('Unknown command')) + return false + } +} +/** + * Controls numbers cache. + * Set to "false" to allocate buffers on-the-flight instead of pre-generated cache + */ +Object.defineProperty(generate, 'cacheNumbers', { + get () { + return writeNumber === writeNumberCached + }, + set (value) { + if (value) { + if (!numCache || Object.keys(numCache).length === 0) toGenerate = true + writeNumber = writeNumberCached + } else { + toGenerate = false + writeNumber = writeNumberGenerated + } + } +}) + +function uncork (stream) { + stream.uncork() +} + +function connect (packet, stream, opts) { + const settings = packet || {} + const protocolId = settings.protocolId || 'MQTT' + const protocolVersion = settings.protocolVersion || 4 + const will = settings.will + let clean = settings.clean + const keepalive = settings.keepalive || 0 + const clientId = settings.clientId || '' + const username = settings.username + const password = settings.password + /* mqtt5 new oprions */ + const properties = settings.properties + + if (clean === undefined) clean = true + + let length = 0 + + // Must be a string and non-falsy + if (!protocolId || + (typeof protocolId !== 'string' && !Buffer.isBuffer(protocolId))) { + stream.emit('error', new Error('Invalid protocolId')) + return false + } else length += protocolId.length + 2 + + // Must be 3 or 4 or 5 + if (protocolVersion !== 3 && protocolVersion !== 4 && protocolVersion !== 5) { + stream.emit('error', new Error('Invalid protocol version')) + return false + } else length += 1 + + // ClientId might be omitted in 3.1.1, but only if cleanSession is set to 1 + if ((typeof clientId === 'string' || Buffer.isBuffer(clientId)) && + (clientId || protocolVersion === 4) && (clientId || clean)) { + length += clientId.length + 2 + } else { + if (protocolVersion < 4) { + stream.emit('error', new Error('clientId must be supplied before 3.1.1')) + return false + } + if ((clean * 1) === 0) { + stream.emit('error', new Error('clientId must be given if cleanSession set to 0')) + return false + } + } + + // Must be a two byte number + if (typeof keepalive !== 'number' || + keepalive < 0 || + keepalive > 65535 || + keepalive % 1 !== 0) { + stream.emit('error', new Error('Invalid keepalive')) + return false + } else length += 2 + + // Connect flags + length += 1 + + // Properties + if (protocolVersion === 5) { + var propertiesData = getProperties(stream, properties) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // If will exists... + if (will) { + // It must be an object + if (typeof will !== 'object') { + stream.emit('error', new Error('Invalid will')) + return false + } + // It must have topic typeof string + if (!will.topic || typeof will.topic !== 'string') { + stream.emit('error', new Error('Invalid will topic')) + return false + } else { + length += Buffer.byteLength(will.topic) + 2 + } + + // Payload + length += 2 // payload length + if (will.payload) { + if (will.payload.length >= 0) { + if (typeof will.payload === 'string') { + length += Buffer.byteLength(will.payload) + } else { + length += will.payload.length + } + } else { + stream.emit('error', new Error('Invalid will payload')) + return false + } + } + // will properties + var willProperties = {} + if (protocolVersion === 5) { + willProperties = getProperties(stream, will.properties) + if (!willProperties) { return false } + length += willProperties.length + } + } + + // Username + let providedUsername = false + if (username != null) { + if (isStringOrBuffer(username)) { + providedUsername = true + length += Buffer.byteLength(username) + 2 + } else { + stream.emit('error', new Error('Invalid username')) + return false + } + } + + // Password + if (password != null) { + if (!providedUsername) { + stream.emit('error', new Error('Username is required to use password')) + return false + } + + if (isStringOrBuffer(password)) { + length += byteLength(password) + 2 + } else { + stream.emit('error', new Error('Invalid password')) + return false + } + } + + // Generate header + stream.write(protocol.CONNECT_HEADER) + + // Generate length + writeVarByteInt(stream, length) + + // Generate protocol ID + writeStringOrBuffer(stream, protocolId) + stream.write( + protocolVersion === 4 + ? protocol.VERSION4 + : protocolVersion === 5 + ? protocol.VERSION5 + : protocol.VERSION3 + ) + + // Connect flags + let flags = 0 + flags |= (username != null) ? protocol.USERNAME_MASK : 0 + flags |= (password != null) ? protocol.PASSWORD_MASK : 0 + flags |= (will && will.retain) ? protocol.WILL_RETAIN_MASK : 0 + flags |= (will && will.qos) ? will.qos << protocol.WILL_QOS_SHIFT : 0 + flags |= will ? protocol.WILL_FLAG_MASK : 0 + flags |= clean ? protocol.CLEAN_SESSION_MASK : 0 + + stream.write(Buffer.from([flags])) + + // Keepalive + writeNumber(stream, keepalive) + + // Properties + if (protocolVersion === 5) { + propertiesData.write() + } + + // Client ID + writeStringOrBuffer(stream, clientId) + + // Will + if (will) { + if (protocolVersion === 5) { + willProperties.write() + } + writeString(stream, will.topic) + writeStringOrBuffer(stream, will.payload) + } + + // Username and password + if (username != null) { + writeStringOrBuffer(stream, username) + } + if (password != null) { + writeStringOrBuffer(stream, password) + } + // This is a small packet that happens only once on a stream + // We assume the stream is always free to receive more data after this + return true +} + +function connack (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const rc = version === 5 ? settings.reasonCode : settings.returnCode + const properties = settings.properties + let length = 2 // length of rc and sessionHeader + + // Check return code + if (typeof rc !== 'number') { + stream.emit('error', new Error('Invalid return code')) + return false + } + // mqtt5 properties + let propertiesData = null + if (version === 5) { + propertiesData = getProperties(stream, properties) + if (!propertiesData) { return false } + length += propertiesData.length + } + + stream.write(protocol.CONNACK_HEADER) + // length + writeVarByteInt(stream, length) + stream.write(settings.sessionPresent ? protocol.SESSIONPRESENT_HEADER : zeroBuf) + + stream.write(Buffer.from([rc])) + if (propertiesData != null) { + propertiesData.write() + } + return true +} + +function publish (packet, stream, opts) { + debug('publish: packet: %o', packet) + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const qos = settings.qos || 0 + const retain = settings.retain ? protocol.RETAIN_MASK : 0 + const topic = settings.topic + const payload = settings.payload || empty + const id = settings.messageId + const properties = settings.properties + + let length = 0 + + // Topic must be a non-empty string or Buffer + if (typeof topic === 'string') length += Buffer.byteLength(topic) + 2 + else if (Buffer.isBuffer(topic)) length += topic.length + 2 + else { + stream.emit('error', new Error('Invalid topic')) + return false + } + + // Get the payload length + if (!Buffer.isBuffer(payload)) length += Buffer.byteLength(payload) + else length += payload.length + + // Message ID must a number if qos > 0 + if (qos && typeof id !== 'number') { + stream.emit('error', new Error('Invalid messageId')) + return false + } else if (qos) length += 2 + + // mqtt5 properties + let propertiesData = null + if (version === 5) { + propertiesData = getProperties(stream, properties) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // Header + stream.write(protocol.PUBLISH_HEADER[qos][settings.dup ? 1 : 0][retain ? 1 : 0]) + + // Remaining length + writeVarByteInt(stream, length) + + // Topic + writeNumber(stream, byteLength(topic)) + stream.write(topic) + + // Message ID + if (qos > 0) writeNumber(stream, id) + + // Properties + if (propertiesData != null) { + propertiesData.write() + } + + // Payload + debug('publish: payload: %o', payload) + return stream.write(payload) +} + +/* Puback, pubrec, pubrel and pubcomp */ +function confirmation (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const type = settings.cmd || 'puback' + const id = settings.messageId + const dup = (settings.dup && type === 'pubrel') ? protocol.DUP_MASK : 0 + let qos = 0 + const reasonCode = settings.reasonCode + const properties = settings.properties + let length = version === 5 ? 3 : 2 + + if (type === 'pubrel') qos = 1 + + // Check message ID + if (typeof id !== 'number') { + stream.emit('error', new Error('Invalid messageId')) + return false + } + + // properies mqtt 5 + let propertiesData = null + if (version === 5) { + // Confirm should not add empty property length with no properties (rfc 3.4.2.2.1) + if (typeof properties === 'object') { + propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length) + if (!propertiesData) { return false } + length += propertiesData.length + } + } + + // Header + stream.write(protocol.ACKS[type][qos][dup][0]) + + // Length + writeVarByteInt(stream, length) + + // Message ID + writeNumber(stream, id) + + // reason code in header + if (version === 5) { + stream.write(Buffer.from([reasonCode])) + } + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + return true +} + +function subscribe (packet, stream, opts) { + debug('subscribe: packet: ') + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const dup = settings.dup ? protocol.DUP_MASK : 0 + const id = settings.messageId + const subs = settings.subscriptions + const properties = settings.properties + + let length = 0 + + // Check message ID + if (typeof id !== 'number') { + stream.emit('error', new Error('Invalid messageId')) + return false + } else length += 2 + + // properies mqtt 5 + let propertiesData = null + if (version === 5) { + propertiesData = getProperties(stream, properties) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // Check subscriptions + if (typeof subs === 'object' && subs.length) { + for (let i = 0; i < subs.length; i += 1) { + const itopic = subs[i].topic + const iqos = subs[i].qos + + if (typeof itopic !== 'string') { + stream.emit('error', new Error('Invalid subscriptions - invalid topic')) + return false + } + if (typeof iqos !== 'number') { + stream.emit('error', new Error('Invalid subscriptions - invalid qos')) + return false + } + + if (version === 5) { + const nl = subs[i].nl || false + if (typeof nl !== 'boolean') { + stream.emit('error', new Error('Invalid subscriptions - invalid No Local')) + return false + } + const rap = subs[i].rap || false + if (typeof rap !== 'boolean') { + stream.emit('error', new Error('Invalid subscriptions - invalid Retain as Published')) + return false + } + const rh = subs[i].rh || 0 + if (typeof rh !== 'number' || rh > 2) { + stream.emit('error', new Error('Invalid subscriptions - invalid Retain Handling')) + return false + } + } + + length += Buffer.byteLength(itopic) + 2 + 1 + } + } else { + stream.emit('error', new Error('Invalid subscriptions')) + return false + } + + // Generate header + debug('subscribe: writing to stream: %o', protocol.SUBSCRIBE_HEADER) + stream.write(protocol.SUBSCRIBE_HEADER[1][dup ? 1 : 0][0]) + + // Generate length + writeVarByteInt(stream, length) + + // Generate message ID + writeNumber(stream, id) + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + + let result = true + + // Generate subs + for (const sub of subs) { + const jtopic = sub.topic + const jqos = sub.qos + const jnl = +sub.nl + const jrap = +sub.rap + const jrh = sub.rh + let joptions + + // Write topic string + writeString(stream, jtopic) + + // options process + joptions = protocol.SUBSCRIBE_OPTIONS_QOS[jqos] + if (version === 5) { + joptions |= jnl ? protocol.SUBSCRIBE_OPTIONS_NL : 0 + joptions |= jrap ? protocol.SUBSCRIBE_OPTIONS_RAP : 0 + joptions |= jrh ? protocol.SUBSCRIBE_OPTIONS_RH[jrh] : 0 + } + // Write options + result = stream.write(Buffer.from([joptions])) + } + + return result +} + +function suback (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const id = settings.messageId + const granted = settings.granted + const properties = settings.properties + let length = 0 + + // Check message ID + if (typeof id !== 'number') { + stream.emit('error', new Error('Invalid messageId')) + return false + } else length += 2 + + // Check granted qos vector + if (typeof granted === 'object' && granted.length) { + for (let i = 0; i < granted.length; i += 1) { + if (typeof granted[i] !== 'number') { + stream.emit('error', new Error('Invalid qos vector')) + return false + } + length += 1 + } + } else { + stream.emit('error', new Error('Invalid qos vector')) + return false + } + + // properies mqtt 5 + let propertiesData = null + if (version === 5) { + propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // header + stream.write(protocol.SUBACK_HEADER) + + // Length + writeVarByteInt(stream, length) + + // Message ID + writeNumber(stream, id) + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + + return stream.write(Buffer.from(granted)) +} + +function unsubscribe (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const id = settings.messageId + const dup = settings.dup ? protocol.DUP_MASK : 0 + const unsubs = settings.unsubscriptions + const properties = settings.properties + + let length = 0 + + // Check message ID + if (typeof id !== 'number') { + stream.emit('error', new Error('Invalid messageId')) + return false + } else { + length += 2 + } + // Check unsubs + if (typeof unsubs === 'object' && unsubs.length) { + for (let i = 0; i < unsubs.length; i += 1) { + if (typeof unsubs[i] !== 'string') { + stream.emit('error', new Error('Invalid unsubscriptions')) + return false + } + length += Buffer.byteLength(unsubs[i]) + 2 + } + } else { + stream.emit('error', new Error('Invalid unsubscriptions')) + return false + } + // properies mqtt 5 + let propertiesData = null + if (version === 5) { + propertiesData = getProperties(stream, properties) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // Header + stream.write(protocol.UNSUBSCRIBE_HEADER[1][dup ? 1 : 0][0]) + + // Length + writeVarByteInt(stream, length) + + // Message ID + writeNumber(stream, id) + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + + // Unsubs + let result = true + for (let j = 0; j < unsubs.length; j++) { + result = writeString(stream, unsubs[j]) + } + + return result +} + +function unsuback (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const id = settings.messageId + const dup = settings.dup ? protocol.DUP_MASK : 0 + const granted = settings.granted + const properties = settings.properties + const type = settings.cmd + const qos = 0 + + let length = 2 + + // Check message ID + if (typeof id !== 'number') { + stream.emit('error', new Error('Invalid messageId')) + return false + } + + // Check granted + if (version === 5) { + if (typeof granted === 'object' && granted.length) { + for (let i = 0; i < granted.length; i += 1) { + if (typeof granted[i] !== 'number') { + stream.emit('error', new Error('Invalid qos vector')) + return false + } + length += 1 + } + } else { + stream.emit('error', new Error('Invalid qos vector')) + return false + } + } + + // properies mqtt 5 + let propertiesData = null + if (version === 5) { + propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // Header + stream.write(protocol.ACKS[type][qos][dup][0]) + + // Length + writeVarByteInt(stream, length) + + // Message ID + writeNumber(stream, id) + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + + // payload + if (version === 5) { + stream.write(Buffer.from(granted)) + } + return true +} + +function emptyPacket (packet, stream, opts) { + return stream.write(protocol.EMPTY[packet.cmd]) +} + +function disconnect (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const reasonCode = settings.reasonCode + const properties = settings.properties + let length = version === 5 ? 1 : 0 + + // properies mqtt 5 + let propertiesData = null + if (version === 5) { + propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length) + if (!propertiesData) { return false } + length += propertiesData.length + } + + // Header + stream.write(Buffer.from([protocol.codes.disconnect << 4])) + + // Length + writeVarByteInt(stream, length) + + // reason code in header + if (version === 5) { + stream.write(Buffer.from([reasonCode])) + } + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + + return true +} + +function auth (packet, stream, opts) { + const version = opts ? opts.protocolVersion : 4 + const settings = packet || {} + const reasonCode = settings.reasonCode + const properties = settings.properties + let length = version === 5 ? 1 : 0 + + if (version !== 5) stream.emit('error', new Error('Invalid mqtt version for auth packet')) + + // properies mqtt 5 + const propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length) + if (!propertiesData) { return false } + length += propertiesData.length + + // Header + stream.write(Buffer.from([protocol.codes.auth << 4])) + + // Length + writeVarByteInt(stream, length) + + // reason code in header + stream.write(Buffer.from([reasonCode])) + + // properies mqtt 5 + if (propertiesData !== null) { + propertiesData.write() + } + return true +} + +/** + * writeVarByteInt - write an MQTT style variable byte integer to the buffer + * + * @param buffer - destination + * @param pos - offset + * @param length - length (>0) + * @returns number of bytes written + * + * @api private + */ + +const varByteIntCache = {} +function writeVarByteInt (stream, num) { + let buffer = varByteIntCache[num] + + if (!buffer) { + buffer = genBufVariableByteInt(num) + if (num < 16384) varByteIntCache[num] = buffer + } + debug('writeVarByteInt: writing to stream: %o', buffer) + stream.write(buffer) +} + +/** + * writeString - write a utf8 string to the buffer + * + * @param buffer - destination + * @param pos - offset + * @param string - string to write + * @return number of bytes written + * + * @api private + */ + +function writeString (stream, string) { + const strlen = Buffer.byteLength(string) + writeNumber(stream, strlen) + + debug('writeString: %s', string) + return stream.write(string, 'utf8') +} + +/** + * writeStringPair - write a utf8 string pairs to the buffer + * + * @param buffer - destination + * @param name - string name to write + * @param value - string value to write + * @return number of bytes written + * + * @api private + */ +function writeStringPair (stream, name, value) { + writeString(stream, name) + writeString(stream, value) +} + +/** + * writeNumber - write a two byte number to the buffer + * + * @param buffer - destination + * @param pos - offset + * @param number - number to write + * @return number of bytes written + * + * @api private + */ +function writeNumberCached (stream, number) { + debug('writeNumberCached: number: %d', number) + debug('writeNumberCached: %o', numCache[number]) + return stream.write(numCache[number]) +} +function writeNumberGenerated (stream, number) { + const generatedNumber = generateNumber(number) + debug('writeNumberGenerated: %o', generatedNumber) + return stream.write(generatedNumber) +} +function write4ByteNumber (stream, number) { + const generated4ByteBuffer = generate4ByteBuffer(number) + debug('write4ByteNumber: %o', generated4ByteBuffer) + return stream.write(generated4ByteBuffer) +} +/** + * writeStringOrBuffer - write a String or Buffer with the its length prefix + * + * @param buffer - destination + * @param pos - offset + * @param toWrite - String or Buffer + * @return number of bytes written + */ +function writeStringOrBuffer (stream, toWrite) { + if (typeof toWrite === 'string') { + writeString(stream, toWrite) + } else if (toWrite) { + writeNumber(stream, toWrite.length) + stream.write(toWrite) + } else writeNumber(stream, 0) +} + +function getProperties (stream, properties) { + /* connect properties */ + if (typeof properties !== 'object' || properties.length != null) { + return { + length: 1, + write () { + writeProperties(stream, {}, 0) + } + } + } + let propertiesLength = 0 + function getLengthProperty (name, value) { + const type = protocol.propertiesTypes[name] + let length = 0 + switch (type) { + case 'byte': { + if (typeof value !== 'boolean') { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + 1 + break + } + case 'int8': { + if (typeof value !== 'number' || value < 0 || value > 0xff) { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + 1 + break + } + case 'binary': { + if (value && value === null) { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + Buffer.byteLength(value) + 2 + break + } + case 'int16': { + if (typeof value !== 'number' || value < 0 || value > 0xffff) { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + 2 + break + } + case 'int32': { + if (typeof value !== 'number' || value < 0 || value > 0xffffffff) { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + 4 + break + } + case 'var': { + // var byte integer is max 24 bits packed in 32 bits + if (typeof value !== 'number' || value < 0 || value > 0x0fffffff) { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + Buffer.byteLength(genBufVariableByteInt(value)) + break + } + case 'string': { + if (typeof value !== 'string') { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += 1 + 2 + Buffer.byteLength(value.toString()) + break + } + case 'pair': { + if (typeof value !== 'object') { + stream.emit('error', new Error(`Invalid ${name}: ${value}`)) + return false + } + length += Object.getOwnPropertyNames(value).reduce((result, name) => { + const currentValue = value[name] + if (Array.isArray(currentValue)) { + result += currentValue.reduce((currentLength, value) => { + currentLength += 1 + 2 + Buffer.byteLength(name.toString()) + 2 + Buffer.byteLength(value.toString()) + return currentLength + }, 0) + } else { + result += 1 + 2 + Buffer.byteLength(name.toString()) + 2 + Buffer.byteLength(value[name].toString()) + } + return result + }, 0) + break + } + default: { + stream.emit('error', new Error(`Invalid property ${name}: ${value}`)) + return false + } + } + return length + } + if (properties) { + for (const propName in properties) { + let propLength = 0 + let propValueLength = 0 + const propValue = properties[propName] + if (Array.isArray(propValue)) { + for (let valueIndex = 0; valueIndex < propValue.length; valueIndex++) { + propValueLength = getLengthProperty(propName, propValue[valueIndex]) + if (!propValueLength) { return false } + propLength += propValueLength + } + } else { + propValueLength = getLengthProperty(propName, propValue) + if (!propValueLength) { return false } + propLength = propValueLength + } + if (!propLength) return false + propertiesLength += propLength + } + } + const propertiesLengthLength = Buffer.byteLength(genBufVariableByteInt(propertiesLength)) + + return { + length: propertiesLengthLength + propertiesLength, + write () { + writeProperties(stream, properties, propertiesLength) + } + } +} + +function getPropertiesByMaximumPacketSize (stream, properties, opts, length) { + const mayEmptyProps = ['reasonString', 'userProperties'] + const maximumPacketSize = opts && opts.properties && opts.properties.maximumPacketSize ? opts.properties.maximumPacketSize : 0 + + let propertiesData = getProperties(stream, properties) + if (maximumPacketSize) { + while (length + propertiesData.length > maximumPacketSize) { + const currentMayEmptyProp = mayEmptyProps.shift() + if (currentMayEmptyProp && properties[currentMayEmptyProp]) { + delete properties[currentMayEmptyProp] + propertiesData = getProperties(stream, properties) + } else { + return false + } + } + } + return propertiesData +} + +function writeProperty (stream, propName, value) { + const type = protocol.propertiesTypes[propName] + switch (type) { + case 'byte': { + stream.write(Buffer.from([protocol.properties[propName]])) + stream.write(Buffer.from([+value])) + break + } + case 'int8': { + stream.write(Buffer.from([protocol.properties[propName]])) + stream.write(Buffer.from([value])) + break + } + case 'binary': { + stream.write(Buffer.from([protocol.properties[propName]])) + writeStringOrBuffer(stream, value) + break + } + case 'int16': { + stream.write(Buffer.from([protocol.properties[propName]])) + writeNumber(stream, value) + break + } + case 'int32': { + stream.write(Buffer.from([protocol.properties[propName]])) + write4ByteNumber(stream, value) + break + } + case 'var': { + stream.write(Buffer.from([protocol.properties[propName]])) + writeVarByteInt(stream, value) + break + } + case 'string': { + stream.write(Buffer.from([protocol.properties[propName]])) + writeString(stream, value) + break + } + case 'pair': { + Object.getOwnPropertyNames(value).forEach(name => { + const currentValue = value[name] + if (Array.isArray(currentValue)) { + currentValue.forEach(value => { + stream.write(Buffer.from([protocol.properties[propName]])) + writeStringPair(stream, name.toString(), value.toString()) + }) + } else { + stream.write(Buffer.from([protocol.properties[propName]])) + writeStringPair(stream, name.toString(), currentValue.toString()) + } + }) + break + } + default: { + stream.emit('error', new Error(`Invalid property ${propName} value: ${value}`)) + return false + } + } +} + +function writeProperties (stream, properties, propertiesLength) { + /* write properties to stream */ + writeVarByteInt(stream, propertiesLength) + for (const propName in properties) { + if (Object.prototype.hasOwnProperty.call(properties, propName) && properties[propName] !== null) { + const value = properties[propName] + if (Array.isArray(value)) { + for (let valueIndex = 0; valueIndex < value.length; valueIndex++) { + writeProperty(stream, propName, value[valueIndex]) + } + } else { + writeProperty(stream, propName, value) + } + } + } +} + +function byteLength (bufOrString) { + if (!bufOrString) return 0 + else if (bufOrString instanceof Buffer) return bufOrString.length + else return Buffer.byteLength(bufOrString) +} + +function isStringOrBuffer (field) { + return typeof field === 'string' || field instanceof Buffer +} + +module.exports = generate + +}).call(this,require("buffer").Buffer) +},{"./constants":32,"./numbers":37,"buffer":12,"debug":14,"process-nextick-args":43}],41:[function(require,module,exports){ +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} + +},{}],42:[function(require,module,exports){ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + +},{"wrappy":66}],43:[function(require,module,exports){ +(function (process){ +'use strict'; + +if (typeof process === 'undefined' || + !process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = { nextTick: nextTick }; +} else { + module.exports = process +} + +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); + } + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); + } +} + + +}).call(this,require('_process')) +},{"_process":44}],44:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],45:[function(require,module,exports){ +'use strict'; + +function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } + +var codes = {}; + +function createErrorType(code, message, Base) { + if (!Base) { + Base = Error; + } + + function getMessage(arg1, arg2, arg3) { + if (typeof message === 'string') { + return message; + } else { + return message(arg1, arg2, arg3); + } + } + + var NodeError = + /*#__PURE__*/ + function (_Base) { + _inheritsLoose(NodeError, _Base); + + function NodeError(arg1, arg2, arg3) { + return _Base.call(this, getMessage(arg1, arg2, arg3)) || this; + } + + return NodeError; + }(Base); + + NodeError.prototype.name = Base.name; + NodeError.prototype.code = code; + codes[code] = NodeError; +} // https://github.com/nodejs/node/blob/v10.8.0/lib/internal/errors.js + + +function oneOf(expected, thing) { + if (Array.isArray(expected)) { + var len = expected.length; + expected = expected.map(function (i) { + return String(i); + }); + + if (len > 2) { + return "one of ".concat(thing, " ").concat(expected.slice(0, len - 1).join(', '), ", or ") + expected[len - 1]; + } else if (len === 2) { + return "one of ".concat(thing, " ").concat(expected[0], " or ").concat(expected[1]); + } else { + return "of ".concat(thing, " ").concat(expected[0]); + } + } else { + return "of ".concat(thing, " ").concat(String(expected)); + } +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + + +function startsWith(str, search, pos) { + return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith + + +function endsWith(str, search, this_len) { + if (this_len === undefined || this_len > str.length) { + this_len = str.length; + } + + return str.substring(this_len - search.length, this_len) === search; +} // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes + + +function includes(str, search, start) { + if (typeof start !== 'number') { + start = 0; + } + + if (start + search.length > str.length) { + return false; + } else { + return str.indexOf(search, start) !== -1; + } +} + +createErrorType('ERR_INVALID_OPT_VALUE', function (name, value) { + return 'The value "' + value + '" is invalid for option "' + name + '"'; +}, TypeError); +createErrorType('ERR_INVALID_ARG_TYPE', function (name, expected, actual) { + // determiner: 'must be' or 'must not be' + var determiner; + + if (typeof expected === 'string' && startsWith(expected, 'not ')) { + determiner = 'must not be'; + expected = expected.replace(/^not /, ''); + } else { + determiner = 'must be'; + } + + var msg; + + if (endsWith(name, ' argument')) { + // For cases like 'first argument' + msg = "The ".concat(name, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } else { + var type = includes(name, '.') ? 'property' : 'argument'; + msg = "The \"".concat(name, "\" ").concat(type, " ").concat(determiner, " ").concat(oneOf(expected, 'type')); + } + + msg += ". Received type ".concat(typeof actual); + return msg; +}, TypeError); +createErrorType('ERR_STREAM_PUSH_AFTER_EOF', 'stream.push() after EOF'); +createErrorType('ERR_METHOD_NOT_IMPLEMENTED', function (name) { + return 'The ' + name + ' method is not implemented'; +}); +createErrorType('ERR_STREAM_PREMATURE_CLOSE', 'Premature close'); +createErrorType('ERR_STREAM_DESTROYED', function (name) { + return 'Cannot call ' + name + ' after a stream was destroyed'; +}); +createErrorType('ERR_MULTIPLE_CALLBACK', 'Callback called multiple times'); +createErrorType('ERR_STREAM_CANNOT_PIPE', 'Cannot pipe, not readable'); +createErrorType('ERR_STREAM_WRITE_AFTER_END', 'write after end'); +createErrorType('ERR_STREAM_NULL_VALUES', 'May not write null values to stream', TypeError); +createErrorType('ERR_UNKNOWN_ENCODING', function (arg) { + return 'Unknown encoding: ' + arg; +}, TypeError); +createErrorType('ERR_STREAM_UNSHIFT_AFTER_END_EVENT', 'stream.unshift() after end event'); +module.exports.codes = codes; + +},{}],46:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. +'use strict'; +/**/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + + for (var key in obj) { + keys.push(key); + } + + return keys; +}; +/**/ + + +module.exports = Duplex; + +var Readable = require('./_stream_readable'); + +var Writable = require('./_stream_writable'); + +require('inherits')(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + var keys = objectKeys(Writable.prototype); + + for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; + } +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + Readable.call(this, options); + Writable.call(this, options); + this.allowHalfOpen = true; + + if (options) { + if (options.readable === false) this.readable = false; + if (options.writable === false) this.writable = false; + + if (options.allowHalfOpen === false) { + this.allowHalfOpen = false; + this.once('end', onend); + } + } +} + +Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); +Object.defineProperty(Duplex.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); +Object.defineProperty(Duplex.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); // the no-half-open enforcer + +function onend() { + // If the writable side ended, then we're ok. + if (this._writableState.ended) return; // no more data can be written. + // But allow more writes to happen in this tick. + + process.nextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +Object.defineProperty(Duplex.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined || this._writableState === undefined) { + return false; + } + + return this._readableState.destroyed && this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (this._readableState === undefined || this._writableState === undefined) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + this._writableState.destroyed = value; + } +}); +}).call(this,require('_process')) +},{"./_stream_readable":48,"./_stream_writable":50,"_process":44,"inherits":29}],47:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +require('inherits')(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +}; +},{"./_stream_transform":49,"inherits":29}],48:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +'use strict'; + +module.exports = Readable; +/**/ + +var Duplex; +/**/ + +Readable.ReadableState = ReadableState; +/**/ + +var EE = require('events').EventEmitter; + +var EElistenerCount = function EElistenerCount(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +/**/ + + +var Stream = require('./internal/streams/stream'); +/**/ + + +var Buffer = require('buffer').Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} +/**/ + + +var debugUtil = require('util'); + +var debug; + +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function debug() {}; +} +/**/ + + +var BufferList = require('./internal/streams/buffer_list'); + +var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_STREAM_PUSH_AFTER_EOF = _require$codes.ERR_STREAM_PUSH_AFTER_EOF, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_STREAM_UNSHIFT_AFTER_END_EVENT = _require$codes.ERR_STREAM_UNSHIFT_AFTER_END_EVENT; // Lazy loaded to improve the startup performance. + + +var StringDecoder; +var createReadableStreamAsyncIterator; +var from; + +require('inherits')(Readable, Stream); + +var errorOrDestroy = destroyImpl.errorOrDestroy; +var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; + +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (Array.isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; +} + +function ReadableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream. + // These options can be provided separately as readableXXX and writableXXX. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + + this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex); // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; // a flag to be able to tell if the event 'readable'/'data' is emitted + // immediately, or on a later tick. We set this to true at first, because + // any actions that shouldn't happen until "later" should generally also + // not happen before the first read call. + + this.sync = true; // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + this.paused = true; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'end' (and potentially 'finish') + + this.autoDestroy = !!options.autoDestroy; // has it been destroyed + + this.destroyed = false; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // the number of writers that are awaiting a drain event in .pipe()s + + this.awaitDrain = 0; // if true, a maybeReadMore has been scheduled + + this.readingMore = false; + this.decoder = null; + this.encoding = null; + + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + if (!(this instanceof Readable)) return new Readable(options); // Checking for a Stream.Duplex instance is faster here instead of inside + // the ReadableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + this._readableState = new ReadableState(options, this, isDuplex); // legacy + + this.readable = true; + + if (options) { + if (typeof options.read === 'function') this._read = options.read; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + } + + Stream.call(this); +} + +Object.defineProperty(Readable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._readableState === undefined) { + return false; + } + + return this._readableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._readableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._readableState.destroyed = value; + } +}); +Readable.prototype.destroy = destroyImpl.destroy; +Readable.prototype._undestroy = destroyImpl.undestroy; + +Readable.prototype._destroy = function (err, cb) { + cb(err); +}; // Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. + + +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + var skipChunkCheck; + + if (!state.objectMode) { + if (typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + + if (encoding !== state.encoding) { + chunk = Buffer.from(chunk, encoding); + encoding = ''; + } + + skipChunkCheck = true; + } + } else { + skipChunkCheck = true; + } + + return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); +}; // Unshift should *always* be something directly out of read() + + +Readable.prototype.unshift = function (chunk) { + return readableAddChunk(this, chunk, null, true, false); +}; + +function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { + debug('readableAddChunk', chunk); + var state = stream._readableState; + + if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else { + var er; + if (!skipChunkCheck) er = chunkInvalid(state, chunk); + + if (er) { + errorOrDestroy(stream, er); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (addToFront) { + if (state.endEmitted) errorOrDestroy(stream, new ERR_STREAM_UNSHIFT_AFTER_END_EVENT());else addChunk(stream, state, chunk, true); + } else if (state.ended) { + errorOrDestroy(stream, new ERR_STREAM_PUSH_AFTER_EOF()); + } else if (state.destroyed) { + return false; + } else { + state.reading = false; + + if (state.decoder && !encoding) { + chunk = state.decoder.write(chunk); + if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); + } else { + addChunk(stream, state, chunk, false); + } + } + } else if (!addToFront) { + state.reading = false; + maybeReadMore(stream, state); + } + } // We can push more data if we are below the highWaterMark. + // Also, if we have no data yet, we can stand some more bytes. + // This is to work around cases where hwm=0, such as the repl. + + + return !state.ended && (state.length < state.highWaterMark || state.length === 0); +} + +function addChunk(stream, state, chunk, addToFront) { + if (state.flowing && state.length === 0 && !state.sync) { + state.awaitDrain = 0; + stream.emit('data', chunk); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + if (state.needReadable) emitReadable(stream); + } + + maybeReadMore(stream, state); +} + +function chunkInvalid(state, chunk) { + var er; + + if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer', 'Uint8Array'], chunk); + } + + return er; +} + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; // backwards compatibility. + + +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + var decoder = new StringDecoder(enc); + this._readableState.decoder = decoder; // If setEncoding(null), decoder.encoding equals utf8 + + this._readableState.encoding = this._readableState.decoder.encoding; // Iterate over current buffer to convert already stored Buffers: + + var p = this._readableState.buffer.head; + var content = ''; + + while (p !== null) { + content += decoder.write(p.data); + p = p.next; + } + + this._readableState.buffer.clear(); + + if (content !== '') this._readableState.buffer.push(content); + this._readableState.length = content.length; + return this; +}; // Don't raise the hwm > 1GB + + +var MAX_HWM = 0x40000000; + +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + // TODO(ronag): Throw ERR_VALUE_OUT_OF_RANGE. + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + + return n; +} // This function is designed to be inlinable, so please take care when making +// changes to the function body. + + +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } // If we're asking for more than the current hwm, then raise the hwm. + + + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; // Don't have enough + + if (!state.ended) { + state.needReadable = true; + return 0; + } + + return state.length; +} // you can override either this method, or the async _read(n) below. + + +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + if (n !== 0) state.emittedReadable = false; // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + + if (n === 0 && state.needReadable && ((state.highWaterMark !== 0 ? state.length >= state.highWaterMark : state.length > 0) || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); // if we've ended, and we're now clear, then finish it up. + + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + // if we need a readable event, then we need to do some reading. + + + var doRead = state.needReadable; + debug('need readable', doRead); // if we currently have less than the highWaterMark, then also read some + + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + + + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; // if the length is currently zero, then we *need* a readable event. + + if (state.length === 0) state.needReadable = true; // call internal read method + + this._read(state.highWaterMark); + + state.sync = false; // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = state.length <= state.highWaterMark; + n = 0; + } else { + state.length -= n; + state.awaitDrain = 0; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; // If we tried to read() past the EOF, then emit end on the next tick. + + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + return ret; +}; + +function onEofChunk(stream, state) { + debug('onEofChunk'); + if (state.ended) return; + + if (state.decoder) { + var chunk = state.decoder.end(); + + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + + state.ended = true; + + if (state.sync) { + // if we are sync, wait until next tick to emit the data. + // Otherwise we risk emitting data in the flow() + // the readable code triggers during a read() call + emitReadable(stream); + } else { + // emit 'readable' now to make sure it gets picked up. + state.needReadable = false; + + if (!state.emittedReadable) { + state.emittedReadable = true; + emitReadable_(stream); + } + } +} // Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. + + +function emitReadable(stream) { + var state = stream._readableState; + debug('emitReadable', state.needReadable, state.emittedReadable); + state.needReadable = false; + + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + process.nextTick(emitReadable_, stream); + } +} + +function emitReadable_(stream) { + var state = stream._readableState; + debug('emitReadable_', state.destroyed, state.length, state.ended); + + if (!state.destroyed && (state.length || state.ended)) { + stream.emit('readable'); + state.emittedReadable = false; + } // The stream needs another readable event if + // 1. It is not flowing, as the flow mechanism will take + // care of it. + // 2. It is not ended. + // 3. It is below the highWaterMark, so we can schedule + // another readable later. + + + state.needReadable = !state.flowing && !state.ended && state.length <= state.highWaterMark; + flow(stream); +} // at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. + + +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + // Attempt to read more data if we should. + // + // The conditions for reading more data are (one of): + // - Not enough data buffered (state.length < state.highWaterMark). The loop + // is responsible for filling the buffer with enough data if such data + // is available. If highWaterMark is 0 and we are not in the flowing mode + // we should _not_ attempt to buffer any extra data. We'll get more data + // when the stream consumer calls read() instead. + // - No data in the buffer, and the stream is in flowing mode. In this mode + // the loop below is responsible for ensuring read() is called. Failing to + // call read here would abort the flow and there's no other mechanism for + // continuing the flow if the stream consumer has just subscribed to the + // 'data' event. + // + // In addition to the above conditions to keep reading data, the following + // conditions prevent the data from being read: + // - The stream has ended (state.ended). + // - There is already a pending 'read' operation (state.reading). This is a + // case where the the stream has called the implementation defined _read() + // method, but they are processing the call asynchronously and have _not_ + // called push() with new data. In this case we skip performing more + // read()s. The execution ends in this method again after the _read() ends + // up calling push() with more data. + while (!state.reading && !state.ended && (state.length < state.highWaterMark || state.flowing && state.length === 0)) { + var len = state.length; + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) // didn't get any data, stop spinning. + break; + } + + state.readingMore = false; +} // abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. + + +Readable.prototype._read = function (n) { + errorOrDestroy(this, new ERR_METHOD_NOT_IMPLEMENTED('_read()')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + + case 1: + state.pipes = [state.pipes, dest]; + break; + + default: + state.pipes.push(dest); + break; + } + + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : unpipe; + if (state.endEmitted) process.nextTick(endFn);else src.once('end', endFn); + dest.on('unpipe', onunpipe); + + function onunpipe(readable, unpipeInfo) { + debug('onunpipe'); + + if (readable === src) { + if (unpipeInfo && unpipeInfo.hasUnpiped === false) { + unpipeInfo.hasUnpiped = true; + cleanup(); + } + } + } + + function onend() { + debug('onend'); + dest.end(); + } // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + + + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + var cleanedUp = false; + + function cleanup() { + debug('cleanup'); // cleanup event handlers once the pipe is broken + + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', unpipe); + src.removeListener('data', ondata); + cleanedUp = true; // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + src.on('data', ondata); + + function ondata(chunk) { + debug('ondata'); + var ret = dest.write(chunk); + debug('dest.write', ret); + + if (ret === false) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', state.awaitDrain); + state.awaitDrain++; + } + + src.pause(); + } + } // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + + + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) errorOrDestroy(dest, er); + } // Make sure our error handler is attached before userland ones. + + + prependListener(dest, 'error', onerror); // Both close and finish should trigger unpipe, but only once. + + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + + dest.once('close', onclose); + + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } // tell the dest that it's being piped to + + + dest.emit('pipe', src); // start the flow if it hasn't been started already. + + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function pipeOnDrainFunctionResult() { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + var unpipeInfo = { + hasUnpiped: false + }; // if we're not piping anywhere, then do nothing. + + if (state.pipesCount === 0) return this; // just one destination. most common case. + + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + if (!dest) dest = state.pipes; // got a match. + + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this, unpipeInfo); + return this; + } // slow case. multiple pipe destinations. + + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var i = 0; i < len; i++) { + dests[i].emit('unpipe', this, { + hasUnpiped: false + }); + } + + return this; + } // try to find the right one. + + + var index = indexOf(state.pipes, dest); + if (index === -1) return this; + state.pipes.splice(index, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + dest.emit('unpipe', this, unpipeInfo); + return this; +}; // set up data events if they are asked for +// Ensure readable listeners eventually get something + + +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + var state = this._readableState; + + if (ev === 'data') { + // update readableListening so that resume() may be a no-op + // a few lines down. This is needed to support once('readable'). + state.readableListening = this.listenerCount('readable') > 0; // Try start flowing on next tick if stream isn't explicitly paused + + if (state.flowing !== false) this.resume(); + } else if (ev === 'readable') { + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.flowing = false; + state.emittedReadable = false; + debug('on readable', state.length, state.reading); + + if (state.length) { + emitReadable(this); + } else if (!state.reading) { + process.nextTick(nReadingNextTick, this); + } + } + } + + return res; +}; + +Readable.prototype.addListener = Readable.prototype.on; + +Readable.prototype.removeListener = function (ev, fn) { + var res = Stream.prototype.removeListener.call(this, ev, fn); + + if (ev === 'readable') { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +Readable.prototype.removeAllListeners = function (ev) { + var res = Stream.prototype.removeAllListeners.apply(this, arguments); + + if (ev === 'readable' || ev === undefined) { + // We need to check if there is someone still listening to + // readable and reset the state. However this needs to happen + // after readable has been emitted but before I/O (nextTick) to + // support once('readable', fn) cycles. This means that calling + // resume within the same tick will have no + // effect. + process.nextTick(updateReadableListening, this); + } + + return res; +}; + +function updateReadableListening(self) { + var state = self._readableState; + state.readableListening = self.listenerCount('readable') > 0; + + if (state.resumeScheduled && !state.paused) { + // flowing needs to be set to true now, otherwise + // the upcoming resume will not flow. + state.flowing = true; // crude way to check if we should resume + } else if (self.listenerCount('data') > 0) { + self.resume(); + } +} + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} // pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. + + +Readable.prototype.resume = function () { + var state = this._readableState; + + if (!state.flowing) { + debug('resume'); // we flow only if there is no one listening + // for readable, but we still have to call + // resume() + + state.flowing = !state.readableListening; + resume(this, state); + } + + state.paused = false; + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + debug('resume', state.reading); + + if (!state.reading) { + stream.read(0); + } + + state.resumeScheduled = false; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + + if (this._readableState.flowing !== false) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + + this._readableState.paused = true; + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + + while (state.flowing && stream.read() !== null) { + ; + } +} // wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. + + +Readable.prototype.wrap = function (stream) { + var _this = this; + + var state = this._readableState; + var paused = false; + stream.on('end', function () { + debug('wrapped end'); + + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) _this.push(chunk); + } + + _this.push(null); + }); + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); // don't skip over falsy values in objectMode + + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = _this.push(chunk); + + if (!ret) { + paused = true; + stream.pause(); + } + }); // proxy all the other methods. + // important when wrapping filters and duplexes. + + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function methodWrap(method) { + return function methodWrapReturnFunction() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } // proxy certain important events. + + + for (var n = 0; n < kProxyEvents.length; n++) { + stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); + } // when we try to consume some more bytes, simply unpause the + // underlying stream. + + + this._read = function (n) { + debug('wrapped _read', n); + + if (paused) { + paused = false; + stream.resume(); + } + }; + + return this; +}; + +if (typeof Symbol === 'function') { + Readable.prototype[Symbol.asyncIterator] = function () { + if (createReadableStreamAsyncIterator === undefined) { + createReadableStreamAsyncIterator = require('./internal/streams/async_iterator'); + } + + return createReadableStreamAsyncIterator(this); + }; +} + +Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.highWaterMark; + } +}); +Object.defineProperty(Readable.prototype, 'readableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState && this._readableState.buffer; + } +}); +Object.defineProperty(Readable.prototype, 'readableFlowing', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.flowing; + }, + set: function set(state) { + if (this._readableState) { + this._readableState.flowing = state; + } + } +}); // exposed for testing purposes only. + +Readable._fromList = fromList; +Object.defineProperty(Readable.prototype, 'readableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._readableState.length; + } +}); // Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. + +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.first();else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = state.buffer.consume(n, state.decoder); + } + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + debug('endReadable', state.endEmitted); + + if (!state.endEmitted) { + state.ended = true; + process.nextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + debug('endReadableNT', state.endEmitted, state.length); // Check that we didn't get one last unshift. + + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the writable side is ready for autoDestroy as well + var wState = stream._writableState; + + if (!wState || wState.autoDestroy && wState.finished) { + stream.destroy(); + } + } + } +} + +if (typeof Symbol === 'function') { + Readable.from = function (iterable, opts) { + if (from === undefined) { + from = require('./internal/streams/from'); + } + + return from(Readable, iterable, opts); + }; +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + + return -1; +} +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../errors":45,"./_stream_duplex":46,"./internal/streams/async_iterator":51,"./internal/streams/buffer_list":52,"./internal/streams/destroy":53,"./internal/streams/from":55,"./internal/streams/state":57,"./internal/streams/stream":58,"_process":44,"buffer":12,"events":27,"inherits":29,"string_decoder/":63,"util":11}],49:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. +'use strict'; + +module.exports = Transform; + +var _require$codes = require('../errors').codes, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_TRANSFORM_ALREADY_TRANSFORMING = _require$codes.ERR_TRANSFORM_ALREADY_TRANSFORMING, + ERR_TRANSFORM_WITH_LENGTH_0 = _require$codes.ERR_TRANSFORM_WITH_LENGTH_0; + +var Duplex = require('./_stream_duplex'); + +require('inherits')(Transform, Duplex); + +function afterTransform(er, data) { + var ts = this._transformState; + ts.transforming = false; + var cb = ts.writecb; + + if (cb === null) { + return this.emit('error', new ERR_MULTIPLE_CALLBACK()); + } + + ts.writechunk = null; + ts.writecb = null; + if (data != null) // single equals check for both `null` and `undefined` + this.push(data); + cb(er); + var rs = this._readableState; + rs.reading = false; + + if (rs.needReadable || rs.length < rs.highWaterMark) { + this._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + Duplex.call(this, options); + this._transformState = { + afterTransform: afterTransform.bind(this), + needTransform: false, + transforming: false, + writecb: null, + writechunk: null, + writeencoding: null + }; // start out asking for a readable event once data is transformed. + + this._readableState.needReadable = true; // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + if (typeof options.flush === 'function') this._flush = options.flush; + } // When the writable side finishes, then flush out anything remaining. + + + this.on('prefinish', prefinish); +} + +function prefinish() { + var _this = this; + + if (typeof this._flush === 'function' && !this._readableState.destroyed) { + this._flush(function (er, data) { + done(_this, er, data); + }); + } else { + done(this, null, null); + } +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; // This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. + + +Transform.prototype._transform = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_transform()')); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; // Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. + + +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && !ts.transforming) { + ts.transforming = true; + + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +Transform.prototype._destroy = function (err, cb) { + Duplex.prototype._destroy.call(this, err, function (err2) { + cb(err2); + }); +}; + +function done(stream, er, data) { + if (er) return stream.emit('error', er); + if (data != null) // single equals check for both `null` and `undefined` + stream.push(data); // TODO(BridgeAR): Write a test for these two error cases + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + + if (stream._writableState.length) throw new ERR_TRANSFORM_WITH_LENGTH_0(); + if (stream._transformState.transforming) throw new ERR_TRANSFORM_ALREADY_TRANSFORMING(); + return stream.push(null); +} +},{"../errors":45,"./_stream_duplex":46,"inherits":29}],50:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. +'use strict'; + +module.exports = Writable; +/* */ + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} // It seems a linked list but it is not +// there will be only 2 of these for each stream + + +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function () { + onCorkedFinish(_this, state); + }; +} +/* */ + +/**/ + + +var Duplex; +/**/ + +Writable.WritableState = WritableState; +/**/ + +var internalUtil = { + deprecate: require('util-deprecate') +}; +/**/ + +/**/ + +var Stream = require('./internal/streams/stream'); +/**/ + + +var Buffer = require('buffer').Buffer; + +var OurUint8Array = global.Uint8Array || function () {}; + +function _uint8ArrayToBuffer(chunk) { + return Buffer.from(chunk); +} + +function _isUint8Array(obj) { + return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; +} + +var destroyImpl = require('./internal/streams/destroy'); + +var _require = require('./internal/streams/state'), + getHighWaterMark = _require.getHighWaterMark; + +var _require$codes = require('../errors').codes, + ERR_INVALID_ARG_TYPE = _require$codes.ERR_INVALID_ARG_TYPE, + ERR_METHOD_NOT_IMPLEMENTED = _require$codes.ERR_METHOD_NOT_IMPLEMENTED, + ERR_MULTIPLE_CALLBACK = _require$codes.ERR_MULTIPLE_CALLBACK, + ERR_STREAM_CANNOT_PIPE = _require$codes.ERR_STREAM_CANNOT_PIPE, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED, + ERR_STREAM_NULL_VALUES = _require$codes.ERR_STREAM_NULL_VALUES, + ERR_STREAM_WRITE_AFTER_END = _require$codes.ERR_STREAM_WRITE_AFTER_END, + ERR_UNKNOWN_ENCODING = _require$codes.ERR_UNKNOWN_ENCODING; + +var errorOrDestroy = destroyImpl.errorOrDestroy; + +require('inherits')(Writable, Stream); + +function nop() {} + +function WritableState(options, stream, isDuplex) { + Duplex = Duplex || require('./_stream_duplex'); + options = options || {}; // Duplex streams are both readable and writable, but share + // the same options object. + // However, some cases require setting options to different + // values for the readable and the writable sides of the duplex stream, + // e.g. options.readableObjectMode vs. options.writableObjectMode, etc. + + if (typeof isDuplex !== 'boolean') isDuplex = stream instanceof Duplex; // object stream flag to indicate whether or not this stream + // contains buffers or objects. + + this.objectMode = !!options.objectMode; + if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + + this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex); // if _final has been called + + this.finalCalled = false; // drain event flag. + + this.needDrain = false; // at the start of calling end() + + this.ending = false; // when end() has been called, and returned + + this.ended = false; // when 'finish' is emitted + + this.finished = false; // has it been destroyed + + this.destroyed = false; // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + + this.defaultEncoding = options.defaultEncoding || 'utf8'; // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + + this.length = 0; // a flag to see when we're in the middle of a write. + + this.writing = false; // when true all writes will be buffered until .uncork() call + + this.corked = 0; // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + + this.sync = true; // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + + this.bufferProcessing = false; // the callback that's passed to _write(chunk,cb) + + this.onwrite = function (er) { + onwrite(stream, er); + }; // the callback that the user supplies to write(chunk,encoding,cb) + + + this.writecb = null; // the amount that is being written when _write is called. + + this.writelen = 0; + this.bufferedRequest = null; + this.lastBufferedRequest = null; // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + + this.pendingcb = 0; // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + + this.prefinished = false; // True if the error was already emitted and should not be thrown again + + this.errorEmitted = false; // Should close be emitted on destroy. Defaults to true. + + this.emitClose = options.emitClose !== false; // Should .destroy() be called after 'finish' (and potentially 'end') + + this.autoDestroy = !!options.autoDestroy; // count buffered requests + + this.bufferedRequestCount = 0; // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function getBuffer() { + var current = this.bufferedRequest; + var out = []; + + while (current) { + out.push(current); + current = current.next; + } + + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function writableStateBufferGetter() { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') + }); + } catch (_) {} +})(); // Test _writableState for inheritance to account for Duplex streams, +// whose prototype chain only points to Readable. + + +var realHasInstance; + +if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { + realHasInstance = Function.prototype[Symbol.hasInstance]; + Object.defineProperty(Writable, Symbol.hasInstance, { + value: function value(object) { + if (realHasInstance.call(this, object)) return true; + if (this !== Writable) return false; + return object && object._writableState instanceof WritableState; + } + }); +} else { + realHasInstance = function realHasInstance(object) { + return object instanceof this; + }; +} + +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); // Writable ctor is applied to Duplexes, too. + // `realHasInstance` is necessary because using plain `instanceof` + // would return false, as no `_writableState` property is attached. + // Trying to use the custom `instanceof` for Writable here will also break the + // Node.js LazyTransform implementation, which has a non-trivial getter for + // `_writableState` that would lead to infinite recursion. + // Checking for a Stream.Duplex instance is faster here instead of inside + // the WritableState constructor, at least with V8 6.5 + + var isDuplex = this instanceof Duplex; + if (!isDuplex && !realHasInstance.call(Writable, this)) return new Writable(options); + this._writableState = new WritableState(options, this, isDuplex); // legacy. + + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + if (typeof options.writev === 'function') this._writev = options.writev; + if (typeof options.destroy === 'function') this._destroy = options.destroy; + if (typeof options.final === 'function') this._final = options.final; + } + + Stream.call(this); +} // Otherwise people can pipe Writable streams, which is just wrong. + + +Writable.prototype.pipe = function () { + errorOrDestroy(this, new ERR_STREAM_CANNOT_PIPE()); +}; + +function writeAfterEnd(stream, cb) { + var er = new ERR_STREAM_WRITE_AFTER_END(); // TODO: defer error events consistently everywhere, not just the cb + + errorOrDestroy(stream, er); + process.nextTick(cb, er); +} // Checks that a user-supplied chunk is valid, especially for the particular +// mode the stream is in. Currently this means that `null` is never accepted +// and undefined/non-string values are only allowed in object mode. + + +function validChunk(stream, state, chunk, cb) { + var er; + + if (chunk === null) { + er = new ERR_STREAM_NULL_VALUES(); + } else if (typeof chunk !== 'string' && !state.objectMode) { + er = new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + } + + if (er) { + errorOrDestroy(stream, er); + process.nextTick(cb, er); + return false; + } + + return true; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + var isBuf = !state.objectMode && _isUint8Array(chunk); + + if (isBuf && !Buffer.isBuffer(chunk)) { + chunk = _uint8ArrayToBuffer(chunk); + } + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + if (typeof cb !== 'function') cb = nop; + if (state.ending) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); + } + return ret; +}; + +Writable.prototype.cork = function () { + this._writableState.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new ERR_UNKNOWN_ENCODING(encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableBuffer', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState && this._writableState.getBuffer(); + } +}); + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = Buffer.from(chunk, encoding); + } + + return chunk; +} + +Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.highWaterMark; + } +}); // if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. + +function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) { + if (!isBuf) { + var newChunk = decodeChunk(state, chunk, encoding); + + if (chunk !== newChunk) { + isBuf = true; + encoding = 'buffer'; + chunk = newChunk; + } + } + + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; // we must ensure that previous needDrain will not be reset to false. + + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = { + chunk: chunk, + encoding: encoding, + isBuf: isBuf, + callback: cb, + next: null + }; + + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (state.destroyed) state.onwrite(new ERR_STREAM_DESTROYED('write'));else if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); // this can emit finish, and it will always happen + // after error + + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + errorOrDestroy(stream, er); // this can emit finish, but finish must + // always follow error + + finishMaybe(stream, state); + } +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + if (typeof cb !== 'function') throw new ERR_MULTIPLE_CALLBACK(); + onwriteStateUpdate(state); + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state) || stream.destroyed; + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + process.nextTick(afterWrite, stream, state, finished, cb); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} // Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. + + +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} // if there's something in the buffer waiting, then process it + + +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + var count = 0; + var allBuffers = true; + + while (entry) { + buffer[count] = entry; + if (!entry.isBuf) allBuffers = false; + entry = entry.next; + count += 1; + } + + buffer.allBuffers = allBuffers; + doWrite(stream, state, true, state.length, buffer, '', holder.finish); // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + + state.pendingcb++; + state.lastBufferedRequest = null; + + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + + state.bufferedRequestCount = 0; + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + state.bufferedRequestCount--; // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new ERR_METHOD_NOT_IMPLEMENTED('_write()')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); // .end() fully uncorks + + if (state.corked) { + state.corked = 1; + this.uncork(); + } // ignore unnecessary end() calls. + + + if (!state.ending) endWritable(this, state, cb); + return this; +}; + +Object.defineProperty(Writable.prototype, 'writableLength', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + return this._writableState.length; + } +}); + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function callFinal(stream, state) { + stream._final(function (err) { + state.pendingcb--; + + if (err) { + errorOrDestroy(stream, err); + } + + state.prefinished = true; + stream.emit('prefinish'); + finishMaybe(stream, state); + }); +} + +function prefinish(stream, state) { + if (!state.prefinished && !state.finalCalled) { + if (typeof stream._final === 'function' && !state.destroyed) { + state.pendingcb++; + state.finalCalled = true; + process.nextTick(callFinal, stream, state); + } else { + state.prefinished = true; + stream.emit('prefinish'); + } + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + + if (need) { + prefinish(stream, state); + + if (state.pendingcb === 0) { + state.finished = true; + stream.emit('finish'); + + if (state.autoDestroy) { + // In case of duplex streams we need a way to detect + // if the readable side is ready for autoDestroy as well + var rState = stream._readableState; + + if (!rState || rState.autoDestroy && rState.endEmitted) { + stream.destroy(); + } + } + } + } + + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + + if (cb) { + if (state.finished) process.nextTick(cb);else stream.once('finish', cb); + } + + state.ended = true; + stream.writable = false; +} + +function onCorkedFinish(corkReq, state, err) { + var entry = corkReq.entry; + corkReq.entry = null; + + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } // reuse the free corkReq. + + + state.corkedRequestsFree.next = corkReq; +} + +Object.defineProperty(Writable.prototype, 'destroyed', { + // making it explicit this property is not enumerable + // because otherwise some prototype manipulation in + // userland will fail + enumerable: false, + get: function get() { + if (this._writableState === undefined) { + return false; + } + + return this._writableState.destroyed; + }, + set: function set(value) { + // we ignore the value if the stream + // has not been initialized yet + if (!this._writableState) { + return; + } // backward compatibility, the user is explicitly + // managing destroyed + + + this._writableState.destroyed = value; + } +}); +Writable.prototype.destroy = destroyImpl.destroy; +Writable.prototype._undestroy = destroyImpl.undestroy; + +Writable.prototype._destroy = function (err, cb) { + cb(err); +}; +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../errors":45,"./_stream_duplex":46,"./internal/streams/destroy":53,"./internal/streams/state":57,"./internal/streams/stream":58,"_process":44,"buffer":12,"inherits":29,"util-deprecate":65}],51:[function(require,module,exports){ +(function (process){ +'use strict'; + +var _Object$setPrototypeO; + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var finished = require('./end-of-stream'); + +var kLastResolve = Symbol('lastResolve'); +var kLastReject = Symbol('lastReject'); +var kError = Symbol('error'); +var kEnded = Symbol('ended'); +var kLastPromise = Symbol('lastPromise'); +var kHandlePromise = Symbol('handlePromise'); +var kStream = Symbol('stream'); + +function createIterResult(value, done) { + return { + value: value, + done: done + }; +} + +function readAndResolve(iter) { + var resolve = iter[kLastResolve]; + + if (resolve !== null) { + var data = iter[kStream].read(); // we defer if data is null + // we can be expecting either 'end' or + // 'error' + + if (data !== null) { + iter[kLastPromise] = null; + iter[kLastResolve] = null; + iter[kLastReject] = null; + resolve(createIterResult(data, false)); + } + } +} + +function onReadable(iter) { + // we wait for the next tick, because it might + // emit an error with process.nextTick + process.nextTick(readAndResolve, iter); +} + +function wrapForNext(lastPromise, iter) { + return function (resolve, reject) { + lastPromise.then(function () { + if (iter[kEnded]) { + resolve(createIterResult(undefined, true)); + return; + } + + iter[kHandlePromise](resolve, reject); + }, reject); + }; +} + +var AsyncIteratorPrototype = Object.getPrototypeOf(function () {}); +var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = { + get stream() { + return this[kStream]; + }, + + next: function next() { + var _this = this; + + // if we have detected an error in the meanwhile + // reject straight away + var error = this[kError]; + + if (error !== null) { + return Promise.reject(error); + } + + if (this[kEnded]) { + return Promise.resolve(createIterResult(undefined, true)); + } + + if (this[kStream].destroyed) { + // We need to defer via nextTick because if .destroy(err) is + // called, the error will be emitted via nextTick, and + // we cannot guarantee that there is no error lingering around + // waiting to be emitted. + return new Promise(function (resolve, reject) { + process.nextTick(function () { + if (_this[kError]) { + reject(_this[kError]); + } else { + resolve(createIterResult(undefined, true)); + } + }); + }); + } // if we have multiple next() calls + // we will wait for the previous Promise to finish + // this logic is optimized to support for await loops, + // where next() is only called once at a time + + + var lastPromise = this[kLastPromise]; + var promise; + + if (lastPromise) { + promise = new Promise(wrapForNext(lastPromise, this)); + } else { + // fast path needed to support multiple this.push() + // without triggering the next() queue + var data = this[kStream].read(); + + if (data !== null) { + return Promise.resolve(createIterResult(data, false)); + } + + promise = new Promise(this[kHandlePromise]); + } + + this[kLastPromise] = promise; + return promise; + } +}, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () { + return this; +}), _defineProperty(_Object$setPrototypeO, "return", function _return() { + var _this2 = this; + + // destroy(err, cb) is a private API + // we can guarantee we have that here, because we control the + // Readable class this is attached to + return new Promise(function (resolve, reject) { + _this2[kStream].destroy(null, function (err) { + if (err) { + reject(err); + return; + } + + resolve(createIterResult(undefined, true)); + }); + }); +}), _Object$setPrototypeO), AsyncIteratorPrototype); + +var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) { + var _Object$create; + + var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, { + value: stream, + writable: true + }), _defineProperty(_Object$create, kLastResolve, { + value: null, + writable: true + }), _defineProperty(_Object$create, kLastReject, { + value: null, + writable: true + }), _defineProperty(_Object$create, kError, { + value: null, + writable: true + }), _defineProperty(_Object$create, kEnded, { + value: stream._readableState.endEmitted, + writable: true + }), _defineProperty(_Object$create, kHandlePromise, { + value: function value(resolve, reject) { + var data = iterator[kStream].read(); + + if (data) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(data, false)); + } else { + iterator[kLastResolve] = resolve; + iterator[kLastReject] = reject; + } + }, + writable: true + }), _Object$create)); + iterator[kLastPromise] = null; + finished(stream, function (err) { + if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') { + var reject = iterator[kLastReject]; // reject if we are waiting for data in the Promise + // returned by next() and store the error + + if (reject !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + reject(err); + } + + iterator[kError] = err; + return; + } + + var resolve = iterator[kLastResolve]; + + if (resolve !== null) { + iterator[kLastPromise] = null; + iterator[kLastResolve] = null; + iterator[kLastReject] = null; + resolve(createIterResult(undefined, true)); + } + + iterator[kEnded] = true; + }); + stream.on('readable', onReadable.bind(null, iterator)); + return iterator; +}; + +module.exports = createReadableStreamAsyncIterator; +}).call(this,require('_process')) +},{"./end-of-stream":54,"_process":44}],52:[function(require,module,exports){ +'use strict'; + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +var _require = require('buffer'), + Buffer = _require.Buffer; + +var _require2 = require('util'), + inspect = _require2.inspect; + +var custom = inspect && inspect.custom || 'inspect'; + +function copyBuffer(src, target, offset) { + Buffer.prototype.copy.call(src, target, offset); +} + +module.exports = +/*#__PURE__*/ +function () { + function BufferList() { + _classCallCheck(this, BufferList); + + this.head = null; + this.tail = null; + this.length = 0; + } + + _createClass(BufferList, [{ + key: "push", + value: function push(v) { + var entry = { + data: v, + next: null + }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; + } + }, { + key: "unshift", + value: function unshift(v) { + var entry = { + data: v, + next: this.head + }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; + } + }, { + key: "shift", + value: function shift() { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; + } + }, { + key: "clear", + value: function clear() { + this.head = this.tail = null; + this.length = 0; + } + }, { + key: "join", + value: function join(s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + + while (p = p.next) { + ret += s + p.data; + } + + return ret; + } + }, { + key: "concat", + value: function concat(n) { + if (this.length === 0) return Buffer.alloc(0); + var ret = Buffer.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + + while (p) { + copyBuffer(p.data, ret, i); + i += p.data.length; + p = p.next; + } + + return ret; + } // Consumes a specified amount of bytes or characters from the buffered data. + + }, { + key: "consume", + value: function consume(n, hasStrings) { + var ret; + + if (n < this.head.data.length) { + // `slice` is the same for buffers and strings. + ret = this.head.data.slice(0, n); + this.head.data = this.head.data.slice(n); + } else if (n === this.head.data.length) { + // First chunk is a perfect match. + ret = this.shift(); + } else { + // Result spans more than one buffer. + ret = hasStrings ? this._getString(n) : this._getBuffer(n); + } + + return ret; + } + }, { + key: "first", + value: function first() { + return this.head.data; + } // Consumes a specified amount of characters from the buffered data. + + }, { + key: "_getString", + value: function _getString(n) { + var p = this.head; + var c = 1; + var ret = p.data; + n -= ret.length; + + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = str.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Consumes a specified amount of bytes from the buffered data. + + }, { + key: "_getBuffer", + value: function _getBuffer(n) { + var ret = Buffer.allocUnsafe(n); + var p = this.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) this.head = p.next;else this.head = this.tail = null; + } else { + this.head = p; + p.data = buf.slice(nb); + } + + break; + } + + ++c; + } + + this.length -= c; + return ret; + } // Make sure the linked list only shows the minimal necessary information. + + }, { + key: custom, + value: function value(_, options) { + return inspect(this, _objectSpread({}, options, { + // Only inspect one level. + depth: 0, + // It should not recurse. + customInspect: false + })); + } + }]); + + return BufferList; +}(); +},{"buffer":12,"util":11}],53:[function(require,module,exports){ +(function (process){ +'use strict'; // undocumented cb() API, needed for core, not for public API + +function destroy(err, cb) { + var _this = this; + + var readableDestroyed = this._readableState && this._readableState.destroyed; + var writableDestroyed = this._writableState && this._writableState.destroyed; + + if (readableDestroyed || writableDestroyed) { + if (cb) { + cb(err); + } else if (err) { + if (!this._writableState) { + process.nextTick(emitErrorNT, this, err); + } else if (!this._writableState.errorEmitted) { + this._writableState.errorEmitted = true; + process.nextTick(emitErrorNT, this, err); + } + } + + return this; + } // we set destroyed to true before firing error callbacks in order + // to make it re-entrance safe in case destroy() is called within callbacks + + + if (this._readableState) { + this._readableState.destroyed = true; + } // if this is a duplex stream mark the writable part as destroyed as well + + + if (this._writableState) { + this._writableState.destroyed = true; + } + + this._destroy(err || null, function (err) { + if (!cb && err) { + if (!_this._writableState) { + process.nextTick(emitErrorAndCloseNT, _this, err); + } else if (!_this._writableState.errorEmitted) { + _this._writableState.errorEmitted = true; + process.nextTick(emitErrorAndCloseNT, _this, err); + } else { + process.nextTick(emitCloseNT, _this); + } + } else if (cb) { + process.nextTick(emitCloseNT, _this); + cb(err); + } else { + process.nextTick(emitCloseNT, _this); + } + }); + + return this; +} + +function emitErrorAndCloseNT(self, err) { + emitErrorNT(self, err); + emitCloseNT(self); +} + +function emitCloseNT(self) { + if (self._writableState && !self._writableState.emitClose) return; + if (self._readableState && !self._readableState.emitClose) return; + self.emit('close'); +} + +function undestroy() { + if (this._readableState) { + this._readableState.destroyed = false; + this._readableState.reading = false; + this._readableState.ended = false; + this._readableState.endEmitted = false; + } + + if (this._writableState) { + this._writableState.destroyed = false; + this._writableState.ended = false; + this._writableState.ending = false; + this._writableState.finalCalled = false; + this._writableState.prefinished = false; + this._writableState.finished = false; + this._writableState.errorEmitted = false; + } +} + +function emitErrorNT(self, err) { + self.emit('error', err); +} + +function errorOrDestroy(stream, err) { + // We have tests that rely on errors being emitted + // in the same tick, so changing this is semver major. + // For now when you opt-in to autoDestroy we allow + // the error to be emitted nextTick. In a future + // semver major update we should change the default to this. + var rState = stream._readableState; + var wState = stream._writableState; + if (rState && rState.autoDestroy || wState && wState.autoDestroy) stream.destroy(err);else stream.emit('error', err); +} + +module.exports = { + destroy: destroy, + undestroy: undestroy, + errorOrDestroy: errorOrDestroy +}; +}).call(this,require('_process')) +},{"_process":44}],54:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/end-of-stream with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var ERR_STREAM_PREMATURE_CLOSE = require('../../../errors').codes.ERR_STREAM_PREMATURE_CLOSE; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(this, args); + }; +} + +function noop() {} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function eos(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; + callback = once(callback || noop); + var readable = opts.readable || opts.readable !== false && stream.readable; + var writable = opts.writable || opts.writable !== false && stream.writable; + + var onlegacyfinish = function onlegacyfinish() { + if (!stream.writable) onfinish(); + }; + + var writableEnded = stream._writableState && stream._writableState.finished; + + var onfinish = function onfinish() { + writable = false; + writableEnded = true; + if (!readable) callback.call(stream); + }; + + var readableEnded = stream._readableState && stream._readableState.endEmitted; + + var onend = function onend() { + readable = false; + readableEnded = true; + if (!writable) callback.call(stream); + }; + + var onerror = function onerror(err) { + callback.call(stream, err); + }; + + var onclose = function onclose() { + var err; + + if (readable && !readableEnded) { + if (!stream._readableState || !stream._readableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + + if (writable && !writableEnded) { + if (!stream._writableState || !stream._writableState.ended) err = new ERR_STREAM_PREMATURE_CLOSE(); + return callback.call(stream, err); + } + }; + + var onrequest = function onrequest() { + stream.req.on('finish', onfinish); + }; + + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest();else stream.on('request', onrequest); + } else if (writable && !stream._writableState) { + // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); + return function () { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +} + +module.exports = eos; +},{"../../../errors":45}],55:[function(require,module,exports){ +module.exports = function () { + throw new Error('Readable.from is not available in the browser') +}; + +},{}],56:[function(require,module,exports){ +// Ported from https://github.com/mafintosh/pump with +// permission from the author, Mathias Buus (@mafintosh). +'use strict'; + +var eos; + +function once(callback) { + var called = false; + return function () { + if (called) return; + called = true; + callback.apply(void 0, arguments); + }; +} + +var _require$codes = require('../../../errors').codes, + ERR_MISSING_ARGS = _require$codes.ERR_MISSING_ARGS, + ERR_STREAM_DESTROYED = _require$codes.ERR_STREAM_DESTROYED; + +function noop(err) { + // Rethrow the error if it exists to avoid swallowing it + if (err) throw err; +} + +function isRequest(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +} + +function destroyer(stream, reading, writing, callback) { + callback = once(callback); + var closed = false; + stream.on('close', function () { + closed = true; + }); + if (eos === undefined) eos = require('./end-of-stream'); + eos(stream, { + readable: reading, + writable: writing + }, function (err) { + if (err) return callback(err); + closed = true; + callback(); + }); + var destroyed = false; + return function (err) { + if (closed) return; + if (destroyed) return; + destroyed = true; // request.destroy just do .end - .abort is what we want + + if (isRequest(stream)) return stream.abort(); + if (typeof stream.destroy === 'function') return stream.destroy(); + callback(err || new ERR_STREAM_DESTROYED('pipe')); + }; +} + +function call(fn) { + fn(); +} + +function pipe(from, to) { + return from.pipe(to); +} + +function popCallback(streams) { + if (!streams.length) return noop; + if (typeof streams[streams.length - 1] !== 'function') return noop; + return streams.pop(); +} + +function pipeline() { + for (var _len = arguments.length, streams = new Array(_len), _key = 0; _key < _len; _key++) { + streams[_key] = arguments[_key]; + } + + var callback = popCallback(streams); + if (Array.isArray(streams[0])) streams = streams[0]; + + if (streams.length < 2) { + throw new ERR_MISSING_ARGS('streams'); + } + + var error; + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1; + var writing = i > 0; + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err; + if (err) destroys.forEach(call); + if (reading) return; + destroys.forEach(call); + callback(error); + }); + }); + return streams.reduce(pipe); +} + +module.exports = pipeline; +},{"../../../errors":45,"./end-of-stream":54}],57:[function(require,module,exports){ +'use strict'; + +var ERR_INVALID_OPT_VALUE = require('../../../errors').codes.ERR_INVALID_OPT_VALUE; + +function highWaterMarkFrom(options, isDuplex, duplexKey) { + return options.highWaterMark != null ? options.highWaterMark : isDuplex ? options[duplexKey] : null; +} + +function getHighWaterMark(state, options, duplexKey, isDuplex) { + var hwm = highWaterMarkFrom(options, isDuplex, duplexKey); + + if (hwm != null) { + if (!(isFinite(hwm) && Math.floor(hwm) === hwm) || hwm < 0) { + var name = isDuplex ? duplexKey : 'highWaterMark'; + throw new ERR_INVALID_OPT_VALUE(name, hwm); + } + + return Math.floor(hwm); + } // Default value + + + return state.objectMode ? 16 : 16 * 1024; +} + +module.exports = { + getHighWaterMark: getHighWaterMark +}; +},{"../../../errors":45}],58:[function(require,module,exports){ +arguments[4][24][0].apply(exports,arguments) +},{"dup":24,"events":27}],59:[function(require,module,exports){ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); +exports.finished = require('./lib/internal/streams/end-of-stream.js'); +exports.pipeline = require('./lib/internal/streams/pipeline.js'); + +},{"./lib/_stream_duplex.js":46,"./lib/_stream_passthrough.js":47,"./lib/_stream_readable.js":48,"./lib/_stream_transform.js":49,"./lib/_stream_writable.js":50,"./lib/internal/streams/end-of-stream.js":54,"./lib/internal/streams/pipeline.js":56}],60:[function(require,module,exports){ +'use strict' + +function ReInterval (callback, interval, args) { + var self = this; + + this._callback = callback; + this._args = args; + + this._interval = setInterval(callback, interval, this._args); + + this.reschedule = function (interval) { + // if no interval entered, use the interval passed in on creation + if (!interval) + interval = self._interval; + + if (self._interval) + clearInterval(self._interval); + self._interval = setInterval(self._callback, interval, self._args); + }; + + this.clear = function () { + if (self._interval) { + clearInterval(self._interval); + self._interval = undefined; + } + }; + + this.destroy = function () { + if (self._interval) { + clearInterval(self._interval); + } + self._callback = undefined; + self._interval = undefined; + self._args = undefined; + }; +} + +function reInterval () { + if (typeof arguments[0] !== 'function') + throw new Error('callback needed'); + if (typeof arguments[1] !== 'number') + throw new Error('interval needed'); + + var args; + + if (arguments.length > 0) { + args = new Array(arguments.length - 2); + + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i + 2]; + } + } + + return new ReInterval(arguments[0], arguments[1], args); +} + +module.exports = reInterval; + +},{}],61:[function(require,module,exports){ +/* eslint-disable node/no-deprecated-api */ +var buffer = require('buffer') +var Buffer = buffer.Buffer + +// alternative to using Object.keys for old browsers +function copyProps (src, dst) { + for (var key in src) { + dst[key] = src[key] + } +} +if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) { + module.exports = buffer +} else { + // Copy properties from require('buffer') + copyProps(buffer, exports) + exports.Buffer = SafeBuffer +} + +function SafeBuffer (arg, encodingOrOffset, length) { + return Buffer(arg, encodingOrOffset, length) +} + +// Copy static methods from Buffer +copyProps(Buffer, SafeBuffer) + +SafeBuffer.from = function (arg, encodingOrOffset, length) { + if (typeof arg === 'number') { + throw new TypeError('Argument must not be a number') + } + return Buffer(arg, encodingOrOffset, length) +} + +SafeBuffer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + var buf = Buffer(size) + if (fill !== undefined) { + if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + } else { + buf.fill(0) + } + return buf +} + +SafeBuffer.allocUnsafe = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return Buffer(size) +} + +SafeBuffer.allocUnsafeSlow = function (size) { + if (typeof size !== 'number') { + throw new TypeError('Argument must be a number') + } + return buffer.SlowBuffer(size) +} + +},{"buffer":12}],62:[function(require,module,exports){ +module.exports = shift + +function shift (stream) { + var rs = stream._readableState + if (!rs) return null + return (rs.objectMode || typeof stream._duplexState === 'number') ? stream.read() : stream.read(getStateLength(rs)) +} + +function getStateLength (state) { + if (state.buffer.length) { + // Since node 6.3.0 state.buffer is a BufferList not an array + if (state.buffer.head) { + return state.buffer.head.data.length + } + + return state.buffer[0].length + } + + return state.length +} + +},{}],63:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +/**/ + +var Buffer = require('safe-buffer').Buffer; +/**/ + +var isEncoding = Buffer.isEncoding || function (encoding) { + encoding = '' + encoding; + switch (encoding && encoding.toLowerCase()) { + case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw': + return true; + default: + return false; + } +}; + +function _normalizeEncoding(enc) { + if (!enc) return 'utf8'; + var retried; + while (true) { + switch (enc) { + case 'utf8': + case 'utf-8': + return 'utf8'; + case 'ucs2': + case 'ucs-2': + case 'utf16le': + case 'utf-16le': + return 'utf16le'; + case 'latin1': + case 'binary': + return 'latin1'; + case 'base64': + case 'ascii': + case 'hex': + return enc; + default: + if (retried) return; // undefined + enc = ('' + enc).toLowerCase(); + retried = true; + } + } +}; + +// Do not cache `Buffer.isEncoding` when checking encoding names as some +// modules monkey-patch it to support additional encodings +function normalizeEncoding(enc) { + var nenc = _normalizeEncoding(enc); + if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc); + return nenc || enc; +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. +exports.StringDecoder = StringDecoder; +function StringDecoder(encoding) { + this.encoding = normalizeEncoding(encoding); + var nb; + switch (this.encoding) { + case 'utf16le': + this.text = utf16Text; + this.end = utf16End; + nb = 4; + break; + case 'utf8': + this.fillLast = utf8FillLast; + nb = 4; + break; + case 'base64': + this.text = base64Text; + this.end = base64End; + nb = 3; + break; + default: + this.write = simpleWrite; + this.end = simpleEnd; + return; + } + this.lastNeed = 0; + this.lastTotal = 0; + this.lastChar = Buffer.allocUnsafe(nb); +} + +StringDecoder.prototype.write = function (buf) { + if (buf.length === 0) return ''; + var r; + var i; + if (this.lastNeed) { + r = this.fillLast(buf); + if (r === undefined) return ''; + i = this.lastNeed; + this.lastNeed = 0; + } else { + i = 0; + } + if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i); + return r || ''; +}; + +StringDecoder.prototype.end = utf8End; + +// Returns only complete characters in a Buffer +StringDecoder.prototype.text = utf8Text; + +// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer +StringDecoder.prototype.fillLast = function (buf) { + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length); + this.lastNeed -= buf.length; +}; + +// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a +// continuation byte. If an invalid byte is detected, -2 is returned. +function utf8CheckByte(byte) { + if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4; + return byte >> 6 === 0x02 ? -1 : -2; +} + +// Checks at most 3 bytes at the end of a Buffer in order to detect an +// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4) +// needed to complete the UTF-8 character (if applicable) are returned. +function utf8CheckIncomplete(self, buf, i) { + var j = buf.length - 1; + if (j < i) return 0; + var nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 1; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) self.lastNeed = nb - 2; + return nb; + } + if (--j < i || nb === -2) return 0; + nb = utf8CheckByte(buf[j]); + if (nb >= 0) { + if (nb > 0) { + if (nb === 2) nb = 0;else self.lastNeed = nb - 3; + } + return nb; + } + return 0; +} + +// Validates as many continuation bytes for a multi-byte UTF-8 character as +// needed or are available. If we see a non-continuation byte where we expect +// one, we "replace" the validated continuation bytes we've seen so far with +// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding +// behavior. The continuation byte check is included three times in the case +// where all of the continuation bytes for a character exist in the same buffer. +// It is also done this way as a slight performance increase instead of using a +// loop. +function utf8CheckExtraBytes(self, buf, p) { + if ((buf[0] & 0xC0) !== 0x80) { + self.lastNeed = 0; + return '\ufffd'; + } + if (self.lastNeed > 1 && buf.length > 1) { + if ((buf[1] & 0xC0) !== 0x80) { + self.lastNeed = 1; + return '\ufffd'; + } + if (self.lastNeed > 2 && buf.length > 2) { + if ((buf[2] & 0xC0) !== 0x80) { + self.lastNeed = 2; + return '\ufffd'; + } + } + } +} + +// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer. +function utf8FillLast(buf) { + var p = this.lastTotal - this.lastNeed; + var r = utf8CheckExtraBytes(this, buf, p); + if (r !== undefined) return r; + if (this.lastNeed <= buf.length) { + buf.copy(this.lastChar, p, 0, this.lastNeed); + return this.lastChar.toString(this.encoding, 0, this.lastTotal); + } + buf.copy(this.lastChar, p, 0, buf.length); + this.lastNeed -= buf.length; +} + +// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a +// partial character, the character's bytes are buffered until the required +// number of bytes are available. +function utf8Text(buf, i) { + var total = utf8CheckIncomplete(this, buf, i); + if (!this.lastNeed) return buf.toString('utf8', i); + this.lastTotal = total; + var end = buf.length - (total - this.lastNeed); + buf.copy(this.lastChar, 0, end); + return buf.toString('utf8', i, end); +} + +// For UTF-8, a replacement character is added when ending on a partial +// character. +function utf8End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + '\ufffd'; + return r; +} + +// UTF-16LE typically needs two bytes per character, but even if we have an even +// number of bytes available, we need to check if we end on a leading/high +// surrogate. In that case, we need to wait for the next two bytes in order to +// decode the last character properly. +function utf16Text(buf, i) { + if ((buf.length - i) % 2 === 0) { + var r = buf.toString('utf16le', i); + if (r) { + var c = r.charCodeAt(r.length - 1); + if (c >= 0xD800 && c <= 0xDBFF) { + this.lastNeed = 2; + this.lastTotal = 4; + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + return r.slice(0, -1); + } + } + return r; + } + this.lastNeed = 1; + this.lastTotal = 2; + this.lastChar[0] = buf[buf.length - 1]; + return buf.toString('utf16le', i, buf.length - 1); +} + +// For UTF-16LE we do not explicitly append special replacement characters if we +// end on a partial character, we simply let v8 handle that. +function utf16End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) { + var end = this.lastTotal - this.lastNeed; + return r + this.lastChar.toString('utf16le', 0, end); + } + return r; +} + +function base64Text(buf, i) { + var n = (buf.length - i) % 3; + if (n === 0) return buf.toString('base64', i); + this.lastNeed = 3 - n; + this.lastTotal = 3; + if (n === 1) { + this.lastChar[0] = buf[buf.length - 1]; + } else { + this.lastChar[0] = buf[buf.length - 2]; + this.lastChar[1] = buf[buf.length - 1]; + } + return buf.toString('base64', i, buf.length - n); +} + +function base64End(buf) { + var r = buf && buf.length ? this.write(buf) : ''; + if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed); + return r; +} + +// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex) +function simpleWrite(buf) { + return buf.toString(this.encoding); +} + +function simpleEnd(buf) { + return buf && buf.length ? this.write(buf) : ''; +} +},{"safe-buffer":61}],64:[function(require,module,exports){ +(function (setImmediate,clearImmediate){ +var nextTick = require('process/browser.js').nextTick; +var apply = Function.prototype.apply; +var slice = Array.prototype.slice; +var immediateIds = {}; +var nextImmediateId = 0; + +// DOM APIs, for completeness + +exports.setTimeout = function() { + return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout); +}; +exports.setInterval = function() { + return new Timeout(apply.call(setInterval, window, arguments), clearInterval); +}; +exports.clearTimeout = +exports.clearInterval = function(timeout) { timeout.close(); }; + +function Timeout(id, clearFn) { + this._id = id; + this._clearFn = clearFn; +} +Timeout.prototype.unref = Timeout.prototype.ref = function() {}; +Timeout.prototype.close = function() { + this._clearFn.call(window, this._id); +}; + +// Does not start the time, just sets up the members needed. +exports.enroll = function(item, msecs) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = msecs; +}; + +exports.unenroll = function(item) { + clearTimeout(item._idleTimeoutId); + item._idleTimeout = -1; +}; + +exports._unrefActive = exports.active = function(item) { + clearTimeout(item._idleTimeoutId); + + var msecs = item._idleTimeout; + if (msecs >= 0) { + item._idleTimeoutId = setTimeout(function onTimeout() { + if (item._onTimeout) + item._onTimeout(); + }, msecs); + } +}; + +// That's not how node.js implements it but the exposed api is the same. +exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) { + var id = nextImmediateId++; + var args = arguments.length < 2 ? false : slice.call(arguments, 1); + + immediateIds[id] = true; + + nextTick(function onNextTick() { + if (immediateIds[id]) { + // fn.call() is faster so we optimize for the common use-case + // @see http://jsperf.com/call-apply-segu + if (args) { + fn.apply(null, args); + } else { + fn.call(null); + } + // Prevent ids from leaking + exports.clearImmediate(id); + } + }); + + return id; +}; + +exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) { + delete immediateIds[id]; +}; +}).call(this,require("timers").setImmediate,require("timers").clearImmediate) +},{"process/browser.js":44,"timers":64}],65:[function(require,module,exports){ +(function (global){ + +/** + * Module exports. + */ + +module.exports = deprecate; + +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ + +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +} + +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ + +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],66:[function(require,module,exports){ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + +},{}],67:[function(require,module,exports){ +'use strict'; + +module.exports = function () { + throw new Error( + 'ws does not work in the browser. Browser clients must use the native ' + + 'WebSocket object' + ); +}; + +},{}],68:[function(require,module,exports){ +module.exports = extend + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +function extend() { + var target = {} + + for (var i = 0; i < arguments.length; i++) { + var source = arguments[i] + + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + target[key] = source[key] + } + } + } + + return target +} + +},{}]},{},[9])(9) +}); diff --git a/elements/pl-snap/Snap/libraries/mqtt.xml b/elements/pl-snap/Snap/libraries/mqtt.xml new file mode 100644 index 00000000..64e1224b --- /dev/null +++ b/elements/pl-snap/Snap/libraries/mqtt.xml @@ -0,0 +1 @@ +Connect to a broker The options are not required but can be filled if needed 1. username (some brokers need this) 2. password (some brokers need this) 3. keepalive (default time is 60 seconds but some brokers need a shorter time) 4. connection callback (ringed set of scripts to be run when connection is made or remade) Note: The connection callback doesn''t have to be the 4th option - it just has to be the last (or only) option. ADVANCED: The brokers offered in the menu are accessed using default ports and basepaths (if needed). If accessing other brokers, the complete urls should be formed like this: siteURL:port/basepath e.g mqtt.eclipseprojects.io:443/mqtt It is possible to have more than one connection to the same broker, for instance, using two different user/pass accounts simultaneously. To do this, add a connection id at the end of the broker: e.g mqtt.eclipseprojects.io:443/mqtt|1
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netconnection statuscallbackconnection statusconnectingcallbackoptionsusername1password2keepalive3mqt_connect(broker,callback,options)connectingconnected
Subscribe to a topic on a broker Make sure you have already run an MQTT connect block before using this one You should add a script to be run inside he grey ring. It will be run each time a message is received If you click on the arrow on the grey ring twice, you can use #1 and #2 inside your script. #1 will contain the received payload #2 will contain the received topic name The options are not required but can be filled if needed There is only 1 option at present 1. Buffer mode (boolean) Default (false) - payload is returned as text If true, payload returned as single column list of values in the range of 0 to 255..
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netnameoptionsmode1mqt_sub(broker,topic,callback,options)
Publish a message to an MQTT broker The options are not required but can be filled if needed 1. qos (quality of service 0,1 or 2) 2. retain flag (boolean) 3. Buffer mode (boolean). Default (false) - the payload is published as text If set to true then payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes. Note: If the payload is a list and you don't set the buffer mode option, it will be automatically be converted into JSON and sent as text.
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netnamehellooptionsqos1retain2mode323mqt_pub(broker,topic,payload,options)
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netname
allall broker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.net
1. Subscribe buffer mode (boolean) Default (false) - received payload is returned as text. If true, subscribed, received payload returned as single column list of values in the range of 0 to 255.. Default (false) - it is returned as text 2. Published buffer mode (boolean). Default (false) - the payload is published as text. If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes. Note: If the payload is a list and you don't set the buffer mode option, it will be automatically be converted into JSON and sent as text
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netname/#err_resetcallbackTopic@2received payloadreceived topic1
The options are not required but can be filled if needed. 1. Subscribe buffer mode (boolean) Default (false) - received payload is returned as text. If true, subscribed, received payload returned as single column list of values in the range of 0 to 255.. 2. Inform response topic (boolean): If true, the response topic is added at the end of the call topic after @ sign. The default condition (true) response topic is added. 3. Published buffer mode (boolean). Default (false) - the payload is published as text. If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes. Note: If the payload is a list and you don't set the buffer mode option, it will be automatically be converted into JSON and sent as text
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netnamename2helloreceived payloadreceived topic13
This is a simple echo example. Topic can be used to filter the response.
helloname
The response topic should be a unique value for each call e.g. use timer The options are not required but can be filled if needed 1. Timeout value - default is 3 seconds 2. Subscribe buffer mode (boolean) Default (false) - received payload is returned as text. If true, subscribed, received payload returned as single column list of values in the range of 0 to 255.. Default (false) - it is returned as text 3. Inform response topic (boolean): If true, the response topic is added at the end of the call topic after @ sign. The default condition (true) response topic is added. 4. Published buffer mode (boolean). Default (false) - the payload is published as text. If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes. Note: If the payload is a list and you don't set the buffer mode option, it will be automatically be converted into JSON and sent as text
broker.emqx.iobroker.emqx.io mqtt.eclipseprojects.io test.mosquitto.org broker.xmqtt.netnamename2helloreceived payloadreceived topic24timer011000
Open (edit) this block to look at examples how to use the MQTT Extension blocks Background documentation: https://github.com/pixavier/mqtt4snap Last source code version (mqtt.xml and mqttExtension.js): https://gitlab.com/cymplecy/Snap/-/tree/master/libraries
payloadtopicTo execute the examples, single click on blocks, following the corresponding steps.payloadtopicpayloadtopicStep 2 bis: Send a request (timer acts as idCall) and do not wait for the answerStep 1: Activate the responderStep 2 bis: Send a request and do not wait for the answerStep 1: Activate the responder as a simple subscriptionStep 2: Publish a messageStep 1: Subscribe to a topicStep 0: Connect to the brokerStep 2: Send a request and wait the answer.PubSub Hello World!Step 2: Send a request (timer acts as idCall) and wait for the answerpayloadtopicfalseAsynchronous client-server Hello World! with static response topic (name2)Synchronous client-server Hello World! with dynamic response topic (timer)Synchronous client-server Hello World! with static response topic (name2)Asynchronous client-server Hello World! with dynamic response topic (timer)
diff --git a/elements/pl-snap/Snap/libraries/mqttExtension.js b/elements/pl-snap/Snap/libraries/mqttExtension.js new file mode 100644 index 00000000..720ef472 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/mqttExtension.js @@ -0,0 +1,367 @@ +/* MQTTExtension.js - add MQTT protocol to Snap! + * =========================================== + * MQTT library developed by Xavier Pi + * Modified by Simon Walters + * and converted into an extension + * November 2021 + * V1.1 - change back to using standard naming e.g payload not message + * V1.2.0 added in code from pixavier to improve sub and unsub 9May2022 + * V1.3.0 added in code from pixavier brokerKey to enable more than one connection to the same broker with different users + * V1.4.0 30Jun22 handle binary payloads correctly + * V1.5.0 29Dec22 handle utf8 character payloads correctly + * V1.5.2 20Jan23 change subscribe default to be text and accept boolean to change to binary (corrected 18:23) + * V1.5.3 22Jan23 make old subscribe block be compatible with new extension code + * V1.5.4 15Feb22 When returning text to Snap!, restore explicitly making payload into a string. Also restore cymplecy.uk instead of simplesi.cloud + * V1.6.0 13Oct2023 If binary options selected then pub expects payload to be a flat List (values 0-255) and sub will return a List + * V1.6.1 05Jan2024 "binary" replaced by "buffer mode" + * V1.6.2 17Jan2023 bugfix -remove automatic convert JSON to Snap! list + */ + + + +SnapExtensions.primitives.set( + 'mqt_connect(broker,callback,options)', + function (broker,callback,options,proc) { + /* original code from github.com/pixavier/mqtt4snap */ + /* adapted into extension by cymplecy 26Nov21 */ + /* modified to add in keepalive parameter by cymplecy 23Nov21 */ + + function log(txt) { + console.log('mqt_connect: ', new Date().toString(), txt); + } + + broker = broker ? broker.trim() : ''; + let brokerKey = broker; + if (broker.indexOf('|') >= 0) { + broker = broker.substr(broker.indexOf('|') + 1); + } + + options = JSON.parse(options); + const opts = {}; + if (options['username']) { + opts.username = options['username']; + if (options["password"]) { + opts.password = options['password']; + } else { + opts.password = ''; + } + } + + if (options["keepalive"]) { + opts.keepalive = Number(options["keepalive"]); + } + + var stage = this.parentThatIsA(StageMorph); + + if (!('mqtt' in stage)){ + stage.mqtt = []; + } + + let wsbroker; + + if (broker.startsWith('ws://')) { + wsbroker = broker; + } else if (broker.startsWith('wss://')) { + wsbroker = broker; + } else { + let prefix; + prefix = window.location.protocol == 'https:'?'wss':'ws'; + wsbroker = prefix + '://' + broker; + } + if (wsbroker == 'wss://broker.emqx.io') { + wsbroker = wsbroker + ':8084/mqtt' + } else if (wsbroker == 'ws://broker.emqx.io') { + wsbroker = wsbroker + ':8083/mqtt' + } else if (broker == 'mqtt.eclipseprojects.io') { + wsbroker = wsbroker + '/mqtt' + } else if (wsbroker == 'wss://test.mosquitto.org') { + wsbroker = wsbroker + ':8081' + } else if (wsbroker == 'ws://vps656540.ovh.net') { + wsbroker = wsbroker + ':8080' + } else if (wsbroker == 'ws://test.mosquitto.org') { + wsbroker = wsbroker + ':8080' + } else if (broker == 'broker.xmqtt.net') { + wsbroker = wsbroker + '/mqtt' + } else if (wsbroker == 'wss://cymplecy.uk') { + wsbroker = wsbroker + ':8084' + } else if (wsbroker == 'ws://cymplecy.uk') { + wsbroker = wsbroker + ':8083' + } else if (wsbroker == 'ws://localhost') { + wsbroker = wsbroker + ':9001' + } + //log(wsbroker) + try { + stage.mqtt[brokerKey].end(true); + } catch (e){} + delete stage.mqtt[brokerKey]; + + stage.mqtt[brokerKey] = mqtt.connect(wsbroker, opts); + + stage.mqtt[brokerKey].on('connect', function(connack) { + log('Connected to ' + wsbroker); + if (callback) { + let p = new Process(); + p.initializeFor(callback, new List(["all"])) + //console.log("here1") + stage.threads.processes.push(p); + //log('Callback process pushed'); + } + try { + proc.doSetVar('connection status', 'connected'); + } catch(e) {} + }); + + stage.mqtt[brokerKey].stream.on('error', function(error) { + log('error event triggered'); + try{ + stage.mqtt[brokerKey].end(); + }catch(e){} + delete stage.mqtt[brokerKey]; + try { + proc.doSetVar('connection status', 'failed to connect to ' + broker); + } catch(e) {} + //alert(error.message); + }); + + + } + +); + + +SnapExtensions.primitives.set( + 'mqt_sub(broker,topic,callback,options)', + function (broker,topic,callback,options) { + /* github.com/pixavier/mqtt4snap */ + /* adapted into extension by cymplecy 26Nov21 */ + /* modified 13OCt2023 by cymplecy to return binary data as a list */ + function log(txt) { + console.log('mqt_sub: ', new Date().toString(), txt); + } + + function arrayToList(data) { + if (!Array.isArray(data)) { + return data; + } + return new List(data.map((x) => arrayToList(x))); + } + + broker = broker ? broker.trim() : ''; + let brokerKey = broker; + if (broker.indexOf('|') >= 0) { + broker = broker.substr(broker.indexOf('|') + 1); + } + + topic = topic ? topic.trim() : topic; + options = JSON.parse(options); + + let stage = this.parentThatIsA(StageMorph); + + if (!('mqtt' in stage)){ + log('No connection to any broker ' + broker); + throw new Error('No connection to any broker '+broker); + } + + if (stage.mqtt[brokerKey]) { + try {stage.mqtt[brokerKey].unsubscribe(topic);}catch(e){} + } else { + log('No connection to broker ' + broker); + throw new Error('No connection to broker '+broker); + } + + stage.mqtt[brokerKey].subscribe(topic); + + let mqttListener = function (aTopic, payload) { + if (!mqttWildcard(aTopic, topic)) {return;} + let p = new Process(); + if (options['mode'] && options['mode'] == true) { + //console.log(new List(payload)); + //newPayload = payload.reduce( (res, val) => res+String.fromCharCode( val), ""); + newPayload = new List(payload); + } else { + newPayload = payload.toString(); + /* + try { + payloadObject = JSON.parse(newPayload); + //console.log(payloadObject); + //newPayload = new List([new List([0,1,2,3]),new List([9,9,9,9])]); + newPayload = arrayToList(payloadObject); + //console.log(newPayload); + } catch (e) {console.log(e)} + */ + } + + try { + p.initializeFor(callback, new List([newPayload, aTopic])); + } catch(e) { + p.initializeFor(callback, new List([])); + } + stage.threads.processes.push(p); + }; + + mqttListener.topic = topic; + stage.mqtt[brokerKey].on('message', mqttListener); + + let mqttWildcard = function (topic, wildcard) { + if (topic === wildcard) {return true;} + else if (wildcard === '#') {return true;} + + var res = []; + var t = String(topic).split('/'); + var w = String(wildcard).split('/'); + var i = 0; + for (var lt = t.length; i < lt; i++) { + if (w[i] === '+') { + res.push(t[i]); + } else if (w[i] === '#') { + res.push(t.slice(i).join('/')); + return true; + } else if (w[i] !== t[i]) { + return false; + } + } + if (w[i] === '#') {i += 1;} + return (i === w.length) ? true : false; + } + } +); + +SnapExtensions.primitives.set( + 'mqt_pub(broker,topic,payload,options)', + function (broker,topic,payload,options) { + /* original code from github.com/pixavier/mqtt4snap */ + /* adapted into extension by cymplecy 26Nov21 */ + /* modified 05Sep2021 by cymplecy to add parameters for qos and retain flag */ + /* modified 13Oct2023 by cymplecy to handle binary data in a list */ + function log(txt) { + console.log('mqt_pub: ', new Date().toString(), txt); + } + + broker = broker ? broker.trim() : ''; + let brokerKey = broker; + if (broker.indexOf('|') >= 0) { + broker = broker.substr(broker.indexOf('|') + 1); + } + + topic = topic ? topic.trim() : topic; + //payload not trimmed as might have real leading/trailing spaces + //console.log(options) + options = JSON.parse(options); + const opts = {}; + if (options['qos']) { + opts.qos = Number(options['qos']); + } + if (options["retain"]) { + opts.retain = options["retain"]; + } + + //console.log(payload.contents); + //console.log(new Uint8Array(payload.contents)); + + let stage = this.parentThatIsA(StageMorph); + + if (!('mqtt' in stage)){ + log('No connection to any broker ' + broker); + throw new Error('No connection to any broker ' + broker); + } + + if(!stage.mqtt[brokerKey]){ + log('No connection to broker ' + broker); + throw new Error('No connection to broker ' + broker); + } + + //let prefix = window.location.protocol == 'https:'?'wss':'ws'; + //let wsbroker = prefix+'://'+broker; + try{ + let client = stage.mqtt[brokerKey]; + if (options['mode'] && options['mode'] == true) { + client.publish(topic, new Uint8Array(payload.asArray()), opts); + } else { + client.publish(topic, '' + payload, opts); + } + //console.log(opts) + } catch(e) { + log('Failed to publish payload ' + payload); + //console.log(e); + throw e; + } + } +); + +SnapExtensions.primitives.set( + 'mqt_disconnect(broker)', + function (broker) { + /* original code from github.com/pixavier/mqtt4snap */ + /* adapted into extension by cymplecy 26Nov21 */ + + let stage = this.parentThatIsA(StageMorph); + broker = broker ? broker.trim() : ''; + let brokerKey = broker; + if (broker.indexOf('|') >= 0) { + broker = broker.substr(broker.indexOf('|') + 1); + } + + try { + if(broker=='all'){ + for(let brok of Object.keys(stage.mqtt)){ + try { + stage.mqtt[brok].end(true); + } catch (e0) { + //console.log('e0'); + //console.log(e0); + } + } + } else { + stage.mqtt[brokerKey].end(true); + } + } catch(e1){ + //console.log('e1'); + //console.log(e1); + } + try{ + if(broker=='all'){ + try { + delete stage.mqtt; + stage.mqtt=[]; + } catch (e2) { + //console.log('e2'); + //console.log(e2); + } + } else { + delete stage.mqtt[brokerKey]; + } + } catch(e3){ + //console.log('e3'); + //console.log(e3); + } + } +); + +SnapExtensions.primitives.set( + 'mqt_unsub(broker,topic)', + function (broker,topic) { + /* original code from github.com/pixavier/mqtt4snap */ + /* adapted into extension by cymplecy 26Nov21 */ + + let stage = this.parentThatIsA(StageMorph); + try{ + broker = broker ? broker.trim() : ''; + let brokerKey = broker; + if (broker.indexOf('|') >= 0) { + broker = broker.substr(broker.indexOf('|') + 1); + } + + stage.mqtt[brokerKey].unsubscribe(topic); + let listeners = stage.mqtt[brokerKey].listeners('message'); + // https://github.com/mqttjs/async-mqtt/issues/31 + listeners.forEach((listener) => { + //console.dir(listener); + if (topic == listener.topic || topic == '#') { // # = all + stage.mqtt[brokerKey].removeListener('message', listener); + } + }); + } catch(e){ + //console.log(e); + } + } +); diff --git a/elements/pl-snap/Snap/libraries/parallel_module.xml b/elements/pl-snap/Snap/libraries/parallel_module.xml new file mode 100644 index 00000000..ef196f0f --- /dev/null +++ b/elements/pl-snap/Snap/libraries/parallel_module.xml @@ -0,0 +1 @@ +Accepts any number of scripts as inputs. Launches a separate thread for each of them, so they are done in parallel, then waits for them all to complete. This doesn't change how the Snap! scheduler works; the threads are not truly asynchronous. And there is no increase in speed. Rather, the point of this block is to allow starting synchronized but independent scripts.
pt:executa _ em paralelo e espera ca:executa en paral·lel _ i espera each scripttest
Accepts any number of scripts as inputs. Launches a separate thread for each of them, so they are done in parallel, then continues with the current script while they all run. This doesn't change how the Snap! scheduler works; the threads are not truly asynchronous. And there is no increase in speed. Rather, the point of this block is to allow starting synchronized but independent scripts.
pt:executa _ em paralelo ca:executa en paral·lel _
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/pixel_module.xml b/elements/pl-snap/Snap/libraries/pixel_module.xml new file mode 100644 index 00000000..b0af13fb --- /dev/null +++ b/elements/pl-snap/Snap/libraries/pixel_module.xml @@ -0,0 +1 @@ +takes a snapshot with the webcam and reports it as a new costume, or zero if the user cancels
pt:$camera a imagem actual do vídeo
§_costumesMenu
§_costumesMenuthing
frame
blurblur sharpen outline emboss edge={ left right top bottom } Gausscurrent§_costumesMenutruetrue
blurblur sharpen outline emboss edge={ left right top bottom } Gaussoutlineembossleftrighttopbottomgauss0.06250.1250.06250.1250.250.1250.06250.1250.0625blur
reshape the kernel to match the input matrix's channels, if anyfor every padded pixel create a partial copy of the input, item-multiply it with the kernel and take its overall sum (∑)
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/plot_bars_module.xml b/elements/pl-snap/Snap/libraries/plot_bars_module.xml new file mode 100644 index 00000000..26edf52d --- /dev/null +++ b/elements/pl-snap/Snap/libraries/plot_bars_module.xml @@ -0,0 +1 @@ +draw a list of numbers as vertical lines distributed evenly across the stage.
de:male Balken _ gefüllt _ zentriert _ 0.8single=0.8 pan=1 overlap=1.2false
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/replace_letters_module.xml b/elements/pl-snap/Snap/libraries/replace_letters_module.xml new file mode 100644 index 00000000..1e41c17e --- /dev/null +++ b/elements/pl-snap/Snap/libraries/replace_letters_module.xml @@ -0,0 +1 @@ +substitute all occurrences of a letter or a sequence of letters in a text with another or none.
de:ersetze jedes _ durch _ in _ tshtower top
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/schemeNumber.js b/elements/pl-snap/Snap/libraries/schemeNumber.js new file mode 100644 index 00000000..fd49a4d3 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/schemeNumber.js @@ -0,0 +1,6558 @@ +// Scheme numerical tower in JavaScript. +// Copyright (c) 2011,2012 by John Tobey + +/* + File: schemeNumber.js + + Exports: + + + + Depends: + + for + */ + +/* + Class: SchemeNumber + A number object as . + + Scheme supports *exact* arithmetic and mixing exact with standard + (*inexact*) numbers. Several basic operations, including + addition, subtraction, multiplication, and division, when given + only exact arguments, must return an exact, numerically correct + result. + + These operations are allowed to fail due to running out of memory, + but they are not allowed to return approximations the way + ECMAScript operators may, unless given one or more inexact + arguments. + + For example, adding exact *1/100* to exact *0* one hundred times + produces exactly *1*, not 1.0000000000000007 as in JavaScript. + Raising exact *2* to the power of exact *1024* returns a 308-digit + integer with complete precision, not *Infinity* as in ECMAScript. + + This implementation provides all functions listed in the , Section 11.7, along + with from Section 11.5. ( uses JavaScript's *===* to + compare non-numbers.) + + Exact numbers support the standard ECMA Number formatting methods + (toFixed, toExponential, and toPrecision) without a fixed upper + limit to precision. + + The schemeNumber.js file exports an object . It + contains a property , which in turn contains the functions + implementing the numeric types. + + The object is in fact a function that converts its + argument to a Scheme number: similar to a constructor, but it may + not always return an object, let alone a unique object. + + Parameters: + + obj - Object to be converted to a Scheme number. + + *obj* may have any of the following + types: + + Scheme number - returned unchanged. + String - converted as if by *string->number*. + Native ECMAScript number - treated as an inexact real. + + Returns: + + A Scheme number. + + Exceptions: + + If *obj* can not be parsed, will an + exception with condition type *&assertion*. + + See Also: + + , , +*/ +var SchemeNumber = (function() { + +// +// Multiple dispatch support. +// + +var DispatchJs = (function() { +"use strict"; +/* +Multiple dispatch for JavaScript functions of fixed arity. Example: + + // B and C inherit from A. D inherits from C. + var A = disp.defClass("A", {ctor: function(x) { this.x = x }}); + var B = disp.defClass("B", {base: "A"}); + var C = disp.defClass("C", {base: "A"}); + // Classes may be defined after their superclass methods. + //var D = disp.defClass("D", {base: "C"}); + + // Or you can declare existing classes: + //var disp = DispatchJs; + //function A(){} A.prototype = {}; + //disp.defClass("A", {ctor: A}); + //function B(){} B.prototype = new A(); + //disp.defClass("B", {ctor: B, base "A"}); + //function C(){} C.prototype = new A(); + //disp.defClass("C", {ctor: C, base "A"}); + //function D(){} D.prototype = new C(); + //disp.defClass("D", {ctor: D, base "C"}); + + // This creates a function of 2 arguments: + var frob = disp.defGeneric("frob", 2); + + // Define methods. Methods receive frob's first argument as "this" and + // the rest as method arguments. + frob.def("A", "A", function(a1) { return "A A" }); + frob.def("A", "B", function(a1) { return "A B" }); + frob.def("B", "A", function(a1) { return "B A" }); + frob.def("B", "B", function(a1) { return "B B" }); + frob.def("A", "C", function(a1) { return "A C" }); + var D = disp.defClass("D", function(x) { this.x = x }, "C"); + frob.def("D", "D", function(a1) { return "D D" }); + + // Create some arguments: + var a = new A(); + var b = new B(); + var c = new C(); + var d = new D(); + + // Call the function: + frob(a,a); // "A A" + frob(a,b); // "A B" + frob(a,c); // "A C" + frob(a,d); // "A C" + frob(b,a); // "B A" + frob(b,b); // "B B" + frob(b,c); // "B A" or "A C" + frob(b,d); // "B A" or "A C" + frob(c,a); // "A A" + frob(c,b); // "A B" + frob(c,c); // "A C" + frob(c,d); // "A C" + frob(d,a); // "A A" + frob(d,b); // "A B" + frob(d,c); // "A C" + frob(d,d); // "D D" + +Ambiguous calls such as frob(b,c) and frob(b,d) above use whichever of +the best candidates was defined first: the method for types B,A or the +one for A,C. +*/ + +function short_fn(f) { + return String(f).replace(/(?:.|\n)*(function .*?\(.*?\))(?:.|\n)*/, "$1"); +} + +var Formals = []; + +function makeContext(opts) { + + var g = opts.globals; + var _Function = (g ? g.Function : Function); + var uncurry = _Function.prototype.bind.bind(_Function.prototype.call); + var _Object = (g ? g.Object : Object); + var _String = (g ? g.String : String); + var _Array = (g ? g.Array : Array); + var _Error = (g ? g.Error : Error); + var _apply = uncurry(_Function.prototype.apply); + var _slice = uncurry(_Array.prototype.slice); + var _join = uncurry(_Array.prototype.join); + var _push = uncurry(_Array.prototype.push); + var _unshift = uncurry(_Array.prototype.unshift); + var _forEach = uncurry(_Array.prototype.forEach); + var _concat = uncurry(_Array.prototype.concat); + var _replace = uncurry(_String.prototype.replace); + var _split = uncurry(_String.prototype.split); + var _create = _Object.create; + var _hasOwnProperty = uncurry(_Object.prototype.hasOwnProperty); + var String_indexOf = uncurry(_String.prototype.indexOf); + var Array_indexOf = uncurry(_Array.prototype.indexOf); + + var prefix = opts.methodNamePrefix || "_jsmd"; + var ePrefix = _replace(prefix, /([\"\\])/g, "\\$1"); + var sep = opts.methodNameSeparator || " "; + var classes = _create(null); + + function classToName(cl) { + if (cl != null) { + var name = cl[prefix]; + if (typeof name === "string") + if (classes[name] && classes[name].ctor === cl) + return name; + else + for (name in classes) + if (classes[name] && classes[name].ctor === cl) + return name; + } + } + function assertClassToName(cl) { + if ("string" === typeof cl) + return cl; + var ret = classToName(cl); + if (ret) + return ret; + throw _Error("Class not defined: " + cl); + } + + function pureVirtual() { + var msg = "Abstract method not overridden for "; + try { + msg += this; + } + catch (e) { + try { + msg += _Object.prototype.toString.call(this); + } + catch (e) { + msg += "object"; + } + } + throw new _Error(msg); + } + + var ret = { + getConstructor: function(name) { + return classes[name] && classes[name].ctor; + }, + defClass: function(name, opts) { + var ctor, base; + var bctor, proto, key, sub, sepBase, cname, c; + var ometh, meth, func, array, doit, i, indices; + + opts.debug && console.log("defClass: ", name); + if (opts) { + ctor = opts.ctor; + if (opts.base) + base = assertClassToName(opts.base); + } + if (typeof base === "undefined" && ctor && ctor.prototype != null) { + base = classToName(ctor.prototype.constructor); + } + //opts.debug && console.log("base:", base); + if (typeof base !== "undefined") { + bctor = classes[base].ctor; + } + ctor = ctor || function(){} + if (typeof name !== "string") { + throw _Error("Usage: defClass(NAME, [OPTS])"); + } + if (classes[name]) { + if (classes[name].ctor !== ctor || classes[name].base !== base) + { + throw _Error("Can't redefine class " + name); + } + return ctor; + } + if (String_indexOf(name, sep) != -1) { + throw _Error((sep == " " ? "Space" : "Separator") + + " in class name: " + name); + } + if (typeof (ctor[prefix]) !== "undefined") { + if (ctor[prefix] !== name) + throw _Error("Cannot define constructor as " + name + + ", it was previously defined as " + + ctor[prefix]); + } + else { + ctor[prefix] = name; + } + //opts.debug && console.log("checking prototype constructor"); + if (ctor.prototype) { + if (_hasOwnProperty(ctor.prototype, "constructor")) { + if (ctor.prototype.constructor !== ctor) + throw _Error("ctor.prototype.constructor is not ctor"); + } + else { + ctor.prototype.constructor = ctor; + } + } + //opts.debug && console.log("ok") + if (!ctor.prototype || + (bctor && !(ctor.prototype instanceof bctor))) + { + proto = (bctor ? new bctor() : _create(null)); + //opts.debug && console.log("proto.constructor[prefix]", proto.constructor[prefix]); + if (ctor.prototype) { + // XXX Used for BigInteger; too hacky? + for (key in ctor.prototype) { + proto[key] = ctor.prototype[key]; + } + } + proto.constructor = ctor; + ctor.prototype = proto; + } + classes[name] = { + ctor: ctor, + base: base, + sub: [], + ename: _replace(sep + name, /([\"\\])/g, "\\$1") + }; + //opts.debug && console.log("defClass:", name, "base:", base); + if (typeof base !== "undefined") { + sub = classes[base].sub; + if (Array_indexOf(sub, name) === -1) + _push(sub, name); + sepBase = sep + base; + for (cname in classes) { + proto = classes[cname].ctor.prototype; + for (ometh in proto) { + if (!_hasOwnProperty(proto, ometh)) + continue; + if (!String_indexOf(ometh, sepBase)) + continue; + array = _split(ometh, sep); + if (array[0] !== prefix) + continue; + func = proto[ometh]; + indices = []; + for (i = Array_indexOf(array, base, 2); i !== -1; + i = Array_indexOf(array, base, i + 1)) { + _push(indices, i); + } + doit = function(i) { + if (i === indices.length) { + meth = _join(array, sep); + if (meth !== ometh) { + opts.debug && console.log(cname + '["'+meth+'"] propagated -> ' + short_fn(func)); + proto[meth] = func; + } + return; + } + array[indices[i]] = base; + doit(i + 1); + array[indices[i]] = name; + doit(i + 1); + } + doit(0); + } + } + } + return ctor; + }, + + defGeneric: function (fnName, ndisp, nargs) { + if (String_indexOf(fnName, sep) != -1) + throw _Error((sep == " " ? "Space" : "Separator") + + " in function name: " + fnName); + nargs = nargs || ndisp; + if (fnName == "" + || ndisp < 1 || ndisp != (ndisp | 0) + || nargs < 1 || nargs != (nargs | 0)) + throw Error("Usage: defGeneric(NAME, NDISP [, NARGS])"); + + var eName = _replace(sep + fnName, /([\"\\])/g, "\\$1"); + var eTopMethod = ePrefix + eName; + + for (var i = Formals.length; i < nargs; i++) + Formals[i] = "a" + i; + var array = _slice(Formals, 0, nargs); + // e.g., function(a0,a1,a2,a3){return a3["_jsmd frob"](a0,a1,a2)} + _push(array, + "return " + Formals[ndisp-1] + '["' + eTopMethod + '"](' + + _join(_concat(_slice(array, 0, ndisp-1), + _slice(array, ndisp, nargs)), ",") + ')') + var ret = _apply(_Function, null, array); + + var func_cache = _create(null); + function get_func(i, etypes) { + var suffix = _join(_slice(etypes, i), ""); + if (!func_cache[suffix]) { + var method = ePrefix + eName + suffix; + var array = _concat(_slice(Formals, 0,i), + _slice(Formals, i+1, nargs)); + + _push(array, "return " + Formals[i-1] + + '["' + method + '"](' + + _join(_concat(_slice(Formals, 0, i-1), "this", + _slice(Formals, i+1, nargs)), ",") + + ')'); + + func_cache[suffix] = _apply(_Function, null, array); + } + return func_cache[suffix]; + } + + // For error message. + function usageArgs() { + switch (ndisp) { + case 1: return "TYPE"; + case 2: return "TYPE1, TYPE2"; + case 3: return "TYPE1, TYPE2, TYPE3"; + default: return "TYPE1, ..., TYPE" + ndisp; + } + } + + // def(TYPE1, ..., TYPEn, FUNCTION) + // Defines FUNCTION as this method's specialization for the + // given types. Each TYPEi must have been passed as the + // NAME argument in a successful call to defClass. + function def() { + var fn = arguments[ndisp] || pureVirtual; + if (typeof fn !== "function") { + throw _Error("Not a function. Usage: " + fnName + + ".def(" + usageArgs() + ", FUNCTION)"); + } + var types = _slice(arguments, 0, ndisp); + //opts.debug && console.log("def", fnName, types, short_fn(fn)); + + for (i = 0; i < ndisp; i++) { + // Throw error if not registered. + // XXX Could add def() arguments to a list to be + // defined during defClass. + types[i] = assertClassToName(types[i]); + } + //opts.debug && console.log("def"); + do_def(types, fn, _create(null)); + } + + function do_def(types, fn, inherited) { + var cs = new _Array(ndisp); + var eTypes = new _Array(ndisp); + var i, suffix, oldm, newm; + + for (i = 0; i < ndisp; i++) { + cs[i] = classes[types[i]]; + //opts.debug && console.log("cs[" + i + "]=classes[", types[i], "]"); + eTypes[i] = cs[i].ename; + } + opts.debug && console.log("do_def", fnName, eTypes); + + oldm = new Array(ndisp); + for (i = ndisp-1, suffix = ""; ; i--) { + oldm[i] = cs[i].ctor.prototype[ + prefix + sep + fnName + suffix]; + //opts.debug && console.log("oldm[" + i + "]" + oldm[i]); + if (i === 0) + break; + suffix = eTypes[i] + suffix; + } + + newm = new _Array(ndisp); + newm[0] = fn; + for (i=1; i DELETED"); + delete(proto[method]); + } + else { + opts.debug && console.log(eTypes[i] + '["'+method+'"] ' + short_fn(proto[method]) + " -> " + short_fn(newm[i])); + if (!_hasOwnProperty(proto, method)) { + inherited[key] = proto[method]; + } + proto[method] = newm[i]; + } + } + if (i === 0) + return; + function doit2(k) { + doit(i - 1, method + sep + k); + _forEach(classes[k].sub, doit2); + } + doit2(types[i]); + } + + doit(ndisp-1, prefix + sep + fnName); + } + ret.def = def; + return ret; + } + // lookup: TO DO + }; + if (opts.debug) + ret.classes = classes; + return ret; +} +var ret = makeContext(Object.create(null)); +ret.makeContext = makeContext; +return ret; +})(); + +//if (typeof exports !== "undefined") { +// exports.DispatchJs = DispatchJs; +// exports.makeContext = DispatchJs.makeContext; +// exports.defClass = DispatchJs.defClass; +// exports.defGeneric = DispatchJs.defGeneric; +//} + + +/* + Constructor: PluginContainer(plugins) + A PluginContainer is just a set of properties, referred to as + "plugins", with an interface to change them and subscribe to + notification of such changes. + + If *plugins* is passed, it is stored as if via as the + initial set of plugins. +*/ +function PluginContainer(init) { + "use strict"; + + // XXX use of globals via Array and Function methods, Object, + // Error, and undefined: should virtualize. + + if (!(this instanceof PluginContainer)) + throw Error("Usage: new PluginContainer()"); + + var t = this, listeners = [], plugins = Object.create(null); + + function mergeChanges(from, to, changed) { + var ret = false; + for (var i in from) { + if (to[i] !== undefined && to[i] !== from[i]) + throw Error("Conflicting changes to " + i); + if (changed) + changed[i] = from[i]; + to[i] = from[i]; + ret = true; + } + return ret; + } + + /* + Property: onChange + Event used to publish changes to plugins. + + > plugins.onChange.subscribe(listener); + + After changes one or more plugin values, it calls + *listener* with two arguments: the and an object + whose properties are the changed plugins. + + No call results from passing an empty object or one whose + values all equal the current corresponding plugins. + + > plugins.onChange.unsubscribe(listener); + + Reverses the effect of an earlier *subscribe* call. + */ + var onChange = { + + fire: function(changes) { + function notify(listener) { + listener.call(listener, t, changes); + } + listeners.forEach(notify); + }, + + subscribe: function(listener) { + listeners.push(listener); + }, + unsubscribe: function(listener) { + function isNotIt(l) { return l !== listener; } + listeners = listeners.filter(isNotIt); + } + }; + t.onChange = onChange; + + /* + Method: extend(newPlugins) + Adds or replaces plugins in the container. + + *newPlugins* must be an object. All of its properties + (technically, its own, enumerable properties) are stored as new or + replacement plugins. If this results in any actual changes, all + of the container's listeners are notified. + + Method: extend(name1, plugin1, name2, plugin2, ...) + Like extend({ *name1* : *plugin1*, *name2* : *plugin2*, ... }) + */ + t.extend = function() { + var changes = Object.create(null); + var newPlugins = arguments[0], i; + + if (typeof newPlugins !== "object") { + if (arguments.length & 1) + throw Error("extend: Wrong argument types"); + newPlugins = Object.create(null); + for (i = 0; i < arguments.length; i += 2) { + if (arguments[i] in newPlugins) + throw Error("extend: " + arguments[i] + + " given more than once"); + newPlugins[arguments[i]] = arguments[i+1]; + } + } + if (mergeChanges(newPlugins, plugins, changes)) + onChange.fire(changes); + }; + + /* + Method: get(pluginName) + Returns the plugin named *pluginName*, or *undefined* if none + exists by that name. + */ + t.get = function(pluginName) { + return plugins[pluginName]; + }; + + t.list = function() { + return Object.keys(plugins); + }; + + if (init) { + t.extend(init); + } +} + +// +// Uncomment "assert(...)" to use this: +// + +function assert(x) { if (!x) throw new Error("assertion failed"); } + +function getEs5Globals() { + // Package the ECMAScript 5 Global Object properties so that + // careful users can provide a safer-seeming copy of them. XXX If + // you want to use this, consider auditing PluginContainer and + // JsDispatch, too. + return { + NaN : NaN, + Infinity : Infinity, + undefined : undefined, + eval : eval, + parseInt : parseInt, + parseFloat : parseFloat, + isNaN : isNaN, + isFinite : isFinite, + decodeURI : decodeURI, + decodeURIComponent : decodeURIComponent, + encodeURI : encodeURI, + encodeURIComponent : encodeURIComponent, + Object : Object, + Function : Function, + Array : Array, + String : String, + Boolean : Boolean, + Number : Number, + Date : Date, + RegExp : RegExp, + Error : Error, + EvalError : EvalError, + RangeError : RangeError, + ReferenceError : ReferenceError, + SyntaxError : SyntaxError, + TypeError : TypeError, + URIError : URIError, + Math : Math, + JSON : JSON + }; +} + +function implementUncurry(plugins) { + var g = plugins.get("es5globals"); + var api = g.Object.create(null); + + /* + uncurry(func) returns a function equivalent to + + > function(arg...) { return func.call(arg...); } + + but not relying on func or its prototype having a "call" + property. The point is to make library code behave the same + after arbitrary code runs, possibly improving security and + performance. + + http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming + */ + api.uncurry = g.Function.prototype.bind.bind(g.Function.prototype.call); + return api; +} + +/* + Function: defineGenericFunctions(plugins) + Creates the generic functions of number subtypes called by + higher-level library code. + + The bulk of the internal/plugin API consists of these functions. + Their interfaces are optimized for ease of implementation and for + use in implementing the library. By contrast, the Scheme library + strives more for interface stability and convenience of use. + + For example, the public subtraction function, , accepts + one or more arguments, converts them from native types if + necessary, and subtracts all but the first from the first, unless + there is only one, in which case it negates it. The library + converts all that into calls to , with exactly two + arguments, both guaranteed to be Scheme numbers, or as + the case may be. + + Input: + + *plugins* shall be a containing *Dispatch*, a + object. calls the + *defGeneric* method of *Dispatch* to create each generic function. + + Functions: + + toSchemeNumber - see + + numberToString - generic function(schemeNumber, radix, precision) + Equivalent to string"]> but with *radix* and + *precision* as native numbers. + + isExact - generic function(schemeNumber) + "exact?" + + isInexact - generic function(schemeNumber) + "inexact?" + + isComplex - generic function(schemeNumber) + "complex?" + + isReal - generic function(schemeNumber) + "real?" + + isRational - generic function(schemeNumber) + "rational?" + + isInteger - generic function(schemeNumber) + "integer?" + + isZero - generic function(schemeNumber) + "zero?" + + toExact - generic function(schemeNumber) + "exact" + + toInexact - generic function(schemeNumber) + "inexact" + + negate - generic function(schemeNumber) + Returns the argument's additive inverse, -*schemeNumber*. + + reciprocal - generic function(schemeNumber) + Return the argument's multiplicative inverse, 1 / *schemeNumber*. + + eq - generic function(schemeNumber, schemeNumber) + "=" + + ne - generic function(schemeNumber, schemeNumber) + Returns true if, and only if, the arguments are *not* equal in the + sense of Scheme's "=". + + add - generic function(schemeNumber, schemeNumber) + Returns the sum of the two arguments. + + subtract - generic function(schemeNumber1, schemeNumber2) + Returns the difference *schemeNumber1* - *schemeNumber2*. + + multiply - generic function(schemeNumber, schemeNumber) + Returns the product of the two arguments. + + divide - generic function(schemeNumber1, schemeNumber2) + Returns the quotient *schemeNumber1* / *schemeNumber2*. + + square - generic function(schemeNumber) + Returns the argument's square. + + realPart - generic function(complex) + "real-part" + + imagPart - generic function(complex) + "imag-part" + + expt - generic function(schemeNumber, integer) + As in Scheme. + + expt - generic function(complex, complex) + As in Scheme. + + exp - generic function(complex) + As in Scheme. + + magnitude - generic function(complex) + As in Scheme. + + angle - generic function(complex) + As in Scheme. + + sqrt - generic function(complex) + As in Scheme. + + log - generic function(complex) + Single-argument *log* as in Scheme. + + asin - generic function(complex) + As in Scheme. + + acos - generic function(complex) + As in Scheme. + + atan - generic function(complex) + Single-argument *atan* as in Scheme. + + sin - generic function(complex) + As in Scheme. + + cos - generic function(complex) + As in Scheme. + + tan - generic function(complex) + As in Scheme. + + SN_isFinite - generic function(real) + "finite?" + + SN_isInfinite - generic function(real) + "infinite?" + + SN_isNaN - generic function(real) + "nan?" + + isUnit - generic function(real) + Returns true if its argument equals 1 or -1. + + abs - generic function(real) + As in Scheme. + + isPositive - generic function(real) + "positive?" + + isNegative - generic function(real) + "negative?" + + sign - generic function(real) + Returns native -1 if *real* is negative, 0 if zero, or 1 if positive. + + floor - generic function(real) + As in Scheme. + + ceiling - generic function(real) + As in Scheme. + + truncate - generic function(real) + As in Scheme. + + round - generic function(real) + As in Scheme. + + compare - generic function(real1, real2) + Returns the of the difference . + + gt - generic function(real, real) + ">" + + lt - generic function(real, real) + "<" + + ge - generic function(real, real) + ">=" + + le - generic function(real, real) + "<=" + + divAndMod - generic function(real, real) + "div-and-mod" + + div - generic function(real, real) + As in Scheme. + + mod - generic function(real, real) + As in Scheme. + + atan2 - generic function(real, real) + Equivalent to *atan* with two arguments in Scheme. + + numerator - generic function(rational) + As in Scheme. + + denominator - generic function(rational) + As in Scheme. + + isEven - generic function(exactInteger) + "even?" + + isOdd - generic function(exactInteger) + "odd?" + + exp10 - generic function(significand, exponent) + Both arguments are exact integers. Returns an exact integer equal + to the *significand* times ten to the *exponent*. + + gcdNonnegative - generic function(exactInteger, exactInteger) + Both arguments are non-negative, exact integers. + returns their greatest common divisor (GCD). + + divideReduced - generic function(numerator, denominator) + Both arguments are exact, relatively prime integers, and + *denominator* is greater than zero. returns an + exact rational equal to *numerator* divided by *denominator*. +*/ + +function defineGenericFunctions(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var disp = plugins.get("Dispatch"); + var api = g.Object.create(null); + + function def(name, ndisp, nargs) { + api[name] = disp.defGeneric(name, ndisp, nargs); + } + + def("toSchemeNumber", 1); + def("numberToString", 1, 3); // 2nd and 3rd args native + def("isExact", 1); + def("isInexact", 1); + + def("isComplex", 1); + def("isReal", 1); + def("isRational", 1); + def("isInteger", 1); + def("isZero", 1); + + def("toExact", 1); + def("toInexact", 1); + def("negate", 1); + def("reciprocal", 1); + + def("eq", 2); + def("ne", 2); + + def("add", 2); + def("subtract", 2); + def("multiply", 2); + def("divide", 2); + + def("square", 1); + + def("realPart", 1); + def("imagPart", 1); + def("magnitude", 1); + def("angle", 1); + def("conjugate", 1); + + def("expt", 2); + + def("exp", 1); + def("sqrt", 1); + + def("log", 1); + def("asin", 1); + def("acos", 1); + def("atan", 1); + + def("sin", 1); + def("cos", 1); + def("tan", 1); + + def("SN_isFinite", 1); + def("SN_isInfinite", 1); + def("SN_isNaN", 1); + + def("isUnit", 1); + def("abs", 1); + def("isPositive", 1); + def("isNegative", 1); + def("sign", 1); + def("floor", 1); + def("ceiling", 1); + def("truncate", 1); + def("round", 1); + + def("compare", 2); + def("gt", 2); + def("lt", 2); + def("ge", 2); + def("le", 2); + def("divAndMod", 2); + def("div", 2); + def("mod", 2); + def("atan2", 2); + + def("numerator", 1); + def("denominator", 1); + def("numeratorAndDenominator", 1); + + def("isEven", 1); + def("isOdd", 1); + def("exactIntegerSqrt", 1); + def("exp10", 1, 2); // 2nd arg exact integer + def("gcdNonnegative", 2); + def("divideReduced", 2); + + def("bitwiseNot", 1); + def("bitwiseAnd", 2); + def("bitwiseIor", 2); + def("bitwiseXor", 2); + def("bitCount", 1); + def("bitLength", 1); + def("firstBitSet", 1); + def("isBitSet", 1, 2); // 2nd arg convertible to index + def("copyBit", 1, 3); // 2nd arg convertible to index; 3rd arg boolean + def("bitField", 1, 3); + def("copyBitField", 2, 4); + def("bitShift", 1, 2); + def("rotateBitField", 1, 4); + def("reverseBitField", 1, 3); + + return api; +} + +function defineSchemeNumberType(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var _NaN = g.NaN; + var api = g.Object.create(null); + var numberToString = plugins.get("numberToString"); + var disp = plugins.get("Dispatch"); + + function SchemeNumberType(){} + + // Inherit from Number so that "x instanceof Number" holds. + // But then override the standard methods, which are compatible + // only with native Number objects. + + SchemeNumberType.prototype = new Number(); + + // Good defaults. + function genericToString(radix) { + if (numberToString) + return numberToString(this, radix); + return "[object SchemeNumber]"; + } + function genericToLocaleString() { + return genericToString(); + } + function retNaN() { + return _NaN; + } + + // Bad default. + function genericFormatter() { + if (numberToString) + return numberToString(this); + return "SchemeNumber"; + } + + SchemeNumberType.prototype.toFixed = genericFormatter; + SchemeNumberType.prototype.toExponential = genericFormatter; + SchemeNumberType.prototype.toPrecision = genericFormatter; + SchemeNumberType.prototype.toString = genericToString; + SchemeNumberType.prototype.toLocaleString = genericToLocaleString; + SchemeNumberType.prototype.valueOf = retNaN; + + disp.defClass("SchemeNumber", { ctor: SchemeNumberType }); + + api.SchemeNumberType = SchemeNumberType; + return api; +} + +/* + Function: defineDebugFunction(plugins) + Creates a generic function, *debug*, for inspecting number objects. + + Input: + + *plugins* shall be a containing the following + element. + + Dispatch - a object. + calls the *Dispatch* object's *defGeneric* + method to create the *debug* function, and calls the resulting + function's *def* method with class name "SchemeNumber" to define a + generic implementation of *debug*. + + Output: + + debug - generic function(schemeNumber) -> string + Applications must not rely on the returned string's format. + Number implementations should specialize this function to provide + internal details of use during development. Developers may obtain + this function via *SchemeNumber.plugins.get("debug")*. Example: + + > SchemeNumber.plugins.get("debug")(SchemeNumber(10)) // "EINative(10)" + + See Also: +*/ +function defineDebugFunction(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var disp = plugins.get("Dispatch"); + var SchemeNumberType = plugins.get("SchemeNumberType"); + var Object_toString = uncurry(g.Object.prototype.toString); + var api = g.Object.create(null); + + // Generic default for classes that don't specialize debug. + function SchemeNumber_debug() { + var t; + try { t = this.toString(); } + catch (e) { + try { t = Object_toString(this); } + catch (e) { t = "?"; } + } + return "SchemeNumber(" + t + ")"; + } + + api.debug = disp.defGeneric("debug", 1); + api.debug.def(SchemeNumberType, SchemeNumber_debug); + + return api; +} + + +/* + Function: implementCoreLibrary(plugins) + Creates the plugins required by Scheme functions and a few others. + + Input: + + *plugins* shall be a containing the items listed + below. All may be added after the call to + but before any use of its results. When changes to plugins + produce changes in non-function results (such as *ZERO* and + *ONE*), the library broadcasts the changes via the + event. + + SchemeNumber - function(any) + The object as returned by + . + + nativeToExactInteger - function(integer) + *integer* is a native ECMAScript number of integer value. + returns an exact Scheme number whose value + equals *integer*. + + nativeToInexact - function(number) + *number* is a native ECMAScript number, possibly infinite or + *NaN*. returns an inexact Scheme number + approximating its argument. + + parseExactInteger - function(sign, string, radix) + *sign* is the native number 1 or -1. *radix* is the native number + 2, 8, 10, or 16. must be a function returning + a Scheme number equal to *sign* times the result of parsing + *string* as a positive, unprefixed, exact integer in the given + radix. + + parseInexact - function(sign, string) + *sign* is the native number 1 or -1. must be a + function returning a Scheme number equal to *sign* times the + result of parsing *string* as a positive, unprefixed, decimal, + inexact, real number. + + exactRectangular - function(x, y) + *x* and *y* are exact reals, *y* non-zero. + returns an exact complex equal to *x* + (i * *y*). + + inexactRectangular - function(x, y) + *x* and *y* are inexact reals. returns an + inexact complex equal to *x* + (i * *y*). + + exactPolar - function(r, theta) + *r* and *theta* are exact reals. returns an exact + complex equal to *r* * exp(i * *theta*). + + inexactPolar - function(r, theta) + *r* and *theta* are inexact reals. returns an + inexact complex equal to *r* * exp(i * *theta*). + + Output: + + returns an object with the following + properties. + + ZERO - the exact integer *0*. + + ONE - the exact integer *1*. + + TWO - the exact integer *2*. + + MINUS_ONE - the exact integer *-1*. + + INEXACT_ZERO - the inexact integer *0.0*. + + INEXACT_ONE - the inexact integer *1.0*. + + PI - the inexact real number pi. + + INFINITY - the inexact real number *+inf.0*. + + MINUS_INFINITY - the inexact real number *-inf.0*. + + NAN - the inexact real number *+nan.0*. + + I - the exact complex unit *i*. + + MINUS_I - the exact complex unit *-i*. + + raise - function(conditionType, message, irritant...) + This *raise* simply calls the user-overridable + but enforces the contract not to return. + + defaultRaise - function(conditionType, message, irritant...) + Throws an Error describing the arguments. + + raiseDivisionByExactZero - function() + Raises an exception as specified by Scheme to report division by + exact zero. + + isNumber - function(x) + Returns true if *x* is a Scheme number. + + assertReal - function(x) + Returns *x* if *x* is a real Scheme number, otherwise raises an + exception as specified by Scheme for invalid argument type. + + toReal - function(x) + Converts *x* to a Scheme number and behaves as if by returning + *assertReal(x)*. + + assertInteger - function(x) + Returns *x* if *x* is a Scheme integer, otherwise raises an + exception as specified by Scheme for invalid argument type. + + toInteger - function(x) + Converts *x* to a Scheme number and behaves as if by returning + *assertInteger(x)*. + + assertExact - function(x) + Returns *x* if *x* is an exact Scheme number, otherwise raises an + exception as specified by Scheme for invalid argument type. + + stringToNumber - function(string, radix, exact) + returns the Scheme number whose external + representation is *string* with added prefixes corresponding to + either or both of *radix* and *exact*, if defined. + + *s* should be the external representation of a Scheme number, such + as "2/3" or "#e1.1@-2d19". If *s* does not represent a Scheme + number, returns *false*. + + If *radix* is given, it must be either 2, 8, 10, or 16, and *s* + must not contain a radix prefix. The function behaves as if *s* + did contain the prefix corresponding to *radix*. + + If *exact* is given, it must have type "boolean", and *s* must not + contain an exactness prefix. The function behaves as if *s* + contained the corresponding prefix ("#e" if *exact* is true, "#i" + if false). + + truncateToPrecision - + + XXX documentation incomplete. +*/ +function implementCoreLibrary(plugins) { + "use strict"; + + // Abstract types, generic functions, and the SchemeNumber object. + // XXX Could remove unused items. + var SchemeNumber, toSchemeNumber, SchemeNumberType, Complex, Real, + InexactReal, ExactReal, ExactRational, ExactInteger, + numberToString, isExact, isInexact, isComplex, isReal, + isRational, isInteger, isZero, toExact, toInexact, negate, + reciprocal, eq, ne, add, subtract, multiply, divide, square, + realPart, imagPart, expt, expt, exp, magnitude, angle, sqrt, + log, asin, acos, atan, sin, cos, tan, SN_isFinite, + SN_isInfinite, SN_isNaN, isUnit, abs, isPositive, isNegative, + sign, floor, ceiling, truncate, round, compare, gt, lt, ge, + le, divAndMod, div, mod, atan2, numerator, denominator, + numeratorAndDenominator, + isEven, isOdd, exp10, gcdNonnegative, divideReduced; + + SchemeNumber = plugins.get("SchemeNumber"); + + SchemeNumberType = plugins.get("SchemeNumberType"); + Complex = plugins.get("Complex"); + Real = plugins.get("Real"); + InexactReal = plugins.get("InexactReal"); + ExactReal = plugins.get("ExactReal"); + ExactRational = plugins.get("ExactRational"); + ExactInteger = plugins.get("ExactInteger"); + + toSchemeNumber = plugins.get("toSchemeNumber"); + numberToString = plugins.get("numberToString"); + isExact = plugins.get("isExact"); + isInexact = plugins.get("isInexact"); + isComplex = plugins.get("isComplex"); + isReal = plugins.get("isReal"); + isRational = plugins.get("isRational"); + isInteger = plugins.get("isInteger"); + isZero = plugins.get("isZero"); + toExact = plugins.get("toExact"); + toInexact = plugins.get("toInexact"); + negate = plugins.get("negate"); + reciprocal = plugins.get("reciprocal"); + eq = plugins.get("eq"); + ne = plugins.get("ne"); + add = plugins.get("add"); + subtract = plugins.get("subtract"); + multiply = plugins.get("multiply"); + divide = plugins.get("divide"); + square = plugins.get("square"); + realPart = plugins.get("realPart"); + imagPart = plugins.get("imagPart"); + expt = plugins.get("expt"); + expt = plugins.get("expt"); + exp = plugins.get("exp"); + magnitude = plugins.get("magnitude"); + angle = plugins.get("angle"); + sqrt = plugins.get("sqrt"); + log = plugins.get("log"); + asin = plugins.get("asin"); + acos = plugins.get("acos"); + atan = plugins.get("atan"); + sin = plugins.get("sin"); + cos = plugins.get("cos"); + tan = plugins.get("tan"); + SN_isFinite = plugins.get("SN_isFinite"); + SN_isInfinite = plugins.get("SN_isInfinite"); + SN_isNaN = plugins.get("SN_isNaN"); + isUnit = plugins.get("isUnit"); + abs = plugins.get("abs"); + isPositive = plugins.get("isPositive"); + isNegative = plugins.get("isNegative"); + sign = plugins.get("sign"); + floor = plugins.get("floor"); + ceiling = plugins.get("ceiling"); + truncate = plugins.get("truncate"); + round = plugins.get("round"); + compare = plugins.get("compare"); + gt = plugins.get("gt"); + lt = plugins.get("lt"); + ge = plugins.get("ge"); + le = plugins.get("le"); + divAndMod = plugins.get("divAndMod"); + div = plugins.get("div"); + mod = plugins.get("mod"); + atan2 = plugins.get("atan2"); + numerator = plugins.get("numerator"); + denominator = plugins.get("denominator"); + numeratorAndDenominator = plugins.get("numeratorAndDenominator"); + isEven = plugins.get("isEven"); + isOdd = plugins.get("isOdd"); + exp10 = plugins.get("exp10"); + gcdNonnegative = plugins.get("gcdNonnegative"); + divideReduced = plugins.get("divideReduced"); + + // Functions to be provided by number implementations. + var nativeToInexact, parseInexact; + var parseExactInteger, nativeToExactInteger; + var divideReducedNotByOne; + var exactRectangular, inexactRectangular, exactPolar, inexactPolar; + + // Constants to be defined here once we have the necessaries. + var ZERO, ONE, TWO, MINUS_ONE, I, MINUS_I; + var INEXACT_ZERO, INEXACT_ONE, PI, INFINITY, MINUS_INFINITY, NAN; + + // Imports from ECMAScript. + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var Array_slice = uncurry(g.Array.prototype.slice); + var Array_join = uncurry(g.Array.prototype.join); + var Number_toString = uncurry(g.Number.prototype.toString); + var String_indexOf = uncurry(g.String.prototype.indexOf); + var String_substring = uncurry(g.String.prototype.substring); + var String_replace = uncurry(g.String.prototype.replace); + var RegExp_test = uncurry(g.RegExp.prototype.test); + + var Math_LN10 = g.Math.LN10; + var Math_LN2 = g.Math.LN2; + var Math_PI = g.Math.PI; + var Math_abs = g.Math.abs; + var Math_floor = g.Math.floor; + var Math_pow = g.Math.pow; + var _LN2 = g.Math.LN2; + var _LN10 = g.Math.LN10; + var _PI = g.Math.PI; + var _undefined = g.undefined; + var _Infinity = g.Infinity; + var _NaN = g.NaN; + var _parseInt = g.parseInt; + var _isNaN = g.isNaN; + var _isFinite = g.isFinite; + + var api = g.Object.create(null); + + function onPluginsChanged(plugins, changed) { + nativeToExactInteger = plugins.get("nativeToExactInteger"); + parseExactInteger = plugins.get("parseExactInteger"); + nativeToInexact = plugins.get("nativeToInexact"); + parseInexact = plugins.get("parseInexact"); + divideReducedNotByOne = plugins.get("divideReducedNotByOne"); + exactRectangular = plugins.get("exactRectangular"); + inexactRectangular = plugins.get("inexactRectangular"); + exactPolar = plugins.get("exactPolar"); + inexactPolar = plugins.get("inexactPolar"); + + function getComplexConstant(x, y) { + try { + return exactRectangular(nativeToExactInteger(x), + nativeToExactInteger(y)); + } + catch (e) { + return _undefined; + } + } + + var exts = g.Object.create(null); + if (changed.nativeToExactInteger || changed.exactRectangular) { + I = exts.I = getComplexConstant(0, 1); + MINUS_I = exts.MINUS_I = getComplexConstant(0, -1); + } + if (changed.nativeToExactInteger) { + ZERO = exts.ZERO = nativeToExactInteger(0); + ONE = exts.ONE = nativeToExactInteger(1); + TWO = exts.TWO = nativeToExactInteger(2); + MINUS_ONE = exts.MINUS_ONE = nativeToExactInteger(-1); + } + if (changed.nativeToInexact) { + INEXACT_ZERO = exts.INEXACT_ZERO = nativeToInexact(0); + INEXACT_ONE = exts.INEXACT_ONE = nativeToInexact(1); + PI = exts.PI = nativeToInexact(Math_PI); + INFINITY = exts.INFINITY = nativeToInexact(_Infinity); + MINUS_INFINITY = exts.MINUS_INFINITY = nativeToInexact(-_Infinity); + NAN = exts.NAN = nativeToInexact(_NaN); + } + // XXX should not recurse into extend(). Should return exts + // here and make extend() loop. + plugins.extend(exts); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins, {}); + + function retFalse() { return false; } + function retTrue() { return true; } + function retThis() { return this; } + function retZero() { return ZERO; } + function retOne() { return ONE; } + function retFirst(a) { return a; } + + function makeRectangular(x, y) { + if (isInexact(x)) + return inexactRectangular(x, toInexact(y)); + if (isInexact(y)) + return inexactRectangular(toInexact(x), y); + return exactRectangular(x, y); + } + + function makePolar(x, y) { + if (isInexact(x)) + return inexactPolar(x, toInexact(y)); + if (isInexact(y)) + return inexactPolar(toInexact(x), y); + return exactPolar(x, y); + } + + function defaultRaise(conditionType, message, irritant) { + var i, arg, msg = "SchemeNumber: " + conditionType + ": " + message; + if (arguments.length > 2) { + msg += ": "; + i = 2; + while (true) { + arg = arguments[i]; + try { msg += numberToString(arg); } + catch (e) { + try { msg += arg; } + catch (e) { msg += "?"; } + } + i++; + if (i === arguments.length) + break; + msg += ", "; + } + } + throw new g.Error(msg); + } + + /* + raise - function(conditionType, message, irritants...) + Forwards its arguments to and handles + errors in that function, namely returning when it shouldn't. + */ + function raise() { + var args = Array_slice(arguments); + + // Call the exception hook. + SchemeNumber.raise.apply(SchemeNumber, args); + + // Oops, it returned. Fall back to our known good raiser. + defaultRaise.apply(this, args); + } + + function raiseDivisionByExactZero() { + raise("&assertion", "division by exact zero"); + } + + // + // For (rnrs base (6)) i.e. SchemeNumber.fn. Could perhaps move + // to a library and get via onPluginsChanged. + // + + // Compute a real that had a |p attached. + // See the second half of R6RS Section 4.2.8 and also + // http://www.mail-archive.com/r6rs-discuss@lists.r6rs.org/msg01676.html. + + // This could be greatly optimized for native numbers using + // numberToBinary, but I have no use case, so I went with a slow, + // (hopefully) correct version. + function truncateToPrecision(x, precision, exact) { + + if (x === false || !isReal(x)) + lose(); + + if (!isZero(x)) { + var xabs = abs(x); + + var shift = precision - Math_floor(log(xabs) / Math_LN2) - 1; + var scale = expt(TWO, nativeToExactInteger(Math_abs(shift))); + if (shift < 0) + scale = reciprocal(scale); + var shifted = multiply(xabs, scale); + + // Correct for log() imprecision. + var denom = expt(TWO, nativeToExactInteger(precision)); + while (ge(shifted, denom)) { + shifted = divide(shifted, TWO); + scale = divide(scale, TWO); + } + for (var twiceShifted = add(shifted, shifted); + lt(twiceShifted, denom); + twiceShifted = add(shifted, shifted)) { + shifted = twiceShifted; + scale = add(scale, scale); + } + + // 0.5 <= shifted/denom < 1. + var rounded = divide(round(shifted), scale); + if (isNegative(x)) + rounded = negate(rounded); + x = rounded; + } + + // Then make it inexact unless there is #e. + if (!exact) + x = toInexact(x); + + return x; + } + + function assertReal(x) { + if (!isReal(x)) + raise("&assertion", "not a real number", x); + return x; + } + + function toReal(x) { + x = SchemeNumber(x); + isReal(x) || assertReal(x); + return x; + } + + function assertRational(q) { + if (!isRational(q)) + raise("&assertion", "not a rational number", q); + return q; + } + + function toRational(q) { + q = SchemeNumber(q); + isRational(q) || assertRational(q); + return q; + } + + function assertInteger(n) { + n = SchemeNumber(n); + if (!isInteger(n)) + raise("&assertion", "not an integer", n); + return n; + } + + function toInteger(n) { + n = SchemeNumber(n); + isInteger(n) || assertInteger(n); + return n; + } + + function assertExact(z) { + if (isInexact(z)) + raise("&assertion", "inexact number", z); + return z; + } + + function isNumber(x) { + return x instanceof SchemeNumberType; + } + + // + // For (rnrs base (6)) i.e. SchemeNumber.fn. + // Specifically, fn["string->number"] and SchemeNumber("...") + // + + // How to split a rectangular literal into real and imaginary components: + var decimalComplex = /^(.*[^a-zA-Z]|)([-+].*)i$/; + var radixComplex = /^(.*)([-+].*)i$/; + + var nanInfPattern = /^[-+](nan|inf)\.0$/; + var exponentMarkerPattern = /[eEsSfFdDlL]/; + var decimal10Pattern = + /^([0-9]+\.?|[0-9]*\.[0-9]+)([eEsSfFdDlL][-+]?[0-9]+)?$/; + + var uintegerPattern = { + 2: /^[01]+$/, 8: /^[0-7]+$/, 10: /^[0-9]+$/, 16: /^[0-9a-fA-F]+$/ + }; + + var PARSE_ERROR = new g.Object(); + + function stringToNumber(s, radix, exact) { + function lose() { + throw PARSE_ERROR; + } + function check(z) { + return z === false ? lose() : z; + } + function setExact(value) { + if (exact !== _undefined) lose(); + exact = value; + } + function setRadix(value) { + if (radix) lose(); + radix = value; + } + function parseUinteger(s, sign) { + if (!RegExp_test(uintegerPattern[radix], s)) + lose(); + + if (exact === false) { + if (radix === 10) + return parseInexact(sign, s); + return toInexact(parseExactInteger(sign, s, radix)); + } + return parseExactInteger(sign, s, radix); + } + function parseReal(s) { + if (RegExp_test(nanInfPattern, s)) { + if (exact) + lose(); + switch (s) { + case "+inf.0": return INFINITY; + case "-inf.0": return MINUS_INFINITY; + default: return NAN; + } + } + + var sign = 1; + switch (s[0]) { + case '-': sign = -1; // fall through + case '+': s = String_substring(s, 1); + } + + var slash = String_indexOf(s, '/'); + if (slash != -1) + return divide( + parseUinteger(String_substring(s, 0, slash), sign), + parseUinteger(String_substring(s, slash + 1), 1)); + + if (radix !== 10) + return parseUinteger(s, sign); + + var pipe = String_indexOf(s, '|'); + if (pipe !== -1) { + + // WHOA!!! Explicit mantissa width! Somebody really + // cares about correctness. However, I haven't got all + // day, so execution speed loses. + + var afterPipe = String_substring(s, pipe + 1); + if (!RegExp_test(uintegerPattern[10], afterPipe)) + lose(); + + s = String_substring(s, 0, pipe); + var precision = _parseInt(afterPipe, 10); + + if (precision === 0) + s = "0.0"; + else if (precision < 53) + return check( + truncateToPrecision(stringToNumber(s, radix, true), + precision, exact)); + } + + // We have only one floating point width. + s = String_replace(s, exponentMarkerPattern, 'e'); + + var dot = String_indexOf(s, '.'); + var e = String_indexOf(s, 'e'); + if (dot === -1 && e === -1) + return parseUinteger(s, sign); + + if (!RegExp_test(decimal10Pattern, s)) + lose(); + + if (!exact) + return parseInexact(sign, s); + + var integer = String_substring(s, 0, dot === -1 ? e : dot); + var exponent = ZERO; + var fraction; + + if (e === -1) + fraction = String_substring(s, dot + 1); + else { + if (dot === -1) + fraction = ""; + else + fraction = String_substring(s, dot + 1, e); + exponent = parseReal(String_substring(s, e + 1)); + } + + return exp10(parseExactInteger(sign, integer + fraction), + subtract(exponent, + nativeToExactInteger(fraction.length))); + } + function parseComplex(s) { + var a = String_indexOf(s, '@'); + if (a !== -1) { + var ret = makePolar(parseReal(String_substring(s, 0, a)), + parseReal(String_substring(s, a + 1))); + if (exact && isInexact(ret)) + // XXX I don't think this is right. If Scheme + // allows this, then by analogy, nothing requires + // (numerator #e0.1) to equal 1. + //ret = toExact(ret); + ret = ret; // ignore #e. + return ret; + } + + if (s[s.length - 1] !== "i") + return parseReal(s); + + if (s === "i") { + if (exact === false) + return inexactRectangular(INEXACT_ZERO, INEXACT_ONE); + return I; + } + if (s === "-i") { + if (exact === false) + return inexactRectangular(INEXACT_ZERO, + negate(INEXACT_ONE)); + return MINUS_I; + } + + var match = (radix === 10 ? decimalComplex : radixComplex).exec(s); + var x, y; + if (match) { + x = match[1]; + y = match[2]; + x = (x ? parseReal(x) + : (exact === false ? INEXACT_ZERO : ZERO)); + y = (y === "+" ? ONE + : (y === "-" ? MINUS_ONE : parseReal(y))); + } + else { + // Could be, for example, "3i". + x = (exact === false ? INEXACT_ZERO : ZERO); + y = parseReal(String_substring(s, 0, s.length - 1)); + } + + return makeRectangular(x, y); + } + + // Common cases first. + if (!radix || radix === 10) { + if (RegExp_test(/^-?[0-9]{1,15}$/, s)) { + if (exact === false) + return nativeToInexact(_parseInt(s, 10)); + return nativeToExactInteger(_parseInt(s, 10)); + } + } + + var i = 0; + + try { + while (s[i] === "#") { + switch (s[i+1]) { + case 'i': case 'I': setExact(false); break; + case 'e': case 'E': setExact(true ); break; + case 'b': case 'B': setRadix( 2); break; + case 'o': case 'O': setRadix( 8); break; + case 'd': case 'D': setRadix(10); break; + case 'x': case 'X': setRadix(16); break; + default: return false; + } + i += 2; + } + radix = radix || 10; + return parseComplex(String_substring(s, i)); + } + catch (e) { + if (e === PARSE_ERROR) + return false; + if (s == _undefined) + raise("&assertion", "missing argument"); + throw e; + } + } + + // + // End library function definitions. + // + + api.I = I; + api.ZERO = ZERO; + api.ONE = ONE; + api.TWO = TWO; + api.MINUS_ONE = MINUS_ONE; + api.INEXACT_ZERO = INEXACT_ZERO; + api.INEXACT_ONE = INEXACT_ONE; + api.PI = PI; + api.INFINITY = INFINITY; + api.MINUS_INFINITY = MINUS_INFINITY; + api.NAN = NAN; + + api.raise = raise; + api.defaultRaise = defaultRaise; + api.raiseDivisionByExactZero = raiseDivisionByExactZero; + api.stringToNumber = stringToNumber; + api.isNumber = isNumber; + api.assertReal = assertReal; + api.toReal = toReal; + api.assertRational = assertRational; + api.toRational = toRational; + api.assertInteger = assertInteger; + api.toInteger = toInteger; + api.assertExact = assertExact; + + api.makeRectangular = makeRectangular; + api.makePolar = makePolar; + + api.truncateToPrecision = truncateToPrecision; + + api.retFalse = retFalse; + api.retTrue = retTrue; + api.retThis = retThis; + api.retZero = retZero; + api.retOne = retOne; + api.retFirst = retFirst; + + return api; +} + + +/* + Function: implementRnrsBase(plugins) + Creates and returns the function collection. + + Input: + + *plugins* shall be a containing the public + object under the name *SchemeNumber*, as well as + the output of and . + The required plugins may be added between the call to + and the first use of its results. + + About: Function list + + All are specified by . In the list below, argument names indicate + applicable types as follows: + + obj - any value + z - any Scheme number + x - a real number + y - a real number + q - a rational number (excludes infinities and NaN) + n - an integer + k - an exact, non-negative integer + radix - an exact integer, either 2, 8, 10, or 16 + precision - an exact, positive integer + + Functions: Scheme functions + Elements of . + + Refer to the argument type key under . + + fn["number?"](obj) - Returns true if *obj* is a Scheme number. + Specified by: . + + fn["complex?"](obj) - Returns true if *obj* is a Scheme complex number. + Specified by: . + + fn["real?"](obj) - Returns true if *obj* is a Scheme real number. + Specified by: . + + fn["rational?"](obj) - Returns true if *obj* is a Scheme rational number. + Specified by: . + + fn["integer?"](obj) - Returns true if *obj* is a Scheme integer. + Specified by: . + + fn["real-valued?"](obj) - Returns true if *obj* is a Scheme complex number + and *fn["imag-part"](obj)* is zero. + Specified by: . + + fn["rational-valued?"](obj) - Returns true if *obj* is real-valued and + *fn["real-part"](obj)* is rational. + Specified by: . + + fn["integer-valued?"](obj) - Returns true if *obj* is real-valued and + *fn["real-part"](obj)* is an integer. + Specified by: . + + fn["exact?"](z) - Returns true if *z* is exact. + Specified by: . + + fn["inexact?"](z) - Returns true if *z* is inexact. + Specified by: . + + fn.inexact(z) - Returns an inexact number equal to *z*. + Specified by: . + + fn.exact(z) - Returns an exact number equal to *z*. + Specified by: . + + fn["eqv?"](obj1, obj2) - Returns true if *obj1 === obj2* or both arguments + are Scheme numbers and behave identically. + Specified by . + + fn["="](z, z, z...) - Returns true if all arguments are mathematically + equal, though perhaps differing in exactness. + Specified by: . + + fn["<"](x, x, x...) - Returns true if arguments increase monotonically. + Specified by: . + + fn[">"](x, x, x...) - Returns true if arguments decrease monotonically. + Specified by: . + + fn["<="](x, x, x...) - Returns true if arguments are monotonically + nondecreasing. + Specified by: . + + fn[">="](x, x, x...) - Returns true if arguments are monotonically + nonincreasing. + Specified by: . + + fn["zero?"](z) - Returns true if *z* equals zero. + Specified by: . + + fn["positive?"](x) - Returns true if *x* is positive. + Specified by: . + + fn["negative?"](x) - Returns true if *x* is negative. + Specified by: . + + fn["odd?"](n) - Returns true if *n* is odd. + Specified by: . + + fn["even?"](n) - Returns true if *n* is even. + Specified by: . + + fn["finite?"](x) - Returns true if *x* is finite. + Specified by: . + + fn["infinite?"](x) - Returns true if *x* is plus or minus infinity. + Specified by: . + + fn["nan?"](x) - Returns true if *x* is a NaN. + Specified by: . + + fn.max(x, x...) - Returns the greatest argument. + Specified by: . + + fn.min(x, x...) - Returns the least argument. + Specified by: . + + fn["+"](z...) - Returns the sum of the arguments. + Specified by: . + + fn["*"](z...) - Returns the product of the arguments. + Specified by: . + + fn["-"](z) - Returns the negation of *z* (-*z*). + Specified by: . + + fn["-"](z1, z2...) - Returns *z1* minus the sum of the number(s) *z2*. + Specified by: . + + fn["/"](z) - Returns the reciprocal of *z* (1 / *z*). + Specified by: . + + fn["/"](z1, z2...) - Returns *z1* divided by the product of the number(s) + *z2*. + Specified by: . + + fn.abs(x) - Returns the absolute value of *x*. + Specified by: . + + fn["div-and-mod"](x, y) - Returns *fn.div(x, y)* and *fn.mod(x, y)*. + Specified by: . + + fn.div(x, y) - Returns the greatest integer less than or equal to + *x* / *y*. + Specified by: . + + fn.mod(x, y) - Returns *x* - (*y* * fn.div(*x*, *y*)). + Specified by: . + + fn["div0-and-mod0"](x, y) - Returns *fn.div0(x, y)* and *fn.mod0(x, y)*. + Specified by: . + + fn.div0(x, y) - Returns the integer nearest *x* / *y*, ties go lower. + Specified by: . + + fn.mod0(x, y) - Returns *x* - (*y* * fn.div0(*x*, *y*)). + Specified by: . + + fn.gcd(n...) - Returns the arguments' greatest common non-negative divisor. + Specified by: . + + fn.lcm(n...) - Returns the arguments' least common positive multiple. + Specified by: . + + fn.numerator(q) - Returns *q* * *fn.denominator(q)*. + Specified by: . + + fn.denominator(q) - Returns the smallest positive integer which when + multiplied by *q* yields an integer. + Specified by: . + + fn.floor(x) - Returns the greatest integer not greater than *x*. + Specified by: . + + fn.ceiling(x) - Returns the least integer not less than *x*. + Specified by: . + + fn.truncate(x) - Returns the closest integer between 0 and *x*. + Specified by: . + + fn.round(x) - Returns the closest integer to *x*, ties go even. + Specified by: . + + fn.rationalize(x, y) - Returns the simplest fraction within *y* of *x*. + Specified by: . + + fn.exp(z) - Returns e to the *z*. + Specified by: . + + fn.log(z) - Returns the natural logarithm of *z*. + Specified by: . + + fn.log(z1, z2) - Returns the base-*z2* logarithm of *z1*. + Specified by: . + + fn.sin(z) - Returns the sine of *z*. + Specified by: . + + fn.cos(z) - Returns the cosine of *z*. + Specified by: . + + fn.tan(z) - Returns the tangent of *z*. + Specified by: . + + fn.asin(z) - Returns a number whose sine is *z*. + Specified by: . + + fn.acos(z) - Returns a number whose cosine is *z*. + Specified by: . + + fn.atan(z) - Returns a number whose tangent is *z*. + Specified by: . + + fn.atan(y, x) - Returns the angle that passes through *(x,y)*. + Specified by: . + + fn.sqrt(z) - Returns the square root of *z*. + Specified by: . + + fn["exact-integer-sqrt"](k) - Returns maximal exact s and non-negative r + such that s*s + r = *k*. + Specified by: . + + fn.expt(z1, z2) - Returns *z1* to the power *z2*. + Specified by: . + + fn["make-rectangular"](x, y) - Returns the complex number *x + iy*. + Specified by: . + + fn["make-polar"](r, theta) - Returns the complex number with magnitude *r* + and angle *theta*. + Specified by: . + + fn["real-part"](z) - Returns x such that *z* = x + iy. + Specified by: . + + fn["imag-part"](z) - Returns y such that *z* = x + iy. + Specified by: . + + fn.magnitude(z) - Returns the magnitude of *z*. + Specified by: . + + fn.angle(z) - Returns *fn.atan(y,x)* where *z* = x + iy. + Specified by: . + + Function: fn["number->string"](z) + Converts *z* to a string, base 10. + + For exact *z*, *number->string* retains full precision. Exact + fractions are expressed as numerator + "/" + denominator. + Examples: + + > fn["number->string"](fn["string->number"]("#e1.2")) // "6/5" + > fn["number->string"](fn["/"]("12", "-8")) // "-3/2" + + Infinities are "+inf.0" and "-inf.0". NaN is "+nan.0". + + The result always yields a number equal to *z* (in the sense of + ) when passed to + number"](string)>. + + Specified by: + + See Also: number"](string)>. + + Function: fn["number->string"](z, radix) + Converts *z* to a string, base *radix*. + *radix* must be exact 2, 8, 10, or 16. + + The output never contains an explicit radix prefix. + + The result always yields a value equal to *z* (in the sense of + ) when converted back to a number by + number"](string, radix)>. + + Specified by: + + See Also: number"](string, radix)>. + + Function: fn["number->string"](z, radix, precision) + Converts and suffixes *z* with a count of significant bits. + + Appends "|p" to each inexact real component of *z* where p is the + smallest mantissa width not less than *precision* needed to + represent the component exactly. + + Specified by: + + Function: fn["string->number"](string) + Parses *string* as a Scheme number. Returns *false* if unable. + + Examples: + + > "1" - exact 1. + > "1." - inexact 1, same as "1.0". + > "1/2" - exact one-half, same as "2/4" etc. + > "0.5" - inexact 0.5. + > "12e3" - inexact 12000. + > "i" - the imaginary unit. + > "-2+1/2i" - exact complex number. + > "2.@1" - complex in polar coordinates, r=2.0, theta=1.0. + > "+inf.0" - positive infinity. + > "-inf.0" - negative infinity. + > "+nan.0" - IEEE NaN (not-a-number). + > "#e0.5" - exact one-half, forced exact by prefix #e. + > "#i1/2" - 0.5, inexact by prefix #i. + > "#x22" - exact 34; prefix #x hexadecimal. + > "#o177" - exact 127; prefix #o octal. + > "#b101" - exact 5; prefix #b binary. + > "#i#b101" - inexact 5.0. + > "#b#i101" - same. + > "1.2345678|24" - rounded as if to single-precision (about 1.23456776). + + Specified by: + + See Also: string"](z)>, + + Function: fn["string->number"](string, radix) + Parses *string* as a Scheme number using *radix* as default radix. + + *radix* must be exact 2, 8, 10, or 16. If *string* contains a + radix prefix, the prefix takes precedence over *radix*. + + Specified by: + + See Also: string"](z, radix)>. +*/ +function implementRnrsBase(plugins) { + //"use strict"; // Strict mode hinders error reporting. + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var SchemeNumber, stringToNumber, ZERO, ONE, MINUS_ONE, INEXACT_ZERO, NAN, raise, isNumber, assertReal, toReal, toRational, toInteger, assertExact, makeRectangular, makePolar; + var numberToString, isExact, isInexact, isComplex, isReal, isRational, isInteger, isZero, toExact, toInexact, negate, reciprocal, eq, ne, add, subtract, multiply, divide, realPart, imagPart, expt, exp, magnitude, angle, sqrt, log, asin, acos, atan, sin, cos, tan, SN_isFinite, SN_isInfinite, SN_isNaN, abs, isPositive, isNegative, floor, ceiling, truncate, round, compare, gt, lt, ge, le, divAndMod, div, mod, atan2, numerator, denominator, isEven, isOdd, exactIntegerSqrt, gcdNonnegative; + var Array_push = uncurry(g.Array.prototype.push); + + SchemeNumber = plugins.get("SchemeNumber"); + numberToString = plugins.get("numberToString"); + isExact = plugins.get("isExact"); + isInexact = plugins.get("isInexact"); + isComplex = plugins.get("isComplex"); + isReal = plugins.get("isReal"); + isRational = plugins.get("isRational"); + isInteger = plugins.get("isInteger"); + isZero = plugins.get("isZero"); + toExact = plugins.get("toExact"); + toInexact = plugins.get("toInexact"); + negate = plugins.get("negate"); + reciprocal = plugins.get("reciprocal"); + eq = plugins.get("eq"); + ne = plugins.get("ne"); + add = plugins.get("add"); + subtract = plugins.get("subtract"); + multiply = plugins.get("multiply"); + divide = plugins.get("divide"); + realPart = plugins.get("realPart"); + imagPart = plugins.get("imagPart"); + expt = plugins.get("expt"); + exp = plugins.get("exp"); + magnitude = plugins.get("magnitude"); + angle = plugins.get("angle"); + sqrt = plugins.get("sqrt"); + log = plugins.get("log"); + asin = plugins.get("asin"); + acos = plugins.get("acos"); + atan = plugins.get("atan"); + sin = plugins.get("sin"); + cos = plugins.get("cos"); + tan = plugins.get("tan"); + SN_isFinite = plugins.get("SN_isFinite"); + SN_isInfinite = plugins.get("SN_isInfinite"); + SN_isNaN = plugins.get("SN_isNaN"); + abs = plugins.get("abs"); + isPositive = plugins.get("isPositive"); + isNegative = plugins.get("isNegative"); + floor = plugins.get("floor"); + ceiling = plugins.get("ceiling"); + truncate = plugins.get("truncate"); + round = plugins.get("round"); + compare = plugins.get("compare"); + gt = plugins.get("gt"); + lt = plugins.get("lt"); + ge = plugins.get("ge"); + le = plugins.get("le"); + divAndMod = plugins.get("divAndMod"); + div = plugins.get("div"); + mod = plugins.get("mod"); + atan2 = plugins.get("atan2"); + numerator = plugins.get("numerator"); + denominator = plugins.get("denominator"); + isEven = plugins.get("isEven"); + isOdd = plugins.get("isOdd"); + exactIntegerSqrt = plugins.get("exactIntegerSqrt"); + gcdNonnegative = plugins.get("gcdNonnegative"); + stringToNumber = plugins.get("stringToNumber"); + + function onPluginsChanged(plugins) { + ZERO = plugins.get("ZERO"); + ONE = plugins.get("ONE"); + MINUS_ONE = plugins.get("MINUS_ONE"); + INEXACT_ZERO = plugins.get("INEXACT_ZERO"); + NAN = plugins.get("NAN"); + raise = plugins.get("raise"); + isNumber = plugins.get("isNumber"); + assertReal = plugins.get("assertReal"); + toReal = plugins.get("toReal"); + toRational = plugins.get("toRational"); + toInteger = plugins.get("toInteger"); + assertExact = plugins.get("assertExact"); + makeRectangular = plugins.get("makeRectangular"); + makePolar = plugins.get("makePolar"); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins); + + var fn = { + + "eqv?" : fn_isEqv, + "number?" : fn_isNumber, + "complex?" : fn_isComplex, + "real?" : fn_isReal, + "rational?" : fn_isRational, + "integer?" : fn_isInteger, + "real-valued?" : fn_isRealValued, + "rational-valued?" : fn_isRationalValued, + "integer-valued?" : fn_isIntegerValued, + + "exact?" : makeUnary(SchemeNumber, isExact), + "inexact?" : makeUnary(SchemeNumber, isInexact), + + inexact : makeUnary(SchemeNumber, toInexact), + exact : makeUnary(SchemeNumber, toExact), + + "=" : fn_equals, + "<" : makeComparator(lt), + ">" : makeComparator(gt), + "<=" : makeComparator(le), + ">=" : makeComparator(ge), + + "zero?" : makeUnary(SchemeNumber, isZero), + "positive?" : makeUnary(toReal, isPositive), + "negative?" : makeUnary(toReal, isNegative), + "odd?" : makeUnary(toInteger, isOdd), + "even?" : makeUnary(toInteger, isEven), + "finite?" : makeUnary(toReal, SN_isFinite), + "infinite?" : makeUnary(toReal, SN_isInfinite), + "nan?" : makeUnary(toReal, SN_isNaN), + + max : makeMaxMin(gt), + min : makeMaxMin(lt), + + "+" : function() { + var ret = ZERO; + var len = arguments.length; + var i = 0; + while (i < len) + ret = add(ret, SchemeNumber(arguments[i++])); + return ret; + }, + + "*" : function() { + var ret = ONE; + var len = arguments.length; + var i = 0; + while (i < len) + ret = multiply(ret, SchemeNumber(arguments[i++])); + return ret; + }, + + "-" : function(a) { + var len = arguments.length; + + switch (len) { + case 0: args1plus(arguments); + case 1: return negate(SchemeNumber(a)); + } + var ret = SchemeNumber(a); + var i = 1; + while (i < len) + ret = subtract(ret, SchemeNumber(arguments[i++])); + return ret; + }, + + "/" : function(a) { + var len = arguments.length; + + switch (len) { + case 0: args1plus(arguments); + case 1: return reciprocal(SchemeNumber(a)); + case 2: return divide(SchemeNumber(a), SchemeNumber(arguments[1])); + } + var product = ONE; + var i = 1; + while (i < len) + product = multiply(product, SchemeNumber(arguments[i++])); + return divide(SchemeNumber(a), product); + }, + + abs : makeUnary(toReal, abs), + "div-and-mod" : makeDivMod(false, 2), + div : makeDivMod(false, 0), + mod : makeDivMod(false, 1), + "div0-and-mod0" : makeDivMod(true, 2), + div0 : makeDivMod(true, 0), + mod0 : makeDivMod(true, 1), + + gcd : function() { + var ret = ZERO; + var len = arguments.length; + var exact = true; + for (var i = 0; i < len; i++) { + var arg = toInteger(arguments[i]); + exact = exact && isExact(arg); + ret = gcdNonnegative(ret, toExact(abs(arg))); + } + ret = abs(ret); + return (exact ? ret : toInexact(ret)); + }, + + lcm : function() { + var ret = ONE; + var len = arguments.length; + var exact = true; + for (var i = 0; i < len; i++) { + var arg = toInteger(arguments[i]); + exact = exact && isExact(arg); + arg = toExact(abs(arg)); + ret = divide(multiply(ret, arg), gcdNonnegative(ret, abs(arg))); + } + return (exact ? ret : toInexact(ret)); + }, + + numerator : makeUnary(toRational, numerator), + denominator : makeUnary(toRational, denominator), + floor : makeUnary(toReal, floor), + ceiling : makeUnary(toReal, ceiling), + truncate : makeUnary(toReal, truncate), + round : makeUnary(toReal, round), + rationalize : rationalize, + exp : makeUnary(SchemeNumber, exp), + + log : function(z, base) { + var ret = log(SchemeNumber(z)); + switch (arguments.length) { + case 2: ret = divide(ret, log(SchemeNumber(base))); // fall through + case 1: return ret; + default: wrongArgCount("1-2", arguments); + } + }, + + sin : makeUnary(SchemeNumber, sin), + cos : makeUnary(SchemeNumber, cos), + tan : makeUnary(SchemeNumber, tan), + asin : makeUnary(SchemeNumber, asin), + acos : makeUnary(SchemeNumber, acos), + + atan : function(y, x) { + switch (arguments.length) { + case 1: return atan(SchemeNumber(y)); + case 2: return atan2(toReal(y), toReal(x)); + default: wrongArgCount("1-2", arguments); + } + }, + + sqrt : makeUnary(SchemeNumber, sqrt), + "exact-integer-sqrt" : makeUnary(toInteger, exactIntegerSqrt), + + expt : function(a, b) { + arguments.length === 2 || args2(arguments); + return expt(SchemeNumber(a), SchemeNumber(b)); + }, + + "make-rectangular" : function(x, y) { + arguments.length === 2 || args2(arguments); + return makeRectangular(toReal(x), toReal(y)); + }, + + "make-polar" : function(r, theta) { + arguments.length === 2 || args2(arguments); + return makePolar(toReal(r), toReal(theta)); + }, + + "real-part" : makeUnary(SchemeNumber, realPart), + "imag-part" : makeUnary(SchemeNumber, imagPart), + magnitude : makeUnary(SchemeNumber, magnitude), + angle : makeUnary(SchemeNumber, angle), + + "number->string" : function(z, radix, precision) { + var r = radix; + switch (arguments.length) { + case 3: + precision = toInteger(precision); + assertExact(precision); + // fall through + case 2: + r = assertExact(toInteger(r)).valueOf(); + if (r !== 10 && r !== 16 && r !== 8 && r !== 2) + raise("&assertion", "invalid radix", radix); + // fall through + case 1: break; + default: wrongArgCount("1-3", arguments); + } + return numberToString(SchemeNumber(z), r, precision); + }, + + "string->number" : function(s, radix) { + switch (arguments.length) { + case 1: + case 2: return stringToNumber(String(s), radix); + default: wrongArgCount("1-2", arguments); + } + } + }; + + // Scheme function helpers. + + function wrongArgCount(expected, a) { + var msg = "Function" + + // XXX a.callee throws TypeError in strict code. + var called; + try { + called = a.callee; + } + catch (e) {} + if (called) { + for (name in fn) { + if (fn[name] === called) { + msg += " '" + name + "'"; + break; + } + } + } + raise("&assertion", msg + " expected " + expected + + " argument" + (expected == "1" ? "" : "s") + ", got " + a.length); + } + + function args1(a) { a.length === 1 || wrongArgCount(1, a); } + function args2(a) { a.length === 2 || wrongArgCount(2, a); } + + function args1plus(a) { a.length > 0 || wrongArgCount("1 or more", a); } + function args2plus(a) { a.length > 1 || wrongArgCount("2 or more", a); } + + function fn_isEqv(a, b) { + arguments.length === 2 || args2(arguments); + if (a === b) + return true; + if (!isNumber(a) || !isNumber(b)) + return false; + return (eq(a, b) && isExact(a) === isExact(b)); + } + + function fn_isNumber(x) { + arguments.length === 1 || args1(arguments); + return isNumber(x); + } + + function fn_isComplex(x) { + arguments.length === 1 || args1(arguments); + return isNumber(x) && isComplex(x); + } + + function fn_isReal(x) { + arguments.length === 1 || args1(arguments); + return isNumber(x) && isReal(x); + } + + function fn_isRational(x) { + arguments.length === 1 || args1(arguments); + return isNumber(x) && isRational(x); + } + + function fn_isInteger(x) { + arguments.length === 1 || args1(arguments); + return isNumber(x) && isInteger(x); + } + + function fn_isRealValued(x) { + arguments.length === 1 || args1(arguments); + return isNumber(x) && isComplex(x) && isZero(imagPart(x)); + } + + function fn_isRationalValued(x) { + arguments.length === 1 || args1(arguments); + return fn_isRealValued(x) && isRational(realPart(x)); + } + + function fn_isIntegerValued(x) { + arguments.length === 1 || args1(arguments); + return fn_isRealValued(x) && isInteger(realPart(x)); + } + + function fn_equals(a, b) { + var len = arguments.length; + len > 1 || args2plus(arguments); + a = SchemeNumber(a); + for (var i = 1; i < len; i++) { + if (!eq(a, SchemeNumber(arguments[i]))) + return false; + } + return true; + } + + function makeUnary(conv, func) { + function unary(a) { + arguments.length === 1 || args1(arguments); + return func(conv(a)); + } + return unary; + } + + function makeComparator(cmp) { + function comparator(a, b) { + var len = arguments.length; + len > 1 || args2plus(arguments); + b = toReal(b); + if (!cmp(toReal(a), b)) + return false; + for (var i = 2; i < len; i++) { + var c = toReal(arguments[i]); + if (!cmp(b, c)) + return false; + b = c; + } + return true; + } + return comparator; + } + + function makeMaxMin(cmp) { + function maxMin(a) { + var len = arguments.length; + len > 0 || args1plus(arguments); + + var ret = toReal(a); + var exact = isExact(ret); + + for (var i = 1; i < len; i++) { + var x = toReal(arguments[i]); + if (SN_isNaN(x)) + return x; + if (exact) { + exact = isExact(x); + if (!exact) + ret = toInexact(ret); // XXX Cheaper comparisons? + } + if (cmp(x, ret) !== false) { + ret = x; + } + } + return exact ? ret : toInexact(ret); + } + return maxMin; + } + + function makeDivMod(is0, which) { + function divMod(x, y) { + arguments.length === 2 || args2(arguments); + x = toReal(x); + y = toReal(y); + + if (!SN_isFinite(x)) + raise("&assertion", "div/mod first argument is not finite", x); + if (isZero(y)) + raise("&assertion", "div/mod second argument is zero", y); + + if (!is0) { + switch (which) { + case 0: return div(x, y); + case 1: return mod(x, y); + case 2: default: return divAndMod(x, y); + } + } + + var dm = divAndMod(x, y); + var m = dm[1]; + var yabs = abs(y); + + if (ge(add(m, m), yabs)) { + switch (which) { + case 0: return add(dm[0], isNegative(y) ? MINUS_ONE : ONE); + case 1: return subtract(m, yabs); + case 2: default: return [ + add(dm[0], isNegative(y) ? MINUS_ONE : ONE), + subtract(m, yabs)]; + } + } + switch (which) { + case 0: return dm[0]; + case 1: return m; + case 2: default: return dm; + } + } + return divMod; + } + + /* Rationalize is not a method, because I consider it broken by design. + It should operate on an open, not closed interval. */ + + function rationalize(x, delta) { + args2(arguments); + x = SchemeNumber(x); + delta = SchemeNumber(delta); + + // Handle weird cases first. + if (!SN_isFinite(x) || !SN_isFinite(delta)) { + assertReal(x); + assertReal(delta); + if (SN_isInfinite(delta)) + return (SN_isFinite(x) ? INEXACT_ZERO : NAN); + if (SN_isNaN(delta)) + return delta; + return x; + } + + if (isZero(delta)) + return x; + + delta = abs(delta); // It's what PLT and Mosh seem to do. + + var inexact = isInexact(x) || isInexact(delta); + if (inexact) { + // Ensure that our algorithm terminates. + // XXX What if x or delta is irrational? + x = toExact(x); + delta = toExact(delta); + } + + var x0 = subtract(x, delta); + var x1 = add(x, delta); + var a = floor(x0); + var b = floor(x1); + + if (ne(a, b)) { + var negative = isNegative(a); + if (isNegative(b) != negative) + return (inexact ? INEXACT_ZERO : ZERO); + a = (negative ? b : ceiling(x0)); + return inexact ? toInexact(a) : a; + } + var cf = []; // Continued fraction, b implied. + + while (true) { + x0 = subtract(x0, a); + if (isZero(x0)) + break; + x1 = subtract(x1, a); + if (isZero(x1)) + break; + + x0 = reciprocal(x0); + x1 = reciprocal(x1); + a = floor(x0); + + switch (compare(a, floor(x1))) { + case -1: Array_push(cf, ceiling(x0)); break; + case 1: Array_push(cf, ceiling(x1)); break; + case 0: default: + Array_push(cf, a); + continue; + } + break; + } + var ret = ZERO; + var i = cf.length; + while (i--) + ret = reciprocal(add(ret, cf[i])); + + ret = add(ret, b); + return (inexact ? toInexact(ret) : ret); + } + + // XXX Should avoid using an object literal in the definition of + // *fn* so we don't have to worry about inheriting junk from + // Object.prototype. + + var api = g.Object.create(null); + for (var i in fn) { + if (g.Object.prototype.hasOwnProperty.call(fn, i)) + api[i] = fn[i]; + } + + return api; +} + +/* + Function: implementSchemeNumber(plugins) + Creates and returns as *SchemeNumber* a partially constructed + object. + + Input: + + *plugins* shall be a containing the following + elements. All except *defaultRaise* may be defined after the call + to but before the first call to its + result. + + defaultRaise - the initial value of . + + SchemeNumberType - base constructor of the numerical tower. + uses *instanceof SchemeNumberType* to determine + whether to return its argument unchanged. + + nativeToInexact - function(number) -> SchemeNumber + *number* is a native number. must return an inexact + Scheme Number approximating its argument. must + handle infinite values and *NaN*. + + stringToNumber - function(string) -> SchemeNumber | false + *string* is a string. must behave like Scheme's + *string->number* function given a single argument. See + number"](string)>. + + raise - function(conditionType, message, irritants...) + This *raise* simply calls the user-overridable + but enforces the contract not to return. + + toSchemeNumber - function(obj) -> SchemeNumber + Called when the argument to is not of known + convertible type. The version defined in + has no imlementations; it exists for applications that want + to convert objects other than strings and numbers. + + Returns: + + A new function object like the public . +*/ +function implementSchemeNumber(plugins) { + "use strict"; + var SchemeNumberType, nativeToInexact, stringToNumber, toSchemeNumber, raise; + + function SchemeNumber(obj) { + var ret; + + if (obj instanceof SchemeNumberType) + return obj; + + if (typeof obj === "string") { + ret = stringToNumber(obj); + if (ret === false) + raise("&assertion", "not a number", obj); + return ret; + } + + if (typeof obj === "number") + return nativeToInexact(obj); + + try { + return toSchemeNumber(obj); + } catch (e) { + raise("&assertion", "not a number", obj,e); + } + } + + /* + Property: VERSION + Library version as an array of integers. + + For example, *[1,2,4]* corresponds to Version 1.2.4. + */ + SchemeNumber.VERSION = [1,3,2]; + + /* + Property: fn + Container of . + + The object contains a property, , + which in turn contains the functions implementing the Scheme + numeric types. + + These functions are stored in under their Scheme names, so + ["quotation"] is needed where the names contain characters that + are incompatible with dot.notation. (In JavaScript, *X.Y* and + *X["Y"]* are equivalent expressions where Y is a valid identifier. + Not all Scheme function names are valid JavaScript identifiers, so + one needs the second syntax to extract them from .) + + You may find it convenient to copy , , and the + output function string> into short-named variables, by + convention *sn*, *fn*, and *ns*. The rest of this section assumes + you have done this: + + > var sn = SchemeNumber; + > var fn = sn.fn; + > var ns = fn["number->string"]; + + Functions that require a Scheme number argument automatically + filter the argument through . + + For example, *"2"* (string) would be exact (parsed as Scheme) but + *2* (equal to *2.0*) would be inexact, as demonstrated: + + > a1 = fn["exact?"]("2"); // a1 === true + > a1 = fn["exact?"](sn("2")); // same + > + > a2 = fn["exact?"](2); // a2 === false + > a2 = fn["exact?"]("2.0"); // same + > a2 = fn["exact?"](sn("2.0")); // same + + Note that the following functions accept arguments of any type and + therefore do not apply to their arguments: + + - + - + - + - + - + - + - + - + - + + Here, for example, is 2 to the 1,024th power, as a decimal + string: + + > a3 = ns(fn.expt("2", "1024")); + + Fractional + arithmetic: + + > a4 = fn["+"]("1/3", "4/5"); // 17/15 + + Numerator and denominator of a floating-point value, + hexadecimal: + + > a5 = ns(fn.numerator(1/3), "16"); // "#i15555555555555" + > a6 = ns(fn.denominator(1/3), "16"); // "#i40000000000000" + + The *#i* prefix denotes an inexact number, as detailed in . Since 1/3 is a native JavaScript number, + the library regards it as inexact, and operations such as + numerator yield inexact integer results. If we used *"1/3"* + (quoted) instead of *1/3*, the numerator and denominator would be + the mathematically correct 1 and 3. + + Functions specified to return two values (such as + and ) return a two-element array as per + JavaScript conventions. + + Caveats: + + o Arcane features such as explicit mantissa widths or complex + transcendental functions, while believed complete, are + unoptimized. + + o The library exhibits other visible behaviors besides those + described herein. However, they are not part of its public + API and may change or disappear from one release to the next. + + o In particular, Scheme numbers' *toString* property sometimes + produces output that is incorrect in the Scheme sense. (This + stems from the decision to represent inexact reals as + unadorned native numbers.) + + To serialize numbers as Scheme would, use + string"]>. + + > "" + SchemeNumber(2); // "2" + > SchemeNumber.fn["number->string"](2); // "2." + + To test a Scheme number for numerical equality with another Scheme + number or a native value, use . Likewise for "]> + etc. + + See Also: + + + */ + SchemeNumber.fn = undefined; // implementRnrsBase(plugins); + + /* + Property: raise + Function that translates a Scheme exception to ECMAScript. + + When a library function encounters a situation where the Scheme + specification requires it to raise an exception with a certain + condition type, the function calls . + + Programs may assign a custom function to to + intercept such exceptions. + + Parameters: + + conditionType - The specified condition, for example, "&assertion". + message - A string describing the error. + irritants... - Zero or more erroneous data arguments. + + Returns: + + The default function simply throws an + *Error*. + + See Also: + + , + */ + SchemeNumber.raise = undefined; // plugins.get("defaultRaise"); + + /* + Property: maxIntegerDigits + Maximum size of integers created by the + function. + + To avoid using up all system memory, exact results of a call to + are capped at a configurable number of digits, + by default one million. holds + this limit. + + The size limit does *not* currently protect against other means of + creating large exact integers. For example, when passed + "#e1e9999999", the function tries to allocate 10 + million digits, regardless of . + + In a future release, cases such as the preceeding example may be + checked. If there is any possibility of legitimately creating + such large integers, either as number objects or components + thereof, code should increase . + + Default Value: + + - 1000000 (1e6 or 1 million) + */ + SchemeNumber.maxIntegerDigits = 1e6; // 1 million digits. + + /* + Property: plugins + An instance of shared among back-end number + implementations in a SchemeNumber system. + + See Also: + */ + SchemeNumber.plugins = plugins; + + function onPluginsChanged(plugins) { + SchemeNumberType = plugins.get("SchemeNumberType"); + nativeToInexact = plugins.get("nativeToInexact"); + stringToNumber = plugins.get("stringToNumber"); + toSchemeNumber = plugins.get("toSchemeNumber"); + raise = plugins.get("raise"); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins); + + /* + SchemeNumber = plugins.get("SchemeNumber"); + */ + return SchemeNumber; +} + +function makeMinimalBase() { + + var SchemeNumber, debug; + + var disp = DispatchJs.makeContext({ + //debug: true, + methodNamePrefix: "SN_", + methodNameSeparator: " " + }); + + var plugins = new PluginContainer({ + Dispatch: disp, + es5globals: getEs5Globals() + }); + + plugins.extend(implementUncurry(plugins)); + plugins.extend(defineGenericFunctions(plugins)); + plugins.extend(defineSchemeNumberType(plugins)); + plugins.extend(defineDebugFunction(plugins)); + + // XXX These next steps could be conflated. + SchemeNumber = implementSchemeNumber(plugins); + plugins.extend("SchemeNumber", SchemeNumber); + plugins.extend(implementCoreLibrary(plugins)); + SchemeNumber.raise = plugins.get("defaultRaise"); + SchemeNumber.fn = implementRnrsBase(plugins); + + return SchemeNumber; +} + +/* + Function: defineAbstractTypes(plugins) + Creates a prototype-based type hierarchy corresponding to some of + the number classes defined by Scheme. + + The constructors created here ignore their arguments and lack any + property other than *prototype* and a few inherited methods noted + below. They may be used as "abstract base classes" to create + prototypes of other, more concrete numeric subtypes. + + The hierarchy inherits from the global Number class so that *n + instanceof Number* holds for any Scheme number *n*. The intent is + that Scheme numbers should interoperate with native numbers to the + extent possible and support the ECMAScript formatting methods + *toFixed*, *toExponential*, and *toPrecision*. + + Input: + + *plugins* shall be a with the following + contents. + + SchemeNumberType - base of the numerical tower + Inherits from the built-in *Number* prototype. Comprises all + Scheme numbers. + + Output: + + returns an object with the following + properties, each a constructor of zero arguments having no side + effects. + + Complex - complex number type + Inherits from *SchemeNumberType*. + + Real - real number type + Inherits from *Complex*. + + InexactReal - inexact real number type + Inherits from *Real*. + + ExactReal - exact real number type + Inherits from *Real*. + + ExactRational - exact rational number type + Inherits from *ExactReal*. + + ExactInteger - exact integer type + Inherits from *ExactRational*. + + See Also: + + Method: toString() + Converts this Scheme number to a string as if by *this.toString(10)*. + + Specified by: + + Method: toString(radix) + Converts this Scheme number to a string. + + The *toString* method converts inexact numbers as in JavaScript + and exact numbers as if by string"](z, radix)>. + + Method: toFixed(fractionDigits) + Returns this Scheme number as a string with *fractionDigits* + digits after the decimal point. + + Examples: + + > SchemeNumber("#e1.2").toFixed(2) // "1.20" + > SchemeNumber("2/3").toFixed(20) // "0.66666666666666666667" + + Compare the native version: + + > (2/3).toFixed(20) // "0.66666666666666662966" + + Specified by: + + Method: toLocaleString() + Converts this Scheme number to a string as if by *this.toString()*. + + Specified by: + + Method: toExponential(fractionDigits) + Converts this Scheme number to scientific "e" notation with + *fractionDigits* digits after the decimal point. + + Examples: + + > SchemeNumber("1/11").toExponential(3) // "9.091e-2" + > SchemeNumber("1/2").toExponential(2) // "5.00e-1" + + Specified by: + + Method: toPrecision(precision) + Converts this Scheme number to decimal (possibly "e" notation) + with *precision* significant digits. + + Examples: + + > SchemeNumber("12300").toPrecision(2) // "1.2e+4" + > SchemeNumber("12300").toPrecision(4) // "1.230e+4" + > SchemeNumber("12300").toPrecision(5) // "12300" + > SchemeNumber("12300").toPrecision(6) // "12300.0" + + Specified by: + + Method: valueOf() + Converts this Scheme number to a native number with possible loss + of precision. + + ECMAScript does not natively support imaginary numbers, so + non-reals typically produce *NaN*. + + Specified by: + */ +function defineAbstractTypes(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var api = g.Object.create(null); + var SchemeNumberType = plugins.get("SchemeNumberType"); + + function Complex(){} Complex.prototype = new SchemeNumberType(); + function Real(){} Real.prototype = new Complex(); + function InexactReal(){} InexactReal.prototype = new Real(); + function ExactReal(){} ExactReal.prototype = new Real(); + function ExactRational(){} ExactRational.prototype = new ExactReal(); + function ExactInteger(){} ExactInteger.prototype = new ExactRational(); + + api.Complex = Complex; + api.Real = Real; + api.InexactReal = InexactReal; + api.ExactReal = ExactReal; + api.ExactRational = ExactRational; + api.ExactInteger = ExactInteger; + return api; +} + +/* + Function: installAbstractTypes(plugins) + Defines dispatcher classes for the results of + . + + *plugins* shall be a with the following + contents. + + Dispatch - a object. + calls the *Dispatch* object's *defClass* + function to register the new types. The class names used in + *Dispatch* are the same as those used in *plugins*, e.g., + "Complex", except that *SchemeNumberType* is registered as simply + "SchemeNumber". +*/ +function installAbstractTypes(plugins) { + "use strict"; + var disp = plugins.get("Dispatch"); + + function def(name) { + disp.defClass(name, { ctor: plugins.get(name) }); + } + def("Complex"); + def("Real"); + def("InexactReal"); + def("ExactReal"); + def("ExactRational"); + def("ExactInteger"); +} + +function installStubFunctions(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var Function_apply = uncurry(g.Function.prototype.apply); + var Array_concat = uncurry(g.Array.prototype.concat); + + var SchemeNumberType = plugins.get("SchemeNumberType"); + var Complex = plugins.get("Complex"); + var Real = plugins.get("Real"); + var InexactReal = plugins.get("InexactReal"); + var ExactReal = plugins.get("ExactReal"); + var ExactRational = plugins.get("ExactRational"); + var ExactInteger = plugins.get("ExactInteger"); + + function def(name, types) { + var func = plugins.get(name); + if (!func) { + console.log(name, "not found"); + return; + } + Function_apply(func.def, func, types /*Array_concat(types, g.undefined)*/); + } + + // These are the functions that number implementations must implement. + // Example: + // var disp = SchemeNumber.plugins.get("Dispatch"); + // disp.defClass("MyComplex", {ctor: MyComplexConstructor, + // base: Complex}); + // var add = SchemeNumber.plugins.get("add"); + // add.def("MyComplex", Complex, add_MyComplex_to_AnyComplex); + // add.def(Complex, "MyComplex", add_AnyComplex_to_MyComplex); + + def("numberToString", [SchemeNumberType]); + def("isExact", [SchemeNumberType]); + def("isInexact", [SchemeNumberType]); + + def("isComplex", [SchemeNumberType]); + def("isReal", [SchemeNumberType]); + def("isRational", [SchemeNumberType]); + def("isInteger", [SchemeNumberType]); + def("isZero", [SchemeNumberType]); + + def("toExact", [SchemeNumberType]); + def("toInexact", [SchemeNumberType]); + def("negate", [SchemeNumberType]); + def("reciprocal", [SchemeNumberType]); + + def("eq", [SchemeNumberType, SchemeNumberType]); + def("ne", [SchemeNumberType, SchemeNumberType]); + + def("add", [SchemeNumberType, SchemeNumberType]); + def("subtract", [SchemeNumberType, SchemeNumberType]); + def("multiply", [SchemeNumberType, SchemeNumberType]); + def("divide", [SchemeNumberType, SchemeNumberType]); + + def("square", [SchemeNumberType]); + + def("realPart", [Complex]); + def("imagPart", [Complex]); + def("magnitude", [Complex]); + def("angle", [Complex]); + def("conjugate", [Complex]); + + def("expt", [SchemeNumberType, ExactInteger]); + def("expt", [Complex, Complex]); + + def("exp", [Complex]); + def("sqrt", [Complex]); + + def("log", [Complex]); + def("asin", [Complex]); + def("acos", [Complex]); + def("atan", [Complex]); + + def("sin", [Complex]); + def("cos", [Complex]); + def("tan", [Complex]); + + def("SN_isFinite", [Real]); + def("SN_isInfinite", [Real]); + def("SN_isNaN", [Real]); + + def("isUnit", [Real]); + def("abs", [Real]); + def("isPositive", [Real]); + def("isNegative", [Real]); + def("sign", [Real]); + def("floor", [Real]); + def("ceiling", [Real]); + def("truncate", [Real]); + def("round", [Real]); + + def("compare", [Real, Real]); + def("gt", [Real, Real]); + def("lt", [Real, Real]); + def("ge", [Real, Real]); + def("le", [Real, Real]); + def("divAndMod", [Real, Real]); + def("div", [Real, Real]); + def("mod", [Real, Real]); + def("atan2", [Real, Real]); + + def("numerator", [ExactRational]); + def("denominator", [ExactRational]); + def("numeratorAndDenominator", [ExactRational]); + + def("isEven", [ExactInteger]); + def("isOdd", [ExactInteger]); + def("exactIntegerSqrt", [ExactInteger]); + def("exp10", [ExactInteger]); + def("gcdNonnegative", [ExactInteger, ExactInteger]); + def("divideReduced", [ExactInteger, ExactInteger]); + + def("bitwiseNot", [ExactInteger]); + def("bitwiseAnd", [ExactInteger, ExactInteger]); + def("bitwiseIor", [ExactInteger, ExactInteger]); + def("bitwiseXor", [ExactInteger, ExactInteger]); + def("bitCount", [ExactInteger]); + def("bitLength", [ExactInteger]); + def("firstBitSet", [ExactInteger]); + def("isBitSet", [ExactInteger]); + def("copyBit", [ExactInteger]); + def("bitField", [ExactInteger]); + def("copyBitField", [ExactInteger, ExactInteger]); + def("bitShift", [ExactInteger]); + def("rotateBitField", [ExactInteger]); + def("reverseBitField", [ExactInteger]); +} + + +/* + Function: implementPluginLibrary(plugins) + Creates some plugins of use to number implementations. + + Input: + + *plugins* shall be a containing the items listed + below, in addition to the output of and + . All may be added after the call to + but before any use of its results. When + changes to plugins produce changes in non-function results (such + as *ZERO* and *ONE*), the library broadcasts the changes via the + event. + + SchemeNumber - function(any) + The object as returned by + . + + nativeToExactInteger - function(integer) + *integer* is a native ECMAScript number of integer value. + returns an exact Scheme number whose value + equals *integer*. + + nativeToInexact - function(number) + *number* is a native ECMAScript number, possibly infinite or + *NaN*. returns an inexact Scheme number + approximating its argument. + + parseExactInteger - function(sign, string, radix) + *sign* is the native number 1 or -1. *radix* is the native number + 2, 8, 10, or 16. must be a function returning + a Scheme number equal to *sign* times the result of parsing + *string* as a positive, unprefixed, exact integer in the given + radix. + + parseInexact - function(sign, string) + *sign* is the native number 1 or -1. must be a + function returning a Scheme number equal to *sign* times the + result of parsing *string* as a positive, unprefixed, decimal, + inexact, real number. + + exactRectangular - function(x, y) + *x* and *y* are exact reals, *y* non-zero. + returns an exact complex equal to *x* + (i * *y*). + + inexactRectangular - function(x, y) + *x* and *y* are inexact reals. returns an + inexact complex equal to *x* + (i * *y*). + + exactPolar - function(r, theta) + *r* and *theta* are exact reals. returns an exact + complex equal to *r* * exp(i * *theta*). + + inexactPolar - function(r, theta) + *r* and *theta* are inexact reals. returns an + inexact complex equal to *r* * exp(i * *theta*). + + Output: + + returns an object with the following + properties. + + ZERO - the exact integer *0*. + + ONE - the exact integer *1*. + + TWO - the exact integer *2*. + + MINUS_ONE - the exact integer *-1*. + + INEXACT_ZERO - the inexact integer *0.0*. + + INEXACT_ONE - the inexact integer *1.0*. + + PI - the inexact real number pi. + + INFINITY - the inexact real number *+inf.0*. + + MINUS_INFINITY - the inexact real number *-inf.0*. + + NAN - the inexact real number *+nan.0*. + + I - the exact complex unit *i*. + + MINUS_I - the exact complex unit *-i*. + + raise - function(conditionType, message, irritant...) + This *raise* simply calls the user-overridable + but enforces the contract not to return. + + defaultRaise - function(conditionType, message, irritant...) + Throws an Error describing the arguments. + + raiseDivisionByExactZero - function() + Raises an exception as specified by Scheme to report division by + exact zero. + + isNumber - function(x) + Returns true if *x* is a Scheme number. + + assertReal - function(x) + Returns *x* if *x* is a real Scheme number, otherwise raises an + exception as specified by Scheme for invalid argument type. + + toReal - function(x) + Converts *x* to a Scheme number and behaves as if by returning + *assertReal(x)*. + + assertInteger - function(x) + Returns *x* if *x* is a Scheme integer, otherwise raises an + exception as specified by Scheme for invalid argument type. + + toInteger - function(x) + Converts *x* to a Scheme number and behaves as if by returning + *assertInteger(x)*. + + assertExact - function(x) + Returns *x* if *x* is an exact Scheme number, otherwise raises an + exception as specified by Scheme for invalid argument type. + + Complex_expt - function(power) + Returns the value specified for (passing *this* + and *power*) for the case where *z1* is zero or the result is + permitted to be inexact The result may be non-real, even if both + arguments are real and *this* is positive. + + Complex_expt_fn - function(z1, z2) + Behaves as if by returning *Complex_expt.call(z1, z2)*. + + Complex_asin - function(z) + Returns the value specified for for complex *z*. The + result may be non-real due to inexactness, even if the argument is + real and in the range -1 to 1. + + Complex_asin_fn - function(z1, z2) + Behaves as if by returning *Complex_asin(z1, z2)*. + + Complex_acos - function(z) + Returns the value specified for for complex *z*. The + result may be non-real due to inexactness, even if the argument is + real and in the range -1 to 1. + + Complex_acos_fn - function(z1, z2) + Behaves as if by returning *Complex_acos.call(z1, z2)*. + + Complex_atan - function(z) + Returns the value specified for for complex *z*. The + result may be non-real due to inexactness, even if the argument is + real. + + Complex_atan_fn - function(z1, z2) + Behaves as if by returning *Complex_atan.call(z1, z2)*. + + Complex_log - function(z) + Returns the value specified for for complex *z*. The + result may be non-real due to inexactness, even if the argument is + real and positive. + + nativeDenominator - function(x) + *x* is a native number. Returns the denominator of *x* regarded + as a binary fraction. + + nativeDenominatorLog2 - function(x) + *x* is a native number. Returns the floor of the base-2 + log of *nativeDenominator(x)*; i.e., the denominator's floating + point exponent. + + numberToBinary - function(x) + Returns a string of "0" and "1" characters, possibly including a + "." and possibly a leading "-", that in base 2 equals x. + + This works by calling *Number.prototype.toString* with a radix of + 2. Specification ECMA-262 Edition 5 (December 2009) does not + strongly assert that this works. As an alternative, should this + prove non-portable, *nativeDenominator* could instead do this for + finite *x*: + + > for (var d = 1; x !== Math.floor(x); d *= 2) { + > x *= 2; + > } + > return d; + + zeroes - function(count) + Returns a string of *count* zeroes, e.g. "0000". + + XXX documentation incomplete. + + truncateToPrecision + + stringToNumber - function(string, radix, exact) + returns the Scheme number whose external + representation is *string* with added prefixes corresponding to + either or both of *radix* and *exact*, if defined. + + *s* should be the external representation of a Scheme number, such + as "2/3" or "#e1.1@-2d19". If *s* does not represent a Scheme + number, returns *false*. + + If *radix* is given, it must be either 2, 8, 10, or 16, and *s* + must not contain a radix prefix. The function behaves as if *s* + did contain the prefix corresponding to *radix*. + + If *exact* is given, it must have type "boolean", and *s* must not + contain an exactness prefix. The function behaves as if *s* + contained the corresponding prefix ("#e" if *exact* is true, "#i" + if false). +*/ +function implementPluginLibrary(plugins) { + "use strict"; + + // Abstract types, generic functions, and the SchemeNumber object. + // XXX Could remove unused items. + var SchemeNumber, toSchemeNumber, SchemeNumberType, Complex, Real, + InexactReal, ExactReal, ExactRational, ExactInteger, + numberToString, isExact, isInexact, isComplex, isReal, + isRational, isInteger, isZero, toExact, toInexact, negate, + reciprocal, eq, ne, add, subtract, multiply, divide, square, + realPart, imagPart, expt, expt, exp, magnitude, angle, sqrt, + log, asin, acos, atan, sin, cos, tan, SN_isFinite, + SN_isInfinite, SN_isNaN, isUnit, abs, isPositive, isNegative, + sign, floor, ceiling, truncate, round, compare, gt, lt, ge, + le, divAndMod, div, mod, atan2, numerator, denominator, + numeratorAndDenominator, + isEven, isOdd, exp10, gcdNonnegative, divideReduced; + + SchemeNumber = plugins.get("SchemeNumber"); + + SchemeNumberType = plugins.get("SchemeNumberType"); + Complex = plugins.get("Complex"); + Real = plugins.get("Real"); + InexactReal = plugins.get("InexactReal"); + ExactReal = plugins.get("ExactReal"); + ExactRational = plugins.get("ExactRational"); + ExactInteger = plugins.get("ExactInteger"); + + toSchemeNumber = plugins.get("toSchemeNumber"); + numberToString = plugins.get("numberToString"); + isExact = plugins.get("isExact"); + isInexact = plugins.get("isInexact"); + isComplex = plugins.get("isComplex"); + isReal = plugins.get("isReal"); + isRational = plugins.get("isRational"); + isInteger = plugins.get("isInteger"); + isZero = plugins.get("isZero"); + toExact = plugins.get("toExact"); + toInexact = plugins.get("toInexact"); + negate = plugins.get("negate"); + reciprocal = plugins.get("reciprocal"); + eq = plugins.get("eq"); + ne = plugins.get("ne"); + add = plugins.get("add"); + subtract = plugins.get("subtract"); + multiply = plugins.get("multiply"); + divide = plugins.get("divide"); + square = plugins.get("square"); + realPart = plugins.get("realPart"); + imagPart = plugins.get("imagPart"); + expt = plugins.get("expt"); + expt = plugins.get("expt"); + exp = plugins.get("exp"); + magnitude = plugins.get("magnitude"); + angle = plugins.get("angle"); + sqrt = plugins.get("sqrt"); + log = plugins.get("log"); + asin = plugins.get("asin"); + acos = plugins.get("acos"); + atan = plugins.get("atan"); + sin = plugins.get("sin"); + cos = plugins.get("cos"); + tan = plugins.get("tan"); + SN_isFinite = plugins.get("SN_isFinite"); + SN_isInfinite = plugins.get("SN_isInfinite"); + SN_isNaN = plugins.get("SN_isNaN"); + isUnit = plugins.get("isUnit"); + abs = plugins.get("abs"); + isPositive = plugins.get("isPositive"); + isNegative = plugins.get("isNegative"); + sign = plugins.get("sign"); + floor = plugins.get("floor"); + ceiling = plugins.get("ceiling"); + truncate = plugins.get("truncate"); + round = plugins.get("round"); + compare = plugins.get("compare"); + gt = plugins.get("gt"); + lt = plugins.get("lt"); + ge = plugins.get("ge"); + le = plugins.get("le"); + divAndMod = plugins.get("divAndMod"); + div = plugins.get("div"); + mod = plugins.get("mod"); + atan2 = plugins.get("atan2"); + numerator = plugins.get("numerator"); + denominator = plugins.get("denominator"); + numeratorAndDenominator = plugins.get("numeratorAndDenominator"); + isEven = plugins.get("isEven"); + isOdd = plugins.get("isOdd"); + exp10 = plugins.get("exp10"); + gcdNonnegative = plugins.get("gcdNonnegative"); + divideReduced = plugins.get("divideReduced"); + + // Functions to be provided by number implementations. + var nativeToExactInteger, divideReducedNotByOne; + var exactRectangular, inexactRectangular; + + // Imports from ECMAScript. + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var Array_join = uncurry(g.Array.prototype.join); + var Number_toString = uncurry(g.Number.prototype.toString); + var String_indexOf = uncurry(g.String.prototype.indexOf); + var String_substring = uncurry(g.String.prototype.substring); + var String_replace = uncurry(g.String.prototype.replace); + + var Math_LN10 = g.Math.LN10; + var Math_LN2 = g.Math.LN2; + var Math_abs = g.Math.abs; + var Math_floor = g.Math.floor; + var Math_pow = g.Math.pow; + var _undefined = g.undefined; + var _NaN = g.NaN; + var _parseInt = g.parseInt; + var _isFinite = g.isFinite; + + // Imports from implementations via core library. + var ZERO, ONE, TWO, MINUS_ONE, I, MINUS_I, INEXACT_ZERO, INEXACT_ONE, PI; + + // Imports from core library. + var makePolar = plugins.get("makePolar"); + var makeRectangular = plugins.get("makeRectangular"); + var raise = plugins.get("raise"); + var raiseDivisionByExactZero = plugins.get("raiseDivisionByExactZero"); + + var api = g.Object.create(null); + + function onPluginsChanged(plugins, changed) { + nativeToExactInteger = plugins.get("nativeToExactInteger"); + divideReducedNotByOne = plugins.get("divideReducedNotByOne"); + exactRectangular = plugins.get("exactRectangular"); + inexactRectangular = plugins.get("inexactRectangular"); + + ZERO = plugins.get("ZERO"); + ONE = plugins.get("ONE"); + TWO = plugins.get("TWO"); + MINUS_ONE = plugins.get("MINUS_ONE"); + INEXACT_ZERO = plugins.get("INEXACT_ZERO"); + INEXACT_ONE = plugins.get("INEXACT_ONE"); + PI = plugins.get("PI"); + I = plugins.get("I"); + MINUS_I = plugins.get("MINUS_I"); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins, {}); + + // + // For lazy implementors. Used in Complex and elsewhere. These + // belong in a separate library. Could support replacement with + // dummy versions that return NaN. + // + + function Complex_sqrt() { + return makePolar(sqrt(magnitude(this)), divide(angle(this), TWO)); + } + function Complex_exp() { + return makePolar(exp(realPart(this)), imagPart(this)); + } + function Complex_sin() { + var iz = multiply(I, this); + return multiply(divide(subtract(exp(iz), exp(negate(iz))), TWO), + MINUS_I); + } + function Complex_cos() { + var iz = multiply(I, this); + return divide(add(exp(iz), exp(negate(iz))), TWO); + } + + function Complex_expt_fn(b, p) { + if (isZero(b)) { + if (isZero(p)) + return isExact(b) && isExact(p) ? ONE : INEXACT_ONE; + if (isPositive(realPart(p))) + return isExact(p) ? b : INEXACT_ZERO; + raise("&implementation-restriction", + "invalid power for zero expt", p); + } + return exp(multiply(log(b), p)); + } + function Complex_asin_fn(z) { + return multiply(MINUS_I, + log(add(multiply(I, z), + sqrt(subtract(ONE, square(z)))))); + } + + function Complex_acos_fn(z) { + return subtract(divide(PI, TWO), Complex_asin_fn(z)); + } + + function Complex_atan_fn(z) { + var iz = multiply(I, z); + return multiply(divide(subtract(log(add(ONE, iz)), + log(subtract(ONE, iz))), TWO), + MINUS_I); + } + + function Complex_log_fn(z) { + return makeRectangular(log(magnitude(z)), angle(z)); + } + + function Complex_expt(p) { return Complex_expt_fn(this, p); } + function Complex_asin() { return Complex_asin_fn(this); } + function Complex_acos() { return Complex_acos_fn(this); } + function Complex_atan() { return Complex_atan_fn(this); } + function Complex_log() { return Complex_log_fn( this); } + + function Complex_valueOf() { + if (isZero(imagPart(this))) + return realPart(this).valueOf(); + return _NaN; + } + + // + // For Rectangular. + // + + function xyToString(xString, yString) { + if (yString[0] === '-' || yString[0] === '+') + return xString + yString + "i"; + return xString + "+" + yString + "i"; + } + + function Complex_numberToString(radix, precision) { + return xyToString(numberToString(realPart(this), radix, precision), + numberToString(imagPart(this), radix, precision)); + } + + function Complex_toString(radix) { + radix = radix || 10; + return xyToString(realPart(this).toString(radix), + imagPart(this).toString(radix)); + } + + function Complex_toFixed(dig) { + return xyToString(realPart(this).toFixed(dig), + imagPart(this).toFixed(dig)); + } + function Complex_toExponential(dig) { + return xyToString(realPart(this).toExponential(dig), + imagPart(this).toExponential(dig)); + } + function Complex_toPrecision(prec) { + return xyToString(realPart(this).toPrecision(prec), + imagPart(this).toPrecision(prec)); + } + + function Complex_toInexact() { + if (isInexact(this)) + return this; + return inexactRectangular(toInexact(realPart(this)), + toInexact(imagPart(this))); + } + + function Complex_toExact() { + if (isExact(this)) + return this; + return exactRectangular(toExact(realPart(this)), + toExact(imagPart(this))); + } + + function Complex_isZero() { + return isZero(realPart(this)) && isZero(imagPart(this)); + } + + function Complex_magnitude() { + var x = realPart(this), y = imagPart(this); + if (isZero(x)) + return abs(y); + if (isZero(y)) + return abs(x); + return sqrt(add(square(x), square(y))); + } + + function Complex_angle() { + return atan2(imagPart(this), realPart(this)); + } + + function Complex_eq(z) { + return (eq(realPart(this), realPart(z)) && + eq(imagPart(this), imagPart(z))); + } + function Complex_eq_Real(x) { + return isZero(imagPart(this)) && eq(x, realPart(this)); + } + function Real_eq_Complex(z) { + return isZero(imagPart(z)) && eq(realPart(z), this); + } + + function Complex_ne(z) { + return (ne(realPart(this), realPart(z)) || + ne(imagPart(this), imagPart(z))); + } + function Complex_ne_Real(x) { + return !isZero(imagPart(this)) || ne(x, realPart(this)); + } + function Real_ne_Complex(z) { + return !isZero(imagPart(z)) || ne(realPart(z), this); + } + + function Real_add_Complex(z) { + return makeRectangular(add(this, realPart(z)), imagPart(z)); + } + function Complex_add_Real(x) { + return makeRectangular(add(realPart(this), x), imagPart(this)); + } + function Complex_add(z) { + return makeRectangular(add(realPart(this), realPart(z)), + add(imagPart(this), imagPart(z))); + } + + function Real_subtract_Complex(z) { + return makeRectangular(subtract(this, realPart(z)), + negate(imagPart(z))); + } + function Complex_subtract_Real(x) { + return makeRectangular(subtract(realPart(this), x), imagPart(this)); + } + function Complex_subtract(z) { + return makeRectangular(subtract(realPart(this), realPart(z)), + subtract(imagPart(this), imagPart(z))); + } + + function Complex_negate() { + return makeRectangular(negate(realPart(this)), negate(imagPart(this))); + } + + function complexMultiply(ax, ay, bx, by) { + return makeRectangular(subtract(multiply(ax, bx), multiply(ay, by)), + add( multiply(ax, by), multiply(ay, bx))); + } + + function Real_multiply_Complex(z) { + return makeRectangular(multiply(realPart(z), this), + multiply(imagPart(z), this)); + } + function Complex_multiply_Real(x) { + return makeRectangular(multiply(realPart(this), x), + multiply(imagPart(this), x)); + } + function Complex_multiply(z) { + return complexMultiply(realPart(this), imagPart(this), realPart(z), + imagPart(z)); + } + + function Complex_divide_Real(x) { + return makeRectangular(divide(realPart(this), x), + divide(imagPart(this), x)); + } + + function Complex_square() { + var x = realPart(this), y = imagPart(this); + var xy = multiply(x, y); + return makeRectangular(subtract(square(x), square(y)), add(xy, xy)); + } + + function Complex_reciprocal() { + var x = realPart(this), y = imagPart(this); + var m2 = add(square(x), square(y)); + return makeRectangular(divide(x, m2), negate(divide(y, m2))); + } + + function complexDivide(x, y, z) { // returns (x + iy) / z + var zx = realPart(z), zy = imagPart(z); + var m2 = add(square(zx), square(zy)); + return complexMultiply(x, y, divide(zx, m2), negate(divide(zy, m2))); + } + + function Real_divide_Complex(z) { + return complexDivide(this, isExact(this) ? ZERO : INEXACT_ZERO, z); + } + function Complex_divide(z) { + return complexDivide(realPart(this), imagPart(this), z); + } + + // + // For flonums. Could be used by an exact binary rational type. + // Useful for anyone who needs to inspect native nums, like + // frexp() in C. Keep in core for now. + // + + function numberToBinary(x) { + return Number_toString(x, 2); + } + + function nativeDenominatorLog2(x) { + //assert(typeof x === "number"); + //assert(SN_isFinite(x)); + var s = numberToBinary(Math_abs(x)); + var i = String_indexOf(s, "."); + if (i === -1) + return 0; + return s.length - i - 1; + } + + function nativeDenominator(x) { + // Get the "denominator" of a floating point value. + // The result will be a power of 2. + //assert(SN_isFinite(x)); + return Math_pow(2, nativeDenominatorLog2(x)); + } + + // + // For lazy implementors. Put in separate library. + // + + function square_via_multiply() { + return multiply(this, this); + } + function isInexact_via_isExact() { + return !isExact(this); + } + function ne_via_eq(n) { + return !eq(this, n); + } + function subtract_via_negate_add(n) { + return add(this, negate(n)); + } + function divide_via_reciprocal_multiply(n) { + return multiply(this, reciprocal(n)); + } + + function complex_or_exact_expt(n) { + if (isExact(this)) + return expt_N_EI_fn(this, n); + return Complex_expt_fn(this, n); + } + function tan_via_divide_sin_cos() { + return divide(sin(this), cos(this)); + } + + function isUnit_via_eq() { + return eq(ONE, this) || eq(MINUS_ONE, this); + } + function Real_magnitude_via_abs() { + return abs(this); + } + function InexactReal_angle_via_isNegative() { + return isNegative(this) ? PI : INEXACT_ZERO; + } + function ExactReal_angle_via_isNegative() { + return isNegative(this) ? PI : ZERO; + } + + function isPositive_via_sign() { return sign(this) > 0; } + function isNegative_via_sign() { return sign(this) < 0; } + function isZero_via_sign() { return sign(this) === 0; } + function sign_via_compare() { return compare(this, ZERO); } + + function eq_via_compare(x) { return compare(this, x) === 0; }; + function ne_via_compare(x) { return compare(this, x) !== 0; }; + function gt_via_compare(x) { return compare(this, x) > 0; }; + function lt_via_compare(x) { return compare(this, x) < 0; }; + function ge_via_compare(x) { return compare(this, x) >= 0; }; + function le_via_compare(x) { return compare(this, x) <= 0; }; + + function div_R_R(x, y) { + return (isNegative(y) ? ceiling(divide(x, y)) : floor(divide(x, y))); + } + function divAndMod_via_divide_floor(y) { + var div = div_R_R(this, y); + return [div, subtract(this, multiply(div, y))]; + } + function div_via_divide_floor(y) { + return div_R_R(this, y); + } + function mod_via_divide_floor(y) { + return subtract(this, multiply(div_R_R(this, y), y)); + } + + function abs_via_isNegative_negate() { + return isNegative(this) ? negate(this) : this; + } + + function ceiling_via_floor() { + return isInteger(this) ? this : add(ONE, floor(this)); + } + function truncate_via_ceiling_floor() { + return isNegative(this) ? ceiling(this) : floor(this); + } + function round_via_floor_compare_isEven() { + var ret = floor(this); + var diff = subtract(this, ret); + var twice = add(diff, diff); + switch (compare(twice, ONE)) { + case -1: return ret; + case 1: return add(ONE, ret); + case 0: default: return (isEven(ret) ? ret : add(ONE, ret)); + } + } + + function divideReduced_via_isUnit(d) { + //assert(isPositive(this)); + if (isUnit(d)) + return this; + return divideReducedNotByOne(this, d); + } + + function Integer_divide_via_gcd_div(d) { + //assert(!isZero(d)) + //require('repl').start(); + var n = this; + var g = gcdNonnegative(abs(d), abs(n)); + n = div(n, g); + d = div(d, g); + if (isNegative(d)) { + n = negate(n); + d = negate(d); + } + return (isUnit(d) ? n : divideReducedNotByOne(n, d)); + } + + function Integer_reciprocal_via_divideReduced() { + switch (sign(this)) { + case -1: return divideReduced(MINUS_ONE, negate(this)); + case 1: return divideReduced(ONE, this); + case 0: default: return raiseDivisionByExactZero(); + } + } + + // + // Pretty generic exact rational output impl. + // + // Assumes numerator(this) !== this. + function ExactRational_numberToString(radix) { + var nd = numeratorAndDenominator(this); + var n = nd[0], d = nd[1]; + if (isUnit(d)) + return numberToString(n, radix); + return (numberToString(n, radix) + + "/" + numberToString(d, radix)); + } + + function Integer_numeratorAndDenominator() { + return [this, ONE]; + } + + // + // For lazy implementors. + // + + function genericExp10(p) { + return multiply(this, expt_N_EI_fn(nativeToExactInteger(10), p)); + } + + function expt_N_EI_fn(z, p) { + // Return z raised to the power of integer p. + var bits = abs(p); + var squarer = z; + var ret = ONE; + var dm; + while (isPositive(bits)) { + dm = divAndMod(bits, TWO); + bits = dm[0]; + if (!isZero(dm[1])) + ret = multiply(ret, squarer); + squarer = square(squarer); + } + return (isNegative(p) ? reciprocal(ret) : ret); + } + function expt_N_EI(p) { + return expt_N_EI_fn(this, p); + } + + function gcdNonnegative_via_isZero_mod(b) { + var a = this; + //assert(!isNegative(a)); + //assert(!isNegative(b)); + var c; + while (!isZero(a)) { + c = a; + a = mod(b, a); + b = c; + } + return b; + } + + function bitwiseNot_via_subtract() { + return subtract(MINUS_ONE, this); + } + + // + // For ECMAScript Number formatting methods. + // + + function zeroes(count) { + var ret = String_substring("000000000000000", 0, count & 15); + if (count > 15) { + ret += Array_join(new g.Array((count >> 4) + 1), + "0000000000000000"); + } + return ret; + } + + // Specified by ECMA-262, 5th edition, 15.7.4.5. + function Real_toFixed(fractionDigits) { + var f = (fractionDigits === _undefined ? 0 : + _parseInt(fractionDigits, 10)); + if (f > SchemeNumber.maxIntegerDigits) + throw new RangeError("fractionDigits exceeds " + + "SchemeNumber.maxIntegerDigits: " + + fractionDigits); + + var x = this; + var s = ""; + if (isNegative(x)) { + x = negate(x); + s = "-"; + } + + var p = exp10(ONE, nativeToExactInteger(-f)); + var dm = divAndMod(x, p); + var n = dm[0]; + if (ge(add(dm[1], dm[1]), p)) + n = add(ONE, n); + if (isZero(n)) + return s + "0" + + (fractionDigits > 0 ? "." + zeroes(fractionDigits) : ""); + n = numberToString(n); + if (f === 0) + return s + n; + + var z = f - n.length; + if (f > 0) { + if (z >= 0) + n = zeroes(z + 1) + n; + var point = n.length - f; + return s + String_substring(n, 0, point) + "." + + String_substring(n, point); + } + return s + n + zeroes(-f); + } + + function Real_toExponential(fractionDigits) { + var f = (fractionDigits === _undefined ? 20 : + _parseInt(fractionDigits, 10)); + if (f < 0) + throw new RangeError("SchemeNumber toExponential: negative " + + "argument: " + f); + if (f > SchemeNumber.maxIntegerDigits) + throw new RangeError("fractionDigits exceeds " + + "SchemeNumber.maxIntegerDigits: " + + fractionDigits); + + var x = this; + var s = ""; + if (isNegative(x)) { + x = negate(x); + s = "-"; + } + else if (isZero(x)) + return "0" + (fractionDigits > 0 ? "." + zeroes(f) : "") + "e+0"; + + var e = Math_floor(log(x) / Math_LN10); + var p = exp10(ONE, nativeToExactInteger(e - f)); + var dm = divAndMod(x, p); + var n = dm[0]; + if (ge(add(dm[1], dm[1]), p)) + n = add(ONE, n); + n = numberToString(n); + + // Adjust for inaccuracy in log(). + if (n.length != f + 1) { + //console.log("Guessed wrong length: " + n.length + " != " + (f + 1)); + e += n.length - (f + 1); + p = exp10(ONE, nativeToExactInteger(e - f)); + dm = divAndMod(x, p); + n = dm[0]; + if (ge(add(dm[1], dm[1]), p)) + n = add(ONE, n); + n = numberToString(n); + if (n.length != f + 1) + // Can not format as exponential. + return numberToString(this); + } + + if (fractionDigits === _undefined) + n = String_replace(n, /(\d)0+$/, "$1"); + if (n.length > 1) + n = n[0] + "." + String_substring(n, 1); + return s + n + "e" + (e < 0 ? "" : "+") + e; + } + + function Real_toPrecision(precision) { + var p, x; + if (precision === _undefined) { + x = toInexact(this); + if (SN_isFinite(x)) + return Number_toString(+x); + p = 21; + } + else { + p = _parseInt(precision, 10); + if (p < 1) + throw new RangeError("SchemeNumber toPrecision: expected a " + + "positive precision, got: " + precision); + if (p > SchemeNumber.maxIntegerDigits) + throw new RangeError("precision exceeds " + + "SchemeNumber.maxIntegerDigits: " + + precision); + } + + x = this; + var s = ""; + if (isNegative(x)) { + x = negate(x); + s = "-"; + } + else if (isZero(x)) + return "0" + (p > 1 ? "." + zeroes(p - 1) : ""); + + var ret = x.toExponential(p - 1); + var eIndex = String_indexOf(ret, 'e'); + var exponent = _parseInt(String_substring(ret, eIndex + 1), 10); + if (exponent >= -6 && exponent < p) { + if (exponent === 0) + ret = String_substring(ret, 0, eIndex); + else { + ret = String_substring(ret, 0, 1) + + (String_indexOf(ret, '.') === -1 ? "" : + String_substring(ret, 2, eIndex)); + if (exponent < 0) + ret = "0." + zeroes(-1 - exponent) + ret; + else if (exponent < p - 1) + ret = (String_substring(ret, 0, exponent + 1) + "." + + String_substring(ret, exponent + 1)); + } + } + else if (precision === _undefined) { + ret = String_replace(String_substring(ret, 0, eIndex), /\.?0+/, "") + + String_substring(ret, eIndex); + } + + return s + ret; + } + + // + // End library function definitions. + // + + api.Complex_sqrt = Complex_sqrt; + api.Complex_exp = Complex_exp; + api.Complex_sin = Complex_sin; + api.Complex_cos = Complex_cos; + api.Complex_expt_fn = Complex_expt_fn; + api.Complex_expt = Complex_expt; + api.Complex_asin_fn = Complex_asin_fn; + api.Complex_asin = Complex_asin; + api.Complex_acos_fn = Complex_acos_fn; + api.Complex_acos = Complex_acos; + api.Complex_atan_fn = Complex_atan_fn; + api.Complex_atan = Complex_atan; + api.Complex_log_fn = Complex_log_fn; + api.Complex_log = Complex_log; + + api.Complex_numberToString = Complex_numberToString; + api.Complex_toString = Complex_toString; + api.Complex_toFixed = Complex_toFixed; + api.Complex_toExponential = Complex_toExponential; + api.Complex_toPrecision = Complex_toPrecision; + api.Complex_toInexact = Complex_toInexact; + api.Complex_toExact = Complex_toExact; + api.Complex_isZero = Complex_isZero; + api.Complex_magnitude = Complex_magnitude; + api.Complex_angle = Complex_angle; + api.Complex_eq = Complex_eq; + api.Complex_eq_Real = Complex_eq_Real; + api.Real_eq_Complex = Real_eq_Complex; + api.Complex_ne = Complex_ne; + api.Complex_ne_Real = Complex_ne_Real; + api.Real_ne_Complex = Real_ne_Complex; + api.Real_add_Complex = Real_add_Complex; + api.Complex_add_Real = Complex_add_Real; + api.Complex_add = Complex_add; + api.Real_subtract_Complex = Real_subtract_Complex; + api.Complex_subtract_Real = Complex_subtract_Real; + api.Complex_subtract = Complex_subtract; + api.Complex_negate = Complex_negate; + api.Real_multiply_Complex = Real_multiply_Complex; + api.Complex_multiply_Real = Complex_multiply_Real; + api.Complex_multiply = Complex_multiply; + api.Complex_divide_Real = Complex_divide_Real; + api.Complex_square = Complex_square; + api.Complex_reciprocal = Complex_reciprocal; + api.Real_divide_Complex = Real_divide_Complex; + api.Complex_divide = Complex_divide; + + api.numberToBinary = numberToBinary; + api.nativeDenominatorLog2 = nativeDenominatorLog2; + api.nativeDenominator = nativeDenominator; + + api.square_via_multiply = square_via_multiply; + api.isInexact_via_isExact = isInexact_via_isExact; + api.ne_via_eq = ne_via_eq; + api.subtract_via_negate_add = subtract_via_negate_add; + api.divide_via_reciprocal_multiply= divide_via_reciprocal_multiply; + api.complex_or_exact_expt = complex_or_exact_expt; + api.tan_via_divide_sin_cos = tan_via_divide_sin_cos; + api.isUnit_via_eq = isUnit_via_eq; + api.Real_magnitude_via_abs = Real_magnitude_via_abs; + api.InexactReal_angle_via_isNegative= InexactReal_angle_via_isNegative; + api.ExactReal_angle_via_isNegative= ExactReal_angle_via_isNegative; + api.isPositive_via_sign = isPositive_via_sign; + api.isNegative_via_sign = isNegative_via_sign; + api.isZero_via_sign = isZero_via_sign; + api.sign_via_compare = sign_via_compare; + api.eq_via_compare = eq_via_compare; + api.ne_via_compare = ne_via_compare; + api.gt_via_compare = gt_via_compare; + api.lt_via_compare = lt_via_compare; + api.ge_via_compare = ge_via_compare; + api.le_via_compare = le_via_compare; + api.divAndMod_via_divide_floor= divAndMod_via_divide_floor; + api.div_via_divide_floor = div_via_divide_floor; + api.mod_via_divide_floor = mod_via_divide_floor; + api.abs_via_isNegative_negate= abs_via_isNegative_negate; + api.ceiling_via_floor = ceiling_via_floor; + api.truncate_via_ceiling_floor= truncate_via_ceiling_floor; + api.round_via_floor_compare_isEven= round_via_floor_compare_isEven; + + api.divideReduced_via_isUnit = divideReduced_via_isUnit; + api.Integer_divide_via_gcd_div= Integer_divide_via_gcd_div; + api.Integer_reciprocal_via_divideReduced + = Integer_reciprocal_via_divideReduced; + api.ExactRational_numberToString= ExactRational_numberToString; + api.Integer_numeratorAndDenominator= Integer_numeratorAndDenominator; + + api.genericExp10 = genericExp10; + api.expt_N_EI_fn = expt_N_EI_fn; + api.expt_N_EI = expt_N_EI; + api.gcdNonnegative_via_isZero_mod= gcdNonnegative_via_isZero_mod; + api.bitwiseNot_via_subtract = bitwiseNot_via_subtract; + + api.Real_toFixed = Real_toFixed; + api.Real_toExponential = Real_toExponential; + api.Real_toPrecision = Real_toPrecision; + api.Complex_valueOf = Complex_valueOf; + + return api; +} + + +/* + Function: installGenericFunctions(plugins) + specifies definitions of many generic + functions in terms of other generic facilities, reducing the + minimum requirements of number implementations. + + Input: + + *plugins* shall be a containing the output of + and + + Output: + + Output is in the form of generic function definitions using the + classes defined by . +*/ +function installGenericFunctions(plugins) { + "use strict"; + + var SchemeNumberType = plugins.get("SchemeNumberType"); + var Complex = plugins.get("Complex"); + var Real = plugins.get("Real"); + var InexactReal = plugins.get("InexactReal"); + var ExactReal = plugins.get("ExactReal"); + var ExactRational = plugins.get("ExactRational"); + var ExactInteger = plugins.get("ExactInteger"); + + var raise = plugins.get("raise"); + function def(generic, types, impl) { + var gen = plugins.get(generic); + if (!gen) + return; + var fn = undefined; + if (impl) { + fn = plugins.get(impl); + if (!fn) { + console.log(impl + " not defined"); + return; + } + } + gen.def.apply(gen.def, types.concat(fn)); + } + + def("expt", [SchemeNumberType, ExactInteger], "expt_N_EI"); + def("square", [SchemeNumberType], "square_via_multiply"); + def("isInexact", [SchemeNumberType], "isInexact_via_isExact"); + def("ne", [SchemeNumberType, SchemeNumberType], "ne_via_eq"); + def("subtract", [SchemeNumberType, SchemeNumberType], + "subtract_via_negate_add"); + def("divide", [SchemeNumberType, SchemeNumberType], + "divide_via_reciprocal_multiply"); + + def("isComplex", [Complex], "retTrue"); + def("numberToString", [Complex], "Complex_numberToString"); + def("sqrt", [Complex], "Complex_sqrt"); + def("exp", [Complex], "Complex_exp"); + def("log", [Complex], "Complex_log"); + def("sin", [Complex], "Complex_sin"); + def("cos", [Complex], "Complex_cos"); + def("tan", [Complex], "tan_via_divide_sin_cos"); + def("asin", [Complex], "Complex_asin"); + def("acos", [Complex], "Complex_acos"); + def("atan", [Complex], "Complex_atan"); + + def("toInexact", [Complex], "Complex_toInexact"); + def("toExact", [Complex], "Complex_toExact"); + def("isZero", [Complex], "Complex_isZero"); + def("magnitude", [Complex], "Complex_magnitude"); + def("angle", [Complex], "Complex_angle"); + def("eq", [Complex, Complex], "Complex_eq"); + def("eq", [Complex, Real], "Complex_eq_Real"); + def("eq", [Real, Complex], "Real_eq_Complex"); + def("ne", [Complex, Complex], "Complex_ne"); + def("ne", [Complex, Real], "Complex_ne_Real"); + def("ne", [Real, Complex], "Real_ne_Complex"); + def("add", [Real, Complex], "Real_add_Complex"); + def("add", [Complex, Real], "Complex_add_Real"); + def("add", [Complex, Complex], "Complex_add"); + def("subtract", [Real, Complex], "Real_subtract_Complex"); + def("subtract", [Complex, Real], "Complex_subtract_Real"); + def("subtract", [Complex, Complex], "Complex_subtract"); + def("negate", [Complex], "Complex_negate"); + def("multiply", [Real, Complex], "Real_multiply_Complex"); + def("multiply", [Complex, Real], "Complex_multiply_Real"); + def("multiply", [Complex, Complex], "Complex_multiply"); + def("divide", [Complex, Real], "Complex_divide_Real"); + def("square", [Complex], "Complex_square"); + def("reciprocal",[Complex], "Complex_reciprocal"); + def("divide", [Real, Complex], "Real_divide_Complex"); + def("divide", [Complex, Complex], "Complex_divide"); + + def("isReal", [Real], "retTrue"); + def("realPart", [Real], "retThis"); + def("imagPart", [Real], "retZero"); + def("conjugate", [Real], "retThis"); + def("isUnit", [Real], "isUnit_via_eq"); + def("magnitude", [Real], "Real_magnitude_via_abs"); + def("isPositive", [Real], "isPositive_via_sign"); + def("isNegative", [Real], "isNegative_via_sign"); + def("isZero", [Real], "isZero_via_sign"); + def("sign", [Real], "sign_via_compare"); + def("eq", [Real, Real], "eq_via_compare"); + def("ne", [Real, Real], "ne_via_compare"); + def("gt", [Real, Real], "gt_via_compare"); + def("lt", [Real, Real], "lt_via_compare"); + def("ge", [Real, Real], "ge_via_compare"); + def("le", [Real, Real], "le_via_compare"); + def("divAndMod", [Real, Real], "divAndMod_via_divide_floor"); + def("div", [Real, Real], "div_via_divide_floor"); + def("mod", [Real, Real], "mod_via_divide_floor"); + def("abs", [Real], "abs_via_isNegative_negate"); + def("ceiling", [Real], "ceiling_via_floor"); + def("truncate", [Real], "truncate_via_ceiling_floor"); + def("round", [Real], "round_via_floor_compare_isEven"); + + def("isExact", [InexactReal], "retFalse"); + def("isInexact", [InexactReal], "retTrue"); + def("toInexact", [InexactReal], "retThis"); + def("angle", [InexactReal], "InexactReal_angle_via_isNegative"); + + def("isExact", [ExactReal], "retTrue"); + def("isInexact", [ExactReal], "retFalse"); + def("toExact", [ExactReal], "retThis"); + def("SN_isNaN", [ExactReal], "retFalse"); + def("SN_isFinite", [ExactReal], "retTrue"); + def("SN_isInfinite", [ExactReal], "retFalse"); + def("angle", [ExactReal], "ExactReal_angle_via_isNegative"); + + def("isRational", [ExactRational], "retTrue"); + def("divideReduced", [ExactInteger, ExactInteger], + "divideReduced_via_isUnit"); + def("divide", [ExactInteger, ExactInteger], "Integer_divide_via_gcd_div"); + def("reciprocal", [ExactInteger], "Integer_reciprocal_via_divideReduced"); + + def("isInteger", [ExactInteger], "retTrue"); + def("numerator", [ExactInteger], "retThis"); + def("denominator", [ExactInteger], "retOne"); + def("floor", [ExactInteger], "retThis"); + def("ceiling", [ExactInteger], "retThis"); + def("round", [ExactInteger], "retThis"); + def("truncate", [ExactInteger], "retThis"); + def("exp10", [ExactInteger], "genericExp10"); + def("gcdNonnegative", [ExactInteger, ExactInteger], + "gcdNonnegative_via_isZero_mod"); + + def("bitwiseNot", [ExactInteger], "bitwiseNot_via_subtract"); + + // The following expt definition is invalid for (ExactReal, ExactInteger)... + def("expt", [Complex, Complex], "Complex_expt"); + + // ... so override it. + def("expt", [ExactReal, ExactInteger], "expt_N_EI"); + + // Avoid lots of work for inexact bases. + def("expt", [Complex, ExactInteger], "complex_or_exact_expt"); + + def("numberToString", [ExactRational], "ExactRational_numberToString"); + def("numberToString", [ExactInteger], undefined); + def("numeratorAndDenominator", [ExactInteger], + "Integer_numeratorAndDenominator"); +} + + +/* + Function: installEcmaMethods(plugins) + + defines the methods *toFixed*, + *toExponential*, and *toPrecision* (specified by ECMAScript for + *Number*) on exact reals. + + It defines the *valueOf* method on class *Complex* in terms of the + same method on *Real*, but then overrides the method on *Real* + with a generic one returning *NaN* to avoid recursion. Complex + *valueOf* returns *NaN* in every case except where the imaginary + part equals 0. Thus, for example, *5.0+0.0i* converts to native + *5*. + + *ExactReal*, *Complex*, and *Real*, from , + are required when is called. So are + *Real_toFixed*, *Real_toExponential*, *Real_toPrecision*, + *Complex_valueOf*, and *retNaN* from . +*/ +function installEcmaMethods(plugins) { + "use strict"; + var N = plugins.get("SchemeNumberType"); + var ExactReal = plugins.get("ExactReal"); + var Complex = plugins.get("Complex"); + var Real = plugins.get("Real"); + var ExactRational = plugins.get("ExactRational"); + + // XXX should not install if not defined. + + Complex.prototype.valueOf = plugins.get("Complex_valueOf"); + Complex.prototype.toString = plugins.get("Complex_toString"); + Complex.prototype.toFixed = plugins.get("Complex_toFixed"); + Complex.prototype.toExponential = plugins.get("Complex_toExponential"); + Complex.prototype.toPrecision = plugins.get("Complex_toPrecision"); + + // If Real inherits these from Complex, they will loop infinitely. + Real.prototype.valueOf = N.prototype.valueOf; + Real.prototype.toFixed = N.prototype.toFixed; + Real.prototype.toExponential = N.prototype.toExponential; + Real.prototype.toPrecision = N.prototype.toPrecision; + Real.prototype.toString = N.prototype.toString; + + ExactReal.prototype.toFixed = plugins.get("Real_toFixed"); + ExactReal.prototype.toExponential = plugins.get("Real_toExponential"); + ExactReal.prototype.toPrecision = plugins.get("Real_toPrecision"); +} + +function makeBase() { + var SchemeNumber = makeMinimalBase(); + var plugins = SchemeNumber.plugins; + + SchemeNumber.makeMinimalBase = makeMinimalBase; + SchemeNumber.makeBase = makeBase; + + plugins.extend(implementPluginLibrary(plugins)); + plugins.extend(defineAbstractTypes(plugins)); + installAbstractTypes(plugins); + installStubFunctions(plugins); + + installGenericFunctions(plugins); + installEcmaMethods(plugins); + + return SchemeNumber; +} + +/* + Function: installDefaultExactInteger(plugins, convert) + Allows multiple exact integer implementations to interoperate + via conversion to a default one. + + *convert* must be a function that accepts an ExactInteger and + returns an equivalent value of standard type. The following + generic functions must be specialized for the standard type: + compare add subtract multiply expt divAndMod div mod. +*/ +function installDefaultExactInteger(plugins, convert) { + var ExactInteger = plugins.get("ExactInteger"); + + function def(name) { + var func = plugins.get(name); + function EI_func(n) { + return func(convert(this), convert(n)); + } + func.def(ExactInteger, ExactInteger, EI_func); + } + + // XXX Should avoid defining on ExactInteger ops that the + // implementation class does not specialize. + def("compare"); + def("add"); + def("subtract"); + def("multiply"); + def("expt"); + def("divAndMod"); + def("div"); + def("mod"); + def("gcdNonnegative"); + + plugins.extend("canonicalExactInteger", convert); +} + +function installDefaultRational(plugins, convert, divideReduced) { + var ExactInteger = plugins.get("ExactInteger"); + var ExactRational = plugins.get("ExactRational"); + + function def(name) { + var func = plugins.get(name); + function EQ_func(n) { + return func(convert(this), convert(n)); + } + func.def(ExactRational, ExactRational, EQ_func); + } + + // XXX Should avoid defining on ExactRational ops that the + // implementation class does not specialize. + def("compare"); + def("add"); + def("subtract"); + def("multiply"); + def("divide"); + + function EI_divideReduced(n) { + return divideReduced(this, n); + } + + plugins.get("divideReduced").def(ExactInteger, ExactInteger, + EI_divideReduced); + + plugins.extend("canonicalRational", convert); +} + +/* + Function: implementNativeInexactReal(plugins) + Returns a collection of functions implementing inexact reals as + native numbers. + + The functions return native numbers wrapped in a + object. The object trivially implements the + standard *toString* and formatting methods by forwarding them to + the corresponding functions from *Number.prototype*. The purpose + of wrapping numbers this way is to provide a method space other + than *Number.prototype* in which to insert properties supporting + Scheme functions. + + Output: + + parseInexact - function(sign, string) -> SchemeNumber + As required by . + + nativeToInexact - function(number) -> SchemeNumber + As required by . + + NativeInexactReal - constructor of values returned by functions + defined in . Inherits from + . + + NativeInexactReal_debug - function() -> string + Specialization of the function for the + type. + + Native_log - function(number) -> SchemeNumber + Returns the log of *number* as a . + + Native_sqrt - function(number) -> SchemeNumber + Returns the sqrt of *number* as a . + + Native_atan2 - function(y, x) -> SchemeNumber + *y* and *x* are native numbers. Returns *atan2(y, x)* as a + . + + Native_atan - function(number) -> SchemeNumber + Returns the atan of *number* as a . + + Native_cos - function(number) -> SchemeNumber + Returns the cos of *number* as a . + + Native_sin - function(number) -> SchemeNumber + Returns the sin of *number* as a . + + Native_tan - function(number) -> SchemeNumber + Returns the tan of *number* as a . + + Native_exp - function(number) -> SchemeNumber + Returns the exp of *number* as a . + + Native_abs - function(number) -> SchemeNumber + Returns the abs of *number* as a . + + Native_floor - function(number) -> SchemeNumber + Returns the floor of *number* as a . + + Native_ceil - function(number) -> SchemeNumber + Returns the ceil of *number* as a . + + Native_pow - function(base, power) -> SchemeNumber + *base* and *power* are native numbers. Returns the *number* to + the *power* as a . + + Flonum_debug - function() -> string +*/ +function implementNativeInexactReal(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var InexactReal = plugins.get("InexactReal"); + var api = g.Object.create(null); + + var Number_toFixed = uncurry(g.Number.prototype.toFixed); + var Number_toExponential = uncurry(g.Number.prototype.toExponential); + var Number_toPrecision = uncurry(g.Number.prototype.toPrecision); + var Number_toString = uncurry(g.Number.prototype.toString); + var Number_toLocaleString = uncurry(g.Number.prototype.toLocaleString); + var _parseFloat = g.parseFloat; + + function NativeInexactReal(x) { + this._ = x; + } + NativeInexactReal.prototype = new InexactReal(); + + function NativeInexactReal_debug() { + return "NativeInexact(" + this._ + ")"; + } + + function valueOf() { + return this._; + } + function toFixed(digits) { + return Number_toFixed(this._, digits); + } + function toExponential(digits) { + return Number_toExponential(this._, digits); + } + function toPrecision(precision) { + return Number_toPrecision(this._, precision); + } + function toString(radix) { + return Number_toString(this._, radix); + } + function toLocaleString() { + return Number_toLocaleString(this._); + } + + NativeInexactReal.prototype.valueOf = valueOf; + NativeInexactReal.prototype.toFixed = toFixed; + NativeInexactReal.prototype.toExponential = toExponential; + NativeInexactReal.prototype.toPrecision = toPrecision; + NativeInexactReal.prototype.toString = toString; + NativeInexactReal.prototype.toLocaleString = toLocaleString; + + var Flonum = NativeInexactReal; + + var INEXACT_ZERO = new NativeInexactReal(0); + function nativeToInexact(x) { + //assert(typeof x === "number"); + return (x === 0 ? INEXACT_ZERO : new NativeInexactReal(x)); + } + + function parseInexact(sign, string) { + return nativeToInexact(sign * _parseFloat(string)); + } + + function defNative(name) { + var math = g.Math[name]; + function nativeMath1(a) { + return nativeToInexact(math(a)); + } + function nativeMath2(a, b) { + return nativeToInexact(math(a, b)); + } + api["Native_" + name] = (math.length === 1 ? nativeMath1 : nativeMath2); + } + + defNative("log"); + defNative("sqrt"); + defNative("atan2"); + defNative("atan"); + defNative("cos"); + defNative("sin"); + defNative("tan"); + defNative("exp"); + defNative("abs"); + defNative("floor"); + defNative("ceil"); + defNative("pow"); + + api.parseInexact = parseInexact; + api.nativeToInexact = nativeToInexact; + api.NativeInexactReal = NativeInexactReal; + api.NativeInexactReal_debug = NativeInexactReal_debug; + return api; +} + +/* +// Flonums as bare primitives, for people who don't mind adding +// properties to Number.prototype. +function implementPrimitiveInexactReal(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var api = g.Object.create(null); + + function parseInexact(sign, string) { + return sign * _parseFloat(string); + } + + function Number_debug() { + return "PrimitiveInexact(" + this + ")"; + } + + function defNative(name) { + api["Native_" + name] = g.Math[name]; + } + + defNative("log"); + defNative("sqrt"); + defNative("atan2"); + defNative("atan"); + defNative("cos"); + defNative("sin"); + defNative("tan"); + defNative("exp"); + defNative("abs"); + defNative("floor"); + defNative("ceil"); + defNative("pow"); + + api.parseInexact = parseInexact; + api.nativeToInexact = Number; + api.NativeInexactReal = Number; + api.NativeInexactReal_debug = Number_debug; + return api; +} +*/ + +/* + Function: implementNativeFlonumLibrary(plugins) + Creates functions operating on Scheme inexact reals. + + The functions convert their arguments to native numbers using "+" + (which invokes *valueOf()* when the arguments are not primitive + numbers). + + Real_toInexact_via_primitive - function() -> InexactReal + + Flonum_add XXX incomplete. +*/ +function implementNativeFlonumLibrary(plugins) { + "use strict"; + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var api = g.Object.create(null); + + var String_indexOf = uncurry(g.String.prototype.indexOf); + var String_substring = uncurry(g.String.prototype.substring); + var String_replace = uncurry(g.String.prototype.replace); + var Number_toString = uncurry(g.Number.prototype.toString); + + // Squirrel away the native math library. XXX could trim unused items. + var Math_E = g.Math.E; + var Math_LN10 = g.Math.LN10; + var Math_LN2 = g.Math.LN2; + var Math_LOG2E = g.Math.LOG2E; + var Math_LOG10E = g.Math.LOG10E; + var Math_PI = g.Math.PI; + var Math_SQRT1_2 = g.Math.SQRT1_2; + var Math_SQRT2 = g.Math.SQRT2; + var Math_abs = g.Math.abs; + var Math_acos = g.Math.acos; + var Math_asin = g.Math.asin; + var Math_atan = g.Math.atan; + var Math_atan2 = g.Math.atan2; + var Math_ceil = g.Math.ceil; + var Math_cos = g.Math.cos; + var Math_exp = g.Math.exp; + var Math_floor = g.Math.floor; + var Math_log = g.Math.log; + var Math_max = g.Math.max; + var Math_min = g.Math.min; + var Math_pow = g.Math.pow; + var Math_random = g.Math.random; + var Math_round = g.Math.round; + var Math_sin = g.Math.sin; + var Math_sqrt = g.Math.sqrt; + var Math_tan = g.Math.tan; + + var _isFinite = g.isFinite; + var _isNaN = g.isNaN; + var _parseFloat = g.parseFloat; + var _undefined = g.undefined; + var _Number = g.Number; + + var nativeToInexact, Native_log, Native_sqrt, Native_atan2, + Native_atan, Native_cos, Native_sin, Native_tan, Native_exp, + Native_abs, Native_floor, Native_ceil, Native_pow; + var raise, inexactRectangular, INEXACT_ZERO, nativeToExactInteger, TWO, divideReducedNotByOne, numberToString, isExact, isInexact, toExact, toInexact, isRational, isInteger, isZero, negate, square, eq, ne, add, subtract, multiply, divide, expt, exp, sqrt, log, asin, acos, atan, sin, cos, tan, abs, isPositive, isNegative, sign, floor, ceiling, truncate, round, compare, gt, lt, ge, le, divAndMod, div, mod, atan2, numerator, denominator, isEven, isOdd, Complex_expt_fn, Complex_acos_fn, Complex_asin_fn, Complex_log_fn, numberToBinary, nativeDenominatorLog2, nativeDenominator; + + function onPluginsChanged(plugins) { + // XXX Could require these prior to call. + nativeToInexact = plugins.get("nativeToInexact"); + Native_log = plugins.get("Native_log"); + Native_sqrt = plugins.get("Native_sqrt"); + Native_atan2 = plugins.get("Native_atan2"); + Native_atan = plugins.get("Native_atan"); + Native_cos = plugins.get("Native_cos"); + Native_sin = plugins.get("Native_sin"); + Native_tan = plugins.get("Native_tan"); + Native_exp = plugins.get("Native_exp"); + Native_abs = plugins.get("Native_abs"); + Native_floor = plugins.get("Native_floor"); + Native_ceil = plugins.get("Native_ceil"); + Native_pow = plugins.get("Native_pow"); + + raise = plugins.get("raise"); + inexactRectangular = plugins.get("inexactRectangular"); + INEXACT_ZERO = plugins.get("INEXACT_ZERO"); + nativeToExactInteger = plugins.get("nativeToExactInteger"); + divideReducedNotByOne = plugins.get("divideReducedNotByOne"); + TWO = plugins.get("TWO"); + + numberToString = plugins.get("numberToString"); + isExact = plugins.get("isExact"); + isInexact = plugins.get("isInexact"); + toExact = plugins.get("toExact"); + toInexact = plugins.get("toInexact"); + isRational = plugins.get("isRational"); + isInteger = plugins.get("isInteger"); + isZero = plugins.get("isZero"); + negate = plugins.get("negate"); + square = plugins.get("square"); + eq = plugins.get("eq"); + ne = plugins.get("ne"); + add = plugins.get("add"); + subtract = plugins.get("subtract"); + multiply = plugins.get("multiply"); + divide = plugins.get("divide"); + expt = plugins.get("expt"); + exp = plugins.get("exp"); + sqrt = plugins.get("sqrt"); + log = plugins.get("log"); + asin = plugins.get("asin"); + acos = plugins.get("acos"); + atan = plugins.get("atan"); + sin = plugins.get("sin"); + cos = plugins.get("cos"); + tan = plugins.get("tan"); + abs = plugins.get("abs"); + isPositive = plugins.get("isPositive"); + isNegative = plugins.get("isNegative"); + sign = plugins.get("sign"); + floor = plugins.get("floor"); + ceiling = plugins.get("ceiling"); + truncate = plugins.get("truncate"); + round = plugins.get("round"); + compare = plugins.get("compare"); + gt = plugins.get("gt"); + lt = plugins.get("lt"); + ge = plugins.get("ge"); + le = plugins.get("le"); + divAndMod = plugins.get("divAndMod"); + div = plugins.get("div"); + mod = plugins.get("mod"); + atan2 = plugins.get("atan2"); + numerator = plugins.get("numerator"); + denominator = plugins.get("denominator"); + isEven = plugins.get("isEven"); + isOdd = plugins.get("isOdd"); + + Complex_expt_fn = plugins.get("Complex_expt_fn"); + Complex_acos_fn = plugins.get("Complex_acos_fn"); + Complex_asin_fn = plugins.get("Complex_asin_fn"); + Complex_log_fn = plugins.get("Complex_log_fn"); + numberToBinary = plugins.get("numberToBinary"); + nativeDenominatorLog2 = plugins.get("nativeDenominatorLog2"); + nativeDenominator = plugins.get("nativeDenominator"); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins); + + function Real_toInexact_via_Flonum() { + return nativeToInexact(Number(this)); + } + + function Flonum_numberToString(radix, precision) { + var t = (+this); + if (radix && radix != 10 && _isFinite(t)) + return "#i" + numberToString(toExact(this), radix); + + if (!_isFinite(t)) { + if (_isNaN(t)) + return("+nan.0"); + return (t > 0 ? "+inf.0" : "-inf.0"); + } + + var s = Number_toString(t); + + if (String_indexOf(s, '.') === -1) { + // Force the result to contain a decimal point as per R6RS. + var e = String_indexOf(s, 'e'); + if (e === -1) + s += "."; + else + s = (String_substring(s, 0, e) + "." + + String_substring(s, e)); + } + + if (precision != _undefined) { + if (precision < 53) { + var bits = String_replace( + String_replace( + String_replace( + numberToBinary(+this), + /[-+.]/g, ""), + /^0+/, ""), + /0+$/, "").length; + if (precision < bits) + precision = bits; + } + s += "|" + precision; + } + + return s; + } + + function Flonum_denominator() { + var t = (+this); + if (!_isFinite(t)) + raise("&assertion", "not a rational number", t); + return Native_pow(2, nativeDenominatorLog2(t)); + } + + function Flonum_numerator() { + var t = (+this); + if (!_isFinite(t)) + raise("&assertion", "not a rational number", t); + return nativeToInexact(this * nativeDenominator(t)); + } + + function Flonum_isInteger() { + var t = (+this); + return _isFinite(t) && t === Math_floor(t); + } + + function Flonum_SN_isFinite() { + return _isFinite(+this); + } + + function Flonum_SN_isInfinite() { + var t = (+this); + return !_isFinite(t) && !_isNaN(t); + } + + function Flonum_SN_isNaN() { + return _isNaN(+this); + } + + function Flonum_isZero() { return (+this) === 0; } + function Flonum_isPositive() { return (+this) > 0; } + function Flonum_isNegative() { return (+this) < 0; } + + function Flonum_sign() { + var t = (+this); + return (t === 0 ? 0 : (t > 0 ? 1 : -1)); + } + + function Flonum_isEven() { + //assert(Flonum_isInteger(this)) + return ((+this) & 1) === 0; + } + + function Flonum_isOdd() { + //assert(Flonum_isInteger(this)) + return ((+this) & 1) === 1; + } + + function Flonum_eq(x) { return (+this) === (+x); } + function Flonum_ne(x) { return (+this) !== (+x); } + function Flonum_gt(x) { return (+this) > (+x); } + function Flonum_lt(x) { return (+this) < (+x); } + function Flonum_ge(x) { return (+this) >= (+x); } + function Flonum_le(x) { return (+this) <= (+x); } + + function Flonum_compare(x) { + var t = (+this); + x = (+x); + if (t === x) return 0; + if (t < x) return -1; + if (t > x) return 1; + return NaN; + } + + function Flonum_toExact() { + var x = (+this); + + if (!_isFinite(x)) + raise("&implementation-violation", + "inexact argument has no reasonably close exact equivalent", + this); + + var d = nativeDenominator(x); + var n; + + if (d === 1) + return nativeToExactInteger(x); + + if (_isFinite(d)) { + n = x * d; + d = nativeToExactInteger(d); + } + else { + // Denormal x. + var dl2 = nativeDenominatorLog2(x); + n = x * 9007199254740992; + n *= natPow(2, dl2 - 53); + d = expt(TWO, nativeToExactInteger(dl2)); + } + //assert(_isFinite(n)); + return divideReducedNotByOne(nativeToExactInteger(n), d); + } + + function Flonum_add(x) { return nativeToInexact((+this) + (+x)); } + function Flonum_subtract(x) { return nativeToInexact((+this) - (+x)); } + function Flonum_multiply(x) { return nativeToInexact((+this) * (+x)); } + function Flonum_divide(x) { return nativeToInexact((+this) / (+x)); } + + function Flonum_negate() { + return nativeToInexact(-(+this)); + } + + function Flonum_abs() { + return nativeToInexact(Math_abs(+this)); + } + + function Flonum_reciprocal() { + return nativeToInexact(1 / (+this)); + } + + function div_native(x, y) { + //assert(_isFinite(x)); + //assert(y != 0); + if (y > 0) + return Math_floor(x / y); + if (y < 0) + return Math_ceil(x / y); + return NaN; + } + function Flonum_divAndMod(y) { + var x = (+this); + y = (+y); + var div = div_native(x, y); + return [nativeToInexact(div), nativeToInexact(x - (y * div))]; + } + function Flonum_div(y) { + var x = (+this); + y = (+y); + return nativeToInexact(div_native(x, y)); + } + function Flonum_mod(y) { + var x = (+this); + y = (+y); + return nativeToInexact(x - y * div_native(x, y)); + } + + function Flonum_square() { + var t = (+this); + return nativeToInexact(t * t); + } + + function Flonum_expt(x) { + // Return this number to the power of x. + var t = (+this); + if (t < 0) + return Complex_expt_fn(this, x); + return Native_pow(t, x); + } + + function Flonum_round() { + var t = (+this); + var ret = Math_floor(t); + var diff = t - ret; + if (diff < 0.5) return nativeToInexact(ret); + if (diff > 0.5) return nativeToInexact(ret + 1); + return nativeToInexact(2 * Math_round(t / 2)); + } + + function Flonum_truncate() { + var t = (+this); + return (t < 0 ? Native_ceil(t) : Native_floor(t)); + } + + function funcToMeth(fn) { + return function() { + return fn(+this); + }; + } + + var Flonum_ceiling = funcToMeth(Native_ceil); + var Flonum_floor = funcToMeth(Native_floor); + + // These functions are always allowed to return inexact. We, however, + // override a few of these in ZERO and ONE. + // sqrt exp log sin cos tan asin acos atan atan2 + + var Flonum_atan = funcToMeth(Native_atan); + var Flonum_cos = funcToMeth(Native_cos); + var Flonum_exp = funcToMeth(Native_exp); + var Flonum_sin = funcToMeth(Native_sin); + var Flonum_tan = funcToMeth(Native_tan); + + function cplxFuncToMeth(mathFunc, complexFunc) { + return function() { + var t = (+this); + var ret = mathFunc(t); + if (_isNaN(ret)) + return complexFunc(this); + return nativeToInexact(ret); + }; + } + var Flonum_acos = cplxFuncToMeth(Math_acos, Complex_acos_fn); + var Flonum_asin = cplxFuncToMeth(Math_asin, Complex_asin_fn); + + function Flonum_log() { + var x = (+this); + if (x < 0) + return Complex_log_fn(this); + return Native_log(x); + } + + function Flonum_sqrt() { + var x = (+this); + if (x >= 0) + return Native_sqrt(x); + if (_isNaN(x)) + return nativeToInexact(x); + return inexactRectangular(INEXACT_ZERO, Native_sqrt(-x)); + } + + function Flonum_atan2(x) { + return Native_atan2((+this), x); + } + + api.Real_toInexact_via_Flonum= Real_toInexact_via_Flonum; + api.Flonum_numberToString = Flonum_numberToString; + api.Flonum_isRational = Flonum_SN_isFinite; + api.Flonum_denominator = Flonum_denominator; + api.Flonum_numerator = Flonum_numerator; + api.Flonum_isInteger = Flonum_isInteger; + api.Flonum_SN_isFinite = Flonum_SN_isFinite; + api.Flonum_SN_isInfinite = Flonum_SN_isInfinite; + api.Flonum_SN_isNaN = Flonum_SN_isNaN; + api.Flonum_isZero = Flonum_isZero; + api.Flonum_isPositive = Flonum_isPositive; + api.Flonum_isNegative = Flonum_isNegative; + api.Flonum_sign = Flonum_sign; + api.Flonum_isEven = Flonum_isEven; + api.Flonum_isOdd = Flonum_isOdd; + api.Flonum_eq = Flonum_eq; + api.Flonum_ne = Flonum_ne; + api.Flonum_gt = Flonum_gt; + api.Flonum_lt = Flonum_lt; + api.Flonum_ge = Flonum_ge; + api.Flonum_le = Flonum_le; + api.Flonum_compare = Flonum_compare; + api.Flonum_toExact = Flonum_toExact; + api.Flonum_add = Flonum_add; + api.Flonum_subtract = Flonum_subtract; + api.Flonum_multiply = Flonum_multiply; + api.Flonum_divide = Flonum_divide; + api.Flonum_negate = Flonum_negate; + api.Flonum_abs = Flonum_abs; + api.Flonum_reciprocal = Flonum_reciprocal; + api.Flonum_divAndMod = Flonum_divAndMod; + api.Flonum_div = Flonum_div; + api.Flonum_mod = Flonum_mod; + api.Flonum_square = Flonum_square; + api.Flonum_expt = Flonum_expt; + api.Flonum_round = Flonum_round; + api.Flonum_truncate = Flonum_truncate; + api.Flonum_ceiling = Flonum_ceiling; + api.Flonum_floor = Flonum_floor; + api.Flonum_atan = Flonum_atan; + api.Flonum_cos = Flonum_cos; + api.Flonum_exp = Flonum_exp; + api.Flonum_sin = Flonum_sin; + api.Flonum_tan = Flonum_tan; + api.Flonum_acos = Flonum_acos; + api.Flonum_asin = Flonum_asin; + api.Flonum_log = Flonum_log; + api.Flonum_sqrt = Flonum_sqrt; + api.Flonum_atan2 = Flonum_atan2; + return api; +} + +/* + Function: installFlonum(plugins) + + // XXX documentation out of date. + + If *args* contains property *isDefaultInexactReal* with a true + value, creates operations as follows. + + - The comparison operators (, , , , , , + and ) may convert their arguments to native numbers and + use native comparison when both are real and at least one is + inexact. + + - The operators , , , , + ,
, , and may return an object + created by this implementation when both arguments are real and + at least one is inexact. + + - The operators , , , , , , + , , , , and may return an object + created by this implementation when passed any real arguments. +*/ +function installFlonum(plugins) { + "use strict"; + var Flonum = plugins.get("Flonum"); + var Real = plugins.get("Real"); + var InexactReal = plugins.get("InexactReal"); + var ExactReal = plugins.get("ExactReal"); + var i; + var isDefaultFlonum = true; // XXX should make it an option. + + // Augment Number.prototype if passed Number as Flonum. + if (!(Flonum.prototype instanceof InexactReal)) { + for (i in InexactReal.prototype) + if (!(i in Flonum.prototype)) + Flonum.prototype[i] = InexactReal.prototype[i]; + } + + if (isDefaultFlonum) { + plugins.get("toInexact").def(ExactReal, plugins.get( + "Real_toInexact_via_Flonum")); + } + + function def1_Flonum(name) { + var impl = plugins.get("Flonum_" + name); + if (!impl) + console.log("Flonum_" + name + " not defined"); + plugins.get(name).def(Flonum, impl); + } + function def1_InexactReal(name) { + var impl = plugins.get("Flonum_" + name); + if (!impl) + console.log("Flonum_" + name + " not defined"); + plugins.get(name).def(InexactReal, impl); + } + function def1_Real(name) { + var impl = plugins.get("Flonum_" + name); + if (!impl) + console.log("Flonum_" + name + " not defined"); + plugins.get(name).def(Real, impl); + } + + function def2_base(name) { + var generic = plugins.get(name); + var impl = plugins.get("Flonum_" + name); + if (!impl) + console.log("Flonum_" + name + " not defined"); + generic.def(Flonum, Flonum, impl); + } + function def2_Flonum(name) { + var generic = plugins.get(name); + var impl = plugins.get("Flonum_" + name); + def2_base(name); + generic.def(ExactReal, Flonum, impl); + generic.def(Flonum, ExactReal, impl); + } + function def2_InexactReal(name) { + var generic = plugins.get(name); + var impl = plugins.get("Flonum_" + name); + def2_base(name); + generic.def(Real, InexactReal, impl); + generic.def(InexactReal, Real, impl); + } + function def2_Real(name) { + var generic = plugins.get(name); + var impl = plugins.get("Flonum_" + name); + def2_base(name); + generic.def(Real, Real, impl); + } + + var def1inexact = (isDefaultFlonum ? def1_InexactReal : def1_Flonum); + var def1real = (isDefaultFlonum ? def1_Real : def1_Flonum); + var def2inexact = (isDefaultFlonum ? def2_InexactReal : def2_Flonum); + var def2real = (isDefaultFlonum ? def2_Real : def2_Flonum); + + // "real" functions may convert their arguments to inexact. + // "inexact" functions operate only on inexact arguments. + + def1inexact("numberToString"); + def1inexact("isRational"); + def1inexact("denominator"); + def1inexact("numerator"); + def1inexact("isInteger"); + def1inexact("SN_isFinite"); + def1inexact("SN_isInfinite"); + def1inexact("SN_isNaN"); + def1inexact("isZero"); + def1inexact("isPositive"); + def1inexact("isNegative"); + def1inexact("sign"); + def1inexact("isEven"); + def1inexact("isOdd"); + def1inexact("toExact"); + def1inexact("negate"); + def1inexact("abs"); + def1inexact("reciprocal"); + def1inexact("square"); + def1inexact("round"); + def1inexact("truncate"); + def1inexact("ceiling"); + def1inexact("floor"); + + def1real("atan"); + def1real("cos"); + def1real("exp"); + def1real("sin"); + def1real("tan"); + def1real("acos"); + def1real("asin"); + def1real("log"); + def1real("sqrt"); + + def2inexact("eq"); + def2inexact("ne"); + def2inexact("gt"); + def2inexact("lt"); + def2inexact("ge"); + def2inexact("le"); + def2inexact("compare"); + def2inexact("add"); + def2inexact("subtract"); + def2inexact("multiply"); + def2inexact("divide"); + def2inexact("divAndMod"); + def2inexact("div"); + def2inexact("mod"); + + def2real("expt"); // XXX should be def2inexact? + def2real("atan2"); +} + +/* + Function: implementBigInteger(plugins, BigInteger) + Exact integer implementation that uses Matthew Crumley's BigInteger. +*/ +function implementBigInteger(plugins, BigInteger) { + "use strict"; + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var SchemeNumber = plugins.get("SchemeNumber"); + var BigIntegerName = BigInteger.name || "BigInteger"; + var Number_toString = uncurry(g.Number.prototype.toString); + var String_replace = uncurry(g.String.prototype.replace); + var Array_concat = uncurry(g.Array.prototype.concat); + var Array_map = uncurry(g.Array.prototype.map); + + var Math_LN10 = g.Math.LN10; + var Math_LN2 = g.Math.LN2; + var Math_abs = g.Math.abs; + var Math_exp = g.Math.exp; + var Math_floor = g.Math.floor; + var Math_pow = g.Math.pow; + var Math_sqrt = g.Math.sqrt; + + var api = g.Object.create(null); + + var toBigInteger = plugins.get("Dispatch").defGeneric( + "to" + BigIntegerName, 1); + + var raise, numberToString, isNegative, negate, abs, mod, reciprocal, divide, sign, exp10, nativeToInexact, inexactRectangular, ZERO, ONE, MINUS_ONE, _2_32, PI, INEXACT_ZERO; + + raise = plugins.get("raise"); + + numberToString = plugins.get("numberToString"); + isNegative = plugins.get("isNegative"); + negate = plugins.get("negate"); + abs = plugins.get("abs"); + mod = plugins.get("mod"); + reciprocal = plugins.get("reciprocal"); + divide = plugins.get("divide"); + sign = plugins.get("sign"); + exp10 = plugins.get("exp10"); + + _2_32 = nativeToExactInteger(4294967296); + + function onPluginsChanged(plugins, changed) { + nativeToInexact = plugins.get("nativeToInexact"); + inexactRectangular = plugins.get("inexactRectangular"); + ZERO = plugins.get("ZERO"); + ONE = plugins.get("ONE"); + MINUS_ONE = plugins.get("MINUS_ONE"); + PI = plugins.get("PI"); + INEXACT_ZERO = plugins.get("INEXACT_ZERO"); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins); + + function BigInteger_debug() { + return BigIntegerName + "(" + this.toString() + ")"; + } + + function parseExactInteger(sign, string, radix) { + // Trim leading zeroes to avoid BigInteger treating "0c" and + // "0b" as radix prefixes. + var n = BigInteger.parse(String_replace(string, /^0+/, ""), radix); + if (sign < 0) + n = n.negate(); + return n; + } + + function nativeToExactInteger(n) { + // Use base 16 to avoid exponential notation. + return BigInteger.parse(Number_toString(n, 16), 16); + } + + function ExactInteger_toBigInteger() { + return BigInteger.parse(numberToString(this)); + } + + function integerTooBig(digits) { + raise("&implementation-restriction", + "exact integer would exceed limit of " + + (+SchemeNumber.maxIntegerDigits) + + " digits; adjust SchemeNumber.maxIntegerDigits", + digits); + } + + // (expt *this* *p*) + function BigInteger_expt(p) { + if (this.isZero()) + return (p.isZero() ? ONE : this); + if (this.isUnit()) { + if (this.isPositive()) + return this; + return (p.isEven() ? ONE : this); + } + + // If p != p.valueOf() due to inexactness, our result would + // exhaust memory, since |this| is at least 2. + // XXX does not respect maxIntegerDigits. + p = p.valueOf(); + var a = this.pow(Math_abs(p)); + return (p >= 0 ? a : reciprocal(a)); + } + + function BigInteger_numberToString(radix) { + return this.toString(radix); + } + + function divAndMod_BigInteger(n, d) { + var dm = n.divRem(d); + if (dm[1].isNegative()) { + if (d.isNegative()) + return [dm[0].next(), dm[1].subtract(d)]; + return [dm[0].prev(), dm[1].add(d)]; + } + return dm; + } + + function BigInteger_divAndMod(d) { + return divAndMod_BigInteger(this, d); + } + function BigInteger_div(d) { + return divAndMod_BigInteger(this, d)[0]; + } + function BigInteger_mod(d) { + return divAndMod_BigInteger(this, d)[1]; + } + + function BigInteger_log() { + var x = nativeToInexact(this.abs().log()); + return this.isPositive() ? x : inexactRectangular(x, PI); + } + + function BigInteger_exp10(e) { + switch (sign(e)) { + case 0: return this; + case -1: return divide(this, exp10(ONE, negate(e))); + case 1: + e = +e; + if (e > SchemeNumber.maxIntegerDigits && !this.isZero()) + integerTooBig(e); + return this.exp10(e); + } + } + + function BigInteger_sqrt() { + var s = this.sign(); + if (s === 0) + return this; + var mag = nativeToInexact(Math_exp(this.abs().log() / 2)); + if (s < 0) + return inexactRectangular(INEXACT_ZERO, mag); + return mag; + } + + function BigInteger_exactIntegerSqrt() { + + // I know of no use cases for this. Be stupid. Be correct. + + function doit(n, a) { + while (true) { + var dm = n.divRem(a); + var b = dm[0]; + var diff = a.subtract(b); + // n == b*b + b*diff + dm[1], dm[1] < b+1 + + if (diff.isZero()) + return [ b, dm[1] ]; // n == b*b + dm[1] + + if (diff.isUnit()) { + if (diff.isPositive()) + // n == b*b + b + dm[1], dm[1] < b+1 + return [ b, b.add(dm[1]) ]; + + // n == b*b - b + dm[1] == (b-1)^2 + b - 1 + dm[1] + return [ a, a.add(dm[1]) ]; + } + + a = b.add(diff.quotient(2)); + } + } + + switch (this.sign()) { + case -1: + raise("&assertion", "negative number", this); + case 0: + return [ ZERO, ZERO ]; + case 1: default: + break; + } + var l = this.log() / 2 / Math_LN10; + + if (l < 7) { + // Use native arithmetic. + var x = this.valueOf(); + var f = Math_floor(Math_sqrt(x)); + return [BigInteger(f), BigInteger(x - f * f)]; + } + + var a = BigInteger(Number_toString(Math_pow(10, l - Math_floor(l))) + + "e" + Math_floor(l)); + return doit(this, a); + } + + function BigInteger_gcdNonnegative(n) { + //assert(!isNegative(this)); + //assert(!isNegative(n)); + + var a = this; + if (a.isZero()) + return n; + + var b = n; + var c; + + while (true) { + c = a; + a = b.remainder(a); + if (a.isZero()) + return c; + b = c; + } + } + + // + // BigInteger support for (rnrs arithmetic bitwise), mostly untested XXX. + // + + function makeBitOp(op) { + function BigInteger_bitwiseOp(b) { + var a = this; + //assert(!isNegative(a)); + //assert(!isNegative(b)); + var ret = BigInteger.ZERO; + var d = BigInteger.ONE; + var t, dm; + while (true) { + dm = a.divRem(_2_32); + t = +dm[1]; + a = dm[0]; + dm = b.divRem(_2_32); + t = op(t, +dm[1]); + b = dm[0]; + if (t < 0) + t += 0x100000000; + ret = ret.add(d.multiply(nativeToExactInteger(t))); + if (a.isZero()) + break; + d = d.multiply(_2_32); + } + if (op(0, 1)) + ret = ret.add(b.multiply(d)); + return ret; + } + return BigInteger_bitwiseOp; + } + var BigInteger_bitwiseAnd = makeBitOp(function(x, y) { return x & y; }); + var BigInteger_bitwiseIor = makeBitOp(function(x, y) { return x | y; }); + var BigInteger_bitwiseXor = makeBitOp(function(x, y) { return x ^ y; }); + + var bitCountArray, ffsArray; + + function addOne(x) { return x + 1; } + + function getBitCountArray() { + if (!bitCountArray) { + bitCountArray = [0]; + while (bitCountArray.length < (1 << 8)) + bitCountArray = Array_concat(bitCountArray, + Array_map(bitCountArray, addOne)); + } + return bitCountArray; + } + + function getFfsArray() { + if (!ffsArray) { + ffsArray = [0]; + while (ffsArray.length < (1 << 8)) { + ffsArray = ffsArray.concat(ffsArray); + ffsArray[0]++; + } + } + return ffsArray; + } + + function BigInteger_bitCount() { + //assert(!isNegative(this)); + var a = this; + var ret = 0, dm, t, bc; + while (!a.isZero()) { + dm = a.divRem(_2_32); + a = dm[0]; + t = +dm[1]; + bc = getBitCountArray(); + ret += bc[(t >> 0) & 0xff]; + ret += bc[(t >> 8) & 0xff]; + ret += bc[(t >> 16) & 0xff]; + ret += bc[(t >> 24) & 0xff]; + } + return nativeToExactInteger(ret); + } + + function BigInteger_bitLength() { + var a = this; + switch (a.sign()) { + case 0: return ZERO; + case -1: a = BigInteger.M_ONE.subtract(a); + } + var guess = a.log() / Math_LN2; + var test = Math_floor(guess); + // Could perhaps optimize through assumptions about accuracy. + // Could cache powers of 2. + var p2test = BigInteger.pow(2, Math_floor(guess)); + if (p2test.compare(a) > 0) { + // too high! + while (true) { + a = a.add(a); + if (p2test.compare(a) <= 0) + return nativeToExactInteger(test); + test--; + } + } + while (true) { + p2test = p2test.add(p2test); + test++; + if (p2test.compare(a) > 0) + return nativeToExactInteger(test); + } + } + + function BigInteger_firstBitSet() { + var a = this, dm, m, ret; + if (a.isZero()) + return MINUS_ONE; + for (ret = 0; ; ret += 32) { + dm = a.divRem(_2_32); + m = dm[1]; + if (!m.isZero()) + break; + a = dm[0]; + } + m = +m; + while ((m & 0xff) === 0) { + ret += 8; + m >>= 8; + } + return nativeToExactInteger(ret + getFfsArray()[m & 0xff]); + } + + function BigInteger_isBitSet(i) { + //assert(!isNegative(this)); + var p2i = BigInteger.pow(2, +i); + return this.remainder(p2i.add(p2i)).compare(p2i) >= 0; + } + + function BigInteger_copyBit(i, setIt) { + var p2i = BigInteger.pow(2, +i); + var isSet = this.remainder(p2i.add(p2i)).compare(p2i) >= 0; + switch (setIt - isSet) { + case 0: return this; + case 1: return this.add(p2i); + case -1: return this.subtract(p2i); + } + } + + function BigInteger_bitField(lo, hi) { + //assert(!isNegative(this)); + //assert(le(lo, hi)); + lo = +lo; + var p2width = BigInteger.pow(2, hi - lo); + var p2lo = BigInteger.pow(2, lo); + return this.quotient(p2lo).remainder(p2width); + } + + function BigInteger_copyBitField(from, lo, hi) { + //assert(!isNegative(this)); + //assert(!isNegative(from)); + //assert(le(lo, hi)); + lo = +lo; + var p2width = BigInteger.pow(2, hi - lo); + var p2lo = BigInteger.pow(2, lo); + var old = this.quotient(p2lo).remainder(p2width); + return this.add(p2lo.multiply(from.subtract(old).quotient(p2width))); + } + + function BigInteger_bitShift(count) { + var p2 = BigInteger.pow(2, +abs(count)); + return (isNegative(count) ? this.quotient(p2) : this.multiply(p2)); + } + + function BigInteger_rotateBitField(lo, hi, count) { + //assert(!isNegative(this)); + //assert(le(lo, hi)); + lo = +lo; + var width = hi - lo; + if (width < 2) + return this; + count = +mod(count, nativeToExactInteger(width)); + if (count === 0) + return this; + var p2width = BigInteger.pow(2, width); + var p2lo = BigInteger.pow(2, lo); + var p2count = BigInteger.pow(2, count); + var old = this.quotient(p2lo).remainder(p2width); + var tmp = old.multiply(p2count); + tmp = tmp.add(tmp.quotient(p2width)).remainder(p2width); + return this.add(p2lo.multiply(tmp.subtract(old))); + } + + function BigInteger_reverseBitField(lo, hi) { + //assert(!isNegative(this)); + //assert(le(lo, hi)); + var i; + lo = +lo; + var p2width = BigInteger.pow(2, hi - lo); + var p2lo = BigInteger.pow(2, +lo); + var bits = this.quotient(p2lo).remainder(p2width); + var string = bits.toString(2); + var last = string.length - 1; + if (last < 1) + return this; + var revString = ""; + for (i = 0; i < string.length; i++) + revString += string[last - i]; + var reversed = BigInteger.parse(revString, 2); + return this.add(reversed.subtract(bits).multiply(p2lo)); + } + + function install() { + "use strict"; + var disp = plugins.get("Dispatch"); + var ExactInteger = plugins.get("ExactInteger"); + var debug = plugins.get("debug"); + var retThis = plugins.get("retThis"); + + disp.defClass("BigInteger", {ctor: BigInteger, base: "ExactInteger"}); + + // Have BigInteger rebuild its cache since its prototype changed. + BigInteger.init(); + + debug.def(BigInteger, BigInteger_debug); + + toBigInteger.def(BigInteger, retThis); + toBigInteger.def(ExactInteger, ExactInteger_toBigInteger); + + function def1(generic, func) { + plugins.get(generic).def(BigInteger, func); + } + function def2(generic, func) { + plugins.get(generic).def(BigInteger, BigInteger, func); + } + function defBigUnary(name) { + plugins.get(name).def(BigInteger, BigInteger.prototype[name]); + } + function defBigBinary(name) { + plugins.get(name).def(BigInteger, BigInteger, + BigInteger.prototype[name]); + } + + def2("expt", BigInteger_expt); + def1("numberToString", BigInteger_numberToString); + + defBigUnary("isZero"); + defBigUnary("isEven"); + defBigUnary("isOdd"); + defBigUnary("sign"); + defBigUnary("isUnit"); + defBigUnary("isPositive"); + defBigUnary("isNegative"); + defBigUnary("negate"); + defBigUnary("abs"); + defBigUnary("square"); + + defBigBinary("compare"); + defBigBinary("add"); + defBigBinary("subtract"); + defBigBinary("multiply"); + + def1("log", BigInteger_log); + def1("exp10", BigInteger_exp10); + def1("sqrt", BigInteger_sqrt); + def1("exactIntegerSqrt", BigInteger_exactIntegerSqrt); + def2("divAndMod", BigInteger_divAndMod); + def2("div", BigInteger_div); + def2("mod", BigInteger_mod); + def2("gcdNonnegative", BigInteger_gcdNonnegative); + + def2("bitwiseAnd", BigInteger_bitwiseAnd); + def2("bitwiseIor", BigInteger_bitwiseIor); + def2("bitwiseXor", BigInteger_bitwiseXor); + def1("bitCount", BigInteger_bitCount); + def1("bitLength", BigInteger_bitLength); + def1("firstBitSet", BigInteger_firstBitSet); + def1("isBitSet", BigInteger_isBitSet); + def1("copyBit", BigInteger_copyBit); + def1("bitField", BigInteger_bitField); + def2("copyBitField", BigInteger_copyBitField); + def1("bitShift", BigInteger_bitShift); + def1("rotateBitField", BigInteger_rotateBitField); + def1("reverseBitField", BigInteger_reverseBitField); + } + + api.parseExactInteger = parseExactInteger; + api.nativeToExactInteger = nativeToExactInteger; + api.importExactInteger = toBigInteger; + api.install = install; + return api; +} + +/* + Function: defaultRationalFactory(plugins) +*/ +function defaultRationalFactory(plugins) { + "use strict"; + var ExactRational = plugins.get("ExactRational"); + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var api = g.Object.create(null); + + var Math_exp = g.Math.exp; + var _isNaN = g.isNaN; + var _isFinite = g.isFinite; + + var debug, retFalse, isUnit, numeratorAndDenominator, ZERO, ONE, TWO, makeRectangular, eq, compare, add, subtract, multiply, divide, negate, log, exp, isNegative, abs, sqrt, SN_isFinite, sign, div, expt, square, isZero, isPositive, isNegative, raiseDivisionByExactZero; + + debug = plugins.get("debug"); + retFalse = plugins.get("retFalse"); + isUnit = plugins.get("isUnit"); + numeratorAndDenominator = plugins.get("numeratorAndDenominator"); + ZERO = plugins.get("ZERO"); + ONE = plugins.get("ONE"); + TWO = plugins.get("TWO"); + makeRectangular = plugins.get("makeRectangular"); + eq = plugins.get("eq"); + compare = plugins.get("compare"); + add = plugins.get("add"); + subtract = plugins.get("subtract"); + multiply = plugins.get("multiply"); + divide = plugins.get("divide"); + negate = plugins.get("negate"); + log = plugins.get("log"); + exp = plugins.get("exp"); + isNegative = plugins.get("isNegative"); + abs = plugins.get("abs"); + sqrt = plugins.get("sqrt"); + SN_isFinite = plugins.get("SN_isFinite"); + sign = plugins.get("sign"); + div = plugins.get("div"); + expt = plugins.get("expt"); + square = plugins.get("square"); + isZero = plugins.get("isZero"); + isPositive = plugins.get("isPositive"); + isNegative = plugins.get("isNegative"); + raiseDivisionByExactZero = plugins.get("raiseDivisionByExactZero"); + + // Fraction: Exact rational as numerator (exact integer) and + // denominator (exact integer greater than one) with no factors in + // common. + + function Fraction(n, d) { + //assert(isInteger(n));assert(isExact(n)); + //assert(isInteger(d));assert(isExact(d)); + //assert(gt(d, ONE)); + //assert(eq(ONE,gcdNonnegative(abs(n),d))); + //assert(this instanceof Fraction); + this._n = n; + this._d = d; + } + Fraction.prototype = new ExactRational(); + + function Fraction_debug() { + return "Fraction(" + debug(this._n) + " / " + debug(this._d) + ")"; + } + + // Convert exact rational to approximate native number. + function Fraction_valueOf() { + var n = this._n; + var d = this._d; + var ret = n / d; + if (_isFinite(ret)) // (-)Infinity / Infinity would give NaN. + return ret; + + // Numerator or denominator fall outside the native range, but + // their quotient may lie within it. Use logarithms. + switch (sign(n)) { + case 1: return Math_exp(log(n) - log(d)); + case -1: return -Math_exp(log(negate(n)) - log(d)); + case 0: default: return 0; + } + } + + Fraction.prototype.valueOf = Fraction_valueOf; + + function Fraction_numerator() { return this._n; } + function Fraction_denominator() { return this._d; } + + function divideReducedNotByOne(n, d) { + return new Fraction(n, d); + } + function _divideReduced(n, d) { + return (isUnit(d) ? n : new Fraction(n, d)); + } + + var importRational = plugins.get("Dispatch").defGeneric("toFraction", 1); + + function Rational_toFraction() { + var nd = numeratorAndDenominator(this); + return _divideReduced(nd[0], nd[1]); + } + + function Fraction_numeratorAndDenominator() { + return [this._n, this._d]; + } + + function Fraction_eq(q) { + return eq(this._d, q._d) && + eq(this._n, q._n); + } + + function Fraction_compare(q) { + var signDiff = sign(this._n) - sign(q._n); + if (signDiff !== 0) + return (signDiff > 0 ? 1 : -1); + if (q._d === this._d) // cheap optimization, XXX could be eq(qd,td) + return compare(this._n, q._n); + return compare(multiply(this._n, q._d), multiply(this._d, q._n)); + } + function Fraction_compare_Integer(n) { + return compare(this._n, multiply(this._d, n)); + } + function Integer_compare_Fraction(q) { + return compare(multiply(this, q._d), q._n); + } + + function Fraction_sign() { + return sign(this._n); + } + function Fraction_isPositive() { + return isPositive(this._n); + } + function Fraction_isNegative() { + return isNegative(this._n); + } + function Fraction_negate() { + return divideReducedNotByOne(negate(this._n), this._d); + } + function Fraction_square() { + return divideReducedNotByOne(square(this._n), square(this._d)); + } + function Fraction_reciprocal() { + var n = this._n; + switch (sign(n)) { + case -1: return _divideReduced(negate(this._d), negate(n)); + case 1: return _divideReduced(this._d, n); + case 0: default: raiseDivisionByExactZero(); + } + } + + function Fraction_add(q) { + return divide(add(multiply(this._n, q._d), multiply(q._n, this._d)), + multiply(this._d, q._d)); + } + function Fraction_add_Integer(n) { + return divideReducedNotByOne( + add(this._n, multiply(n, this._d)), this._d); + } + function Integer_add_Fraction(q) { + return divideReducedNotByOne( + add(multiply(this, q._d), q._n), q._d); + } + + function Fraction_subtract(q) { + return divide(subtract(multiply(this._n, q._d), + multiply(q._n, this._d)), + multiply(this._d, q._d)); + } + function Fraction_subtract_Integer(n) { + return divideReducedNotByOne( + subtract(this._n, multiply(n, this._d)), this._d); + } + function Integer_subtract_Fraction(q) { + return divideReducedNotByOne( + subtract(multiply(this, q._d), q._n), q._d); + } + + function Fraction_multiply(q) { + return divide(multiply(this._n, q._n), multiply(this._d, q._d)); + } + function times_int(n, d, i) { + var nd = numeratorAndDenominator(divide(i, d)); + return _divideReduced(multiply(n, nd[0]), nd[1]); + } + function Fraction_multiply_Integer(i) { + return times_int(this._n, this._d, i); + } + function Integer_multiply_Fraction(q) { + return times_int(q._n, q._d, this); + } + + function Fraction_divide(q) { + return divide(multiply(this._n, q._d), multiply(this._d, q._n)); + } + function Fraction_divide_Integer(i) { + var nd = numeratorAndDenominator(divide(this._n, i)); + return new Fraction(nd[0], multiply(nd[1], this._d)); + } + function Integer_divide_Fraction(q) { + return divide(multiply(this, q._d), q._n); + } + + function Fraction_expt_EI(p) { + var n, d; + switch (sign(p)) { + case 0: return ONE; + case 1: + n = this._n; + d = this._d; + break; + case -1: default: + n = this._d; + d = this._n; + p = abs(p); + if (isNegative(d)) { + n = negate(n); + d = negate(d); + } + if (isUnit(d)) + return expt(n, p); + } + // Num and den are in lowest terms. + return divideReducedNotByOne(expt(n, p), expt(d, p)); + } + + function Fraction_sqrt() { + // This rational or its components may be too big for + // toInexact(), but its square root may not be. + var absN = abs(this._n); + var rootN = sqrt(absN), rootD = sqrt(this._d); + var ret; + if (SN_isFinite(rootN)) { + if (SN_isFinite(rootD)) + ret = divide(rootN, rootD); + else + ret = exp(subtract(log(rootN), divide(log(this._d), TWO))); + } + else { + ret = exp(subtract(divide(log(absN), TWO), + SN_isFinite(rootD) ? log(rootD) + : divide(log(this._d), TWO))); + } + return (isNegative(this._n) ? makeRectangular(ZERO, ret) : ret); + } + function Fraction_log() { + return subtract(log(this._n), log(this._d)); + } + function Fraction_floor() { + return div(this._n, this._d); + } + + function install() { + var disp = plugins.get("Dispatch"); + var EI = plugins.get("ExactInteger"); + + disp.defClass("Fraction", {ctor: Fraction}); + + importRational.def(Fraction, plugins.get("retThis")); + importRational.def(ExactRational, Rational_toFraction); + + function def(name, type1, type2, func) { + plugins.get(name).def(type1, type2, func); + } + function def1(name, func) { + plugins.get(name).def(Fraction, func); + } + function def2(name, func) { + plugins.get(name).def(Fraction, Fraction, func); + } + + def1("debug", Fraction_debug); + def1("numerator", Fraction_numerator); + def1("denominator", Fraction_denominator); + def1("numeratorAndDenominator", Fraction_numeratorAndDenominator); + def1("isInteger", retFalse); + def2("eq", Fraction_eq); + def("eq", Fraction, EI, retFalse); + def("eq", EI, Fraction, retFalse); + def2("compare", Fraction_compare); + def("compare", Fraction, EI, Fraction_compare_Integer); + def("compare", EI, Fraction, Integer_compare_Fraction); + def1("sign", Fraction_sign); + def1("isPositive", Fraction_isPositive); + def1("isNegative", Fraction_isNegative); + def1("isZero", retFalse); + def1("isUnit", retFalse); + def1("floor", Fraction_floor); + def1("negate", Fraction_negate); + def1("square", Fraction_square); + def1("reciprocal", Fraction_reciprocal); + def2("add", Fraction_add); + def("add", Fraction, EI, Fraction_add_Integer); + def("add", EI, Fraction, Integer_add_Fraction); + def2("subtract", Fraction_subtract); + def("subtract", Fraction, EI, Fraction_subtract_Integer); + def("subtract", EI, Fraction, Integer_subtract_Fraction); + def2("multiply", Fraction_multiply); + def("multiply", Fraction, EI, Fraction_multiply_Integer); + def("multiply", EI, Fraction, Integer_multiply_Fraction); + def2("divide", Fraction_divide); + def("divide", Fraction, EI, Fraction_divide_Integer); + def("divide", EI, Fraction, Integer_divide_Fraction); + def("expt", Fraction, EI, Fraction_expt_EI); + def1("sqrt", Fraction_sqrt); + def1("log", Fraction_log); + } + + api.divideReducedNotByOne = divideReducedNotByOne; + api.divideReduced = _divideReduced; + api.importRational = importRational; + api.install = install; + return api; +} + +/* + Function: implementRectangular(plugins) +*/ +function implementRectangular(plugins) { + "use strict"; + var Real = plugins.get("Real"); + var Complex = plugins.get("Complex"); + var g = plugins.get("es5globals"); + var uncurry = plugins.get("uncurry"); + var api = g.Object.create(null); + + var debug, isZero, isUnit, isPositive, isExact, isInexact; + var toInexact, negate, multiply, cos, sin; + var ZERO, ONE, MINUS_ONE, INEXACT_ZERO; + + debug = plugins.get("debug"); + isZero = plugins.get("isZero"); + isUnit = plugins.get("isUnit"); + isPositive = plugins.get("isPositive"); + isExact = plugins.get("isExact"); + isInexact = plugins.get("isInexact"); + toInexact = plugins.get("toInexact"); + negate = plugins.get("negate"); + multiply = plugins.get("multiply"); + cos = plugins.get("cos"); + sin = plugins.get("sin"); + + function onPluginsChanged(plugins) { + ZERO = plugins.get("ZERO"); + ONE = plugins.get("ONE"); + MINUS_ONE = plugins.get("MINUS_ONE"); + INEXACT_ZERO = plugins.get("INEXACT_ZERO"); + } + plugins.onChange.subscribe(onPluginsChanged); + onPluginsChanged(plugins); + + function Rectangular(x, y) { + //assert(this instanceof Rectangular); + //assert(isReal(x)); + //assert(isReal(y)); + //assert(isExact(x) === isExact(y)); + //assert(!isExact(x) || !isZero(x)); + this._x = x; + this._y = y; + } + Rectangular.prototype = new Complex(); + + function Rectangular_realPart() { return this._x; } + function Rectangular_imagPart() { return this._y; } + + function Rectangular_conjugate() { + if (isExact(this._x)) + return exactRectangular(this._x, negate(this._y)); + return inexactRectangular(this._x, negate(this._y)); + } + + function Rectangular_debug() { + return "Rectangular(" + debug(this._x) + ", " + debug(this._y) + ")"; + } + + var I = new Rectangular(ZERO, ONE); + var MINUS_I = new Rectangular(ZERO, MINUS_ONE); + + /* + Function: exactRectangular(x, y) + This function behaves like the standard but + assumes both arguments are exact reals. + */ + function exactRectangular(x, y) { + //assert(isExact(x)); + //assert(isExact(y)); + if (isZero(y)) + return x; + if (isZero(x) && isUnit(y)) { + return isPositive(y) ? I : MINUS_I; + } + return new Rectangular(x, y); + } + + /* + Function: inexactRectangular(x, y) + This function behaves like the standard but + assumes both arguments are inexact reals. + */ + function inexactRectangular(x, y) { + //assert(!isExact(x)); + //assert(!isExact(y)); + return new Rectangular(x, y); + } + + /* + Function: inexactPolar(r, theta) + This function behaves like the standard but assumes + both its arguments are inexact and real. + */ + function inexactPolar(r, theta) { + return inexactRectangular( + multiply(cos(theta), r), multiply(sin(theta), r)); + } + + /* + Function: exactPolar(r, theta) + This function behaves like the standard but assumes + both its arguments are exact and real. + */ + function exactPolar(r, theta) { + // XXX Everybody seems to return inexact here, but I don't + // think it's allowed in cases like "#e1@1". + return inexactPolar(toInexact(r), toInexact(theta)); + } + + function Rectangular_isExact() { return isExact(this._x); } + function Rectangular_isInexact() { return isInexact(this._x); } + + api.Rectangular = Rectangular; + api.Rectangular_debug = Rectangular_debug; + api.Rectangular_realPart = Rectangular_realPart; + api.Rectangular_imagPart = Rectangular_imagPart; + api.Rectangular_conjugate = Rectangular_conjugate; + api.exactRectangular = exactRectangular; + api.inexactRectangular = inexactRectangular; + api.exactPolar = exactPolar; + api.inexactPolar = inexactPolar; + api.Rectangular_isExact = Rectangular_isExact; + api.Rectangular_isInexact = Rectangular_isInexact; + return api; +} + +function installRectangular(plugins) { + var Rectangular = plugins.get("Rectangular"); + + function def(generic, impl) { + var func = plugins.get(impl); + if (!func) { + console.log(impl + " is not defined"); + } + plugins.get(generic).def(Rectangular, func); + } + + def("isReal", "retFalse"); + def("isRational", "retFalse"); + def("isInteger", "retFalse"); + + function defRect(name) { + def(name, "Rectangular_" + name); + } + + defRect("realPart"); + defRect("imagPart"); + defRect("isExact"); + defRect("isInexact"); + defRect("conjugate"); +} + +function defaultIntegerFactory(plugins) { + // Grab the BigInteger library. + // XXX should avoid use of globals. + var BigInteger; + if (typeof require !== "undefined") + BigInteger = require("./biginteger").BigInteger; + else + BigInteger = this.BigInteger; + + if (!BigInteger) { + if (typeof load !== "undefined") + load("biginteger.js"); + else if (this.readFile) + eval(this.readFile("biginteger.js")); + else + throw new Error("BigInteger is not defined."); + } + return implementBigInteger(plugins, BigInteger); +} + +function configure(conf) { + + // Build the SchemeNumber object piece by piece. + + // XXX should probably provide a unique DispatchJs prefix. + var SchemeNumber = makeBase(); + var plugins = SchemeNumber.plugins; + var disp = plugins.get("Dispatch"); + var debug = plugins.get("debug") || {def: function(){}}; + + var integerFactory = conf.integerFactory || defaultIntegerFactory; + var rationalFactory = conf.rationalFactory || defaultRationalFactory; + //integerFactory = require('./lib/leemonBigInt').leemonBigIntFactory; + + var Integers = integerFactory(plugins); + Integers.install(); + plugins.extend( + "nativeToExactInteger", Integers.nativeToExactInteger, + "parseExactInteger", Integers.parseExactInteger + ); + installDefaultExactInteger(plugins, Integers.importExactInteger); + + var Rationals = rationalFactory(plugins); + Rationals.install(); + plugins.extend( + "divideReducedNotByOne", Rationals.divideReducedNotByOne + ); + installDefaultRational(plugins, Rationals.importRational, + Rationals.divideReduced); + + // XXX This could use some refactoring. + + var Rectangulars = implementRectangular(plugins); + var Rectangular = Rectangulars.Rectangular; + plugins.extend(Rectangulars); + disp.defClass("Rectangular", {ctor: Rectangular}); + debug.def(Rectangular, Rectangulars.Rectangular_debug); + installRectangular(plugins); + + var Flonums = implementNativeInexactReal(plugins); + var Flonum = Flonums.NativeInexactReal; + plugins.extend("Flonum", Flonum); + plugins.extend(Flonums); + plugins.extend(implementNativeFlonumLibrary(plugins)); + disp.defClass("NativeInexactReal", {ctor: Flonum}); + debug.def(Flonum, Flonums.NativeInexactReal_debug); + installFlonum(plugins); + + // XXX TO DO + + return SchemeNumber; +} + +var SchemeNumber = configure({}); +SchemeNumber.configure = configure; +return SchemeNumber; +})(); + +if (typeof exports !== "undefined") { + exports.SchemeNumber = SchemeNumber; +} + +// load for testing: +// var sn=require("./schemeNumber").SchemeNumber;fn=sn.fn;ns=fn["number->string"];debug=sn.plugins.get("debug");1 +// load("biginteger.js");load("schemeNumber.js");sn=SchemeNumber;fn=sn.fn;ns=fn["number->string"];debug=sn.plugins.get("debug");1 diff --git a/elements/pl-snap/Snap/libraries/serial_module.xml b/elements/pl-snap/Snap/libraries/serial_module.xml new file mode 100644 index 00000000..83322b05 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/serial_module.xml @@ -0,0 +1 @@ +
1152009600 19200 38400 57600 115200
Close port.
port
port
Write to the port a list containing numbers
port
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/signada.js b/elements/pl-snap/Snap/libraries/signada.js new file mode 100644 index 00000000..17cc0ce1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/signada.js @@ -0,0 +1,162 @@ +/* Signada - a network remote control procotol + * =========================================== + * By Bernat Romagosa, August 2021 + * + * Enables Snap! to talk to wifi-enabled + * MicroBlocks devices. + * + * This protocol was designed for the Citilab + * ED1 microcontroller board, but it can be + * used for any ESP32 board that has a display + * and two buttons, like the M5Stack. + * + * First, load the Signada example project + * from the MicroBlocks IDE and follow the + * instructions on the long comment in that + * project. + * + * Get MicroBlocks at https://microblocks.fun + */ + +SnapExtensions.primitives.set( + 'sgd_connect(ip)', + function (ip) { + if (location.protocol.indexOf('https') > -1) { + throw new Error( + 'Signada requires an HTTP only instance of Snap!, like:\n' + + 'http://extensions.snap.berkeley.edu' + ); + } + var socket = new WebSocket('ws://' + ip + ':81'), + stage = this.parentThatIsA(StageMorph), + cache; + stage.signada = {}; + stage.signada.ip = ip; + stage.signada.socket = socket; + stage.signada.responses = {}; + stage.signada.responseCache = {}; + stage.signada.lastID = 0; + stage.signada.eventListener = function (event) { + response = JSON.parse(event.data); + if (Array.isArray(response[1])) { + response[1] = new List(response[1]); + } + stage.signada.responses[response[0]] = response[1]; + + // Cache the response for when hat blocks + cache = Object.values(stage.signada.responseCache).find( + each => each.requestID === response[0] + ); + if (cache) { + cache.value = response[1]; + cache.updating = false; + } + }; + + socket.addEventListener('message', stage.signada.eventListener); + } +); + +SnapExtensions.primitives.set( + 'sgd_disconnect()', + function () { + var stage = this.parentThatIsA(StageMorph); + if (SnapExtensions.primitives.get('sgd_connected()').call(this)) { + stage.signada.socket.removeEventListener( + 'message', + stage.signada.eventListener + ); + stage.signada.socket.close(); + } + } +); + +SnapExtensions.primitives.set( + 'sgd_connected()', + function () { + var signada = this.parentThatIsA(StageMorph).signada; + return (signada !== undefined) && (signada.socket.readyState === 1); + } +); + +SnapExtensions.primitives.set( + 'sgd_call(blockname, params, defaultresponse)', + function (blockname, params, defaultresponse, proc) { + var signada = this.parentThatIsA(StageMorph).signada, + hatBlock = proc.topBlock.parentThatIsA(HatBlockMorph), + needsCaching = !isNil(hatBlock) && + (hatBlock.selector === 'receiveCondition'), + updatingCache = (signada.responseCache[blockname]?.updating), + defaultresponse = + (defaultresponse === undefined) ? 0 : defaultresponse; + + if (!SnapExtensions.primitives.get('sgd_connected()').call(this)) { + throw new Error( + 'You are not connected to any device.\n' + + 'Please use the connect block to establish a connection and' + + 'try again.' + ); + } + + if (!proc.requestID) { + if (!needsCaching || !updatingCache) { + proc.startTime = new Date(); + proc.requestID = signada.lastID; + + // Cache responses for reporters inside when hat blocks + if (signada.responseCache[blockname]) { + // Let's mark the cached response as updating so we don't + // request it again until we get a response from the device + signada.responseCache[blockname].updating = true; + signada.responseCache[blockname].requestID = proc.requestID; + signada.responseCache[blockname].requestTime = + (new Date()).getTime(); + } else { + // Never sent a similar request before. Let's give it a + // default value. + signada.responseCache[blockname] = { + requestID: proc.requestID, + updating: true, + value: defaultresponse, + requestTime: (new Date()).getTime() + }; + } + + signada.socket.send( + JSON.stringify([signada.lastID, blockname, params.contents]) + ); + + // Last ID wraps at 1.000.000 to make sure it doesn't grow too + // much and doesn't wrap too early + signada.lastID = (signada.lastID + 1) % 1000000; + } + } else { + if (signada.responses[proc.requestID] !== undefined) { + var response = signada.responses[proc.requestID]; + proc.requestID = null; + return response; + } else if ((new Date() - proc.startTime) > 1000) { + // Timeout after 1 second. Return last cached value + proc.requestID = null; + signada.responseCache[blockname].updating = false; + return signada.responseCache[blockname].value; + } + } + + if (needsCaching) { + // This reporter needs caching. Let's return the last value for this + // particular block name. + if (updatingCache && + (((new Date()).getTime() - + signada.responseCache[blockname].requestTime) > 250)) { + // We've been waiting for the cache to update for a long time. + // Let's invalidate it so the value is requested again. + signada.responseCache[blockname].updating = false; + } + return signada.responseCache[blockname].value; + } + + proc.pushContext('doYield'); + proc.pushContext(); + } +); diff --git a/elements/pl-snap/Snap/libraries/signada.xml b/elements/pl-snap/Snap/libraries/signada.xml new file mode 100644 index 00000000..c2523c26 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/signada.xml @@ -0,0 +1 @@ +
ca:🤖 connecta't a _ 192.168.4.1
ca:🤖 desconnecta't
ca:🤖 connectat
ca:toca la nota _ a l'octava _ durant _ ms CC C# D D# E F F# G G# A A# B11 2 3 4 5100
ca:botó _ 🆗 ❌ ➡️ ⬆️ ⬇️ ⬅️
ca:dibuixa a la pantalla _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ falsefalsefalsefalsefalsefalsetruefalsetruefalsefalsefalsefalsefalsefalsetruefalsefalsefalsetruefalsetruetruetruefalse
ca:mou motor _ _ passos _ 1128clockwiseclockwise counter-clockwise
ca:mou motor 1 en _ motor 2 en _ _ passos clockwiseclockwise counter-clockwisecounter-clockwiseclockwise counter-clockwise64
ca:mou motor _ angle _ ° 1-90
ca:mou motor _ _ voltes completes 13
ca:escriu _ a x: _ y: _ color _ escala _ Hello, MicroBlocks!1030🔵🔵 🟢 ​🔴 ​🟣 ​🟡 ​⚪️1
ca:neteja pantalla
ca:posa el LED x: _ y: _ a _ 33true
ca:mostra caràcter _ A
ca:posa el pin digital _ a _ 1true
ca:posa el pin analògic _ a _ 1512
ca:llegeix el pin digital _
ca:llegeix el pin analògic _
ca:inclinació _ xx y z
memoized response,calling
ca:acceleració
ca:nivell de llum
ca:temperatura °C
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/speech_module.xml b/elements/pl-snap/Snap/libraries/speech_module.xml new file mode 100644 index 00000000..352407f1 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/speech_module.xml @@ -0,0 +1 @@ +
de:sprich _ mit _ Aussprache _ und Höhe _ Geschwindigkeit _ pt:fala _ na língua _ _ com tom _ e velocidade _ ca:digues _ amb accent _ _ to _ i velocitat _ Hello, World!en-USالعربية=ar Български=bg বাংলা=bn Català=ca Català - Valencià=ca-VA Česky=cs Deutsch=de Dansk=dk Ελληνικά=el English-American=en-US English-British=en-GB Esperanto=eo Español=es Eesti=et Euskara=eu suomi=fi Français=fr Galego=gl Hrvatski=hr Magyar=hu Interlingua=ia Bahasa Indonesia=id Italiano=it 日本語=ja にほんご=ja-HIRA ಕನ್ನಡ=kn 한국어=ko Malayalam=ml Nederlands=nl Norsk=no Polski=pl Português=pt Português do Brasil=pt-BR Român=ro Русский=ru Slovenščina=si svenska=sv Tamil=ta Telagu=te Türkçe=tr Українська=ua 简体中文=zh-CN 繁體中文=zh-TW11
de:sprich _ mit _ Aussprache _ und Höhe _ Geschwindigkeit _ und warte pt:fala _ na língua _ _ com tom _ e velocidade _ , e espera ca:digues _ amb accent _ _ to _ velocitat _ i espera Hello, World!en-USالعربية=ar Български=bg বাংলা=bn Català=ca Català - Valencià=ca-VA Česky=cs Deutsch=de Dansk=dk Ελληνικά=el English-American=en-US English-British=en-GB Esperanto=eo Español=es Eesti=et Euskara=eu suomi=fi Français=fr Galego=gl Hrvatski=hr Magyar=hu Interlingua=ia Bahasa Indonesia=id Italiano=it 日本語=ja にほんご=ja-HIRA ಕನ್ನಡ=kn 한국어=ko Malayalam=ml Nederlands=nl Norsk=no Polski=pl Português=pt Português do Brasil=pt-BR Român=ro Русский=ru Slovenščina=si svenska=sv Tamil=ta Telagu=te Türkçe=tr Українська=ua 简体中文=zh-CN 繁體中文=zh-TW11
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/stream-tools.xml b/elements/pl-snap/Snap/libraries/stream-tools.xml new file mode 100644 index 00000000..9dcbfeee --- /dev/null +++ b/elements/pl-snap/Snap/libraries/stream-tools.xml @@ -0,0 +1 @@ +The stream version of IN FRONT OF. Streams, also called lazy lists, are like lists except that items are not computed until they're needed. This allows for more efficient handling of large computed lists, and even infinite lists. The only piece of magic is here in IN FRONT OF STREAM, whose second input is of type Unevaluated, which means that it's a procedure, with a sort of invisible gray ring. So HEAD OF STREAM is just ITEM 1 OF, but TAIL OF STREAM has a CALL block to make the computation happen. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:a prefixação de _ ao canal _
The stream version of ITEM 1 OF. Streams, also called lazy lists, are like lists except that items are not computed until they're needed. This allows for more efficient handling of large computed lists, and even infinite lists. The only piece of magic is in IN FRONT OF STREAM, whose second input is of type Unevaluated, which means that it's a procedure, with a sort of invisible gray ring. So HEAD OF STREAM is just ITEM 1 OF, but TAIL OF STREAM has a CALL block to make the computation happen. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:o primeiro item do canal _
The stream version of ALL BUT FIRST OF. Streams, also called lazy lists, are like lists except that items are not computed until they're needed. This allows for more efficient handling of large computed lists, and even infinite lists. The only piece of magic is in IN FRONT OF STREAM, whose second input is of type Unevaluated, which means that it's a procedure, with a sort of invisible gray ring. So HEAD OF STREAM is just ITEM 1 OF, but TAIL OF STREAM has a CALL block to make the computation happen. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:um canal com todos os itens de _ menos o primeiro 423true4
The stream version of variadic MAP (any number of input lists, like MULTIMAP in the list utilities library). Streams, also called lazy lists, are like lists except that items are not computed until they're needed. This allows for more efficient handling of large computed lists, and even infinite lists. The only piece of magic is in IN FRONT OF STREAM, whose second input is of type Unevaluated, which means that it's a procedure, with a sort of invisible gray ring. So HEAD OF STREAM is just ITEM 1 OF, but TAIL OF STREAM has a CALL block to make the computation happen. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:a aplicação de _ aos itens dos canais _
The stream version of KEEP. Streams, also called lazy lists, are like lists except that items are not computed until they're needed. This allows for more efficient handling of large computed lists, and even infinite lists. The only piece of magic is in IN FRONT OF STREAM, whose second input is of type Unevaluated, which means that it's a procedure, with a sort of invisible gray ring. So HEAD OF STREAM is just ITEM 1 OF, but TAIL OF STREAM has a CALL block to make the computation happen. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:os itens tais que _ do canal _
The inputs are a stream and a positive integer. SHOW STREAM reports a regular finite list of length less than (for short finite streams) or equal to the second input. It's useful because an infinite stream can't be displayed in a finite amount of time.
pt:uma lista com os itens do canal _ até ao _ º 1001
Make a stream from a finite collection of items, like the LIST primitive. Since this block is typically used for small amounts of data, it does not delay computation of its inputs.
pt:um canal com _ 1
Call this block with STREAM WITH NUMBERS FROM 2 as its input to get the infinite stream of all the prime numbers. It's called SIEVE because the algorithm it uses is the Sieve of Eratosthenes (clickable link): https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes Look inside; it's a beautifully elegant algorithm. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:a crivagem do canal _
The stream version of NUMBERS FROM 1 TO, with no ending number because it reports the infinite stream of all the integers greater than or equal to its input. Read the code! It's deceptively simple. Streams, also called lazy lists, are like lists except that items are not computed until they're needed. This allows for more efficient handling of large computed lists, and even infinite lists. The only piece of magic is in IN FRONT OF STREAM, whose second input is of type Unevaluated, which means that it's a procedure, with a sort of invisible gray ring. So HEAD OF STREAM is just ITEM 1 OF, but TAIL OF STREAM has a CALL block to make the computation happen. For a tutorial introduction to streams, read SICP 3.5: https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5 or Brian's lecture notes (start on page 74): https://people.eecs.berkeley.edu/~bh/61a-pages/Volume2/notes.pdf The above are clickable links!
pt:um canal com os números a partir de _ 1
Read the code while running it,
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/strings.xml b/elements/pl-snap/Snap/libraries/strings.xml new file mode 100644 index 00000000..a6c2a428 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/strings.xml @@ -0,0 +1 @@ +
pt:o texto multilinha _ ca:multilínia _
Reports the part of the first string up to the first instance of the second string inside it. If the second string isn't found, reports the entire first string.
pt:o texto de _ antes de _ ca:part del text _ anterior a _
Reports the portion of the first input string starting after the first occurrence of the second string. If the second string isn't found in the first string, reports an empty string.
pt:o texto de _ depois de _ ca:part del text _ posterior a _
Reports the character position (starting from 1) of the beginning of the first input string inside the second input string. If it's not found, reports 0.
pt:a posição de _ em _ ca:posició de _ en _
Reports the portion of the first input (string) starting at the position given by the second input (counting from 1, like LETTER n OF) and ending at the position given by the third input (also counting from 1). If the third input is empty, reports the portion from the first position to the end of the string. If a position number is negative, counts from the end backward, so -1 is the last character, -2 is the next to last, etc.
pt:o texto de _ entre as posições _ e _ , inclusive ca:part del text _ des de la posició _ fins _
Reports True if the first input string contains the second input string, otherwise false. Comparison is case-independent by default; use USE CASE-INDEPENDENT COMPARISONS to change that.
pt:o texto de _ antes de _ ca:text _ conté _ ?
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/textCostumes_module.xml b/elements/pl-snap/Snap/libraries/textCostumes_module.xml new file mode 100644 index 00000000..fe3886d2 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/textCostumes_module.xml @@ -0,0 +1 @@ +
de:Kostüm aus Text _ Größe _ pt:um traje com o texto _ de tamanho _ ca:vestit amb el text _ i mida _ A72
§_costumesMenu2002Use this block to make "clickable" buttons:
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/tiles_module.xml b/elements/pl-snap/Snap/libraries/tiles_module.xml new file mode 100644 index 00000000..835d7fa3 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/tiles_module.xml @@ -0,0 +1 @@ +Divide the stage into a grid of square regions with the given side length and perform an action at the center of each.
de:für jede Kachel der Größe _ _ 20
Divide the stage into a grid of same-sized rectangles specified by the number of columns and rows and perform an action at the center of each.
de:für jede Zelle _ im Raster _ _ zu _ _ _ 2015
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/try-catch.xml b/elements/pl-snap/Snap/libraries/try-catch.xml new file mode 100644 index 00000000..efb6431b --- /dev/null +++ b/elements/pl-snap/Snap/libraries/try-catch.xml @@ -0,0 +1 @@ +Catch errors. Runs the first script. If it succeeds, nothing else happens. But if it has an error (something that would otherwise result in a red halo around the block), then the second script is run, with the text of the error message that would have been shown in the variable ERROR.
pt:tenta executar _ e, em caso de erro _ , executa _ ca:prova de forma segura _ i si _ _
Throw an error. Makes a red halo appear around the script that runs it, with the input text shown in a speech balloon next to the script, just like any Snap! error. This is useful to put in the second script of SAFELY TRY after some other instructions to undo the partial work of the first script.
pt:lança o erro _
Catch errors in a reporter. Evaluates its first input. If that expression successfully reports a value, this block reports that value. If the expression causes a Snap! error, then the final input slot is evaluated with the text of what would have been the error message in variable ERROR. SAFELY TRY then reports the value of that final expression. Sometimes you'll want to throw an error in the final expression. You can put an ERROR block inside a CALL block to do that.
ca:prova de forma segura reportant _ i si _ reportant _ err
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/word-sentence.xml b/elements/pl-snap/Snap/libraries/word-sentence.xml new file mode 100644 index 00000000..551582d8 --- /dev/null +++ b/elements/pl-snap/Snap/libraries/word-sentence.xml @@ -0,0 +1 @@ +Takes a text string as input, and reports a new text string containing all but the first character of the input.
pt:_ sem o primeiro caractere ca:_ sense la primera lletra es:todos menos la primera letra de _ All but first of empty word.
Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing all but the first word, with one space between words and no spaces at the beginning or end. (Note: consider using SENTENCE➞LIST and processing the resulting list instead of doing recursion on sentences in text string form. List operations are faster.)
pt:_ sem a primeira palavra ca:_ sense la primera paraula es:todas menos la primera palabra de _ All but first of empty sentence.
Takes a text string as input, and reports a new text string containing all but the last letter of the input.
pt:_ sem o último caractere ca:_ sense la darrera lletra es:todos menos la última letra de _ All but first of empty word.
Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing all but the last word, with one space between words and no spaces at the beginning or end. (Note: consider using SENTENCE->LIST and processing the resulting list instead of doing recursion on sentences in text string form. List operations are faster.)
pt:_ sem a última palavra ca:_ sense la darrera paraula es:todos menos la última palabra de _ All but last of empty sentence.
Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing only the first word, with no spaces before or after it.
pt:a primeira palavra de _ ca:primera paraula de _ es:primera palabra de _
Takes a text string as input, and reports the last character in the string.
pt:o último caractere de _ ca:primera lletra de _ es:última letra de _ 0
Takes a text string as input, divides it into words treating one or more spaces as a word separator (only spaces count; punctuation is part of the word) and reports a text string containing only the last word of the input, with no spaces before or after it.
pt:a última palavra de _ ca:darrera paraula de _ es:última palabra de _ Last of empty sentence.
Takes a text string as input, and reports TRUE if the string has no characters in it of any kind, otherwise false.
pt:a palavra _ está vazia ca:paraula buida? _ es:¿palabra vacía? _ 0
Takes a text string as input, and reports TRUE if the input contains no characters other than spaces (therefore, no words when the string is considered as a sentence), otherwise FALSE.
pt:a frase _ está vazia ca:frase buida? _ es:¿oración vacía? _
Like JOIN, takes any number of words (text strings) and reports a sentence with its inputs concatenated, but inserts a blank space between the inputs. Consider using SENTENCE (Lists palette) instead.
de:füge Wörter zusammen _ ca:uneix les paraules _ es:unir las palabras _ fr:fusionne les mots _ pt:uma frase com as palavras _ firstbffirst111bf
Takes a sentence in list form and reports the sentence as a text string.
de:Liste $arrowRight Satz _ ca:llista $arrowRight frase _ es:lista $arrowRight frase _ fr:liste $arrowRight phrase _ pt:uma frase com as palavras em _
Takes a sentence in text string form and reports the sentence as a list of its words.
de:Satz $arrowRight Liste _ ca:frase $arrowRight llista _ es:frase $arrowRight lista _ fr:phrase $arrowRight liste _ pt:uma lista com as palavras da frase _
report a list in which each item is one letter from the input word
de:Wort $arrowRight Liste _ ca:paraula $arrowRight llista _ es:palabra $arrowRight lista _ fr:mot $arrowRight liste _ pt:uma lista com os caracteres da palavra _
join all the items of the input list into a single word, and report it
de:Liste $arrowRight Wort _ ca:llista $arrowRight paraula _ es:lista $arrowRight palabra _ fr:liste $arrowRight mot _ pt:uma palavra com os caracteres em _
SENTENCE is the main constructor for sentences, represented as lists of words. It takes zero or more inputs, each of which can be either a list or a text string. If a list, the input is assumed to be a list of words. If a text string, it is converted to a list of words using SENTENCE→LIST. Then all the lists of words are appended to form a new list of words. If the inputs are lists of lists rather than lists of words, SENTENCE, like APPEND, does only one level of flattening, reporting a list of all the items of all the input lists.
ca:frase _ es:oración _
pt:lança o erro _
Takes a (possibly deep) list as input, and reports a human-readable text form of the list (namely, Lisp notation).
ca:notació textual de _ es:imprimible _ ( )
Helper function for word/sentence library. Reports its first input, unless that input is empty, in which case it gives its second input as an error message.
es:requerir no vacío _ _
Takes a text string as input, and reports the first character in the string.
pt:a primeira palavra de _ ca:primera lletra de _ es:primera letra de _
\ No newline at end of file diff --git a/elements/pl-snap/Snap/libraries/words_module.xml b/elements/pl-snap/Snap/libraries/words_module.xml new file mode 100644 index 00000000..9bef2aba --- /dev/null +++ b/elements/pl-snap/Snap/libraries/words_module.xml @@ -0,0 +1 @@ +
de:erstes Wort von _ this is fine
de:alles außer dem ersten Wort von _ this is fine
de:Satz aus _
de:ist _ leer? word
\ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ar.js b/elements/pl-snap/Snap/locale/lang-ar.js new file mode 100644 index 00000000..d321ce14 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ar.js @@ -0,0 +1,1389 @@ +SnapTranslator.dict.ar = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) يسار", + "(0) up": "(0) اعلي", + "(1) sine": "", + "(180) down": "(180) اسفل", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) يمين", + "(empty)": "(فارغ)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "عن Snap", + "About...": "عن SNAP!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "مؤثرات حركية", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "أي نوع (خام لم يُقَيَّم)", + "Any type": "اي نوع", + "Apply": "طبق", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "هل انت متأكد من رغبتك في الحذف?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "للخلف...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "محرر البلوكات", + "Blocks": "بلوكات", + "Blocks category name:": "", + "Blurred shadows": "ظلال شبه شفافة", + "Boolean": "منطقي", + "Boolean (T/F)": "منطقي (W/F)", + "Boolean (unevaluated)": "منطقي (خام لم يُقَيَّم)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "حجم الفرشـاة", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "الغاء الامر", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "تغيير البلوك", + "Clear backup": "", + "Clicking sound": "المؤثرات الصوتية", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "مساعد التكويد", + "Colors and Crayons": "", + "Command": "امر", + "Command (C-shape)": "لبنة هلالية الشكل", + "Command (inline)": "لبنة مستطيلة الشكل", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "تأمين نسبة الأرتفاع الي العرض? (يمكنك ايضا استخدام مفتاح Shift)", + "Contents": "محتويات", + "Contributors": "المساهمون", + "Control": "التحكم", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "محرر المظاهر", + "Costumes": "المظاهر", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "إنشاء تسمية لمُدخَل جديد", + "Create variables": "", + "Create variables in program": "", + "Credits...": "الاشارات...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "افتراضى", + "Default Value:": "القيمة الافتراضية:", + "Delete": "حذف", + "Delete Custom Block": "حذف بلوك مخصص", + "Delete Project": "حذف مشروع", + "Delete a variable": "احذف متغيرا", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "تنزيل البرنامج", + "Dragging threshold...": "", + "Dynamic input labels": "بطاقات الادخال الديناميكية", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "تعديل تسمية مُدخَل", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "فارغ", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "اداة الممحاة", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "تصدير البلوكات", + "Export blocks...": "تصدير اللبنات...", + "Export project as plain text...": "تصدير المشروع كمستند نصي ...", + "Export project...": "تصدير المشروع...", + "Export summary with drop-shadows...": "", + "Export summary...": "تصدير ملخص المشروع...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "أداة الملئ بالون", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "أداة رسم شكل بيضاوى ممتلئ بلون محدد", + "Filled Rectangle (shift: square)": "أداة رسم مستطيل ممتلئ بالون محدد", + "First-Class Sprites": "", + "Flat design": "تصميم مُصطَّح بسيط", + "Flat line ends": "نهايات الخطوط", + "For all Sprites": "لكل الكائنات", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "!مـرحبـا", + "Hello, World!": "", + "Help": "مساعده", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "هممم...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "استيراد البلوكات", + "Import library": "استيراد مكتبة", + "Import sound": "", + "Import tools": "استيراد أدوات", + "Import...": "استيراد...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "توريث الخصائص بين الكائنات", + "Input Names:": "أسماء المدخلات", + "Input Slot Options": "", + "Input name": "أسم المُدخَل", + "Input sliders": "ألواح الأدخال", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "( _ ) { _ } جافاسكربت دالة", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "دعم لوحة المفاتيح", + "Kind of": "نوع من أنواع", + "LEAP Motion controller": "", + "Language...": "تغيير اللغة...", + "Libraries...": "المكتبات...", + "License": "الترخيص", + "License...": "الترخيص...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "اداة رسم الخط المستقيم رأسيا أو أفقيا", + "List": "لائحة", + "List utilities": "", + "Lists": "قوائم(مصفوفات)", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "تسجيل دخول...", + "Logout": "", + "Long form input dialog": "صندوق حوار تفصيلي لتعريف المدخلات", + "Looks": "المظهر", + "Make a block": "إنشاء لبنة مخصصة", + "Make a variable": "انشئ متغيرا", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "اسم الرسالة", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "البرمجه...", + "Motion": "الحركة", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "متعدد الادخالات (عبارة عن لائحة او مصفوفة من المدخلات)", + "Nested auto-wrapping": "", + "New": "جديد", + "New Category": "", + "New Project": "مشروع جديد", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "لا", + "November": "", + "Number": "رقم", + "OK": "موافق", + "Object": "كائن", + "October": "", + "Ok": "موافق", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "فتح مشروع", + "Open in Community Site": "", + "Open...": "فتح...", + "Opening project...": "", + "Operators": "العمليات", + "Other": "لبنات اضافيه", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "اداة الرسم الحر", + "Parallelization": "", + "Part of": "جزء من", + "Parts": "أجزاء", + "Password:": "", + "Pen": "القلم", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "أداة إلتقاط الألوان", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "تسميات عادية لنماذج البلوكات", + "Play": "شغل", + "Play sound": "شغل الصوت", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predicate اسنادات تأكيدية", + "Prefer empty slot drops": "", + "Prefer smooth animations": "الرسوم المتحركة على نحو سلس", + "Press CTRL+C one more time to effectively copy to clipboard.": "إضغط CTRL+C مرة أخري لتأكيد نسخ محتويات الحافظة.", + "Press CTRL+V one more time to effectively paste from clipboard.": "إضغط CTRL+V مرة أخري لتأكيد لصق محتويات الحافظة.", + "Press CTRL+X one more time to effectively cut to clipboard.": "إضغط CTRL+X مرة أخري لتأكيد لصق محتويات الحافظة.", + "Privacy...": "", + "Project Notes": "ملاحظات المشروع", + "Project URLs": "", + "Project notes...": "ملاحظات عن المشروع...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "دليل التشغيل", + "Remove a category...": "", + "Remove unused blocks": "حذف اللبنات المخصصة الغير مستخدمة", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "استبدال المشروع الحالي بأخر جديد?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Reporter مُقَرِرات", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "إعادة تعيين كلمة المرور", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "حفظ", + "Save As...": "حفظ بأسم ...", + "Save Project": "", + "Save Project As...": "حفظ المشروع باسم...", + "Save to disk": "حفظ في المستعرض", + "Saved!": "تم الحفظ!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "اسم الكائن", + "Scripts": "المقاطع البرمجيه", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "الاستشعار", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "ضبط مركز الدوران", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "تسجيل خروج...", + "Single input.": "ادخال مفرد.", + "Single palette": "", + "Slider maximum value": "القيمة العظمي لشريط التمرير", + "Slider minimum value": "القيمة الصغري لشريط التمرير", + "Snap! website": "الموقع الرسمي", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "الصوت", + "Sound Recorder": "", + "Sounds": "الاصوات", + "Sprite": "كائن", + "Sprite Nesting": "", + "Stage": "المنصة", + "Stage height": "ارتفاع المنصة", + "Stage selected: no motion primitives": "", + "Stage size": "", + "Stage size...": "مساحة المنصة...", + "Stage width": "عرض المنصة", + "Stop": "قف", + "Stop sound": "اوقف الصوت", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "اداة رسم الشكل البيضاوى", + "Stroked Rectangle (shift: square)": "اداة رسم المستطيل", + "Switch back to user mode": "التبديل الى وضع المستخدم", + "Switch to dev mode": "التبديل الي وضع المطورين", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "نص", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "تأمين الاسكربتات", + "Title text": "نص العنوان", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "المترجمون", + "Translators...": "المترجمون", + "Turbo mode": "الوضع السريع", + "Turtle": "السلحف", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "بدون عنوان", + "Unused blocks...": "لبنات غير مستخدمة...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - اجعل المتغيرات الداخلية مرئية بواسطة المُستَدعي", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "اسم المتغير", + "Variables": "المتغيرات", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "لوحة المفاتيح الافتراضية", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "نعم", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "تلوين ZEBRA", + "Zoom blocks": "حجم اللبنات", + "Zoom blocks...": "التحكم فى حجم اللبنات...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ محتويات ضمن _ القيمة", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ ادرج _ بداية في", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ للرقم _ علي القسمة باقي", + "_ of _": "؟ _ قيمة ما _ للكائن", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "_ القيمة _ في أَدْرِج", + "add a new Turtle sprite": "", + "add a new sprite": "اضافة كائن جديد", + "add comment": "اضافة تعليق", + "add comment here...": "اضف تعليق هنا", + "agent": "", + "alert _": "تنبيه: _", + "all": "الكل", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "الأول عـدا الكل أظهـِر _ في", + "all but this script": "كل_المقاطع_البرمجيه_للكائنات_عدا_هذا_المقطع", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "و", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "الاجابة", + "any": "", + "any key": "", + "any message": "اي رسالة", + "anything": "", + "append _": "", + "arrange scripts vertically": "محاذا اللبنات عموديا", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ اسأل و انتظر", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "كبير (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "هل تريد حقا حذف هذه الكتلة مع جميع النسخ منها", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "بنفسك", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "التوهج", + "broadcast _ _": "_ _ بث", + "broadcast _ _ and wait": "إنتظـر ثم _ _ بِـث", + "brush": "", + "build": "لَبِناتِك إصنع", + "but getting a": "", + "c": "c", + "call _ _": "إستدع _ _", + "call _ w/continuation": "استدع _ (الفاعلية استمرار بقاء مع)", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "قابل للدوران", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ المتغير قيمة _ بمقدار غيّـر", + "change _ effect by _": "_ التأثير قيمـة _ بمقدار غيّر", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "_ بمقدار القلم لون غيّـر", + "change pen shade by _": "_ بمقدار القلم لون (تعتيم/سطوع) درجة غيّر", + "change pen size by _": "_ بمقدار القلم حجـم غيّـر", + "change size by _": "_ بمقدار الحجم غيّـر", + "change tempo by _": "_ بمقـدار الصوت شـدّة غيّـر", + "change volume by _": "", + "change x by _": "_ بمقدار س غير", + "change y by _": "_ بمقدار ص غير", + "check for alternative GUI design": "", + "check for block to text mapping features": "حَدد لتفعيل مساعد التكويد", + "check for flat ends of lines": "حدد لجعل نهايات الخطوط قائمة الزاوية", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "حدد للحصول على حركة ناعمة", + "check for sprite inheritance features": "حدد لتفعيل توريث الخصائص بين الكائنات", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "حدد حتي تظهر دائما تصنيف بيانات الادخال في صندوق حوار تعريف المدخلات", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "حدد, لمنع الاسكربت من اعادة الدخول", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "حدد لتشغيل المؤثرات IDE- الحركية", + "check to enable alternating colors for nested blocks": "حدد لتفعيل اختيار الوان متبادلة للبلوكات المتداخلة", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "حدد لتفعيل بطاقات الادخال الديناميكية للمدخلات", + "check to enable input sliders for entry fields": "حدد لتفعيل الواح الادخال للحقول", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "حدد لتفعيل لوحة المفاتيح الافتراضية للاجهزة اللوحية", + "check to hide (+) symbols in block prototype labels": "حدد لأخفاء (+) من تسمسة نموذج البلوك", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "حدد لرفع درجة أولوية تنفيذ الاسكربت", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "حدد لتفعيل أصوات النقر على اللبنات", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "حدد لاستخدام الظلال الضبابية", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "محاذاة اللبنات", + "clear": "امسح", + "clear graphic effects": "الرسومية التأثيرات أحذف", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "انقر أو اسحب علامة المركز لنقل مركز دوران الكائن", + "clicked": "نقـر", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "؟ _ اللون ملامس _ اللون هل", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "كوميدي", + "command": "لبنات_اجرائية", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "تحول اللون", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "المظهر ( ترتيب / رقم )", + "costume name": "", + "costumes": "", + "costumes tab help": "استيراد الصور من الحاسوب او من الانترنت بسحب و افلات الملف هنا", + "could not connect to:": "", + "cr": "أكتب_ما_تريد", + "create a clone of _": "_ من أستنسـاخاً أنشئ", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "التاريخ الحالي _", + "current module versions:": "الاصدار الحالي", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "يوم", + "day of week": "ترتيب_اليوم_في_الاسبوع", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "حذف", + "delete _": "", + "delete _ of _": "_ العنصر احذف _ من", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "حذف تعريف البلوك", + "delete slot": "", + "delete this clone": "الإستنساخ هذا إحذف", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "تجريبي (1.2x)", + "demo...": "", + "detach all parts": "افصل كل الاجزاء", + "detach and put into the hand": "", + "detach from": "افصل عن", + "development mode": "وضع التصميم", + "development mode debugging primitives:": "نمط البرمجه و تصحيح الاخطاء", + "development mode...": "", + "dimensions": "", + "direction": "الاتجاه", + "disable deep-Morphic context menus and show user-friendly ones": "user-friendlyعرض القوائم", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ إلي المسـافة", + "distribution": "", + "don't rotate": "غير قابل للدوران", + "down arrow": "السهم السفلي", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "قابل للسحب", + "draggable?": "", + "dragging threshold": "", + "dropped": "الإفـلات_من", + "duplicate": "مضاعفة", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "الحافة", + "edit": "تحرير", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "تحرير...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "user-friendlyعرض القوائم تعطيل", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "تصدير", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "تصدير...", + "extract": "", + "f": "f", + "false": "خـطأً", + "file": "", + "file menu import hint": "استيراد مشروع تم تصديره من قبل", + "fill": "", + "fill page...": "", + "filtered for _": "خلال هذه الفتره _ gefiltert", + "find blocks": "", + "find blocks...": "البحث عن لبنة...", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "إيجاد اللبنات المخصصة الغير مستخدمة لحذفها من المشروع", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "إنعكاس ↔", + "flip ↕": "إنعكاس ↕", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "لجميع الكائنات", + "for each _ in _ _": "", + "for this sprite only": "لهذا الكائن فقط", + "forever _": "باستمرار كرر _", + "frame": "", + "frames": "", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "شبح", + "giant (8x)": "عملاق (8x)", + "glide _ secs to x: _ y: _": "ثوان _ خلال _ =س _ =ص النقطة إلي إنزلق", + "global?": "", + "globe": "", + "go back _ layers": "طبقات _ بمقدار الخلف الي انتقل", + "go to _": "_ الي إذهب", + "go to _ layer": "", + "go to front": "المقدمة الي إنتقل", + "go to x: _ y: _": "_ =س _ =ص للنقطة أذهب", + "gray scale palette": "", + "green": "", + "grow": "تكبير", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "مرحبا", + "help": "مساعدة", + "help...": "مساعدة...", + "hide": "إختَفي", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "أخفاء اللبنات", + "hide variable _": "_ المُتَغيّر أخفِ", + "high": "", + "hour": "ساعة", + "http:// _": "", + "hue": "", + "huge (4x)": "ضخم (4x)", + "i": "i", + "identical to": "مطابق ل", + "if _ _": "_ اذا _", + "if _ _ else _": "_ اذا _ وإلا _", + "if _ then _ else _": "", + "if on edge, bounce": "الحافة عند كنت إذا أرتد", + "import a sound from your computer by dragging it into here": "استيراد الاصوات من الحاسوب او من الانترنت بسحب و افلات الملف هنا", + "import without attempting to parse or format data": "", + "import...": "استيراد...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "قائمة المدخلات", + "input names:": "مع المدخلات", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "_ القيمة _ بالموضع _ في أَدْرِج", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ ?", + "is _ a _ ?": "_ يوافق _ النوع", + "is _ empty?": "", + "is _ identical to _ ?": "؟ _ مع متماثل _ هل", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ العنصر أظهـِر _ في", + "items": "", + "j": "j", + "join _": "_ يلي مـا أَوصـل", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "؟ مضغوط _ المفتاح هل", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "العربية", + "language_translator": "طارق جلال", + "large": "كبير", + "last": "الاخير", + "last changed": "", + "last_changed": "2016-01-23", + "launch _ _": "شغّل _ _", + "left": "", + "left arrow": "السهم الايسر", + "length": "", + "length of _": "_ عناصر عدد", + "length:": "الطول:", + "let the World automatically adjust to browser resizing": "", + "letter": "الحروف", + "letter _ of _": "_ الحرف أوجد _ العبارة من", + "light (70)": "", + "lightness": "", + "line": "علامات_الأسطر", + "lines": "", + "list": "مصفوفة", + "list _": "_ المصفوفة", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "تحميل مكتبة اللبنات الرسمية لمزيد من التحكم", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "أنشئ لَبِـنَة جديدة...", + "make a category...": "", + "make a copy and pick it up": "اصنع نسخة و التقطها", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "الرسالة", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "دقيقة", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "عملاق جدا (10x)", + "month": "شهر", + "mosaic": "", + "motion": "", + "mouse down?": "؟ مضغوط الايسر الفأرة زر هل", + "mouse position": "", + "mouse x": "للفأرة س الموضع", + "mouse y": "للفأرة ص الموضع", + "mouse-departed": "مغـادرة", + "mouse-entered": "دخـول", + "mouse-pointer": "مؤشر_الفأرة", + "move": "تحرك", + "move _ steps": "خطوة _ تحرك", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "نفسي", + "n": "n", + "name": "", + "neg": "", + "negative": "معكوس", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "جديد...", + "next": "", + "next costume": "التالي المظهر", + "none": "لا شيء", + "normal": "عادي", + "normal (1x)": "عادي (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "ليس _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "رقم", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "ضاعف هذا البلوك فقط", + "only face left/right": "مواجهة يمين-يسار", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "عرض ملخص المشروع فى نافذة مستعرض جديدة", + "open a new window with a picture of all scripts": "فتح نافذه جديده مع صورة لجميع الاسكربتات", + "open a new window with a picture of the stage": "فتح نافذه جديده مع لقطه من المسرح", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "افتح نافذه جديده و اعرض النص البرمجي خلالها", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "أو", + "or before": "", + "other clones": "", + "other scripts in sprite": "كل_المقاطع_البرمجية_للكائن_عدا_هذا_المقطع", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "_ مـؤقتاً التنفيذ أوقف", + "pen": "", + "pen _": "", + "pen down": "القلـم أنـزل", + "pen down?": "", + "pen trails": "اثار_القلم", + "pen up": "القلـم إرفـع", + "pen vectors": "", + "pic...": "الصورة المصدره...", + "pick random _ to _": "_ و _ بين عشوائي عدد إختر", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ رقـم النوتـة أعزف ، إيـقاع وحـدة _ بمقدار", + "play sound _": "_ الصـوت شغّـل", + "play sound _ at _ Hz": "", + "play sound _ until done": "أنتهـاءة إنتظر ثم _ الصـوت شغّـل", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ الاتجاه نحو إتجه", + "point towards _": "_ نحو إتجه", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "لبنات_تأكيدية", + "presentation (1.4x)": "استعراضي (1.4x)", + "pressed": "ضغـط", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "أي موضع", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "اعادة تسمية...", + "release": "", + "remove block variables...": "", + "rename": "اعادة تسمية", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "اعاده تسمية", + "rename only this reporter": "", + "rename sound": "اعد تسمية الصوت", + "rename...": "اعاده تسميه...", + "repeat _ _": "_ كرر _", + "repeat until _ _": "_ حتي كرر _", + "replace item _ of _ with _": "_ العنصر بدل _ المصفوفة في _ القيمة ضـع", + "report _": "_ وَضِّـح", + "reporter": "لبنات_تقريرية", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "المؤقت تعيين إعـادة", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "إقـاع وحدة _ لمدة إستـرح", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "السهم الايمن", + "ring": "", + "ringify": "احاطة", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "صحيح لعدد _ قَرّب", + "run _ _": "نفّذ _ _", + "run _ w/continuation": "نفّذ _ (الفاعلية استمرار بقاء مع)", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ قـل", + "say _ for _ secs": "_ قـل ثانية _ لمدة", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "صورة نقطية للبلوك...", + "script variables _": "_ مَحَلْي مُتَغَيِّر", + "scripts": "", + "scripts pic...": "تصوير لقطة من الاسكربت...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "ثانية", + "select": "حدد", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ التأثير لقيـمة _ المقدار حدد", + "set _ of block _ to _": "", + "set _ to _": "_ للمتغيّر _ القيمة خصص", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "_ لـ مسـاوياً القلم لون إجعل", + "set pen shade to _": "_ تساوي القلم لون (تعتيم/سطوع) درجة إجعل", + "set pen size to _": "_ لـ مساوياً (حجم/سُـمك)القلـم إجعل", + "set size to _ %": "% _ لـ مساوياً الحجم إجعل", + "set tempo to _ bpm": "_ مسـاوية الصوت شدّة إجعل", + "set this morph's alpha value": "", + "set turbo mode to _": "_ التوربو وضـع تفعيل", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "_ تساوي س إجعل", + "set y to _": "_ تساوي ص إجعل", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "إظهَر", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "إظهار الكل", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "عرض جميع اللبنات المخصصة في صيغة XML", + "show primitives": "إظهار اللبنات", + "show project data as XML in a new browser window": "عرض المشروع في صيغة XML", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ المُتَغيّر أظهـِر", + "shown?": "", + "shrink": "تصغير", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "الحجم", + "slider": "شريط التمرير", + "slider max...": "اقصي حد...", + "slider min...": "ادني حد...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "المسافه", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "_ جـَزَّء ،كفواصل _ بإستخدام", + "sprite": "", + "sprites": "", + "sqrt": "الجذر التربيعي", + "square": "", + "stack size": "", + "stage": "", + "stage image": "", + "stamp": "اطبع", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "_ اوقف", + "stop all sounds": "الأصوات جميع أوقف", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "حفظ المشروع فى مجلد التنزيلات الخاص بالمتصفح المحدد", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "_ المظهر إلي إنتقل", + "switch to scene _ _": "", + "t": "t", + "tab": "المسافات_البادئة", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "الصوت شدّة مقـدار", + "temporary?": "", + "text": "نص", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "لايوجد لبنات مخصصة غير مستخدمة في هذا المشروع", + "there are currently no vectorizable pen trail segments": "", + "thing": "شيئ", + "think _": "_ فكـر", + "think _ for _ secs": "_ فكر ثانية _ لمدة", + "this _": "", + "this block": "هذا_البلوك", + "this project doesn't have any custom global blocks yet": "هذا المشروع لا يحتوى علي بلوكات مخصصة", + "this script": "هذا_المقطع_البرمجي", + "time in milliseconds": "ملي_ثانية", + "timer": "المؤقت", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "؟ _ لـ ملامس هـل", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "tarekgalal46@hotmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "صحيح", + "turbo mode": "", + "turbo mode?": "؟ التوربو وضع في التشغيل هل", + "turn _ _ degrees": "درجة _ _ استدر", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "من نوع _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "أزل للحصول علي سرعه اعلي مع معدلات تتبابع اطارات متغيره", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "أزل لجعل نهايات الخطوط دائرية", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "", + "uncheck to allow script reentrance": "أزل للسماح للاسكربت باعادة الدخول", + "uncheck to always show (+) symbols in block prototype labels": "ازل التحديد لاظهار (+) في تسمسة نموذج البلوك", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "أزل لابطال مؤثرات IDE- الحركة", + "uncheck to disable alternating colors for nested block": "ازل لعدم لتفعيل اختيار الوان متبادلة للبلوكات المتداخلة", + "uncheck to disable block to text mapping features": "أزل التحديد لألغاء مساعد التكويد", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "ازل لالغاء تفعيل بطاقات الادخال الديناميكية للمدخلات", + "uncheck to disable input sliders for entry fields": "أزل لالغاء الواح الادخال للحقول", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "أزل لألغاء تفعيل توريث الخصائص بين الكائنات", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "ازل لالغاء تفعيل لوحة المفاتيح الافتراضية للاجهزة اللوحية", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "أزل, ليتم تنفيذ الاسكربت بالسرعة العادية", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "أزل لإيقاف أصوات النقر على اللبنات", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "ازل لاستخدام الظلال المعتمة", + "uncheck to use the input dialog in short form": "ازل التحديد لاستخدام صندوق الحوار المبسط لتعريف المدخلات", + "uncompile": "", + "undo": "تراجع", + "undo the last block drop in this pane": "تراجع عن الافلات الاخير للبلوك", + "undrop": "تراجع عن الافلات", + "unicode _ as letter": "_ يونيكود لترميز المقابل الحرف", + "unicode of _": "_ للحرف يونيكود ترميز قيمة", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "عدم احاطة", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "بدون عنوان", + "unused": "", + "unused block(s) removed": "تم ازالة اللبنات الغير مستخدمة", + "up arrow": "السهم العلوي", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ لـ إنتظـر", + "wait until _": "_ الشرط يتحقق حتي إنتظر", + "wardrobe": "", + "warp _": "تسريع _", + "what's your name?": "؟ إسمك هـو مـا", + "when I am _": "الفـأرة مـؤشْـر _ لـ أتعرض عندما", + "when I receive _ _": "_ _ رسـالة أستقبال عند", + "when I start as a clone": "مطابقة كنسخةٌ أبدأ عندما", + "when _": "_ عندما", + "when _ clicked": "الأخضر العـَلم _ نقر عنـد", + "when _ is edited _": "", + "when _ key pressed _": "_ _ مفتـاح ضغط عند", + "whirl": "", + "whitespace": "الفراغات_البينية", + "width": "", + "with data": "", + "with inputs": "مستخدماً القيم التالية", + "word": "", + "world": "ايها العالم", + "write _ size _": "", + "x": "x", + "x position": "س الموضع", + "y": "y", + "y position": "ص الموضع", + "year": "سنة", + "year:": "", + "your own": "الخاصة", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-bg.js b/elements/pl-snap/Snap/locale/lang-bg.js new file mode 100644 index 00000000..42535cab --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-bg.js @@ -0,0 +1,1383 @@ +SnapTranslator.dict.bg = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) наляво", + "(0) up": "(0) нагоре", + "(1) sine": "", + "(180) down": "(180) надолу", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) надясно", + "(empty)": "(празно)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "За Snap!", + "About...": "За Snap!", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Aнимации", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Произволен (unevaluated)", + "Any type": "Произволен тип", + "Apply": "Приложи", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Сирурен ли си че искаш да изтриеш?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Назад...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Редактор на блокове", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Размити сенки", + "Boolean": "булев", + "Boolean (T/F)": "Булев (Т/F)", + "Boolean (unevaluated)": "Булев (unevaluated)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Отмени", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Замени блок", + "Clear backup": "", + "Clicking sound": "Звук на клик", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Команда", + "Command (C-shape)": "Команда (С-форма)", + "Command (inline)": "Команда (inline)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Участници", + "Control": "Управление", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Редактор на Костюми", + "Costumes": "Костюми", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Направи нов вход с име", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Кредити...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "Default стойност:", + "Delete": "Изтрий", + "Delete Custom Block": "Изтрий custom блок", + "Delete Project": "Изтрий Проект", + "Delete a variable": "Изтрий променлива", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Издърпай програмния код", + "Dragging threshold...": "", + "Dynamic input labels": "Динамични входни етикети", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Редактирай име на вход", + "Edit label fragment": "Редактирай текста етикет", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Експорт на блокове", + "Export blocks...": "Експорт на блокове...", + "Export project as plain text...": "Експорт проекта како текст файл...", + "Export project...": "Експорт на проект...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Здрасти!", + "Hello, World!": "", + "Help": "Помощ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Хмм...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Импорт на блокове", + "Import library": "", + "Import sound": "", + "Import tools": "Импорт опции", + "Import...": "Импорт...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "Имена на входните данни:", + "Input Slot Options": "", + "Input name": "Име на входа на данни", + "Input sliders": "Слайдери", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Език...", + "Libraries...": "", + "License": "Лиценз", + "License...": "Лиценз...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Списък", + "List utilities": "", + "Lists": "Списъци", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "", + "Logout": "", + "Long form input dialog": "Дълга форма за входни", + "Looks": "Външност", + "Make a block": "Нов блок", + "Make a variable": "Направи променлива", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Име на съобщение", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Модули...", + "Motion": "Движение", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Множество входни (спиък от данни)", + "Nested auto-wrapping": "", + "New": "Нов проект", + "New Category": "", + "New Project": "Нов Проект", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Не", + "November": "", + "Number": "Число", + "OK": "", + "Object": "Обект", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Отвори Проект", + "Open in Community Site": "", + "Open...": "Отвори...", + "Opening project...": "", + "Operators": "Оператори", + "Other": "Други", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Молив", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "Пусни", + "Play sound": "Пусни звука", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Предикат", + "Prefer empty slot drops": "Предпочиай несвързани блокове", + "Privacy...": "", + "Project Notes": "Записки по проекта", + "Project URLs": "", + "Project notes...": "Записки по проекта...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Замени проекта с нов?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Репортер", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Запиши", + "Save As...": "Запиши като...", + "Save Project": "", + "Save Project As...": "Запиши проекта като...", + "Save to disk": "", + "Saved!": "Записан!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "Скриптове", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Сензори", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "", + "Single input.": "Единичен вход", + "Single palette": "", + "Slider maximum value": "Слайдер с max стойност", + "Slider minimum value": "Слайдер с min стойност", + "Snap! website": "Уебсайт на Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Звуци", + "Sound Recorder": "", + "Sounds": "Звуци", + "Sprite": "Спрайт", + "Sprite Nesting": "", + "Stage": "Сцена", + "Stage height": "", + "Stage selected: no motion primitives": "Избрана сцена: няма блокове с движение", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "Стоп", + "Stop sound": "Спри звука", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Премини към режим на потребителя", + "Switch to dev mode": "Премини към режим за порграмисти", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Tекст", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Thread safe скриптове", + "Title text": "Текст заглавие", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Преводи", + "Translators...": "Преводачи", + "Turbo mode": "", + "Turtle": "Костенурка", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Без име", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - направи вътрешна променлива видима от извиквача", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Име на променливата", + "Variables": "Променливи", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Виртуална клавиатура", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Да", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Зеброви цветове", + "Zoom blocks": "", + "Zoom blocks...": "", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ съдържа _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ пред _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ модул _", + "_ of _": "_ от _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "абсолютна стойност", + "acos": "acos", + "add _ to _": "добави _ към _", + "add a new Turtle sprite": "", + "add a new sprite": "Добави нов спрайт", + "add comment": "добави коментар", + "add comment here...": "добави коментар тук...", + "agent": "", + "alert _": "предупреждение _", + "all": "всичко", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "всичко осрен първия от _", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "и", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "отговор", + "any": "", + "any key": "", + "any message": "", + "anything": "", + "append _": "", + "arrange scripts vertically": "вертикално подреждане на скриптовере", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "попитай _ и изчакай", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Сигурен ли си че искаш да изтиреш този блок?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "изпрати _ _", + "broadcast _ _ and wait": "изпрати _ _ и изчакай", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "извикай _ _", + "call _ w/continuation": "извикай _ с продължение", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "върти се", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "промени _ с _", + "change _ effect by _": "смени _ ефект с _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "промени цвята на молива с _", + "change pen shade by _": "промени яркостта с _", + "change pen size by _": "промени размера с _", + "change size by _": "промени размера с _", + "change tempo by _": "промени темпото с _", + "change volume by _": "", + "change x by _": "промени х с _", + "change y by _": "промени y с _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "избери за да са покаже типът на всички входните", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to disallow script reentrancy": "избери за да включиш thread safe скриптове", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "избери за да включиш IDE aнимациите", + "check to enable alternating colors for nested blocks": "избери за да включиш алтениращи цветове за блоковете", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "избери за да използваш динамични входни етикети за входни с множество стйности", + "check to enable input sliders for entry fields": "избери за да изпозваш слайдери за входни полета", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "избери за да изпозваш виртуална клавиатура за мобилни устройства", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "избери за да включиш звука при кликване върху блок", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "избери за да използваш плътни сенки и очертания", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "разчисти", + "clear": "изчисти всичко", + "clear graphic effects": "махни ефектите", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "кликни за да преместиш центра на ротацията", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "цвят _ допира ли _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "команда", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "напиши в конзолата _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "костюм №", + "costume name": "", + "costumes": "", + "costumes tab help": "импортирай изображения от друг уеб-сайт или от твоя компютър пускайки ги тук", + "could not connect to:": "", + "cr": "", + "create a clone of _": "", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "Версии на модулие", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "изтрий", + "delete _": "", + "delete _ of _": "изтрий _ от _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "изтрий дефиницията на блока", + "delete slot": "", + "delete this clone": "", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "Режим за програмисти", + "development mode debugging primitives:": "Режим за програмисти примитиви за дебъгиране:", + "development mode...": "", + "dimensions": "", + "direction": "посока", + "disable deep-Morphic context menus and show user-friendly ones": "изключи deep-Morphic контекст меню", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "растояние до _", + "distribution": "", + "don't rotate": "не се върти", + "down arrow": "стрелка надолу", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "движимо", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "дупликация", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "край", + "edit": "редактирай", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "редактирай...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "включи Morphic контекст менюта и инспектори, мното сложно!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "Експорт", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "експорт...", + "extract": "", + "f": "f", + "false": "", + "file": "", + "file menu import hint": "Зареди проект, блокова библиотека, спрайт или звук", + "fill": "", + "fill page...": "", + "filtered for _": "филтър за _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "за вскички спрайтове", + "for each _ in _ _": "", + "for this sprite only": "само за този спрайт", + "forever _": "завинаги _", + "frame": "", + "frames": "рамки", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "прозрачност", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "плъзгане _ сек до x _ y _", + "global?": "", + "globe": "", + "go back _ layers": "премини с _ слоя назад", + "go to _": "премини в точка _", + "go to _ layer": "", + "go to front": "премини най-отпред", + "go to x: _ y: _": "премини към x _ y _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "здравейте", + "help": "помощ", + "help...": "помощ...", + "hide": "скрий", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "скрий променлива _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "", + "i": "i", + "identical to": "идентичен с", + "if _ _": "ако _ _", + "if _ _ else _": "ако _ _ иначе _", + "if _ then _ else _": "", + "if on edge, bounce": "ако е в края, отблъсни се", + "import a sound from your computer by dragging it into here": "добави звуци от твоя компютър пускайки ги тук", + "import without attempting to parse or format data": "", + "import...": "импорт...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "Вход на списък:", + "input names:": "имена на входните данни:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "вмъкни _ на позиция _ в _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "", + "is _ a _ ?": "_ от тип _ ли е ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "елемент _ от _", + "items": "", + "j": "j", + "join _": "съедини _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "бутон _ натиснат?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Български", + "language_translator": "Иван Савов", + "large": "голям", + "last": "последен", + "last changed": "", + "last_changed": "2015-11-02", + "launch _ _": "пусни _ _", + "left": "", + "left arrow": "стрелка наляво", + "length": "", + "length of _": "дължина на _", + "length:": "дължина:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "буква _ от _", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "списък", + "list _": "списък _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "Зареди официалната библиотеката от мощните блокове", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "нов блок...", + "make a category...": "", + "make a copy and pick it up": "копирай и вземи", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "натиснат бутон на мишката?", + "mouse position": "", + "mouse x": "мишка x-позиция", + "mouse y": "мишка y-позиция", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "курсор на мишката", + "move": "", + "move _ steps": "напред с _ стъпки", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "нов...", + "next": "", + "next costume": "следващия костюм", + "none": "нищо", + "normal": "нормален", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "не _", + "note": "", + "nothing": "", + "now connected": "конектиран", + "now connected.": "", + "number": "число", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "копирай само този блок", + "only face left/right": "само ляво-дясно ориентация", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "отвори нов екран с изображение на скрипта", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "или", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "натисни молива", + "pen down?": "", + "pen trails": "линии след молива", + "pen up": "вдигни молива", + "pen vectors": "", + "pic...": "", + "pick random _ to _": "произволно число между _ и _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "пусни нота _ за _ такта", + "play sound _": "пусни звук _", + "play sound _ at _ Hz": "", + "play sound _ until done": "пусни звук _ до край", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "обърни се в посока _", + "point towards _": "обърни се към _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "предикат", + "presentation (1.4x)": "", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "някой", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "смени етикета...", + "release": "", + "remove block variables...": "", + "rename": "Преименуване", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "Преименуване на костюм", + "rename only this reporter": "", + "rename sound": "Преименувай звука", + "rename...": "Преименуване...", + "repeat _ _": "повтори _ _", + "repeat until _ _": "повтори докато _ _", + "replace item _ of _ with _": "замести елемент _ в _ с _", + "report _": "резултат _", + "reporter": "репортер", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "нулирай таймер", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "пауза за _ такта", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "стрелка надясно", + "ring": "", + "ringify": "", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "закръгли _", + "run _ _": "изпълни _ _", + "run _ w/continuation": "изпълни _ с продължение", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "кажи _", + "say _ for _ secs": "кажи _ за _ сек", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "изображение на скрипта...", + "script variables _": "променливи на скрипта _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "избери", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "настрой ефект _ на _", + "set _ of block _ to _": "", + "set _ to _": "настрой _ на стойност _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "избери цвят _", + "set pen shade to _": "настрой яркостта на _", + "set pen size to _": "ибери молив с размер _", + "set size to _ %": "настрой размера на _", + "set tempo to _ bpm": "настрой темпо _ удара в мин.", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "настрой х на _", + "set y to _": "настрой y на _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "избери и новите блокове ще отместват старите", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "покажи", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "почажи всичко", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Покажи XML дефинициите на custom блокове в нов прозорец на браузъра", + "show project data as XML in a new browser window": "Покажи XML данните на проекта в нов прозорец на браузъра", + "show table _": "", + "show the World's menu": "", + "show variable _": "покажи променлива _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "размер", + "slider": "слайдер", + "slider max...": "слайдер max...", + "slider min...": "слайдер min...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "интервал", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "корен квадратен", + "square": "", + "stack size": "размер на стека", + "stage": "", + "stage image": "", + "stamp": "печатче", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all _": "спри всичко _", + "stop all sounds": "спри всички звуци", + "stop block": "спри блока", + "stop frequency": "", + "stop script": "спри скрипта", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "смени костюм с _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "темпо", + "temporary?": "", + "text": "текст", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "нещо", + "think _": "мисли _", + "think _ for _ secs": "мисли _ за _ сек", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "Този проект не съдъжа глобални custom блокове", + "this script": "", + "time in milliseconds": "", + "timer": "таймер", + "tip": "", + "to": "към", + "top": "", + "touch screen settings": "", + "touching _ ?": "допира ли _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "ivan.savov@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "", + "turbo mode": "", + "turbo mode?": "", + "turn _ _ degrees": "завърти _ с _ градуса", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "тип на _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "откажи за да позволиш новите блокове да изместват старите", + "uncheck to allow script reentrance": "", + "uncheck to allow script reentrancy": "откажи за да изключиш thread safe скриптове", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "откажи за да изключиш IDE aнимациите", + "uncheck to disable alternating colors for nested block": "откажи за да изключиш алтениращи цветове за блоковете", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "откажи за да изключиш динамични входни етикети за входни с множество стйности", + "uncheck to disable input sliders for entry fields": "откажи за да изключиш слайдерите за входни полета", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "откажи за да изключиш виртуалната клавиатура", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "откажи за да изключиш звука при кликване върху блок", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "откажи за да използваш плътни сенки и очертания", + "uncheck to use the input dialog in short form": "откажи за да използвап кратка форма за входни променливи", + "uncompile": "", + "undo": "въстанови", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "буква с Unicode _", + "unicode of _": "Unicode на _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Без име", + "unused": "", + "unused block(s) removed": "", + "up arrow": "стрелка нагоре", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "изчакай _ сек", + "wait until _": "изчакай до _", + "wardrobe": "", + "warp _": "", + "what's your name?": "как се казваш?", + "when I am _": "когато _ върху мен", + "when I receive _ _": "когато получа _ _", + "when I start as a clone": "", + "when _": "", + "when _ clicked": "когато _ е кликнат", + "when _ is edited _": "", + "when _ key pressed _": "когато бутон _ е натиснат _", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "с вход на данни", + "word": "", + "world": "хора", + "write _ size _": "", + "x": "x", + "x position": "x позиция", + "y": "y", + "y position": "y позиция", + "year": "", + "year:": "", + "your own": "", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-bn.js b/elements/pl-snap/Snap/locale/lang-bn.js new file mode 100644 index 00000000..3e290732 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-bn.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.bn = { + "0": "0", + "1": "১", + "2": "২", + "3": "৩", + "4": "৪", + "5": "৫", + "6": "৬", + "7": "৭", + "8": "৮", + "9": "৯", + "' does not exist in this context": "", + "(-90) left": "(-90) ডিগ্রী বামে", + "(0) up": "(0) উপরে", + "(1) sine": "(1) জ্যা", + "(180) down": "(180) নিচে", + "(2) square": "(2) বর্গ", + "(3) sawtooth": "", + "(4) triangle": "(4) ত্রিভুজ", + "(90) right": "(90) ডিগ্রী ডান", + "(empty)": "(খালি)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snap! সম্পর্কিত তথ্য", + "About...": "Snap! সম্পর্কিত তথ্য...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "প্রাণবন্ততা", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "যেকোন (সংখ্যা অনির্ণয় করা)", + "Any type": "যেকোন প্রকার", + "Apply": "প্রয়োগ কর", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "তুমি কি মুছে দেওয়ার বিষয়ে নিশ্চিত?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "ফিরে যাও...", + "Backgrounds": "ব্যাকগ্রাউন্ড", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "ব্লক সম্পাদনকারী", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "ঝাপসা ছায়া", + "Boolean": "বুলিয়েন", + "Boolean (T/F)": "বুলিয়ান (সত্য/মিথ্যা)", + "Boolean (unevaluated)": "বুলিয়ান (সংখ্যা অনির্ণয় করা)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "ব্রাউজার", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "বাতিল কর", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "ব্লক পরিবর্তন ব্লক", + "Clear backup": "", + "Clicking sound": "ক্লিক শব্দ", + "Closed brush (free draw)": "", + "Cloud": "ক্লাউড", + "Code mapping": "", + "Codification support": "অন্যান্য প্রোগ্রামিং ভাষার কোড দেখাও", + "Colors and Crayons": "", + "Command": "আদেশ", + "Command (C-shape)": "আদেশ (C-আকৃতি)", + "Command (inline)": "আদেশ (ইনলাইন)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "সাহায্যকারীবৃন্দ", + "Control": "নিয়ন্ত্রণ", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "পরিচ্ছদ সম্পাদনকারী", + "Costumes": "পরিচ্ছদ", + "Costumes...": "পরিচ্ছদ লোড কর...", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "ইনপুট নাম তৈরি কর", + "Create variables": "", + "Create variables in program": "", + "Credits...": "স্বীকৃতি...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "ডিফল্ট (অনুপস্থিত)মান:", + "Delete": "মুছে ফেল", + "Delete Custom Block": "কাস্টম ব্লক মুছে দাও", + "Delete Project": "প্রকল্প মুছে ফেল", + "Delete a variable": "চলকটি মুছে ফেল", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Snap! সোর্সকোড", + "Dragging threshold...": "", + "Dynamic input labels": "গতিশীল ইনপুট লেবেল", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "ইনপুট নাম পরিবর্তন কর", + "Edit label fragment": "লেবেল টুকরা পরিবর্তন কর", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "নমুনা প্রকল্প", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "ব্লক এক্সপোর্ট কর", + "Export blocks...": "ব্লকসমূহ ডাউনলোড কর...", + "Export project as plain text...": "প্রকল্পটি প্লেইন টেক্সট হিসাবে ডাউনলোড কর ...", + "Export project...": "প্রকল্পটি ডাউনলোড কর...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "ফ্লাট ডিজাইন", + "Flat line ends": "ফ্লাট লাইনের সমাপ্তি", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "হ্যালো!", + "Hello, World!": "", + "Help": "সাহায্য কর", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "হুম ...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "ব্লক ইম্পোর্ট কর", + "Import library": "", + "Import sound": "", + "Import tools": "যন্ত্রপাতি ইম্পোর্ট কর", + "Import...": "প্রকল্প ইম্পোর্ট কর...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "ইনপুট নাম:", + "Input Slot Options": "", + "Input name": "ইনপুট নাম", + "Input sliders": "ইনপুট স্লাইডার", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "ভাষা পরিবর্তন কর...", + "Libraries...": "ব্লক লাইব্রেরি লোড কর...", + "License": "লাইসেন্স", + "License...": "লাইসেন্স...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "তালিকা", + "List utilities": "", + "Lists": "তালিকা", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "লগ ইন...", + "Logout": "", + "Long form input dialog": "দীর্ঘ আকারের ডায়লগ ইনপুট", + "Looks": "সৌন্দর্য", + "Make a block": "একটি ব্লক তৈরি কর", + "Make a variable": "একটি চলক তৈরি কর", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "নতুন বার্তা তৈরি কর", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "মডিউল...", + "Motion": "গতি", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "একাধিক ইনপুট (মান ইনপুট তালিকা)", + "Nested auto-wrapping": "", + "New": "নতুন প্রকল্প তৈরি কর", + "New Category": "", + "New Project": "নতুন প্রকল্প", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "না", + "November": "", + "Number": "সংখ্যা", + "OK": "ঠিক আছে", + "Object": "বস্তু", + "October": "", + "Ok": "ঠিক আছে", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "খোল", + "Open Project": "সংরক্ষিত কোন প্রকল্প নির্বাচন করে খোল", + "Open in Community Site": "", + "Open...": "সংরক্ষিত প্রকল্প খোল...", + "Opening project...": "", + "Operators": "চালক", + "Other": "অন্যান্য", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "লেখনী", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "সাধারণ প্রোটোটাইপ লেবেল", + "Play": "বাজাও", + "Play sound": "শব্দ বাজাও", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "সূত্রের বিধেয়", + "Prefer empty slot drops": "খালি স্লট ড্রপ পছন্দ কর", + "Prefer smooth animations": "মসৃণ অ্যানিমেশন পছন্দ কর", + "Privacy...": "", + "Project Notes": "প্রকল্প সম্পর্কিযে কোনত মন্তব্য", + "Project URLs": "", + "Project notes...": "প্রকল্প সম্পর্কিত মন্তব্য...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Snap! রেফারেন্স ম্যানুয়াল", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "বর্তমান প্রকল্পটি নতুন প্রকল্প দ্বারা প্রতিস্থাপন করতে চাও?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "প্রতিবেদক", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "পাসওয়ার্ড পরিবর্তন কর...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "প্রকল্পটি সংরক্ষণ কর", + "Save As...": "নামসহ প্রকল্পটি সংরক্ষণ করুন...", + "Save Project": "", + "Save Project As...": "প্রকল্পটি নামান্তর কর...", + "Save to disk": "", + "Saved!": "সংরক্ষিত হয়েছে!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "স্ক্রিপ্টগুলো", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "অনুভূতি", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "সাইন আপ...", + "Single input.": "একক ইনপুট", + "Single palette": "", + "Slider maximum value": "স্লাইডারের সর্বোচ্চ মান", + "Slider minimum value": "স্লাইডারের সর্বনিম্ন মান", + "Snap! website": "Snap! ওয়েবসাইট", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "শব্দ", + "Sound Recorder": "", + "Sounds": "শব্দমালা", + "Sounds...": "শব্দের ফাইল লোড কর", + "Sprite": "স্প্রাইট", + "Sprite Nesting": "", + "Stage": "দৃশ্যস্থল", + "Stage height": "", + "Stage selected: no motion primitives": "স্টেজ নির্বাচিত হয়েছে: কোন গতিশীল প্রিমিটিভ ব্লক নেই disponibles", + "Stage size": "", + "Stage size...": "দৃশ্যস্থলের আকার পরিবর্তন কর...", + "Stage width": "", + "Stop": "বন্ধ কর", + "Stop sound": "শব্দ বন্ধ কর", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "ইউজার মোডে ফিরে যাও", + "Switch to dev mode": "ডেভেলপার মোডে ফিরে যাও", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "বর্ণ", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "নির্বিঘ্ন বর্ণনা যোগসূত্র", + "Title text": "শিরোনামের লেখা", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "ভাষান্তরসমূহ", + "Translators...": "অনুবাদক...", + "Turbo mode": "টার্বো মোড", + "Turtle": "টার্টল পোশাক", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "শিরোনামহীন", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "অভ্যন্তরীণ চলক আহ্বানকারীকে দৃশ্যমান কর", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "চলকের নাম", + "Variables": "চলক", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "ভার্চুয়াল কিবোর্ড", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "হ্যাঁ", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "জেব্রা চেহারা", + "Zoom blocks": "", + "Zoom blocks...": "ব্লকসমূহ জুম কর...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ তালিকা _ উপাদানটি ধারণ করে", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ _ তালিকাটির সামনে", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ ভাগ _ এর অবশিষ্ট", + "_ of _": "_ লক্ষণ _ এর", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "শব্দের _ _", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "পরমমান", + "acos": "একোস", + "add _ to _": "_ কে _ তে ঢুকাও", + "add a new Turtle sprite": "", + "add a new sprite": "একটি নতুন স্প্রাইট যোগ কর", + "add comment": "মন্তব্য যোগ কর", + "add comment here...": "এখানে মন্তব্য যোগ কর...", + "agent": "", + "alert _": "সতর্ক: _", + "all": "সকল", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ তালিকাটির সব কিন্তু প্রথমটি বাদে", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "এবং", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "জবাব", + "any": "", + "any key": "", + "any message": "যে কোন বার্তা", + "anything": "", + "append _": "", + "arrange scripts vertically": "উল্লম্বভাবে স্ক্রিপ্টস সুবিন্যস্ত কর", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "আসীন", + "ask _ and wait": "_ জিজ্ঞাসা করে অপেক্ষা কর", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "তুমি কি এই কাস্টম ব্লক এবং সংশ্লিষ্ট সকল উপাদান মুছে দেওয়ার ব্যাপারে নিশ্চিত?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "বার্তা _ _ সম্প্রচার কর", + "broadcast _ _ and wait": "বার্তা _ _ সম্প্রচার করে অপেক্ষা কর", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "আহ্বান কর _ _", + "call _ w/continuation": "আহ্বান কর _ ধারাবাহিকতার সঙ্গে", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "ঘুরতে পারে", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ চলকটি মান _ দ্বারা পরিবর্তন কর", + "change _ effect by _": "বিশেষ প্রভাব _ পরিবর্তন কর _ দ্বারা", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "লেখনীর রঙ _ পরিবর্তন কর", + "change pen shade by _": "লেখনীর ছায়া _ পরিবর্তন কর", + "change pen size by _": "লেখনীর আকার পরিবর্তন কর _", + "change size by _": "আকার _ গুণ পরিবর্তন কর", + "change tempo by _": "শব্দের কম্পনমাত্রা _ দ্বারা পরিবর্তন কর", + "change volume by _": "", + "change x by _": "x পরিবর্তন কর _ দ্বারা", + "change y by _": "y পরিবর্তন কর _ দ্বারা", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "সর্বদা ইনপুট ডায়লগে স্লট এর ধরন দেখানোর জন্য চেক কর", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to disallow script reentrancy": "বর্ণনা পুনপ্রবেশ অনুমোদন না করার জন্য চেক কর", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "IDE প্রাণবন্ততা চালু করার জন্য চেক কর", + "check to enable alternating colors for nested blocks": "নেস্টেড ব্লকের পরিবর্তিত রঙ সক্রিয় করার জন্য চেক কর", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "ভারিয়াদিক ইনপুট এর গতিশীল লেবেল সক্রিয় করার জন্য চেক কর", + "check to enable input sliders for entry fields": "এন্ট্রি ফিল্ডে ইনপুট স্লাইডার সক্রিয় করার জন্য চেক কর", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "মোবাইল ডিভাইসে ভার্চুয়াল কিবোর্ড সহায়তা সক্রিয় করার জন্য চেক কর", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "ক্লিক শব্দ চালু করার জন্য চেক কর", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "ঝাপসা ছায়া এবং হাইলাইট ব্যবহার চেক কর", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "পরিষ্কার-পরিচ্ছন্ন কর", + "clear": "পরিচ্ছদ পরিষ্কার কর", + "clear graphic effects": "চিত্রলেখ প্রভাব পরিষ্কার কর", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "ঘূর্ণন কেন্দ্র সরাতে crosshairs ক্লিক কর অথবা টেনে আন", + "clicked": "ক্লিক করা হবে", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ রঙ _ রঙ গামী কিনা?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "নির্দেশ", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "কনসোল লগ: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "কোসাইন্", + "costume": "", + "costume #": "পরিচ্ছদ সংখ্যা", + "costume name": "", + "costumes": "", + "costumes tab help": "নতুন/অতিরিক্ত পরিচ্ছদ ব্যবহারের জন্য প্রথমে ডান দিকের নিচের পরিচ্ছদ আইটেমে একটি ক্লিক কর, তারপর কম্পিউটার থেকে প্রত্যাশিত ছবির ফাইল নির্বাচন করে এখানে আনয়ন কর নতুন/অতিরিক্ত স্পাইট ব্যবহারের জন্য প্রথমে ডান দিকের নিচের স্পাইট আইটেমে একটি ক্লিক কর, তারপর কম্পিউটার থেকে প্রত্যাশিত ছবির ফাইল নির্বাচন করে এখানে আনয়ন কর", + "could not connect to:": "", + "cr": "", + "create a clone of _": "_ একটি ক্লোন এর সৃষ্টি কর", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "বর্তমান মডিউল সংস্করণ", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "এটি মুছে ফেল", + "delete _": "", + "delete _ of _": "_ কে _ থেকে মুছে ফেল", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "ব্লক সংজ্ঞা মুছে ফেল", + "delete slot": "", + "delete this clone": "এই ক্লোনটি মুছে ফেল", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "উন্নয়ন মোড", + "development mode debugging primitives:": "উন্নয়ন মোড ডিবাগিং প্রিমিটিভ", + "development mode...": "", + "dimensions": "", + "direction": "এর গতিপথ", + "disable deep-Morphic context menus and show user-friendly ones": "গভীর-মরফিক প্রসঙ্গ তালিকা এবং পরিদর্শক নিস্ক্রিয় করে একটি ব্যবহারকারী বান্ধব তালিকা দেখাও", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "পর্যন্ত দূরত্ব _", + "distribution": "", + "don't rotate": "ঘুরতে পারে না", + "down arrow": "ডাউন অ্যারো", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "টেনে আনার যোগ্য", + "draggable?": "", + "dragging threshold": "", + "dropped": "ফেলা হবে", + "duplicate": "এটির প্রতিলিপি তৈরী কর", + "duplicate block definition...": "", + "duration": "ব্যাপ্তিকাল", + "e": "e", + "e^": "e^", + "edge": "প্রান্ত", + "edit": "সম্পাদন কর", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "সম্পাদন কর...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "মরফিক প্রসঙ্গ তালিকা এবংপরিদর্শক সক্রিয় কর,তবে এটি ব্যবহারকারী বান্ধব নহে!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "প্রেরণ কর", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "প্রেরণ কর...", + "extract": "", + "f": "f", + "false": "মিথ্যা", + "file": "", + "file menu import hint": "XML ফাইল হিসেবে সংরক্ষিত কোন প্রকল্প ইম্পোর্ট কর", + "fill": "", + "fill page...": "", + "filtered for _": "ফিল্টার করা হয়েছে _ এর জন্য", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "সব স্প্রাইট জন্য", + "for each _ in _ _": "", + "for this sprite only": "শুধুমাত্র এই স্প্রাইট জন্য", + "forever _": "অনন্তকাল কর _", + "frame": "", + "frames": "ফ্রেমসমূহ", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "ভূত", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "গড়িয়ে চল x: _ y: _ অবস্থানে _ সেকেন্ড", + "global?": "", + "globe": "", + "go back _ layers": "পশ্চাতে যাও _ স্তর", + "go to _": "_ যাও", + "go to _ layer": "", + "go to front": "সামনে যাও", + "go to x: _ y: _": "x: _ y: _ অবস্থানে যাও", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "হ্যালো", + "help": "সাহায্য কর", + "help...": "সাহায্য কর...", + "hide": "গোপন কর", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "_ চলকটি গোপন কর", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "", + "i": "i", + "identical to": "এর সমতুল্য", + "if _ _": "যদি শর্তটি সত্য হয় _ _", + "if _ _ else _": "যদি শর্তটি সত্য হয় _ _ অন্যথায় _", + "if _ then _ else _": "", + "if on edge, bounce": "প্রান্ত স্পর্শ করলে উল্টে ফিরে আস", + "import a sound from your computer by dragging it into here": "শব্দ ব্যবহারের জন্য কম্পিউটার থেকে প্রত্যাশিত শব্দের ফাইল নির্বাচন করে এখানে আনয়ন করতে পার", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "জিনিস _ কততম _ তালিকায়", + "inherit _": "", + "inherited": "", + "initialize": "আরম্ভ কর", + "input list:": "ইনপুট তালিকা:", + "input names:": "ইনপুট নাম:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "_ কে _ স্থানে _ তালিকায় সন্নিবেশিত কর", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ কিনা?", + "is _ a _ ?": "_ এই প্রকারের কিনা _ ?", + "is _ empty?": "তালিকা _ কি খালি?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ উপাদানটি _ তালিকার", + "items": "", + "j": "j", + "join _": "যুক্ত কর _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "কোন কী _ চাপা কিনা?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "বাংলা", + "language_translator": "Dr. Mokter Hossain, Radman Siddiki", + "large": "বৃহৎ", + "last": "সর্বশেষ", + "last changed": "", + "last_changed": "2020-07-04", + "launch _ _": "শুরু কর _ _", + "left": "", + "left arrow": "লেফট অ্যারো", + "length": "দৈর্ঘ্য", + "length of _": "_ তালিকাটির দৈর্ঘ্য", + "length:": "দৈর্ঘ্য:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "_ -তম বর্ণ _ এর", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "তালিকা", + "list _": "তালিকা _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "শক্তিশালী ব্লকের অফিসিয়াল লাইব্রেরি লোড কর", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "একটি ব্লক তৈরী কর...", + "make a category...": "", + "make a copy and pick it up": "এটি কপি কর এবং নির্বাচন কর", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "বার্তা", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "মাউস নিচে গিয়েছে?", + "mouse position": "", + "mouse x": "মাউস x", + "mouse y": "মাউস y", + "mouse-departed": "মাউস উঠানো হবে", + "mouse-entered": "মাউস চাপা হবে", + "mouse-pointer": "মাউস-পয়েন্টার", + "move": "", + "move _ steps": "অগ্রসর হও _ ধাপ", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "স্বীয়", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "নতুন পোশাক _ প্রস্থ _ উচ্চতা _", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "নতুন বার্তা লিখ...", + "next": "", + "next costume": "পরবর্তী পরিচ্ছদ", + "none": "কোনোটাই না", + "normal": "স্বাভাবিক", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "না _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "সংখ্যা", + "number of channels": "", + "numbers from _ to _": "সংখ্যা _ থেকে _", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "শুধুমাত্র এই ব্লকের প্রতিলিপি তৈরী কর", + "only face left/right": "একমাত্র ডানে/বামে মুখ", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "এই স্ক্রিপ্টর ছবি দিয়ে একটা নতুন উইন্ডো খোল", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "অথবা", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "একটি স্প্রাইট আঁক", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "সব স্থগিত কর _", + "pen": "", + "pen _": "", + "pen down": "লেখনী নিম্নগামী কর", + "pen down?": "", + "pen trails": "কলম ভ্রমণ", + "pen up": "লেখনী ঊর্ধ্বগামী কর", + "pen vectors": "", + "pic...": "", + "pick random _ to _": "যে কোনো একটি সংখ্যা _ থেকে _ পর্যন্ত", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "নোট _ বাজাও _ কম্পন পর্যন্ত", + "play sound _": "শব্দ বাজাও _", + "play sound _ at _ Hz": "শব্দ _ রেট _ -এ বাজাও", + "play sound _ until done": "_ শব্দ বাজাও এটি শেষ না হওয়া পর্যন্ত", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "দিকে মুখ কর _", + "point towards _": "প্রতি নির্দেশ কর _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "প্রেডিক্যাট", + "presentation (1.4x)": "", + "pressed": "চাপা হবে", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "যেকোনো", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "নামান্তর কর...", + "release": "", + "remove block variables...": "", + "rename": "নতুন নামকরণ কর", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "পরিচ্ছদ নতুন নামকরণ কর", + "rename only this reporter": "", + "rename sound": "শব্দ নতুন নামকরণ কর", + "rename...": "নতুন নামকরণ কর...", + "repeat _ _": "পুনরাবৃত্তি কর _ বার _", + "repeat until _ _": "পুনরায় কর যতক্ষণ না _ _", + "replace item _ of _ with _": "_ স্থানের _ তালিকার উপাদানটি _ দ্বারা প্রতিস্থাপন কর", + "report _": "প্রতিবেদন কর _", + "reporter": "রিপোর্টার", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "সময় নির্ণায়ক পুন:স্থাপন কর", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "নীরব থাক _ কম্পন পর্যন্ত", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "রাইট অ্যারো", + "ring": "", + "ringify": "পরিবেষ্টন কর", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ এর নিকটতম পূর্ণসংখ্যা", + "run _ _": "চালনা কর _ _", + "run _ w/continuation": "চালনা কর _ ধারাবাহিকতার সঙ্গে", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "বল _", + "say _ for _ secs": "বল _ _ সেকেন্ড পর্যন্ত", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "স্ক্রিপ্ট ছবি...", + "script variables _": "স্ক্রিপ্ট চলকসমূহ _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "নিচে স্ক্রল করা হবে", + "scrolled-up": "উপরে স্ক্রল করা হবে", + "second": "", + "select": "নির্বাচন কর", + "selection": "", + "self": "", + "send _ to _": "বার্তা _ সম্প্রচার কর _", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "বিশেষ প্রভাব _ _ গুণ নির্ধারণ কর", + "set _ of block _ to _": "", + "set _ to _": "_ চলকটি মান _ নির্ধারণ কর", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "লেখনীর রঙ _ নির্ধারণ কর", + "set pen shade to _": "লেখনীর ছায়া _ নির্ধারণ কর", + "set pen size to _": "লেখনীর আকার নির্ধারণ কর _", + "set size to _ %": "আকার _ % নির্ধারণ কর", + "set tempo to _ bpm": "শব্দের কম্পনমাত্রা _ করে ফেল", + "set this morph's alpha value": "", + "set turbo mode to _": "টার্বো মোডকে _ নির্ধারণ কর", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "x নির্ধারণ কর _", + "set y to _": "y নির্ধারণ কর _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "খালি স্লট মেনু স্থাপন করার সাহায্যপূর্ণ ইঙ্গিত", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "প্রদর্শন কর", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "সব প্রদর্শন কর", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "সার্বজনীন কাস্টম ব্লক সংজ্ঞার্থ একটি নতুন ব্রাউজার উইন্ডোতে XML ফাইল হিসেবে প্রদর্শন কর", + "show project data as XML in a new browser window": "প্রকল্প উপাত্ত একটি নতুন ব্রাউজার উইন্ডোতে XMLফাইল হিসেবে প্রদর্শন কর", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ চলকটি প্রদর্শন কর", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "সাইন্", + "size": "এর আকার", + "slider": "স্লাইডার", + "slider max...": "স্লাইডার সর্বোচ্চ...", + "slider min...": "স্লাইডার সর্বনিম্ন...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "স্পেসবার", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "বর্গমূল", + "square": "", + "stack size": "স্ট্যাকের আকার", + "stage": "", + "stage image": "", + "stamp": "সীলমোহর", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all _": "সব বন্ধ কর _", + "stop all sounds": "সকল শব্দ বন্ধ কর", + "stop block": "ব্লক বন্ধ কর", + "stop frequency": "", + "stop script": "বর্ণনা বন্ধ কর", + "stopped": "থামানো হবে", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "পরিচ্ছদ বদল কর _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "একটি ক্যামেরা স্ক্রিনশট নেও এবং এটি নতুন পোশাক হিসেবে আমদানি কর", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "শব্দের কম্পনমাত্রা", + "temporary?": "", + "text": "বর্ণ", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "জিনিস", + "think _": "ভাব _", + "think _ for _ secs": "ভাব _ _ সেকেন্ড পর্যন্ত", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "এই প্রকল্পের জন্য এখনো কোনো কাস্টম গ্লোবাল ব্লক নেই", + "this script": "", + "time in milliseconds": "", + "timer": "সময় নির্ণায়ক", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "স্পর্শ রঙ _ কিনা?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "mokter@gmail.com, radman.siddiki@outlook.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "সত্য", + "turbo mode": "", + "turbo mode?": "টার্বো মোড চালু কিনা?", + "turn _ _ degrees": "বামদিকে _ _ ডিগ্রীকোণে ঘোর", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ -এর প্রকার", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "ঝরে পরা রিপোর্টারসমূহ অন্যদের বের করে দেওয়ার জন্য আনচেক কর", + "uncheck to allow script reentrance": "", + "uncheck to allow script reentrancy": "বর্ণনা পুনপ্রবেশ অনুমোদন করার জন্য আনচেক কর", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "IDE প্রাণবন্ততা বন্ধ করার জন্য আনচেক কর", + "uncheck to disable alternating colors for nested block": "নেস্টেড ব্লকের পরিবর্তিত রঙ নিস্ক্রিয় করার জন্য আনচেক কর", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "ভারিয়াদিক ইনপুট এর গতিশীল লেবেল নিস্ক্রিয় করার জন্য আনচেক কর", + "uncheck to disable input sliders for entry fields": "এন্ট্রি ফিল্ডে ইনপুট স্লাইডার নিস্ক্রিয় করার জন্য আনচেক কর", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "মোবাইল ডিভাইসে ভার্চুয়াল কিবোর্ড সহায়তা নিস্ক্রিয় করার জন্য চেক কর", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "ক্লিক শব্দ বন্ধ করার জন্য আনচেক কর", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "নিরেট ড্রপ ছায়া এবং হাইলাইট ব্যবহার আনচেক কর", + "uncheck to use the input dialog in short form": "সংক্ষিপ্ত আকারের ইনপুট ডায়লগ ব্যবহারের জন্য আনচেক কর", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "ইউনিকোড _ বর্ণ হিসেবে", + "unicode of _": "_ -এর ইউনিকোড", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "পরিবেষ্টনমুক্ত করা", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "শিরোনামহীন", + "unused": "", + "unused block(s) removed": "", + "up arrow": "আপ অ্যারো", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "অপেক্ষা কর _ সেকেন্ড", + "wait until _": "অপেক্ষা কর _ যতক্ষণ না পর্যন্ত", + "wardrobe": "", + "warp _": "বিরতি ছাড়াই _", + "what's your name?": "তোমার নাম কি?", + "when I am _": "যখন আমাকে _", + "when I receive _ _": "যখন আমি পাব বার্তা _ _", + "when I start as a clone": "যখন আমি একটি ক্লোন হিসেবে শুরু করি", + "when _": "যখন _ শর্তটি সত্য হবে", + "when _ clicked": "যখন _ ক্লিক করা হবে", + "when _ is edited _": "", + "when _ key pressed _": "যখন _ _ ক্লিক করা হবে", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "ইনপুট দ্বারা", + "word": "", + "world": "পৃথিবী", + "write _ size _": "", + "x": "x", + "x position": "এর x অবস্থান", + "y": "y", + "y position": "এর y অবস্থান", + "year": "", + "year:": "", + "your own": "", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ca.js b/elements/pl-snap/Snap/locale/lang-ca.js new file mode 100644 index 00000000..bbd948f2 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ca.js @@ -0,0 +1,1410 @@ +SnapTranslator.dict.ca = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "' no existeix en aquest context", + "(-90) left": "(-90) esquerra", + "(0) up": "(0) amunt", + "(1) sine": "(1) sinus", + "(180) down": "(180) avall", + "(2) square": "(2) quadrat", + "(3) sawtooth": "(3) dent de serra", + "(4) triangle": "(4) triangle", + "(90) right": "(90) dreta", + "(Message Queuing Telemetry Transport) protocol for connecting with IOT devices and/or other software": "MQTT (Message Queuing Telemetry Transport - Transport de telemetria de missatges en cua) Protocol per connectar dispositius IoT amb diferent programari", + "(empty)": "(buit)", + "(in a new window)": "(dins una nova finestra)", + "(no matches)": "(cap resultat)", + "(temporary)": "(temporal)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "Variació del tipus de dades \"llistes\" on els elements de la llista no són avaluats fins que s'utilitzen. D'aquesta manera es poden construir llistes amb milions d'elements sense un gran consum de memòria i fins i tot construir llistes de mida infinita. (S'inclou un bloc d'exemple que reporta tots els números primers.) Veieu el tutorial a SICP 3.5.", + "APL primitives": "Primitives APL", + "About Snap": "Sobre Snap", + "About...": "Sobre Snap!", + "Account created.": "Compte creat.", + "Add interactive maps to projects": "Afegeix mapes interactius als projectes.", + "Add scene...": "Afegeix una escena...", + "Adds features from the APL language supporting hyperblocks.": "Afegeix funcionalitats del llenguatge APL als hiper-blocs.", + "Allow multi-line text input to a block": "Permet línies múltiples en les entrades de text d'un bloc", + "An e-mail with your password has been sent to the address provided": "S'ha enviat un correu electrònic amb la contrasenya d'accés.", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "Una versió ampliada del bloc URL que permet treballar amb crides \"POST\", \"PUT\", \"DELETE\" i \"GET\" i també triar el protocol \"HTTP-HTTPS\" i controlar les capçaleres. També permet treballar amb dades JSON.", + "Analyze data for frequency distribution": "Analitza les dades de distribució de freqüències.", + "Analyze, manipulate and generate sound samples.": "Analitza, manipula i genera mostres de so", + "Animation": "Animacions", + "Animations": "Animacions", + "Another custom block with this name exists.": "Ja existeix un altre block personalitzat amb el mateix nom.", + "Any (unevaluated)": "Qualsevol (sense avaluar)", + "Any\n(unevaluated)": "Qualsevol\n(sense avaluar)", + "Any type": "Qualsevol tipus", + "Apply": "Aplica", + "April": "abril", + "Are you sure you want to continue?": "Esteu segur que voleu continuar?", + "Are you sure you want to delete": "Esteu segur que voleu esborrar", + "Are you sure you want to publish": "Esteu segur que voleu publicar", + "Are you sure you want to replace": "Esteu segur que voleu substituir el projecte original", + "Are you sure you want to share": "Esteu segur que voleu compartir", + "Are you sure you want to unpublish": "Esteu segur que voleu deixar de publicar", + "Are you sure you want to unshare": "Esteu segur que voleu deixar de compartir", + "Audio Comp": "Composició d'audio", + "August": "agost", + "Back...": "Enrere...", + "Backgrounds": "Fons", + "Backup failed. This cannot be undone, proceed anyway?": "La còpia de seguretat ha fallat. No es podran desfer els canvis, voleu continuar?", + "Bar charts": "Gràfics de barres", + "Bignums, rationals, complex #s": "Números sencers de precisió infinita, racionals exactes i complexos", + "Birth date:": "Data de naixement:", + "Bitmap": "Mapa de bits", + "Bitwise arithmetic operators for low-level bit manipulation.": "Operadors aritmètics 'bitwise' per a manipular dades a baix nivell (a nivell dels seus bits)", + "Bitwise operators": "Operadors 'bitwise'", + "Block Editor": "Editor de blocs", + "Blocks": "Blocs", + "Blocks category name:": "Nom de la categoria de blocs:", + "Blurred shadows": "Ombres suavitzades", + "Boolean": "Booleà", + "Boolean (T/F)": "Booleà (C/F)", + "Boolean (unevaluated)": "Booleà (sense avaluar)", + "Boolean\n(unevaluated)": "Booleà\n(sense avaluar)", + "Bottom": "A baix", + "Bring back deleted sprites": "Recupera objectes esborrats", + "Browser": "Navegador", + "Brush size": "Gruix del pinzell", + "Cache Inputs": "Entrades a la Memòria Cau", + "Camera": "Càmera", + "Camera not supported": "Webcam no disponible", + "Camera support": "Suport per a càmera", + "Cancel": "Cancel·la", + "Case sensitivity": "Distinció de Majúscules", + "Catch errors": "Detecta errors", + "Catch errors in a script": "Captura les errades d'un programa", + "Category color": "Color de la categoria", + "Change Password": "Canvia la contrasenya", + "Change Password...": "Canvia la contrasenya…", + "Change block": "Canvia el bloc", + "Clear backup": "Esborra la còpia de seguretat", + "Clicking sound": "So de clic", + "Closed brush (free draw)": "Dibuix tancat (pinzell lliure)", + "Cloud": "Núvol", + "Code mapping": "Mapeig del codi", + "Codification support": "Suport pel mapeig de codi", + "Colors and Crayons": "Colors i Paletes", + "Command": "Comanda", + "Command (C-shape)": "Comanda (en forma de C)", + "Command\n(C-shape)": "Comanda\n(en forma de C)", + "Command (inline)": "Comanda (inserida)", + "Command\n(inline)": "Comanda\n(inserida)", + "Computer": "Ordinador", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "Connexió a microcontroladors connectats al port sèrie utilitzant el Web Serial API (requereix de la utilització del navegador Chromium, Chrome o Edge)", + "Constrain proportions of shapes? (you can also hold shift)": "Manté la proporció de les formes? (també es pot fer prement la tecla \"majúscules\")", + "Contents": "Continguts", + "Contributors": "Col·laboradors", + "Control": "Control", + "Control the Hummingbird robotics kit processor": "Control per als kits Hummingbird.", + "Convert to bitmap?": "Voleu canviar a mapa de bits?", + "Costume Editor": "Editor de vestits", + "Costumes": "Vestits", + "Crayons": "Llapis de colors", + "Create and manage global/sprite/script variables in a script": "Crea i gestiona variables de tipus global/sprite/script dins els programes", + "Create input name": "Crea una ranura", + "Create variables": "Crea variables", + "Create variables in program": "Crea variables en un programa", + "Credits...": "Crèdits...", + "Custom Block Translations": "Traduccions del bloc personalitzat", + "Database": "Base de dades", + "December": "desembre", + "Default": "Per defecte", + "Default Value:": "Valor predeterminat:", + "Delete": "Esborra", + "Delete Custom Block": "Esborra el bloc personalitzat", + "Delete Project": "Esborra un projecte", + "Delete a variable": "Esborra una variable", + "Disable click-to-run": "Deshabilita l'execució directa", + "Disable dragging data": "Deshabilita l'arrossegament des de visors i bafarades", + "Divide the stage into sub-regions in each of which to perform an action": "Divideix l'escenari en diferents regions iguals per realitzar la mateixa acció repetitivament", + "Dynamic sprite rendering": "Renderització dinàmica dels objectes", + "Down": "Avall", + "Download source": "Descarrega el codi font", + "Dragging threshold...": "Llindar per l'arrossegament…", + "Draw a list of numbers as vertical lines distributed evenly across the stage.": "Representa una llista de nombres utilitzant línies verticals distribuïdes per tot l'escenari", + "E-mail address of parent or guardian:": "Adreça de correu electrònic del tutor o educador:", + "E-mail address:": "Adreça de correu electrònic:", + "ERROR: INVALID PASSWORD": "ERROR: CONTRASENYA NO VÀLIDA", + "EXPERIMENTAL! check to enable live custom control structures": "EXPERIMENTAL! marqueu per habilitar el control dinàmic d'estructures personalitzades.", + "EXPERIMENTAL! check to enable support for compiling": "EXPERIMENTAL! Marqueu per habilitar el suport a la compilació", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "EXPERIMENTAL! per optimitzar les operacions de lectures en un Canvas 2D utilitzant la propietat \"willReadFrequently\" encara que pot alentir la renderització en alguns navegadors", + "EXPERIMENTAL! uncheck to disable live custom control structures": "EXPERIMENTAL! desmarqueu per deshabilitar el control dinàmic d'estructures personalitzades.", + "EXPERIMENTAL! uncheck to disable live support for compiling": "EXPERIMENTAL! Desmarqueu per deshabilitar el suport a la compilació dinàmica", + "Edge color (left click)": "Color del Traç (botó esquerre)", + "Edit input name": "Edita la ranura", + "Edit label fragment": "Edita el fragment d'etiqueta", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "La llei de Eisenberg diu: Des de la programació s'hauria de poder fer tot allò que es faci des de l'entorn i les seves funcionalitats i configuració. I viceversa!", + "Ellipse (shift: circle)": "El·lipse (majúscula: cercle)", + "Empty": "Buit", + "Enable command drops in all rings": "Permet arrossegar les comandes dins tots els encapsulaments", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Introdueix el codi que correspon a la definició del bloc. Tria els teus propis noms (ignorant els que es mostren).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Introdueix el codi que correspon a la definició del bloc. Utilitza els noms dels paràmetres per mostrar-los i per referenciar el codi generat per la definició del cos", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Introdueix el codi que correspon a l'operació del bloc (normalment només una funció). Utilitza <#n> per referenciar els paràmetres actuals tal com es mostren.", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Escriviu cada opció en una línia. També podeu fer servir \"=\" com a separador entre clau i valor, per exemple resposta=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "S'ha d'escriure un traducció per línia, utilitzant els dos punts (\":\") per indicar la llengua i guionet baix (\"_\") indicant les ranures, exemple: ca:digues _ durant _ segons", + "Eraser tool": "Goma d'esborrar", + "Error": "problema", + "Examples": "Exemples", + "Execute on slider change": "Executa en utilitzar els lliscadors", + "Export Project As...": "Exporta el Projecte com…", + "Export all scripts as pic...": "Exporta tots els programes com una imatge…", + "Export blocks": "Exporta blocs", + "Export blocks...": "Exporta els blocs...", + "Export project as plain text...": "Exporta el projecte...", + "Export project...": "Exporta el projecte...", + "Export summary with drop-shadows...": "Exporta el resum amb les imatges ombrejades…", + "Export summary...": "Exporta el resum...", + "Extension blocks": "Blocs per Extensions", + "extent": "extensió", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "Extreu part de cadenes de text amb diversos criteris. El bloc \"multilínia\" permet afegir entrades de text multilínia en qualsevol entrada de blocs", + "Fade blocks": "Esvaïment dels blocs", + "Fade blocks...": "Esvaeix els blocs...", + "February": "febrer", + "Fetching project from the cloud...": "Descarregant el projecte des del núvol…", + "Fill a region": "Ompla l'àrea", + "Fill color (right click)": "Color d'Emplenament (botó dret)", + "Filled Ellipse (shift: circle)": "El·lipse plena (majúscula: cercle)", + "Filled Rectangle (shift: square)": "Rectangle ple (majúscula: quadrat)", + "First-Class Sprites": "Objectes de primera classe", + "Flat design": "Disseny pla", + "Flat line ends": "Puntes de llapis planes", + "For all Sprites": "Per a tots els objectes", + "Frequency Distribution Analysis": "Anàlisi de la distribució de freqüències", + "Generate costumes from letters or words of text.": "Genera vestits utilitzant lletres, paraules... o qualevol text.", + "Generate puzzle": "Converteix en exercici", + "Getters and setters": "Llegir i establir paràmetres del sistema", + "Glide, grow and rotate using easing functions.": "Fés lliscar, crèixer i girar els objectes utilitzant diferents formes i filtres a les animacions", + "HSL pen color model": "Model de color HSL", + "HOF version of ZIP, letting you \"hyperize\" any dyadic function": "Versió HOF (amb funcions d'ordre superior) de la compressió ZIP, que permet \"hiperitzar\" qualsevol funció diàdica (amb dos arguments)", + "Header mapping": "Mapeig de la capçalera", + "Hello!": "Hola!", + "Hello, World!": "Hola Món!", + "Help": "Ajuda", + "Hide blocks in palette": "Amaga blocs de la paleta", + "Hide blocks...": "Amaga blocs...", + "Hmm...": "Hmm...", + "Hummingbird robotics": "Hummingbird robòtics", + "Hyper blocks support": "Suport a hiperblocs", + "I have read and agree to the Terms of Service": "He llegit i accepto les condicions d'ús", + "If you cannot find that email, please check your spam folder.": "Si no l'heu rebut, comproveu primer el correu brossa.", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "I si no podeu trobar-ho, utilitzeu l'opció de \"Torna a enviar l'email de verificació\" a les opcions del Núvol del menú d'Snap!", + "Import": "Importa", + "Import a new costume from your webcam": "Importa un nou vestit amb la webcam", + "Import blocks": "Importa blocs", + "Import library": "Importa una llibreria", + "Import sound": "Importa sons", + "Import...": "Importa...", + "Imported": "S'ha importat", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "Incorpora les llibreries inicials de Paletes de color i Colors RGB. Utilitza tonalitats més ajustades (més taronges, menys verds, afegeix marrons) i una escala de color lineal que inclou escala de grisos i més matisos de tonalitat.", + "Infinite precision integers, exact rationals, complex": "Enters de precisió infinita, racionals exactes, complexos", + "Inheritance support": "Suport a l'herència d'objectes", + "Input Names:": "Noms d'entrades:", + "Input Slot Options": "Opcions de la ranura", + "Input name": "Nom de la ranura", + "Input sliders": "Lliscadors d'entrada", + "Inside a custom block": "En la definició d'un bloc", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "Interactua amb dispositius programats amb Microblocks per la WiFi. Els dispositius han de tenir una pantalla TFT, dos butons i connectivitat WiFi i tenir carregat el projecte Signada de MicroBlocks. Exemples compatibles són la placa ED1 del Citilab i múltiples dispositius tipus M5Stack.", + "Iteration, composition": "Iteracions i composició", + "JIT compiler support": "Suport a la compilació JIT", + "January": "gener", + "JavaScript extensions": "Extensions de Javascript", + "JavaScript extensions for Snap! are turned off": "Les extensions de JavaScript estan deshabilitades", + "JavaScript function ( _ ) { _ }": "JavaScript function ( _ ) { _ }", + "July": "juliol", + "June": "juny", + "Just the crayons, without the rest of the colors library. Fast and simple.": "Només els llapis de colors, sense la resta de la llibreria de colors. Més ràpida i simple.", + "Just Bars": "Només gràfics de barres", + "Just Words": "Només paraules", + "Keyboard Editing": "Edició per teclat", + "Kind of": "Espècie de", + "LEAP Motion controller": "Controladors per a LEAP Motion", + "Language...": "Llengua...", + "Libraries...": "Llibreries...", + "License": "Llicència", + "License...": "Llicència...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "La mateixa idea que la comanda \"switch\" en llenguatges tipus C o \"cond\" en Lisp. Gràcies a Nathan Dinsmore per inventar la idea de tenir un bloc separat per a cada branca!", + "Line tool (shift: constrain to 45º)": "Línies (majúscula: només angles de 45º)", + "Line tool (shift: vertical/horizontal)": "Línies (majúscula: vertical/horitzontal)", + "List": "Llista", + "List comprehension": "Compressió de llistes", + "List utilities": "Utilitats per a llistes", + "Lists": "Llistes", + "Live coding support": "Suport per a la programació dinàmica", + "Loading": "S'està carregant", + "Local Block(s) in Global Definition": "Blocs locals en una definició global", + "Log pen vectors": "Enregistra els dibuixos com a vectors", + "Login...": "Inicia la sessió...", + "Logout": "Surt", + "Long form input dialog": "Força el diàleg de selecció de tipus", + "Looks": "Aparença", + "Make a block": "Crea un bloc", + "Make a variable": "Crea una variable", + "Manipulate costumes pixel-wise.": "Manipulem els píxels dels vestits", + "March": "març", + "May": "maig", + "Message name": "Nom del missatge", + "Method Editor": "Editor de funcions", + "Microphone": "Micròfon", + "Microphone resolution...": "Resolució del micròfon...", + "Modules...": "Mòduls...", + "Motion": "Moviment", + "Multi-branched conditional": "Condicionals compostos", + "Multi-branched conditional (switch)": "Condicionals amb múltiples branques (diferents casos)", + "Multiple inputs (value is list of inputs)": "Entrades múltiples (el valor és una llista d'entrades)", + "Music Notation, Instruments, Drums, Tones, Chords, Tracks, from the University of Virginia (Glen Bull)": "Notació musical, instruments, bateries, tons, acords i pistes creats per la Universitat de Virginia (Glen Bull)", + "Nested auto-wrapping": "Engloba blocs interns", + "New": "Nou", + "New Category": "Nova Categoria", + "New Project": "Nou projecte", + "New category...": "Nova categoria...", + "New password:": "Nova contrasenya:", + "New scene": "Nova escena", + "No": "No", + "November": "novembre", + "Number": "Nombre", + "OK": "D'acord", + "Object": "Objecte", + "October": "octubre", + "Ok": "D'acord", + "Old password:": "Contrasenya actual:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "Una de les idees importants en Logo que no va ser inclosa a Scratch era pensar en els textos com a una estructura de paraules i frases, més que no com una llista de caràcters. Aquesta llibreria torna a desenvolupar aquesta idea.", + "Open": "Obre", + "Open Project": "Obre un projecte", + "Open in Community Site": "Obre en el Web Social", + "Open...": "Obre...", + "Opening project...": "Obrint el projecte…", + "Operators": "Operadors", + "Other": "Altres", + "Output text using speech synthesis.": "Utilitza la síntesi de veu per crear so des d'un text", + "Paint Editor": "Editor d'imatges", + "Paint a new costume": "Pinta un nou vestit.", + "Paint a shape (shift: edge color)": "Coloreja la forma (majúscula: el traçat)", + "Paint a shape (shift: secondary color)": "Coloreja la forma (majúscula: amb el color secundari)", + "Paintbrush tool (free draw)": "Pinzell (dibuix lliure)", + "Parallelization": "Processos en paral·lel", + "Part of": "Part de", + "Parts": "Parts", + "Password:": "Contrasenya:", + "Pen": "Llapis", + "Persist linked sublist IDs": "Desar mantenint les ID enllaçades a les subllistes", + "Persistent key-value storage across Snap! sessions in the same browser": "Desa al navegador dades (clau-valor) persistents entre sessions d'Snap!", + "Pipette tool (pick a color anywhere)": "Capturador de color (captura el color de qualsevol lloc)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Capturador de color (captura un color de qualsevol lloc Majúscules: pel color d'emplenament)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Capturador de color (captura un color de qualsevol lloc Majúscules: color secundari)", + "Pixels": "Píxels", + "Plain prototype labels": "Etiquetes de prototip simples", + "Play": "Toca", + "Play sound": "Toca el so", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Comproveu que el navegador està actualitzat i la webcam ben configurada. Alguns navegadors també requereixen HTTPS per a utilitzar la càmera. Podeu provar canviant a l'adreça el \"http://\" per \"https://\".", + "Please use the verification link that was sent to your email address when you signed up.": "Cal usar l'enllaç de verificació que s'ha enviat al vostre correu quan vau registrar l'usuari", + "Polygon": "Polígon", + "Predicate": "Predicat", + "Prefer empty slot drops": "Dóna preferència a les ranures buides", + "Privacy...": "Privacitat…", + "Project Notes": "Notes del projecte", + "Project URLs": "URL del projecte", + "Project notes...": "Notes del projecte...", + "Prompt the user to pick an option.": "Demana a l'usuari que triï una opció.", + "Provide 100 selected colors": "Facilita 100 colors ja seleccionats", + "Provide getters and setters for all GUI-controlled global settings": "Facilita la lectura i assignació de paràmetres de l'entorn controlats per la configuració", + "Publish": "Publica", + "Publish Project": "Publica el Projecte", + "Rasterize SVGs": "Transforma SVG en mapa de bits", + "Record a new sound": "Grava un so nou", + "Recover": "Recupera", + "Rectangle (shift: square)": "Rectangle (majúscula: quadrat)", + "Reference manual": "Manual de referència", + "Remove a category...": "Esborra una categoria...", + "Remove unused blocks": "Esborra blocs no utilitzats", + "Repeat Password:": "Repeteix la contrasenya:", + "Repeat new password:": "Torna a escriure la nova contrasenya:", + "Replace Letters": "Substitueix Lletres", + "Replace Project": "Substitueix el Projecte", + "Replace all occurrences of a letter or a sequence of letters with another in a text.": "Substitueix totes les aparicions d'una lletra o d'una seqüència de lletres per unes altres en un text.", + "Replace the current project with a new one?": "Vols substituir el projecte actual per un de nou?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Reporta la posició de les mans des de un controlador de moviment LEAP (leapmotion.com).", + "Reporter": "Reportador", + "Request blocked": "Petició denegada", + "Resend Verification Email...": "Torna a enviar l'email de verificació...", + "Resend verification email": "Reenviament del mail", + "Reset Password...": "Recupera la contrasenya…", + "Reset password": "Recupera la contrasenya", + "Restore unsaved project": "Recupera el projecte no desat", + "Retina display support": "Suport per pantalles Retina", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Executa un programa i, si troba alguna errada, no atura el programa reportant un avís vermell sobre el bloc, sinó que permet definir un altre programa que pugui evitar aquesta errada. També inclou un bloc per enviar missatges d'errades i també un altre per crear variables de programa i assignar el seu valor.", + "Run several scripts in parallel and wait until all are done.": "Executa diversos scripts en paral·lel, i espera que hagin acabat tots els processos abans d'aturar-se", + "SVG costumes are not yet fully supported in every browser": "els vestits SVG encara o són suportatsper tots els navegadors", + "Same Named Blocks": "Blocs amb el mateix nom", + "Save": "Desa", + "Save As...": "Anomena i desa...", + "Save Project": "Desa el Projecte", + "Save Project As...": "Anomena i desa el projecte...", + "Save to disk": "Desa al disc", + "Saved!": "Desat!", + "Saving project to the cloud...": "Desant el projecte al núvol…", + "Scenes...": "Escenes...", + "Scientific Functions, Graphing, SQL interface, Machine Learning, from Uni Göttingen (Eckart Modrow)": "Funcions científiques, gràfics, comandes SQL i 'Machine Learning' creats per la Universitat de Göttingen (Eckart Modrow)", + "Script variable name": "Nom de la variable de programa", + "Scripts": "Programes", + "Select a costume from the media library": "Trieu un vestit de la biblioteca", + "Select a sound from the media library": "Trieu un so de la biblioteca", + "Select categories of additional blocks to add to this project.": "Trieu conjunts de blocs addicionals per afegir a aquest projecte.", + "Selection tool": "Eina de selecció", + "Sensing": "Sensors", + "September": "setembre", + "Serial Ports": "Ports sèrie", + "Service:": "Servei:", + "Set RGB or HSV pen color": "Estableix el color del llapis amb RGB o HSV", + "Set the rotation center": "Estableix el centre de rotació", + "Share": "Comparteix", + "Share Project": "Comparteix el Projecte", + "Show buttons": "Mostra els botons", + "Show categories": "Mostra les categories", + "Sign in": "Inicia la sessió", + "Sign up": "Registra't", + "Signada (Network remote control)": "Signada (control remot per xarxa)", + "Signup": "Registra't", + "Signup...": "Registra't...", + "Single input.": "Entrada única.", + "Single palette": "Paleta única", + "Slider maximum value": "Valor màxim del lliscador...", + "Slider minimum value": "Valor mínim del lliscador...", + "Snap! website": "Web de Snap!", + "Snap!Cloud": "Núvol d'Snap!", + "Some standard functions on lists (reverse, sort, etc.)": "Funcions estàndard per a llistes (capgira, ordena, etc.)", + "Sound": "So", + "Sound Recorder": "Gravadora de So", + "Sounds": "Sons", + "Sprite": "Objecte", + "Sprite Nesting": "Ancoratge d'objectes", + "Stage": "Escenari", + "Stage height": "Alçada de l'escenari", + "Stage selected: no motion primitives": "Esteu a l'Escenari: no hi ha primitives de moviment disponibles", + "Stage size": "Mida de l'escenari", + "Stage size...": "Mida de l'escenari...", + "Stage width": "Amplada de l'escenari", + "Stop": "Atura", + "Stop sound": "Atura el so", + "Streams (lazy lists)": "Streams (llistes presconstruides)", + "Strings, Multi-line input": "Operadors de text i entrades multilínia", + "Stroked Ellipse (shift: circle)": "El·lipse traçada (majúscula: circumferència)", + "Stroked Rectangle (shift: square)": "Rectangle traçat (majúscula: quadrat)", + "Switch back to user mode": "Torna a mode d'usuari", + "Switch to dev mode": "Canvia a mode desenvolupador", + "Switch to vector editor?": "Voleu canviar a l'editor vectorial?", + "Table lines": "Línies de taules", + "Table support": "Edició de taules", + "Table view": "Vista de taula", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "Agafa una taula (normalment obtinguda des d'un fitxer CSV) com a entrada i obté un resum de la taula agrupant les dades pel camp especificat pel número de columna. Les altres tres entrades només s'utilitzen si els valors d'aquest camp són nombres, i llavors permet agrupar-los (per exemple en dècades, segles...). Aquestes tres entrades indiquen els valors més petits i més grans dels grups i, més important, la longitud de l'agrupació (10 per dècades, 100 per segles). Si el camp no és numèric, cal deixar aquests tres camps buits o a zero. En aquest darrer cas, cada valor de text farà una agrupació (una dada a representar) i apareixerà en ordre alfabètic. El bloc retorna una nova taula amb tres columnes. La primera té el nom del grup. La segona el número de registres que té cada grup. I la tercera té una altra taula amb els registres originals que s'han agrupat. Si les agrupacions no tenen una amplada constant o es vol agrupar per alguna funció o per més d'un camp, cal utilitzar la llibreria \"Anàlisi de la distribució de freqüències\".", + "Terms of Service...": "Condicions d'ús…", + "Ternary Boolean slots": "Tres opcions per a les ranures booleanes", + "Text": "Text", + "Text Costumes": "Text als vestits", + "Text to Speech": "Lector de text", + "Text to speech": "Lector de text", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "Ens ofereix la implementació numèrica de Scheme. Cal habilitar els \"Big Nums\" (amb el bloc \"USE BIGNUMS\" a cert) per utilitzar-ho", + "The question came up at": "La incidència ha sorgit en", + "This global block definition contains one or more local custom blocks which must be removed first.": "Aquest bloc global té un o més blocs locals. No poden estar dins la definició del bloc global.", + "This will convert your vector objects into bitmaps,": "El canvi convertirà els objectes vectorials en un mapa de bits,", + "This will erase your current drawing.": "El canvi d'editor esborrarà el dibuix actual.", + "Thread safe scripts": "Fil d'execució segur", + "Tiles": "Rajoles d'escenari", + "Title text": "Text del títol", + "Today": "Avui", + "Today,": "Avui,", + "Top": "A dalt", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Construcció de bucles estàndard (while, until, etc.), construccions \"named let\" pròpies de Lisp (una generalització dels bucles \"for\"), iteració funcional (repeticions de crides a una funció) i composició de funcions.", + "Translations": "Traduccions", + "Translators...": "Traductors", + "Turbo mode": "Mode turbo", + "Turn sprites by a delta of degrees moving them at a given radius": "Creeu arcs tot girant els objectes un número de graus i movent-los en un radi determinat", + "Turtle": "Tortuga", + "Undelete sprites...": "Recupera objectes...", + "Unpublish": "Despublica", + "Unpublish Project": "Deixar de publicar el Projecte", + "Unsaved Changes!": "Hi ha canvis sense desar!", + "Unshare": "Deixa de compartir", + "Unshare Project": "Deixa de compartir el Projecte", + "Untitled": "Sense títol", + "Unused blocks...": "Blocs no utilitzats...", + "Unverified account:": "Compte no verificat:", + "Up": "Amunt", + "Updating project list...": "Actualizant la llista de projectes…", + "Uploading": "Pujant", + "Upvar - make internal variable visible to caller": "Variable interna visible des de l'exterior", + "Use CPU for graphics": "Utiliza la CPU pels gràfics", + "Use texts as if they were lists of words. A minimal variant of the Words/Sentences library for language projects like chat bots.": "Utilitza els textos com si fossin llistes de paraules. Una variant mínima de la llibreria 'Paraules i Frases' per a projectes lingüístics com ara un xat amb un robot.", + "User name must be four characters or longer": "El nom d'usuari ha de tenir almenys 4 caràcters.", + "User name:": "Nom d'usuari:", + "Variable name": "Nom de variable", + "Variables": "Variables", + "Variadic reporters": "Càlculs multientrada", + "Vector": "Vector", + "Vector Paint Editor": "Editor vectorial d'imatges", + "Versions of +, x, AND, and OR that take more than two inputs.": "Versions dels blocs +, x, AND i OR que tenen més de dues ranures", + "Visible stepping": "Monitoritzar pas a pas", + "Web Audio API is not supported in this browser": "aquest navegador no és compatible amb l'API de Web Audio", + "Web services access (https)": "Accés a serveis Web (https)", + "Words, sentences": "Paraules i frases", + "World Map": "Mapa del món", + "World...": "Món...", + "Would you like to replace it?": "Esteu segur que voleu reemplaçar-lo?", + "Wrap list indices": "Índexs de llistes continus", + "Yes": "Sí", + "Yesterday": "Ahir", + "Yesterday,": "Ahir,", + "You are not logged in": "No esteu validats", + "You are now logged in, and your account is enabled for three days.": "Ara esteu validats, però el vostre compte és només vàlid per 3 dies.", + "You have": "Teniu", + "Zebra coloring": "Coloració en zebra", + "Zoom blocks": "Canvia la mida dels blocs", + "Zoom blocks...": "Mida dels blocs...", + "_ at _": "_ en _", + "_ combine _ using _": "_ combina els elements de _ amb _", + "_ contains _": "_ conté _", + "_ effect": "efecte _", + "_ find first item _ in _": "_ primer element on _ de _", + "_ in front of _": "afegeix _ davant de _", + "_ keep items _ from _": "_ manté els elements on _ de _", + "_ map _ over _": "_ mapeja _ sobre _", + "_ mod _": "residu de dividir _ entre _", + "_ of _": "_ de _", + "_ of block _": "_ del bloc _", + "_ of costume _": "_ del vestit _", + "_ of sound _": "_ del so _", + "_ of text _": "_ del text _", + "_ to _": "_ a _", + "__shout__go__": "bandera verda premuda", + "a": "a", + "a custom block definition is missing": "no es troba una definició de bloc", + "a new clone of _": "un nou clon de _", + "a variable of name '": "una variable de nom '", + "about morphic.js...": "sobre morphic.js...", + "abs": "valor absolut", + "acos": "acos", + "add _ to _": "afegeix _ a _", + "add a new Turtle sprite": "afegeix un nou objecte", + "add a new sprite": "afegeix un nou objecte", + "add comment": "afegeix un comentari", + "add comment here...": "afegeix un comentari aquí...", + "agent": "objecte", + "alert _": "alerta: _", + "all": "tots", + "all <": "tot < en", + "all =": "tots =", + "all >": "tot > en", + "all but first of _": "_ sense el primer element", + "all but this script": "tot excepte aquest programa", + "all identical": "tot idèntic", + "all scenes": "totes les escenes", + "all ≤": "tot ≤ en", + "all ≥": "tot ≥ en", + "alpha value:": "valor del canal alfa:", + "anchor": "àncora", + "and": "i", + "and send": "i envia", + "and you will not be able to convert them back into vector drawings.": "i no es podrà tornar enrere ni recuperar els objectes vectorials.", + "animation demo": "exemple d'animació", + "answer": "resposta", + "any": "qualsevol", + "any key": "qualsevol tecla", + "any message": "qualsevol missatge", + "anything": "qualsevol element", + "append _": "annexa _", + "arrange scripts vertically": "alinea els programes verticalment", + "arrowDown": "fletxa avall", + "arrowDownOutline": "contorn de fletxa avall", + "arrowLeft": "fletxa a l'esquerra", + "arrowLeftOutline": "contorn de fletxa a l'esquerra", + "arrowRight": "fletxa a la dreta", + "arrowRightOutline": "contorn de fletxa a la dreta", + "arrowUp": "fletxa amunt", + "arrowUpOutline": "contorn de fletxa amunt", + "asin": "asin", + "ask _ and wait": "pregunta _ i espera", + "ask _ for _ _": "pregunta a _ per _ _", + "atan": "atan", + "attach...": "enganxa...", + "b": "b", + "back": "darrere", + "balance": "balanç", + "big (2x)": "gran (2x)", + "bigger menu fonts and sliders": "fa més grans els lliscadors i els menús", + "bins": "resolució", + "block": "bloc", + "block deletion dialog text": "Esteu segur que voleu esborrar la definició d'aquest bloc?", + "block variables": "variables del bloc", + "block variables...": "variables del bloc…", + "block-solid (0)": "normal (0)", + "blockify": "en forma de blocs", + "blocks": "blocs", + "blue": "blau", + "blurred shadows...": "ombres degradades...", + "blurry shades, use for new browsers": "utilitza ombres degradades per a navegadors moderns", + "bottom": "inferior", + "box": "caixa", + "brightness": "brillantor", + "broadcast _ _": "Envia _ _", + "broadcast _ _ and wait": "Envia _ _ i espera", + "brush": "pinzell", + "build": "construeix", + "but getting a": "però s'ha rebut un/a", + "c": "c", + "call _ _": "crida _ _", + "call _ w/continuation": "crida _ amb continuació", + "caller": "executor", + "camera": "càmera", + "can only write text or numbers, not a": "només pot escriure text o números, no un/a", + "can rotate": "pot girar", + "cannot handle zero width or height": "no pot tenir una amplada o alçada de zero", + "cannot operate on a deleted sprite": "no pot funcionar en un objecte esborrat", + "cannot send media, sprites or procedures to another scene": "no es pot enviar multimedia, ni objectes ni funcions a altres escenes", + "case sensitivity": "distinció de majúscules", + "categories": "categories", + "category": "categoria", + "ceiling": "sostre", + "center": "centre", + "center x": "centre x", + "center y": "centre y", + "change _ by _": "augmenta _ en _", + "change _ effect by _": "augmenta l'efecte _ en _", + "change background _ by _": "augmenta _ del fons en _", + "change balance by _": "augmenta el balanç en _", + "change pen _ by _": "augmenta _ del llapis en _", + "change pen color by _": "augmenta en _ el color del llapis", + "change pen shade by _": "augmenta en _ la intensitat del llapis", + "change pen size by _": "augmenta en _ la mida del llapis", + "change size by _": "augmenta _ la mida", + "change tempo by _": "augmenta el tempo en _", + "change volume by _": "augmenta el volum en _", + "change x by _": "suma _ a x", + "change y by _": "suma _ a y", + "check for alternative GUI design": "marqueu per obtenir una interfície gràfica alternativa", + "check for block to text mapping features": "marqueu per habilitar les funcionalitats de mapeig de blocs en codi", + "check for flat ends of lines": "marqueu per fer que les puntes dels llapis siguin planes", + "check for higher contrast table views": "marqueu per obtenir un contrast més alt a la vista de taula", + "check for higher resolution, uses more computing resources": "marqueu per obtenir una resolució meś alta; implicarà més consum de memòria..", + "check for multi-column list view support": "marqueu per habilitar el suport a la vista de llista amb multicolumnes", + "check for sprite inheritance features": "marqueu per habilitar les funcionalitats relatives a l'herència d'objectes", + "check for wrapping\nlist indices": "marqueu per fer continus\nels índexs de les llistes", + "check to allow empty Boolean slots": "marqueu per permetre tornar a deixar buides les ranures booleanes", + "check to always show slot types in the input dialog": "marqueu per a mostrar sempre el diàleg de selecció de tipus en afegir paràmetres als blocs personalitzats", + "check to cache inputs boosts recursion": "marqueu per a desar les entrades a la memòria cau (accelera la recursivitat)", + "check to cache\nsprite renderings": "marqueu per usar la memòria cau\nen renderitzar els objectes", + "check to disable directly running blocks by clicking on them": "marqueu per a deshabilitar l'execució directa dels blocs en clicar-los", + "check to disallow script reentrance": "marqueu per no permetre la re-entrada als programes", + "check to distinguish upper- and lowercase when comparing texts": "marqueu per habilitar la distinció entre majúscules i minúscules en comparar textos", + "check to enable IDE animations": "marqueu per habilitar les animacions de la interfície", + "check to enable alternating colors for nested blocks": "marqueu per habilitar la coloració alternada per a blocs imbricats", + "check to enable auto-wrapping inside nested block stacks": "marqueu per habilitar l'englobament de blocs interns", + "check to enable camera support": "marqueu per habilitar el suport a càmeres", + "check to enable dropping commands in all rings": "marqueu per habilitar l'arrossegament de comandes en tots els encapsulaments", + "check to enable dynamic labels for variadic inputs": "marqueu per habilitar les etiquetes dinàmiques en camps variables", + "check to enable input sliders for entry fields": "marqueu per habilitar els lliscadors per als camps d'entrada", + "check to enable keyboard editing support": "marqueu per habilitar el suport a l'edició per teclat", + "check to enable project data in URLs": "marqueu per habilitar les dades del projecte a la URL", + "check to enable saving linked sublist identities": "marqueu per habilitar l'emmagatzament de les ID enllaçades a les subllistes.", + "check to enable sprite composition": "marqueu per habilitar l'ancoratge d'objectes", + "check to enable support for first-class sprite": "marqueu per habilitar el suport als objectes de primera classe.", + "check to enable using operators on lists and tables": "marqueu per habilitar la utilització dels operadors sobre llistes i taules", + "check to hide (+) symbols in block prototype labels": "marqueu per amagar el símbol (+) en les etiquetes de prototip de bloc (a l'editor de blocs)", + "check to inherit from": "marqueu per heretar de", + "check to prevent contents from being saved": "activeu l'opció per evitar que els continguts es desin", + "check to prioritize script execution": "marqueu per activar el mode de prioritat en l'execució de programes", + "check to rasterize SVGs on import": "marqueu per transformar els SVG a mapa de bits en importar", + "check to run the edited script when moving the slider": "marqueu per habilitar l'execució dels programes en utilitzar els seus lliscadors", + "check to show all blocks in a single palette": "marqueu per mostrar tots els blocs en una paleta única", + "check to show buttons in the palette": "marqueu per mostrar els botons a la paleta", + "check to show category names in the palette": "marqueu per mostrar el nom de les categories a la paleta", + "check to show extension primitives in the palette": "marqueu per mostrar els blocs de primitives per a les exensions a la paleta", + "check to show in palette": "marqueu per mostrar-lo a la paleta de blocs", + "check to support native JavaScript functions": "marqueu per habilitar l'execució de Javascript", + "check to switch pen colors and graphic effects to HSL": "marqueu per canviar el model de color del llapis i dels efectes gràfics a HSL", + "check to turn block clicking sound on": "marqueu per habilitar el so de clic en clicar sobre els blocs", + "check to turn on logging pen vectors": "marqueu per iniciar l'enregistrament dels dibuixos com a vectors", + "check to turn on visible stepping (slow)": "marqueu per monitoritzar la programació per pas a pas (alenteix)", + "check to use blurred drop shadows and highlights": "marqueu per utilitzar ombres i realçats suavitzats", + "children": "fill", + "choose another color for this morph": "trieu un altre color per aquest 'morph'", + "choose the World's background color": "tria el color de fons del Món", + "circle": "circumferència", + "circle box": "caixa circular", + "circleSolid": "cercle", + "clean up": "neteja", + "clear": "neteja", + "clear graphic effects": "treu els efectes gràfics", + "clear undrop queue": "esborra la llista d'accions desades", + "click or drag crosshairs to move the rotation center": "clica o arrossega la creueta per moure el centre de rotació", + "clicked": "es cliqui", + "clone": "clona", + "clones": "clons", + "closedBrush": "pinzell tancat", + "cloud": "núvol", + "cloud unavailable without a web server.": "el núvol no està disponible sense un servidor web.", + "cloudGradient": "núvol amb gradient", + "cloudOutline": "contor de núvol", + "code": "codi", + "code mapping...": "mapejant el codi…", + "code of _": "codi de _", + "collection": "col·lecció", + "color": "color", + "color _ is touching _ ?": "color _ sobre _ ?", + "color palette": "paleta de colors", + "color picker": "selector de color", + "color...": "color...", + "color:": "color:", + "columns": "columnes", + "combinations _": "combinacions de _", + "combine _ using _": "combina els elements de _ amb _", + "comic": "còmic", + "command": "comanda", + "comment": "comentari", + "comment pic...": "imatge del comentari…", + "compile": "compila", + "compile _": "compila _", + "compile _ for _ args": "compila _ per _ arguments", + "confetti": "confeti", + "console log _": "log per consola: _", + "continuation": "continuació", + "continuations cannot be forked": "les continuacions no poden separar-se", + "cos": "cos", + "costume": "vestit", + "costume #": "número de vestit", + "costume name": "nom del vestit", + "costumes": "vestits", + "costumes tab help": "podeu importar una imatge des d'un altre lloc Web o des del vostre ordinador arrossegant-la fins aquí", + "could not connect to:": "no es pot connectar a:", + "cr": "retorn de carro", + "create a clone of _": "crea un clon de _", + "cross": "creu", + "crosshairs": "punt de mira", + "current": "actual", + "current _": "_ actual", + "current module versions:": "versions actuals dels mòduls", + "current parent": "pare actual", + "custom?": "personalitzat?", + "cut from _": "retalla de _", + "d": "d", + "dangling?": "penjat?", + "data": "dades", + "date": "dia", + "day of week": "dia de la setmana", + "days left": "dies de termini", + "days left.": "dies de termini.", + "defaults": "valors per defecte", + "define _ _ _": "defineix _ _ _", + "definition": "definició", + "delete": "esborra'm", + "delete _": "esborra _", + "delete _ of _": "esborra _ de _", + "delete a category...": "esborra una categoria...", + "delete block _": "esborra Block _", + "delete block definition...": "esborra la definició d'aquest bloc", + "delete slot": "esborra la ranura", + "delete solution": "esborra la solució", + "delete this clone": "esborra aquest clon", + "delete variable": "esborra la variable", + "delimiter": "limitaodr", + "demo (1.2x)": "demostració (1.2x)", + "demo...": "exemple...", + "detach all parts": "desenganxa totes les parts", + "detach and put into the hand": "arrossega i mou amb el punter", + "detach from": "desenganxa de", + "development mode": "mode de desenvolupament", + "development mode debugging primitives:": "mode de desenvolupament primitives de depuració", + "development mode...": "mode de desenvolupament", + "dimensions": "dimensions", + "direction": "direcció", + "disable deep-Morphic context menus and show user-friendly ones": "canvia els menús contextuals primitius de Morphic per menús més amigables", + "disable developers' context menus": "desabilita els menús del mode de desenvolupament", + "disable dragging media and blocks out of watchers and balloons": "marqueu per deshabilitar l'arrossegament d'objectes, imatgess i blocs fora dels visors de variables i de les bafarades de diàleg", + "disconnected.": "desconnectat.", + "distance": "distància", + "distance to _": "distància a _", + "distribution": "distribució", + "don't rotate": "no gira", + "down arrow": "fletxa avall", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "Desa i descarrega un resum del projecte amb totes les imatges ombrejades. No tots els navegadors suporten aquesta funcionalitat", + "download script": "descarrega el programa", + "download this script as an XML file": "descarrega el programa en un fitxer XML", + "draggable": "arrossegable?", + "draggable?": "arrossegable?", + "dragging threshold": "llindar per l'arrossegament", + "dropped": "es deixi anar", + "duplicate": "duplica", + "duplicate block definition...": "duplica la definició d'aquest bloc", + "duration": "durada", + "e": "e", + "e^": "e^", + "edge": "vora", + "edit": "edita", + "edit rotation point only...": "edita només el centre de rotació…", + "edit the costume's rotation center": "canvia el centre de rotació del vestit", + "edit...": "edita...", + "editables": "editables", + "elegant (90)": "elegant (90)", + "else if _ _": "i si _ _", + "enable Morphic context menus and inspectors, not user-friendly!": "habilita els menús contextuals de Morphic i inspectors, mode expert!", + "enter": "retorn", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "entrant en mode desenvolupador. deshabilitada la captura d'errades, utilitzeu la consola del navegador per veure els errors.", + "entering user mode": "entrant en mode d'usuari", + "eraser": "goma d'esborrar", + "exceeding maximum number of clones": "s'ha sobrepassat el número màxi de clons", + "expecting": "esperant", + "expecting a": "s'esperava un/a", + "expecting a finite number but getting Infinity or NaN": "ha de ser un número finit però s'ha rebut infinit o NaN", + "experimental - under construction": "Experimental - en construcció", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "és experimental! accelera aquest reportador executant-lo ininterrompudament COMPTE: Errades en les condicions d'entrada podrien penjar la sessió d'Snap!", + "export": "exporta", + "export block definition...": "exporta aquest bloc...", + "export pen trails line segments as SVG": "exporta els vectors dibuixats com a fitxer SVG", + "export project as cloud data...": "exporta el projecte com a dades en el núvol…", + "export project media only...": "exporta només els sons i imatges del projecte…", + "export project without media...": "exporta el projecte sense sons ni imatges…", + "export script": "exporta el programa", + "export...": "exporta...", + "extract": "extreu", + "extract solution": "extreu la solució", + "f": "f", + "false": "fals", + "file": "arxiu", + "file menu import hint": "Importa projectes, blocs, imatges o sons", + "fill": "omple", + "fill page...": "omple la finestra...", + "filtered for _": "filtrat per a _", + "find blocks": "Cerca blocs", + "find blocks...": "cerca blocs…", + "find first item _ in _": "primer element on _ de _", + "find unused global custom blocks and remove their definitions": "cerca els blocs personalitzats globals que no s'utilitzan per poder esborrar-los", + "fisheye": "ull de peix", + "flag": "bandera", + "flash": "llamp", + "flat line ends": "puntes de llapis planes", + "flatten": "aplanament", + "flip ↔": "invertir ↔", + "flip ↕": "invertir ↕", + "floor": "part entera", + "footprints": "petjades", + "for _ = _ to _ _": "per _ = _ fins _ _", + "for all sprites": "per a tots els objectes", + "for each _ in _ _": "per cada _ de _ _", + "for this sprite only": "només per a aquest objecte", + "forever _": "per sempre _", + "frame": "marc", + "frames": "frames", + "frequencies": "freqüències", + "frequency": "freqüència", + "front": "davant", + "fullScreen": "pantalla sencera", + "g": "g", + "gears": "engranatge", + "generate a Parson's Puzzle\nfrom the current sprite": "crea un objecte com a exercici\n(problema de Parson) de l'objecte actual", + "get blocks": "obté els blocs", + "get data": "obté les dades", + "ghost": "fantasma", + "giant (8x)": "gegant (8x)", + "glide _ secs to x: _ y: _": "llisca en _ segons fins a x: _ y: _", + "global?": "global?", + "globe": "món", + "go back _ layers": "vés _ capes darrera", + "go to _": "vés a _", + "go to _ layer": "vés a la capa del _", + "go to x: _ y: _": "vés a x: _ y: _", + "gray scale palette": "paleta d'escala de grisos", + "green": "verd", + "grow": "augmentar", + "h": "h", + "handle": "nansa", + "header": "capçalera", + "header mapping...": "mapejant la capçalera…", + "height": "alçada", + "hello": "hola", + "help": "ajuda", + "help...": "ajuda...", + "hide": "amaga", + "hide all...": "amaga-ho tot", + "hide blocks...": "amaga blocs...", + "hide variable _": "amaga la variable _", + "high": "alta", + "hour": "hora", + "http:// _": "http:// _", + "hue": "tonalitat", + "huge (4x)": "immens (4x)", + "i": "i", + "identical to": "idèntic a", + "if _ _": "si _ llavors _", + "if _ _ _": "si _ _ _", + "if _ _ else _": "si _ llavors _ si no _", + "if _ then _ else _": "si _ llavors _ si no _", + "if on edge, bounce": "rebota en tocar una vora", + "import a sound from your computer\nby dragging it into here": "podeu importar un so des del vostre ordinador\narrossegant-lo fins aquí", + "import without attempting to parse or format data": "importa contingut sense tractar-lo ni donar-li format", + "import...": "importa...", + "in palette": "a la paleta", + "including dependencies": "amb les seves dependències", + "index": "índex", + "index of _ in _": "índex de _ a _", + "inherit _": "hereta _", + "inherited": "heretat", + "input list:": "llista d'entrades:", + "input names:": "noms d'entrades:", + "input(s), but getting": "com a entrada(s), però s'ha rebut", + "inputs": "entrades", + "insert _ at _ of _": "insereix _ a la posició _ de _", + "insert a slot": "afegeix una ranura", + "insert a variable": "afegeix una variable", + "inspect...": "examina...", + "is _ ?": "és _ ?", + "is _ a _ ?": "és _ un _ ?", + "is _ empty?": "_ buida?", + "is _ on?": "paràmetre _ actiu?", + "is not a valid option": "no és una opció vàlida", + "is read-only": "és només de lectura", + "item": "element", + "item _ of _": "element _ de _", + "items": "elements", + "j": "j", + "join _": "uneix _", + "jukebox": "sons", + "k": "k", + "keep all submorphs within and visible": "manté tots els 'submorphs' a dins i visibles", + "keep items _ from _": "manté els elements on _ de _", + "key": "tecla", + "key _ pressed?": "tecla _ premuda?", + "keyboard": "teclat", + "keyboardFilled": "plantilla de teclat", + "l": "l", + "label": "etiqueta", + "language_name": "Català", + "language_translator": "Joan Guillén i Pelegay, Bernat Romagosa Carrasquer", + "large": "gran", + "last": "últim", + "last changed": "el darrer modificat", + "last_changed": "2023-02-27", + "launch _ _": "llança _ _", + "left": "esquerra", + "left arrow": "fletxa esquerra", + "length": "longitud", + "length of _": "longitud del text _", + "length:": "longitud:", + "let the World automatically adjust to browser resizing": "permet que el Món s'ajusti automàticament al canvi de mida de la finestra", + "letter": "lletra", + "letter _ of _": "lletra _ de _", + "light (70)": "clar (70)", + "lightness": "lluminositat", + "line": "línia", + "lines": "línies", + "list": "llista", + "list _": "llista _", + "list view...": "vista en format de llista...", + "ln": "ln", + "location": "localització", + "lock": "bloqueja", + "log pen vectors": "enregistra els dibuixos com a vectors", + "login": "autenticació", + "loop": "bucle", + "low": "baixa", + "lower case": "minúscules", + "m": "m", + "magnifierOutline": "contorn de lupa", + "magnifyingGlass": "lupa", + "make a block...": "crea un bloc...", + "make a category...": "crea una categoria...", + "make a copy and pick it up": "fés una còpia i pren-la", + "make a morph": "crea un 'morph'", + "make temporary and hide in the sprite corral": "transforma'l en temporal i treu-lo de l'àrea dels objectes", + "make this morph movable": "fés que aquest 'morph' es pugui moure", + "make this morph unmovable": "fés que aquest 'morph' no es pugui moure", + "map String to code _": "mapeja un text com a codi _", + "map _ of _ to code _": "mapeja _ de _ no com a codi _", + "map _ over _": "mapeja _ sobre _", + "map _ to _ _": "mapeja _ com a _ _", + "max": "màxima", + "maximum": "màxim", + "medium (50)": "mitjà (50)", + "menus": "menús", + "message": "missatge", + "microphone _": "_ del micròfon", + "middle": "mig", + "minimum": "mínim", + "minute": "minut", + "mirror video": "mirall sobre el vídeo", + "missing / unspecified extension": "no es troba o no es coneix l'extensió", + "monstrous (10x)": "monstruós (10x)", + "month": "mes", + "mosaic": "mosaic", + "motion": "moviment", + "mouse down?": "ratolí clicat?", + "mouse position": "posició del ratolí", + "mouse x": "ratolí x", + "mouse y": "ratolí y", + "mouse-departed": "el ratolí surti d'", + "mouse-entered": "el ratolí toqui", + "mouse-pointer": "punter del ratolí", + "move": "mou", + "move _ steps": "mou-te _ passos", + "move all inside...": "mou tot a dins", + "move...": "mou...", + "my": "atribut", + "my _": "atribut _", + "my anchor": "atribut àncora", + "my dangling?": "atribut penjat?", + "my draggable?": "atribut arrossegable?", + "my name": "atribut nom", + "my parent": "atribut pare", + "my rotation style": "atribut estil de rotació", + "my rotation x": "atribut x", + "my rotation y": "atribut y", + "my temporary?": "atribut temporal?", + "myself": "mi mateix", + "n": "n", + "name": "nom", + "neg": "oposat", + "negative": "negatiu", + "neighbors": "veïns", + "neighbors ≠": "tots els veïns ≠ en", + "new costume _ width _ height _": "nou vestit _ d'amplada _ i alçada _", + "new line": "nova línia", + "new sound _ rate _ Hz": "nou so _ a _ Hz", + "new...": "nou...", + "next": "següent", + "next costume": "següent vestit", + "none": "cap bloc", + "normal": "normal", + "normal (1x)": "normal (1x)", + "normalScreen": "pantalla normal", + "normalStage": "escenari normal", + "not": "no", + "not _": "no _", + "note": "nota", + "nothing": "res", + "now connected.": "heu entrat.", + "number": "nombre", + "number of channels": "número de canals", + "numbers from _ to _": "nombres des de _ a _", + "o": "o", + "object _": "objecte _", + "octagon": "octàgon", + "only duplicate this block": "duplica només aquest bloc", + "only face left/right": "només mira a esquerra/dreta", + "only grab this block": "i fes servir només aquest bloc", + "open a new window with a picture of this morph": "obre una finestra amb la imatge del Món", + "open a new window with a picture of this script": "obre una nova finestra amb la imatge del programa", + "open a window on all properties": "obre una finestra amb totes les propietats", + "open in another dialog...": "obriu en un altre formulari…", + "open in dialog...": "obre en una finestra...", + "open shared project from cloud...": "obre un projecte compartit en el núvol…", + "options...": "opcions…", + "or": "o", + "or before": "o abans de", + "other clones": "altres clons", + "other scripts in sprite": "els altres programes d'aquest objecte", + "other sprites": "els altres objectes", + "p": "p", + "paint a new sprite": "Pinta un nou objecte", + "paintbucket": "pot de pintura", + "parameters": "paràmetres", + "parent": "pare", + "parent...": "pare…", + "parts": "parts", + "password has been changed.": "s'ha canviat la contrasenya.", + "password must be six characters or longer": "la contrasenya ha de tenir almenys sis caràcters.", + "passwords do not match": "les contrasenyes no coincideixen.", + "paste on _": "estampa sobre _", + "pause": "pausa", + "pause all _": "pausa-ho tot _", + "pen": "llapis", + "pen _": "_ del llapis", + "pen down": "baixa el llapis", + "pen down?": "llapis abaixat?", + "pen trails": "dibuix sobre l'escenari", + "pen up": "puja el llapis", + "pen vectors": "vectors dibuixats", + "pic...": "imatge...", + "pick random _ to _": "nombre a l'atzar entre _ i _", + "pick up": "pren aquest 'morph'", + "pipe _ $arrowRight _": "canalitza _ $arrowRight _", + "pipette": "pipeta", + "pitch": "to", + "pivot": "pivota", + "pixel": "píxel", + "pixelate": "pixelat", + "pixels": "píxels", + "play _ Hz for _ secs": "toca _ Hz durant _ segons", + "play frequency _ Hz": "toca la freqüència _ Hz", + "play note _ for _ beats": "toca la nota _ durant _ temps", + "play sound _": "toca el so _", + "play sound _ at _ Hz": "toca el so _ a _ Hz", + "play sound _ until done": "toca el so _ fins que acabi", + "please agree to the TOS": "s'han d'acceptarles condicions d'ús.", + "please fill out this field": "s'ha d'omplir aquest camp.", + "please provide a valid email address": "s'ha de introduir un correu vàlid.", + "point in direction _": "apunta en direcció _", + "point towards _": "apunta cap a _", + "pointRight": "punter", + "polygon": "polígon", + "position": "posició", + "poster": "póster", + "predicate": "predicat", + "presentation (1.4x)": "presentació (1.4x)", + "pressed": "es premi", + "previous": "prèvia", + "processes": "processos", + "product": "producte", + "published.": "publicat.", + "publishing project...": "publicant el projecte...", + "q": "q", + "r": "r", + "r-g-b-a": "color RGBA", + "random": "qualsevol", + "random position": "qualsevol posició", + "rank": "rang", + "raw data...": "importa sense processar...", + "ray length": "distància de xoc", + "read-only": "només de lectura", + "receivers...": "receptors...", + "recording": "gravació", + "rectangle": "rectangle", + "rectangleSolid": "rectàngle sòlid", + "red": "vermell", + "redo the last undone block drop in this pane": "refés l'últim moviment de blocs desfet", + "redraw the screen once": "repinta la pantalla una vegada", + "redrop": "refés", + "relabel...": "blocs similars...", + "release": "allibera", + "remove block variables...": "resborra les variables del bloc…", + "replaceables": "substituïble", + "rename": "canvia de nom", + "rename all blocks that access this variable": "reanomena totes les instàncies d'aquesta variable", + "rename all...": "reanomena arreu...", + "rename background": "canvia el nom del fons", + "rename costume": "canvia el nom del vestit", + "rename only this reporter": "reanomena només aquesta instància", + "rename sound": "canvia el nom del so", + "rename...": "canvia el nom...", + "repeat _ _": "repeteix _ vegades _", + "repeat until _ _": "repeteix fins _ _", + "replace item _ of _ with _": "substitueix l'element _ de _ per _", + "report _": "retorna _", + "reporter": "reportador", + "reporter didn't report": "al bloc reportador no obté cap dada", + "reset columns": "reinicialitza les columnes", + "reset timer": "reinicia el cronòmetre", + "reshape _ to _": "redimensiona _ a _", + "resize...": "redimensiona...", + "resolution": "resolució", + "rest for _ beats": "fes silenci durant _ temps", + "restore display": "reestableix la visualització", + "result pic...": "imatge del resultat...", + "reverse": "revers", + "right": "dreta", + "right arrow": "fletxa dreta", + "ring": "càpsula", + "ringify": "encapsula'm", + "robot": "robot", + "rotate": "gira", + "rotation style": "estil de rotació", + "rotation x": "rotació x", + "rotation y": "rotació y", + "round _": "arrodoneix _", + "run _ _": "executa _ _", + "run _ w/continuation": "executa _ amb continuació", + "s": "s", + "sample morphs": "crea un 'morph' de mostra", + "sample rate": "freqüència de mostreig", + "samples": "mostres", + "saturation": "saturació", + "save _ as costume named _": "desa _ com a vestit amb nom _", + "save a picture of all scripts": "desa una imatge de tots els blocs de programes", + "save a picture of both this script and its result": "desa una imatge dels blocs amb el resultat", + "save a picture of the stage": "desa una imatge de l'escenari", + "save a picture of this comment": "desa una imatge del comentari", + "save a picture of this script": "desa una imatge d'aquest programa", + "save a summary of this project": "Desa un resum d'aquest projecte", + "save global custom block definitions as XML": "desa els blocs personalitzats globals en format XML", + "save project data as XML to your downloads folder": "Exporta el projecte en un arxiu en format XML", + "saved.": "desat.", + "say _": "digues _", + "say _ for _ secs": "digues _ durant _ segons", + "scope": "àmbit", + "screenshot": "captura de pantalla", + "screenshot...": "captura de pantalla...", + "script": "programa", + "script pic with result...": "imatge del programa i del resultat…", + "script pic...": "mostra la meva imatge...", + "script variables _": "variables de programa _", + "scripts": "programes", + "scripts pic...": "exporta com a imatge...", + "scroll frame": "marc amb desplaçament", + "scrolled-down": "faci scroll avall", + "scrolled-up": "faci scroll amunt", + "second": "segon", + "select": "selecciona", + "selection": "selecció", + "self": "un mateix", + "send _ to _": "envia _ a _", + "senders...": "emissors...", + "sensor demo": "exemple de sensor", + "separators": "separadors", + "set _ effect to _": "fixa l'efecte _ a _", + "set _ of block _ to _": "assigna a _ de _ el valor _", + "set _ to _": "fixa el paràmetre _ a _", + "set background _ to _": "fixa _ del fons a _", + "set background color to _": "fixa el color del fons a _", + "set balance to _": "fixa el balanç a _", + "set instrument to _": "fixa l'instrument a _", + "set pen _ to _": "fixa _ del llapis a _", + "set pen color to _": "fixa el color del llapis a _", + "set pen shade to _": "fixa la intensitat del llapis a _", + "set pen size to _": "fixa la mida del llapis en _", + "set size to _ %": "fixa la mida a _ %", + "set tempo to _ bpm": "fixa el tempo a _", + "set this morph's alpha value": "fixeu el valor del canal alfa per aquest 'morph'", + "set turbo mode to _": "posa el mode turbo a _", + "set video transparency to _": "fixa la transparència del vídeo a _", + "set volume to _ %": "fixa el volum a _ %", + "set x to _": "assigna el valor _ a x", + "set y to _": "assigna el valor _ a y", + "setting the rotation center requires a costume": "només es pot fixar el centre de rotació en un vestit (no en la tortuga)", + "settings menu prefer empty slots hint": "marqueu per a fer que les ranures buides tinguin preferència sobre les plenes a l'hora de deixar-hi caure peces", + "several block definitions already match this label": "algun bloc definit ja utilitza aquest nom", + "shared.": "compartit.", + "sharing project...": "compartint el projecte…", + "sharp drop shadows use for old browsers": "utilitza ombres contrastades per a navegadors antics", + "sharp shadows...": "ombres contrastades...", + "shimmering (80)": "brillant (80)", + "show": "mostra", + "show a handle which can be dragged to change this morph's extent": "mostra una nansa per poder-la arrossegar i canviar la mida d'aquest 'morph'", + "show a handle which can be dragged to move this morph": "mostra una nansa per poder-la arrossegar i moure aquest 'morph'", + "show a picture of all scripts and block definitions": "mostra una imatge de tots els programes i les definicions de blocs", + "show all": "mostra'ls tots", + "show all...": "mostra-ho tot", + "show project data as XML in a new browser window": "mostra tot el projecte en format XML en una altra finestra del navegador", + "show table _": "mostra la taula _", + "show the World's menu": "mostra el menú del Món", + "show variable _": "mostra la variable _", + "shown?": "visible?", + "shrink": "disminuir", + "shuffled": "barrejats", + "signals": "senyals", + "sin": "sin", + "size": "mida", + "slider": "lliscador", + "slider max...": "valor màxim del lliscador...", + "slider min...": "valor mínim del lliscador...", + "slots": "ranures", + "smallStage": "escenari petit", + "smaller menu fonts and sliders": "fa més petits els lliscadors i els menús", + "snap": "instantània", + "solutions": "solucions", + "sorted": "ordenats", + "sound": "so", + "sounds": "sons", + "space": "espai", + "specify the distance the hand has to move before it picks up an object": "especifica a què distància s'han d'arrossegar els blocs per a que es moguin", + "spectrum": "espectre", + "speech bubble": "bafarada", + "speechBubble": "bafarada", + "speechBubbleOutline": "contorn de bafarada", + "split _ by _": "divideix _ per _", + "sprite": "objecte", + "sprites": "objectes", + "sqrt": "arrel quadrada", + "square": "quadrat", + "stack size": "mida de la pila", + "stage": "escenari", + "stage image": "imatge de l'escenari", + "stamp": "estampa", + "standard settings": "configuració estàndard", + "static": "estàtic", + "stay signed in on this computer until logging out": "mantenir-me autenticat en aquest ordinador fins que em desconnecti", + "stepForward": "pas endavant", + "stick this morph to another one": "enganxa aquest 'morph' a un altre", + "stick to": "ancora a", + "stop _": "atura _", + "stop all sounds": "atura tots els sons", + "stop frequency": "atura la freqüència", + "stopped": "pari", + "storage": "emmagatzament", + "store this project in the downloads folder (in supporting browsers)": "desa aquest projecte a la carpeta de descàrregues (en navegadors que ho suportin)", + "stretch _ x: _ y: _ %": "estira _ a x: _ y: _ %", + "string": "cadena", + "subtle (95)": "subtil (95)", + "sum": "suma", + "svg...": "exporta vectors com a svg", + "switch to costume _": "canvia el vestit a _", + "switch to scene _ _": "canvia a l'escena _ _", + "t": "t", + "tab": "tabulador", + "table view...": "vista en format de taula...", + "take a camera snapshot and import it as a new sprite": "pren una imatge amb la càmera i importa-la com un nou vestit", + "tan": "tan", + "tell _ to _ _": "digues a _ que faci _ _", + "tempo": "tempo", + "temporary?": "temporal?", + "text": "text", + "text-only (100)": "només text (100)", + "the predicate takes too long for a custom hat block": "la condició triga massa en avaluar-se per a poder definir un bloc inicial personalitzat", + "there are currently no unused global custom blocks in this project": "no hi ha cap bloc personalitzat no utilitzat en aquest projecte", + "there are currently no vectorizable pen trail segments": "no hi ha cap vector dibuixat enregistrat", + "thing": "cosa", + "think _": "pensa _", + "think _ for _ secs": "pensa _ durant _ segons", + "this _": "_ d'aquest bloc", + "this block": "aquest block", + "this project doesn't have any custom global blocks yet": "aquest projecte encara no té cap bloc personalitzat", + "this script": "aquest programa", + "time in milliseconds": "temps (milisegons)", + "timer": "cronòmetre", + "tip": "punta", + "to": "a", + "top": "superior", + "touch screen settings": "configuració per pantalla tàctil", + "touching _ ?": "tocant _ ?", + "transient": "no persistent", + "translations": "traduccions", + "translations...": "traduccions...", + "translator_e-mail": "jguille2@xtec.cat, bernat@snap4arduino.rocks", + "transparency": "transparència", + "transparency...": "transparència...", + "trash is empty": "la paperera està buida", + "true": "cert", + "turbo mode": "mode turbo", + "turbo mode?": "mode turbo?", + "turn _ _ degrees": "gira _ _ graus", + "turn all pen trails and stamps into a new background for the stage": "crea un nou fons d'escenari amb la imatge dibuixada", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "crea un nou vestit per l'actual objecte amb la imatge dibuixada", + "turn pen trails into new background...": "crea un nou fons amb la imatge dibuixada…", + "turn pen trails into new costume...": "crea un nou vestit amb la imatge dibuixada…", + "turnBack": "torna enrere", + "turnForward": "torna endavant", + "turnLeft": "girant a l'esquerra", + "turnRight": "girant a la dreta", + "turtle": "tortuga", + "turtleOutline": "contorn de la tortuga", + "type": "tipus", + "type of _": "tipus de _", + "u": "u", + "unable to convert to": "no és possible convertir-ho a", + "unable to inherit (disabled or circular?)": "no es pot heretar (està deshabilitat o és cíclic?)", + "unable to nest (disabled or circular?)": "no es pot imbrincar (està deshabilitat o és cíclic?)", + "uncheck for default GUI design": "desmarqueu per obtenir la interfície gràfica per defecte", + "uncheck for less contrast multi-column list views": "desmarqueu per a tenir un baix contrast a la vista de llista amb multicolumnes", + "uncheck for lower resolution, saves computing resources": "desmarqueu per obtenir una resolució més baixa; implicarà menys consum de memòria.", + "uncheck for round ends of lines": "desmarqueu per fer que les puntes dels llapis siguin arrodonides", + "uncheck for smooth scaling of vector costumes": "desmarqueu per atenuar escalant les imatges vectorials", + "uncheck to allow dropped reporters to kick out others": "desmarqueu per a fer que les ranures buides tinguin la mateixa preferència que les plenes a l'hora de deixar-hi caure peces", + "uncheck to allow script reentrance": "desmarqueu per permetre la re-entrada als programes", + "uncheck to always show (+) symbols in block prototype labels": "desmarqueu per mostrar sempre el símbol (+) en les etiquetes de prototip de bloc (a l'editor de blocs)", + "uncheck to confine auto-wrapping to top-level block stacks": "desmarqueu per restringir l'englobament de blocs a les piles senceres", + "uncheck to disable IDE animations": "desmarqueu per deshabilitar les animacions de la interfície", + "uncheck to disable alternating colors for nested block": "desmarqueu per deshabilitar la coloració alternada per a blocs imbricats", + "uncheck to disable block to text mapping features": "demarqueu per deshabilitar les funcionalitats de mapeig de blocs en codi", + "uncheck to disable camera support": "desmarqueu per deshabilitar el suport per a càmeres", + "uncheck to disable dropping commands in reporter rings": "desmarqueu per deshabilitar l'arrossegament de comandes en encapsulaments reportadors", + "uncheck to disable dynamic labels for variadic inputs": "desmarqueu per desactivar les etiquetes dinàmiques en camps variables", + "uncheck to disable input sliders for entry fields": "desmarqueu per deshabilitar els lliscadors per als camps d'entrada", + "uncheck to disable keyboard editing support": "desmarqueu per deshabilitar el suport a l'edició per teclat", + "uncheck to disable multi-column list views": "desmarqueu per a deshabilitar la vista de llista amb multicolumnes", + "uncheck to disable project data in URLs": "desmarqueu per deshabilitar les dades del projecte a la URL", + "uncheck to disable saving linked sublist identities": "desmarqueu per deshabilitar l'emmagatzament de les ID enllaçades a les subllistes.", + "uncheck to disable sprite composition": "desmarqueu per deshabilitar l'ancoratge d'objectes", + "uncheck to disable sprite inheritance features": "desmarqueu per deshabilitar les funcionalitats relatives a l'herència d'objectes", + "uncheck to disable support for first-class sprites": "desmarqueu per deshabilitar el suport als objectes de primera classe.", + "uncheck to disable support for native JavaScript functions": "desmarqueu per deshabilitar l'execució de Javascript", + "uncheck to disable using operators on lists and tables": "desmarqueu per deshabilitar la utilització dels operadors sobre llistes i taules", + "uncheck to disable\nwrapping list indices": "desmarqueu per deshabilitar\nels índexs de llistes continus", + "uncheck to disinherit": "desmarqueu per a desheretar", + "uncheck to drag media and blocks out of watchers and balloons": "desmarqueu per arrossegar objectes i blocs fora dels visors i bafarades ", + "uncheck to drag media, and blocks out of watchers and balloons": "desmarqueu per poder arrossegar objectes, imatges i blocs fora dels visors de variables i de les bafarades de diàleg", + "uncheck to enable directly running blocks by clicking on them": "desmarqueu per habilitar l'execució directa dels blocs en clicar-los", + "uncheck to hide buttons in the palette": "desmarqeu per amagar els botons a la paleta", + "uncheck to hide category names in the palette": "desmarqueu per amagar el nom de les categories a la paleta", + "uncheck to hide extension primitives in the palette": "desmarqueu per amagar els blocs de primitives per a les extensions de la paleta", + "uncheck to hide in palette": "desmarqueu per ocultar-lo a la paleta de blocs", + "uncheck to ignore upper- and lowercase when comparing texts": "desmarqueu per deshabilitar la distinció entre majúscules i minúscules en comparar textos", + "uncheck to limit Boolean slots to true / false": "desmarqueu per commutar les ranures booleanes només entre cert i fals", + "uncheck to render\nsprites dynamically": "desmarqueu per renderitzar\nels objectes dinàmicament", + "uncheck to run scripts at normal speed": "desmarqueu per executar els programes a la velocitat normal", + "uncheck to save contents in the project": "desactiveu l'opció per desar els continguts en el projecte", + "uncheck to show only the selected category's blocks": "demarqueu per mostrar només el blocs de la categoria seleccionada", + "uncheck to stop caching inputs (for debugging the evaluator)": "desmarqueu per no desar les entrades a la memòria cau (per depurar l'avaluador)", + "uncheck to suppress running scripts when moving the slider": "desmarqueu per no llançar l'execució dels programes en utilitzar els seus lliscadors", + "uncheck to switch pen colors and graphic effects to HSV": "desmarqueu per canviar el model de color del llapis i dels efectes gràfics a HSV", + "uncheck to turn block clicking sound off": "desmarqueu per deshabilitar el so de clic en clicar sobre els blocs", + "uncheck to turn off logging pen vectors": "desmarqueu per aturar l'enregistrament dels dibuixos com a vectors", + "uncheck to turn off visible stepping": "desmarqueu per deshabilitar la monitorització pas a pas", + "uncheck to use solid drop shadows and highlights": "desmarqueu per utilitzar ombres i realçats sòlids", + "uncheck to use the input dialog in short form": "desmarqueu per a no mostrar automàticament el diàleg de selecció de tipus en afegir paràmetres als blocs personalitzats", + "uncompile": "descompila", + "undo": "desfés", + "undo the last block drop in this pane": "desfés l'últim moviment de blocs", + "undrop": "desfés", + "unicode _ as letter": "lletra amb valor Unicode _", + "unicode of _": "valor Unicode de _", + "uniques": "únics", + "unlock": "desbloqueja", + "unpublished.": "no publicat", + "unpublishing project...": "deixant de publicar el projecte...", + "unringify": "des-encapsula'm", + "unshared.": "no compartit.", + "unsharing project...": "deixant de compartir el projecte…", + "unsupported attribute": "atribut no suportat", + "unsupported data type": "aquest tipus de dades no és possible", + "unsupported graphic effect": "aquest efecte gràfic no existeix", + "untitled": "Sense títol", + "unused": "no utilitzats", + "unused block(s) removed": "bloc(s) personalitzats no utilitzats esborrats", + "up arrow": "fletxa amunt", + "upper case": "majúscules", + "url...": "URL…", + "use the keyboard to enter blocks": "utilitza el teclat per escriure els blocs", + "user features...": "opcions d'usuari...", + "user mode...": "mode d'usuari...", + "v": "v", + "value": "valor", + "variable": "variable", + "variables": "variables", + "video _ on _": "_ del vídeo en _", + "video capture": "captura de vídeo", + "volume": "volum", + "w": "w", + "wait _ secs": "espera _ segons", + "wait until _": "espera fins _", + "wardrobe": "vestits", + "warp _": "executa de cop _", + "what's your name?": "Com et dius?", + "when I am _": "Quan _ aquest personatge", + "when I receive _ _": "Quan rebi _ _", + "when I start as a clone": "quan una còpia meva comenci", + "when _": "quan _", + "when _ clicked": "Quan la _ es premi", + "when _ is edited _": "Quan _ sigui editat _", + "when _ key pressed _": "Quan la tecla _ es premi _", + "whirl": "remolí", + "whitespace": "espai en blanc", + "width": "amplada", + "with": "amb", + "with data": "amb dades", + "with inputs": "amb entrades", + "word": "paraula", + "world": "món", + "write _ size _": "escriu _ de mida _", + "x": "x", + "x position": "posició x", + "y": "y", + "y position": "posició y", + "year": "any", + "year:": "any:", + "your own": "els teus propis", + "z": "z" +} diff --git a/elements/pl-snap/Snap/locale/lang-ca_VA.js b/elements/pl-snap/Snap/locale/lang-ca_VA.js new file mode 100644 index 00000000..41f65478 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ca_VA.js @@ -0,0 +1,1370 @@ +SnapTranslator.dict.ca_VA = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) esquerra", + "(0) up": "(0) amunt", + "(1) sine": "", + "(180) down": "(180) avall", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) dreta", + "(empty)": "(buit)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Sobre l'Snap", + "About...": "Sobre l'Snap!", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animacions", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Qualsevol (sense avaluar)", + "Any type": "Qualsevol tipus", + "Apply": "Aplica", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Segur que vols esborrar", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Arrere...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Editor de blocs", + "Blocks": "Blocs", + "Blocks category name:": "", + "Blurred shadows": "Ombres suavitzades", + "Boolean": "Booleà", + "Boolean (T/F)": "Booleà (C/F)", + "Boolean (unevaluated)": "Booleà (sense avaluar)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Cancel·la", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Canvia el bloc", + "Clear backup": "", + "Clicking sound": "So de clic", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Ordre", + "Command (C-shape)": "Ordre (en forma de C)", + "Command (inline)": "Ordre (inserida)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "Continguts", + "Contributors": "Contribuïdors", + "Control": "Control", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Editor de vestits", + "Costumes": "Vestits", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Crea una ranura", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Crèdits...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Per defecte", + "Default Value:": "Valor predeterminat:", + "Delete": "Esborra", + "Delete Custom Block": "Esborra el bloc personalitzat", + "Delete Project": "Esborra un projecte", + "Delete a variable": "Esborra una variable", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Descarrega el codi font", + "Dragging threshold...": "", + "Dynamic input labels": "Etiquetes dinàmiques de camps d'entrada", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Edita la ranura", + "Edit label fragment": "Edita el fragment d'etiqueta", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Buit", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Exporta blocs", + "Export blocks...": "Exporta els blocs...", + "Export project as plain text...": "Exporta el projecte en text pla...", + "Export project...": "Exporta el projecte...", + "Export summary with drop-shadows...": "", + "Export summary...": "Exporta el resum...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Disseny pla", + "Flat line ends": "Línies del llapis rectes", + "For all Sprites": "Per a tots els objectes", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Hola!", + "Hello, World!": "", + "Help": "Ajuda", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Hmm...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Importa blocs", + "Import library": "Importa una biblioteca", + "Import sound": "", + "Import...": "Importa...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Suport per a herència", + "Input Names:": "Noms d'entrades:", + "Input Slot Options": "", + "Input name": "Nom de la ranura", + "Input sliders": "Botons lliscants d'entrada", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Edició per teclat", + "Kind of": "Espècie de", + "LEAP Motion controller": "", + "Language...": "Llengua...", + "Libraries...": "Biblioteques...", + "License": "Llicència", + "License...": "Llicència...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Llista", + "List utilities": "", + "Lists": "Llistes", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Inicia la sessió...", + "Logout": "", + "Long form input dialog": "Força el diàleg de selecció de tipus", + "Looks": "Aparença", + "Make a block": "Crea un bloc", + "Make a variable": "Crea una variable", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Nom del missatge", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Mòduls...", + "Motion": "Moviment", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Entrades múltiples (el valor és una llista d'entrades)", + "Nested auto-wrapping": "", + "New": "Nou", + "New Category": "", + "New Project": "Projecte nou", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "No", + "November": "", + "Number": "Nombre", + "OK": "D'acord", + "Object": "Objecte", + "October": "", + "Ok": "D'acord", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "", + "Open in Community Site": "", + "Open...": "Obri...", + "Opening project...": "", + "Operators": "Operadors", + "Other": "Altres", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "Part de", + "Parts": "Parts", + "Password:": "", + "Pen": "Llapis", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Etiquetes de prototip simples", + "Play": "Toca", + "Play sound": "Toca el so", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predicat", + "Prefer empty slot drops": "Dóna preferència a les ranures buides", + "Privacy...": "", + "Project Notes": "Notes del projecte", + "Project URLs": "", + "Project notes...": "Notes del projecte...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Manual de referència", + "Remove a category...": "", + "Remove unused blocks": "Esborra blocs no utilitzats", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Vols substituir el projecte actual per un de nou?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Reportador", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Guarda", + "Save As...": "Anomena i guarda...", + "Save Project": "", + "Save Project As...": "Anomena i guarda el projecte...", + "Save to disk": "Guarda al disc", + "Saved!": "Guardat!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Nom de la variable de programa", + "Scripts": "Programes", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Sensors", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Registra't...", + "Single input.": "Entrada única.", + "Single palette": "", + "Slider maximum value": "Valor màxim del botó lliscant...", + "Slider minimum value": "Valor mínim del botó lliscant...", + "Snap! website": "Web de l'Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "So", + "Sound Recorder": "", + "Sounds": "Sons", + "Sprite": "Objecte", + "Sprite Nesting": "", + "Stage": "Escenari", + "Stage height": "Alçària de l'escenari", + "Stage selected: no motion primitives": "Escenari seleccionat: no hi ha primitives de moviment disponibles", + "Stage size": "Mida de l'escenari", + "Stage size...": "Mida de l'escenari...", + "Stage width": "Amplària de l'escenari", + "Stop": "Para", + "Stop sound": "Para el so", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Torna a mode d'usuari", + "Switch to dev mode": "Canvia a mode desenvolupador", + "Switch to vector editor?": "", + "Table lines": "Línies de taules", + "Table support": "Edició de taules", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Text", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Fil d'execució segur", + "Title text": "Text del títol", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Traduccions", + "Translators...": "Traductors", + "Turbo mode": "Mode turbo", + "Turtle": "Tortuga", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Sense títol", + "Unused blocks...": "Blocs no utilitzats...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Variable interna visible des de l'exterior", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Nom de variable", + "Variables": "Variables", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Sí", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Coloració en zebra", + "Zoom blocks": "Canvia la mida dels blocs", + "Zoom blocks...": "Mida dels blocs...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ conté _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "afig _ davant de _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "residu de dividir _ entre _", + "_ of _": "_ de _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "valor absolut", + "acos": "acos", + "add _ to _": "afig _ a _", + "add a new Turtle sprite": "", + "add a new sprite": "afig un nou objecte", + "add comment": "afig un comentari", + "add comment here...": "afig un comentari ací...", + "agent": "", + "alert _": "avís: _", + "all": "tot", + "all <": "all <", + "all =": "all =", + "all >": "all >", + "all but first of _": "_ sense el primer element", + "all but this script": "tot excepte aquest programa", + "all identical": "all identical", + "all scenes": "", + "all ≤": "all ≤", + "all ≥": "all ≥", + "alpha value:": "", + "anchor": "àncora", + "and": "i", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "resposta", + "any": "", + "any key": "qualsevol tecla", + "any message": "qualsevol missatge", + "anything": "", + "append _": "", + "arrange scripts vertically": "alinea els programes verticalment", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "pregunta _ i espera", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "gran (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Segur que vols esborrar la definició d'aquest bloc?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blocs", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "brillantor", + "broadcast _ _": "Envia _ _", + "broadcast _ _ and wait": "Envia _ _ i espera", + "brush": "", + "build": "construeix", + "but getting a": "", + "c": "c", + "call _ _": "crida _ _", + "call _ w/continuation": "crida _ amb continuació", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "pot girar", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "sostre", + "center": "", + "center x": "centre x", + "center y": "centre y", + "change _ by _": "augmenta _ en _", + "change _ effect by _": "augmenta l'efecte _ en _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "augmenta en _ el color del llapis", + "change pen shade by _": "augmenta en _ la intensitat del llapis", + "change pen size by _": "augmenta en _ la mida del llapis", + "change size by _": "augmenta _ la mida", + "change tempo by _": "augmenta el tempo en _", + "change volume by _": "", + "change x by _": "suma _ a x", + "change y by _": "suma _ a y", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "marca'm per a fer que els extrems de les línies del llapis siguen rectes", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "marca'm per a mostrar sempre el diàleg de selecció de tipus en afegir paràmetres als blocs personalitzats", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "marca'm per a no permetre la reentrada als programes", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "marca'm per a habilitar les animacions de la interfície", + "check to enable alternating colors for nested blocks": "marca'm per a habilitar la coloració alternada per a blocs imbricats", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "marca'm per a habilitar les etiquetes dinàmiques en camps amb aritat variable", + "check to enable input sliders for entry fields": "marca'm per a habilitar els botons lliscants per als camps d'entrada", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to hide (+) symbols in block prototype labels": "desmarca'm per a amagar el símbol (+) en les etiquetes de prototip de bloc (a l'editor de blocs)", + "check to inherit from": "", + "check to prevent contents from being saved": "activeu l'opció per a evitar que els continguts es guarden", + "check to prioritize script execution": "marca'm per a activar el mode de prioritat en l'execució de programes", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "marca'm per a habilitar el so de clic en clicar sobre els blocs", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "marca'm per a utilitzar ombres i realçats suavitzats", + "children": "fill", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "neteja", + "clear": "neteja", + "clear graphic effects": "suprimeix els efectes gràfics", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "clica o arrossega la creueta per a moure el centre de rotació", + "clicked": "es clique", + "clone": "", + "clones": "clons", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "color _ sobre _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "còmic", + "command": "ordre", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "confeti", + "console log _": "registre per consola: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "número de vestit", + "costume name": "", + "costumes": "", + "costumes tab help": "podeu importar una imatge des d'un altre lloc web o des del vostre ordinador arrossegant-la fins ací", + "could not connect to:": "", + "cr": "retorn de carro", + "create a clone of _": "crea un clon de _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "versions actuals dels mòduls", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "penjant?", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "esborra'm", + "delete _": "", + "delete _ of _": "esborra _ de _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "esborra la definició d'aquest bloc", + "delete slot": "", + "delete this clone": "esborra aquest clon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "demostració (1.2x)", + "demo...": "", + "detach all parts": "desenganxa totes les parts", + "detach and put into the hand": "", + "detach from": "desenganxa de", + "development mode": "mode de desenvolupament", + "development mode debugging primitives:": "mode de desenvolupament primitives de depuració", + "development mode...": "", + "dimensions": "", + "direction": "direcció", + "disable deep-Morphic context menus and show user-friendly ones": "canvia els menús contextuals primitius de Morphic per menús més amigables", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "distància a _", + "distribution": "", + "don't rotate": "no gira", + "down arrow": "fletxa avall", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "arrossegable", + "draggable?": "", + "dragging threshold": "", + "dropped": "es deixe anar", + "duplicate": "duplica'm", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "vora", + "edit": "edita", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "edita...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "habilita els menús contextuals de Morphic i inspectors, mode expert!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exporta", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "exporta...", + "extract": "", + "f": "f", + "false": "fals", + "file": "", + "file menu import hint": "carrega una biblioteca de projecte o de blocs exportada, un vestit o un so", + "fill": "ompli", + "fill page...": "", + "filtered for _": "filtrat per a _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "busca blocs personalitzats globals no utilitzats i esborra'ls", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "part entera", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "per a tots els objectes", + "for each _ in _ _": "", + "for this sprite only": "només per a aquest objecte", + "forever _": "per sempre _", + "frame": "", + "frames": "frames", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "fantasma", + "giant (8x)": "gegant (8x)", + "glide _ secs to x: _ y: _": "llisca en _ segons fins a x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "vés _ capes darrere", + "go to _": "vés a _", + "go to _ layer": "", + "go to x: _ y: _": "vés a x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "hola", + "help": "ajuda", + "help...": "ajuda...", + "hide": "amaga", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "amaga la variable _", + "high": "", + "hour": "", + "http:// _": "http:// _", + "hue": "", + "huge (4x)": "immens (4x)", + "i": "i", + "identical to": "idèntic a", + "if _ _": "si _ llavors _", + "if _ _ else _": "si _ llavors _ si no _", + "if _ then _ else _": "", + "if on edge, bounce": "rebota en tocar una vora", + "import a sound from your computer by dragging it into here": "podeu importar un so des del vostre ordinador arrossegant-lo fins ací", + "import without attempting to parse or format data": "", + "import...": "importa...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "llista d'entrades:", + "input names:": "noms d'entrades:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "insereix _ a la posició _ de _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "és _ ?", + "is _ a _ ?": "és _ un _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "element _ de _", + "items": "elements", + "j": "j", + "join _": "unir _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "tecla _ premuda?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Català - Valencià", + "language_translator": "Bernat Romagosa Carrasquer, Joan Guillén i Pelegay, Pilar Embid", + "large": "gran", + "last": "últim", + "last changed": "", + "last_changed": "2018-02-08", + "launch _ _": "llança _ _", + "left": "", + "left arrow": "fletxa esquerra", + "length": "", + "length of _": "longitud de _", + "length:": "longitud:", + "let the World automatically adjust to browser resizing": "", + "letter": "lletra", + "letter _ of _": "lletra _ de _", + "light (70)": "", + "lightness": "", + "line": "línia", + "lines": "", + "list": "llista", + "list _": "llista _", + "list view...": "vista en format de llista...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "crea un bloc...", + "make a category...": "", + "make a copy and pick it up": "crea una còpia i agafa-la", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "missatge", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruós (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "ratolí clicat?", + "mouse position": "", + "mouse x": "ratolí x", + "mouse y": "ratolí y", + "mouse-departed": "el ratolí isca d'", + "mouse-entered": "el ratolí toque", + "mouse-pointer": "punter del ratolí", + "move": "mou", + "move _ steps": "mou-te _ passos", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "atribut _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "mi mateix", + "n": "n", + "name": "", + "neg": "", + "negative": "negatiu", + "neighbors": "veïns", + "neighbors ≠": "neighbors ≠", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "nou...", + "next": "", + "next costume": "següent vestit", + "none": "cap bloc", + "normal": "normal", + "normal (1x)": "normal (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "no _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "nombre", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "duplica només aquest bloc", + "only face left/right": "només mira a esquerra/dreta", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "obri una nova finestra amb una imatge d'aquest programa", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "obri en una finestra...", + "open shared project from cloud...": "", + "options...": "", + "or": "o", + "or before": "", + "other clones": "altres clons", + "other scripts in sprite": "els altres programes d'aquest objecte", + "other sprites": "els altres objectes", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "pare", + "parent...": "", + "parts": "parts", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "posa-ho tot en pausa _", + "pen": "", + "pen _": "", + "pen down": "baixa el llapis", + "pen down?": "", + "pen trails": "rastre del llapis", + "pen up": "puja el llapis", + "pen vectors": "", + "pic...": "exporta com a imatge...", + "pick random _ to _": "nombre a l'atzar entre _ i _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "toca la nota _ durant _ temps", + "play sound _": "toca el so _", + "play sound _ at _ Hz": "", + "play sound _ until done": "toca el so _ fins que acabe", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "apunta en direcció _", + "point towards _": "apunta cap a _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predicat", + "presentation (1.4x)": "presentació (1.4x)", + "pressed": "es prema", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "qualsevol", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "blocs similars...", + "release": "", + "remove block variables...": "", + "rename": "canvia de nom", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "canvia el nom del vestit", + "rename only this reporter": "", + "rename sound": "canvia el nom del so", + "rename...": "canvia el nom...", + "repeat _ _": "repeteix _ vegades _", + "repeat until _ _": "repeteix fins _ _", + "replace item _ of _ with _": "substitueix l'element _ de _ per _", + "report _": "retorna _", + "reporter": "reportador", + "reporter didn't report": "", + "reset columns": "reinicialitza les columnes", + "reset timer": "reinicia el cronòmetre", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "fes silenci durant _ temps", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "fletxa dreta", + "ring": "", + "ringify": "encapsula'm", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "rotació x", + "rotation y": "rotació y", + "round _": "arredoneix _", + "run _ _": "executa _ _", + "run _ w/continuation": "executa _ amb continuació", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "digues _", + "say _ for _ secs": "digues _ durant _ segons", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "mostra la meua imatge...", + "script variables _": "variables de programa _", + "scripts": "", + "scripts pic...": "exporta com a imatge...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "selecciona", + "selection": "", + "self": "un mateix", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "fixa l'efecte _ a _", + "set _ of block _ to _": "", + "set _ to _": "assigna a _ el valor _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "fixa el color del llapis a _", + "set pen shade to _": "fixa la intensitat del llapis a _", + "set pen size to _": "fixa la mida del llapis en _", + "set size to _ %": "fixa la mida a _ %", + "set tempo to _ bpm": "fixa el tempo a _", + "set this morph's alpha value": "", + "set turbo mode to _": "posa el mode turbo a _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "assigna el valor _ a x", + "set y to _": "assigna el valor _ a y", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "marca'm per a fer que les ranures buides tinguen preferència sobre les plenes a l'hora de deixar-hi caure peces", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "mostra", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "mostra'ls tots", + "show all...": "", + "show project data as XML in a new browser window": "mostra tot el projecte en format XML en una altra finestra del navegador", + "show table _": "", + "show the World's menu": "", + "show variable _": "mostra la variable _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "mida", + "slider": "botó lliscant", + "slider max...": "valor màxim del botó lliscant...", + "slider min...": "valor mínim del botó lliscant...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "espai", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "divideix _ per _", + "sprite": "", + "sprites": "", + "sqrt": "arrel quadrada", + "square": "", + "stack size": "mida de la pila", + "stage": "", + "stage image": "", + "stamp": "estampa", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "para _", + "stop all sounds": "para tots els sons", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "guarda aquest projecte a la carpeta de descàrregues (en navegadors que ho admeten)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "canvia el vestit a _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulador", + "table view...": "vista en format de taula...", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "tempo", + "temporary?": "", + "text": "text", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "no hi ha cap bloc personalitzat no utilitzat en aquest projecte", + "there are currently no vectorizable pen trail segments": "", + "thing": "cosa", + "think _": "pensa _", + "think _ for _ secs": "pensa _ durant _ segons", + "this _": "", + "this block": "aquest bloc", + "this project doesn't have any custom global blocks yet": "aquest projecte encara no té cap bloc personalitzat", + "this script": "aquest programa", + "time in milliseconds": "", + "timer": "cronòmetre", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "tocant el color _ ?", + "transient": "no persistent", + "translations": "", + "translations...": "", + "translator_e-mail": "bernat@snap4arduino.rocks, jguille2@xtec.cat, embid_mar@gva.es", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "cert", + "turbo mode": "", + "turbo mode?": "mode turbo?", + "turn _ _ degrees": "gira _ _ graus", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "tipus de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "desmarca'm per a fer que els extrems de les línies del llapis siguen arredonits", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "marca'm per a fer que les ranures buides tinguen la mateixa preferència que les plenes a l'hora de deixar-hi caure peces", + "uncheck to allow script reentrance": "desmarca'm per a permetre la reentrada als programes", + "uncheck to always show (+) symbols in block prototype labels": "desmarca'm per a mostrar sempre el símbol (+) en les etiquetes de prototip de bloc (a l'editor de blocs)", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "desmarca'm per a inhabilitar les animacions de la interfície", + "uncheck to disable alternating colors for nested block": "desmarca'm per a inhabilitar la coloració alternada per a blocs imbricats", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "marca'm per a desactivar les etiquetes dinàmiques en camps amb aritat variable", + "uncheck to disable input sliders for entry fields": "desmarca'm per a inhabilitar els botons lliscants per als camps d'entrada", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "desmarca'm per a executar els programes a la velocitat normal", + "uncheck to save contents in the project": "desactiveu l'opció per a guardar els continguts en el projecte", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "desmarca'm per a inhabilitar el so de clic en clicar sobre els blocs", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "desmarca'm per a utilitzar ombres i realçats sòlids", + "uncheck to use the input dialog in short form": "desmarca'm per a no mostrar automàticament el diàleg de selecció de tipus en afegir paràmetres als blocs personalitzats", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "recupera l'últim bloc que s'haja llançat", + "undrop": "recupera el bloc", + "unicode _ as letter": "lletra amb valor Unicode _", + "unicode of _": "valor Unicode de _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "desencapsula'm", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Sense títol", + "unused": "", + "unused block(s) removed": "bloc(s) personalitzats no utilitzats esborrats", + "up arrow": "fletxa amunt", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "espera _ segons", + "wait until _": "espera fins _", + "wardrobe": "", + "warp _": "executa tot d'una _", + "what's your name?": "Com et dius?", + "when I am _": "Quan _ aquest personatge", + "when I receive _ _": "Quan reba _ _", + "when I start as a clone": "quan una còpia meua comence", + "when _": "quan _", + "when _ clicked": "Quan la _ es prema", + "when _ is edited _": "", + "when _ key pressed _": "Quan la tecla _ es prema _", + "whirl": "", + "whitespace": "espai en blanc", + "width": "", + "with data": "", + "with inputs": "amb entrades", + "word": "", + "world": "món", + "write _ size _": "", + "x": "x", + "x position": "posició x", + "y": "y", + "y position": "posició y", + "year": "", + "year:": "", + "your own": "els teus propis", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-cs.js b/elements/pl-snap/Snap/locale/lang-cs.js new file mode 100644 index 00000000..37d59204 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-cs.js @@ -0,0 +1,1380 @@ +SnapTranslator.dict.cs = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) doleva", + "(0) up": "(0) nahoru", + "(1) sine": "", + "(180) down": "(180) dolů", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) doprava", + "(empty)": "(prázdný)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "O programu Snap", + "About...": "O programu...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Cokoliv (nevyhodnoceno)", + "Any type": "Libovolný", + "Apply": "Použít", + "April": "duben", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Jste si jisti, že chcete projekt smazat?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "srpen", + "Back...": "Zpět...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Datum narození:", + "Bitmap": "", + "Block Editor": "Editor bloků", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Měkké stíny", + "Boolean": "boolean", + "Boolean (T/F)": "Boolean (P/N)", + "Boolean (unevaluated)": "Boolean (nevyhodnoceno)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Zrušit", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Změnit blok", + "Clear backup": "", + "Clicking sound": "Zvuk kliknutí", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "Podpora kodifikace", + "Colors and Crayons": "", + "Command": "Příkaz", + "Command (C-shape)": "Příkaz (C-tvar)", + "Command (inline)": "Příkaz (vnořený)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Přispěvatelé", + "Control": "Ovládání", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Editor kostýmů", + "Costumes": "Kostýmy", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Vytvořit vstup", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Přispěvatelé...", + "Custom Block Translations": "", + "Database": "", + "December": "prosinec", + "Default": "", + "Default Value:": "Výchozí hodnota:", + "Delete": "Smazat", + "Delete Custom Block": "smazat vlastní blok", + "Delete Project": "Smazat projekt", + "Delete a variable": "Smaž proměnnou", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Stáhnout zdrojové kódy", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "E-mailová adresa rodiče či opatrovníka:", + "E-mail address:": "E-mailová adresa:", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Upravit vstup", + "Edit label fragment": "Upravit nápis", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Export bloků", + "Export blocks...": "Exportovat bloky...", + "Export project as plain text...": "Exportovat projekt jako prostý text...", + "Export project...": "Exportovat projekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "únor", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Plochý design", + "Flat line ends": "Ploché konce čar", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Ahoj!", + "Hello, World!": "", + "Help": "Nápověda", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "Četl jsem a souhlasím s podímkami služby", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "Importovat knihovnu", + "Import sound": "", + "Import tools": "Importovat nástroje", + "Import...": "Importovat...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Podpora dědičnosti", + "Input Names:": "Proměnné:", + "Input Slot Options": "", + "Input name": "Vstup", + "Input sliders": "Posuvníky", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "leden", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "červenec", + "June": "červen", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Editace klávesnicí", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Jazyk...", + "Libraries...": "Knihovny...", + "License": "Licence", + "License...": "Licence...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Seznam", + "List utilities": "", + "Lists": "Seznamy", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Přihlásit...", + "Logout": "", + "Long form input dialog": "Velké formuláře", + "Looks": "Vzhled", + "Make a block": "Vytvoř blok", + "Make a variable": "Vytvoř proměnnou", + "Manipulate costumes pixel-wise.": "", + "March": "březen", + "May": "květen", + "Message name": "název zprávy", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Moduly...", + "Motion": "Pohyb", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Více vstupů (hodnoty v seznamu)", + "Nested auto-wrapping": "", + "New": "Nový", + "New Category": "", + "New Project": "Nový projekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Ne", + "November": "listopad", + "Number": "Číslo", + "OK": "", + "Object": "", + "October": "říjen", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Otevřít projekt", + "Open in Community Site": "", + "Open...": "Otevřít...", + "Opening project...": "", + "Operators": "Operátory", + "Other": "Ostatní", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "Nakresli nový kostým", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "Heslo:", + "Pen": "Pero", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Prosté nadpisy prototypů", + "Play": "spustit", + "Play sound": "spustit přehrávání", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Podmínka", + "Prefer empty slot drops": "Preferovat prázdný slot pro puštění", + "Prefer smooth animations": "Zapnout plynulou animaci", + "Privacy...": "Politika soukromí...", + "Project Notes": "Poznámky k projektu", + "Project URLs": "", + "Project notes...": "Poznámky k projektu...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Referenční příručka", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Nahradit stávající projekt novým?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funkce", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Resetovat heslo...", + "Reset password": "Resetuj heslo", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Uložit", + "Save As...": "Uložit jako...", + "Save Project": "", + "Save Project As...": "Uložit projekt jako...", + "Save to disk": "", + "Saved!": "Uloženo!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Jméno skriptové proměnné", + "Scripts": "Skripty", + "Select a costume from the media library": "Vyberte kostým z knihovny médií", + "Select a sound from the media library": "Vyberte si zvuk z knihovny médií", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Vnímání", + "September": "září", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "Přihlásit se", + "Sign up": "Vytvořit účet", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Vytvořit účet...", + "Single input.": "Jednoduchý vstup.", + "Single palette": "", + "Slider maximum value": "Maximální hodnota posuvníku", + "Slider minimum value": "minimální hodnota posuvníku", + "Snap! website": "Stránky Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Zvuk", + "Sound Recorder": "", + "Sounds": "Zvuky", + "Sprite": "", + "Sprite Nesting": "", + "Stage": "Scéna", + "Stage height": "Výška scény", + "Stage selected: no motion primitives": "Vybraná scéna:žádné pohybové bloky", + "Stage size": "Velikost scény", + "Stage size...": "Velikost scény...", + "Stage width": "Šířka scény", + "Stop": "zastavit", + "Stop sound": "zastavit přehrávání", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "přepnout zpět do uživatelského módu", + "Switch to dev mode": "přepnout do vývojářského módu", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Podmínky služby...", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Vláknově bezpečné skripty", + "Title text": "Nadpis", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Překlady", + "Translators...": "Překladatelé", + "Turbo mode": "Turbo mód", + "Turtle": "želva", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Nepojmenovaný", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Vnitřní proměnná viditelná pro volání", + "Use CPU for graphics": "", + "User name must be four characters or longer": "Uživatelské jméno musí být dlouhé alespoň čtyři znaky.", + "User name:": "Uživatelské jméno:", + "Variable name": "Jméno proměnné", + "Variables": "Proměnné", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuální klávesnice", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Ano", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Střídavé barvy", + "Zoom blocks": "Velikost bloků", + "Zoom blocks...": "Velikost bloků...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ obsahuje _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ na začátek _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ z _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "absolutní hodnota", + "acos": "acos", + "add _ to _": "přidat _ do _", + "add a new Turtle sprite": "přidat nový sprite želvy", + "add a new sprite": "přidat nový sprite", + "add comment": "přidat komentář", + "add comment here...": "přidat sem komentář...", + "agent": "", + "alert _": "Upozornění: _", + "all": "vše", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "vše kromě první položky z _", + "all but this script": "vše kromě tohoto skriptu", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "a", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "odpověď", + "any": "kterákoli", + "any key": "", + "any message": "jakákoli zpráva", + "anything": "", + "append _": "", + "arrange scripts vertically": "zarovnat skripty vertikálně", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "zeptej se _ a čekej", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "velké (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Smazáním tohoto bloku se odstraní všechna jeho použití. Opravdu chcete tento blok smazat?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "bloky", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "jas", + "broadcast _ _": "poslat _ _", + "broadcast _ _ and wait": "poslat _ _ a čekat", + "brush": "", + "build": "vytvoř si", + "but getting a": "", + "c": "c", + "call _ _": "zavolat _ _", + "call _ w/continuation": "zavolat _ s pokračováním", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "lze otočit", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "zaokrouhlit nahoru", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "změň _ o _", + "change _ effect by _": "změň efekt _ o _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "změň barvu pera o _", + "change pen shade by _": "změň odstín pera o _", + "change pen size by _": "změň tloušťku pera o _", + "change size by _": "změň velikost o _", + "change tempo by _": "změň tempo o _", + "change volume by _": "", + "change x by _": "změň x o _", + "change y by _": "změň y o _", + "check for alternative GUI design": "zaškrtněte pro alternativní design GUI", + "check for block to text mapping features": "zaškrtněte pro funkce mapování bloků na text", + "check for flat ends of lines": "zaškrtněte pro ploché konce čar", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "zaškrtněte pro plynulé, předvídatelné animace napříč počítači", + "check for sprite inheritance features": "zaškrtněte pro funkce dědičnosti spritů", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "Zaškrtnutím povolit zobrazování typů slotů ve vstupním dialogu", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "zaškrtnutí zakáže více vláken", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "Zaškrtnutí zapne střídavé barvy pro vložené bloky", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "zaškrtnutní povolí použití posuvníků pro vstupní pole", + "check to enable keyboard editing support": "zaškrtněte pro podporu editace klávesnicí", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "zaškrtnutí povolí použití virtuální klávesnice na mobilních zařízeních", + "check to hide (+) symbols in block prototype labels": "zaškrtněte pro skrytí symbolů (+) v editoru bloků", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "zaškrtnutí spustí skripty zvýšenou rychlostí", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "zaškrtnutí zapne zvuk přicvaknutí bloku", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "zaškrtni pro použití měkkých stínů a světel", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "Srovnat", + "clear": "smaž", + "clear graphic effects": "odstraň grafické efekty", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "klikni nebo přetáhni kříž pro přesunutí centra otáčení", + "clicked": "na mě kliknou", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "barva _ je na barvě _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "moaré", + "command": "blok příkazů", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "barevnost", + "console log _": "výstup do konsole: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "kostým číslo", + "costume name": "", + "costumes": "", + "costumes tab help": "Nahrajte obrázek odjinud z webu nebo nahrajte soubor z Vašeho počítače přetažením sem.", + "could not connect to:": "", + "cr": "", + "create a clone of _": "vytvořit klon _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "aktuální _", + "current module versions:": "aktuální verze modulů:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "datum", + "day of week": "den v týdnu", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "smazat", + "delete _": "", + "delete _ of _": "smazat _ z _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "smazat definici bloku", + "delete slot": "", + "delete this clone": "odstranit klon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "Vývojový mód", + "development mode debugging primitives:": "vývojový mód ladění primitiv", + "development mode...": "", + "dimensions": "", + "direction": "směr", + "disable deep-Morphic context menus and show user-friendly ones": "zobrazovat jednoduché menu", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "vzdálenost od _", + "distribution": "", + "don't rotate": "neotáčet", + "down arrow": "šipka dolů", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "přetahovatelný", + "draggable?": "", + "dragging threshold": "", + "dropped": "mě upustí", + "duplicate": "kopírovat", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "okraj", + "edit": "upravit", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "upravit...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "zobrazovat pokročilé menu", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportovat", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "", + "extract": "", + "f": "f", + "false": "nepravda", + "file": "", + "file menu import hint": "Načíst exportovaný projekt, knihovnu bloků, kostýmy nebo zvuky", + "fill": "", + "fill page...": "", + "filtered for _": "filtrovaný pro _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "zaokrouhlit dolů", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "pro všechny sprite", + "for each _ in _ _": "", + "for this sprite only": "pouze pro tento sprite", + "forever _": "stále opakuj _", + "frame": "", + "frames": "snímky", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "duch", + "giant (8x)": "gigantické (8x)", + "glide _ secs to x: _ y: _": "plachti _ sekund na pozici x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "jdi do pozadí o _ úrovní", + "go to _": "jdi na _", + "go to _ layer": "", + "go to front": "jdi do popředí", + "go to x: _ y: _": "jdi na pozici x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "ahoj", + "help": "nápověda", + "help...": "nápověda...", + "hide": "schovej se", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "schovej proměnnou _", + "high": "", + "hour": "hodina", + "http:// _": "", + "hue": "", + "huge (4x)": "obrovské (4x)", + "i": "i", + "identical to": "stejný jako", + "if _ _": "když _ _", + "if _ _ else _": "když _ _ jinak _", + "if _ then _ else _": "", + "if on edge, bounce": "pokud narazíš na okraj, odskoč", + "import a sound from your computer by dragging it into here": "Nahrajte zvuk z Vašeho počítače přetažením sem.", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "", + "input names:": "proměnné:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "vložit _ na _ pozici v _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "je _ ?", + "is _ a _ ?": "je _ typu _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "položka _ z _", + "items": "", + "j": "j", + "join _": "spoj _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "stisknuta klávesa _ ?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Česky", + "language_translator": "Michal Moc, Jan Tomsa", + "large": "velký", + "last": "poslední", + "last changed": "", + "last_changed": "2015-11-16", + "launch _ _": "zahájit _ _", + "left": "", + "left arrow": "šipka doleva", + "length": "", + "length of _": "délka _", + "length:": "délka:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "písmeno _ z _", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "seznam", + "list _": "seznam _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "nahraje oficialní knihovnu pokročilých bloků", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "vytvořit blok...", + "make a category...": "", + "make a copy and pick it up": "vytvořit kopii a držet ji", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "zpráva", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "minuta", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "monstrózní (10x)", + "month": "měsíc", + "mosaic": "", + "motion": "", + "mouse down?": "stisknuto tlačítko myši?", + "mouse position": "", + "mouse x": "souřadnice myši x", + "mouse y": "souřadnice myši y", + "mouse-departed": "ze mě sjede myš", + "mouse-entered": "na mě najede myš", + "mouse-pointer": "kurzor myši", + "move": "přesunout", + "move _ steps": "posuň se o _ kroků", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "sama sebe", + "n": "n", + "name": "", + "neg": "", + "negative": "negativ", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "Nový...", + "next": "", + "next costume": "další kostým", + "none": "nic", + "normal": "normální", + "normal (1x)": "normální (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "není _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "číslo", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "kopírovat pouze tento blok", + "only face left/right": "jen vlevo/vpravo", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "otevřít nové okno s obrázkem tohoto skriptu", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "nebo", + "or before": "", + "other clones": "", + "other scripts in sprite": "ostatní skripty tohoto objektu", + "other sprites": "", + "p": "p", + "paint a new sprite": "nakreslit nový sprite", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "Heslo musí být dlouhé alespoň šest znaků.", + "passwords do not match": "Hesla se neshodují.", + "paste on _": "", + "pause": "", + "pause all _": "zastavit vše _", + "pen": "", + "pen _": "", + "pen down": "pero dolů", + "pen down?": "", + "pen trails": "stopa pera", + "pen up": "pero nahoru", + "pen vectors": "", + "pic...": "", + "pick random _ to _": "zvol náhodné číslo od _ do _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "zahraj tón _ po _ dob(y)", + "play sound _": "hraj zvuk _", + "play sound _ at _ Hz": "", + "play sound _ until done": "hraj zvuk _ a počkej", + "please agree to the TOS": "prosím zaškrtněte souhlas s Podmínkami služby", + "please fill out this field": "prosím vyplňte toto pole", + "please provide a valid email address": "Zadejte, prosím, platnou emailovou adresu.", + "point in direction _": "zamiř směrem _", + "point towards _": "zamiř k _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "podmínky", + "presentation (1.4x)": "prezentace (1.4x)", + "pressed": "mě stisknou", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "nahodilý", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "Zaměnit blok za...", + "release": "", + "remove block variables...": "", + "rename": "přejmenovat", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "přejmenovat kostým", + "rename only this reporter": "", + "rename sound": "přejmenovat zvuk", + "rename...": "přejmenovat...", + "repeat _ _": "opakuj _ krát _", + "repeat until _ _": "opakuj dokud nenastane _ _", + "replace item _ of _ with _": "nahraď položku _ v _ hodnotou _", + "report _": "vrátit _", + "reporter": "blok funkcí", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "vynulovat stopky", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "pauza _ dob(y)", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "šipka doprava", + "ring": "", + "ringify": "obalit", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "zaokrouhli _", + "run _ _": "spusť _ _", + "run _ w/continuation": "spustit _ s pokračováním", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "povídej _", + "say _ for _ secs": "povídej _ příštích _ sekund", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "obrázek skriptu...", + "script variables _": "Vytvoř skriptové proměnné _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "sekunda", + "select": "vybrat", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "nastav efekt _ na _", + "set _ of block _ to _": "", + "set _ to _": "nastav _ na _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "nastavit barvu pera na _", + "set pen shade to _": "nastav odstín pera na _", + "set pen size to _": "nastav tloušťku pera na _", + "set size to _ %": "změň velikost na _ %", + "set tempo to _ bpm": "nastav tempo na _ bpm.", + "set this morph's alpha value": "", + "set turbo mode to _": "nastavit turbo mód na _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "nastav x na _", + "set y to _": "nastav y na _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Zaškrtnutím bude preferováno prázdné místo na umístění", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "ukaž se", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "Zobrazit vše", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Zobrazit definici vlastních bloků jako XML v novém okně prohlížeče", + "show project data as XML in a new browser window": "zobrazit data projektu jako xml XML v novém okně prohlížeče", + "show table _": "", + "show the World's menu": "", + "show variable _": "ukaž proměnnou _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "velikost", + "slider": "posuvník", + "slider max...": "maximum...", + "slider min...": "minimum...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "mezerník", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "rozděl _ podle _", + "sprite": "", + "sprites": "", + "sqrt": "odmocnina", + "square": "", + "stack size": "velikost zásobníku", + "stage": "", + "stage image": "", + "stamp": "razítko", + "standard settings": "", + "stay signed in on this computer until logging out": "zůstaň přihlášen na tomto počítači až do odhlášení", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all sounds": "vypni všechny zvuky", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "oblékni kostým _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "věc", + "think _": "pomysli si _", + "think _ for _ secs": "pomysli si _ dalších _ sekund", + "this _": "", + "this block": "tento blok", + "this project doesn't have any custom global blocks yet": "Tento projekt nyní nemá žádné globální bloky", + "this script": "tento skript", + "time in milliseconds": "čas v milisekundách", + "timer": "stopky", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "dotýká se barvy _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "info@iguru.eu, jan.tomsa.1976@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "pravda", + "turbo mode": "", + "turbo mode?": "turbo mód?", + "turn _ _ degrees": "otoč se o _ _ stupňů", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "Typ _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "odškrtněte pro výchozí design GUI", + "uncheck for greater speed at variable frame rates": "odškrtněte pro vyšší rychlost", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "odškrtněte pro zakulacené konce čar", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "odškrtnutím bude upřednostňováno nahrazení celé podmínky", + "uncheck to allow script reentrance": "odškrtnutí povolí více vláken", + "uncheck to always show (+) symbols in block prototype labels": "odškrtněte pro používání symbolů (+) v editoru bloků", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "Odškrtnutí zruší použití střídavých barev pro vložené bloky", + "uncheck to disable block to text mapping features": "odškrtněte pro vypnutí funkcí mapování bloků na text", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "odškrtnutí vypne použití posuvníků pro vstupní pole", + "uncheck to disable keyboard editing support": "odškrtněte pro vypnutí podpory editace klávesnicí", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "odškrtněte pro vypnutí funkcí dědičnosti spritů", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "odškrtnutí zakáže podporu virtuální klávesnice na mobilních zařízeních", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "odškrtnutí spustí skript normální rychlostí", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "odškrtnutí vypne zvuk při přicvaknutí bloku", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "odškrtnutím se použijí ostré stíny a světla", + "uncheck to use the input dialog in short form": "odškrtnutí použije vstupní dialogy v krátké formě", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "Unicode _ jako znak", + "unicode of _": "Unicode _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "zrušit zabalení", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Bez názvu", + "unused": "", + "unused block(s) removed": "", + "up arrow": "šipka nahoru", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "čekej _ sekund", + "wait until _": "čekej dokud nenastane _", + "wardrobe": "", + "warp _": "obal _", + "what's your name?": "Jak se jmenuješ?", + "when I am _": "když _", + "when I receive _ _": "po přijetí zprávy _ _", + "when I start as a clone": "začít po naklonování", + "when _": "", + "when _ clicked": "Po klepnutí na _", + "when _ is edited _": "", + "when _ key pressed _": "po stisku klávesy _ _", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "s položkami", + "word": "", + "world": "světe", + "write _ size _": "", + "x": "x", + "x position": "pozice x", + "y": "y", + "y position": "pozice y", + "year": "rok", + "year:": "rok:", + "your own": "své vlastní", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-de.js b/elements/pl-snap/Snap/locale/lang-de.js new file mode 100644 index 00000000..ae83e35a --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-de.js @@ -0,0 +1,1380 @@ +SnapTranslator.dict.de = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "' gibt es an dieser Stelle nicht", + "(-90) left": "(-90) links", + "(0) up": "(0) oben", + "(1) sine": "(1) Sinus", + "(180) down": "(180) unten", + "(2) square": "(2) Quadrat", + "(3) sawtooth": "(3) Sägeblatt", + "(4) triangle": "(4) Dreieck", + "(90) right": "(90) rechts", + "(empty)": "(leer)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Über Snap", + "About...": "Über Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "Szene hinzufügen...", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Mehrzeiliger Text als Eingabe für Blöcke", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animationen", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Beliebig (zitiert)", + "Any type": "Beliebig", + "Apply": "Anwenden", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Wirklich löschen?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Zurück...", + "Backgrounds": "Hintergründe", + "Backup failed. This cannot be undone, proceed anyway?": "Backup nicht möglich. Trotzdem fortfahren?", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blockeditor", + "Blocks": "Bausteine", + "Blocks category name:": "Name der neuen Block-Gruppe:", + "Blurred shadows": "Weiche Schatten", + "Boolean": "Boole", + "Boolean (T/F)": "Boolsch (W/F)", + "Boolean (unevaluated)": "Boolsch (zitiert)", + "Bottom": "", + "Bring back deleted sprites": "Gelöschte Objekte zurückholen", + "Browser": "", + "Brush size": "Pinselstärke", + "Cache Inputs": "", + "Camera": "Kamera", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Abbrechen", + "Case sensitivity": "Groß- und Kleinschreibung", + "Catch errors": "", + "Catch errors in a script": "Fehlerhandhabung im Skript", + "Category color": "Kategoriefarbe", + "Change Password": "", + "Change Password...": "Passwort ändern...", + "Change block": "Block verändern", + "Clear backup": "", + "Clicking sound": "Akustisches Klicken", + "Closed brush (free draw)": "geschlossene, gefüllte Form (freies Zeichnen)", + "Cloud": "", + "Code mapping": "", + "Codification support": "Kodifikation", + "Colors and Crayons": "", + "Command": "Befehl", + "Command (C-shape)": "Befehl (C-Form)", + "Command (inline)": "Befehl", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Proportionen festlegen (auch über Shift-Taste)", + "Contents": "Inhalt", + "Contributors": "Mitwirkende", + "Control": "Steuerung", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Kostümeditor", + "Costumes": "Kostüme", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Eingabe erstellen", + "Create variables": "", + "Create variables in program": "Variablen im Skript erstellen", + "Credits...": "Mitwirkende...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Normal", + "Default Value:": "Standardwert:", + "Delete": "Löschen", + "Delete Custom Block": "Block Löschen", + "Delete Project": "Projekt löschen", + "Delete a variable": "Variable löschen", + "Disable click-to-run": "Block-Klicks deaktivieren", + "Disable dragging data": "Daten-Herausziehen deaktivieren", + "Down": "", + "Download source": "Quellcode runterladen", + "Dragging threshold...": "", + "Dynamic input labels": "Eingabenbeschriftung", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Randfarbe (Linksklick)", + "Edit input name": "Eingabe bearbeiten", + "Edit label fragment": "Beschriftung bearbeiten", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Ellipse (Shift: Kreis)", + "Empty": "Leer", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Radiergummi", + "Error": "Fehler", + "Examples": "Beispiele", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Blöcke exportieren", + "Export blocks...": "Blöcke exportieren...", + "Export project as plain text...": "Projekt als normalen Text exportieren...", + "Export project...": "Projekt exportieren...", + "Export summary with drop-shadows...": "", + "Export summary...": "Zusammenfassung exportieren...", + "Extension blocks": "Erweiterungsblöcke", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "extract solution": "Lösung extrahieren", + "delete solution": "Lösung löschen", + "Fade blocks": "Blöcke ausblenden", + "Fade blocks...": "Blöcke ausblenden...", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "fülle einen Bereich mit der gewählten Farbe", + "Fill color (right click)": "Füllfarbe (Rechtsklick)", + "Filled Ellipse (shift: circle)": "gefüllte Ellipse (Shift: Kreis)", + "Filled Rectangle (shift: square)": "gefülltes Rechteck (Shift: Quadrat)", + "First-Class Sprites": "", + "Flat design": "Helles Design", + "Flat line ends": "Flache Pinselstriche", + "For all Sprites": "Allen gemeinsam", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Generate puzzle": "Puzzle generieren", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "HSL Farbmodell", + "Header mapping": "", + "Hello!": "Hallo!", + "Hello, World!": "", + "Help": "Hilfe", + "Hide blocks in palette": "Blöcke verbergen", + "Hide blocks...": "Blöcke verbergen...", + "Hmm...": "Hmm...", + "Hummingbird robotics": "", + "Hyper blocks support": "Hyper-Blöcke", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "neues Kostüm mit der Webcam aufnehmen", + "Import blocks": "Blöcke importieren", + "Import library": "Modul laden", + "Import sound": "", + "Import...": "Importieren...", + "Imported": "Importiert", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Beliebig präzise Ganzzahlen, exakte rationale Zahlen, komplexe Zahlen", + "Inheritance support": "Prototypische Vererbung", + "Input Names:": "Eingaben:", + "Input Slot Options": "", + "Input name": "Eingabe", + "Input sliders": "Eingabeschieber", + "Inside a custom block": "In einem benutzerdefinierten Block", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iteration, Komposition", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "JavaScript Erweiterungen", + "JavaScript extensions for Snap! are turned off": "JavaScript Erweiterungen für Snap! sind ausgeschaltet", + "JavaScript function ( _ ) { _ }": "JavaScript Funktion ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Tastaturunterstützung", + "Kind of": "Eine Art", + "LEAP Motion controller": "LEAP Motion Controller", + "Language...": "Sprache...", + "Libraries...": "Module...", + "License": "Lizenz", + "License...": "Lizenz...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Linie (Shift: Vielfache von 45°)", + "Line tool (shift: vertical/horizontal)": "Linie (Shift: vertikal/horizontal)", + "List": "Liste", + "List utilities": "Listen bearbeiten", + "Lists": "Listen", + "Live coding support": "", + "Loading": "Lädt", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Malstiftvektoren aufzeichnen", + "Login...": "Anmelden...", + "Logout": "Abmelden", + "Long form input dialog": "Ausführlicher Input-Dialog", + "Looks": "Aussehen", + "Make a block": "Neuer Block", + "Make a variable": "Neue Variable", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Nachricht", + "Method Editor": "Methodeneditor", + "Microphone": "Mikrofon", + "Microphone resolution...": "Mikrofonauflösung...", + "Modules...": "Komponenten...", + "Motion": "Bewegung", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Mehrfach verzweigte Conditionals (Switch)", + "Multiple inputs (value is list of inputs)": "Mehrere Eingaben (als Liste)", + "Nested auto-wrapping": "Automatisches Umklammern", + "New": "Neu", + "New Category": "Neue Kategorie", + "New Project": "Neues Projekt", + "New category...": "Neue Kategorie...", + "New password:": "", + "New scene": "Neue Szene", + "No": "Nein", + "November": "", + "Number": "Zahl", + "OK": "OK", + "Object": "Objekt", + "October": "", + "Ok": "OK", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Öffnen", + "Open Project": "Projekt öffnen", + "Open in Community Site": "Projektseite anzeigen", + "Open...": "Öffnen...", + "Opening project...": "", + "Operators": "Operatoren", + "Other": "Andere", + "Output text using speech synthesis.": "", + "Paint Editor": "Kostümeditor", + "Paint a new costume": "neues Kostüm zeichnen", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "fülle einen Bereich mit der gewählten Farbe (Shift: Sekundärfarbe)", + "Paintbrush tool (free draw)": "Pinsel (freies Zeichnen)", + "Parallelization": "", + "Part of": "Ein Teil von", + "Parts": "Teile", + "Password:": "", + "Pen": "Stift", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipette (klicke irgendwo auf die gewünschte Farbe, um sie aufzunehmen)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Pipette klicke irgendwo auf die gewünschte Farbe um sie aufzunehmen (Shift: Sekundärfarbe)", + "Pixels": "", + "Plain prototype labels": "Einfache Prototyp-Beschriftung", + "Play": "Los", + "Play sound": "Klang abspielen", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Überprüfe, ob der Browser auf dem aktuellsten Stand und die Webcam korrekt konfiguriert ist. Für einige Browser muss Snap! mit HTTPS geöffnet werden, um auf die Kamera zuzugreifen. Ersetze dafür den \"http://\"-Teil in der Adresszeile mit\"https://\"", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Prädikat", + "Prefer empty slot drops": "Leere Platzhalter bevorzugen", + "Privacy...": "", + "Project Notes": "Projektanmerkungen", + "Project URLs": "", + "Project notes...": "Projektanmerkungen...", + "Provide 100 selected colors": "100 ausgewählte Farben", + "Provide getters and setters for all GUI-controlled global settings": "GUI Elemente programmatisch bearbeiten", + "Publish": "Veröffentlichen", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "neuen Klang aufnehmen", + "Recover": "Wiederherstellen", + "Rectangle (shift: square)": "Rechteck (Shift: Quadrat)", + "Reference manual": "Handbuch lesen", + "Remove a category...": "Kategorie löschen...", + "Remove unused blocks": "nicht verwendete Blöcke entfernen", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Das aktuelle Projekt durch ein neues ersetzen?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funktion", + "Request blocked": "Die Anfrage wurde blockiert", + "Resend Verification Email...": "Bestätigungsmail nochmal senden...", + "Resend verification email": "", + "Reset Password...": "Passwort zurücksetzen...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Retina Bildschirmauflösung", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Sichern", + "Save As...": "Sichern als...", + "Save Project": "Projekt sichern", + "Save Project As...": "Projekt Sichern Als...", + "Save to disk": "Abpeichern", + "Saved!": "Gesichert!", + "Saving project to the cloud...": "", + "Scenes...": "Szenen...", + "Script variable name": "Skriptvariablenname", + "Scripts": "Skripte", + "Select a costume from the media library": "Kostüm aus der Medienbibliothek auswählen", + "Select a sound from the media library": "Klang aus der Medienbibliothek auswählen", + "Select categories of additional blocks to add to this project.": "Zusätzliche Auswahl thematisch gruppierter Blöcke zu diesem Projekt hinzufügen", + "Selection tool": "Auswählen", + "Sensing": "Fühlen", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Stiftfarbe auf RGB oder HSV Werte setzen", + "Set the rotation center": "Drehpunkt setzen", + "Share": "Teilen", + "Share Project": "", + "Show buttons": "Knöpfe anzeigen", + "Show categories": "Kategorien anzeigen", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Benutzerkonto einrichten...", + "Single input.": "Einzeleingabe.", + "Single palette": "Einheitliche Palette", + "Slider maximum value": "Maximalwert des Reglers", + "Slider minimum value": "Minimalwert des Reglers", + "Snap! website": "Snap! Webseite", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Klang", + "Sound Recorder": "", + "Sounds": "Klänge", + "Sprite": "Objekt", + "Sprite Nesting": "", + "Stage": "Bühne", + "Stage height": "Bühnenhöhe", + "Stage selected: no motion primitives": "Bühne ausgewählt: keine Standardbewegungsblöcke vorhanden", + "Stage size": "Bühnengröße", + "Stage size...": "Bühnengröße...", + "Stage width": "Bühnenbreite", + "Stop": "Halt", + "Stop sound": "Klang anhalten", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Ellipse (Shift: Kreis)", + "Stroked Rectangle (shift: square)": "Rechteck (Shift: Quadrat)", + "Switch back to user mode": "zurück zum Benutzermodus", + "Switch to dev mode": "zum Hackermodus wechseln", + "Switch to vector editor?": "", + "Table lines": "Tabellen mit Linien", + "Table support": "Tabellenunterstützung", + "Table view": "Tabelle", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "Ternäre Bool'sche Inputs", + "Text": "Text", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Sprachausgabe", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "Die Frage stellte sich bei", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Threadsicherheit", + "Title text": "Beschriftung", + "Today": "Heute", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Übersetzungen", + "Translators...": "Übersetzer", + "Turbo mode": "Turbomodus", + "Turtle": "Richtungszeiger", + "Undelete sprites...": "Objekte wiederherstellen...", + "Unpublish": "Nicht mehr veröffentlichen", + "Unpublish Project": "", + "Unsaved Changes!": "Ungespeicherte Änderungen!", + "Unshare": "Nicht mehr teilen", + "Unshare Project": "", + "Untitled": "Unbenannt", + "Unused blocks...": "Nicht verwendete Blöcke...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "Projektliste laden", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Interne Variable außen sichtbar machen", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Variablenname", + "Variables": "Variablen", + "Variadic reporters": "Variadische Funktionen", + "Vector": "Vektor", + "Vector Paint Editor": "Vektor-Editor", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Visible stepping": "Programmausführung verfolgen", + "Web Audio API is not supported in this browser": "Das Web Audio API wird von diesem Browser nicht unterstützt", + "Web services access (https)": "Zugriff auf Webservices", + "Words, sentences": "Wörter, Sätze", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Ja", + "Yesterday": "Gestern", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebrafarben", + "Zoom blocks": "Blöcke vergrößern", + "Zoom blocks...": "Blöcke vergrößern...", + "_ at _": "_ bei _", + "_ combine _ using _": "_ kombiniere die Elemente von _ mit _", + "_ contains _": "_ enthält _", + "_ effect": "_ -Effekt", + "_ find first item _ in _": "_ finde das erste Element, das _ in _", + "_ in front of _": "_ am Anfang von _", + "_ keep items _ from _": "_ behalte Elemente, die _ aus _", + "_ map _ over _": "_ wende _ an auf _", + "_ mod _": "_ modulo _", + "_ of _": "_ von _", + "_ of block _": "_ von Block _", + "_ of costume _": "_ von Kostüm _", + "_ of sound _": "_ von Klang _", + "_ of text _": "_ von Text _", + "_ to _": "_ zu _", + "__shout__go__": "grüne Flagge angeklickt", + "a": "a", + "a custom block definition is missing": "Ein Block ist undefiniert", + "a new clone of _": "neuer Klon von _", + "a variable of name '": "Eine Variable mit dem Namen '", + "about morphic.js...": "", + "abs": "Betrag", + "acos": "acos", + "add _ to _": "füge _ zu _ hinzu", + "add a new Turtle sprite": "neues Objekt hinzufügen", + "add a new sprite": "ein neues Objekt hinzufügen", + "add comment": "Anmerkung hinzufügen", + "add comment here...": "Anmerkung hier hinzufügen", + "agent": "Agent", + "alert _": "Pop-up: _", + "all": "alle", + "all <": "alle <", + "all =": "alle =", + "all >": "alle >", + "all but first of _": "alles außer dem ersten von _", + "all but this script": "alles außer diesem Skript", + "all identical": "alles identisch in", + "all scenes": "alle Szenen", + "all ≤": "alle ≤", + "all ≥": "alle ≥", + "alpha value:": "", + "anchor": "Verankerung", + "and": "und", + "and send": "und sende", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "Antwort", + "any": "irgendein", + "any key": "beliebige Taste", + "any message": "eine beliebige Nachricht", + "anything": "beliebiges", + "append _": "verbinde _", + "arrange scripts vertically": "Skripte der Reihe nach anordnen", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "frage _ und warte", + "ask _ for _ _": "frage _ nach _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "hinten", + "balance": "Balance", + "big (2x)": "groß (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "Block", + "block deletion dialog text": "Soll dieser Block mit allen seinen Exemplare wirklich gelöscht werden?", + "block variables": "", + "block variables...": "Blockvariablen...", + "block-solid (0)": "normal (0)", + "blockify": "als Block", + "blocks": "Blöcke", + "blue": "blau", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "Rand unten", + "box": "", + "brightness": "Helligkeit", + "broadcast _ _": "sende _ _", + "broadcast _ _ and wait": "sende _ _ und warte", + "brush": "", + "build": "baue", + "but getting a": "bekomme aber", + "c": "c", + "call _ _": "rufe _ auf _", + "call _ w/continuation": "rufe _ mit Continuation auf", + "caller": "Aufrufer", + "camera": "", + "can only write text or numbers, not a": "Kann nur Text oder Zahlen schreiben, kein", + "can rotate": "frei drehbar", + "cannot handle zero width or height": "Breite oder Höhe dürfen nicht Null sein", + "cannot operate on a deleted sprite": "kann nicht mit einem gelöschten Objekt arbeiten", + "cannot send media, sprites or procedures to another scene": "Kann keine Medien, Objekte oder Programme an eine andere Szene senden", + "case sensitivity": "Groß- und Kleinschreibung", + "categories": "Kategorien", + "category": "Kategorie", + "ceiling": "Aufgerundet", + "center": "Mitte", + "center x": "Mittelpunkt x", + "center y": "Mittelpunkt y", + "change _ by _": "ändere _ um _", + "change _ effect by _": "ändere _ -Effekt um _", + "change background _ by _": "ändere Hintergrund _ um _", + "change balance by _": "ändere Balance um _", + "change pen _ by _": "ändere Stift _ um _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "ändere Stiftdicke um _", + "change size by _": "ändere Größe um _", + "change tempo by _": "ändere Tempo um _", + "change volume by _": "ändere Lautstärke um _", + "change x by _": "ändere x um _", + "change y by _": "ändere y um _", + "check for alternative GUI design": "einschalten für alternative Nutzeroberfläche", + "check for block to text mapping features": "", + "check for flat ends of lines": "einschalten für flache Pinselstrichenden", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "einschalten um eine höhere Auflösung zu erhalten, benötigt mehr Rechenleistung", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "einschalten, um immer die Datentypen im Input-Dialog zu sehen", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "einschhalten, um direktes Ausführen von Blöcken durch Anklicken zu verhindern", + "check to disallow script reentrance": "verhindert, dass unvollendete Skripte erneut gestartet werden", + "check to distinguish upper- and lowercase when comparing texts": "einschalten, um Groß- und Kleinschreibung\beim Vergleichen von Texten zu berücksichtigen", + "check to enable IDE animations": "einschalten um IDE- Animationen zu erlauben", + "check to enable alternating colors for nested blocks": "einschalten ür abwechselnde Farbnuancen in Blöcken", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "einschalten um Mehrfacheingabefelder automatisch zu beschriften", + "check to enable input sliders for entry fields": "einschalten um Schieber in Eingabefeldern zu aktivieren", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "erweiterte Anwendung von Operatoren auf Listen und Tabellen", + "check to hide (+) symbols in block prototype labels": "einschalten, um (+) Zeichen im Blockeditor immer anzuzeigen", + "check to inherit from": "einschalten, um zu erben von", + "check to prevent contents from being saved": "einschalten, um das Speichern des Inhalts im Projekt zu verhindern", + "check to prioritize script execution": "einschalten, um Skripte zu priorisieren", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "einschalten, um alle Blöcke in einer einzigen Palette zu sehen", + "check to show buttons in the palette": "einschalten, um Knöpfe in der Palette anzuzeigen", + "check to show category names in the palette": "einschalten, umd die Namen der Kategorien in der Palette anzuzeigen", + "check to show extension primitives in the palette": "einschalten um Blöcke für Erweiterungen in der Palette anzuzeigen", + "check to show in palette": "", + "check to support native JavaScript functions": "einschalten um JavaScript-Funktionen direkt in Snap! zu ermöglichen", + "check to switch pen colors and graphic effects to HSL": "einschalten, um das Farbmodell für den Malstift und die Grafikeffekte auf HSL zu setzen", + "check to turn block clicking sound on": "einschalten um akustisches Klicken zu aktivieren", + "check to turn on logging pen vectors": "einschalten, um Malstiftbewegungen als Vektor aufzuzeichnen", + "check to turn on visible stepping (slow)": "einschalten um Programmausführung zu verfolgen (schrittweise)", + "check to use blurred drop shadows and highlights": "einschalten für harte Schatten und Beleuchtung", + "children": "Abkömmlinge", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "Aufräumen", + "clear": "wische", + "clear graphic effects": "schalte Grafikeffekte aus", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Fadenkreuz anklicken oder bewegen um den Drehpunkt zu setzen", + "clicked": "angeklickt", + "clone": "Klonen", + "clones": "Klone", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "Farbe", + "color _ is touching _ ?": "Farbe _ berührt _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "Spalten", + "combinations _": "Kombinationen _", + "combine _ using _": "kombiniere die Elemente von _ mit _", + "comic": "Moire", + "command": "Befehlsblock", + "comment": "Anmerkung", + "comment pic...": "Kommentarbild", + "compile": "Kompilieren", + "compile _": "kompiliere _", + "compile _ for _ args": "", + "confetti": "Farbverschiebung", + "console log _": "schreibe in die Konsole: _", + "continuation": "Continuation", + "continuations cannot be forked": "Continuations können nicht separat gestartet werden", + "cos": "cos", + "costume": "Kostüm", + "costume #": "Kostüm Nr.", + "costume name": "Kostümname", + "costumes": "Kostüme", + "costumes tab help": "Bilder durch Hereinziehen von einer anderen Webseite oder vom Computer importieren", + "could not connect to:": "", + "cr": "Wagenrücklauf", + "create a clone of _": "klone _", + "cross": "", + "crosshairs": "", + "current": "aktuell", + "current _": "Kalender _", + "current module versions:": "Komponenten-Versionen", + "current parent": "aktueller Vorfahr", + "custom?": "benutzerdefiniert?", + "cut from _": "schneide aus _", + "d": "d", + "dangling?": "baumelnd?", + "data": "Daten", + "date": "Datum", + "day of week": "Wochentag", + "days left": "", + "days left.": "", + "defaults": "Defaults", + "define _ _ _": "definiere _ _ _", + "definition": "Definition", + "delete": "Löschen", + "delete _": "", + "delete _ of _": "entferne _ aus _", + "delete a category...": "Kategorie löschen...", + "delete block _": "lösche Block _", + "delete block definition...": "Blockdefinition löschen...", + "delete slot": "Feld löschen", + "delete this clone": "entferne diesen Klon", + "delete variable": "Variable löschen", + "delimiter": "", + "demo (1.2x)": "Demo (1.2x)", + "demo...": "", + "detach all parts": "Alle Teile abtrennen", + "detach and put into the hand": "", + "detach from": "Abtrennen von", + "development mode": "Hackermodus", + "development mode debugging primitives:": "Hackermodus Debugging-Blöcke", + "development mode...": "", + "dimensions": "Dimensionen", + "direction": "Richtung", + "disable deep-Morphic context menus and show user-friendly ones": "verlässt Morphic", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "verhindert, dass Medien und Blöcke aus Variablen und Sprechblasen herausgezogen werden können", + "disconnected.": "", + "distance": "Entfernung", + "distance to _": "", + "distribution": "Verteilung", + "don't rotate": "nicht drehbar", + "down arrow": "Pfeil nach unten", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "dieses Skript als XML Datei herunterladen", + "draggable": "greifbar", + "draggable?": "greifbar?", + "dragging threshold": "", + "dropped": "abgestellt", + "duplicate": "Duplizieren", + "duplicate block definition...": "Blockdefinition duplizieren...", + "duration": "Dauer", + "e": "e", + "e^": "e^", + "edge": "Kante", + "edit": "Bearbeiten", + "edit rotation point only...": "", + "edit the costume's rotation center": "Drehpunkt des Kostüms anzeigen und verschieben", + "edit...": "Bearbeiten...", + "editables": "Eingaben", + "elegant (90)": "elegant (90)", + "else if _ _": "sonst falls _ _", + "enable Morphic context menus and inspectors, not user-friendly!": "ermöglicht Morphic Funktionen", + "enter": "Eingabetaste", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "Die maximale Anzahl von Klonen wird überschritten", + "expecting": "Erwarte", + "expecting a": "Erwarte", + "expecting a finite number but getting Infinity or NaN": "Erwarte eine endliche Zahl bekomme aber Unendlich oder eine Nicht-Zahl", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "Exportieren", + "export block definition...": "Blockdefinition exportieren...", + "export pen trails line segments as SVG": "Striche in Malspuren als Vektorgraphik exportieren", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "Skript exportieren", + "export...": "Exportieren...", + "extent": "Maße", + "extract": "herausziehen", + "f": "f", + "false": "falsch", + "file": "", + "file menu import hint": "lädt ein exportiertes Projekt, eine Bibliothek mit Blöcken, ein Kostüm oder einen Klang", + "fill": "male aus", + "fill page...": "", + "filtered for _": "nach _ gefiltert", + "find blocks": "Blöcke finden", + "find blocks...": "", + "find first item _ in _": "finde das erste Element, das _ in _", + "find unused global custom blocks and remove their definitions": "nicht verwendete Blöcke finden und entfernen", + "fisheye": "Fischauge", + "flag": "", + "flash": "", + "flat line ends": "flache Pinselstriche", + "flatten": "Auflistung", + "flip ↔": "", + "flip ↕": "", + "floor": "Abgerundet", + "footprints": "", + "for _ = _ to _ _": "für _ = _ bis _ _", + "for all sprites": "für alle", + "for each _ in _ _": "für jedes _ von _ _", + "for this sprite only": "nur für dieses Objekt", + "forever _": "fortlaufend _", + "frame": "", + "frames": "Rahmenzähler", + "frequencies": "", + "frequency": "Frequenz", + "front": "vorn", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "Blöcke extrahieren", + "get data": "Daten extrahieren", + "ghost": "Durchsichtigkeit", + "giant (8x)": "gigantisch (8x)", + "glide _ secs to x: _ y: _": "gleite _ Sek. zu x: _ y: _", + "global?": "global?", + "globe": "", + "go back _ layers": "gehe _ Ebenen zurück", + "go to _": "gehe zu _", + "go to _ layer": "gehe nach _", + "go to x: _ y: _": "gehe zu x: _ y: _", + "gray scale palette": "", + "green": "grün", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "Höhe", + "hello": "Hallo", + "help": "Hilfe", + "help...": "Hilfe...", + "hide": "verstecken", + "hide all...": "", + "hide blocks...": "Blöcke verbergen...", + "hide variable _": "verstecke Variable _", + "high": "hoch", + "hour": "Stunde", + "http:// _": "http:// _", + "hue": "Farbton", + "huge (4x)": "riesig (4x)", + "i": "i", + "identical to": "identisch mit", + "if _ _ _": "falls _ _ _", + "if _ _ else _": "falls _ _ sonst _", + "if _ then _ else _": "falls _ dann _ sonst _", + "if on edge, bounce": "pralle vom Rand ab", + "import a sound from your computer by dragging it into here": "Klänge durch Hereinziehen importieren", + "import without attempting to parse or format data": "Daten unformatiert importieren", + "import...": "Importieren...", + "in palette": "In der Palette", + "including dependencies": "mit allen verwendeten Blöcken", + "index": "Index", + "index of _ in _": "Index von _ in _", + "inherit _": "erbe _", + "inherited": "geerbt", + "input list:": "Eingabeliste:", + "input names:": "Eingaben:", + "input(s), but getting": "", + "inputs": "Eingaben", + "insert _ at _ of _": "füge _ als _ in _ ein", + "insert a slot": "Ein Feld einfügen", + "insert a variable": "Eine Variable einfügen", + "inspect...": "", + "is _ ?": "ist _ ?", + "is _ a _ ?": "ist _ ein(e) _ ?", + "is _ empty?": "ist _ leer?", + "is _ on?": "ist _ an?", + "is not a valid option": "ist keine erlaubte Auswahl", + "is read-only": "kann nur gelesen werden", + "item": "Element", + "item _ of _": "Element _ von _", + "items": "Elemente", + "j": "j", + "join _": "verbinde _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "behalte Elemente, die _ aus _", + "key": "Taste", + "key _ pressed?": "Taste _ gedrückt?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "Aufschrift", + "language_name": "Deutsch", + "language_translator": "Jens Mönig, Jadga Hügle", + "large": "groß", + "last": "letztes", + "last_changed": "2023-11-22", + "launch _ _": "starte _ _", + "left": "Rand links", + "left arrow": "Pfeil nach links", + "length": "Länge", + "length of _": "", + "length:": "Länge:", + "let the World automatically adjust to browser resizing": "", + "letter": "Buchstabe", + "letter _ of _": "Zeichen _ von _", + "light (70)": "leicht (70)", + "lightness": "Helligkeit", + "line": "Zeilenvorschub", + "lines": "Zeilen", + "list": "Liste", + "list _": "Liste _", + "list view...": "Listenansicht...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "Vektoraufzeichnung", + "login": "", + "loop": "", + "low": "niedrig", + "lower case": "Kleinbuchstaben", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "Neuen Block bauen...", + "make a category...": "Neue Kategorie...", + "make a copy and pick it up": "eine Kopie aufnehmen", + "make a morph": "", + "make temporary and hide in the sprite corral": "temporär machen und Icon verstecken", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "wende _ an auf _", + "map _ to _ _": "", + "max": "max", + "maximum": "Maximum", + "medium (50)": "mittel (50)", + "menus": "Menüs", + "message": "Nachricht", + "microphone _": "Mikrofon _", + "middle": "", + "minimum": "Minimum", + "minute": "Minute", + "mirror video": "Video gespiegelt", + "missing / unspecified extension": "Fehlende / undefinierte Erweiterung", + "monstrous (10x)": "ungeheuerlich (10x)", + "month": "Monat", + "mosaic": "Mosaik", + "motion": "Bewegung", + "mouse down?": "Maustaste gedrückt?", + "mouse position": "Mausposition", + "mouse x": "Maus x-Position", + "mouse y": "Maus y-Position", + "mouse-departed": "vom Mauszeiger verlassen", + "mouse-entered": "vom Mauszeiger betreten", + "mouse-pointer": "Mauszeiger", + "move": "Verschieben", + "move _ steps": "gehe _ Schritte", + "move all inside...": "", + "move...": "", + "my": "Attribut", + "my _": "Attribut _", + "my anchor": "Attribut Verankerung", + "my dangling?": "Attribut baumelnd?", + "my draggable?": "Attribut greifbar?", + "my name": "Attribut Name", + "my parent": "Attribut Vorfahr", + "my rotation style": "Attribut Drehtyp", + "my rotation x": "Attribut Drehpunkt x", + "my rotation y": "Attribut Drehpunkt y", + "my temporary?": "Attribut temporär?", + "myself": "selbst", + "n": "n", + "name": "Name", + "neg": "", + "negative": "Farbumkehr", + "neighbors": "Nachbarn", + "neighbors ≠": "benachbarte ≠", + "new costume _ width _ height _": "neues Kostüm _ Breite _ Höhe _", + "new line": "neue Zeile", + "new sound _ rate _ Hz": "neuer Klang _ Abtastrate _ Hz", + "new...": "Neu...", + "next": "nächste", + "next costume": "nächstes Kostüm", + "none": "nichts", + "normal": "normal", + "normal (1x)": "normal (1x)", + "normalScreen": "", + "normalStage": "", + "not": "nicht", + "not _": "nicht _", + "note": "Note", + "nothing": "nichts", + "now connected.": "", + "number": "Zahl", + "number of channels": "Anzahl Kanäle", + "numbers from _ to _": "Zahlen von _ bis _", + "o": "o", + "object _": "Objekt _", + "octagon": "", + "only duplicate this block": "nur diesen Block duplizieren", + "only face left/right": "kann sich nur nach links/rechts drehen", + "only grab this block": "nur diesen Block bewegen", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "in neuem Fenster öffnen", + "open shared project from cloud...": "", + "options...": "", + "or": "oder", + "or before": "", + "other clones": "andere Klone", + "other scripts in sprite": "andere Skripte in diesem Objekt", + "other sprites": "andere Objekte", + "p": "p", + "paint a new sprite": "neues Objekt zeichnen", + "paintbucket": "", + "parameters": "", + "parent": "Vorfahr", + "parent...": "Vorfahr...", + "parts": "Teile", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "drucke auf _", + "pause": "", + "pause all _": "pausiere alles _", + "pen": "", + "pen _": "Stift _", + "pen down": "Stift runter", + "pen down?": "Stift unten?", + "pen trails": "Malspuren", + "pen up": "Stift hoch", + "pen vectors": "Vektor-Malspuren", + "pic...": "Bild exportieren...", + "pick random _ to _": "Zufallszahl von _ bis _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "Angelpunkt", + "pixel": "", + "pixelate": "Pixel", + "pixels": "Pixel", + "play _ Hz for _ secs": "spiele _ Hz für _ Sek.", + "play frequency _ Hz": "spiele Frequenz _ Hz", + "play note _ for _ beats": "spiele Note _ für _ Schläge", + "play sound _": "spiele Klang _", + "play sound _ at _ Hz": "spiele Klang _ mit _ Hz", + "play sound _ until done": "spiele Klang _ ganz", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "setze Richtung auf _ Grad", + "point towards _": "zeige auf _", + "pointRight": "", + "polygon": "", + "position": "Position", + "poster": "", + "predicate": "Prädikat", + "presentation (1.4x)": "Präsentation (1.4x)", + "pressed": "gedrückt", + "previous": "vorherige", + "processes": "", + "product": "Produkt", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "R-G-B-A Farbwerte", + "random": "zufällig", + "random position": "zufällige Position", + "rank": "Rang", + "raw data...": "Rohdaten...", + "ray length": "Strahlenlänge", + "read-only": "", + "receivers...": "Empfänger...", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "rot", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "Wiederherstellen", + "relabel...": "Umbenennen...", + "release": "Entlassen", + "remove block variables...": "", + "rename": "Umbenennen", + "rename all blocks that access this variable": "alle Blöcke umbenennen, die diese Variable referenzieren", + "rename all...": "alle umbenennen...", + "rename background": "Hintergrund umbenennen", + "rename costume": "Kostüm umbenennen", + "rename only this reporter": "nur diesen Block umbenennen", + "rename sound": "Klang umbenennen", + "rename...": "Umbenennen...", + "repeat _ _": "wiederhole _ mal _", + "repeat until _ _": "wiederhole bis _ _", + "replace item _ of _ with _": "ersetze Element _ in _ durch _", + "replaceables": "Platzhalter", + "report _": "berichte _", + "reporter": "Funktionsblock", + "reporter didn't report": "Der Rückgabewert fehlt bei einer Funktion", + "reset columns": "Spaltenbreiten zurücksetzen", + "reset timer": "starte Stoppuhr neu", + "reshape _ to _": "strukturiere _ in _", + "resize...": "", + "resolution": "Auflösung", + "rest for _ beats": "spiele Pause für _ Schläge", + "restore display": "", + "result pic...": "Ergebnisbild...", + "reverse": "Umkehrung", + "right": "Rand rechts", + "right arrow": "Pfeil nach rechts", + "ring": "Ring", + "ringify": "Umringen", + "robot": "", + "rotate": "Drehen", + "rotation style": "Drehtyp", + "rotation x": "Drehpunkt x", + "rotation y": "Drehpunkt y", + "round _": "_ gerundet", + "run _ _": "führe _ aus _", + "run _ w/continuation": "führe _ mit Continuation aus", + "s": "s", + "sample morphs": "", + "sample rate": "Abtastrate", + "samples": "Signale", + "saturation": "Sättigung", + "save _ as costume named _": "", + "save a picture of all scripts": "ein Bild aller Skripte speichern", + "save a picture of both this script and its result": "ein Bild dieses Skripts mit seinem Ergebnis speichern", + "save a picture of the stage": "ein Bild der Bühne speichern", + "save a picture of this comment": "ein Bild dieser Anmerkung speichern", + "save a picture of this script": "ein Bild dieses Skripts speichern", + "save a summary of this project": "eine Zusammenfassung dieses Projekts speichern", + "save global custom block definitions as XML": "globale Benutzerblockdefinitionen als XML-Datei speichern", + "save project data as XML to your downloads folder": "Projekt als XML-Datei in den Download- Ordner des Browsers speichern", + "saved.": "", + "say _": "sage _", + "say _ for _ secs": "sage _ für _ Sek.", + "scope": "Bereich", + "screenshot": "", + "screenshot...": "", + "script": "Skript", + "script pic with result...": "", + "script pic...": "Skriptbild...", + "script variables _": "Skriptvariablen _", + "scripts": "Skripte", + "scripts pic...": "Bild aller Skripte...", + "scroll frame": "", + "scrolled-down": "nach unten gescrollt", + "scrolled-up": "nach oben gescrollt", + "second": "Sekunde", + "select": "auswählen", + "selection": "", + "self": "selbst", + "send _ to _": "", + "senders...": "Sender...", + "sensor demo": "", + "separators": "Trennworte", + "set _ effect to _": "setze _ -Effekt auf _", + "set _ of block _ to _": "setze _ von Block _ auf _", + "set _ to _": "setze _ auf _", + "set background _ to _": "setze Hintergrund _ auf _", + "set background color to _": "setze Hintergrundfarbe auf _", + "set balance to _": "setze Balance auf _", + "set instrument to _": "setze Instrument auf _", + "set pen _ to _": "setze Stift _ auf _", + "set pen color to _": "setze Stiftfarbe auf _", + "set pen shade to _": "", + "set pen size to _": "setze Stiftdicke auf _", + "set size to _ %": "setze Größe auf _ %", + "set tempo to _ bpm": "setze Tempo auf _ Schläge/Min.", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "setze Videotransparenz auf _", + "set volume to _ %": "setze Lautstärke auf _ %", + "set x to _": "setze x auf _", + "set y to _": "setze y auf _", + "setting the rotation center requires a costume": "Der Drehpunkt kann nur zusammen mit einem Kostüm gesetzt werden", + "settings menu prefer empty slots hint": "einschalten um leere Platzhalter beim Platzieren von Blöckenzu bevorzugen", + "several block definitions already match this label": "Mehrere Blöcke passen zu dieser Aufschrift", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "schimmernd (80)", + "show": "anzeigen", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "Alles zeigen", + "show all...": "", + "show project data as XML in a new browser window": "zeigt das Projekt als XML in einem neuen Browserfenster an", + "show table _": "", + "show the World's menu": "", + "show variable _": "zeige Variable _", + "shown?": "angezeigt?", + "shrink": "", + "shuffled": "Mischung", + "signals": "", + "sin": "sin", + "size": "Größe", + "slider": "Regler", + "slider max...": "Maximalwert...", + "slider min...": "Minimalwert...", + "slots": "Felder", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "Snap", + "solutions": "Lösungen", + "sorted": "Sortierung", + "sound": "", + "sounds": "Klänge", + "space": "Leertaste", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "Frequenzspektrum", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "trenne _ nach _", + "sprite": "Objekt", + "sprites": "Objekte", + "sqrt": "Wurzel", + "square": "", + "stack size": "Stapelgröße", + "stage": "Bühne", + "stage image": "", + "stamp": "stemple", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "Befestigen an", + "stop _": "stoppe _", + "stop all sounds": "stoppe alle Klänge", + "stop frequency": "stoppe Frequenz", + "stopped": "gestoppt", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "dieses Projekt herunterladen und lokal speichern (nicht von allen Browsern untersützt)", + "stretch _ x: _ y: _ %": "strecke _ x: _ y: _ %", + "string": "", + "subtle (95)": "angedeutet (95)", + "sum": "Summe", + "svg...": "SVG exportieren...", + "switch to costume _": "ziehe Kostüm _ an", + "switch to scene _ _": "wechsle zur Szene _ _", + "t": "t", + "tab": "Tabulator", + "table view...": "tabellarische Ansicht...", + "take a camera snapshot and import it as a new sprite": "neues Objekt mit Webcam-Kostüm hinzufügen", + "tan": "tan", + "tell _ to _ _": "lasse _ _ tun _", + "tempo": "Tempo", + "temporary?": "temporär?", + "text": "Text", + "text-only (100)": "nur Text (100)", + "the predicate takes too long for a custom hat block": "Das Prädikat dauert zu lang für einen benutzerdefinierten Ereignisblock", + "there are currently no unused global custom blocks in this project": "momentan keine nicht verwendeten Blöcke in diesem Projekt", + "there are currently no vectorizable pen trail segments": "momentan gibt es keine vektorisierbaren Malspuren", + "thing": "etwas", + "think _": "denke _", + "think _ for _ secs": "denke _ für _ Sek.", + "this _": "Laufzeit _", + "this block": "diesen Block", + "this project doesn't have any custom global blocks yet": "in diesem Projekt gibt es noch keine globalen Blöcke", + "this script": "dieses Skript", + "time in milliseconds": "Zeit in Millisekunden", + "timer": "Stoppuhr", + "tip": "", + "to": "an", + "top": "Rand oben", + "touch screen settings": "", + "touching _ ?": "berühre _ ?", + "transient": "nicht persistent", + "translations": "Übersetzungen", + "translations...": "Übersetzungen...", + "translator_e-mail": "jens@moenig.org, jadga.huegle@sap.com", + "transparency": "Transparenz", + "transparency...": "", + "trash is empty": "der Mülleimer ist leer", + "true": "wahr", + "turbo mode": "Turbomodus", + "turbo mode?": "", + "turn _ _ degrees": "drehe _ _ Grad", + "turn all pen trails and stamps into a new background for the stage": "Hintergrund aus allen Malspuren und Stempelabdrücken auf der Bühne erstellen", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "aus allen Malspuren und Stempelabdrücken ein Kostüm für die momentan ausgewählte Figur erstellen", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "Art", + "type of _": "Typ von _", + "u": "u", + "unable to convert to": "Kann die Liste nicht umwandeln in", + "unable to inherit (disabled or circular?)": "Kann nicht erben (ausgeschaltet oder zirkulär?)", + "unable to nest (disabled or circular?)": "Kann nicht verschachteln (ausgeschaltet oder zirkulär?)", + "uncheck for default GUI design": "ausschalten für Standard-Nutzeroberfläche", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "ausschalten um eine niedrigere Auflösung zu erhalten und weniger Rechenleistung zu benötigen", + "uncheck for round ends of lines": "auschalten für runde Pinselstrichenden", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "ausschalten um das \"Rauskicken\" von platzierten Blöcken zu ermöglichen", + "uncheck to allow script reentrance": "verhindert, dass unvollendete Skripte erneut gestartet werden", + "uncheck to always show (+) symbols in block prototype labels": "ausschalten, um (+) Zeichen im Blockeditor zu verbergen", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "ausschalten um IDE- Animationen zu verhindern", + "uncheck to disable alternating colors for nested block": "ausschalten verhindert abwechselnde Farbnuancen in Blöcken", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "ausschalten verhindert Beschriftung von Mehrfacheingaben", + "uncheck to disable input sliders for entry fields": "ausschalten um Schieber in Eingabefeldern zu verhindern", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "ausschalten, um potentiell gefährliche JavaScript-Funktionen zu verhindern", + "uncheck to disable using operators on lists and tables": "erweiterte Anwendung von Operatoren auf Listen und Tabellen", + "uncheck to disinherit": "ausschalten, um nicht mehr zu erben", + "uncheck to drag media and blocks out of watchers and balloons": "ausschalten, um Medien und Blöcke aus Variablen und Sprechblasen herauszuziehen", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "ausschhalten, um direktes Ausführen von Blöcken durch Anklicken zu ermöglichen", + "uncheck to hide buttons in the palette": "ausschalten, um Knöpfe in der Palette zu verbergen", + "uncheck to hide category names in the palette": "ausschalten, um die Namen der Kategorien in der Palette zu verbergen", + "uncheck to hide extension primitives in the palette": "ausschalten um Blöcke für Erweiterungen in der Palette zu verbergen", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "ausschalten, um Groß- und Kleinschreibung beim Vergleichen von Texten zu ignorieren", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "ausschalten, um Skripte normal auszuführen", + "uncheck to save contents in the project": "ausschalten, um den Inhalt im Projekt zu speichern", + "uncheck to show only the selected category's blocks": "ausschalten, um nur die Blöcke der ausgewählten Kategorie zu sehen", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "ausschalten, um das Farbmodell für den Malstift und die Grafikeffekte auf HSV zurückzusetzen", + "uncheck to turn block clicking sound off": "ausschalten um akustisches Klicken zu deaktivieren", + "uncheck to turn off logging pen vectors": "ausschalten, um Malstiftbewegungen nicht mehr aufzuzeichnen", + "uncheck to turn off visible stepping": "ausschalten um Programmausführung nicht mehr zu verfolgen", + "uncheck to use solid drop shadows and highlights": "abschalten für harte Schatten und Beleuchtung", + "uncheck to use the input dialog in short form": "ausschalten für kurzen Input-Dialog", + "uncompile": "Entkompilieren", + "undo": "rückgängig", + "undo the last block drop in this pane": "Setzen des letzten Blocks widerrufen", + "undrop": "Rückgängig", + "unicode _ as letter": "Unicode _ als Buchstabe", + "unicode of _": "Unicode Wert von _", + "uniques": "Wertemenge", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "Entringen", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "Attribut wird nicht unterstützt", + "unsupported data type": "Nicht unterstützter Datentyp", + "unsupported graphic effect": "Nicht unterstützter Grafikeffekt", + "untitled": "Unbenannt", + "unused": "nicht verwendete", + "unused block(s) removed": "nicht verwendete Blöcke entfernt", + "up arrow": "Pfeil nach oben", + "upper case": "Großbuchstaben", + "url...": "", + "use the keyboard to enter blocks": "Blöcke per Tastatur eingeben", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "Wert", + "variable": "Variable", + "variables": "Variablen", + "video _ on _": "Video _ auf _", + "video capture": "Videoaufnahme", + "volume": "Lautstärke", + "w": "w", + "wait _ secs": "warte _ Sek.", + "wait until _": "warte bis _", + "wardrobe": "", + "warp _": "Warp _", + "what's your name?": "Wie heißt Du?", + "when I am _": "Wenn ich _ werde", + "when I receive _ _": "Wenn ich _ empfange _", + "when I start as a clone": "Wenn ich als Klon starte", + "when _": "Wenn _", + "when _ clicked": "Wenn _ angeklickt", + "when _ is edited _": "Wenn _ bearbeitet wird _", + "when _ key pressed _": "Wenn Taste _ gedrückt _", + "whirl": "Wirbel", + "whitespace": "Leerraum", + "width": "Breite", + "with": "mit", + "with data": "mit Daten", + "with inputs": "mit Eingaben", + "word": "Wort", + "world": "Welt", + "write _ size _": "schreibe _ Größe _", + "x": "x", + "x position": "x-Position", + "y": "y", + "y position": "y-Position", + "year": "Jahr", + "year:": "", + "your own": "eigene", + "z": "z" +}; diff --git a/elements/pl-snap/Snap/locale/lang-dk.js b/elements/pl-snap/Snap/locale/lang-dk.js new file mode 100644 index 00000000..e16f8df8 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-dk.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.dk = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) venstre", + "(0) up": "(0) op", + "(1) sine": "", + "(180) down": "(180) ned", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) højre", + "(empty)": "(tom)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Om Snap", + "About...": "Om...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animationer", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Hvad som helst (uevalueret)", + "Any type": "Hvad som helst", + "Apply": "Anvend", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Er du sikker på at du vil slette", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Tilbage...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blokværktøj", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Slørede skygger", + "Boolean": "boolsk", + "Boolean (T/F)": "Boolsk (S/F)", + "Boolean (unevaluated)": "Boolsk (uevalueret)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Annuller", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Skift blok", + "Clear backup": "", + "Clicking sound": "Kliklyd", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "Afkodningsunderstøttelse", + "Colors and Crayons": "", + "Command": "Kommando", + "Command (C-shape)": "Kommando (C-form)", + "Command (inline)": "Kommando (integreret)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Bidragydere", + "Control": "Styring", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Kostumeværktøj", + "Costumes": "Kostumer", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Lav inputnavn", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Anerkendelse...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "Værdi som udgangspunkt:", + "Delete": "Slet", + "Delete Custom Block": "Slet tilpasset blok", + "Delete Project": "Slet projekt", + "Delete a variable": "slet en variabel", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Hent kildekode", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamiske inputmærkater", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Rediger inputnavn", + "Edit label fragment": "Rediger mærkat", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Tom", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Eksporter blokke", + "Export blocks ...": "Eksporter blokke...", + "Export blocks...": "", + "Export project as plain text ...": "Eksporter projekt som ren tekst...", + "Export project as plain text...": "", + "Export project...": "Eksporter projekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "Eksporter opsummering...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Fladt udseende", + "Flat line ends": "Flade penselstrøg", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Hej!", + "Hello, World!": "", + "Help": "Hjölp", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Importer blokke", + "Import library": "Importer bibliotek", + "Import sound": "", + "Import tools": "Importer værktøjer...", + "Import...": "Importer...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Nedarvningsunderstøgttelse", + "Input Names:": "Inputnavne:", + "Input Slot Options": "", + "Input name": "inputnavn", + "Input sliders": "Indtastningsskydeknapper", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Tastaturredigering", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Sprog...", + "Libraries...": "Biblioteker...", + "License": "Licens", + "License...": "Lisens...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "", + "Lists": "Lister", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "", + "Logout": "", + "Long form input dialog": "Lang formularinputdialog", + "Looks": "Udseende", + "Make a block": "Lav en blok", + "Make a variable": "lav en variabel", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Beskednavn", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Moduler...", + "Motion": "Bevægelse", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Flere inputs (værdi er liste af inputs)", + "Nested auto-wrapping": "Automatisk omklamring", + "New": "Ny", + "New Category": "", + "New Project": "Nyt projekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nej", + "November": "", + "Number": "Tal", + "OK": "", + "Object": "Objekt", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Åbn projekt", + "Open in Community Site": "", + "Open...": "Åbn...", + "Opening project...": "", + "Operators": "Operatorer", + "Other": "Andet", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Pensel", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Klare prototypemærkater", + "Play": "Afspil", + "Play sound": "Afspil lyd", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Prædikat", + "Prefer empty slot drops": "Foretræk tomme hylstre", + "Prefer smooth animations": "Foretræk flydende animationer", + "Privacy...": "", + "Project Notes": "", + "Project Notes...": "Projektnoter...", + "Project URLs": "", + "Project notes...": "Projektnoter...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Referencemanual", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Erstat det nuværende projekt med et nyt et?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Rapportør", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Nulstil kodeord...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Gem", + "Save As...": "Gem som...", + "Save Project": "", + "Save Project As...": "Gem projekt som...", + "Save to disk": "", + "Saved!": "Gemt!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Sansning", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Registrer...", + "Single input.": "Enkel input.", + "Single palette": "", + "Slider maximum value": "skydeknap maksimumsværdi:", + "Slider minimum value": "skydeknap minimumsværdi:", + "Snap! website": "Snap! hjemmeside", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Lyd", + "Sound Recorder": "", + "Sounds": "Lyde", + "Sprite": "Figur", + "Sprite Nesting": "", + "Stage": "Scene", + "Stage height": "Scenehøjde", + "Stage selected: no motion primitives": "Scene valgt: ingen bevægelsesblokke", + "Stage size": "Scenestørrelse", + "Stage size...": "Scenestørrelse...", + "Stage width": "Scenebredde", + "Stop": "", + "Stop sound": "Stop lyd", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Skift tilbage til brugertilstand", + "Switch to dev mode": "Skift til udviklertilstand", + "Switch to vector editor?": "", + "Table lines": "Tabeller med linjer", + "Table support": "Tabelunderstøttelse", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Trådsikre scripts", + "Title text": "Titelstekst", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Oversættelser", + "Translators...": "Oversættere", + "Turbo mode": "Hurtig gennemgang", + "Turtle": "Skildpadde", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Unavngivet", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Opvar - gør interne variable synlige for kalderen", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "variabelnavn", + "Variables": "Variable", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuelt tastatur", + "Visible stepping": "Synlig gennemgang", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebrafarvning", + "Zoom blocks": "", + "Zoom blocks...": "Forstør blokke...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ indeholder _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ foran _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ af _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "absolut", + "acos": "acos", + "add _ to _": "tilføj _ til _", + "add a new Turtle sprite": "Tilføj en ny Skildpaddefigur", + "add a new sprite": "", + "add comment": "tilføj kommentar", + "add comment here...": "tilføj kommentar her...", + "agent": "", + "alert _": "alarm _", + "all": "", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "alle undtagen den første af _", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "og", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "svar", + "any": "nogen", + "any key": "", + "any message": "", + "anything": "", + "append _": "", + "arrange scripts vertically": "arranger scripts lodret", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "spørg _ og vent", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Skal denne blok virkelig slettes?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "lysstyrke", + "broadcast _ _": "send _ _", + "broadcast _ _ and wait": "send _ _ og vent", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "kald _ _", + "call _ w/continuation": "kald _ med fortsættelse", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "kan rotere", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "ændr _ med _", + "change _ effect by _": "ændr effekten _ med _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ændr penselfarven med _", + "change pen shade by _": "ændr penselskyggen med _", + "change pen size by _": "ændr penselstørrelsen med _", + "change size by _": "ændr størrelse med _", + "change tempo by _": "ændr tempoet med _", + "change volume by _": "", + "change x by _": "ændr x med _", + "change y by _": "ændr y med _", + "check for alternative GUI design": "marker for alternativ grafisk brugerflade", + "check for block to text mapping features": "", + "check for flat ends of lines": "marker for flade penselstrøg", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "marker for flydende, forudsigelige animationer på forskellige computere", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "marker for altid at vise hylstertyper i inputdialog", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "marker for at forbyde scriptgenindgang", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "marker for at bruge IDE-animationer", + "check to enable alternating colors for nested blocks": "marker for at vise skiftende farver for blokke inden i hinanden", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "marker for at vise dynamiske mærkater til varierende input", + "check to enable input sliders for entry fields": "marker for at vise skydeknapper i inputfelter", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "marker for at bruge understøttelse af virtuelt tastetur til mobile enheder", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "marker for at prioritere scriptudførsel", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "marker til for at tænde for blokkliklyd", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "marker for at bruge bløde skygger og fremhævelser", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "ryd op", + "clear": "ryd", + "clear graphic effects": "ryd grafiske effekter", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "klik eller tr\u0000E6k med sigtekornet for at flytte omdrejningspunktet", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "farve", + "color _ is touching _ ?": "rører farven _ ved farven _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "tegneserie", + "command": "kommando", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "konfetti", + "console log _": "skriv i konsollen: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "kostume nummer", + "costume name": "", + "costumes": "", + "costumes tab help": "Importer et billede fra din computer eller en webside ved at trække det her hen", + "could not connect to:": "", + "cr": "", + "create a clone of _": "lav en klon af _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "Nuværende modulversioner", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "slet", + "delete _": "", + "delete _ of _": "slet _ fra _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "slet blokdefinitionen...", + "delete slot": "", + "delete this clone": "slet denne klon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "Løsriv alle dele", + "detach and put into the hand": "", + "detach from": "løsriv fra", + "development mode": "udviklertilstand", + "development mode debugging primitives:": "udviklertilstand fejlfindingsenheder", + "development mode...": "", + "dimensions": "", + "direction": "retning", + "disable deep-Morphic context menus and show user-friendly ones": "slå deep-Morphics kontekstmenuer fra og vis brugervenlige i stedet", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "afstand til _", + "distribution": "", + "don't rotate": "roter ikke", + "down arrow": "pil ned", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "kan trækkes", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "dupliker", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "kant", + "edit": "rediger", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "rediger...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "sæt deep-Morphics kontekstmenuer til og vis brugervenlige i stedet", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "eksporter", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "eksporter...", + "extract": "", + "f": "f", + "false": "falsk", + "file": "", + "file menu import hint": "Importer et eksporteret projekt,et blokbibliotek, et kostumeeller en lydfil", + "fill": "fyld", + "fill page...": "", + "filtered for _": "renset for _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "fiskeøje", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "for alle figurer", + "for each _ in _ _": "", + "for this sprite only": "kun for denne figur", + "forever _": "for evigt _", + "frame": "", + "frames": "billeder", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "spøgelse", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "svæv i _ sekunder til x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "smut _ lag tilbage", + "go to _": "gå til _", + "go to _ layer": "", + "go to front": "kom forrest", + "go to x: _ y: _": "gå til x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "hej", + "help": "hjælp", + "help...": "hjælp...", + "hide": "skjul", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "skjul variabel _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "", + "i": "i", + "identical to": "identisk med", + "if _ _": "hvis _ _", + "if _ _ else _": "hvis _ _ ellers _", + "if _ then _ else _": "", + "if on edge, bounce": "hop tilbage ved kanten", + "import a sound from your computer by dragging it into here": "Importer en lyd fra din computer ved at trække den her hen", + "import without attempting to parse or format data": "", + "import...": "importer...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "inputliste:", + "input names:": "inputnavne:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "indsæt _ ved _ i _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "er _ ?", + "is _ a _ ?": "er _ et _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "genstand _ af _", + "items": "", + "j": "j", + "join _": "forbind _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "tast _ trykket ned?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Dansk", + "language_translator": "FAB, Pelle Hjek", + "large": "stor", + "last": "sidste", + "last changed": "", + "last_changed": "2016-11-16", + "launch _ _": "igangsæt _ _", + "left": "", + "left arrow": "pil venstre", + "length": "", + "length of _": "længde af _", + "length:": "længde:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "bogstav _ af _", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "liste", + "list _": "liste _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "Indlæs det officielle bibliotek med kraftfulde blokke", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "lav en blok...", + "make a category...": "", + "make a copy and pick it up": "lav en kopi og saml den op", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "", + "mosaic": "mosaik", + "motion": "", + "mouse down?": "mus nede?", + "mouse position": "", + "mouse x": "mus x", + "mouse y": "mus y", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "musemarkør", + "move": "flyt", + "move _ steps": "gå _ trin", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "migselv", + "n": "n", + "name": "", + "neg": "", + "negative": "negativ", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "ny...", + "next": "", + "next costume": "næste kostume", + "none": "ingen", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "ikke _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "tal", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "dupliker kun denne blok", + "only face left/right": "vend kun mod højre/venstre", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "åbn et nyt vindue med et billede af dette script", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "eller", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "mal en ny figur", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all": "sæt alt på pause", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "pensel ned", + "pen down?": "", + "pen trails": "penselspor", + "pen up": "pensel op", + "pen vectors": "", + "pic...": "", + "pick random _ to _": "vælg tilfældig _ til _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "pixeler", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "afspil node _ i _ slag", + "play sound _": "afspil lyd _", + "play sound _ at _ Hz": "", + "play sound _ until done": "afspil lyd _ indtil færdig", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "peg i retning _", + "point towards _": "peg mod _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "prädikat", + "presentation (1.4x)": "", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "tilfældig", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "nyt mærkat...", + "release": "", + "remove block variables...": "", + "rename": "skift navn", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "skift kostumenavn", + "rename only this reporter": "", + "rename sound": "skift lydens navn", + "rename...": "skift navn...", + "repeat _ _": "gentag _ gange _", + "repeat until _ _": "gentag indtil _ _", + "replace item _ of _ with _": "erstat genstand _ af _ med _", + "report _": "papporter _", + "reporter": "rapportør", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "nulstil ur", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "hvil i _ slag", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "pil højre", + "ring": "", + "ringify": "omring", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "afrund _", + "run _ _": "kør _ _", + "run _ w/continuation": "kør _ med fortsættelse", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "mætning", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "sig _", + "say _ for _ secs": "sig _ i _ sekunder", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "scriptbillede...", + "script variables _": "scriptvariable _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "vælg", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "sæt effekten _ til _", + "set _ of block _ to _": "", + "set _ to _": "sæt _ til _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "sæt penselfarven til _", + "set pen shade to _": "sæt penselskyggen til _", + "set pen size to _": "sæt penselstørrelsen til _", + "set size to _ %": "sæt størrelse til _ %", + "set tempo to _ bpm": "sæt tempoet til _ slag per minut", + "set this morph's alpha value": "", + "set turbo mode to _": "sæt turbotilstand til _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "sæt x til _", + "set y to _": "sæt y til _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "indstillingsmenu foretrækker tomme hylstre", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "vis", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "vis alle", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Vis globale tilpassede blokdefinitioner som XML i et nyt browser-vindue", + "show project data as XML in a new browser window": "Vis projekt som XML i et nyt browservindue", + "show table _": "", + "show the World's menu": "", + "show variable _": "vis variabel _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "størrelse", + "slider": "skydeknap", + "slider max...": "skydeknap maksimum...", + "slider min...": "skydeknap minimum...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "mellemrum", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "kvadratrod", + "square": "", + "stack size": "stakstørrelse", + "stage": "", + "stage image": "", + "stamp": "stempel", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all _": "stop alt _", + "stop all sounds": "stop alle lyde", + "stop block": "stop blok", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "skift til kostume _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "tekst", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "ting", + "think _": "tænk _", + "think _ for _ secs": "tænk _ i _ sekunder", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "dette projekt har ingen tilpassede globale blokke endnu", + "this script": "", + "time in milliseconds": "", + "timer": "ur", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "rører ved _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "fab@nielsen.mail.dk, hjek@mail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "sandt", + "turbo mode": "", + "turbo mode?": "turbotilstand?", + "turn _ _ degrees": "drej _ _ grader", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "type af _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "afmarker for sædvanlig brugerflade", + "uncheck for greater speed at variable frame rates": "afmarker for øget afspildningshastighed ved variabel billedfrekvens", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "afmarker for afrundede linjespidser", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "afmarker for at lade indsatte rapportører sparke andre ud", + "uncheck to allow script reentrance": "afmarker for at tillade scriptgenindgang", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "afmarker for at fjerne IDE-animationer", + "uncheck to disable alternating colors for nested block": "afmarker for ikke at vise skiftende farver for blokke inden i hinanden", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "afmarker for ikke at vise dynamiske mærkater til varierende input", + "uncheck to disable input sliders for entry fields": "afmarker for at fjerne skydeknapper i inputfelter", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "afmarker for at fjerne understøttelse af virtuelt tastetur til mobile enheder", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "afmarker for at afvikle scriptet i normal hastighed", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "afmarker for at slukke for blokkliklyd", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "afmarker for at bruge hårde skygger og fremhævelser", + "uncheck to use the input dialog in short form": "afmarker for at bruge inputsdialogen i kort form", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "unicode _ som bogstav", + "unicode of _": "unicode af _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "fjern omringning", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "unavngivet", + "unused": "", + "unused block(s) removed": "", + "up arrow": "pil op", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "vent i _ sekunder", + "wait until _": "Vent indtil _", + "wardrobe": "", + "warp _": "forskyd _", + "what's your name?": "hvad hedder du?", + "when I am _": "når jeg _", + "when I receive _ _": "når jeg modtager _ _", + "when I start as a clone": "når jeg starter som klon", + "when _": "", + "when _ clicked": "når _ klikkes", + "when _ is edited _": "", + "when _ key pressed _": "når _ trykkes _", + "whirl": "hvirvel", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "med input", + "word": "", + "world": "verden", + "write _ size _": "", + "x": "x", + "x position": "x-position", + "y": "y", + "y position": "y-position", + "year": "", + "year:": "", + "your own": "", + "z": "z" +} diff --git a/elements/pl-snap/Snap/locale/lang-el.js b/elements/pl-snap/Snap/locale/lang-el.js new file mode 100644 index 00000000..5c1a9d93 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-el.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.el = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) αριστερά", + "(0) up": "(0) πάνω", + "(1) sine": "", + "(180) down": "(180) κάτω", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) δεξιά", + "(empty)": "(άδειο)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Πληροφορίες για το Snap", + "About...": "Περί του Snap!…", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "Προσθήκη σκηνής...", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animations (διάφορες κινήσεις)", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Οτιδήποτε (δεν έχει αξιολογηθεί)", + "Any type": "Οποιουδήποτε τύπου", + "Apply": "Εφαρμογή", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Είστε σίγουροι ότι θέλετε να γίνει διαγραφή?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Πίσω...", + "Backgrounds": "Yπόβαθρα", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Επεξεργαστής του μπλοκ", + "Blocks": "", + "Blocks category name:": "Όνομα κατηγορίας μπλοκ:", + "Blurred shadows": "Θολές σκιές", + "Boolean": "", + "Boolean (T/F)": "Boolean Σωστό/Λάθος (Σ/Λ)", + "Boolean (unevaluated)": "Boolean(σωστό/λάθος) (δεν έχει αξιολογηθεί)", + "Bottom": "Κάτω", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Μέγεθος πινέλου", + "Cache Inputs": "", + "Camera": "Κάμερα", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Ακύρωση", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "Χρώμα κατηγορίας", + "Change Password": "", + "Change Password...": "Αλλαγή Συνθηματικού...", + "Change block": "Αλλαγή του μπλοκ", + "Clear backup": "", + "Clicking sound": "Ήχος του κλικ", + "Closed brush (free draw)": "Πινέλο (ελεύθερη σχεδίαση)", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Εντολή", + "Command (C-shape)": "Εντολή (C-μορφή)", + "Command (inline)": "Εντολή (στη σειρά)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Ενεργοποίηση περιορισμού σχημάτων (εναλλακτικά πατώντας shift)", + "Contents": "", + "Contributors": "Συντελεστές", + "Control": "Έλεγχος", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Επεξεργαστής κουστουμιών", + "Costumes": "Κοστούμια", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Δημιουργία ονόματος τιμής", + "Create variables": "", + "Create variables in program": "Δημιουργία μεταβλητών σε πρόγραμμα", + "Credits...": "Συντελεστές...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Προεπιλογή", + "Default Value:": "Προεπιλογή:", + "Delete": "Διαγραφή", + "Delete Custom Block": "Διαγραφή προσαρμοσμένου μπλοκ", + "Delete Project": "Διαγραφή Εργασίας", + "Delete a variable": "Κάτάργηση μιας μεταβλητής", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "προς τα κάτω", + "Download source": "Κατέβασε των πηγαίο κώδικα", + "Dragging threshold...": "", + "Dynamic input labels": "Ετικέτες για τις δυναμικές τιμές", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Επεξεργασία ονόματος τιμής", + "Edit label fragment": "Επεξεργασία κομματιού της ετικέτας", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Έλλειψη (Shift: κύκλος)", + "Empty": "Άδειο", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Σβήστρα", + "Error": "", + "Examples": "Παραδείγματα", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Εξαγωγή των μπλοκ", + "Export blocks...": "Εξαγωγή των μπλοκ...", + "Export project as plain text...": "Εξαγωγη της εργασίας ως σκέτο κείμενο...", + "Export project...": "Εξαγωγή εργασίας...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Ξεθώριασμα μπλοκ", + "Fade blocks...": "Ξεθώριασμα μπλοκ...", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "Γέμισε μια περιοχή", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "Γεμάτη Έλλειψη (Shift: κύκλος)", + "Filled Rectangle (shift: square)": "Γεμάτο Ορθογώνιο (Shift: τετράγωνο)", + "First-Class Sprites": "", + "Flat design": "Επίπεδη σχεδίαση", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "Χρωματικό μοντέλο στυλού HSL", + "Header mapping": "", + "Hello!": "Γεια!", + "Hello, World!": "", + "Help": "Βοήθεια", + "Hide blocks in palette": "Απόκρυψη μπλοκ στην παλέτα", + "Hide blocks...": "Απόκρυψη μπλοκ...", + "Hmm...": "Μμμ...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Εισαγωγή των μπλοκ", + "Import library": "Εισαγωγή βιβλιοθήκης", + "Import sound": "", + "Import tools": "Εισαγωγή εργαλείων", + "Import...": "Εισαγωγή...", + "Imported": "Εισάχθηκε", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "Ονόματα τιμών:", + "Input Slot Options": "", + "Input name": "Όνομα τιμής", + "Input sliders": "Ρυθμιστής τιμής", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "Επεκτάσεις JavaScript", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript συνάρτηση( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Γλώσσα...", + "Libraries...": "Βιβλιοθήκες...", + "License": "Άδεια", + "License...": "Άδιεα...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Ευθεία γραμμή (Shift: περιορισμός σε 45°)", + "Line tool (shift: vertical/horizontal)": "Ευθεία γραμμή (Shift: κάθετη/οριζόντια)", + "List": "Λίστα", + "List utilities": "", + "Lists": "Λίστες", + "Live coding support": "", + "Loading": "Φόρτωση", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Σύνδεση...", + "Logout": "", + "Long form input dialog": "Χρησιμοποιήστε το παράθυρο της εκτεταμένης τιμής", + "Looks": "Εμφάνιση", + "Make a block": "Δημιούργησε ένα μπλοκ", + "Make a variable": "Δημιούργησε μία μεταβλητή", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "όνομα μηνύματος", + "Method Editor": "Επεξεργαστής Μεθόδου", + "Microphone": "Μικρόφωνο", + "Microphone resolution...": "Ανάλυση μικροφώνου...", + "Modules...": "Ενότητες...", + "Motion": "Κίνηση", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Πολλές τιμές (η αξία είναι η λίστα με τις τιμές)", + "Nested auto-wrapping": "", + "New": "Νέο", + "New Category": "Νέα κατηγορία", + "New Project": "Νέα Εργασία", + "New category...": "Νέα κατηγορία...", + "New password:": "", + "New scene": "Νέα σκηνή", + "No": "Όχι", + "November": "", + "Number": "Νούμερο", + "OK": "", + "Object": "Αντικείμενο", + "October": "", + "Ok": "Oκ", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Άνοιγμα Εργασίας", + "Open in Community Site": "Άνοιγμα στην Ιστοσελίδα Κοινότητας", + "Open...": "Άνοιγμα...", + "Opening project...": "", + "Operators": "Τελεστές", + "Other": "Άλλο", + "Output text using speech synthesis.": "", + "Paint Editor": "Επεξεργαστής ζωγραφικής", + "Paint a new costume": "Σχεδίαση νέου κοστουμιού", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "Ζωγράφισε ένα σχήμα (Shift: δευτερεύων χρώμα)", + "Paintbrush tool (free draw)": "Πινέλο (ελεύθερη σχεδίαση)", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Στυλό", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Επιλογή χρώματος (διάλεξε ένα χρώμα από όπουδήποτε)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Εργαλείο επιλογής χρώματος (διάλεξε ένα χρώμα από οπουδήποτε shift: δευτερεύων χρώμα)", + "Pixels": "", + "Plain prototype labels": "", + "Play": "Παίξημο", + "Play sound": "Παίξημο ήχου", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Κατηγόρημα", + "Prefer empty slot drops": "Ευνοούν την προσκόλληση σε κενές θέσεις", + "Prefer smooth animations": "Ευνοεί ομαλά animations", + "Primary color Secondary color": "Πρωτεύων χρώμα Δευτερεύων χρώμα", + "Privacy...": "", + "Project Notes": "Σχόλια Εργασίας", + "Project URLs": "", + "Project notes...": "Σημειώσης πάνω στην εργασία...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "Δημοσίευση", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Ηχογράφιση νέου ήχου", + "Recover": "Αποκατάσταση", + "Rectangle (shift: square)": "Ορθογώνιο (Shift: τετράγωνο)", + "Reference manual": "Εγχειρίδιο αναφοράς", + "Remove a category...": "Διαγραφή κατηγορίας...", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Θέλετε να αντικαταστήσετε την τρέχουσα εργασία με μία καινούρια?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Αναφορέας", + "Request blocked": "", + "Resend Verification Email...": "Επαναποστολή Email Επιβεβαίωσης...", + "Resend verification email": "", + "Reset Password...": "Επαναφορά Συνθηματικού...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Αποθήκευση", + "Save As...": "Αποθήκευση Ως...", + "Save Project": "Αποθήκευση Εργασίας", + "Save Project As...": "Αποθήκευση Εργασίας Ως...", + "Save to disk": "Αποθήκευση στο δίσκο", + "Saved!": "Αποθηκεύτηκε!", + "Saving project to the cloud...": "", + "Scenes...": "Σκηνές...", + "Script variable name": "Όνομα μεταβλητής του σεναρίου", + "Scripts": "Σενάρια", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "Εργαλείο επιλογής", + "Sensing": "Αισθητήρες", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "Θέσε το κέντρο περιστροφής", + "Share": "Κοινοποίηση", + "Share Project": "", + "Show buttons": "Εμφάνιση κουμιών", + "Show categories": "Εμφάνιση κατηγοριών", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Εγγραφή...", + "Single input.": "Μία τιμή.", + "Single palette": "Μονή παλέτα", + "Slider maximum value": "Μέγιστη τιμή του ρυθμιστή", + "Slider minimum value": "Ελάχιστη τιμή του ρυθμιστή", + "Snap! website": "Snap! Ιστοσελίδα", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Ήχος", + "Sound Recorder": "", + "Sounds": "Ήχοι", + "Sprite": "Φιγούρα", + "Sprite Nesting": "", + "Stage": "Σκηνή", + "Stage height": "Ύψος σκηνής", + "Stage selected: no motion primitives": "Επιλεγμένο Σταδιο: χωρίς αρχέτυπο κίνησης", + "Stage size": "Μέγεθος σκηνής", + "Stage size...": "Μέγεθος σκηνής...", + "Stage width": "Πλάτος σκηνής", + "Stop": "Διακοπή", + "Stop sound": "Διακοπή ήχου", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Έλλειψη (Shift: κύκλος)", + "Stroked Rectangle (shift: square)": "Ορθογώνιο (Shift: τετράγωνο)", + "Switch back to user mode": "Επιστροφη στην λειτουργία του χρήστη", + "Switch to dev mode": "Εναλλαγή σε λειτουργία ανάπτυξη", + "Switch to vector editor?": "", + "Table lines": "Γραμμές πίνακα", + "Table support": "Υποστήριξη πίνακα", + "Table view": "Προβολή πίνακα", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Κείμενο", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Κείμενο σε ομιλία", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Thread safe κώδικας", + "Title text": "Τίτλος κειμένου", + "Today": "Σήμερα", + "Today,": "", + "Top": "Πάνω", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Μεταφράσεις", + "Translators...": "Μεταφραστές...", + "Turbo mode": "Λειτουργία Τούρμπο", + "Turtle": "Χελώνα", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Κατάργηση κοινοποίησης", + "Unshare Project": "", + "Untitled": "Χωρίς Τίτλο", + "Unused blocks...": "Αχρησιμοποίητα μπλοκ...", + "Unverified account:": "", + "Up": "προς τα πάνω", + "Updating project list...": "Ενημέρωση λίστας έργων...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Κανε την παράμετρο ορατή προς τα έξω", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Όνομα μεταβλητής", + "Variables": "Μεταβλητές", + "Variadic reporters": "Ποίκιλα reporter", + "Vector": "Διανυσματική Σχεδίαση", + "Vector Paint Editor": "Επεξεργαστής Διανυσματικών γραφικών", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Εικονικό Πληκτρολόγιο", + "Visible stepping": "Ορατός βηματισμός", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "Λέξεις, φράσεις", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Ναι", + "Yesterday": "Χτές", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Χρωματισμός ζέβρα", + "Zoom blocks": "μεγένθυση των μπλοκ", + "Zoom blocks...": "Μεγέθυνση των μπλοκ…", + "_ at _": "_ στο _", + "_ combine _ using _": "_ συνδύασε το _ χρησιμοποιόντας _", + "_ contains _": "_ περιέχει το _", + "_ effect": "_ εφέ", + "_ find first item _ in _": "_ βρές το πρώτο στοχείo _ στο _", + "_ in front of _": "_ μπροστά από το _", + "_ keep items _ from _": "_ κρατήσε στοιχεία _ από το _", + "_ map _ over _": "_ χαρτογράφηση _ επάνω στο _", + "_ mod _": "το υπόλοιπο του _ διαίρεμενο από _", + "_ of _": "_ του _", + "_ of block _": "_ του μπλοκ _", + "_ of costume _": "_ του κοστουμιού _", + "_ of sound _": "_ του ήχου _", + "_ of text _": "", + "_ to _": "_ από _", + "__shout__go__": "", + "a": "α", + "a custom block definition is missing": "", + "a new clone of _": "ένας νέος κλώνος του _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "απόλυτη τιμή", + "acos": "τόξο συνημιτόνου", + "add _ to _": "πρόσθεσε το _ στο _", + "add a new Turtle sprite": "πρόσθεσε μια καινούρα φιγούρα χελώνα", + "add a new sprite": "προσθέστε μια νέα φιγούρα", + "add comment": "δημιουργία σχόλιου", + "add comment here...": "πρόσθεσε κάποιο σχόλιο εδώ...", + "agent": "", + "alert _": "ειδοποίηση: _", + "all": "όλα", + "all <": "όλα <", + "all =": "όλα =", + "all >": "όλα >", + "all but first of _": "όλα εκτός από το πρώτο του _", + "all but this script": "τα πάντα εκτός από αυτό το σενάριο", + "all identical": "όλα παρόμια", + "all scenes": "όλες τις σκηνές", + "all ≤": "όλα ≤", + "all ≥": "όλα ≥", + "alpha value:": "", + "anchor": "άγκυρα", + "and": "και", + "and send": "και στείλε", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "απάντηση", + "any": "οποιοδήποτε", + "any key": "οποιοδήποτε πλήκτρο", + "any message": "οποιοδήποτε μήνυμα", + "anything": "οτιδηποτε", + "append _": "προσάρτηση _", + "arrange scripts vertically": "οργάνωση ου κώδικα κάθετα", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "τόξο ημιτόνου", + "ask _ and wait": "ρώτα _ και περίμενε", + "ask _ for _ _": "ρώτα το _ για _ _", + "atan": "τόξο εφαπτομένης", + "attach...": "", + "b": "β", + "back": "πίσω", + "balance": "ισορροπία", + "big (2x)": "μεγάλο (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "μπλοκ", + "block deletion dialog text": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτο το μπλολ Και όλων των εμφανίσεών του?", + "block variables": "", + "block variables...": "μεταβλητές μπλοκ...", + "block-solid (0)": "συμπαγές-εντολή (0)", + "blockify": "ως εντολή", + "blocks": "μπλοκ", + "blue": "μπλε", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "κάτω", + "box": "", + "brightness": "φωτεινότητα", + "broadcast _ _": "στείλε το _ _", + "broadcast _ _ and wait": "στείλε το _ _ και περίμενε", + "brush": "", + "build": "κατασκευή", + "but getting a": "", + "c": "ψ", + "call _ _": "κάλεσε _ επάνω σε _", + "call _ w/continuation": "κάλεσε _ με συνέχεια", + "caller": "καλούντος", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "με δυνατότητα περιστροφής", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "κατηγορίες", + "category": "κατηγορία", + "ceiling": "", + "center": "κέντρο", + "center x": "κέντρο x", + "center y": "κέντρο y", + "change _ by _": "άλλαξε το _ κατά _", + "change _ effect by _": "άλλαξε το εφέ _ κατά _", + "change background _ by _": "άλλαξε υπόβαθρο _ κατά _", + "change balance by _": "άλλαξε την ισορροπία κατά _", + "change pen _ by _": "άλλαξε _ του στυλού κατά _", + "change pen color by _": "", + "change pen shade by _": "άλλαξε την σκιά του στυλού κατά _", + "change pen size by _": "άλλαξε το μέγεθος του στυλού κατά _", + "change size by _": "άλλαξε το μέγεθος κατά _", + "change tempo by _": "άλλαξε την ταχύτητα του ρυθμού κατά _", + "change volume by _": "άλλαξε την ένταση κατά _", + "change x by _": "άλλαξε το x κατά _", + "change y by _": "άλλαξε το y κατά _", + "check for alternative GUI design": "ενεργοποιήστε για εναλακτική σχεδίαση GUI", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "ενεργοποιήστε για ομαλά, προβλέψημα animations στους υπολογιστές", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "ενεργοποιήστε για να εμφανίζετε πάντα ο τύπος τον κενών για τις τιμές", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "ενεργοποιήστε για να μην επιτρέπετε η επανεισδοχή στον κώδικα", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "ενεργοποιήστε για να εχετε IDE animations", + "check to enable alternating colors for nested blocks": "ενεργοποιήστε για να εμφανίσετε εναλασσόμενα χρώματα για τα ένθετα μπλοκ", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "ενεργοποιήστε για να εμφανίσετε τις δυναμικες ετικέτες για μεταβλητές τιμές", + "check to enable input sliders for entry fields": "ενεργοποιήστε για να έχετε ρυθμιστές τιμών για τα πεδία εισαγωγής", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "ενεργοποιήστε για να έχετε το εικονοκό πληκτρολόγιο στο κινητό σας", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "επιλογή για κληρονόμηση aπό", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "ενεργοποιήστε για να βάλετε σε προτεραιότητα την εκτέλεση του κώδικα", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "ενεργοποιήστε για να εμφανίσετε όλα τα μπλοκ σε μονή παλέτα", + "check to show buttons in the palette": "ενεργοποιήστε για να εμφανίσετε τα κουμιά στην παλέτα", + "check to show category names in the palette": "ενεργοποιήστε για να εμφανίσετε τα ονόματα κατηγοριών στην παλέτα", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "ενεργοποιήστε για να έχετε τον ήχο του κλικ", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "ενεργοποιήστε για να εμφανίσετε την σκίαση και τα θολά σήματα", + "children": "παιδιά", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "καθαρισμός", + "clear": "καθαρισμός", + "clear graphic effects": "καθάρισε τα γραφικά εφέ", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Κάντε κλικ ή ρύρετε το στόχαστρο για να μετακινήσετε το άξονα περιστροφής", + "clicked": "να μου κάνουν κλικ", + "clone": "κλωνοποίηση", + "clones": "κλώνοι", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "χρώμα", + "color _ is touching _ ?": "χρώμα _ ακουμπάει _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "στείλες", + "combinations _": "συνδιασμοί _", + "combine _ using _": "συνδύασε το _ χρησιμοποιόντας _", + "comic": "", + "command": "εντολή", + "comment pic...": "εικόνα σχόλιου...", + "compile": "μεταγλώτηση", + "compile _": "μεταγλώττισε _", + "compile _ for _ args": "", + "confetti": "", + "console log _": "γράψτε στην κονσόλα: _", + "continuation": "συνέχια", + "continuations cannot be forked": "", + "cos": "συνημίτονο", + "costume": "κοστούμι", + "costume #": "κοστούμι #", + "costume name": "όνομα κοστουμιού", + "costumes": "κοστούμια", + "costumes tab help": "εισαγωγή εικόνας από τον υπολογιστή σας ή μια ιστοσελίδασέρνοντας την εικόνα στην περιοχή των κοστουμιών", + "could not connect to:": "", + "cr": "", + "create a clone of _": "δημιούργησε έναν κλώνο του _", + "cross": "", + "crosshairs": "", + "current": "τρέχον", + "current _": "τρέχων _", + "current module versions:": "Τρέχουσα έκδοση των ενοτήτων", + "current parent": "", + "custom?": "προσαρμοσμένο?", + "cut from _": "αποκοπή από το _", + "d": "δ", + "dangling?": "κουνιέμαι?", + "data": "δεδομένα", + "date": "ημερομηνία", + "day of week": "ημέρα της εβδομάδας", + "days left": "", + "days left.": "", + "defaults": "προεπιλογές", + "define _ _ _": "ορισμός _ _ _", + "definition": "ορισμός", + "delete": "διαγραφή", + "delete _": "", + "delete _ of _": "κατάργησε το _ του _", + "delete a category...": "διαγραφή μιας κατηγορίας...", + "delete block _": "διαγραφή μπλοκ _", + "delete block definition...": "διαγραφή του προσαρμοσμένου μπλοκ", + "delete slot": "διαγραφή θέσης", + "delete this clone": "κατάργησε αυτόν τον κλόνο", + "delete variable": "διαγραφή μεταβλητής", + "delimiter": "", + "demo (1.2x)": "επίδειξη (1.2x)", + "demo...": "", + "detach all parts": "αποσύνδεση όλων των κομματιών", + "detach and put into the hand": "", + "detach from": "αποσύνδεση από", + "development mode": "λειτουργία ανάπτυξης", + "development mode debugging primitives:": "λειτουργία ανάπτυξης αρχέτυπα debugging", + "development mode...": "", + "dimensions": "διαστάσεις", + "direction": "κατεύθυνση", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "απόσταση", + "distance to _": "", + "distribution": "", + "don't rotate": "χωρίς δυνατότητα περιστροφής", + "down arrow": "κάτω βέλος", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "συρόμενο", + "draggable?": "συρόμενο?", + "dragging threshold": "", + "dropped": "να με αφήνουν", + "duplicate": "διπλασίαση", + "duplicate block definition...": "διπλασιασμός του προσαρμοσμένου μπλοκ", + "duration": "διάρκεια", + "e": "ε", + "e^": "e^", + "edge": "άκρη", + "edit": "επεξεργασία", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "επεξεργασία...", + "editables": "επεξεργάσιμα", + "elegant (90)": "κομψό (90)", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "εξαγωγή", + "export block definition...": "εξαγωγή του προσαρμοσμένου μπλοκ", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "εξαγωγή...", + "extract": "εξαγωγή", + "f": "φ", + "false": "λάθος", + "file": "", + "file menu import hint": "μπορείτε να φορτώσετε ένα αρχείο από το browser σας στον κατάλογο του ήχου η τωνκοστουμιών που", + "fill": "γέμισμα", + "fill page...": "", + "filtered for _": "φίλτραρε για _", + "find blocks": "εύρεση μπλοκ", + "find blocks...": "", + "find first item _ in _": "βρές το πρώτο στοχείo _ στο _", + "find unused global custom blocks and remove their definitions": "βρείτε αχρησιμοποίητα καθολικά μπλοκ και αφαίρεσε τους ορισμούς τους", + "fisheye": "μάτι ψαριού", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "ισοπέδωση", + "flip ↔": "εναλλαγή ↔", + "flip ↕": "εναλλαγή ↕", + "floor": "σε μορφή ακέραιου αριθμού", + "footprints": "", + "for _ = _ to _ _": "για _ = _ ως _ _", + "for all sprites": "για όλα τα sprite", + "for each _ in _ _": "για κάθε _ στο _ _", + "for this sprite only": "μόνο για αυτό το sprite", + "forever _": "για πάντα _", + "frame": "", + "frames": "κάδρα", + "frequencies": "", + "frequency": "συχνόντητα", + "front": "μπροστά", + "fullScreen": "", + "g": "γ", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "φάντασμα", + "giant (8x)": "γιγαντιαίο (8x)", + "glide _ secs to x: _ y: _": "γλίστρα _ δευτ. μέχρι το x: _ y: _", + "global?": "καθολικό?", + "globe": "", + "go back _ layers": "πήγαινε πίσω _ στρώματα", + "go to _": "πήγαινε στο _", + "go to _ layer": "πήγαινε _", + "go to front": "πήγαινε μπροστά", + "go to x: _ y: _": "πήγαινε στο x: _ y: _", + "gray scale palette": "", + "green": "πράσινο", + "grow": "μεγάλωσε", + "h": "η", + "handle": "", + "header": "", + "header mapping...": "", + "height": "ύψος", + "hello": "γεια", + "help": "Βοήθεια", + "help...": "βοήθεια...", + "hide": "κρύψου", + "hide all...": "", + "hide blocks...": "απόκρυψη μπλοκ...", + "hide primitives": "Απόκρυψη αρχέτυπων", + "hide variable _": "κρύψε το _", + "high": "υψηλό", + "hour": "ώρα", + "http:// _": "", + "hue": "απόχρωση", + "huge (4x)": "πολύ μεγάλο (4x)", + "i": "ι", + "identical to": "παρόμοιο με το", + "if _ _": "αν _ _", + "if _ _ else _": "αν _ _ αλλιώς _", + "if _ then _ else _": "αν _ τότε _ αλλιώς _", + "if on edge, bounce": "αν είσαι σε άκρο, πήδα", + "import a sound from your computer by dragging it into here": "εισαγωγή ήχου από τον υπολογιστή σας σέρνοντας το αρχείο του ήχου εδώ", + "import without attempting to parse or format data": "", + "import...": "εισαγωγή...", + "in palette": "στην παλέτα", + "including dependencies": "", + "index": "εύρος", + "index of _ in _": "εύρεση του _ σε _", + "inherit _": "Κληρονόμησε _", + "inherited": "κληρονομημένο", + "input list:": "λίστα τιμών:", + "input names:": "ονόματα τιμών:", + "input(s), but getting": "", + "inputs": "εισόδους", + "insert _ at _ of _": "εισήγαγε το _ στο _ του _", + "insert a slot": "εισαγωγή μιας θέσης", + "insert a variable": "εισαγωγή μιας θέσης", + "inspect...": "", + "is _ ?": "είναι το _ ?", + "is _ a _ ?": "είναι το _ καποιο _ ;", + "is _ empty?": "είναι το _ κενό?", + "is _ identical to _ ?": "είναι το _ παρόμοιο με το _ ?", + "is _ on?": "είναι το _ ενεργό;", + "is not a valid option": "", + "is read-only": "", + "item": "στοιχείο", + "item _ of _": "στοιχείο _ του _", + "items": "αντικείμενα", + "j": "ξ", + "join _": "συνένωσε _", + "jukebox": "", + "k": "κ", + "keep all submorphs within and visible": "", + "keep items _ from _": "κρατήσε στοιχεία _ από το _", + "key": "", + "key _ pressed?": "είναι το πλήκτρο _ πατημένο;", + "keyboard": "", + "keyboardFilled": "", + "l": "λ", + "label": "ετικέτα", + "language_name": "Ελληνικά", + "language_translator": "Ino Samaras, Alexandros Prekates, HM100", + "large": "μεγάλο", + "last": "τελευταίο", + "last changed": "", + "last_changed": "2023-04-15", + "launch _ _": "ξεκίνα _ επάνω σε _", + "left": "αριστερά", + "left arrow": "αριστερό βέλος", + "length": "μήκος", + "length of _": "μήκος του _", + "length:": "μήκος:", + "let the World automatically adjust to browser resizing": "", + "letter": "γράμμα", + "letter _ of _": "γράμμα _ του _", + "light (70)": "απαλό (70)", + "lightness": "", + "line": "γραμμή", + "lines": "γραμμές", + "list": "λίστα", + "list _": "λίστα _", + "list view...": "προβολή λίστας...", + "ln": "ln", + "load the official library of powerful blocks": "Φόρτωση της επίσημης βιβλιοθήκης των δυναμικών μπλοκ", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "χαμηλό", + "lower case": "", + "m": "μ", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "δημιουργία ενός μπλοκ...", + "make a category...": "δημιουργία μιας κατηγορίας...", + "make a copy and pick it up": "δημιουργία αντίγραφου και κράτηση του", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "χαρτογράφηση _ επάνω στο _", + "map _ to _ _": "", + "max": "μέγιστο", + "maximum": "μέγιστο", + "medium (50)": "μέτριο (50)", + "menus": "μενού", + "message": "μήνυμα", + "microphone _": "μικρόφωνο _", + "middle": "", + "minimum": "ελάχιστο", + "minute": "λεπτά", + "mirror video": "κατοπτρισμός βίντεο", + "missing / unspecified extension": "", + "monstrous (10x)": "τεράστιο (10x)", + "month": "μήνας", + "mosaic": "μωσαϊκό", + "motion": "κίνηση", + "mouse down?": "είναι το ποντικι κάτω;", + "mouse position": "θέση ποντικιού", + "mouse x": "ποντίκι x-θέση", + "mouse y": "ποντίκι y-θέση", + "mouse-departed": "να εξέρχεται ο δείκτης του ποντικίου", + "mouse-entered": "να εισέρχεται ο δείκτης του ποντικίου", + "mouse-pointer": "δείκτης-ποντικιού", + "move": "", + "move _ steps": "κάνε _ βήματα", + "move all inside...": "", + "move...": "", + "my": "δικό μου", + "my _": "το δικό μου _", + "my anchor": "δικό μου άγκυρά", + "my dangling?": "δικό μου κουνιέμαι;", + "my draggable?": "δικό μου συρόμενο;", + "my name": "δικό μου ονομά", + "my parent": "δικό μου γονέας", + "my rotation style": "δικό μου στύλ περιστροφής", + "my rotation x": "δικό μου x-περιστροφή", + "my rotation y": "δικό μου y περιστροφή", + "my temporary?": "δικό μου προσωρινός;", + "myself": "ο εαυτός μου", + "n": "ν", + "name": "όνομα", + "neg": "", + "negative": "αρνητικό", + "neighbors": "κοντινοί", + "neighbors ≠": "γειτόνοι ≠", + "new costume _ width _ height _": "νέο κοστούμι _ πλάτος _ ύψος _", + "new line": "νέα γραμμή", + "new sound _ rate _ Hz": "νέος ήχος _ ταχύτητα _ Hz", + "new...": "νέο...", + "next": "επόμενη", + "next costume": "επόμενο κοστούμι", + "none": "τίποτα", + "normal": "κανονικό", + "normal (1x)": "κανονικό (1x)", + "normalScreen": "", + "normalStage": "", + "not": "όχι", + "not _": "όχι το _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "νούμερο", + "number of channels": "αριθμός καναλιών", + "numbers from _ to _": "νούμερα από το _ εως το _", + "o": "ο", + "object _": "αντικείμενο _", + "octagon": "", + "only duplicate this block": "διπλασίαση μόνο αυτού του μπλοκ", + "only face left/right": "με κατεύθυνση μόνο αριστερά/δεξιά", + "only grab this block": "αρπαγή μόνο αυτού του μπλοκ", + "open a new window with a picture of all scripts": "άνοιγμα νέου παραθύρου με μια εικόνα όλου του κώδικα", + "open a new window with a picture of the stage": "άνοιγμα νέου παραθύρου με την εικόνα της σκηνής", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "άνοιγμα νέου παραθύρου με την εικόνα αυτού του κώδικα", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "άνοιγμα σε παράθηρο διαλόγου...", + "open shared project from cloud...": "", + "options...": "", + "or": "ή", + "or before": "", + "other clones": "άλλοι κλώνοι", + "other scripts in sprite": "τα υπόλοιπα σενάρια της φιγούρας", + "other sprites": "άλλες φυγούρες", + "p": "π", + "paint a new sprite": "ζωγράφισε μια καινούργια φιγούρα", + "paintbucket": "", + "parameters": "", + "parent": "γονέας", + "parent...": "", + "parts": "μέρη", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "επικόλληση στο _", + "pause": "", + "pause all _": "κάνε παύση σε όλα _", + "pen": "", + "pen _": "στυλό _", + "pen down": "στυλό κάτω", + "pen down?": "στυλό κάτω;", + "pen trails": "ίχνοι στυλού", + "pen up": "στυλό πάνω", + "pen vectors": "", + "pic...": "εικόνα...", + "pick random _ to _": "δίαλεξε στην τύχη μεταξύ του _ και του _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "εικονοστοιχειοποίηση", + "pixels": "πίξελ", + "play _ Hz for _ secs": "παίξε _ Hz για _ δευτ.", + "play frequency _ Hz": "παίξε συχνότητα _ Hz", + "play note _ for _ beats": "παίξε την νότα _ για _ ρυθμούς", + "play sound _": "παίξε τον ήχο _", + "play sound _ at _ Hz": "παίξε τον ήχο _ στα _ Hz", + "play sound _ until done": "παίξε τον ήχο _ μέχρι να τελειώσει", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "κοίτα προς την κατεύθυνση _", + "point towards _": "κοίτα προς _", + "pointRight": "", + "polygon": "", + "position": "θέση", + "poster": "", + "predicate": "κατηγορούμενο", + "presentation (1.4x)": "παρουσίαση (1.4x)", + "pressed": "να με πατάνε", + "previous": "προηγούμενη", + "processes": "", + "product": "γινόμενο", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "ρ", + "r-g-b-a": "", + "random": "τυχαία", + "random position": "τυχαία θέση", + "rank": "κατάταξη", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "κόκκινο", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "μετονόμαση...", + "release": "απελευθέρωση", + "remove block variables...": "", + "rename": "μετονόμαση", + "rename all blocks that access this variable": "μετονομασιά όλων των μπλοκ, που έχουν πρόσβαση σε αυτήν την μεταβλητή", + "rename all...": "μετονομασία όλων...", + "rename background": "", + "rename costume": "μετονόμαση κοστουμιού", + "rename only this reporter": "μετονομασία μόνο αυτής της ρεπόρτερ", + "rename sound": "μετονόμαση ήχου", + "rename...": "μετονόμαση...", + "repeat _ _": "επανέλαβε _ _", + "repeat until _ _": "επανέλαβε μέχρι _ _", + "replace item _ of _ with _": "αντικατέστησε το στοιχείο _ του _ με _", + "report _": "δήλωσε _", + "reporter": "αναφορέας", + "reporter didn't report": "", + "reset columns": "επαναφορά στήλων", + "reset timer": "επανέφερε το χρονόμετρο", + "reshape _ to _": "ανασχημάτιση του _ σε _", + "resize...": "", + "resolution": "ανάλυση", + "rest for _ beats": "κάνε παύση για _ ρυθμούς", + "restore display": "", + "result pic...": "εικόνα του αποτελεσμάτος...", + "reverse": "αναστροφή", + "right": "δεξιά", + "right arrow": "δεξί βέλος", + "ring": "", + "ringify": "εισαγωγή σε δαχτυλίδι", + "robot": "", + "rotate": "", + "rotation style": "στυλ περιστροφής", + "rotation x": "περιστροφή x", + "rotation y": "περιστροφή y", + "round _": "_ στρογγυλοποιημένο", + "run _ _": "εκτέλεσε _ επάνω σε _", + "run _ w/continuation": "εκτέλεσε _ με συνέχεια", + "s": "σ", + "sample morphs": "", + "sample rate": "ταχύτητα δείγματος", + "samples": "δείγματα", + "saturation": "κορεσμός", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "αππθήκευση εικόνας αυτού του σχόλιου", + "save a picture of this script": "αποθήκευση εικόνας αυτού του κώδικα", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "πες _", + "say _ for _ secs": "πες _ για _ δευτ.", + "scope": "έκταση", + "screenshot": "", + "screenshot...": "", + "script": "σενάριο", + "script pic with result...": "", + "script pic...": "εικόνα του κώδικα...", + "script variables _": "μεταβλητές του σεναρίου _", + "scripts": "σενάρια", + "scripts pic...": "εικόνα του κώδικα...", + "scroll frame": "", + "scrolled-down": "κύλιση-κάτω", + "scrolled-up": "κύλιση-πάνω", + "second": "δευτερόλεπτα", + "select": "επιλογή", + "selection": "", + "self": "εαυτός μου", + "send _ to _": "αποστολή του _ στο _", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "θέσε το εφέ _ να είναι _", + "set _ of block _ to _": "θέσε _ της εντολής _ σε _", + "set _ to _": "θέσε το _ να είναι _", + "set background _ to _": "θέσε υπόβαθρο _ να είναι _", + "set background color to _": "θέσε το χρώμα του υπόβαθρου να έιναι _", + "set balance to _": "θέσε την ισορροπία να είναι _", + "set instrument to _": "θέσε το όργανο σε _", + "set pen _ to _": "θέσε _ του στυλού να είναι _", + "set pen color to _": "θέσε το χρώμα του στυλού να είναι _", + "set pen shade to _": "θέσε την σκιά του στυλού να είναι _", + "set pen size to _": "θέσε το μέγεθος του στυλού να είναι _", + "set size to _ %": "θέσε το μέγεθος να είναι _ %", + "set tempo to _ bpm": "θέσε την ταχύτητα του ρυθμού να είναι _ ρυθμούς το δευτ.", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "θέσε την διαφάνια βίντεο να είναι _", + "set volume to _ %": "θέσε την ένταση να είναι _ %", + "set x to _": "θέσε το x να είναι _", + "set y to _": "θέσε το y να είναι _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "διευκολύνουν την εισαγωγλη σε κενές υποδοχές όταν σύρετε και αφήσετε τον ρεπόρτερ", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "λαμπερό (80)", + "show": "εμφανίσου", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "εμφάνιση όλων", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Εμφάνιση παγκοσμίων προσαρμοσμένων ορισμών των μπλοκ ως XML σε καινούριοπαράθυρο του browser", + "show primitives": "Εμφάνιση αρχέτυπων", + "show project data as XML in a new browser window": "εμφάνιση δεδομένων εργασίας ως XML σε καινούριο παράθυρο του browser", + "show table _": "", + "show the World's menu": "", + "show variable _": "εμφάνισε το _", + "shown?": "εμφανής;", + "shrink": "μίκρυνε", + "shuffled": "", + "signals": "", + "sin": "ημίτονο", + "size": "μέγεθος", + "slider": "Ρυθμιστής", + "slider max...": "μέγιστη αξία...", + "slider min...": "ελάχιστη αξία...", + "slots": "θέσεις", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "ήχοι", + "space": "κενό", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "χώρισε _ ως προς το _", + "sprite": "φιγούρα", + "sprites": "φιγούρες", + "sqrt": "ρίζα", + "square": "", + "stack size": "μέγεθος στοίβας", + "stage": "σκηνή", + "stage image": "", + "stamp": "σφραγίδα", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "σταμάτα _", + "stop all sounds": "σταμάτα όλους τους ήχους", + "stop frequency": "σταμάτα την συχνότητα", + "stopped": "σταματημένο", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "αποθήκευση αυτό το έργοnστον φάκελό λήψεων (στους πλοηγούς που το υποστηρίζουν", + "stretch _ x: _ y: _ %": "τέντωμα _ x: _ y: _ %", + "string": "", + "subtle (95)": "διακριτικό (95)", + "sum": "άθροισμα", + "svg...": "", + "switch to costume _": "άλλαξε το κοστούμι σε _", + "switch to scene _ _": "αλλαγή στην σκηνή _ _", + "t": "τ", + "tab": "", + "table view...": "προβολή πίνακα...", + "take a camera snapshot and import it as a new sprite": "πάρε μια φωτογραφία με τη κάμερα του υπολογιστή και εισηγαγέ τη σαν καινούργια φιγούρα", + "tan": "εφαπτομένη", + "tell _ to _ _": "πες το _ να _ _", + "tempo": "ταχύτητα του ρυθμού", + "temporary?": "προσωρινό?", + "text": "κείμενο", + "text-only (100)": "κείμενο μόνο (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "πράγμα", + "think _": "σκέψου _", + "think _ for _ secs": "σκέψου _ για _ δευτ.", + "this _": "τρέχον _", + "this block": "αυτό το μπλοκ", + "this project doesn't have any custom global blocks yet": "αυτή η εργασία δεν έχει κανενα προσαρμοσμένο παγκόσμιο μπλοκ ακόμα", + "this script": "αυτό το σενάριο", + "time in milliseconds": "χρόνος σε χιλιοστά του δευτερολέπτου", + "timer": "χρονόμετρο", + "tip": "", + "to": "στο", + "top": "επάνω", + "touch screen settings": "", + "touching _ ?": "ακουμπάει _ ?", + "transient": "", + "translations": "μεταφράσεις", + "translations...": "μεταφράσεις...", + "translator_e-mail": "ino.samaras@berkeley.edu, aprekates@sch.gr", + "transparency": "διαφάνεια", + "transparency...": "", + "trash is empty": "", + "true": "σωστό", + "turbo mode": "λειτουργεία τούρμπο", + "turbo mode?": "", + "turn _ _ degrees": "γύρνα δεξιόστροφα _ _ μοίρες", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "τύπος", + "type of _": "τύπος του _", + "u": "θ", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "απενεργοποιήστε για προεπιλεγμένη σχεδίαση GUI", + "uncheck for greater speed at variable frame rates": "απενεργοποιήστε για να έχετε μεγαλύτερη ταχύτητα στσ μεταβλητά frame-rates", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "απενεργοποιήστε για να μπορούν οι ρεπορτερ που αφήνετε να αντικαταστούν τους άλλους", + "uncheck to allow script reentrance": "απενεργοποιήστε για να επιτρέψετε την επανεισδοχή στον κώδικα", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "απενεργοποιήστε για να μην εχετε IDE animations", + "uncheck to disable alternating colors for nested block": "απενεργοποιήστε για να εξαφανίσετε τα εναλασσόμενα χρώματα για τα ένθετα μπλοκ", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "απενεργοποιήστε για να εξαφανίσετε τις δυναμικες ετικέτες για μεταβλητές τιμές", + "uncheck to disable input sliders for entry fields": "απενεργοποιήστε για να μην έχετε ρυθμιστές τιμών για τα πεδία εισαγωγής", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "απενεργοποιήστε για να μην έχετε το εικονοκό πληκτρολόγιο στο κινητό σας", + "uncheck to disinherit": "αποεπιλογή για κατάργηση κληρονόμησης", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "απενεργοποιήστε για να κρύψετε τα κουμιά στην παλέτα", + "uncheck to hide category names in the palette": "απενεργοποιήστε για να κρύψετε τα ονόματα κατηγοριών στην παλέτα", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "απενεργοποιήστε για να εκτελέσετε τον κώδικα με κανονική ταχύτητα", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "απενεργοποιήστε για να εμφανίσετε μόνο τα μπλοκ τις επιλεγμένης κατηγορίας", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "απενεργοποιήστε για να μην έχετε τον ήχο του κλικ", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "απενεργοποιήστε για να εμφανίσετε την σκίαση και τα στερεά σήματα", + "uncheck to use the input dialog in short form": "απενεργοποιήστε για να εμφανίσετε τις τιμές στην συπμαγή μορφή", + "uncompile": "ξε-μεταγλώτηση", + "undo": "αναίρεση", + "undo the last block drop in this pane": "αναίρεση του τελευταίου μπλοκ που αφήσατε μέσα σε αυτό το παράθυρο", + "undrop": "επενακράτηση", + "unicode _ as letter": "unicode του _ ως γράμμα", + "unicode of _": "unicode του _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "εξαγωγή από το δαχτυλίδι", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "χωρίς τίτλο", + "unused": "αχρησιμοποίητα", + "unused block(s) removed": "", + "up arrow": "πάνω βέλος", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "ω", + "value": "τιμή", + "variable": "μεταβλητή", + "variables": "", + "video _ on _": "βίντεο _ στον _", + "video capture": "καταγραφή βίντεο", + "volume": "ένταση", + "w": "ς", + "wait _ secs": "περίμενε _ δευτ.", + "wait until _": "περίμενε μέχρι _", + "wardrobe": "", + "warp _": "επιτάχυνση _", + "what's your name?": "Ποιο είναι το όνομά σου;", + "when I am _": "όταν μου συμβεί _", + "when I receive _ _": "όταν δεχτώ _ _", + "when I start as a clone": "όταν ξεκινάω ως κλώνος", + "when _": "όταν _", + "when _ clicked": "όταν το _ πατηθεί", + "when _ is edited _": "όταν το _ επεξεργαστεί _", + "when _ key pressed _": "όταν το _ πλήκτρο πατηθεί _", + "whirl": "στρέβλωση", + "whitespace": "διάστημα", + "width": "πλάτος", + "with data": "με δεδομένα", + "with inputs": "με τιμές", + "word": "λέξη", + "world": "κόσμος", + "write _ size _": "γράψε _ μέγεθος _", + "x": "χ", + "x position": "x-θέση", + "y": "υ", + "y position": "y-θέση", + "year": "έτος", + "year:": "", + "your own": "το δικό σας", + "z": "ζ" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-eo.js b/elements/pl-snap/Snap/locale/lang-eo.js new file mode 100644 index 00000000..c4850f69 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-eo.js @@ -0,0 +1,1388 @@ +SnapTranslator.dict.eo = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) maldekstren", + "(0) up": "(0) supren", + "(1) sine": "", + "(180) down": "", + "(180) right": "(180) suben", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) dekstren", + "(empty)": "(nenio)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Pri Snap", + "About...": "Pri...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animacioj", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Iu (nekalkulita)", + "Any type": "Iu tipo", + "Apply": "Apliki", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Ĉu vi certe volas forigi?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Reen...", + "Backgrounds": "Fonoj", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blokoredaktilo", + "Blocks": "Blokoj", + "Blocks category name:": "", + "Blurred shadows": "Malklaraj ombroj", + "Boolean": "Buleo", + "Boolean (T/F)": "Buleo", + "Boolean (unevaluated)": "Buleo (nekalkulita)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Rezigni", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Ŝanĝi blokon", + "Clear backup": "", + "Clicking sound": "Klakanta sono", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Komando", + "Command (C-shape)": "Komando (C-forma)", + "Command (inline)": "Komando (enlinia)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "Enhavo", + "Contributors": "Kontribuantoj", + "Control": "Regado", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Kostumoredaktilo", + "Costumes": "", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Krei enigonomon", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Honoroj...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Normala", + "Default Value:": "Defaŭlta valoro:", + "Delete": "Forigi", + "Delete Custom Block": "Forigi propran blokon", + "Delete Project": "Forigi projekton", + "Delete a variable": "Forigi variablon", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Elŝuti fontokodon", + "Dragging threshold...": "", + "Dynamic input labels": "Dinamikaj enigoetikedoj", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Redakti enigonomon", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Malplena", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Eksporti blokojn", + "Export blocks...": "Eksporti blokojn...", + "Export project as plain text...": "Eksporti projekton en plata teksta formo...", + "Export project...": "Eksporti projekton...", + "Export summary with drop-shadows...": "", + "Export summary...": "Eksportresumo", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Plata fasonado", + "Flat line ends": "Malrondaj linifinoj", + "For all Sprites": "Por ĉiu objekto", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Saluton!", + "Hello, World!": "", + "Help": "Helpo", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "Importi bibliotekon", + "Import sound": "", + "Import tools": "Importi ilaron", + "Import...": "Importi...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Subteno de heredado", + "Input Names:": "Enigonomoj:", + "Input Slot Options": "", + "Input name": "Nomo de enigo", + "Input sliders": "Enigaj ŝoviloj", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Klavara redaktado", + "Kind of": "Speco de", + "LEAP Motion controller": "", + "Language...": "Lingvo...", + "Libraries...": "Bibliotekoj...", + "License": "Licenco", + "License...": "Licenco...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Listo", + "List utilities": "", + "Lists": "Listoj", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Ensaluti...", + "Logout": "", + "Long form input dialog": "Eniga formularo en longa formo", + "Looks": "Aspekto", + "Make a block": "Krei blokon", + "Make a variable": "Krei variablon", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Mesaĝonomo", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Moduloj...", + "Motion": "Movo", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Pluraj enigoj (valoro estas listo de enigoj)", + "Nested auto-wrapping": "Ingita ĉirkaŭfulo", + "New": "Nova", + "New Category": "", + "New Project": "Nova projekto", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Ne", + "November": "", + "Number": "Nombro", + "OK": "Bone", + "Object": "Objekto", + "October": "", + "Ok": "Bone", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Malfermi", + "Open Project": "Malfermi projekton", + "Open in Community Site": "", + "Open...": "Malfermi...", + "Opening project...": "", + "Operators": "Operatoroj", + "Other": "Aliaj", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "Parto de", + "Parts": "Partoj", + "Password:": "", + "Pen": "Skribilo", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Krudaj prototipaj etikedoj", + "Play": "Aŭdigi", + "Play sound": "Aŭdigi sonon", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikato", + "Prefer empty slot drops": "Preferas malplenajn ingojn", + "Prefer smooth animations": "Preferas glatajn animaciojn", + "Privacy...": "", + "Project Notes": "Projektonotoj", + "Project URLs": "", + "Project notes...": "Projektonotoj...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Manlibro", + "Remove a category...": "", + "Remove unused blocks": "Forigi neuzatajn blokojn", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Anstataŭi la aktualan projekton per la nova?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Raportilo", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Konservi", + "Save As...": "Konservi kiel...", + "Save Project": "", + "Save Project As...": "Konservi projekton kiel...", + "Save to disk": "Konservi al disko", + "Saved!": "Konservita!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Variablonomo de skripto", + "Scripts": "Skriptoj", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Sentado", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Krei konton...", + "Single input.": "Unuopa enigo.", + "Single palette": "", + "Slider maximum value": "Maksimuma valoro de ŝovilo", + "Slider minimum value": "Minimuma valoro de ŝovilo", + "Snap! website": "Snap! paĝaro", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Sono", + "Sound Recorder": "", + "Sounds": "Sonoj", + "Sprite": "Objekto", + "Sprite Nesting": "", + "Stage": "Scenejo", + "Stage height": "Alteco de scenejo", + "Stage selected: no motion primitives": "Scenejo elektita: neniuj movaj bazelementoj", + "Stage size": "Grandeco de scenejo", + "Stage size...": "Grandeco de scenejo...", + "Stage width": "Larĝeco de scenejo", + "Stop": "Haltigi", + "Stop sound": "Halti sonon", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Ŝanĝi reen al uzantoreĝimo", + "Switch to dev mode": "Ŝanĝi al programada reĝimo", + "Switch to vector editor?": "", + "Table lines": "Linioj de tabelo", + "Table support": "Subteno de tabeloj", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Teksto", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Fadensekuraj skriptoj", + "Title text": "Teksto de titolo", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Tradukoj", + "Translators...": "Tradukantoj...", + "Turbo mode": "Rapida reĝimo", + "Turtle": "Testudo", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Sentitola", + "Unused blocks...": "Neuzataj blokoj...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Fari internan variablon videblan por vokanto", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Variablonomo", + "Variables": "Variabloj", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuala klavaro", + "Visible stepping": "Ponunupaŝa plenumado", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Jes", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebra kolorigado", + "Zoom blocks": "Zomi vlokojn", + "Zoom blocks...": "Zomi blokojn...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ enhavas _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ estas antaŭ _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "aldoni _ al _", + "add a new Turtle sprite": "", + "add a new sprite": "aldoni novan objekton", + "add comment": "aldoni komenton", + "add comment here...": "aldonu komenton ĉi tie...", + "agent": "", + "alert _": "averto _", + "all": "ĉion", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "ĉiuj krom la unua el _", + "all but this script": "ĉion krom tiu ĉi skripto", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "ankro", + "and": "kaj", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "respondo", + "any": "ajna", + "any key": "ajna klavo", + "any message": "iu mesaĝo", + "anything": "", + "append _": "", + "arrange scripts vertically": "ordigi skriptojn vertikale", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "demandi _ kaj atendi", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "granda (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "forigo de la bloko estas ne malfarebla, ĉu vi vere volas ĝin forigi?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blokoj", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "brileco", + "broadcast _ _": "elsendi _ _", + "broadcast _ _ and wait": "elsendi _ _ kaj atendi", + "brush": "", + "build": "konstrui", + "but getting a": "", + "c": "c", + "call _ _": "voki _ _", + "call _ w/continuation": "voki _ _ kun daŭrigo", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "turnebla", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "centro x", + "center y": "centro y", + "change _ by _": "ŝanĝi _ je _", + "change _ effect by _": "ŝanĝi _ efekton je _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ŝanĝi skribilokoloron je _", + "change pen shade by _": "ŝanĝi kolorombron je _", + "change pen size by _": "ŝanĝi skribilodikecon je _", + "change size by _": "ŝanĝi grandecon je _", + "change tempo by _": "ŝanĝi rapidecon je _", + "change volume by _": "", + "change x by _": "ŝanĝi x je _", + "change y by _": "ŝanĝi y je _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "ŝaltu por malrondaj linifinoj", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "ŝaltu por glataj, prognozeblaj animacioj sur ĉiuj komputiloj", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "ŝaltu por ĉiam montri specon de ingo en eniga formularo", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to disallow script reentrancy": "ŝaltu por malebligi reeniron en fadenon", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "ŝalti por ebligi IDE-animaciojn", + "check to enable alternating colors for nested blocks": "ŝaltu por ebligi diferencigadon de koloroj de stake kolektitaj blokoj", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "ŝaltu por ebligi dinamikajn enigoetikedojn por enigo de variabloj", + "check to enable input sliders for entry fields": "ŝaltu por ebligi enigajn ŝovilojn por enigaj kampoj", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "ŝaltu por ebligi subtenon de virtuala klavaro por porteblaj aparatoj", + "check to hide (+) symbols in block prototype labels": "ŝaltu por kaŝi (+) signon en etikedoj de prototipaj blokoj", + "check to inherit from": "", + "check to prevent contents from being saved": "ŝaltu por malebligi konservon de la enhavo en al projekton", + "check to prioritize script execution": "ŝalti por asigni prioritaton de skriptoplenumado", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "ŝaltu por ebligi klakantan sonon", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "ŝaltu por uzi malklarajn ombrojn kaj emfazojn", + "children": "idoj", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "purigi", + "clear": "forigi desegnaĵon", + "clear graphic effects": "forigi grafikajn efektojn", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "klaku aŭ trenu la krucon por movi la turnocentron", + "clicked": "alklakita", + "clone": "", + "clones": "klonoj", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "koloro", + "color _ is touching _ ?": "koloro _ tuŝas _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "bildtrio", + "command": "komando", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "konfeto", + "console log _": "konzola protokolo: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "numero de kostumo", + "costume name": "", + "costumes": "", + "costumes tab help": "trenu tien bildojn el aliaj retpaĝoj aŭ de via komputilo", + "could not connect to:": "", + "cr": "ĉaretreveno", + "create a clone of _": "kloni _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "versioj de aktualaj moduloj:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "misaj?", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "forigi", + "delete _": "", + "delete _ of _": "forigi _ el _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "forigi blokodifinon...", + "delete slot": "", + "delete this clone": "forigi tiun ĉi klonon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "provo (1,2x)", + "demo...": "", + "detach all parts": "malligi ĉiujn partojn", + "detach and put into the hand": "", + "detach from": "malligi de", + "development mode": "programada reĝimo", + "development mode debugging primitives:": "programada reĝimo sencimigadaj bazelementoj:", + "development mode...": "", + "dimensions": "", + "direction": "direkto", + "disable deep-Morphic context menus and show user-friendly ones": "malŝalti deep-Morphic kuntekstajn menuojn kaj montri la afablajn", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "distanco de _", + "distribution": "", + "don't rotate": "ne turnebla", + "down arrow": "sago malsupren", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "trenebla", + "draggable?": "", + "dragging threshold": "", + "dropped": "demetita", + "duplicate": "duobligi", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "rando", + "edit": "redakti", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "redakti...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "ŝalti Morphic kuntekstajn menuojn kaj kontrolilojn, ne la afablajn!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "eksporti", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "eksporti...", + "extract": "", + "f": "f", + "false": "malvero", + "file": "", + "file menu import hint": "elŝutu dosieron kun blokoj sonoj aŭ kostumoj", + "fill": "plenigi", + "fill page...": "", + "filtered for _": "filtrita por _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "trovi neuzatajn proprajn blokojn kaj forigi iliajn difinojn", + "fisheye": "fiŝokulo", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "por ĉiuj objektoj", + "for each _ in _ _": "", + "for this sprite only": "nur por ĉi tiu objekto", + "forever _": "ripeti eterne _", + "frame": "", + "frames": "kadroj", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "diafaneco", + "giant (8x)": "giganta (8x)", + "glide _ secs to x: _ y: _": "gliti dum _ sek. al x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "iri _ tavolojn malantaŭen", + "go to _": "iri al _", + "go to _ layer": "", + "go to front": "iri antaŭen", + "go to x: _ y: _": "iri al x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "saluton", + "help": "helpo", + "help...": "helpo...", + "hide": "kaŝi", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "kaŝi bazelementojn", + "hide variable _": "kaŝi variablon _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "grandega (4x)", + "i": "i", + "identical to": "identa kun", + "if _ _": "se _ _", + "if _ _ else _": "se _ _ alie _", + "if _ then _ else _": "", + "if on edge, bounce": "resalti de la rando", + "import a sound from your computer by dragging it into here": "importu sonon de via komputilo trenante ĝin ĉi tien", + "import without attempting to parse or format data": "", + "import...": "importi...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "enigolisto:", + "input names:": "enigonomoj:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "enigi _ je _ en _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "estas _ ?", + "is _ a _ ?": "ĉu _ estas _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "elemento _ el _", + "items": "elementoj", + "j": "j", + "join _": "kunigi _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "klavo _ estas premita?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Esperanto", + "language_translator": "Sebastian CYPRYCH", + "large": "larĝe", + "last": "lasta", + "last changed": "", + "last_changed": "2017-10-01", + "launch _ _": "lanĉi _ _", + "left": "", + "left arrow": "sago maldekstren", + "length": "", + "length of _": "longeco de _", + "length:": "longeco:", + "let the World automatically adjust to browser resizing": "", + "letter": "litero", + "letter _ of _": "litero _ el _", + "light (70)": "", + "lightness": "", + "line": "linio", + "lines": "", + "list": "listo", + "list _": "listo _", + "list view...": "lista vidigo", + "ln": "ln", + "load the official library of powerful blocks": "importi oficialan bibliotekon de potencaj blokoj", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "krei blokon...", + "make a category...": "", + "make a copy and pick it up": "krei kopion kaj elekt ĝin", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "mesaĝo", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "monstra (10x)", + "month": "", + "mosaic": "mozaiko", + "motion": "", + "mouse down?": "musklavo estas premita?", + "mouse position": "", + "mouse x": "musa x-pozicio", + "mouse y": "musa y-pozicio", + "mouse-departed": "lasita de musa montrilo", + "mouse-entered": "tuŝata de musa montrilo", + "mouse-pointer": "musmontrilo", + "move": "movi", + "move _ steps": "iri _ paŝojn", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "mia _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "min", + "n": "n", + "name": "nomo", + "neg": "", + "negative": "negativo", + "neighbors": "najbaroj", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "nova...", + "next": "", + "next costume": "sekva kostumo", + "none": "neniun", + "normal": "normala", + "normal (1x)": "normala (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "ne _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "nombro", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "duobligi nur tiun ĉi blokon", + "only face left/right": "nur maldekstren/dekstren", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "malfermi projektresumon en nova fenestro de foliumilo", + "open a new window with a picture of all scripts": "malfermi novan fenestron kun bildo de ĉiuj skriptoj", + "open a new window with a picture of the stage": "malfermi novan fenestron kun bildon de scenejo", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "malfermi novan fenestron kun bildo de ĉi tiu skripto", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "malfermi en formularo...", + "open shared project from cloud...": "", + "options...": "", + "or": "aŭ", + "or before": "", + "other clones": "aliaj klonoj", + "other scripts in sprite": "aliajn skriptojn en tiu objekto", + "other sprites": "aliaj objektoj", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "parenco", + "parent...": "", + "parts": "partoj", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "paŭzi ĉiujn _", + "pen": "", + "pen _": "", + "pen down": "malsuprenigi skribilon", + "pen down?": "", + "pen trails": "spuro de skribilo", + "pen up": "suprenigi skribilon", + "pen vectors": "", + "pic...": "bildo...", + "pick random _ to _": "elekti stokaston inter _ kaj _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "bilderigi", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "aŭdigi noton _ dum _ taktoj", + "play sound _": "aŭdigi sonon _", + "play sound _ at _ Hz": "", + "play sound _ until done": "aŭdigi sonon _ ĝis finite", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "celi laŭ direkto _", + "point towards _": "celi al _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predikato", + "presentation (1.4x)": "prezentado (1,4x)", + "pressed": "premita", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "kvo", + "r": "r", + "r-g-b-a": "", + "random": "hazarda", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "redemeti", + "relabel...": "Reetikedi...", + "release": "", + "remove block variables...": "", + "rename": "alinomi", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "Alinomi kostumon", + "rename only this reporter": "", + "rename sound": "renomi sonon", + "rename...": "alinomi...", + "repeat _ _": "ripeti _ -foje _", + "repeat until _ _": "ripeti ĝis _ _", + "replace item _ of _ with _": "astataŭi elementon _ de _ per _", + "report _": "raporti _", + "reporter": "raportilo", + "reporter didn't report": "", + "reset columns": "nuligi kolumnojn", + "reset timer": "nuligi klikhorloĝon", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "paŭzi dum _ taktoj", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "sago dekstren", + "ring": "", + "ringify": "procedurigi", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "rotacio x", + "rotation y": "rotacio y", + "round _": "rondigi _", + "run _ _": "ruli _ _", + "run _ w/continuation": "ruli _ _ kun daŭrigo", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "satureco", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "diri _", + "say _ for _ secs": "diri _ dum _ sek.", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "bildo de skripto...", + "script variables _": "variabloj de skripto _", + "scripts": "", + "scripts pic...": "bildo de skriptoj...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "elekti", + "selection": "", + "self": "mem", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "ŝanĝi efekton _ al _", + "set _ of block _ to _": "", + "set _ to _": "ŝanĝi _ al _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "ŝanĝi skribilokoloron al _", + "set pen shade to _": "ŝanĝi kolorombron al _", + "set pen size to _": "ŝanĝi skribilodikecon al _", + "set size to _ %": "ŝanĝi grandecon al _", + "set tempo to _ bpm": "ŝanĝi rapidecon al _ taktoj minute", + "set this morph's alpha value": "", + "set turbo mode to _": "apliki rapidan reĝimon al _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "ŝanĝi x al _", + "set y to _": "ŝanĝi y al _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "agorda menuo preferas indikojn ĉe malpenaj ingoj", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "montri", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "montri ĉion", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "prezenti mallokajn difinojn de propraj blokoj kiel XML en nova fenestro de retumilo", + "show primitives": "montri bazelementojn", + "show project data as XML in a new browser window": "prezenti projekton kiel XML en nova fenestro de retumilo", + "show table _": "", + "show the World's menu": "", + "show variable _": "montri variablon _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "grandeco", + "slider": "ŝovilo", + "slider max...": "ŝovilo maks...", + "slider min...": "ŝovilo min...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "spacetklavo", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "dividi _ kun _", + "sprite": "objekto", + "sprites": "", + "sqrt": "radiko", + "square": "", + "stack size": "stakokapacito", + "stage": "scenejo", + "stage image": "", + "stamp": "", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "halti _", + "stop all sounds": "haltigi ĉiujn sonojn", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "konservi tiun ĉi projekton en lokal elŝutan dosierujon (ne ĉiuj foliumiloj tion apogas)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "ŝanĝi al kostumo _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabo", + "table view...": "tabela vidigo", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "teksto", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "aktuale estas neniu neuzata malloka propra bloko en tiu ĉi projekto", + "there are currently no vectorizable pen trail segments": "", + "thing": "io", + "think _": "pensi _", + "think _ for _ secs": "pensi _ dum _ sek.", + "this _": "", + "this block": "tiun ĉi blokon", + "this project doesn't have any custom global blocks yet": "ĉi tiu projekto havas ankoraŭ neniun propran blokon", + "this script": "tiun ĉi skripton", + "time in milliseconds": "", + "timer": "klikhorloĝo", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "tuŝas _ ?", + "transient": "travidebla", + "translations": "", + "translations...": "", + "translator_e-mail": "sebacyp(heliko)gmail(punkto)com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "vero", + "turbo mode": "", + "turbo mode?": "Rapida reĝimo?", + "turn _ _ degrees": "turni _ gradojn _", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "tipo de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "malŝaltu por pli granda rapideco kun varia bildorapido", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "malŝaltu por rondaj linifinoj", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "malŝaltu por ebligi demetatajn raportilojn forŝovi la aliajn", + "uncheck to allow script reentrance": "", + "uncheck to allow script reentrancy": "malŝaltu por ebligi reeniron en fadenon", + "uncheck to always show (+) symbols in block prototype labels": "malŝaltu por ĉiam montri (+) signon en etikedoj de prototipaj blokoj", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "malŝalti por malebligi IDE-animaciojn", + "uncheck to disable alternating colors for nested block": "malŝaltu por malebligi diferencigadon de koloroj de stake kolektitaj blokoj", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "malŝaltu por malebligi dinamikajn enigoetikedojn por enigo de variabloj", + "uncheck to disable input sliders for entry fields": "malŝaltu por malebligi enigajn ŝovilojn por enigaj kampoj", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "malŝaltu por malebligi subtenon de virtuala klavaro por porteblaj aparatoj", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "malŝalti por plenumi skripton kun normala rapideco", + "uncheck to save contents in the project": "malŝaltu por konservi enhavon en la projekton", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "malŝaltu por malebligi klakantan sonon", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "malŝaltu por uzi klarajn ombrojn kaj emfazojn", + "uncheck to use the input dialog in short form": "malŝaltu por uzi la enigan formularon en mallonga formo", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "malfari la alstan demeton de bloko en tiu ĉi panelo", + "undrop": "maldemeti", + "unicode _ as letter": "unikodo _ kiel litero", + "unicode of _": "unikodo de _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "malprocedurigi", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "sentitola", + "unused": "", + "unused block(s) removed": "neuzata(j) bloko(j) forigitaj", + "up arrow": "sago supren", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "duobla v", + "wait _ secs": "atendi _ sek.", + "wait until _": "atendi ĝis _", + "wardrobe": "", + "warp _": "nedisigeble _", + "what's your name?": "Kiu estas via nomo?", + "when I am _": "Dum mi estas _", + "when I receive _ _": "Kiam mi ricevas _ _", + "when I start as a clone": "kiam mi estas klonita", + "when _": "kiam _", + "when _ clicked": "Kiam _ estas alklakita", + "when _ is edited _": "", + "when _ key pressed _": "se _ klavo estas premita _", + "whirl": "kirlo", + "whitespace": "blankspaco", + "width": "", + "with data": "", + "with inputs": "kun enigoj", + "word": "", + "world": "mondo", + "write _ size _": "", + "x": "ikso", + "x position": "x pozicio", + "y": "y", + "y position": "y pozicio", + "year": "", + "year:": "", + "your own": "propraj", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-es.js b/elements/pl-snap/Snap/locale/lang-es.js new file mode 100644 index 00000000..6e1f877c --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-es.js @@ -0,0 +1,1622 @@ +/* + + lang-es.js + + Spanish translation for SNAP! + + written by Jens Mönig + + Copyright (C) 2013 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + + Note to Translators: + -------------------- + At this stage of development, Snap! can be translated to any LTR language + maintaining the current order of inputs (formal parameters in blocks). + + Translating Snap! is easy: + + + 1. Download + + Download the sources and extract them into a local folder on your + computer: + + + + Use the German translation file (named 'lang-de.js') as template for your + own translations. Start with editing the original file, because that way + you will be able to immediately check the results in your browsers while + you're working on your translation (keep the local copy of snap.html open + in your web browser, and refresh it as you progress with your + translation). + + + 2. Edit + + Edit the translation file with a regular text editor, or with your + favorite JavaScript editor. + + In the first non-commented line (the one right below this + note) replace "de" with the two-letter ISO 639-1 code for your language, + e.g. + + fr - French => SnapTranslator.dict.fr = { + it - Italian => SnapTranslator.dict.it = { + pl - Polish => SnapTranslator.dict.pl = { + pt - Portuguese => SnapTranslator.dict.pt = { + es - Spanish => SnapTranslator.dict.es = { + el - Greek => => SnapTranslator.dict.el = { + + etc. (see ) + + + 3. Translate + + Then work through the dictionary, replacing the German strings against + your translations. The dictionary is a straight-forward JavaScript ad-hoc + object, for review purposes it should be formatted as follows: + + { + 'English string': + 'Translation string', + 'last key': + } 'last value' + + and you only edit the indented value strings. Note that each key-value + pair needs to be delimited by a comma, but that there shouldn't be a comma + after the last pair (again, just overwrite the template file and you'll be + fine). + + If something doesn't work, or if you're unsure about the formalities you + should check your file with + + + + This will inform you about any missed commas etc. + + + 4. Accented characters + + Depending on which text editor and which file encoding you use you can + directly enter special characters (e.g. Umlaut, accented characters) on + your keyboard. However, I've noticed that some browsers may not display + special characters correctly, even if other browsers do. So it's best to + check your results in several browsers. If you want to be on the safe + side, it's even better to escape these characters using Unicode. + + see: + + + 5. Block specs: + + At this time your translation of block specs will only work + correctly, if the order of formal parameters and their types + are unchanged. Placeholders for inputs (formal parameters) are + indicated by a preceding % prefix and followed by a type + abbreviation. + + For example: + + 'say %s for %n secs' + + can currently not be changed into + + 'say %n secs long %s' + + and still work as intended. + + Similarly + + 'point towards %dst' + + cannot be changed into + + 'point towards %cst' + + without breaking its functionality. + + + 6. Submit + + When you're done, rename the edited file by replacing the "de" part of the + filename with the two-letter ISO 639-1 code for your language, e.g. + + fr - French => lang-fr.js + it - Italian => lang-it.js + pl - Polish => lang-pl.js + pt - Portuguese => lang-pt.js + es - Spanish => lang-es.js + el - Greek => => lang-el.js + + and send it to me for inclusion in the official Snap! distribution. + Once your translation has been included, Your name will the shown in the + "Translators" tab in the "About Snap!" dialog box, and you will be able to + directly launch a translated version of Snap! in your browser by appending + + lang:xx + + to the URL, xx representing your translations two-letter code. + + + 7. Known issues + + In some browsers accents or ornaments located in typographic ascenders + above the cap height are currently (partially) cut-off. + + Enjoy! + -Jens +*/ + +/*global SnapTranslator*/ + +SnapTranslator.dict.es = { + +/* + Special characters: (see ) + + Ä, ä \u00c4, \u00e4 + Ö, ö \u00d6, \u00f6 + Ü, ü \u00dc, \u00fc + ß \u00df +*/ + + // translations meta information + 'language_name': + 'Espa\u00F1ol', // the name as it should appear in the language menu + 'language_translator': + 'V\u00EDctor Manuel Muratalla Morales / Cristi\u00E1n Rizzi Iribarren / Alfonso Ruzafa / David Mart\u00EDn', // your name for the Translators tab + 'translator_e-mail': + 'victor.muratalla@yahoo.com / rizzi.cristian@gmail.com', // optional + 'last_changed': + '2023-11-20', // this, too, will appear in the Translators tab + + //ADDING jadga's newest commits + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "360° dial": "dial 360°", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "(-90) left": "(-90) izquierda", + "(0) up": "(0) arriba", + "(1) sine": "(1) ∿∿ (onda sinusoidal)", + "(180) down": "(180) abajo", + "(2) square": "(2) ⎍⎍ (onda cuadrada)", + "(3) sawtooth": "(3) ⩘⩘ (onda dentada)", + "(4) triangle": "(4) ⋀⋀ (onda triangular)", + "(90) right": "(90) derecha", + "(none)": "(ninguno)", + "(empty)": "(vacío)", + "(in a new window)": "(en una nueva ventana)", + "(no matches)": "(ninguna coincidencia)", + "(temporary)": "(temporal)", + "A variation on the list data type in which each list item aren't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.)": "Una variación del tipo de dato lista en el que cada elemento se calcula solo cuando es necesario, así que puedes construir listas de un millón de elementos sin gastar tiempo o memoria, o incluso listas infinitas. (Se incluye un bloque de ejemplo que reporta todos los números primos)", + "APL primitives": "Primitivas APL", + "About Snap": "Acerca de Snap", + "About...": "Acerca de…", + "Account created.": "Cuenta creada.", + "Add interactive maps to projects": "Añadir mapas interactivos a los proyectos", + "Add scene...": "Añadir escena…", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Texto multilínea", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "Animación", + "Animations": "Animaciones", + "Another custom block with this name exists.": "", + "Any\n(unevaluated)": "Cualquier tipo\n(no evaluado)", + "Any type": "Cualquier tipo", + "Apply": "Aplicar", + "April": "Abril", + "Are you sure you want to continue?": "¿Seguro que quieres continuar?", + "Are you sure you want to delete": "¿Seguro que quieres eliminar", + "Are you sure you want to publish": "¿Seguro que quieres publicar", + "Are you sure you want to replace": "¿Seguro que quieres reemplazar", + "Are you sure you want to share": "¿Seguro que quieres compartir", + "Are you sure you want to unpublish": "¿Seguro que quieres dejar de publicar", + "Are you sure you want to unshare": "¿Seguro que quieres dejar de compartir", + "Audio Comp": "Composición de audio", + "August": "Agosto", + "Back...": "Atrás…", + "Backgrounds": "Fondos de escenario", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Fecha de nacimiento:", + "Bitmap": "", + "Block Editor": "Editor de bloques", + "Block variable name": "Nombre de variable de bloque", + "Blocks": "Bloques", + "Blocks category name:": "Nombre de categoría de bloques:", + "Blurred shadows": "Sombras difuminadas", + "Boolean": "booleano", + "Boolean (T/F)": "Booleano (V/F)", + "Boolean\n(unevaluated)": "Booleano\n(no evaluado)", + "Bottom": "Abajo del todo", + "Bring back deleted sprites": "Recuperar objetos eliminados", + "Browser": "Navegador", + "Brush size": "Tamaño del pincel", + "Cache Inputs": "Cachear entradas", + "Camera": "Cámara", + "Camera not supported": "Cámara no soportada", + "Camera support": "Soporte para cámara", + "Cancel": "Cancelar", + "Case sensitivity": "Distinguir mayúsculas", + "Catch errors": "", + "Catch errors in a script": "Captura de errores en programas", + "Category color": "Color de la categoría", + "Change Password": "Cambiar contraseña", + "Change Password...": "Cambiar contraseña", + "Change block": "Cambiar bloque", + "Clear backup": "Borrar copia de seguridad", + "Clicking sound": "Sonido de clic", + "Closed brush\n(free draw)": "silueta cerrada\n(trazo libre)", + "Cloud": "Nube", + "Code mapping": "Mapeo del código", + "Codification support": "Soporte de codificación", + "Colors and Crayons": "Colores y pinturas", + "Command": "Comando", + "Command\n(C-shape)": "Comando\n(en forma de C)", + "Command\n(inline)": "Comando\n(en línea)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes?\n(you can also hold shift)": "¿Mantener proporciones de los trazos?\n(también pulsando ⇧)", + "Contents": "Contenido", + "Contributors": "Colaboradores", + "Control": "Control", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "¿Convertir en mapa de puntos?", + "Costume Editor": "Editor de disfraces", + "Costumes": "Disfraces", + "Crayons": "Pinturas", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Crear parámetro", + "Create variables": "Crear variables", + "Create variables in program": "Crea variables en un programa", + "Credits...": "Créditos…", + "Custom Block Translations": "Traducciones de bloques personalizados", + "Database": "Base de datos", + "December": "Diciembre", + "Default": "Predeterminado", + "Default Value:": "Valor predeterminado:", + "Delete": "Eliminar", + "Delete Custom Block": "Eliminar bloque personalizado", + "Delete Project": "Eliminar proyecto", + "Delete a variable": "Borrar variable", + "Disable click-to-run": "Deshabilitar ejecución directa", + "Disable dragging data": "Deshabilitar arrastre de contenidos", + "Down": "Bajar", + "Download source": "Descargar código fuente", + "Dragging threshold...": "Umbral de arrastre…", + "Dynamic input labels": "Etiquetas de entrada dinámicas", + "E-mail address of parent or guardian:": "Correo electrónico del padre/madre o tutor legal", + "E-mail address:": "Correo electrónico:", + "ERROR: INVALID PASSWORD": "ERROR: CONTRASEÑA INCORRECTA", + "EXPERIMENTAL! check to enable live custom control structures": "¡EXPERIMENTAL! marcar para activar las estructuras de control personalizadas en vivo", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "¡EXPERIMENTAL! desmarcar para desactivar las estructuras de control personalizadas en vivo", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color\n(left click)": "Color del borde\n(clic izquierdo)", + "Edit input name": "Editar parámetro", + "Edit label fragment": "Editar fragmento de texto", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "Ley de Eisenberg: Cualquier cosa que pueda hacerse desde la interfaz gráfica también debería de poder hacerse desde el lenguaje de programación y viceversa.", + "Ellipse\n(shift: circle)": "elipse\n(⇧ = círculo)", + "Empty": "Vacío", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Escribe el código correspondiente a la definición del bloque. Puedes usar tus propios parámetros formales (ignora los aquí mostrados).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Escribe el código correspondiente a la definición del bloque. Usa los nombres de los parámetros formales aquí mostrados y para referenciar el código generado del cuerpo de la definición.", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Escribe el código correspondiente a la implementación del bloque (normalmente una única llamada a función). Usa <#n> para referenciar los argumentos aquí mostrados.", + "Enter one option per line.\nOptionally use \"=\" as key/value delimiter and {} for submenus. e.g.\n the answer=42": "Introducir una opción por línea. Opcionalmente usar «=» como delimitador de clave/valor\ny «{}» para submenús. Por ejemplo:\n la respuesta=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter\nand underscore (\"_\") as placeholder for an input, e.g.:\n\nen:say _ for _ secs": "Escribe cada traducción en una línea. Utiliza «:» para separar el idioma y el mensaje\ny «_» para los argumentos de entrada, por ejemplo:\n\nes:decir _ durante _ s", + "Eraser tool": "goma de borrar", + "Error": "Error", + "Examples": "Ejemplos", + "Execute on slider change": "Ejecutar cuando un deslizador cambie", + "Export Project As...": "Exportar proyecto como…", + "Export all scripts as pic...": "Exportar todos los programas como imagen…", + "Export blocks": "Exportar bloques", + "Export blocks...": "Exportar bloques…", + "Export project as plain text...": "Exportar proyecto como texto…", + "Export project...": "Exportar proyecto…", + "Export summary with drop-shadows...": "Exportar resumen (imágenes con sombra)…", + "Export summary...": "Exportar resumen…", + "Extension blocks": "Bloques de extensiones", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Disipar bloques", + "Fade blocks...": "Disipar los bloques…", + "February": "Febrero", + "Fetching project from the cloud...": "Descargando proyecto desde la nube…", + "Fill a region": "rellenar", + "Fill color\n(right click)": "Color de relleno\n(clic derecho)", + "Filled Ellipse\n(shift: circle)": "elipse rellena\n(⇧ = círculo)", + "Filled Rectangle\n(shift: square)": "rectángulo relleno\n(⇧ = cuadrado)", + "First-Class Sprites": "Objetos de primera clase", + "Flat design": "Diseño plano", + "Flat line ends": "Extremos de línea rectos", + "For all Sprites": "Para todos los objetos", + "Frequency Distribution Analysis": "Análisis de distribución de frecuencias", + "Generate costumes from letters or words of text.": "", + "Generate puzzle": "Generar puzzle", + "Generate Puzzle": "Generar Rompecabezas", + "Getters and setters": "Consultas y modificaciones", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "Modelo de color HSL", + "Header mapping": "Mapeo de la cabecera", + "Hello!": "¡Hola!", + "Hello, World!": "¡Hola, Mundo!", + "Help": "Ayuda", + "Hide blocks in palette": "Ocultar bloques en la paleta", + "Hide blocks...": "Ocultar bloques…", + "Hmm...": "Mmm…", + "Hummingbird robotics": "", + "Hyper blocks support": "Suporte de hiperbloques", + "I have read and agree\nto the Terms of Service": "He leído y acepto los\ntérminos y condiciones de uso", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "Importar", + "Import a new costume from your webcam": "importar un nuevo disfraz desde la cámara", + "Import blocks": "Importar bloques", + "Import library": "Importar biblioteca", + "Import sound": "Importar sonido", + "Import...": "Importar…", + "Imported": "Se ha importado", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Precisión arbitraria, racionales exactos, números complejos.", + "Inheritance support": "Soporte de herencia", + "Input Names:": "Nombres de entradas:", + "Input Slot Options": "Opciones de parámetro de entrada", + "Input name": "Parámetro", + "Input sliders": "Deslizadores en campos de entrada", + "Inside a custom block": "Dentro de un bloque personalizado", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iteración, composición", + "JIT compiler support": "", + "January": "Enero", + "JavaScript extensions": "Extensiones JavaScript", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "función JavaScript ( _ ) { _ }", + "July": "Julio", + "June": "Junio", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Edición de teclado", + "Kind of": "Clase de", + "LEAP Motion controller": "Control gestual (LEAP)", + "Language...": "Idioma…", + "Libraries...": "Bibliotecas…", + "License": "Licencia", + "License...": "Licencia…", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "Como el «switch» de C o el «cond» de Lisp. ¡Gracias a Nathan Dinsmore por inventar la idea de un bloque separado para cada rama!", + "Line tool\n(shift: constrain to 45º)": "línea\n(⇧ = 45°)", + "Line tool\n(shift: vertical/horizontal)": "línea\n(⇧ = vertical/horizontal)", + "List": "Lista", + "List utilities": "Utilidades de lista", + "Lists": "Listas", + "Live coding support": "Soporte para programación en vivo", + "Loading": "Cargando", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Registrar los dibujos como vectores", + "Login...": "Iniciar sesión…", + "Logout": "Cerrar sesión", + "Long form input dialog": "Editor de parámetros extendido", + "Looks": "Apariencia", + "Make a block": "Crear bloque", + "Make a variable": "Declarar variable", + "Manipulate costumes pixel-wise.": "", + "March": "Marzo", + "May": "Mayo", + "Message name": "Nombre de mensaje", + "Method Editor": "Editor de métodos", + "Microphone": "Micrófono", + "Microphone resolution...": "Resolución del micro…", + "Modules...": "Módulos…", + "Motion": "Movimiento", + "Multi-branched conditional": "Condicionales multirama", + "Multi-branched conditional (switch)": "Condicionales multirama (switch)", + "Multiple inputs (value is list of inputs)": "Entrada múltiple (valores accesibles como lista)", + "Nested auto-wrapping": "Encapsular bloques internos", + "New": "Nuevo", + "New Category": "Nueva categoría", + "New Project": "Nuevo proyecto", + "New category...": "Nueva categoría…", + "New password:": "Nueva contraseña:", + "New scene": "Nueva escena", + "No": "No", + "Notes": "Notas", + "Notes...": "Notas…", + "November": "Noviembre", + "Number": "Número", + "OK": "Aceptar", + "Object": "Objeto", + "October": "Octubre", + "Ok": "Aceptar", + "Old password:": "Contraseña actual:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "Una de las mejores ideas de Logo no incluida en Scratch es la de considerar un texto como una secuencia de palabras y frases, en lugar de simplemente una cadena de caracteres. Esta biblioteca recupera esa idea.", + "Open": "Abrir", + "Open Project": "Abrir proyecto", + "Open in Community Site": "", + "Open...": "Abrir…", + "Opening project...": "Abriendo proyecto…", + "Operators": "Operadores", + "Other": "Otros", + "Output text using speech synthesis.": "", + "Paint Editor": "Editor gráfico", + "Paint a new costume": "dibujar un nuevo disfraz", + "Paint a shape\n(shift: edge color)": "colorear una figura\n(⇧ = colorear borde)", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool\n(free draw)": "pincel\n(trazo libre)", + "Parallelization": "Paralelización", + "Part of": "Parte de", + "Parts": "Partes", + "Password:": "Contraseña:", + "Pen": "Lápiz", + "Persist linked sublist IDs": "IDs de sublistas enlazadas persistentes", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool\n(pick a color anywhere)": "pipeta de color\n(colores dentro y fuera del editor)", + "Pipette tool\n(pick a color from anywhere\nshift: fill color)": "pipeta de color\n(colores dentro y fuera del editor\n⇧ = color de relleno)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "Píxeles", + "Plain prototype labels": "Etiquetas planas", + "Play": "Reproducir", + "Play sound": "reproduce este sonido", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Por favor, comprueba que tu navegador esté actualizado y tu cámara configurada correctamente. Algunos navegadores necesitan que accedas a Snap! a través de HTTPS para usar la cámara. Por favor, reemplaza el «http://» en la barra de direcciones de tu navegador por «https://» y vuelve a intentarlo.", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "polígono", + "Predicate": "Predicado", + "Prefer empty slot drops": "Dar preferencia a huecos vacíos", + "Privacy...": "Privacidad…", + "Project Notes": "Notas del proyecto", + "Project URLs": "URLs con datos de proyecto", + "Project notes...": "Notas del proyecto…", + "Provide 100 selected colors": "Paleta de 100 colores preseleccionados", + "Provide getters and setters for all GUI-controlled global settings": "Manejo de opciones globales", + "Publish": "Publicar", + "Publish Project": "Publicar proyecto", + "Rasterize SVGs": "Rasterizar SVGs", + "Record a new sound": "grabar un nuevo sonido", + "Recover": "Recuperar", + "Rectangle\n(shift: square)": "rectángulo\n(⇧ = cuadrado)", + "Reference manual": "Manual de referencia", + "Remove a category...": "Eliminar una categoría…", + "Remove unused blocks": "Borrar bloques no utilizados", + "Repeat Password:": "Repetir contraseña", + "Repeat new password:": "Repetir nueva contraseña:", + "Replace Project": "", + "Replace the current project with a new one?": "¿Seguro que quieres descartar el actual proyecto y empezar un proyecto nuevo?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Reporta las posiciones de las manos desde el controlador de LEAP Motion (leapmotion.com).", + "Reporter": "Reportero", + "Request blocked": "", + "Resend Verification Email...": "Reenviar correo de verificación…", + "Resend verification email": "Reenviar correo de verificación", + "Reset Password...": "Reiniciar contraseña…", + "Reset password": "Reiniciar contraseña", + "Restore unsaved project": "Restaurar proyecto no guardado", + "Retina display support": "Soporte para pantallas Retina", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Ejecuta un programa. Si ocurre algún error, en lugar de detener la ejecución el programa con un mensaje en rojo puedes ejecutar otro programa para tratar el error. También incluye un bloque para lanzar un error con un mensaje, un bloque para crear una variable de programa y darle un valor.", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Guardar", + "Save As...": "Guardar como…", + "Save Project": "Guardar proyecto", + "Save Project As...": "Guardar proyecto como…", + "Save to disk": "Guardar en disco", + "Saved!": "¡Guardado!", + "Saving project to the cloud...": "Guardando proyecto en la nube…", + "Scenes...": "Escenas…", + "Script variable name": "Nombre de variable de programa", + "Scripts": "Programas", + "Select a costume from the media library": "añade un disfraz desde la biblioteca", + "Select a sound from the media library": "añade un sonido desde la biblioteca", + "Select categories of additional blocks to add to this project.": "añade bloques adicionales por categorías a este proyecto", + "Selection tool": "selector", + "Sensing": "Sensores", + "September": "Septiembre", + "Serial Ports": "Puertos serie", + "Service:": "Servicio:", + "Set RGB or HSV pen color": "Colores RGB o HSV", + "Set the rotation center": "fijar el centro de rotación", + "Share": "Compartir", + "Share Project": "Compartir", + "Show buttons": "Mostrar botones", + "Show categories": "Mostrar categorías", + "Sign in": "Iniciar sesión", + "Sign up": "Registro", + "Signada (Network remote control)": "", + "Signup": "Registro", + "Signup...": "Registrarse…", + "Single input.": "Entrada simple.", + "Single palette": "Paleta única", + "Slider maximum value": "Máximo valor del deslizador", + "Slider minimum value": "Mínimo valor del deslizador", + "Snap! website": "Sitio web de Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (append, reverse, etc.)": "Algunas funciones estándar de listas (anexar, inventir, etc...)", + "Some standard functions on lists (reverse, sort, etc.)": "Algunas funciones estándar de listas (inventir, sort, etc...)", + "Sound": "Sonido", + "Sound Recorder": "Grabadora de sonidos", + "Sounds": "Sonidos", + "Sprite": "Objeto", + "Sprite Nesting": "Anidamiento de objetos", + "Stage": "Escenario", + "Stage height": "Altura del escenario", + "Stage selected:\nno motion primitives": "Está seleccionado un escenario:\nlas primitivas de movimiento\nno están disponibles", + "Stage size": "Tamaño del escenario", + "Stage size...": "Tamaño del escenario…", + "Stage width": "Anchura del escenario", + "Stop": "Detener", + "Stop sound": "detiene este sonido", + "Streams (lazy lists)": "Streams (listas perezosas)", + "Strings, Multi-line input": "", + "Stroked Ellipse\n(shift: circle)": "trazo de elipse\n(⇧ = círculo)", + "Stroked Rectangle\n(shift: square)": "trazo de rectángulo\n(⇧ = cuadrado)", + "Switch back to user mode": "Regresar a modo usuario", + "Switch to dev mode": "Cambiar a modo desarrollador", + "Switch to vector editor?": "¿Cambiar al editor vectorial?", + "Table lines": "Líneas de tablas", + "Table support": "Soporte para tablas", + "Table view": "Visor de tablas", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Términos y condiciones de uso…", + "Ternary Boolean slots": "Huecos booleanos triestado", + "Text": "Texto", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "La torre numérica completa de Scheme. \"UTILIZAR BIGNUMS \" para activarla.", + "The question came up at": "La pregunta apareció en", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "Esto convertirá tus objetos vectoriales en mapas de puntos,", + "This will erase your current drawing.": "Esto borrará el dibujo actual.", + "Thread safe scripts": "Hilos de ejecución seguros", + "Title text": "Texto", + "Today": "Hoy", + "Today,": "Hoy,", + "Top": "Arriba del todo", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Bucles tradicionales (while, until, etc...) + el \"named let\" de Lisp (una generalización del for) + iteración funcional (invocación repetida de una función) y composición de funciones.", + "Translations": "Traducciones", + "Translators...": "Traductores…", + "Turbo mode": "Modo turbo", + "Turtle": "Tortuga", + "Undelete sprites...": "Restaurar objetos…", + "Unpublish": "Despublicar", + "Unpublish Project": "Despublicar proyecto", + "Unsaved Changes!": "¡Cambios sin guardar!", + "Unshare": "No compartir", + "Unshare Project": "Dejar de compartir", + "Untitled": "Sin Título", + "Unused blocks...": "Bloques no utilizados…", + "Unverified account:": "Cuenta no verificada.", + "Up": "Subir", + "Updating project list...": "Actualizando lista de proyectos…", + "Uploading": "Cargando", + "Upvar - make internal variable visible to caller": "Salida (hace visible una variable interna)", + "Use CPU for graphics": "", + "User name must be four characters or longer": "el nombre de usuario ha de tener como mínimo 4 caracteres", + "User name:": "Nombre de usuario:", + "Variable name": "Nombre de variable", + "Variables": "Variables", + "Variadic reporters": "Reporteros de aridad variable", + "Vector": "Vectorial", + "Vector Paint Editor": "Editor de imágenes vectoriales", + "Versions of +, x, AND, and OR that take more than two inputs.": "Versiones de +, x, AND, y OR que toman más de dos argumentos.", + "Visible stepping": "Depuración paso a paso", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Acceso a servicios web (https)", + "Words, sentences": "Palabras, frases", + "World Map": "Mapamundi", + "World...": "Mundo…", + "Would you like to replace it?": "¿Quieres reemplazarlo?", + "Yes": "Sí", + "Yesterday": "Ayer", + "Yesterday,": "Ayer,", + "You are not logged in": "No has iniciado sesión", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "Tienes", + "Zebra coloring": "Coloreado de cebra", + "Zoom blocks": "Tamaño de bloques", + "Zoom blocks...": "Tamaño de bloques…", + "_ at _": "_ en _", + "_ combine _ using _": "_ combinar los elementos de _ con _", + "_ contains _": "¿ _ contiene _ ?", + "_ effect": "efecto _", + "_ find first item _ in _": "_ primer elemento donde _ en _", + "_ in front of _": "_ delante de _", + "_ keep items _ from _": "_ mantener los elementos donde _ de _", + "_ map _ over _": "_ mapear _ sobre _", + "_ mod _": "_ módulo _", + "_ of _": "_ de _", + "_ of block _": "_ del bloque _", + "_ of costume _": "_ del disfraz _", + "_ of sound _": "_ del sonido _", + "_ of text _": "_ del texto _", + "_ to _": "_ a _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "un nuevo clon de _", + "a variable of name": "no existe ninguna variable llamada", + "about morphic.js...": "acerca de morphic.js…", + "abs": "valor absoluto", + "acos": "arcocoseno", + "add _ to _": "añadir _ a _", + "add a new Turtle sprite": "añade una nueva tortuga", + "add a new sprite": "añadir un objeto nuevo", + "add comment": "añadir comentario", + "add comment here...": "añadir comentario aquí…", + "agent": "agente", + "alert _": "mostrar mensaje _", + "all": "todos", + "all <": "todos los <", + "all =": "todos los =", + "all >": "todos los >", + "all but first of _": "_ sin el primer elemento", + "all but first letter of %txt": "todas menos la primera letra de %txt", + "all but this script": "todos los programas excepto este", + "all identical": "todos idéntico", + "all scenes": "todos escenas", + "all ≤": "todos los ≤", + "all ≥": "todos los ≥", + "alpha value:": "valor alfa", + "anchor": "anclaje", + "and": "y", + "and send": "y enviar", + "and you will not be able to convert them back into vector drawings.": "y no podrás volverlo a convertir en un diseño vectorial.", + "animation demo": "demo: animación", + "answer": "respuesta", + "any": "cualquier", + "any key": "cualquier tecla", + "any message": "cualquier mensaje", + "anything": "cualquier cosa", + "append _": "anexar _", + "arrange scripts\nvertically": "alinea los programas\nverticalmente", + "arrowDown": "flecha abajo", + "arrowDownThin": "flecha fina abajo", + "arrowDownOutline": "flecha abajo (contorno)", + "arrowLeft": "flecha izquierda", + "arrowLeftThin": "flecha fina izquierda", + "arrowLeftRightThin": "flecha fina izquierda-derecha", + "arrowLeftOutline": "flecha izquierda (contorno)", + "arrowRight": "flecha derecha", + "arrowRightThin": "flecha fina derecha", + "arrowRightOutline": "flecha derecha (contorno)", + "arrowUp": "flecha arriba", + "arrowUpDownThin": "flecha fina arriba-abajo", + "arrowUpThin": "flecha fina arriba", + "arrowUpOutline": "flecha arriba (contorno)", + "asin": "arcoseno", + "ask _ and wait": "preguntar _ y esperar", + "ask _ for _ _": "preguntar a _ por _ _", + "atan": "arcotangente", + "attach...": "vincular…", + "b": "b", + "back": "trasera", + "balance": "balance", + "big (2x)": "grande (×2)", + "bigger menu fonts and sliders": "fuentes y deslizadores más grandes", + "bins": "resolución", + "block": "bloque", + "block deletion dialog text": "¿Seguro que quieres eliminar este bloque personalizado y todas sus instancias?", + "block variables": "variables de bloque", + "block variables...": "variables de bloque…", + "block-solid (0)": "bloque sólido (0)", + "blockify": "en forma de bloques", + "blocks": "bloques", + "blue": "azul", + "blurred shadows...": "sombras difuminadas…", + "blurry shades, use for new browsers": "sombras difuminadas (para navegadores modernos)", + "bold": "negrita", + "bottom": "inferior", + "box": "caja", + "brightness": "brillo", + "broadcast _ _": "enviar mensaje _ _", + "broadcast _ _ and wait": "enviar mensaje _ _ y esperar", + "brush": "pincel", + "build": "construye", + "but getting a": "pero se recibió un", + "c": "c", + "call _ _": "llamar _ _", + "call _ w/continuation": "llamar _ con continuación", + "caller": "", + "camera": "cámara", + "can only write text or numbers, not a": "", + "can rotate": "puede girar", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "sensibilidad a mayúsculas/minúsculas", + "categories": "categorías", + "category": "categoría", + "ceiling": "techo", + "center": "centro", + "center x": "centro x", + "center y": "centro y", + "change _ by _": "incrementar _ en _", + "change _ effect by _": "cambiar efecto _ en _", + "change background _ by _": "aumenta _ del fondo en _", + "change balance by _": "aumenta el balance en _", + "change pen _ by _": "cambiar _ del lápiz en _", + "change pen color by _": "cambiar color de lápiz en _", + "change pen shade by _": "cambiar brillo de lápiz en _", + "change pen size by _": "cambiar tamaño de lápiz en _", + "change size by _": "cambiar tamaño en _", + "change tempo by _": "cambiar tempo en _", + "change volume by _": "cambiar volumen en _", + "change x by _": "cambiar x en _", + "change y by _": "cambiar y en _", + "check for alternative\nGUI design": "marcar para utilizar\nla interfaz alternativa", + "check for block\nto text mapping features": "marcar para activar el\nsoporte de conversión de\nbloques a código", + "check for flat ends of lines": "marcar para dibujar líneas\ncon extremos rectos", + "check for higher contrast table views": "marcar para ver tablas con un mayor contraste", + "check for higher resolution, uses more computing resources": "marcar para una mayor resolución (usa más recursos de computación)", + "check for multi-column list view support": "marcar para visualizar listas multicolumna como tablas", + "check for sprite inheritance features": "marcar para activar el soporte de herencia de objetos", + "check to allow empty Boolean slots": "marcar para permitir huecos booleanos vacíos", + "check to always show slot\ntypes in the input dialog": "marcar para mostrar automáticamente\nlos tipos en el editor de parámetros", + "check to cache inputs boosts recursion": "marcar para cachear entradas (dispara la recusión)", + "check to disable\ndirectly running blocks\nby clicking on them": "marcar para deshabilitar\nla ejecución directa\nal pulsar en los bloques", + "check to disallow\nscript reentrance": "marcar para no permitir\nla reentrada de programas", + "check to distinguish upper- and\n lowercase when comparing texts": "marcar para distinguir mayúsculas/minúsculas\nal comparar textos", + "check to enable IDE animations": "marcar para activar las animaciones del IDE", + "check to enable alternating colors for nested blocks": "marcar para activar la alternación de colores para bloques anidados", + "check to enable auto-wrapping inside nested block stacks": "marcar para permitir que bloques tipo C puedan encapsular a otros más internos", + "check to enable camera support": "marcar para activar el soporte de cámara", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "marcar para activar las etiquetas dinámicas para entradas variables", + "check to enable\ninput sliders for\nentry fields": "marcar para activar\nlos deslizadores en los\ncampos de entrada", + "check to enable keyboard editing support": "marcar para activar el soporte de edición de teclado", + "check to enable project data in URLs": "marcar para incluir datos del proyecto en las URLs", + "check to enable saving linked sublist identities": "marcar para permitir guardar las identidades de sublistas enlazadas", + "check to enable sprite composition": "marcar para activar la composición de objetos", + "check to enable support for first-class sprite": "marcar para activar el soporte de objetos de primera clase", + "check to enable using operators on lists and tables": "", + "check to hide (+) symbols\nin block prototype labels": "marcar para ocultar los «+»\nen las definiciones de bloques", + "check to inherit from": "marcar para heredar de", + "check to prevent contents\nfrom being saved": "marcar para no guardar el contenido\njunto con el proyecto", + "check to prioritize\nscript execution": "marcar para priorizar\nla ejecución del programa", + "check to rasterize SVGs on import": "marcar para rasterizar los SVGs tras haberlos importado", + "check to run\nthe edited script\nwhen moving the slider": "marcar para ejecutar\nel programa editado\ncuando se mueva el deslizador", + "check to show all blocks in a single palette": "marcar para mostrar\ntodos los bloques\nen una única paleta", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension\nprimitives in the palette": "marcar para mostrar primitivas\nde extensiones en la paleta", + "check to show in palette": "marcar para mostrar en la paleta", + "check to support\nnative JavaScript functions": "marcar para activar el soporte\npara funciones nativas en JavaScript", + "check to switch pen colors\nand graphic effects to HSL": "marcar para cambiar colores\nde lápiz y efectos gráficos a HSL", + "check to turn\nblock clicking\nsound on": "marcar para que suene\nun «clic» cuando\nse coloque un bloque", + "check to turn on\nlogging pen vectors": "marcar para activar\ngrabación vectorial del lápiz", + "check to turn on\n visible stepping (slow)": "marcar para activar la\ndepuración paso a paso (lento)", + "check to use blurred drop shadows and highlights": "marcar para usar sombras y brillos difuminados", + "checkedBox": "casilla marcada", + "children": "hijos", + "choose another color for this morph": "cambia el color de este morph", + "choose the World's background color": "selecciona el color de fondo del Mundo", + "circle": "círculo", + "circle box": "caja circular", + "circleSolid": "círculo (sólido)", + "clean up": "ordenar", + "clear": "borrar", + "clear graphic effects": "quitar efectos gráficos", + "clear undrop queue": "vaciar historial de cambios", + "click or drag crosshairs to move the rotation center": "haz clic o arrastra el punto de mira para mover el centro de rotación", + "clicked": "hagan clic", + "clone": "clonar", + "clones": "clones", + "closedBrush": "brochazo cerrado", + "cloud": "nube", + "cloud unavailable without a web server.": "nube no disponible sin un servidor web.", + "cloudGradient": "nube (degradado)", + "cloudOutline": "nube (contorno)", + "code": "código", + "code mapping...": "mapeo a código…", + "code of _": "código de _", + "collection": "colección", + "color": "color", + "color _ is touching _ ?": "¿color _ tocando _ ?", + "color palette": "paleta de color", + "color picker": "medidor de color", + "color...": "color…", + "color:": "color:", + "columns": "columnas", + "combinations _": "combinaciones _", + "combinations": "combinaciones", + "combine _ using _": "combinar los elementos de _ con _", + "comic": "historieta", + "command": "comando", + "comment": "comentario", + "comment pic...": "imagen de comentario…", + "compile": "compilar", + "compile _": "compilar _", + "compile _ for _ args": "", + "confetti": "confeti", + "console log _": "registrar en consola _", + "continuation": "continuación", + "continuations cannot be forked": "", + "cos": "coseno", + "costume": "disfraz", + "costume #": "# de disfraz", + "costume name": "nombre del disfraz", + "costumes": "disfraces", + "costumes tab help": "Puedes importar un disfraz de otro sitio web o\ndesde tu ordenador arrastrándolo hasta aquí", + "could not connect to:": "", + "cr": "retorno de carro", + "create a clone of _": "crear clon de _", + "cross": "cruz", + "crosshairs": "punto de mira", + "csv": "coma", + "current": "actual", + "current _": "_ actual", + "current module versions:": "Versiones actuales de los módulos:", + "current parent": "padre actual", + "custom?": "¿personalizado?", + "cut from _": "recortar desde _", + "d": "d", + "dangling?": "¿cuelgo de otro objeto?", + "data": "datos", + "date": "día", + "day of week": "día de la semana", + "days left": "días restantes", + "days left.": "días restantes.", + "decode URI": "decodificar URI", + "decode URI component": "decodificar componente URI", + "defaults": "predeterminados", + "define _ _ _": "definir _ _ _", + "definition": "definición", + "delete": "eliminar", + "delete _": "eliminar _", + "delete _ of _": "borrar _ de _", + "delete a category...": "eliminar una categoría…", + "delete block": "eliminar bloque", + "delete block _": "eliminar bloque", + "delete block definition...": "eliminar definición de bloque…", + "delete slot": "eliminar una ranura", + "delete solution": "eliminar solución", + "delete this clone": "eliminar este clon", + "delete variable": "eliminar variable", + "delimiter": "delimitador", + "demo (1.2x)": "demo (×1.2)", + "demo...": "demo…", + "detach all parts": "desvincular todo", + "detach and put into the hand": "permite moverlo a otro lugar", + "detach from": "desvincular de", + "development mode": "modo desarrollador", + "development mode debugging primitives:": "primitivas de depuración del modo desarrollador:", + "development mode...": "modo desarrollador…", + "dial": "disco", + "dimensions": "dimensiones", + "direction": "dirección", + "disable deep-Morphic context menus and show user-friendly ones": "desactiva los menús contextuales de Morphic y muestra otros más fáciles de utilizar", + "disable developers' context menus": "desactiva los menús contextuales de desarrollador", + "disable dragging media\nand blocks out of\nwatchers and balloons": "deshabilitar el arrastre\nde medios y bloques\nfuera de monitores y globos", + "disconnected.": "Desconectado.", + "distance": "distancia", + "distance to _": "distancia a _", + "distribution": "distribución", + "does not exist in this context": "en este contexto", + "don't rotate": "no girar", + "down arrow": "↓ (flecha abajo)", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "descargar programa", + "download this script\nas an XML file": "descarga este programa\ncomo un archivo XML", + "draggable": "arrastrable", + "draggable?": "¿arrastrable?", + "dragging threshold": "umbral de arrastre", + "dropped": "arrastren y me suelten", + "duplicate": "duplicar", + "duplicate block definition...": "duplicar definición de bloque…", + "duration": "duración", + "e": "e", + "e^": "e^", + "edge": "borde del escenario", + "edit": "editar", + "edit rotation point only...": "editar solo punto de rotación…", + "edit the costume's\nrotation center": "editar el centro de\nrotación del disfraz", + "edit...": "editar…", + "editables": "campos editables", + "elegant (90)": "elegante (90)", + "ellipse": "elipse", + "empty word? _": "¿palabra vacía?", + "empty sentence? _": "¿frase vacía?", + "enable Morphic context menus and inspectors, not user-friendly!": "activa los menus contextuales e inspectores de Morphic (¡no son fáciles de utilizar)", + "enable automatic line wrapping": "activa el ajuste de línea automático", + "encode URI": "codificar URI", + "encode URI component": "codificar componente URI", + "enter": "retorno", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "Se ha activado el modo desarrollador. El cacheo de errores está desactivado, usa la consola del navegador para ver mensajes de error.", + "entering user mode": "Se ha activado el modo usuario.", + "eraser": "goma de borrar", + "exceeding maximum number of clones": "número máximo de clones excedido", + "expecting": "se esperaban las entradas", + "expecting a": "se esperaba un", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "experimental (en construcción)", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportar", + "export block definition...": "exportar definición de bloque…", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "Exportar proyecto como datos en la nube…", + "export project media only...": "Exportar solo medios del proyecto…", + "export project without media...": "Exportar proyecto sin medios…", + "export script": "exportar secuencia", + "export script...": "exportar secuencia…", + "export...": "exportar…", + "extract": "extraer", + "extract solution": "extraer solución", + "f": "f", + "false": "falso", + "file": "archivo", + "file menu import hint": "importa proyectos, bloques, disfraces o sonidos", + "fill": "rellenar", + "fill page...": "rellenar página", + "filtered for _": "filtrado por _", + "find blocks": "buscar bloques", + "find blocks...": "buscar bloques…", + "find first item _ in _": "primer elemento donde _ en _", + "find unused global custom blocks and remove their definitions": "busca bloques personalizados que no se estén siendo utilizados y borra sus definiciones", + "fisheye": "ojo de pez", + "flag": "bandera", + "flash": "relámpago", + "flat line ends": "punta de lápiz plana", + "flatten": "aplanar", + "flip ↔": "girar ↔", + "flip ↕": "girar ↕", + "flip vertical": "girar horizontalmente", + "flip horizontal": "girar verticalmente", + "flipHorizontal": "giro horizontal", + "flipVertical": "giro vertical", + "floor": "suelo", + "footprints": "huellas de pasos", + "for _ = _ to _ _": "para _ = _ hasta _ _", + "generate a Parson\'s Puzzle\nfrom the current sprite": "genera un puzzle de Parsons\ndel objeto actual", + "for all sprites": "para todos los objetos", + "for each _ in _ _": "para cada _ de _ _", + "for this sprite only": "solo para este objeto", + "forever _": "repetir y repetir _", + "frame": "panel", + "frames": "cuadros", + "frequencies": "frecuencias", + "frequency": "frecuencia", + "front": "delantera", + "fullScreen": "pantalla completa", + "g": "g", + "gearBig": "engranaje grande", + "gearPartial": "engranaje parcial", + "gears": "engranaje", + "get blocks": "obtener bloques", + "get data": "obtener datos", + "ghost": "fantasma", + "giant (8x)": "gigantesco (×8)", + "glide _ secs to x: _ y: _": "deslizar en _ s a x: _ y: _", + "glide, grow and rotate using easing functions.": "Deslizamientos, zooms y rotaciones utilizando funciones curva.", + "global?": "¿global?", + "globe": "mundo", + "globeBig": "mundo grande", + "go back _ layers": "enviar _ capas hacia atrás", + "go to _": "ir a _", + "go to _ layer": "enviar a la capa _", + "go to x: _ y: _": "ir a x: _ y: _", + "gray scale palette": "paleta de grises", + "green": "verde", + "grow": "ampliar", + "h": "h", + "handle": "muesca", + "header": "cabecera", + "header mapping...": "mapeo a cabecera…", + "height": "alto", + "hello": "hola", + "help": "ayuda", + "help...": "ayuda…", + "hex sha512 hash": "hash sha512 (hexadecimal)", + "hide": "esconder", + "hide all...": "ocultar todos…", + "hide blanks": "ocultar espacios", + "hide blocks...": "ocultar bloques…", + "hide characters": "ocultar caracteres", + "hide primitives": "ocultar primitivas", + "hide variable _": "esconder variable _", + "high": "", + "hour": "hora", + "http:// _": "", + "hue": "tonalidad", + "huge (4x)": "enorme (×4)", + "i": "i", + "identical to": "idéntico a", + "if _ _ _": "si _ _ _", + "if _ _ else _": "si _ _ si no _", + "if _ then _ else _": "si _ entonces _ si no _", + "if on edge, bounce": "rebotar si toca un borde", + "import a sound from your computer\nby dragging it into here": "Puedes importar un sonido desde tu ordenador\narrastrándolo hasta aquí", + "import without attempting to parse or format data": "", + "import...": "importar…", + "in palette": "en la paleta", + "including dependencies": "incluyendo dependencias", + "index": "índice", + "index of _ in _": "posición de _ en _", + "inherit _": "heredar _", + "inherited": "heredado", + "input list:": "con lista de argumentos:", + "input names:": "parámetros:", + "input(s), but getting": "pero se ha encontrado", + "inputs": "argumentos", + "insert _ at _ of _": "insertar _ en _ de _", + "insert a slot": "insertar una ranura", + "insert a variable": "insertar una variable", + "inspect...": "inspeccionar", + "is _ ?": "¿es _ ?", + "is _ a _ ?": "¿es _ un _ ?", + "is _ empty?": "¿está _ vacía?", + "is _ on?": "¿parámetro _ activo?", + "is not a valid option": "no es una opción válida", + "is read-only": "es de solo lectura", + "item": "elemento", + "item _ of _": "elemento _ de _", + "items": "elementos", + "j": "j", + "join _": "unir _", + "jukebox": "gramola", + "k": "k", + "keep all submorphs within and visible": "retiene dentro y hace visibles todos los sub-morphs", + "keep items _ from _": "mantener los elementos donde _ de _", + "key": "tecla", + "key _ pressed?": "¿tecla _ pulsada?", + "keyboard": "teclado", + "keyboardFilled": "teclado (sólido)", + "l": "l", + "label": "etiqueta", + "large": "grande", + "last": "último", + "launch _ _": "iniciar _ _", + "left": "izquierda", + "left arrow": "← (flecha izquierda)", + "length": "longitud", + "length of _": "longitud de _", + "length: ": "longitud: ", + "let the World automatically adjust to browser resizing": "hace que el Mundo se ajuste automáticamente cuando se redimensione el navegador", + "letter": "letra", + "letter _ of _": "letra _ de _", + "light (70)": "claro (70)", + "lightness": "luminosidad", + "line": "línea", + "lines": "líneas", + "list": "lista", + "listNarrow": "lista estrecha", + "list _": "lista _", + "list view...": "ver como lista…", + "ln": "ln", + "location": "ubicación", + "lock": "bloquear", + "log pen vectors": "registrar los dibujos como vectores", + "login": "iniciar sesión", + "loop": "repetición", + "low": "baja", + "lower case": "minúsculas", + "m": "m", + "magnifierOutline": "lupa (contorno)", + "magnifyingGlass": "lupa", + "make a block...": "crear bloque…", + "make a category...": "crear categoría…", + "make a copy\nand pick it up": "crea una copia y permite\nmoverla a otra parte", + "make a morph": "crear un morph", + "make temporary and hide in the sprite corral": "lo hace temporal y oculta en el corral de objetos", + "make this morph movable": "permite que este morph se pueda mover", + "make this morph unmovable": "impide que este morph se pueda mover", + "map String to code _": "", + "map _ of _ to code _": "mapear _ de _ a código _", + "map _ over _": "mapear _ sobre _", + "map _ to _ _": "mapear _ a _ _", + "max": "máxima", + "maximum": "máximo", + "medium (50)": "medio (50)", + "menu": "menú", + "menus": "menús", + "message": "mensaje", + "messages": "mensajes", + "microphone _": "_ del micro", + "middle": "centro", + "minimum": "mínimo", + "minute": "minuto", + "mirror video": "espejo sobre el vídeo", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruoso (×10)", + "month": "mes", + "mosaic": "mosaico", + "motion": "movimiento", + "mouse down?": "¿ratón pulsado?", + "mouse position": "posición del ratón", + "mouse x": "x del ratón", + "mouse y": "y del ratón", + "mouse-departed": "dejen de tocar con el ratón", + "mouse-entered": "toquen con el ratón", + "mouse-pointer": "puntero del ratón", + "move": "mover", + "move _ steps": "avanzar _ pasos", + "move all inside...": "mover todos dentro…", + "move...": "mover…", + "multi-line": "multilínea", + "my": "mi", + "my _": "mi(s) _", + "my anchor": "atributo ancla", + "my dangling?": "¿atributo colgando?", + "my draggable?": "¿atributo arrastrable?", + "my name": "mi nombre", + "my parent": "mi padre", + "my rotation style": "atributo estilo de rotación", + "my rotation x": "atributo rotación x", + "my rotation y": "atributo rotación y", + "my temporary?": "¿mi temporal?", + "myself": "mí mismo", + "n": "n", + "name": "nombre", + "neg": "negativo", + "negative": "negativo", + "neighbors": "vecinos", + "neighbors ≠": "vecinos ≠", + "new costume _ width _ height _": "nuevo disfraz _ con ancho _ y alto _", + "new line": "salto de línea", + "new sound _ rate _ Hz": "nuevo sonido _ a _ Hz", + "new...": "nuevo mensaje…", + "next": "siguiente", + "next costume": "siguiente disfraz", + "none": "ninguno", + "normal": "normal", + "normal (1x)": "normal (×1)", + "normal style": "estilo normal", + "normal weight": "grosor normal", + "normalScreen": "pantalla normal", + "normalStage": "escenario normal", + "not": "no", + "not _": "no _", + "note": "notas", + "notes": "notas musicales", + "nothing": "nada", + "now connected.": "", + "number": "número", + "number of channels": "número de canales", + "numbers from _ to _": "números de _ a _", + "o": "o", + "object _": "objeto _", + "objects": "objetos", + "octagon": "octógono", + "only duplicate this block": "duplicar solo este bloque", + "only face left/right": "mirar solo a izquierda y derecha", + "only grab this block": "sacar solo este bloque", + "open a new window with a picture of this morph": "abre una nueva ventana con una imagen de este morph", + "open a new window with a picture of this script": "abre una nueva ventana con una imagen de este programa", + "open a window on all properties": "abre una ventana con todas las propiedades", + "open in another dialog...": "abrir en otro diálogo", + "open in dialog...": "abrir en diálogo…", + "open shared project from cloud...": "Abrir proyecto compartido en la nube…", + "options": "opciones", + "options...": "opciones…", + "or": "o", + "or before": "o antes", + "other clones": "otros clones", + "other scripts in sprite": "el resto de programas del objeto", + "other sprites": "otros objetos", + "p": "p", + "paint a new sprite": "dibuja un nuevo objeto", + "paintbucket": "bote de pintura", + "parameters": "parámetros", + "parent": "padre", + "parent...": "padre…", + "parts": "partes", + "password has been changed.": "contraseña cambiada.", + "password must be six\ncharacters or longer": "la contraseña ha de tener\ncomo mínimo 6 caracteres", + "passwords do\nnot match": "las contraseñas\nno coinciden", + "paste on _": "pegar en _", + "pause": "pausa", + "pause all _": "pausar todos _", + "pen": "tortuga", + "pen _": "_ del lápiz", + "pen down": "bajar lápiz", + "pen down?": "¿lápiz bajado?", + "pen trails": "rastro del lápiz", + "pen up": "subir lápiz", + "pen vectors": "vectores dibujados", + "piano keyboard": "teclado de piano", + "pic...": "imagen…", + "pick random _ to _": "número al azar entre _ y _", + "pick up": "coger", + "pipe _ $arrowRight _": "inyectar _ $arrowRight _", + "pipette": "cuentagotas", + "pitch": "tono", + "pivot": "pivote", + "pixel": "píxel", + "pixelate": "pixelado", + "pixels": "píxeles", + "play _ Hz for _ secs": "sonar a _ Hz durante _ s", + "play frequency _ Hz": "sonar con frecuencia _ Hz", + "play note _ for _ beats": "tocar la nota _ durante _ pulsos", + "play sound _": "reproducir sonido _", + "play sound _ at _ Hz": "reproducir sonido _ a _ Hz", + "play sound _ until done": "reproducir sonido _ hasta el final", + "please agree to\nthe TOS": "por favor, acepta los\ntérminos y condiciones de uso", + "please fill out\nthis field": "por favor, completa\neste campo", + "please provide a valid\nemail address": "por favor, escribe una\ndirección de correo válida", + "point in direction _": "apuntar en dirección _", + "point towards _": "apuntar hacia _", + "pointRight": "apuntar a la derecha", + "polygon": "polígono", + "position": "posición", + "poster": "póster", + "predicate": "predicado", + "presentation (1.4x)": "presentación (×1.4)", + "pressed": "aprieten", + "previous": "previo", + "processes": "procesos", + "product": "producto", + "published.": "Publicado.", + "publishing project...": "Publicando proyecto…", + "q": "q", + "r": "r", + "r-g-b-a": "r-g-b-a", + "random": "aleatorio", + "random position": "posición al azar", + "rank": "rango", + "raw data...": "", + "ray length": "longitud de rayo", + "read-only": "solo lectura", + "receivers...": "receptores…", + "recording": "grabación", + "rectangle": "rectángulo", + "rectangleSolid": "rectángulo (sólido)", + "red": "rojo", + "redo the last undone\nblock drop\nin this pane": "rehace el último cambio\ndeshecho en este panel", + "redraw the screen once": "redibuja la pantalla", + "redrop": "rehacer", + "relabel...": "renombrar…", + "release": "liberar", + "remove block variables...": "eliminar variables de bloque…", + "rename": "renombrar", + "rename all blocks that\naccess this variable": "renombra todos los bloques\nque acceden a esta variable", + "rename all...": "renombrar todos…", + "rename background": "renombrar fondo", + "rename costume": "renombrar disfraz", + "rename only\nthis reporter": "renombrar solo\neste reportero", + "rename sound": "Renombrar sonido", + "rename...": "renombrar…", + "repeat _ _": "repetir _ _", + "repeat until _ _": "repetir hasta que _ _", + "replace item _ of _ with _": "reemplazar elemento _ de _ con _", + "replaceables": "reemplazables", + "report _": "reportar _", + "reporter": "reportero", + "reporter didn't report": "", + "reset columns": "reiniciar columnas", + "reset timer": "reiniciar cronómetro", + "reshape _ to _": "redistribuir _ en _", + "resize...": "redimensionar…", + "resolution": "resolución", + "rest for _ beats": "silencio durante _ pulsos", + "restore display": "restaurar pantalla", + "result pic...": "imagen con resultado…", + "reverse": "inversión", + "right": "derecha", + "right arrow": "→ (flecha derecha)", + "ring": "timbre", + "ringify": "encapsular", + "robot": "", + "rotate": "rotar", + "rotation style": "estilo de rotación", + "rotation x": "rotación x", + "rotation y": "rotación y", + "round _": "redondear _", + "run _ _": "ejecutar _ _", + "run _ w/continuation": "ejecutar _ con continuación", + "s": "s", + "sample morphs": "morphs de muestra", + "sample rate": "frecuencia de muestreo", + "samples": "muestras", + "saturation": "saturación", + "save _ as costume named _": "guardar _ en disfraz _", + "save a picture\nof all scripts": "guarda una imagen\nde todos los programas", + "save a picture of both\nthis script and its result": "guarda una imagen de este programa\ny su resultado", + "save a picture\nof the stage": "guarda una imagen\ndel escenario", + "save a picture\nof this comment": "guarda una imagen\nde este comentario", + "save a picture\nof this script": "guarda una imagen\nde este programa", + "save a summary\nof this project": "guarda un resumen\nde este proyecto", + "save global custom block definitions as XML": "guarda las definiciones de bloques personalizados como XML", + "save project data as XML\nto your downloads folder": "guarda el proyecto en XML\nen tu carpeta de descargas", + "saved.": "Guardado.", + "say _": "decir _", + "say _ for _ secs": "decir _ durante _ s", + "scope": "ámbito", + "screenshot": "imagen", + "screenshot...": "captura de pantalla…", + "script": "programa", + "script pic with result...": "imagen de programa con resultado…", + "script pic...": "imagen de programa…", + "script variables _": "variables locales _", + "scripts": "programas", + "scripts pic...": "imagen de programas…", + "scroll frame": "panel con deslizadores", + "scrolled-down": "giren la rueda del ratón hacia arriba", + "scrolled-up": "giren la rueda del ratón hacia abajo", + "second": "segundo", + "select": "seleccionar", + "selection": "selección", + "self": "propio", + "send _ to _": "enviar _ a _", + "senders...": "emisores…", + "sensor demo": "demo: sensor", + "separators": "separadores", + "set _ effect to _": "fijar efecto _ a _", + "set _ of block _ to _": "fijar _ del bloque _ a _", + "set _ to _": "fijar _ a _", + "set background _ to _": "fijar _ del fondo a _", + "set background color to _": "fijar color del fondo a _", + "set balance to _": "fijar balance a _", + "set instrument to _": "fijar instrumento a _", + "set pen _ to _": "fijar _ del lápiz a _", + "set pen color to _": "fijar color del lápiz a _", + "set pen shade to _": "fijar brillo del lápiz a _", + "set pen size to _": "fijar tamaño del lápiz a _", + "set size to _ %": "fijar tamaño a _ %", + "set tempo to _ bpm": "fijar tempo a _", + "set this morph's alpha value": "fijar la transparencia de este morph", + "set turbo mode to _": "fijar modo turbo a _", + "set video transparency to _": "fijar la transparencia del vídeo a _", + "set volume to _ %": "fijar volumen al _ %", + "set x to _": "fijar x a _", + "set y to _": "fijar y a _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "marcar para impedir que los bloques puedan ocupar el lugar de otros al ser soltados", + "several block definitions already match this label": "", + "shared.": "Compartido.", + "sharing project...": "Compartiendo proyecto…", + "sharp drop shadows use for old browsers": "sombras nítidas (para navegadores antiguos)", + "sharp shadows...": "sombras nítidas…", + "shimmering (80)": "reluciente (80)", + "show": "mostrar", + "show a handle which can be dragged to change this morph's extent": "muestra una muesca que puede ser arrastrada para cambiar el tamaño de este morph", + "show a handle which can be dragged to move this morph": "muestra una muesca que puede ser arrastrada para mover este morph", + "show a picture of all scripts and block definitions": "muestra una imagen con todos los programas y definiciones de bloques", + "show all": "mostrar todos", + "show all...": "mostrar todos…", + "show project data as XML in a new browser window": "muestra el proyecto en XML en una nueva ventana del navegador", + "show table _": "mostrar tabla _", + "show the World's menu": "muestra el menú del Mundo", + "show variable _": "mostrar variable _", + "shown?": "¿visible?", + "shrink": "reducir", + "shuffled": "mezclado", + "signals": "señales", + "sin": "seno", + "size": "tamaño", + "slider": "deslizador", + "slider max...": "máximo valor del deslizador…", + "slider min...": "mínimo valor del deslizador…", + "slots": "ranuras", + "smallStage": "escenario pequeño", + "smaller menu fonts and sliders": "fuentes y deslizadores más pequeños", + "snap": "instantánea", + "sort": "ordenar", + "solutions": "", + "sorted": "en orden", + "sound": "sonido", + "sounds": "sonidos", + "space": "espacio", + "special": "especial", + "specify the distance the hand has to move before it picks up an object": "especifica cuánto hay que arrastrar un objeto para comenzar a moverlo", + "spectrum": "espectro", + "speech bubble": "bocadillo emergente", + "speechBubble": "bocadillo", + "speechBubbleOutline": "bocadillo (contorno)", + "split _ by _": "separar _ por _", + "sprite": "objeto", + "sprites": "objetos", + "sqrt": "raíz cuadrada", + "square": "cuadrado", + "stack size": "tamaño de pila", + "stage": "escenario", + "stage image": "imagen del escenario", + "stamp": "sellar", + "standard settings": "perfil de ordenador", + "static": "estático", + "stay signed in on this computer\nuntil logging out": "Mantener la sesión iniciada\nen este ordenador", + "stepForward": "siguiente paso", + "stick this morph to another one": "pega este morph a otro", + "stick to": "pegar a", + "stop _": "detener _", + "stop all sounds": "detener todos los sonidos", + "stop frequency": "parar la frecuencia", + "stopped": "pare", + "storage": "almacenamiento", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "encoger _ x: _ y: _ %", + "string": "cadena de texto", + "subtle (95)": "sutil (95)", + "sum": "suma", + "svg...": "SVG…", + "switch to costume _": "cambiar al disfraz _", + "switch to scene _ _": "cambiar al escenario _", + "t": "t", + "tab": "", + "table view...": "ver como tabla…", + "take a camera snapshot and\nimport it as a new sprite": "hace una captura de cámara y\nla importa como un nuevo objeto", + "tan": "tangente", + "tell _ to _ _": "decir a _ que _ _", + "tempo": "", + "temporary?": "¿soy temporal?", + "text": "texto", + "text-only (100)": "solo texto (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "No hay bloques personalizados no utilizados en este proyecto", + "there are currently no vectorizable pen trail segments": "", + "thing": "algo", + "think _": "pensar _", + "think _ for _ secs": "pensar _ durante _ s", + "this _": "este _", + "this block": "este bloque", + "this project doesn't have any custom global blocks yet": "este proyecto no tiene todavía ningún bloque personalizado", + "this script": "este programa", + "tick": "tic", + "time in milliseconds": "tiempo en milisegundos", + "timer": "cronómetro", + "tip": "punta", + "to": "a", + "top": "arriba del todo", + "touch screen settings": "configuración de pantallas táctiles", + "touching _ ?": "¿tocando el color _ ?", + "transient": "excluir al guardar", + "translations": "traducciones", + "translations...": "traducciones…", + "transparency": "transparencia", + "transparency...": "transparencia…", + "trash": "papelera", + "trash is empty": "papelera vacía", + "trashFull": "papelera llena", + "true": "verdadero", + "turbo mode": "modo turbo", + "turbo mode?": "¿modo turbo?", + "turn _ _ degrees": "girar _ _ grados", + "turn all pen trails and stamps\ninto a new background for the stage": "convierte todo rastro del lápiz\nen un nuevo fondo para el escenario", + "turn all pen trails and stamps\ninto a new costume for the\ncurrently selected sprite": "convierte todo rastro del lápiz\nen un nuevo disfraz para el\nobjeto actualmente seleccionado", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnAround": "giro completo", + "turnBack": "ir atrás", + "turnForward": "ir adelante", + "turnLeft": "giro a la izquierda", + "turnRight": "giro a la derecha", + "turtle": "tortuga", + "turtleOutline": "tortuga (contorno)", + "type": "tipo", + "type of _": "tipo de _", + "u": "u", + "unable to convert to": "no se puede convertir a", + "unable to inherit (disabled or circular?)": "no se puede heredar (¿deshabilitado o en bucle?)", + "unable to nest (disabled or circular?)": "no se puede anidar (¿deshabilitado o en bucle?)", + "uncheck for default\nGUI design": "desmarcar para utilizar\nla interfaz predeterminada", + "uncheck for less contrast multi-column list views": "desmarcar para ver tablas con un menor contraste", + "uncheck for lower resolution, saves computing resources": "desmarcar para una menor resolución (ahorra recursos de computación)", + "uncheck for round ends of lines": "desmarcar para dibujar líneas con extremos redondeados", + "uncheck for smooth scaling of vector costumes": "desmarcar para usar escalado suave en imágenes vectoriales", + "uncheck to allow dropped reporters to kick out others": "desmarcar para permitir que los bloques puedan ocupar el lugar de otros al ser soltados", + "uncheck to allow script reentrance": "desmarcar para permitir la reentrada de programas", + "uncheck to always show (+) symbols\nin block prototype labels": "desmarcar para mostrar los «+»\nen las definiciones de bloques", + "uncheck to confine auto-wrapping to top-level block stacks": "desmarcar para que bloques tipo C solo puedan encapsular a otros más externos", + "uncheck to disable IDE animations": "desmarcar para desactivar las animaciones del IDE", + "uncheck to disable alternating colors for nested block": "desmarcar para desactivar la alternación de colores para bloques anidados", + "uncheck to disable block to text mapping features": "desmarcar para desactivar el soporte de conversión de bloques a código", + "uncheck to disable camera support": "desmarcar para desactivar el soporte de cámara", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "desmarcar para desactivar las etiquetas dinámicas para entradas variables", + "uncheck to disable\ninput sliders for\nentry fields": "desmarcar para desactivar\nlos deslizadores en\nlos campos de entrada", + "uncheck to disable keyboard editing support": "desmarcar para desactivar el soporte de edición de teclado", + "uncheck to disable multi-column list views": "desmarcar para no visualizar listas multicolumna como tablas", + "uncheck to disable project data in URLs": "desmarcar para no incluir datos del proyecto en las URLs", + "uncheck to disable saving linked sublist identities": "desmarcar para impedir guardar las identidades de sublistas enlazadas", + "uncheck to disable sprite composition": "desmarcar para desactivar la composición de objetos", + "uncheck to disable sprite inheritance features": "desmarcar para desactivar el soporte de herencia de objetos", + "uncheck to disable support for first-class sprites": "desmarcar para desactivar el soporte de objetos de primera clase", + "uncheck to disable support for\nnative JavaScript functions": "desmarcar para desactivar el soporte\npara funciones nativas en JavaScript", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disinherit": "desmarcar para no heredar", + "uncheck to drag media\nand blocks out of\nwatchers and balloons": "desmarcar para arrastrar\nmedios y bloques\nfuera de monitores y globos", + "uncheck to enable\ndirectly running blocks\nby clicking on them": "desmarcar para ejecutar\ndirectamente los bloques\nal pulsar en ellos", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension\nprimitives in the palette": "desmarcar para quitar primitivas\nde extensiones de la paleta", + "uncheck to hide in palette": "desmarcar para quitar de la paleta", + "uncheck to ignore upper- and\n lowercase when comparing texts": "desmarcar para ignorar mayúsculas/minúsculas\nal comparar textos", + "uncheck to limit Boolean slots to true / false": "desmarcar para restringir los huecos booleanos a verdadero / falso", + "uncheck to run scripts\nat normal speed": "desmarcar para ejecutar los\nprogramas a velocidad normal", + "uncheck to save contents\nin the project": "desmarcar para guardar el contenido\njunto con el proyecto", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "desmarcar para no cachear entradas (para depurar el evaluador)", + "uncheck to suppress\nrunning scripts\nwhen moving the slider": "desmarcar para no\nejecutar el programa\ncuando se mueva el deslizador", + "uncheck to switch pen colors\nand graphic effects to HSV": "desmarcar para cambiar colores\nde lápiz y efectos gráficos a HSV", + "uncheck to turn\nblock clicking\nsound off": "desmarcar para que\nno suene el «clic» al\ncolocar un bloque", + "uncheck to turn off\nlogging pen vectors": "desmarcar para desactivar\ngrabación vectorial del lápiz", + "uncheck to turn off\nvisible stepping": "desmarcar para desactivar\nla depuración paso a paso", + "uncheck to use solid drop shadows and highlights": "desmarcar para usar sombras y brillos sólidos", + "uncheck to use the input\ndialog in short form": "desmarcar para usar el\neditor de parámetros sencillo", + "uncompile": "descompilar", + "undo": "deshacer", + "undo the last\nblock drop\nin this pane": "deshace el último cambio\nhecho en este panel", + "undrop": "deshacer", + "unicode _ as letter": "unicódigo _ como letra", + "unicode of _": "unicódigo de _", + "uniques": "únicos", + "unlock": "desbloquear", + "unpublished.": "No publicado", + "unpublishing project...": "Cancelando publicación…", + "unringify": "desencapsular", + "unshared.": "no compartido.", + "unsharing project...": "dejando de compartir proyecto…", + "unsupported attribute": "atributo no soportado", + "unsupported data type": "tipo de datos no soportado", + "unsupported graphic effect": "efecto gráfico no soportado", + "untitled": "sin título", + "unused": "sin usar", + "unused block(s) removed": "bloque(s) no utilizado(s) eliminados", + "up arrow": "↑ (flecha arriba)", + "upper case": "mayúsculas", + "url...": "URL…", + "use the keyboard\nto enter blocks": "utilizar el teclado\npara escribir bloques", + "user features...": "opciones de usuario…", + "user mode...": "modo usuario…", + "v": "v", + "value": "valor", + "variable": "variable", + "variables": "variables", + "verticalEllipsis": "puntos en vertical", + "video _ on _": "_ de vídeo sobre _", + "video capture": "captura de vídeo", + "volume": "volumen", + "w": "w", + "wait _ secs": "esperar _ s", + "wait until _": "esperar hasta que _", + "wardrobe": "guardarropa", + "warp _": "unificar _", + "what's your name?": "¿cuál es tu nombre?", + "when I am _": "cuando me _", + "when I receive _ _": "cuando me llegue _ _", + "when I start as a clone": "cuando comience como clon", + "when _": "cuando _", + "when _ clicked": "cuando se pulse _", + "when _ is edited _": "cuando se edite _ con _", + "when _ key pressed _": "cuando se pulse la tecla _ _", + "whirl": "remolino", + "whitespace": "espacio", + "width": "ancho", + "with": "con", + "with data": "con datos", + "with inputs": "con argumentos", + "word": "palabra", + "world": "mundo", + "write _ size _": "escribir _ con tamaño _", + "x": "x", + "x position": "posición x", + "y": "y", + "y position": "posición y", + "year": "año", + "year:": "año:", + "your own": "los tuyos propios", + "z": "z" +}; diff --git a/elements/pl-snap/Snap/locale/lang-et.js b/elements/pl-snap/Snap/locale/lang-et.js new file mode 100644 index 00000000..215ae6eb --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-et.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.et = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "“ selles kontekstis ei eksisteeri", + "(-90) left": "(-90) vasakule", + "(0) up": "(0) üles", + "(1) sine": "", + "(180) down": "(180) alla", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) paremale", + "(empty)": "(tühi)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "(ajutine)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snap! info", + "About...": "Snap! info ...", + "Account created.": "Konto on loodud.", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "E-kiri parooliga saadeti sinu antud aadressile.", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animatsioonid", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Mistahes tüüp (ei arvestata)", + "Any type": "Mistahes tüüpi", + "Apply": "Rakenda", + "April": "áprill", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Oled kindel, et soovid projekti kustutada?", + "Are you sure you want to publish": "Oled sa kindel, et soovid avaldalda?", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "Oled sa kindel, et soovid avaldamise lõpetada?", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "august", + "Back...": "Tagasi ...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Sünnikuupäev:", + "Bitmap": "", + "Block Editor": "Ploki redaktor", + "Blocks": "Plokid", + "Blocks category name:": "", + "Blurred shadows": "Udused varjud", + "Boolean": "tõeväärtus", + "Boolean (T/F)": "Tõeväärtus", + "Boolean (unevaluated)": "Tõeväärtus (eo arvestata)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "Brauser", + "Brush size": "Joone laius", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Loobu", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "Parooli muutmine", + "Change Password...": "Muuda parooli ...", + "Change block": "Ploki muutmine", + "Clear backup": "", + "Clicking sound": "Klõpsuv heli", + "Closed brush (free draw)": "", + "Cloud": "Pilv", + "Code mapping": "", + "Codification support": "Kodifitseerimise tugi", + "Colors and Crayons": "", + "Command": "Käsk", + "Command (C-shape)": "Käsuplokk (C-kujuline)", + "Command (inline)": "Käsuplokk", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Soovid kujundi proportsioone piirata? (proovi SHIFT klahvi all hoida)", + "Contents": "Sisu", + "Contributors": "Kaastööd teinud", + "Control": "Juhtimine", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Kostüümi redaktor", + "Costumes": "Kostüümid", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Argumendi loomine", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Tänud ...", + "Custom Block Translations": "", + "Database": "", + "December": "detsember", + "Default": "Vaikeväärtus", + "Default Value:": "Vaikeväärtus:", + "Delete": "Kustuta", + "Delete Custom Block": "Kustuta omaloodud plokk", + "Delete Project": "Kustuta projekt", + "Delete a variable": "Kustuta muutuja", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Laadi lähtekood alla", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "Lapsevanema või hooldaja e-posti aadress:", + "E-mail address:": "E-posti aadress:", + "ERROR: INVALID PASSWORD": "VIGA: VALE PAROOL", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Argumendi muutmine", + "Edit label fragment": "Ploki fragmendi muutmine", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Tühi", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Kustukumm", + "Error": "", + "Examples": "Näited", + "Execute on slider change": "", + "Export Project As...": "Projekti eksport kui ...", + "Export all scripts as pic...": "Ekspordi kõik skriptid pilti ...", + "Export blocks": "Plokkide eksport", + "Export blocks...": "Ekspordi plokid ...", + "Export project as plain text...": "Ekspordi projekt tavatekstiks ...", + "Export project...": "Ekspordi projekt ...", + "Export summary with drop-shadows...": "", + "Export summary...": "Ekspordi kokkuvõte ...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "veebruar", + "Fetching project from the cloud...": "Projekti allalaadimine pilvest ...", + "Fill a region": "Ala täitmine", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "Täidetud ellips (shift: ring)", + "Filled Rectangle (shift: square)": "Täidetud ristkülik (shift: ruut)", + "First-Class Sprites": "", + "Flat design": "Lame kasutajaliides", + "Flat line ends": "Sirged jooneotsad", + "For all Sprites": "Kõikidele spraitidele", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Tere!", + "Hello, World!": "", + "Help": "Abi", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Hmm ...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "Ma olen Teenuse Tingimusi lugenud ja nendega nõustunud", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "Import -", + "Import a new costume from your webcam": "", + "Import blocks": "Plokkide import", + "Import library": "Impordi teek", + "Import sound": "Helide import", + "Import tools": "Impordi tööriistad", + "Import...": "Import ...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Pärimise tugi", + "Input Names:": "", + "Input Slot Options": "", + "Input name": "Argument", + "Input sliders": "Liugurid sisenditel", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "jaanuar", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript funktsioon ( _ ) { _ }", + "July": "juuli", + "June": "juuni", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Klaviatuurilt muudatuste tegemise tugi", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Keel ...", + "Libraries...": "Teegid ...", + "License": "Litsents", + "License...": "Litsents ...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "Joon (shift: vertikaalne/horisontaalne)", + "List": "Loend", + "List utilities": "", + "Lists": "Loendid", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Logi sisse ...", + "Logout": "Logi välja", + "Long form input dialog": "", + "Looks": "Välimus", + "Make a block": "Uus plokk", + "Make a variable": "Uus muutuja", + "Manipulate costumes pixel-wise.": "", + "March": "märts", + "May": "mai", + "Message name": "Teate nimi", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Moodulid ...", + "Motion": "Liikumine", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Mitu sisendit (sisendite loend)", + "Nested auto-wrapping": "", + "New": "Uus", + "New Category": "", + "New Project": "Uus projekt", + "New category...": "", + "New password:": "Uus parool:", + "New scene": "", + "No": "Ei", + "November": "november", + "Number": "Arv", + "OK": "", + "Object": "", + "October": "oktoober", + "Ok": "", + "Old password:": "Kehtiv parool:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Ava", + "Open Project": "Ava projekt", + "Open in Community Site": "", + "Open...": "Ava ...", + "Opening project...": "Projekti avamine ...", + "Operators": "Operaatorid", + "Other": "Muud", + "Output text using speech synthesis.": "", + "Paint Editor": "Joonistusala", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Vabakäe joonistamine", + "Parallelization": "", + "Part of": "", + "Parts": "Osad", + "Password:": "Parool:", + "Pen": "Pliiats", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipett (värvi võtmine)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "Esita", + "Play sound": "Helifaili esitamine", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikaat", + "Prefer empty slot drops": "Tühjade pesade eelistamine", + "Prefer smooth animations": "Sujuvate animatsioonide eelistamine", + "Privacy...": "Privaatsus ...", + "Project Notes": "Projekti märkmed", + "Project URLs": "", + "Project notes...": "Projekti märkmed ...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "SVG-de rasteriseerimine", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "", + "Remove a category...": "", + "Remove unused blocks": "Eemalda kasutamata plokid", + "Repeat Password:": "", + "Repeat new password:": "Uue parooli kordus:", + "Replace Project": "", + "Replace the current project with a new one?": "Kas asendada see projekt uuega?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funktsioon", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Lähtesta parool ...", + "Reset password": "Parooli lähtestamine", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "SVG kostüümid pole veel kõigis brauserites täielikult toetatud.", + "Same Named Blocks": "", + "Save": "Salvesta", + "Save As...": "Salvesta kui ...", + "Save Project": "Projekti salvestamine", + "Save Project As...": "Salvesta projekt kui ...", + "Save to disk": "Salvesta kettale", + "Saved!": "Salvestatud.", + "Saving project to the cloud...": "Projekti salvestamine pilve ...", + "Scenes...": "", + "Script variable name": "Skriptimuutuja nimi", + "Scripts": "Skriptid", + "Select a costume from the media library": "Kostüümi valimine meediateegist.", + "Select a sound from the media library": "Helifaili valimine meediateegist.", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Taju", + "September": "september", + "Serial Ports": "", + "Service:": "Teenus:", + "Set RGB or HSV pen color": "", + "Set the rotation center": "Pöörlemiskeskme määramine", + "Share": "Jaga", + "Share Project": "Projekti jagamine", + "Show buttons": "", + "Show categories": "", + "Sign in": "Logi sisse", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Tekita konto ...", + "Single input.": "Üksik sisend.", + "Single palette": "", + "Slider maximum value": "Liuguri maksimumväärtus", + "Slider minimum value": "Liuguri miinimumväärtus", + "Snap! website": "Snap! koduleht", + "Snap!Cloud": "Snap! pilv", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Heli", + "Sound Recorder": "", + "Sounds": "Helid", + "Sprite": "Sprait", + "Sprite Nesting": "", + "Stage": "Taust", + "Stage height": "Lava kõrgus", + "Stage selected: no motion primitives": "Hetkel on valitud taust ja sellel liikumiskäske pole.", + "Stage size": "Lava suurus", + "Stage size...": "Lava suurus ...", + "Stage width": "Lava laius", + "Stop": "Peata", + "Stop sound": "Esitamise peatamine", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Ellips (shift: ring)", + "Stroked Rectangle (shift: square)": "Ristkülik (shift: ruut)", + "Switch back to user mode": "Tagasi kasutajarežiimi", + "Switch to dev mode": "Lülitu arendusrežiimi", + "Switch to vector editor?": "", + "Table lines": "Jooned tabelitel", + "Table support": "Tabelite tugi", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Teenuse Tingimused ...", + "Ternary Boolean slots": "", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Skriptide ohutu käivitamine", + "Title text": "Nimi", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Tõlkijad", + "Translators...": "Tõlkijad ...", + "Turbo mode": "Turbokiirus", + "Turtle": "Nool", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Lõpeta jagamine", + "Unshare Project": "Projekti jagamise lõpetamine", + "Untitled": "Nimetu", + "Unused blocks...": "Kasutamata plokid ...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "Projektide nimekirja uuendamine ...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Sisemine muutuja tehakse väljakutsujale nähtavaks", + "Use CPU for graphics": "", + "User name must be four characters or longer": "Kasutajanimes peab olema vähemalt neli sümbolit.", + "User name:": "Kasutajanimi:", + "Variable name": "Muutuja nimi", + "Variables": "Muutujad", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuaalne klaviatuur", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Jah", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "Sa pole end sisse loginud", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Sebravärvid", + "Zoom blocks": "Plokkide suurendus", + "Zoom blocks...": "Plokkide suurendus ...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ sisaldab _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ loendi _ algusesse", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ / _ jääk", + "_ of _": "_ kostüümil _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "muutujat nimega „", + "about morphic.js...": "", + "abs": "absoluutväärtus", + "acos": "acos", + "add _ to _": "lisa _ loendisse _", + "add a new Turtle sprite": "", + "add a new sprite": "Lisa uus sprait", + "add comment": "Lisa kommentaar", + "add comment here...": "Kommentaarid kirjuta siia ...", + "agent": "", + "alert _": "Popup dialoog: _", + "all": "kõik tööd", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "kõik kirjed peale esimese loendis _", + "all but this script": "kõigi teiste skriptide töö", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "ja", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "vastus", + "any": "", + "any key": "mistahes klahv", + "any message": "Mistahes teade", + "anything": "", + "append _": "", + "arrange scripts vertically": "Paiguta skriptid vertikaalselt", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "küsi _ ja oota", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "suured (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Kas kustutada see plokk ja kõik selle koopiad?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "plokid", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "heledus", + "broadcast _ _": "saada teade _ _", + "broadcast _ _ and wait": "saada teade _ _ ja oota", + "brush": "", + "build": "ehita", + "but getting a": "", + "c": "c", + "call _ _": "kutsu välja _ _", + "call _ w/continuation": "kutsu jätkuga välja _", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "Saab vabalt pöörelda", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "ümardamine üles", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "muuda muutujat _ _ võrra", + "change _ effect by _": "muuda efekti _ _ võrra", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "muuda pliiatsi värvi _ võrra", + "change pen shade by _": "muuta pliiatsi heledust _ võrra.", + "change pen size by _": "muuta pliiatsi jämedust _ võrra", + "change size by _": "muuda suurust _ võrra", + "change tempo by _": "muuda tempot _ võrra", + "change volume by _": "", + "change x by _": "muuda x väärtust _ võrra", + "change y by _": "muuda y väärtust _ võrra", + "check for alternative GUI design": "Alternatiivse kasutajaliidese disaini kasutamiseks lülita see sisse.", + "check for block to text mapping features": "Kui soovid kasutada plokkide tekstiks teisendamist, lülita see sisse.", + "check for flat ends of lines": "Sirgete jooneotste tekitamiseks lülita see sisse.", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "Kui soovid, et animatsioonid oleks kõigil platvormidel sujuvad, lülita see sisse.", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "Skriptide töö katkestamise ja jätkamise (reentrance) keelamiseks lülita see sisse.", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "IDE-s animatsioonide kasutamiseks lülita see sisse.", + "check to enable alternating colors for nested blocks": "", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "Mobiilsetel seadmetel virtuaalse klaviatuuri kasutamiseks lülita see sisse.", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "Sisu projekti mitte salvestamiseks lülita see sisse.", + "check to prioritize script execution": "Skriptide jooksutamise eelistamiseks lülita see sisse.", + "check to rasterize SVGs on import": "SVG graafika rasteriseerimiseks impordil lülita see sisse.", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "Plokkide ühendamisel tekkiva klõpsuva heli kuulmiseks lülita see sisse.", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "Uduste piirete kasutamiseks varjudel ja esiletõstudel lülita see sisse.", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "ring", + "circle box": "", + "circleSolid": "täidetud ring", + "clean up": "Puhasta", + "clear": "puhasta", + "clear graphic effects": "eemalda graafikaefektid", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Pöörlemiskeskme muutmiseks lohista risti.", + "clicked": "vajutatakse hiirega", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "pilv", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "kood", + "code mapping...": "", + "code of _": "_ kood", + "collection": "", + "color": "", + "color _ is touching _ ?": "kas värv _ puudutab värvi _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "muaree", + "command": "käsuplokk", + "comment pic...": "megjegyzés képe…", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "värvimuutus", + "console log _": "Kirjuta konsoolile: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "kostüümi nr", + "costume name": "kostüümi nimi", + "costumes": "", + "costumes tab help": "Pilte saad Snapi'i lisada lohistades neid oma arvutist või veebilehtedelt siia.", + "could not connect to:": "Ühendust ei õnnestunud luua:", + "cr": "reavahetus (cr)", + "create a clone of _": "tekita _ kloon", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "Hetkel kasutusel olevad moodulid:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "Kustuta", + "delete _": "", + "delete _ of _": "kustuta _ kirje(d) loendist _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "Kustuta ploki definitsioon ...", + "delete slot": "", + "delete this clone": "kustuta see kloon", + "delete variable": "", + "delimiter": "eraldaja", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "Eralda kõik osad", + "detach and put into the hand": "", + "detach from": "Eralda", + "development mode": "Arendusrežiim", + "development mode debugging primitives:": "Arendusrežiimi silumismeetodid:", + "development mode...": "", + "dimensions": "", + "direction": "suund", + "disable deep-Morphic context menus and show user-friendly ones": "Lülitab Morphic kontekstmenüüd välja, et kasutajasõbralikke näidata.", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "kaugus objektini _", + "distribution": "", + "don't rotate": "Ei pöörle üldse", + "down arrow": "nool alla", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "Hiirega lohistatav", + "draggable?": "", + "dragging threshold": "", + "dropped": "kukutatakse", + "duplicate": "Kopeeri", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "serva", + "edit": "Muuda", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "Muuda ...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "Lülitab sisse Morphic kontekstmenüüd ja inspektorid. See pole kasutajale.", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "kustukumm", + "exceeding maximum number of clones": "", + "expecting": "Oodati", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "Eksport", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "Eksport ...", + "extract": "", + "f": "f", + "false": "väär", + "file": "", + "file menu import hint": "Eksporditud projekti, plokkide teegi, kostüümi või heli laadimine.", + "fill": "täida värviga", + "fill page...": "", + "filtered for _": "", + "find blocks": "", + "find blocks...": "Otsi plokke ...", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "Otsib projektist üles kasutamata kasutaja loodud plokid ja eemaldab nende definitsioonid.", + "fisheye": "", + "flag": "lipp", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "Flipi ↔", + "flip ↕": "Flipi ↕", + "floor": "ümardamine alla", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "Kõigile spraitidele", + "for each _ in _ _": "", + "for this sprite only": "Ainult sellele spraidile", + "forever _": "lõputult _", + "frame": "", + "frames": "", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "läbipaistvus", + "giant (8x)": "hiiglaslikud (8x)", + "glide _ secs to x: _ y: _": "liigu _ s punkti x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "vii _ kihti tahapoole", + "go to _": "liigu _ juurde", + "go to _ layer": "", + "go to front": "too ette", + "go to x: _ y: _": "liigu punkti x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "Suurenda", + "h": "h", + "handle": "", + "header": "päis", + "header mapping...": "", + "height": "", + "hello": "Tere", + "help": "Abi", + "help...": "Abi ...", + "hide": "peida", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "Peida primitiivid", + "hide variable _": "peida muutuja _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "väga suured (4x)", + "i": "i", + "identical to": "sama kui", + "if _ _": "kui _ _", + "if _ _ else _": "kui _ _ vastasel juhul _", + "if _ then _ else _": "", + "if on edge, bounce": "kui serval, põrka tagasi", + "import a sound from your computer by dragging it into here": "Helifaile saad Snap'i lisada lohistades neid oma arvutist siia.", + "import without attempting to parse or format data": "", + "import...": "Import ...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "", + "input names:": "", + "input(s), but getting": "sisendit/sisendeid, kuid saadi", + "inputs": "", + "insert _ at _ of _": "lisa _ asukohta _ loendis _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "on _ ?", + "is _ a _ ?": "on _ _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ kirje loendis _", + "items": "Elemendid", + "j": "j", + "join _": "ühendatud _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "kas klahv _ on all?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Eesti", + "language_translator": "Hasso Tepper", + "large": "Suur", + "last": "viimane", + "last changed": "Viimati muudetud", + "last_changed": "2016-03-01", + "launch _ _": "käivita taustal _ _", + "left": "", + "left arrow": "nool vasakule", + "length": "", + "length of _": "teksti _ pikkus", + "length:": "pikkus:", + "let the World automatically adjust to browser resizing": "", + "letter": "sümbol", + "letter _ of _": "sümbol nr _ tekstis _", + "light (70)": "", + "lightness": "", + "line": "realõpp (lf)", + "lines": "", + "list": "loend", + "list _": "loend _", + "list view...": "Nimekirja vaade ...", + "ln": "ln", + "load the official library of powerful blocks": "Laadib juurde ametliku võimalusterohke plokkide teegi.", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "Tekita uus plokk ...", + "make a category...": "", + "make a copy and pick it up": "Tekitab koopia ja korjab selle üles", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "teade", + "microphone _": "", + "middle": "Keskkohas", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "koletud (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "kas hiire nupp on all?", + "mouse position": "", + "mouse x": "hiire asukoht x-teljel", + "mouse y": "hiire asukoht y-teljel", + "mouse-departed": "hiirekursor lahkub", + "mouse-entered": "hiirekursor saabub", + "mouse-pointer": "hiirekursori", + "move": "Liiguta", + "move _ steps": "liigu _ sammu", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "minu", + "n": "n", + "name": "", + "neg": "", + "negative": "negatiiv", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "Uus ...", + "next": "", + "next costume": "järgmine kostüüm", + "none": "", + "normal": "Tavaline", + "normal (1x)": "normaalsed (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "pole _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "arv", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "Kopeerib ainult selle ploki", + "only face left/right": "Saab osutada ainult paremale ja vasakule", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "Avab uue brauseriakna selle projekti kokkuvõttega.", + "open a new window with a picture of all scripts": "Avab uues aknas pildi kõigi skriptidega.", + "open a new window with a picture of the stage": "Avab uues aknas lava pildi.", + "open a new window with a picture of this comment": "új ablak megnyitása ennek a megjegyzésnek a képével", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "Avab uue akna vaid selle skripti pildiga", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "Ava dialoogis ...", + "open shared project from cloud...": "", + "options...": "valikud ...", + "or": "või", + "or before": "", + "other clones": "", + "other scripts in sprite": "kõigi selle spraidi teiste skriptide töö", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "värviämber", + "parameters": "parameetrid", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "parool on muudetud.", + "password must be six characters or longer": "Paroolis peab olema vähemalt kuus sümbolit.", + "passwords do not match": "Paroolid ei kattu.", + "paste on _": "", + "pause": "paus", + "pause all _": "peata kõik _", + "pen": "Pliiats", + "pen _": "", + "pen down": "pliiats alla", + "pen down?": "", + "pen trails": "pliiatsi joone", + "pen up": "pliiats üles", + "pen vectors": "", + "pic...": "Pilt ...", + "pick random _ to _": "juhuslik arv _ ja _ vahel", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "Pipett", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "noot _ _ lööki", + "play sound _": "mängi heli _", + "play sound _ at _ Hz": "", + "play sound _ until done": "mängi heli _ lõpuni", + "please agree to the TOS": "Palun nõustu teenuse tingimustega.", + "please fill out this field": "Palun täida see väli.", + "please provide a valid email address": "Palun sisesta korrektne e-posti aadress.", + "point in direction _": "osuta suunda _", + "point towards _": "osuta _ suunas", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predikaat", + "presentation (1.4x)": "esitus (1.4x)", + "pressed": "vajutatakse klahvi", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "mistahes", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "ainult loetav", + "receivers...": "", + "recording": "", + "rectangle": "ristkülik", + "rectangleSolid": "täidetud ristkülik", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "Nimeta ümber ...", + "release": "", + "remove block variables...": "", + "rename": "Nimeta ümber", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "Kostüümi ümbernimetamine", + "rename only this reporter": "", + "rename sound": "Nimeta ümber", + "rename...": "Nimeta ümber ...", + "repeat _ _": "korda _ korda _", + "repeat until _ _": "korda kuni _ _", + "replace item _ of _ with _": "asenda _ kirje loendis _ väärtusega _", + "report _": "tagasta _", + "reporter": "funktsioon", + "reporter didn't report": "", + "reset columns": "Lähtesta veerud", + "reset timer": "nulli taimer", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "paus _ lööki", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "nool paremale", + "ring": "", + "ringify": "Ümbritse ringiga", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "ümardatud _", + "run _ _": "käivita _ _", + "run _ w/continuation": "käivita jätkuga _", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "salvestatud.", + "say _": "ütle _", + "say _ for _ secs": "ütle _ _ sekundit", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "Skripti pilt ...", + "script variables _": "skriptimuutujad _", + "scripts": "", + "scripts pic...": "Skriptide pilt ...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "määra efekti _ väärtuseks _", + "set _ of block _ to _": "", + "set _ to _": "aseta muutujasse _ väärtus _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "määra pliiatsi värviks _", + "set pen shade to _": "määra pliiatsi heleduseks _ %", + "set pen size to _": "määra pliiatsi jämeduseks _", + "set size to _ %": "määra suuruseks _ %", + "set tempo to _ bpm": "määra tempoks _ lööki/min", + "set this morph's alpha value": "", + "set turbo mode to _": "määra turborežiimi väärtuseks _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "määra x väärtuseks _", + "set y to _": "määra y väärtuseks _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Funktsioonide lohistamisel ja kukutamisel tühjadele pesadele keskendumiseks lülita see sisse.", + "several block definitions already match this label": "", + "shared.": "jagatud.", + "sharing project...": "Projekti jagamine ...", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "näita", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "Näitab pilti kõigi skriptide ja plokkide definitsioonidega.", + "show all": "Näita kõiki", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Näitab uues brauseri aknas XML vormingus kasutaja loodud plokkide definitsioone.", + "show primitives": "Näita primitiive", + "show project data as XML in a new browser window": "Näitab uues brauseri aknas XML vormingus projekti.", + "show table _": "", + "show the World's menu": "", + "show variable _": "näita muutujat _", + "shown?": "", + "shrink": "Vähenda", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "suurus", + "slider": "Liugur", + "slider max...": "Maksimum ...", + "slider min...": "Miinimum ...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "tühik", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "jutumull", + "speechBubbleOutline": "", + "split _ by _": "tükeldatud _ kohalt _", + "sprite": "", + "sprites": "", + "sqrt": "ruutjuur", + "square": "ruut", + "stack size": "pinu suurus", + "stage": "lava", + "stage image": "", + "stamp": "tempel", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "lõpeta _", + "stop all sounds": "peata kõigi helide mängimine", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Salvestab selle projekti allalaadimiste kausta (kui brauser seda toetab).", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "vaheta kostüümiks _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulaator (tab)", + "table view...": "Tabeli vaade ...", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "tekst", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "Selles projektis pole hetkel kasutaja loodud kasutamata plokke.", + "there are currently no vectorizable pen trail segments": "", + "thing": "midagi", + "think _": "mõtle _", + "think _ for _ secs": "mõtle _ _ sekundit", + "this _": "", + "this block": "selle ploki töö", + "this project doesn't have any custom global blocks yet": "Selles projektis pole veel ühtegi omaloodud plokki.", + "this script": "selle skripti töö", + "time in milliseconds": "aeg (ms)", + "timer": "taimer", + "tip": "Tipus", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "kas puudutab värvi _ ?", + "transient": "Ajutine", + "translations": "", + "translations...": "", + "translator_e-mail": "hasso.tepper@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "tõene", + "turbo mode": "", + "turbo mode?": "turborežiim?", + "turn _ _ degrees": "pööra _ _ kraadi", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "kilpkonn", + "turtleOutline": "", + "type": "", + "type of _": "_ tüüp", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "Parema kiiruse, kuid kõikuva kaadrisageduse kasutamiseks lülita see sisse.", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "Ümarate jooneotste tekitamiseks lülita see välja.", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "Et lubada kukutatavatel funktsioonidel teisi oma kohalt välja lüüa, lülita see välja.", + "uncheck to allow script reentrance": "Skriptide töö katkestamise ja jätkamise (reentrance) lubamiseks lülita see välja.", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "IDE animatsioonide keelamiseks lülita see välja.", + "uncheck to disable alternating colors for nested block": "", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "Mobiilsetel seadmetel virtuaalse klaviatuuri kasutamise keelamiseks lülita see välja.", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "Skriptide normaalkiirusel jooksutamiseks lülita see välja.", + "uncheck to save contents in the project": "Sisu projekti salvestamiseks lülita see välja.", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "Plokkide ühendamisel tekkiva klõpsuva heli vaigistamiseks lülita see välja.", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "Konkreetsete piirete kasutamiseks varjudel ja esiletõstudel lülita see välja.", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "Võta tagasi", + "undo the last block drop in this pane": "Tõstab viimase asetatud ploki uuesti üles.", + "undrop": "Tõsta üles", + "unicode _ as letter": "Unicode _ sümbol", + "unicode of _": "_ Unicode", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "Eemalda ring", + "unshared.": "jagamine lõpetatud.", + "unsharing project...": "Projekti jagamise lõpetamine ...", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Nimetu", + "unused": "", + "unused block(s) removed": "Kasutamata plokid on eemaldatud.", + "up arrow": "nool üles", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "muutujad", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "oota _ sekundit", + "wait until _": "oota kuni _", + "wardrobe": "", + "warp _": "warpkiirusega _", + "what's your name?": "Mis su nimi on?", + "when I am _": "kui minul _", + "when I receive _ _": "kui saan teate _ _", + "when I start as a clone": "kui alustan kloonina", + "when _": "kui _", + "when _ clicked": "kui vajutatakse _", + "when _ is edited _": "", + "when _ key pressed _": "kui vajutatakse klahvi _ _", + "whirl": "", + "whitespace": "tühik", + "width": "", + "with data": "", + "with inputs": "", + "word": "", + "world": "maailm", + "write _ size _": "", + "x": "x", + "x position": "asukoht x-teljel", + "y": "y", + "y position": "asukoht y-teljel", + "year": "", + "year:": "aasta:", + "your own": "ise oma", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-eu.js b/elements/pl-snap/Snap/locale/lang-eu.js new file mode 100644 index 00000000..25aeff63 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-eu.js @@ -0,0 +1,1412 @@ +SnapTranslator.dict.eu = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) ezkerrera", + "(0) up": "(0) gora", + "(1) sine": "(1) ∿∿ sinua", + "(180) down": "(180) behera", + "(2) square": "(2) ⎍⎍ karratua", + "(3) sawtooth": "(3) ⩘⩘ zerra", + "(4) triangle": "(4) ⋀⋀ triangulua", + "(90) right": "(90) eskuinera", + "(empty)": "(hutsa)", + "(in a new window)": "(leiho berri batean)", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item aren't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.)": "Zerrenda datu motaren aldaera bat, non zerrendako elementu bakoitza ez den kalkulatzen behar den arte. Horri esker, milioi bat elementuko, edo tamaina infinitoko, zerrendak sor ditzakezu, beharrezkoa dena baino denbora edo memoria gehiago erabili gabe. (Zenbaki lehen guztiak itzultzen dituen bloke bat gehitu da adibide bezala).", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snap-i buruz", + "About...": "Honi buruz...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Lerro anitzeko testu sarrera blokeetan", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the HTTP:// block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc.": "GET, POST, PUT eta DELETE eskaerak egiteko aukera ematen duen HTTP:// blokearen hedapena. HTTPS protokolo segurua erabiltzeko aukera eta goiburuen gaineko kontrola ere ematen du...", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "Animazioa", + "Animations": "Animazioak", + "Another custom block with this name exists.": "", + "Another custom block with this name exists. Would you like to replace it?": "Izen bereko bloke pertsonalizatu bat dago. Ordezkatu nahi duzu?", + "Any (unevaluated)": "Edozein (ez ebaluatua)", + "Any type": "Edozein mota", + "Apply": "Aplikatu", + "April": "Apirila", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Ziur zaude ezabatu nahi duzula?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "Audioa", + "August": "Abuztua", + "Author name…": "Egilearen izena...", + "Back...": "Atzera...", + "Backgrounds": "Atzeko planoak", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Jaiotza-data:", + "Bitmap": "Bit-mapa", + "Block Editor": "Bloke editorea", + "Blocks": "Blokeak", + "Blocks category name:": "", + "Blurred shadows": "Lausotutako itzalak", + "Boolean": "boolearra", + "Boolean (T/F)": "Boolearra (E/G)", + "Boolean (unevaluated)": "Boolearra (ez ebaluatua)", + "Bottom": "Behea", + "Bring back deleted sprites": "", + "Browser": "Nabigatzailea", + "Brush size": "Pintzelaren tamaina", + "Cache Inputs": "Sarreren cache-a", + "Camera": "", + "Camera not supported": "Kamera ezin da erabili", + "Camera support": "Kameraren euskarria", + "Cancel": "Utzi", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Atzeman programa bateko erroreak", + "Category color": "", + "Change Password": "Aldatu pasahitza", + "Change Password...": "", + "Change block": "Aldatu blokea", + "Clear backup": "", + "Clicking sound": "Klik egitean soinua", + "Closed brush (free draw)": "Pintzel itxia (marrazki librea)", + "Cloud": "Hodeia", + "Cloud Connection": "Hodeiko konexioa", + "Cloud URL": "Hodeiko URLa", + "Code mapping": "", + "Codification support": "Soporte de codificación", + "Colors and Crayons": "", + "Command": "Komandoa:", + "Command (C-shape)": "Komandoa (C itxura)", + "Command (inline)": "Komandoa (linean)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Mantendu formen proportzioak (edo mantendu maius ⇧ sakatuta)", + "Contents": "Edukiak", + "Contributors": "Laguntzaileak", + "Control": "Kontrola", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Mozorro editorea", + "Costumes": "Mozorroak", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Sortu sarrera", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Kredituak...", + "Custom Block Translations": "", + "Database": "", + "December": "Abendua", + "Default": "Lehenetsia", + "Default Value:": "Balio lehenetsia:", + "Delete": "Ezabatu", + "Delete Custom Block": "Ezabatu bloke pertsonalizatua", + "Delete Project": "Ezabatu proiektua", + "Delete a variable": "Ezabatu aldagaia", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "Behera", + "Download source": "Deskargatu iturburu-kodea", + "Dragging threshold": "Arrastatzeko atalasea", + "Dragging threshold...": "Arrastatzeko atalasea...", + "Dynamic input labels": "Sarrera etiketa dinamikoak", + "E-mail address of parent or guardian:": "Guraso edo tutorearen helbide elektronikoa", + "E-mail address:": "Helbide elektronikoa:", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "ESPERIMENTALA! markatu zuzeneko kontrol egitura pertsonalizatuak gaitzeko", + "EXPERIMENTAL! check to enable support for compiling": "ESPERIMENTALA! markatu konpilatzeko euskarria gaitzeko", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "ESPERIMENTALA! kendu marka zuzeneko kontrol egitura pertsonalizatuak desgaitzeko", + "EXPERIMENTAL! uncheck to disable live support for compiling": "ESPERIMENTALA! kendu marka zuzenean konpilatzeko euskarria desgaitzeko", + "Edge color (left click)": "", + "Edit input name": "Editatu sarrera", + "Edit label fragment": "Editatu etiketaren zatia", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "Eisenberg-en legea: Erabiltzaile interfaze grafiko bidez egin daitekeen edozein gauza programazio lengoaia erabiliz ere egin daiteke, eta alderantziz.", + "Ellipse (shift: circle)": "Elipsea (maius ⇧ = zirkulua)", + "Empty": "Hutsa", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Borragoma", + "Error": "", + "Examples": "Adibideak", + "Execute on slider change": "", + "Export Project As...": "esportatu proiektua honela...", + "Export all scripts as pic...": "Esportatu programa guztiak irudi bezala...", + "Export blocks": "Esportatu blokeak", + "Export blocks...": "Esportatu blokeak...", + "Export project as plain text...": "Esportatu proiektua testu arrunt bezala...", + "Export project...": "Esportatu proiektua...", + "Export summary with drop-shadows...": "Esportatu laburpena itzaldun irudiekin...", + "Export summary...": "Esportatu laburpena...", + "Exported!": "Esportatuta!", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "Otsaila", + "Fetching project from the cloud...": "Proiektua hodeitik eskuratzen...", + "Fill a region": "Betetzeko tresna", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "elipse betea (maius ⇧ = zirkulua)", + "Filled Rectangle (shift: square)": "Laukizuzen betea (maius ⇧ = karratua)", + "First-Class Sprites": "Lehen mailako objektuak", + "Flat design": "Diseinu laua", + "Flat line ends": "Arkatzaren arrastoen amaiera zuzenak", + "For all Sprites": "Objektu guztientzat", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Kaixo!", + "Hello, World!": "", + "Help": "Laguntza", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Umm...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "Irakurri ditut eta onartzen ditut zerbitzu-baldintzak", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "Inportatu", + "Import a new costume from your webcam": "inportatu mozorro berria web-kameratik", + "Import blocks": "Inportatu blokeak", + "Import library": "Inportatu liburutegia", + "Import sound": "", + "Import tools": "Inportatu tresnak", + "Import...": "Inportatu...", + "Imported": "", + "In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "Orokorrean, testu sarrerek lerro bakarra izaten dute. Bloke honek hainbat lerrotako testu sarrerak edukitzeko aukera ematen dizu. Testu sarrera erretenetan edo bestelako blokeetan erabil daiteke.", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Zehaztasun infinituko zenbaki osoak, arrazional zehatzak, konplexuak", + "Inheritance support": "Herentziaren euskarria", + "Input Names:": "Sarreren izenak:", + "Input Slot Options": "", + "Input name": "Sarrera", + "Input sliders": "Graduatzaile sarrerak", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iterazioa, konposizioa", + "JIT compiler support": "JIT konpiladorearen euskarria", + "January": "Urtarrila", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript funtzioa ( _ ) { _ }", + "July": "Uztaila", + "June": "Ekaina", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Teklatu edizioa", + "Kind of": "Mota", + "LEAP Motion controller": "LEAP mugimendu kontrolatzailea", + "Language...": "Hizkuntza...", + "Libraries...": "Liburutegiak...", + "License": "Lizentzia", + "License...": "Lizentzia...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "C bezalako lengoaietako \"switch\" edo Lisp-eko \"cond\"-en modukoa. Mila esker Nathan Dinsmore adar bakoitzerako bloke bereizia erabiltzeko ideia izateagatik!", + "Line tool (shift: constrain to 45º)": "Lerroa (maius ⇧ = mugatu 45°ra)", + "Line tool (shift: vertical/horizontal)": "Lerroa (maius ⇧ = bertikala/horizontala)", + "List": "Zerrenda", + "List utilities": "Zerrenden utilitateak", + "Lists": "Zerrendak", + "Live coding support": "Zuzenean programatzeko euskarria", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Hasi saioa...", + "Logout": "", + "Long form input dialog": "Sarreren elkarrizketa-koadro hedatua", + "Looks": "Itxura", + "Make a block": "Sortu blokea", + "Make a variable": "Sortu aldagaia", + "Manipulate costumes pixel-wise.": "", + "March": "Martxoa", + "May": "Maiatza", + "Message name": "Mezuaren izena", + "Method Editor": "Metodo editorea", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Modulua...", + "Motion": "Mugimendua", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Adar anitzeko baldintzak (switch)", + "Multiple inputs (value is list of inputs)": "Hainbat sarrera (balioa sarreren zerrenda da)", + "Nested auto-wrapping": "Habiaratutakoak automatikoki biltzea", + "New": "Berria", + "New Category": "", + "New Project": "Proiektu berria", + "New category...": "", + "New password:": "Pasahitz berria:", + "New scene": "", + "No": "Ez", + "November": "Azaroa", + "Number": "Zenbakia", + "OK": "Ados", + "Object": "Objektua", + "October": "Urria", + "Ok": "Ados", + "Old password:": "Pasahitz zaharra:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library (along with the JOIN WORDS block in the Tools library) brings back that idea.": "Testuak karaktere-kate soil gisa hartu ordez hitz eta esaldietan egituratutzea da, Scratch-en ez dagoen, Logo-ren ideia handietako bat. Liburutegi honek, Tresnak liburutegiko JOIN WORDS blokearekin batera, ideia hori berreskuratzen du.", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Ireki", + "Open Project": "Ireki proiektua", + "Open in Community Site": "", + "Open...": "Ireki...", + "Opening blocks...": "Blokeak irekitzen...", + "Opening project...": "Proiektua irekitzen...", + "Operators": "Eragiketak", + "Other": "Besteak", + "Output text using speech synthesis.": "", + "Paint Editor": "Editore grafikoa", + "Paint a new costume": "Marraztu mozorro berria", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "Marraztu forma (maius ⇧ = kolore sekundarioa)", + "Paintbrush tool (free draw)": "Pintzela (marrazki librea)", + "Parallelization": "", + "Part of": "Honen zatia", + "Parts": "Zatiak", + "Password:": "Pasahitza:", + "Pen": "Arkatza", + "Persist linked sublist IDs": "Estekatutako azpi-zerrenda ID iraunkorrak", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Tanta-kontagailua (hautatu kolore bat edonon)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Tanta-kontagailua (hautatu kolorea edonondik maius ⇧ = kolore sekundarioa)", + "Pixels": "Pixelak", + "Plain prototype labels": "Prototipoen etiketa lauak", + "Play": "Erreproduzitu", + "Play sound": "Erreproduzitu soinua", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Mesedez, egiaztatu nabigatzailea eguneratuta dagoela eta kamera behar bezala konfiguratuta dagoela. Zenbait nabigatzailek Snap!-era HTTPS bidez sartzea eskatzen dute kamera erabiltzeko. Mesedez, ordezkatu helbideko \"http://\" \"https://\"-rekin eta saiatu berriro.", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "Poligonoa", + "Predicate": "Predikatua", + "Prefer empty slot drops": "Lehenetsi erreten hutsak jaregitean", + "Prefer smooth animations": "Hobetsi animazio leunak", + "Primary color Secondary color": "Kolore primarioa Kolore sekundarioa", + "Privacy...": "Pribatutasuna...", + "Project Notes": "Proiektuaren oharrak", + "Project URLs": "Proiektuaren URLak", + "Project name...": "Proiektuaren izena...", + "Project notes...": "Proiektuaren oharrak...", + "Provide 100 selected colors": "Hautatutako 100 koloreko paleta", + "Provide getters and setters for all GUI-controlled global settings": "GUI bidez kontrolatutako aukera global guztientzako getter eta setter-ak", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "Sortu SVGen bilbea", + "Record a new sound": "Grabatu soinu berria", + "Recover": "", + "Rectangle (shift: square)": "Laukizuzena (maius ⇧ = karratua)", + "Reference manual": "Erreferentzia eskuliburua", + "Remove a category...": "", + "Remove unused blocks": "Kendu erabili gabeko blokeak", + "Repeat Password:": "Errepikatu pasahitza", + "Repeat new password:": "Errepikatu pasahitz berria:", + "Replace Project": "", + "Replace the current project with a new one?": "Uneko proiektua berriarekin ordezkatu nahi duzu?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Eskuen kokapena lortu LEAP mugimendu kontrolatzailea erabiliz (leapmotion.com).", + "Reporter": "Berriemailea", + "Request blocked": "", + "Resend Verification Email...": "Bidali berriz egiaztapen posta elektronikoa...", + "Resend verification email": "Bidali berriz egiaztapen-mezua", + "Reset Password...": "Berrezarri pasahitza...", + "Reset password": "Berrezarri pasahitza", + "Restore unsaved project": "", + "Retina display support": "Retina pantailen euskarria", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Exekutatu programa bat; Errore bat gertatzen bada, programa gelditu eta gorriz nabarmendu ordez, beste programa bat exekuta dezakezu errorea maneiatzeko. Sarrera bezala mezu bat jasotzen duen errore-bloke bat ere badakar eta programa aldagai bat sortu eta balioa emateko beste bloke bat ere bai.", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "Izen bereko blokeak", + "Save": "Gorde", + "Save As...": "Gorde honela...", + "Save Project": "Gorde proiektua", + "Save Project As...": "Gorde proiektua honela...", + "Save to disk": "Gorde diskoan", + "Saved!": "Gordeta!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Programaren aldagaiaren izena", + "Scripts": "Programak", + "Select a costume from the media library": "hautatu mozorro bat multimedia liburutegitik", + "Select a sound from the media library": "hautatu soinu bat multimedia liburutegitik", + "Select categories of additional blocks to add to this project.": "hautatu bloke gehigarrien kategoriak proiektu honi gehitzeko.", + "Selection tool": "Hautapen tresna", + "Sensing": "Sentsoreak", + "September": "Iraila", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Ezarri RGB edo HSV arkatz koloreak", + "Set or report pen color as RGB (red, green, blue) or HSV (hue, saturation, value).": "Arkatzaren kolorea ezarri edo itzultzen du RGB (gorria, berdea, urdina) edo HSV (ñabardura, saturazioa, balioa) bezala", + "Set the rotation center": "Ezarri biraketa zentroa", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "Hasi saioa", + "Sign up": "Erregistratu", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Erregistratu...", + "Single input.": "Sarrera bakarra.", + "Single palette": "", + "Slider maximum value": "Graduatzailearen balio maximoa", + "Slider minimum value": "Graduatzailearen balio minimoa", + "Snap! website": "Snap! webgunea", + "Snap!Cloud": "", + "Some standard functions on lists (append, reverse, etc.)": "Zerrenden funtzio estandar batzuk (append, reverse...)", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Soinua", + "Sound Recorder": "Soinu grabagailua", + "Sounds": "Soinuak", + "Sprite": "Objektua", + "Sprite Nesting": "Objektuak habiaratzea", + "Stage": "Agertokia", + "Stage height": "Agertokiaren altuera", + "Stage selected: no motion primitives": "Agertokia hautatuta: mugimendu primitiborik ez", + "Stage size": "Agertokiaren tamaina", + "Stage size...": "Agertokiaren tamaina...", + "Stage width": "Agertokiaren zabalera", + "Standard library of powerful blocks (for, map, etc.)": "Bloke aurreratuen liburutegi estandarra (for, map...)", + "Stop": "Gelditu", + "Stop sound": "Gelditu soinua", + "Streams (lazy lists)": "Jarioak (zerrenda alferrak)", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Elipsea (maius ⇧ = zirkulua)", + "Stroked Rectangle (shift: square)": "Laukizuzena (maius ⇧ = karratua)", + "Successfully connected to:": "Behar bezala konektatuta:", + "Switch back to user mode": "Itzuli erabiltzaile modura", + "Switch to dev mode": "Aldatu garatzaile modura", + "Switch to vector editor?": "", + "Table lines": "Taula lerroak", + "Table support": "Taulen euskarria", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Zerbitzu-baldintzak...", + "Ternary Boolean slots": "Erreten boolear hirutarrak", + "Text": "Testua", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "Scheme-ren dorre numeriko osoa. \"USE BIGNUMS \" aktibatzeko.", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Programa hari seguruak", + "Title text": "Izenburua", + "Today": "", + "Today,": "", + "Tools": "Tresnak", + "Top": "Goia", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Begizta egitura tradizionalak (while, until...) + Lisp-eko \"named let\" (for-aren orokortze bat) + iterazio funtzionala (funtzio bat modu errepikatuan deitzea) eta funtzioen konposizioa.", + "Translations": "Itzulpenak", + "Translators...": "Itzultzaileak", + "Turbo mode": "Turbo modua", + "Turtle": "Dortoka", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Izenik gabea", + "Unused blocks...": "Erabili gabeko blokeak...", + "Unverified account:": "", + "Up": "Gora", + "Updating project list...": "Proiektuen zerrenda eguneratzen...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - egin barne aldagaia ikusgai deitzaileari", + "Use CPU for graphics": "", + "User name must be four characters or longer": "erabiltzaile-izenak lau karaktere edo gehiago izan behar ditu", + "User name:": "Erabiltzaile-izena:", + "Variable name": "Aldagaiaren izena", + "Variables": "Aldagaiak", + "Variadic reporters": "Argumentu kopuru aldakorreko berriemaileak", + "Vector": "Bektorea", + "Vector Paint Editor": "Bektore editore grafikoa", + "Versions of +, x, AND, and OR that take more than two inputs.": "Bi sarrera baino gehiago hartzen dituzten +, x, AND, eta OR-en aldaerak.", + "Virtual keyboard": "Teklatu birtuala", + "Visible stepping": "Pausoz pauso ikusgai", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Web zerbitzuak atzitzea (https)", + "Words, sentences": "Hitzak, esaldiak", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Bai", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "Ez duzu saioa hasi", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebra koloreak", + "Zoom blocks": "Handitu blokeak", + "Zoom blocks...": "Handitu blokeak", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ k barne dauka _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ _ ren aurrean", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ modulu _", + "_ of _": "_ honena _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "_ hona _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "honen klon berri bat _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "gehitu _ _ ri", + "add a new Turtle sprite": "gehitu dortoka objektu berria", + "add a new sprite": "gehitu objektu berri bat", + "add comment": "gehitu iruzkina", + "add comment here...": "gehitu iruzkina hemen...", + "agent": "", + "alert _": "alerta _", + "all": "guztiak", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "guztiak lehena ezik _", + "all but this script": "dena programa hau ezik", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "analyze, manipulate and generate sound samples.": "Analizatu, manipulatu eta sortu audio laginak.", + "anchor": "aingura", + "and": "eta", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "erantzuna", + "any": "edozein", + "any key": "edozein tekla", + "any message": "edozein mezu", + "anything": "", + "append _": "", + "arrange scripts vertically": "antolatu programak bertikalki", + "arrowDown": "gezia behera", + "arrowDownOutline": "gezia behera (silueta)", + "arrowLeft": "gezia ezkerrera", + "arrowLeftOutline": "gezia ezkerrera (silueta)", + "arrowRight": "gezia eskuinera", + "arrowRightOutline": "gezia eskuinera (silueta)", + "arrowUp": "gezia gora", + "arrowUpOutline": "gezia gora (silueta)", + "asin": "asin", + "ask _ and wait": "galdetu _ eta itxaron", + "ask _ for _ _": "eskatu honi _ _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "handia (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Ziur zaude bloke pertsonalizatu hau eta bere instantzia guztiak ezabatu nahi dituzula?", + "block variables": "", + "block variables...": "blokearen aldagaiak...", + "block-solid (0)": "", + "blockify": "", + "blocks": "blokeak", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "distira", + "broadcast _ _": "igorri _ _", + "broadcast _ _ and wait": "igorri _ _ eta itxaron", + "brush": "pintzela", + "build": "eraiki", + "but getting a": "", + "c": "c", + "call _ _": "deitu _ _", + "call _ w/continuation": "deitu _ jarraipenarekin", + "caller": "", + "camera": "kamera", + "can only write text or numbers, not a": "", + "can rotate": "biragarria", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "sabaia", + "center": "erdia", + "center x": "x erdia", + "center y": "y erdia", + "change _ by _": "aldatu _ honela _", + "change _ effect by _": "aldatu _ efektua _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "aldatu arkatzaren kolorea _", + "change pen shade by _": "aldatu arkatzaren ñabardura _", + "change pen size by _": "aldatu arkatzaren tamaina _", + "change size by _": "aldatu tamaina _", + "change tempo by _": "aldatu tempoa _", + "change volume by _": "", + "change x by _": "aldatu x _", + "change y by _": "aldatu y _", + "check for alternative GUI design": "markatu erabiltzaile interfaze alternatiboa erabiltzeko", + "check for block to text mapping features": "markatu blokeetatik testura bihurtzea gaitzeko", + "check for flat ends of lines": "markatu arrastoek amaiera zuzenak izateko", + "check for higher contrast table views": "markatu kontraste handiagoko taula ikuspegia gaitzeko", + "check for higher resolution, uses more computing resources": "markatu bereizmen altuagoa erabiltzeko (baliabide gehiago erabiltzen ditu)", + "check for multi-column list view support": "markatu zerrenda ikuspegian hainbat zutaberen euskarria gaitzeko", + "check for smooth, predictable animations across computers": "markatu ordenagailu desberdinetan animazio leun eta aurreikusteko modukoak izateko", + "check for sprite inheritance features": "markatu objektuen herentzia ezaugarriak gaitzeko", + "check to allow empty Boolean slots": "markatu erreten boolear hutsak onartzeko", + "check to always show slot types in the input dialog": "markatu sarreren elkarrizketa-koadroan erreten motak beti bistaratzeko", + "check to cache inputs boosts recursion": "markatu sarrerak cache-an gordetzeko (errekurtsioa azkartzen du)", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "markatu programetara berriz sartzea gaitzeko", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "markatu IDEaren animazioak gaitzeko", + "check to enable alternating colors for nested blocks": "markatu bloke habiaratuetan txandakako koloreak gaitzeko", + "check to enable auto-wrapping inside nested block stacks": "markatu habiratutako bloke pilak automatikoki biltzea gaitzeko", + "check to enable camera support": "markatu kameraren euskarria gaitzeko", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "markatu argumentu kopuru aldakorreko sarreretan etiketa dinamikoak gaitzeko", + "check to enable input sliders for entry fields": "markatu sarrerako eremuetako graduatzaileak desgaitzeko", + "check to enable keyboard editing support": "markatu teklatu edizioaren euskarria gaitzeko", + "check to enable project data in URLs": "markatu proiektuen datuak URLean gehitzeko", + "check to enable saving linked sublist identities": "markatu estekatutako azpi-zerrenden identitateak gordetzea gaitzeko", + "check to enable sprite composition": "markatu objektuen konposizioa gaitzeko", + "check to enable support for first-class sprite": "markatu lehen mailako objektuen euskarria gaitzeko", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "markatu gailu mugikorretan teklatu birtualaren euskarria gaitzeko", + "check to hide (+) symbols in block prototype labels": "markatu blokeen prototipoen etiketetan (+) sinboloa ezkutatzeko", + "check to inherit from": "markatu hemendik heredatzeko", + "check to prevent contents from being saved": "markatu edukiak gordetzea eragozteko", + "check to prioritize script execution": "markatu programen exekuzioa lehenesteko", + "check to rasterize SVGs on import": "markatu SVGak inportatzean bilbea sortzeko", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "markatu blokeak kokatzean klik soinua egiteko", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "markatu programan pausoz pauso joateko (mantsoa)", + "check to use blurred drop shadows and highlights": "markatu itzal eta nabarmentze lausotuak erabiltzeko", + "children": "umea", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "zirkulua", + "circle box": "", + "circleSolid": "zirkulua (betea)", + "clean up": "garbitu", + "clear": "garbitu", + "clear graphic effects": "garbitu efektu grafikoak", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "egin klik edo arrastatu mira biraketa zentroa mugitzeko", + "clicked": "klik egitean", + "clone": "klonatu", + "clones": "klonak", + "closedBrush": "pintzel itxia", + "cloud": "hodeia", + "cloud unavailable without a web server.": "", + "cloudGradient": "hodeia (gradientea)", + "cloudOutline": "hodeia (silueta)", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "kolorea", + "color _ is touching _ ?": "_ kolorea _ ukitzen?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "komikia", + "command": "komandoa", + "comment pic...": "", + "compile": "", + "compile _": "konpilatu _", + "compile _ for _ args": "", + "confetti": "konfetia", + "console log _": "idatzi kontsolan _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "mozorroa", + "costume name": "mozorroaren izena", + "costumes": "mozorroak", + "costumes tab help": "inportatu mozorro bat ordenagailutik hona arrastatuz", + "could not connect to:": "", + "cr": "orga-itzulera", + "create a clone of _": "sortu klon bat _", + "cross": "gurutzea", + "crosshairs": "mira", + "current": "", + "current _": "uneko _", + "current module versions:": "Uneko moduluen bertsioak", + "current parent": "uneko gurasoa", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "zintzilik?", + "data": "", + "date": "data", + "day of week": "asteko eguna", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "ezabatu", + "delete _": "", + "delete _ of _": "ezabatu _ _ tik", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "ezabatu blokearen definizioa...", + "delete slot": "", + "delete this clone": "ezabatu klon hau", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "demoa (1.2x)", + "demo...": "", + "detach all parts": "bereizi zati guztiak", + "detach and put into the hand": "", + "detach from": "bereizi hemendik", + "development mode": "garapeneko modua", + "development mode debugging primitives:": "garapen modua primitiboak arazten:", + "development mode...": "", + "dimensions": "", + "direction": "norabidea", + "disable deep-Morphic context menus and show user-friendly ones": "desgaitu itxura sakoneko laster-menuak eta erakutsi erabilerrazak", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "Deskonektatuta.", + "distance": "distantzia", + "distance to _": "", + "distribution": "", + "don't rotate": "ez biratu", + "down arrow": "behera gezia", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "Arrastagarria", + "draggable?": "", + "dragging threshold": "", + "dropped": "jaregitean", + "duplicate": "bikoiztu", + "duplicate block definition...": "bikoiztu blokearen definizioa...", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "ertza", + "edit": "editatu", + "edit rotation point only...": "", + "edit the costume's rotation center": "editatu mozorroaren biraketa-zentroa", + "edit...": "editatu...", + "editables": "", + "elegant (90)": "", + "ellipse": "elipsea", + "enable Morphic context menus and inspectors, not user-friendly!": "gaitu itxura sakonekolaster-menuak eta ikuskatzaileak, ez erabilerrazak", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "Garatzaile moduan sartzen. Erroreak atzematea desgaituta dago, erabili nabigatzailearen web kontsola errore-mezuak ikusteko.", + "entering user mode": "Erabiltzaile moduan sartzen", + "eraser": "borragoma", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "esperimentala -eraikitzen", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "esportatu", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "esportatu proiektua hodeiko datu bezala...", + "export project media only...": "esportatu proiektuaren soinu eta irudiak soilik", + "export project without media...": "esportatu proiektua soinu eta irudirik gabe...", + "export script": "", + "export...": "esportatu...", + "extract": "", + "f": "f", + "false": "gezurra", + "file": "fitxategia", + "file menu import hint": "inportatu proiektuak, blokeak, irudiak edo soinuak", + "fill": "bete", + "fill page...": "", + "filtered for _": "iragazi _", + "find blocks": "bilatu blokeak", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "bilatu erabili gabeko bloke pertsonalizatu globalak eta kendu beren definizioak", + "fisheye": "arrain begia", + "flag": "", + "flash": "tximista", + "flat line ends": "", + "flatten": "", + "flip ↔": "irauli ↔", + "flip ↕": "irauli ↕", + "floor": "lurra", + "footprints": "oinatzak", + "for _ = _ to _ _": "", + "for all sprites": "objektu guztientzat", + "for each _ in _ _": "", + "for this sprite only": "objektu honentzat bakarrik", + "forever _": "beti _", + "frame": "", + "frames": "fotogramak", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "pantaila osoa", + "g": "g", + "gears": "engranajeak", + "get blocks": "", + "get data": "", + "ghost": "mamua", + "giant (8x)": "erraldoia (8x)", + "glide _ secs to x: _ y: _": "irristatu _ segundotan x: _ y: _", + "glide, grow and rotate using easing functions.": "Irristatu, egin zoom eta biratu easing funtzioak erabiliz.", + "global?": "", + "globe": "", + "go back _ layers": "joan atzera _ geruza", + "go to _": "joan _", + "go to _ layer": "", + "go to front": "joan aurreko planora", + "go to x: _ y: _": "joan x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "handitu", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "kaixo", + "help": "laguntza", + "help...": "laguntza...", + "hide": "ezkutatu", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "ezkutatu primitiboak", + "hide variable _": "ezkutatu _ aldagaia", + "high": "", + "hour": "ordua", + "http:// _": "", + "hue": "", + "huge (4x)": "oso handia (4x)", + "i": "i", + "identical to": "berdinak", + "if _ _": "baldin _ _", + "if _ _ else _": "baldin _ _ bestela _", + "if _ then _ else _": "", + "if on edge, bounce": "ertzean egin punpa", + "import a sound from your computer by dragging it into here": "inportatu soinu bat ordenagailutik hona arrastatuz", + "import without attempting to parse or format data": "", + "import...": "inportatu...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "heredatu _", + "inherited": "heredatua", + "input list:": "Sarrera zerrenda:", + "input names:": "sarreren izenak:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "txertatu _ _ posizioan _ n", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "dira _ ?", + "is _ a _ ?": "_ _ da?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ elementua _ tik", + "items": "elementuak", + "j": "j", + "join _": "batu _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ tekla sakatuta?", + "keyboard": "teklatua", + "keyboardFilled": "teklatua (betea)", + "l": "l", + "label": "", + "language_name": "Euskara", + "language_translator": "Asier Iturralde Sarasola", + "large": "handia", + "last": "azkena", + "last changed": "", + "last_changed": "2018-06-26", + "launch _ _": "abiarazi _ _", + "left": "", + "left arrow": "ezkerrera gezia", + "length": "", + "length of _": "honen luzera _", + "length:": "luzera:", + "let the World automatically adjust to browser resizing": "", + "letter": "letra", + "letter _ of _": "_ . letra hemendik _", + "light (70)": "", + "lightness": "", + "line": "lerroa", + "lines": "", + "list": "zerrenda", + "list _": "zerrenda _", + "list view...": "zerrenda ikuspegia...", + "ln": "ln", + "load the official library of powerful blocks": "kargatu bloke ahaltsuak dituen liburutegi ofiziala", + "localhost (secure)": "localhost (segurua)", + "location": "kokapena", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "lupa (silueta)", + "magnifyingGlass": "", + "make a block...": "sortu blokea...", + "make a category...": "", + "make a copy and pick it up": "egin kopia eta hartu", + "make a morph": "", + "make permanent and show in the sprite corral": "bihurtu behin-betiko eta erakutsi objektuen multzoan", + "make temporary and hide in the sprite corral": "bihurtu behin-behineko eta ezkutatu objektuen multzotik", + "make this morph movable": "", + "make this morph unmovable": "", + "manipulate costumes pixel-wise.": "Manipulatu mozorroak pixel mailan.", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "mezua", + "microphone _": "", + "middle": "erdia", + "minimum": "", + "minute": "minutua", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "ikaragarria (10x)", + "month": "hilabetea", + "mosaic": "mosaikoa", + "motion": "", + "mouse down?": "sagua sakatuta?", + "mouse position": "", + "mouse x": "saguaren x", + "mouse y": "saguaren y", + "mouse-departed": "sagua gainetik kentzean", + "mouse-entered": "sagua gainean jartzean", + "mouse-pointer": "saguaren erakuslea", + "move": "mugitu", + "move _ steps": "mugitu _ pauso", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "nire _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "ni neu", + "n": "n", + "name": "izena", + "neg": "", + "negative": "negatiboa", + "neighbors": "auzokoak", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "lerro berria", + "new sound _ rate _ Hz": "", + "new...": "berria...", + "next": "", + "next costume": "hurrengo mozorroa", + "none": "bat ere ez", + "normal": "normala", + "normal (1x)": "normala (1x)", + "normalScreen": "pantaila normala", + "normalStage": "agertoki handia", + "not": "ez", + "not _": "ez _", + "note": "", + "notes": "musika nota", + "nothing": "", + "now connected.": "", + "number": "zenbakia", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "oktogonoa", + "only duplicate this block": "bikoiztu soilik bloke hau", + "only face left/right": "begiratu ezkerrera/eskuinera soilik", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "ireki nabigatzailearen leiho berri bat proiektu honen laburpenarekin", + "open a new browser browser window with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "ireki nabigatzailearen leiho berri bat irudi guztietan itzalak dituen proiektu honen laburpenarekin. Ez du nabigatzaile guztietan funtzionatzen", + "open a new window with a picture of all scripts": "ireki programa guztien argazkiak leiho berrian", + "open a new window with a picture of the stage": "ireki agertokiaren argazki bat leiho berrian", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "ireki programa honen argazkia leiho berri batean", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "ireki elkarrizketa-koadroan...", + "open shared project from cloud...": "ireki partekatutako proiektua hodeitik...", + "options...": "", + "or": "edo", + "or before": "edo lehenago", + "other clones": "beste klonak", + "other scripts in sprite": "objektuaren beste programak", + "other sprites": "beste objektuak", + "p": "p", + "paint a new sprite": "marraztu objektu berria", + "paintbucket": "pintura", + "parameters": "", + "parent": "gurasoa", + "parent...": "gurasoa...", + "parts": "zatiak", + "password has been changed.": "Pasahitza aldatu da.", + "password must be six characters or longer": "pasahitzak sei karaktere edo gehiago izan behar ditu", + "passwords do not match": "pasahitzak ez datoz bat", + "paste on _": "", + "pause": "pausatu", + "pause all _": "pausatu guztiak _", + "pen": "arkatza", + "pen _": "", + "pen down": "arkatza behera", + "pen down?": "", + "pen trails": "arkatzaren arrastoak", + "pen up": "arkatza gora", + "pen vectors": "", + "pic...": "argazkia...", + "pick random _ to _": "hartu ausaz _ eta _ artean", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "tanta-kontagailua", + "pitch": "", + "pivot": "ardatza", + "pixel": "", + "pixelate": "pixelatu", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "jo _ nota _ aldiz", + "play sound _": "jo _ soinua", + "play sound _ at _ Hz": "", + "play sound _ until done": "jo _ soinua amaitu arte", + "please agree to the TOS": "mesedez onartu zerbitzu-baldintzak", + "please fill out this field": "mesedez bete eremu hau", + "please provide a valid email address": "mesedez idatzi baliozko helbide elektroniko bat", + "point in direction _": "apuntatu norabidea _", + "point towards _": "apuntatu hona _", + "pointRight": "eskuinera", + "polygon": "poligonoa", + "position": "", + "poster": "posterra", + "predicate": "predikatua", + "presentation (1.4x)": "aurkezpena (1.4x)", + "pressed": "sakatzean", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "ausazkoa", + "random position": "ausazko posizioa", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "laukizuzena", + "rectangleSolid": "laukizuzena (betea)", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "berriz jaregin", + "relabel...": "aldatu izena...", + "release": "askatu", + "remove block variables...": "kendu blokearen aldagaiak...", + "rename": "aldatu izena", + "rename all blocks that access this variable": "aldatu izena aldagai hau atzitzen duten bloke guztiei", + "rename all...": "aldatu izena guztiei...", + "rename background": "aldatu izena atzeko planoari", + "rename costume": "aldatu izena mozorroari", + "rename only this reporter": "aldatu izena berriemaile honi", + "rename sound": "Aldatu izena soinuari", + "rename...": "aldatu izena...", + "repeat _ _": "errepikatu _ aldiz _", + "repeat until _ _": "errepikatu _ den arte _", + "replace item _ of _ with _": "ordezkatu _ elementua _ n honekin _", + "report _": "aurkeztu _", + "reporter": "berriemailea", + "reporter didn't report": "", + "reset columns": "berrezarri zutabeak", + "reset timer": "berrezarri kronometroa", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "itxaron _ aldiz", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "eskuinera gezia", + "ring": "", + "ringify": "eraztundu", + "robot": "robota", + "rotate": "biratu", + "rotation style": "", + "rotation x": "x biraketa", + "rotation y": "y biraketa", + "round _": "borobildu _", + "run _ _": "exekutatu _ _", + "run _ w/continuation": "exekutatu _ jarraipenarekin", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "saturazioa", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "gorde proiektuaren datuak XML bezala Deskargak karpetan", + "saved.": "", + "say _": "esan _", + "say _ for _ secs": "esan _ _ segundoz", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "programaren argazkia...", + "script variables _": "programaren aldagaiak _", + "scripts": "programak", + "scripts pic...": "programen argazkiak...", + "scroll frame": "", + "scrolled-down": "beherantz korritzean", + "scrolled-up": "gorantz korritzean", + "second": "segundoa", + "select": "hautatu", + "selection": "hautapena", + "self": "norbera", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "ezarri _ efektua _", + "set _ of block _ to _": "", + "set _ to _": "ezarri _ _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "ezarri instrumentua _", + "set pen _ to _": "", + "set pen color to _": "ezarri arkatzaren kolorea _", + "set pen shade to _": "ezarri arkatzaren ñabardura _", + "set pen size to _": "ezarri arkatzaren tamaina _", + "set size to _ %": "ezarri tamaina _ %", + "set tempo to _ bpm": "ezarri tempoa _", + "set this morph's alpha value": "", + "set turbo mode to _": "ezarri turbo modua _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "ezarri x _", + "set y to _": "ezarri y _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "markatu jaregindako blokeek besteak ordezkatzea galarazteko", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "erakutsi", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "erakutsi programa eta bloke definizio guztien irudi bat", + "show all": "erakutsi guztiak", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "erakutsi bloke pertsonalizatuen definizio globalak XML bezala nabigatzailearen leiho berri batean", + "show primitives": "erakutsi primitiboak", + "show project data as XML in a new browser window": "erakutsi proiektuaren datuak XML bezala nabigatzailearen leiho berri batean", + "show table _": "", + "show the World's menu": "", + "show variable _": "erakutsi _ aldagaia", + "shown?": "", + "shrink": "txikiagotu", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "tamaina", + "slider": "graduatzailea", + "slider max...": "graduatzailea max...", + "slider min...": "graduatzailea min...", + "slots": "", + "smallStage": "agertoki txikia", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "soinuak", + "space": "zuriunea", + "specify the distance the hand has to move before it picks up an object": "zehaztu objektu bat arrastatzen hasteko eskuarekin egin beharreko distantzia", + "spectrum": "", + "speech bubble": "", + "speechBubble": "bunbuiloa", + "speechBubbleOutline": "bunbuiloa (silueta)", + "split _ by _": "banatu _ honekin _", + "sprite": "objektua", + "sprites": "", + "sqrt": "erroa", + "square": "karratua", + "stack size": "pilaren tamaina", + "stage": "agertokia", + "stage image": "", + "stamp": "zigilua", + "standard settings": "", + "stay signed in on this computer until logging out": "mantendu saioa hasita ordenagailu honetan", + "stepForward": "hurrengo pausoa", + "stick this morph to another one": "", + "stick to": "", + "stop _": "gelditu _", + "stop all sounds": "gelditu soinu guztiak", + "stop frequency": "", + "stopped": "", + "storage": "biltegiratzea", + "store this project in the downloads folder (in supporting browsers)": "gorde proiektu hau Deskargak karpetan (euskarria duten nabigatzaileetan)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "aldatu mozorroa _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabuladorea", + "table view...": "taula ikuspegia...", + "take a camera snapshot and import it as a new sprite": "egin argazki berria eta inportatu objektu berri bezala", + "tan": "tan", + "tell _ to _ _": "esan honi _ _ _", + "tempo": "tempoa", + "temporary?": "", + "text": "testua", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "une honetan ez dago erabili gabeko bloke pertsonalizatu globalik proiektu honetan", + "there are currently no vectorizable pen trail segments": "", + "thing": "gauza", + "think _": "pentsatu _", + "think _ for _ secs": "pentsatu _ _ segundoz", + "this _": "", + "this block": "bloke hau", + "this project doesn't have any custom global blocks yet": "proiektu honek oraindik ez dauka bloke pertsonalizaturik", + "this script": "programa hau", + "time in milliseconds": "denbora milisegundotan", + "timer": "kronometroa", + "tip": "", + "to": "", + "to use instead of hue for better selection": "Hautatzea errazte aldera ñabarduraren ordez erabiltzeko", + "top": "", + "touch screen settings": "", + "touching _ ?": "_ ukitzen?", + "transient": "behin-behinekoa", + "translations": "", + "translations...": "itzulpenak...", + "translator_e-mail": "aiturralde@iametza.eus", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "egia", + "turbo mode": "", + "turbo mode?": "turbo modua?", + "turn _ _ degrees": "biratu _ _ gradu", + "turn all pen trails and stamps into a new background for the stage": "sortu atzeko plano berria agertoki honentzat arkatzaren arrastoetatik eta zigiluetatik", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "sortu atzeko plano berria arkatzaren arrastoetatik", + "turn pen trails into new costume...": "", + "turnBack": "atzera", + "turnForward": "aurrera", + "turnLeft": "biratu ezkerrera", + "turnRight": "biratu eskuinera", + "turtle": "dortoka", + "turtleOutline": "dortoka (silueta)", + "type": "", + "type of _": "honen mota _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "kendu marka erabiltzaile interfaze lehenetsia erabiltzeko", + "uncheck for greater speed at variable frame rates": "kendu marka fotograma-abiadura aldakorrekin abiadura handiagoa izateko", + "uncheck for less contrast multi-column list views": "kendu marka kontraste handiagoko taula ikuspegia desgaitzeko", + "uncheck for lower resolution, saves computing resources": "kendu marka bereizmen baxuagoa erabiltzeko (baliabideak aurrezten ditu)", + "uncheck for round ends of lines": "kendu marka arrastoek amaiera borobilduak izateko", + "uncheck for smooth scaling of vector costumes": "kendu marka mozorro bektorialen eskalatze leunerako", + "uncheck to allow dropped reporters to kick out others": "kendu marka jaregindako blokeek besteak ordezkatzea baimentzeko", + "uncheck to allow script reentrance": "kendu marka programetara berriz sartzea desgaitzeko", + "uncheck to always show (+) symbols in block prototype labels": "kendu marka blokeen prototipoen etiketetan (+) sinboloa beti bistaratzeko", + "uncheck to confine auto-wrapping to top-level block stacks": "kendu marka goi mailako bloke pilak soilik biltzeko automatikoki", + "uncheck to disable IDE animations": "kendu marka IDEaren animazioak desgaitzeko", + "uncheck to disable alternating colors for nested block": "kendu marka bloke habiaratuetan txandakako koloreak desgaitzeko", + "uncheck to disable block to text mapping features": "kendu marka blokeetatik testura bihurtzea desgaitzeko", + "uncheck to disable camera support": "kendu marka kameraren euskarria desgaitzeko", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "kendu marka argumentu kopuru aldakorreko sarreretan etiketa dinamikoak desgaitzeko", + "uncheck to disable input sliders for entry fields": "kendu marka sarrerako eremuetako graduatzaileak desgaitzeko", + "uncheck to disable keyboard editing support": "kendu marka teklatu edizioaren euskarria desgaitzeko", + "uncheck to disable multi-column list views": "kendu marka zerrenda ikuspegian hainbat zutaberen euskarria desgaitzeko", + "uncheck to disable project data in URLs": "kendu marka proiektuen datuak URLean ez gehitzeko", + "uncheck to disable saving linked sublist identities": "kendu marka estekatutako azpi-zerrenden identitateak gordetzea desgaitzeko", + "uncheck to disable sprite composition": "kendu marka objektuen konposizioa desgaitzeko", + "uncheck to disable sprite inheritance features": "kendu marka objektuen herentzia ezaugarriak desgaitzeko", + "uncheck to disable support for first-class sprites": "kendu marka lehen mailako objektuen euskarria desgaitzeko", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "kendu marka gailu mugikorretan teklatu birtualaren euskarria desgaitzeko", + "uncheck to disinherit": "kendu marka heredentzia kentzeko", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "kendu marka erreten boolearrak egia / gezurra balioetara mugatzeko", + "uncheck to run scripts at normal speed": "kendu marka programak abiadura normalean exekutatzeko", + "uncheck to save contents in the project": "kendu marka proiektuaren edukiak gordetzeko", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "kendu marka sarrerak cache-an ez gordetzeko (ebaluatzailea arazteko)", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "kendu marka blokeak kokatzean klik soinurik ez egiteko", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "kendu marka programan pausoz pauso joatea desgaitzeko", + "uncheck to use solid drop shadows and highlights": "kendu marka itzal eta nabarmentze solidoak erabiltzeko", + "uncheck to use the input dialog in short form": "kendu marka sarreren elkarrizketa-koadro sinplea erabiltzeko", + "uncompile": "", + "undo": "desegin", + "undo the last block drop in this pane": "desegin panel honetan azken blokea jaregitea", + "undrop": "desegin jaregitea", + "unicode _ as letter": "unicode _ letra bezala", + "unicode of _": "honen unicode _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "deseraztundu", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "izengabea", + "unused": "", + "unused block(s) removed": "erabili gabeko bloke kendu d(ir)a", + "up arrow": "gora gezia", + "upper case": "", + "url...": "URLa...", + "use the keyboard to enter blocks": "erabili teklatua blokeak sartzeko", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "itxaron _ segundo", + "wait until _": "itxaron _ arte", + "wardrobe": "", + "warp _": "exekutatu jarraian _", + "what's your name?": "nola izena duzu?", + "when I am _": "niri _", + "when I receive _ _": "_ jasotzen dudanean _", + "when I start as a clone": "klon bezala hasten naizenean", + "when _": "_ denean", + "when _ clicked": "_ klik egitean", + "when _ is edited _": "", + "when _ key pressed _": "_ tekla sakatzean _", + "whirl": "zurrunbiloa", + "whitespace": "zuriunea", + "width": "", + "with data": "", + "with inputs": "sarrerekin", + "word": "", + "world": "mundua", + "write _ size _": "", + "x": "x", + "x position": "x posizioa", + "y": "y", + "y position": "y posizioa", + "year": "urtea", + "year:": "urtea:", + "your own": "zure", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-fi.js b/elements/pl-snap/Snap/locale/lang-fi.js new file mode 100644 index 00000000..3a26be3f --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-fi.js @@ -0,0 +1,1384 @@ +SnapTranslator.dict.fi = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) vasemmalle", + "(0) up": "(0) ylös", + "(1) sine": "", + "(180) down": "(180) alas", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) oikealle", + "(empty)": "(tyhjä)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Tietoa Snapista", + "About...": "Tietoa Snapista...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animaatiot", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Mikä vain (sitaatti)", + "Any type": "Mikä vain", + "Apply": "Tee muutokset", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Poistetaanko varmasti?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Takaisin...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Palikan muokkaus", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Sumeat varjot", + "Boolean": "totuusarvo", + "Boolean (T/F)": "Totuusarvo", + "Boolean (unevaluated)": "Totuusarvo (sitaatti)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Peruuta", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Muuta palikkaa", + "Clear backup": "", + "Clicking sound": "Klikkausääni", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Komento", + "Command (C-shape)": "Komento (C-muoto)", + "Command (inline)": "Komento", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Osallistujat", + "Control": "Ohjaus", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Asun muokkaus", + "Costumes": "Asut", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Nimeä syöte", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Kiitokset...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Tavallinen", + "Default Value:": "Oletusarvo:", + "Delete": "Poista", + "Delete Custom Block": "Poista palikka", + "Delete Project": "Poista projekti", + "Delete a variable": "poista muuttuja", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Lataa lähdekoodi", + "Dragging threshold...": "", + "Dynamic input labels": "Vaihtuvat syötetunnukset", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Muokkaa syötteen nimeä", + "Edit label fragment": "Muokkaa otsikkoa", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Tyhjä", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Vie palikoita", + "Export blocks...": "Vie palikoita...", + "Export project as plain text...": "Vie projekti tekstinä...", + "Export project...": "Vie projekti...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "Tasaiset viivanpäät", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Hei!", + "Hello, World!": "", + "Help": "Apua", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Tuo palikoita", + "Import library": "Tuo kirjasto", + "Import sound": "", + "Import tools": "Tuo työkaluja", + "Import...": "Tuo...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "Syötteet:", + "Input Slot Options": "", + "Input name": "Syöte", + "Input sliders": "Liukusäätimet", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Kieli...", + "Libraries...": "Kirjastot...", + "License": "Tekijänoikeudet", + "License...": "Tekijänoikeudet...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Lista", + "List utilities": "", + "Lists": "Listat", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Kirjaudu...", + "Logout": "", + "Long form input dialog": "Yksityiskohtainen syötevalinta", + "Looks": "Ulkonäkö", + "Make a block": "Uusi palikka", + "Make a variable": "Uusi muuttuja", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Sanoma", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Osat...", + "Motion": "Liike", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Useita syötteitä (listana)", + "Nested auto-wrapping": "", + "New": "Uusi", + "New Category": "", + "New Project": "Uusi projekti", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Ei", + "November": "", + "Number": "Luku", + "OK": "", + "Object": "Objekti", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Avaa projekti", + "Open in Community Site": "", + "Open...": "Avaa...", + "Opening project...": "", + "Operators": "Laskenta", + "Other": "Muut", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Kynä", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Yksinkertaiset palikkatunnisteet", + "Play": "Soita", + "Play sound": "Soita ääni", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikaatti", + "Prefer empty slot drops": "Suosi asettamista tyhjiin aukkoihin", + "Prefer smooth animations": "Pyri sulaviin animaatioihin", + "Privacy...": "", + "Project Notes": "Projektin muistiinpanot", + "Project URLs": "", + "Project notes...": "Projektimerkintöjä...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Käyttöohje", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Korvataanko nykyinen projekti uudella?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funktio", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Tallenna", + "Save As...": "Tallenna nimellä...", + "Save Project": "", + "Save Project As...": "Tallenna projekti nimellä...", + "Save to disk": "", + "Saved!": "Tallennettu!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Skriptimuuttujan nimi", + "Scripts": "Skriptit", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Tuntoaisti", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Luo käyttäjätili...", + "Single input.": "Yksi syöte.", + "Single palette": "", + "Slider maximum value": "Liukusäätimen maksimiarvo", + "Slider minimum value": "Liukusäätimen minimiarvo", + "Snap! website": "Snapin kotisivu", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Ääni", + "Sound Recorder": "", + "Sounds": "Äänet", + "Sprite": "Hahmo", + "Sprite Nesting": "", + "Stage": "Esiintymislava", + "Stage height": "Esiintymislavan korkeus", + "Stage selected: no motion primitives": "Esiintymislava valittuna ei liikekomentoja", + "Stage size": "Esiintymislavan koko", + "Stage size...": "Esiintymislavan koko...", + "Stage width": "Esiintymislavan leveys", + "Stop": "Pysäytä", + "Stop sound": "Pysäytä ääni", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Palaa käyttäjämoodiin", + "Switch to dev mode": "vaihda kehitysmoodiin", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Teksti", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Säieturvalliset skriptit", + "Title text": "Otsikko", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Käännökset", + "Translators...": "Kääntäjät...", + "Turbo mode": "Turbonopeus", + "Turtle": "Osoitin", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Nimetön", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Paljasta sisäinen muuttuja ulkopuolelle", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Muuttujan nimi", + "Variables": "Muuttujat", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuaalinäppäimistö", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Kyllä", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Seepraväritys", + "Zoom blocks": "Suurenna palikoita", + "Zoom blocks...": "Suurenna palikoita...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "lista _ sisältää _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ listan _ aluksi", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "jakojäännös laskusta _ / _", + "_ of _": "_ hahmolla _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "itseisarvo", + "acos": "acos", + "add _ to _": "lisää _ listaan _", + "add a new Turtle sprite": "", + "add a new sprite": "lisää uusi hahmo", + "add comment": "lisää kommentti", + "add comment here...": "Kirjoita kommentti tähän...", + "agent": "", + "alert _": "ponnahdusikkuna: _", + "all": "kaikki", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "kaikki paitsi ensimmäinen alkio listasta _", + "all but this script": "kaikki paitsi tämä skripti", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "ja", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "vastaus", + "any": "", + "any key": "", + "any message": "mikä tahansa", + "anything": "", + "append _": "", + "arrange scripts vertically": "järjestä pystysuorasti", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "kysy _ ja odota", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "iso (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Poistetaanko tämä palikka ja kaikki sen esiintymät?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "palikoita", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "lähetä sanoma _ _", + "broadcast _ _ and wait": "lähetä sanoma _ _ ja odota", + "brush": "", + "build": "rakenna", + "but getting a": "", + "c": "c", + "call _ _": "kutsu _ _", + "call _ w/continuation": "kutsu _ kontinuaatiolla", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "pyörii vapaasti", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "muuta muuttujaa _ määrällä _", + "change _ effect by _": "muuta efektiä _ _ yksikköä", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "vaihda kynän väriä määrällä _", + "change pen shade by _": "muuta kirkkautta _ ​%-yks.", + "change pen size by _": "muuta paksuutta määrällä _", + "change size by _": "muuta kokoa _ ​%-yksikköä", + "change tempo by _": "vaihda tempoa _ iskulla/min", + "change volume by _": "", + "change x by _": "muuta x:ää _ askelta", + "change y by _": "muuta y:tä _ askelta", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "asettamalla saat viivan päistä suorat", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "asettamalla saat sulavat animaatiot eri tietokoneilla", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "asettamalla näet aina tietotyyppivalinnat palikan syötteitä lisätessä", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "asettamalla estät skriptin käynnistymisen jos se on jo ajossa", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "asettamalla kytket päälle käyttöliittymän animaatiot", + "check to enable alternating colors for nested blocks": "asettamalla saat vaihtuvat värit sisäkkäisille palikoille", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "asettamalla saat vaihtuville syötteille vaihtuvat tunnukset", + "check to enable input sliders for entry fields": "asettamalla saat syötekenttiin liukusäätimet", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "asettamalla sallit mobiililaitteiden virtuaalinäppäimistön käytön", + "check to hide (+) symbols in block prototype labels": "asettamalla piilotat (+)-merkit palikan muokkauksessa", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "asettamalla nostat skriptien prioriteettia", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "asettamalla kytket päälle palikoiden klikkausäänen", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "asettamalla saat sumeat varjot ja korostukset", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "siivoa", + "clear": "tyhjennä", + "clear graphic effects": "poista efektit", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "siirrä kiertokeskusta klikkaamalla tai pitämällä hiirtä painettuna ja liikuttamalla", + "clicked": "klikataan", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "väri _ koskettaa väriä _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "komentopalikka", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "kirjoita konsoliin: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "asun nro", + "costume name": "", + "costumes": "", + "costumes tab help": "Tuo kuva verkosta tai koneeltasi siirtämällä se hiirellä tähän", + "could not connect to:": "", + "cr": "vaununpalautusten (cr)", + "create a clone of _": "kloonaa _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "Osien versiot:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "poista", + "delete _": "", + "delete _ of _": "poista _ listasta _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "poista palikkamäärittely", + "delete slot": "", + "delete this clone": "poista tämä klooni", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "irrota kaikki osat", + "detach and put into the hand": "", + "detach from": "irrota", + "development mode": "kehitysmoodi", + "development mode debugging primitives:": "Kehitysmoodin debuggauskomennot:", + "development mode...": "", + "dimensions": "", + "direction": "suunta", + "disable deep-Morphic context menus and show user-friendly ones": "poista Morphic-valikot käytöstä ja näytä helpot valikot", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "etäisyys hahmoon _", + "distribution": "", + "don't rotate": "ei pyöri", + "down arrow": "nuoli alas", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "hiirellä liikuteltava", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "kopioi", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "reuna", + "edit": "muokkaa", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "muokkaa...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "näytä Morphic-toiminnot, ei kovin helppokäyttöisiä", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "vie", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "Vie...", + "extract": "", + "f": "f", + "false": "epätosi", + "file": "", + "file menu import hint": "lataa viety projekti, palikkakirjasto, asu tai ääni", + "fill": "", + "fill page...": "", + "filtered for _": "suodatettuna väri _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "pyöristys alas", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "kaikille hahmoille", + "for each _ in _ _": "", + "for this sprite only": "vain tälle hahmolle", + "forever _": "ikuisesti _", + "frame": "", + "frames": "ruutuja", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "läpinäkyvyys", + "giant (8x)": "jättimäinen (8x)", + "glide _ secs to x: _ y: _": "liu'u _ s → x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "siirry _ kerrosta taakse", + "go to _": "mene hahmon _ luo", + "go to _ layer": "", + "go to front": "tule etualalle", + "go to x: _ y: _": "mene paikkaan x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "Hei", + "help": "apua", + "help...": "apua...", + "hide": "piilota", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "piilota peruspalikat", + "hide variable _": "piilota muuttuja _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "valtava (4x)", + "i": "i", + "identical to": "sama kuin", + "if _ _": "jos _ _", + "if _ _ else _": "jos _ _ muuten _", + "if _ then _ else _": "", + "if on edge, bounce": "kimpoa reunasta", + "import a sound from your computer by dragging it into here": "Tuo ääni koneeltasi siirtämällä se hiirellä tähän", + "import without attempting to parse or format data": "", + "import...": "tuo...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "syötelista:", + "input names:": "syötteet:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "lisää _ kohtaan _ listassa _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "onko _ ?", + "is _ a _ ?": "onko _ _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "alkio kohdassa _ listassa _", + "items": "", + "j": "j", + "join _": "yhdistä _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "näppäin _ painettuna?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "suomi", + "language_translator": "Jouni K. Seppänen", + "large": "suuri", + "last": "viimeinen", + "last changed": "", + "last_changed": "2014-04-18", + "launch _ _": "käynnistä _ _", + "left": "", + "left arrow": "nuoli vasemmalle", + "length": "", + "length of _": "tekstin _ pituus", + "length:": "pituus:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "kirjain nro _ tekstistä _", + "light (70)": "", + "lightness": "", + "line": "rivinvaihtojen (lf)", + "lines": "", + "list": "lista", + "list _": "lista _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "lataa virallinen tehopalikoiden kirjasto", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "tee uusi palikka...", + "make a category...": "", + "make a copy and pick it up": "ota kopio mukaan", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "sanoma", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "hirviömäinen (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "hiiren näppäin painettuna?", + "mouse position": "", + "mouse x": "hiiren x-paikka", + "mouse y": "hiiren y-paikka", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "hiiren osoitin", + "move": "", + "move _ steps": "liiku _ askelta", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "minut", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "uusi...", + "next": "", + "next costume": "seuraava asu", + "none": "ei mitään", + "normal": "tavallinen", + "normal (1x)": "normaali (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "ei _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "luku", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "kopioi vain tämä palikka", + "only face left/right": "kääntyy vain vasemmalle ja oikealle", + "only grab this block": "", + "open a new window with a picture of all scripts": "avaa kuva kaikista skripteistä uudessa selainikkunassa", + "open a new window with a picture of the stage": "Avaa esiintymislavan kuva uuteen selainikkunaan", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "avaa kuva tästä skriptistä uudessa selainikkunassa", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "tai", + "or before": "", + "other clones": "", + "other scripts in sprite": "hahmon muut skriptit", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "keskeytä kaikki _", + "pen": "", + "pen _": "", + "pen down": "kynä alas", + "pen down?": "", + "pen trails": "kynän jälki", + "pen up": "kynä ylös", + "pen vectors": "", + "pic...": "Vie kuva...", + "pick random _ to _": "arvo satunnaisluku _ .. _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "nuotti _ _ iskua", + "play sound _": "soita ääni _", + "play sound _ at _ Hz": "", + "play sound _ until done": "soita ääni _ kokonaan", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "osoita suuntaan _", + "point towards _": "osoita hahmoa _ kohti", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predikaatti", + "presentation (1.4x)": "esitys (1.4x)", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "mikä tahansa", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "nimeä uudestaan...", + "release": "", + "remove block variables...": "", + "rename": "nimeä uudestaan", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "nimeä asu uudestaan", + "rename only this reporter": "", + "rename sound": "nimeä ääni uudestaan", + "rename...": "nimeä uusiksi...", + "repeat _ _": "toista _ kertaa _", + "repeat until _ _": "toista kunnes _ _", + "replace item _ of _ with _": "vaihda kohtaan _ listassa _ alkio _", + "report _": "vastaa _", + "reporter": "funktiopalikka", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "nollaa ajastin", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "tauko _ iskua", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "nuoli oikealle", + "ring": "", + "ringify": "ympyröi", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "pyöristä _", + "run _ _": "suorita _ _", + "run _ w/continuation": "suorita _ kontinuaatiolla", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "sano _", + "say _ for _ secs": "sano _ _ sekunnin ajan", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "kuva skriptistä...", + "script variables _": "skriptimuuttujat _", + "scripts": "", + "scripts pic...": "kuva skripteistä...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "valitse", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "aseta efektin _ määräksi _", + "set _ of block _ to _": "", + "set _ to _": "aseta muuttujan _ arvoksi _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "aseta kynän väriksi _", + "set pen shade to _": "aseta kirkkaudeksi _ %", + "set pen size to _": "aseta kynän paksuudeksi _", + "set size to _ %": "aseta kooksi _ %", + "set tempo to _ bpm": "aseta tempoksi _ iskua/min", + "set this morph's alpha value": "", + "set turbo mode to _": "kytke turbonopeus päälle jos _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "aseta x:ksi _", + "set y to _": "aseta y:ksi _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "asettamalla saat asetettavat palikat osumaan tyhjiin aukkoihin", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "näytä", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "Näytä kaikki", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "näytä yhteiset palikkamäärittelyt XML-muodossa uudessa selainikkunassa", + "show primitives": "näytä peruspalikat", + "show project data as XML in a new browser window": "näytä projekti XML-muodossa uudessa selainikkunassa", + "show table _": "", + "show the World's menu": "", + "show variable _": "näytä muuttuja _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "koko", + "slider": "liukusäädin", + "slider max...": "maksimiarvo...", + "slider min...": "minimiarvo...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "välilyönti", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "pilko _ _ kohdalta", + "sprite": "", + "sprites": "", + "sqrt": "neliöjuuri", + "square": "", + "stack size": "pinon koko", + "stage": "", + "stage image": "", + "stamp": "leimaa", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "pysäytä _", + "stop all sounds": "pysäytä kaikki äänet", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "vaihda asuun _", + "switch to scene _ _": "", + "t": "t", + "tab": "sarkaimien (tab)", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "teksti", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "alkio", + "think _": "ajattele _", + "think _ for _ secs": "ajattele _ _ sekunnin ajan", + "this _": "", + "this block": "tämä palikka", + "this project doesn't have any custom global blocks yet": "projektilla ei ole vielä yhtään yhteistä muokattua palikkaa", + "this script": "tämä skripti", + "time in milliseconds": "", + "timer": "ajastin", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "koskettaa väriä _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "jks@iki.fi", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "tosi", + "turbo mode": "", + "turbo mode?": "turbonopeus?", + "turn _ _ degrees": "käänny _ _ astetta", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ tyyppi", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "poistamalla saat lisää nopeutta mutta päivitystaajuus vaihtelee", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "poistamalla saat viivan päistä pyöristetyt", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "poistamalla sallit asetettujen palikoiden pois potkimisen", + "uncheck to allow script reentrance": "poistamalla sallit skriptin käynnistymisen vaikka se on ajossa", + "uncheck to always show (+) symbols in block prototype labels": "poistamalla saat (+)-merkit näkymään aina palikan muokkauksessa", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "poistamalla piilotat käyttöliittymän animaatiot", + "uncheck to disable alternating colors for nested block": "poistamalla saat samat värit sisäkkäisille palikoille", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "poistamalla estät vaihtuvien syötteiden vaihtuvat tunnukset", + "uncheck to disable input sliders for entry fields": "poistamalla piilotat liukusäätimet syötekentistä", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "poistamalla estät mobiililaitteiden virtuaalinäppäimistön käytön", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "poistamalla ajat skriptit normaalinopeudella", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "poistamalla hiljennät palikoiden klikkausäänen", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "poistamalla saat kiinteät varjot ja korostukset", + "uncheck to use the input dialog in short form": "poistamalla teet palikan syötteiden lisäämisikkunasta yksinkertaisen", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "peruuta viimeisin palikan asetus", + "undrop": "peruuta asetus", + "unicode _ as letter": "Unicode-arvoa _ vastaava merkki", + "unicode of _": "merkin _ Unicode-arvo", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "poista ympyröinti", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "nimetön", + "unused": "", + "unused block(s) removed": "", + "up arrow": "nuoli ylös", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "odota _ sekuntia", + "wait until _": "odota kunnes _", + "wardrobe": "", + "warp _": "supernopeasti _", + "what's your name?": "Mikä sinun nimesi on?", + "when I am _": "kun minua _", + "when I receive _ _": "kun vastaanotan sanoman _ _", + "when I start as a clone": "Kun aloitan kloonina", + "when _": "", + "when _ clicked": "kun klikataan _", + "when _ is edited _": "", + "when _ key pressed _": "kun painetaan _ _", + "whirl": "", + "whitespace": "tyhjien välien", + "width": "", + "with data": "", + "with inputs": "syötteillä", + "word": "", + "world": "maailma", + "write _ size _": "", + "x": "x", + "x position": "x-paikka", + "y": "y", + "y position": "y-paikka", + "year": "", + "year:": "", + "your own": "omia", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-fr.js b/elements/pl-snap/Snap/locale/lang-fr.js new file mode 100644 index 00000000..f592f693 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-fr.js @@ -0,0 +1,1391 @@ +SnapTranslator.dict.fr = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) à gauche", + "(0) up": "(0) vers le haut", + "(1) sine": "", + "(180) down": "(180) vers le bas", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) à droite", + "(empty)": "(vide)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "À propos de Snap", + "About...": "À propos de Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Tout type (non évaluée)", + "Any type": "Tout type", + "Apply": "Appliquer", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Souhaitez-vous vraiment supprimer ?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Retour...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Éditeur de bloc", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Ombres floues", + "Boolean": "booléen", + "Boolean (T/F)": "Booléen (V/F)", + "Boolean (unevaluated)": "Booléen (non évaluée)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "Navigateur", + "Brush size": "Taille de pinceau", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Annuler", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Changer le bloc", + "Clear backup": "", + "Clicking sound": "Cliquetis", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "Support de la « codification »", + "Colors and Crayons": "", + "Command": "Commande", + "Command (C-shape)": "Commande (en forme de C)", + "Command (inline)": "Commande (en ligne)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Contraindre les proportions de la forme ? (vous pouvez aussi maintenir appuyé Maj)", + "Contents": "", + "Contributors": "Contributeurs", + "Control": "Contrôles", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "êditeur de costumes", + "Costumes": "", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Créer le nom de l'entrée", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Contributeurs...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "Valeur par défaut :", + "Delete": "Supprimer", + "Delete Custom Block": "Effacer le bloc personnalisé", + "Delete Project": "Supprimer un projet", + "Delete a variable": "Supprimer une variable", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Télécharger le code source", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Éditer le nom de l'entrée", + "Edit label fragment": "Éditer le fragment du label", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Vide", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Gomme", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "exporter des blocs", + "Export blocks...": "Exporter les blocs", + "Export project as plain text...": "Exporter le projet comme texte...", + "Export project...": "Exporter le projet...", + "Export summary with drop-shadows...": "", + "Export summary...": "Exporter un résumé...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "Remplir une région", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "Ellipse pleine (Maj: cercle)", + "Filled Rectangle (shift: square)": "Rectangle plein (Maj: carré)", + "First-Class Sprites": "", + "Flat design": "Style alégé", + "Flat line ends": "Fins de ligne plates", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Salut !", + "Hello, World!": "", + "Help": "Aide", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Mmmh...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "Importer une bibliothèque", + "Import sound": "", + "Import...": "Importer...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Support de l'héritage", + "Input Names:": "Renseigner un nom :", + "Input Slot Options": "", + "Input name": "Nom de l'entrée", + "Input sliders": "Entrée curseurs", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "fonction JavaScript ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Édition au clavier", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Langue...", + "Libraries...": "Bibliothèques...", + "License": "", + "License...": "Licence...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "Ligne (Maj: verticale/horizontale)", + "List": "", + "List utilities": "", + "Lists": "Listes", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Connexion...", + "Logout": "", + "Long form input dialog": "Boîte d'entrée en mode détaillé", + "Looks": "Apparence", + "Make a block": "Nouveau bloc", + "Make a variable": "Nouvelle variable", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Nom du message", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "", + "Motion": "Mouvement", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Entrées multiples (la valeur est une liste des entrées)", + "Nested auto-wrapping": "", + "New": "Nouveau", + "New Category": "", + "New Project": "Nouveau projet", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Non", + "November": "", + "Number": "", + "OK": "", + "Object": "Objet", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Ouvrir", + "Open Project": "Ouvrir un projet", + "Open Projekt": "Ouvrir un projet", + "Open in Community Site": "", + "Open...": "Ouvrir...", + "Opening project...": "", + "Operators": "Opérateurs", + "Other": "Autres", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "Dessiner un nouveau costume", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Pinceau (dessin à main levée)", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Stylo", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipette (sélectionnez une couleur n'importe où)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Étiquettes simples de définition", + "Play": "jouer", + "Play sound": "jouer un son", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Prédicat", + "Prefer empty slot drops": "Préférer des entrées vides", + "Prefer smooth animations": "Vitesse d'animation fixe", + "Press CTRL+C one more time to effectively copy to clipboard.": "Taper une nouvelle fois sur CTRL+C pour copier effectivement vers le presse-papier.", + "Press CTRL+V one more time to effectively paste from clipboard.": "Taper une nouvelle fois sur CTRL+V pour coller effectivement depuis le presse-papier.", + "Press CTRL+X one more time to effectively cut to clipboard.": "Taper une nouvelle fois sur CTRL+X pour couper effectivement vers le presse-papier.", + "Privacy...": "", + "Project Notes": "Notes du projet", + "Project URLs": "", + "Project notes...": "Notes du projet...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Manuel de référence", + "Remove a category...": "", + "Remove unused blocks": "Supprimer les blocs inutilisés", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Remplacer le projet actuel par un nouveau ?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Remise à zéro du mot de passe...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Sauvegarder", + "Save As...": "Sauvegarder sous...", + "Save Project": "", + "Save Project As...": "Sauvegarder le projet sous...", + "Save to disk": "", + "Saved!": "Enregistrê !", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Capteurs", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "Fixer le centre de rotation", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "S'enregistrer...", + "Single input.": "Entrée unique.", + "Single palette": "", + "Slider maximum value": "Valeur maximale du curseur", + "Slider minimum value": "Valeur minimale du curseur", + "Snap! website": "Snap! le site web", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Sons", + "Sound Recorder": "", + "Sounds": "", + "Sprite": "Lutin", + "Sprite Nesting": "", + "Stage": "Scène", + "Stage height": "", + "Stage selected: no motion primitives": "Scène sélectionnée : aucune brique de déplaçement", + "Stage size": "", + "Stage size...": "Taille de la scène...", + "Stage width": "", + "Stop": "arrêter", + "Stop sound": "arrêter un son", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Ellipse (Maj : cercle)", + "Stroked Rectangle (shift: square)": "Rectangle (Maj : carré)", + "Switch back to user mode": "Revenir en mode utilisateur", + "Switch to dev mode": "Passer en mode développeur", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Texte", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Scripts réentrants", + "Title text": "Texte du titre", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Traductions", + "Translators...": "Traducteurs...", + "Turbo mode": "", + "Turtle": "Pointeur", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Sans titre", + "Unused blocks...": "Blocs inutilisés...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - Rendre la variable interne visible pour l'appelant", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Nom de la variable", + "Variables": "", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Clavier virtuel", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Oui", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Colorations alternées", + "Zoom blocks": "", + "Zoom blocks...": "Agrandir les blocs...", + "_ at _": "_ sous _", + "_ combine _ using _": "_ combine les items de _ avec _", + "_ contains _": "_ contient _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ au début de _", + "_ keep items _ from _": "_ garder les items tels que _ de _", + "_ map _ over _": "_ appliquer _ à _", + "_ mod _": "", + "_ of _": "", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "_ à _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "un nouveau clone de _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "v. absolue", + "acos": "acos", + "add _ to _": "ajouter _ à _", + "add a new Turtle sprite": "ajouter un nouveau lutin Tortue", + "add a new sprite": "ajouter un nouveau lutin", + "add comment": "ajouter un commentaire", + "add comment here...": "ajoute un commentaire ici", + "agent": "", + "alert _": "", + "all": "tous", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "tous sauf le premier de _", + "all but this script": "tout sauf ce script", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "ancre", + "and": "et", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "réponse", + "any": "n'importe quel", + "any key": "touche quelconque", + "any message": "message quelconque", + "anything": "", + "append _": "", + "arrange scripts vertically": "", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "demander _ et attendre", + "ask _ for _ _": "demande à _ sa _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "arrière", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Êtes-vous sûr de vouloir supprimer ce bloc personnalisé et toutes ses instances ?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "luminosité", + "broadcast _ _": "envoyer _ _", + "broadcast _ _ and wait": "envoyer _ _ et attendre", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "appelle _ _", + "call _ w/continuation": "appelle _ avec continuation", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "le lutin pivote autour de son centre de rotation", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "ajouter à _ _", + "change _ effect by _": "ajouter à l'effet _ _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "ajouter à la _ du stylo _", + "change pen color by _": "ajouter _ à la couleur du stylo", + "change pen shade by _": "ajouter _ à l'intensité du stylo", + "change pen size by _": "ajouter _ à la taille du stylo", + "change size by _": "ajouter _ à la taille", + "change tempo by _": "ajouter _ au tempo", + "change volume by _": "", + "change x by _": "ajouter _ à x", + "change y by _": "ajouter _ à y", + "check for alternative GUI design": "cocher pour un style d'interface alternatif", + "check for block to text mapping features": "cocher pour activer la fonction de transformation : bloc vers texte", + "check for flat ends of lines": "cocher pour dessiner des fins de ligne plates", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "cocher pour une vitesse d'animation fixe et identique sur tous les ordinateurs", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "cocher pour toujours ouvrir la boîte de dialogue d'entrée en mode détaillé : avec tous les types de blocs", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "cocher pour interdire la réentrance des scripts et les exécuter séparément", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "cocher pour activer des couleurs alternées pour les blocs emboîtés", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "cocher pour activer un curseur coulissant dans le champ de saisie", + "check to enable keyboard editing support": "cocher pour activer l'édition au clavier", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "cocher pour activer le clavier virtuel pour les tablettes et smartphones : mobile devices", + "check to hide (+) symbols in block prototype labels": "cocher pour cacher le symbole (+) dans les étiquettes de définition de bloc", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "cocher pour favoriser l'exécution du script", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "cocher pour activer le cliquetis lors de l'emboîtement des blocs", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "cocher pour utiliser des rehauts et des ombres portées pleines", + "children": "enfants", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "arranger", + "clear": "effacer tout", + "clear graphic effects": "annuler les effets graphiques", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "cliquez ou faites dêfiler la ligne de mire pour dêfinir le centre de rotation du costume", + "clicked": "cliqué", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "couleur", + "color _ is touching _ ?": "couleur _ touche _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "combine les items de _ avec _", + "comic": "bande dessinée", + "command": "bloc de commande", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "costume n°", + "costume name": "", + "costumes": "", + "costumes tab help": "Importer une image depuis votre ordinateur ou une page web par un presser-glisser-déposer dans l'aire des costumes", + "could not connect to:": "", + "cr": "retours de ligne", + "create a clone of _": "créer un clone de _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "date courante _", + "current module versions:": "Versions du module courant :", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "pendiller?", + "data": "", + "date": "jour", + "day of week": "jour de la semaine", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "supprimer", + "delete _": "", + "delete _ of _": "supprimer l'élément _ de _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "supprimer les définitions de bloc", + "delete slot": "", + "delete this clone": "supprime ce clone", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "Détacher toutes les parties", + "detach and put into the hand": "", + "detach from": "Détacher de", + "development mode": "mode développeur", + "development mode debugging primitives:": "mode développement debugging primitives:", + "development mode...": "", + "dimensions": "", + "direction": "", + "disable deep-Morphic context menus and show user-friendly ones": "désactiver la fonction morphic", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "distance de _", + "distribution": "", + "don't rotate": "le lutin ne pivote jamais", + "down arrow": "flèche vers le bas", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "déplaçable avec la souris", + "draggable?": "déplaçable avec la souris?", + "dragging threshold": "", + "dropped": "déposé", + "duplicate": "dupliquer", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "bord", + "edit": "éditer", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "éditer...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "activer la fonction morphic", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exporter", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "Exporter...", + "extract": "", + "f": "f", + "false": "faux", + "file": "", + "file menu import hint": "importer un projet exporté, une bibliothèque de blocs un costume ou un son", + "fill": "remplir", + "fill page...": "", + "filtered for _": "filtré pour _", + "find blocks": "", + "find blocks...": "chercher des blocs...", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "trouver et supprimer les blocs personnalisés inutilisés", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "miroir ↔", + "flip ↕": "miroir ↕", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "pour _ allant de _ à _ _", + "for all sprites": "pour tous les lutins", + "for each _ in _ _": "pour chaque _ de _ _", + "for this sprite only": "pour ce lutin uniquement", + "forever _": "répéter indéfiniment _", + "frame": "", + "frames": "cadres", + "frequencies": "", + "frequency": "", + "front": "avant", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "transparence", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "glisser en _ sec. à x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "déplacer de _ plan arrière", + "go to _": "aller à _", + "go to _ layer": "aller à l' _ plan", + "go to x: _ y: _": "aller à x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "agrandir", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "Bonjour", + "help": "Aide", + "help...": "Aide...", + "hide": "cacher", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "cacher les primitives", + "hide variable _": "cacher la variable _", + "high": "", + "hour": "heure", + "http:// _": "", + "hue": "teinte", + "huge (4x)": "", + "i": "i", + "identical to": "identique à", + "if _ _": "si _ _", + "if _ _ else _": "si _ _ sinon _", + "if _ then _ else _": "si _ alors _ sinon _", + "if on edge, bounce": "rebondir si le bord est atteint", + "import a sound from your computer by dragging it into here": "Importer un son depuis votre ordinateur par un presser-glisser-déposer dans l'aire des sons", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "", + "input names:": "renseigner un nom :", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "insérer _ en position _ de _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "est _ ?", + "is _ a _ ?": "_ est un(e) _ ?", + "is _ empty?": "_ vide?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "élément _ de _", + "items": "", + "j": "j", + "join _": "regroupe _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "garder les items tels que _ de _", + "key": "", + "key _ pressed?": "touche _ pressée ?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Français", + "language_translator": "Jean-Jacques Valliet, Mark Rafter, Martin Quinson, Damien Caselli", + "large": "grand", + "last": "dernier", + "last changed": "", + "last_changed": "2020-10-28", + "launch _ _": "lance _ _", + "left": "", + "left arrow": "flèche vers la gauche", + "length": "", + "length of _": "longueur de _", + "length:": "Longueur :", + "let the World automatically adjust to browser resizing": "", + "letter": "lettres", + "letter _ of _": "lettre _ de _", + "light (70)": "", + "lightness": "", + "line": "lignes", + "lines": "", + "list": "liste", + "list _": "liste _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "Importer la bibliothèque officielle d'outils avancés", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "créer un nouveau bloc...", + "make a category...": "", + "make a copy and pick it up": "faire une copie et le déplacer", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "appliquer _ à _", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "mois", + "mosaic": "mosaïque", + "motion": "", + "mouse down?": "souris pressée ?", + "mouse position": "", + "mouse x": "souris x", + "mouse y": "souris y", + "mouse-departed": "quitté", + "mouse-entered": "survolé", + "mouse-pointer": "pointeur souris", + "move": "déplacer", + "move _ steps": "avancer de _ pas", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "attribut _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "moi-même", + "n": "n", + "name": "", + "neg": "", + "negative": "négatif", + "neighbors": "voisins", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "nouveau...", + "next": "", + "next costume": "costume suivant", + "none": "aucun", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "non _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "", + "number of channels": "", + "numbers from _ to _": "nombres de _ à _", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "ne dupliquer que ce bloc", + "only face left/right": "le lutin reste en position horizontale soit vers la gauche soit vers la droite", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "voir un résumé de ce projet dans une nouvelle fenêtre du navigateur", + "open a new window with a picture of all scripts": "ouvre une nouvelle fenêtre avec une image de tous les scripts", + "open a new window with a picture of the stage": "ouvre une nouvelle fenêtre avec une image de la scène", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "ouvrir une nouvelle fenêtre avec une image .png de ce script", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "ou", + "or before": "", + "other clones": "autres clones", + "other scripts in sprite": "les autres scripts de ce lutin", + "other sprites": "autres lutins", + "p": "p", + "paint a new sprite": "dessiner un nouveau lutin", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "mettre en pause _", + "pen": "", + "pen _": "", + "pen down": "stylo en position d'écriture", + "pen down?": "", + "pen trails": "traces de stylo", + "pen up": "relever le stylo", + "pen vectors": "", + "pic...": "image...", + "pick random _ to _": "nombre aléatoire entre _ et _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "pixelisation", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "jouer la note _ pour _ temps", + "play sound _": "jouer le son _", + "play sound _ at _ Hz": "", + "play sound _ until done": "jouer le son _ jusqu'au bout", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "se diriger en faisant un angle de _", + "point towards _": "se diriger vers _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "prédicat", + "presentation (1.4x)": "", + "pressed": "pressé", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "aléatoire", + "random position": "position aléatoire", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "renommer", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "renommer un costume", + "rename only this reporter": "", + "rename sound": "renommer un son", + "rename...": "Renommer...", + "repeat _ _": "répéter _ fois _", + "repeat until _ _": "répéter jusqu'à _ _", + "replace item _ of _ with _": "remplacer l'élément _ de _ par _", + "report _": "rapporte _", + "reporter": "bloc reporter", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "réinitialiser le chronomètre", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "faire une pause pour _ temps", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "flèche vers la droite", + "ring": "", + "ringify": "entourer", + "robot": "", + "rotate": "", + "rotation style": "sens de rotation", + "rotation x": "", + "rotation y": "", + "round _": "arrondi de _", + "run _ _": "exécute _ _", + "run _ w/continuation": "exécute _ avec continuation", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "sauvegarder le projet au format XML dans votre dossier Téléchargements", + "saved.": "", + "say _": "dire _", + "say _ for _ secs": "dire _ pendant _ sec.", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "image du script...", + "script variables _": "variables du script _", + "scripts": "", + "scripts pic...": "image des scripts...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "seconde", + "select": "sélectionner", + "selection": "", + "self": "moi-même", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "mettre l'effet _ à _", + "set _ of block _ to _": "", + "set _ to _": "mettre _ à _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "mettre l'instrument à _", + "set pen _ to _": "mettre la _ du stylo à _", + "set pen color to _": "mettre la couleur _ pour le stylo", + "set pen shade to _": "choisir l'intensité _ pour le stylo", + "set pen size to _": "mettre la taille du stylo à _", + "set size to _ %": "choisir _ % de la taille initiale", + "set tempo to _ bpm": "choisir le tempo à _ bpm", + "set this morph's alpha value": "", + "set turbo mode to _": "turbo mode prend la valeur _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "donner la valeur _ à x", + "set y to _": "donner la valeur _ à y", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "cocher pour préférer des entrées vides lors du glisser-déposer d'un reporter", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "montrer", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "tout montrer", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "montrer les définitions de bloc global personnalisé au format XML dans une nouvelle fenêtre de navigateur", + "show primitives": "montrer les primitives", + "show project data as XML in a new browser window": "ouvrir le projet au format XML dans une nouvelle fenêtre de votre navigateur", + "show table _": "", + "show the World's menu": "", + "show variable _": "afficher la variable _", + "shown?": "", + "shrink": "réduire", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "taille", + "slider": "curseur", + "slider max...": "max...", + "slider min...": "min...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "espace", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "découpe _ entre les _", + "sprite": "", + "sprites": "lutins", + "sqrt": "", + "square": "", + "stack size": "taille de la pile", + "stage": "scène", + "stage image": "", + "stamp": "estampiller", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "arrêter _", + "stop all _": "arrêter tout _", + "stop all sounds": "arrêter tous les sons", + "stop block": "arrêter le bloc", + "stop frequency": "", + "stop script": "arrêter le script", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "basculer sur le costume _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulations", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "dis à _ de _ _", + "tempo": "", + "temporary?": "", + "text": "texte", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "Aucun bloc inutilisé dans ce projet", + "there are currently no vectorizable pen trail segments": "", + "thing": "qqchose", + "think _": "penser _", + "think _ for _ secs": "penser _ pendant _ sec.", + "this _": "", + "this block": "ce bloc", + "this project doesn't have any custom global blocks yet": "ce projet ne contient pas de bloc global personnalisé", + "this script": "ce script", + "time in milliseconds": "heure en millisecondes", + "timer": "chronomètre", + "tip": "", + "to": "à", + "top": "", + "touch screen settings": "", + "touching _ ?": "couleur _ touchée ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "i.scool@mac.com", + "transparency": "transparence", + "transparency...": "", + "trash is empty": "", + "true": "vrai", + "turbo mode": "", + "turbo mode?": "turbo mode activé ?", + "turn _ _ degrees": "tourner de _ degrés _", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "type de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "décocher pour le style classique d'interface", + "uncheck for greater speed at variable frame rates": "décocher pour une vitesse d'animation maximale (mais variable)", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "décocher pour dessiner des fins de lignes arrondies", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "décocher pour ne pas préférer des entrées vides lors du glisser-déposer d'un reporter", + "uncheck to allow script reentrance": "décocher pour permettre la réentrance des scripts où certains s'exécutent en paralèlle", + "uncheck to always show (+) symbols in block prototype labels": "décocher pour montrer en permanance le symbole (+) dans les étiquettes de définition de bloc", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "décocher pour désactiver des couleurs alternées pour les blocs emboîtés", + "uncheck to disable block to text mapping features": "décocher pour déactiver la fonction de transformation : bloc vers texte", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "décocher pour désactiver le curseur coulissant dans le champ de saisie", + "uncheck to disable keyboard editing support": "décocher pour désactiver l'édition au clavier", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "décocher pour désactiver le clavier virtuel pour les tablettes et smartphones : mobile devices", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "décocher pour exécuter le script en vitesse normale", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "décocher pour désactiver le cliquetis lors de l'emboîtement des blocs", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "Décocher pour utiliser des rehauts et des ombres portées floues", + "uncheck to use the input dialog in short form": "décocher pour utiliser la boîte de dialogue d'entrée en mode simple", + "uncompile": "", + "undo": "défaire", + "undo the last block drop in this pane": "", + "undrop": "retour arrière", + "unicode _ as letter": "unicode _ comme lettre", + "unicode of _": "valeur unicode de _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "détourer", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Sans Titre", + "unused": "", + "unused block(s) removed": "bloc(s) inutilisé(s) supprimé(s)", + "up arrow": "flèche vers le haut", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "attendre _ sec.", + "wait until _": "attendre jusqu'à _", + "wardrobe": "", + "warp _": "", + "what's your name?": "Quel est ton nom ?", + "when I am _": "Quand je suis _", + "when I am clicked": "Quand je suis pressé", + "when I receive _ _": "Quand je reçois _ _", + "when I start as a clone": "Quand je commence comme clone", + "when _": "Quand _", + "when _ clicked": "Quand _ est pressé", + "when _ is edited _": "", + "when _ key pressed _": "Quand _ est pressé _", + "whirl": "tourbillon", + "whitespace": "espaces blancs", + "width": "", + "with data": "", + "with inputs": "avec entrées", + "word": "", + "world": "Monde", + "write _ size _": "", + "x": "x", + "x position": "position x", + "y": "y", + "y position": "position y", + "year": "année", + "year:": "", + "your own": "", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-gl.js b/elements/pl-snap/Snap/locale/lang-gl.js new file mode 100644 index 00000000..08ab207e --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-gl.js @@ -0,0 +1,1405 @@ +SnapTranslator.dict.gl = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "\"Bigger\" Data": "Traballando con «Big Data»", + "' does not exist in this context": "» non existe neste contexto", + "(-90) left": "(-90) esquerda", + "(0) up": "(0) arriba", + "(1) sine": "(1) ∿∿ (onda sinusoidal)", + "(180) down": "(180) abaixo", + "(2) square": "(2) ⎍⎍ (onda cadrada)", + "(3) sawtooth": "(3) ⩘⩘ (onda dente de serra)", + "(4) triangle": "(4) ⋀⋀ (onda triangular)", + "(90) right": "(90) dereita", + "(empty)": "(baleiro)", + "(in a new window)": "(nunha nova xanela)", + "(no matches)": "(sen resultados)", + "(temporary)": "", + "A variation on the list data type in which each list item aren't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.)": "Unha variación do tipo de dato «lista» no que cada elemento calculase só cando é necesario. Deste xeito poden construírse listas dun millón de elementos sen gastar tempo ou memoria, ou incluso listas infinitas. (Inclúese un bloque de exemplo que informa de todos os números primos.)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Sobre o Snap!", + "About...": "Sobre…", + "Account created.": "Conta creada.", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Permitir texto con múltiples liñas de entrada", + "An e-mail with your password has been sent to the address provided": "Enviouseche un correo-e, ao enderezo fornecido, co teu contrasinal.", + "An extended version of the HTTP:// block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc.": "Unha versión ampliada do bloque «HTTP://» que permite facer peticións «POST», «PUT», «DELETE» e «GET», utilizar o protocolo seguro «HTTPS» e controlar as cabeceiras, etc.", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "Animacións", + "Animations": "Animacións", + "Another custom block with this name exists.": "Xa existe outro bloque personalizado co mesmo nome.", + "Any (unevaluated)": "Calquera (sen avaliar)", + "Any type": "Calquera tipo", + "Apply": "Aplicar", + "April": "", + "Are you sure you want to continue?": "Confirmas que queres continuar?", + "Are you sure you want to delete": "Confirmas que queres eliminalo?", + "Are you sure you want to publish": "Confirmas que queres publicar?", + "Are you sure you want to replace": "Confirmas que queres substituír o proxecto orixinal?", + "Are you sure you want to share": "Confirmas que queres compartir", + "Are you sure you want to unpublish": "Confirmas que queres deixar de publicar?", + "Are you sure you want to unshare": "Confirmas que queres deixar de compartir", + "Audio Comp": "Composición de son", + "August": "agosto", + "Back...": "Atrás…", + "Backgrounds": "Fondos", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Data de nacemento:", + "Bitmap": "", + "Block Editor": "Editor de bloques", + "Blocks": "Bloques", + "Blocks category name:": "", + "Blurred shadows": "Sombras difusas", + "Boolean": "Booleano", + "Boolean (T/F)": "Booleano (V/F)", + "Boolean (unevaluated)": "Booleano (sen avaliar)", + "Bottom": "Abaixo", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Tamaño do pincel", + "Cache Inputs": "Entradas á memoria caché", + "Camera": "", + "Camera not supported": "Cámara non compatíbel", + "Camera support": "Compatibilidade coa cámara", + "Cancel": "Cancelar", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Capturar erros nun programa", + "Category color": "", + "Change Password": "Cambiar o contrasinal", + "Change Password...": "Cambiar o contrasinal…", + "Change block": "Cambiar tipo de bloque", + "Clear backup": "", + "Clicking sound": "Son do clic", + "Closed brush (free draw)": "Pincel pechado (man alzada)", + "Cloud": "Nube", + "Code mapping": "Asignando o código", + "Codification support": "Compatibilidade da produción de código", + "Colors and Crayons": "", + "Command": "Orde", + "Command (C-shape)": "Orde (forma C)", + "Command (inline)": "Orde (en liña)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Preservar proporcións das formas? (tamén pode premer a tecla «maiúsculas»)", + "Contents": "Contidos", + "Contributors": "Colaboradores", + "Control": "", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "Queres cambiar a mapa de bits?", + "Costume Editor": "Editor de vestimentas", + "Costumes": "Vestimentas", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "Crear e xestionar \"global/sprite/script\" variábeis a partires dun programa.", + "Create input name": "Crear unha rañura", + "Create variables": "", + "Create variables in program": "Creando variábeis dende o programa", + "Credits...": "Créditos…", + "Custom Block Translations": "", + "Database": "", + "Deal with JSON data": "Tratar con datos JSON", + "December": "decembro", + "Default": "Predeterminado", + "Default Value:": "Valor predeterminado:", + "Delete": "Eliminar", + "Delete Custom Block": "Eliminar o bloque personalizado", + "Delete Project": "Eliminar proxecto", + "Delete a variable": "Eliminar unha variábel", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "Baixar", + "Download source": "Descargar o código fonte", + "Dragging threshold...": "Limiar de arrastre…", + "Dynamic input labels": "Etiquetas de entrada dinámicas", + "E-mail address of parent or guardian:": "Enderezo de correo dos pais ou titores:", + "E-mail address:": "Enderezo de correo-e:", + "ERROR: INVALID PASSWORD": "ERRO: CONTRASINAL INCORRECTO", + "EXPERIMENTAL! check to enable live custom control structures": "EXPERIMENTAL! Marcar para activar estruturas de control personalizadas ao vivo.", + "EXPERIMENTAL! check to enable support for compiling": "EXPERIMENTAL! Marcar para activar a compatibilidade coa compilación", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "EXPERIMENTAL! Desmarcar para desactivar estruturas de control personalizadas ao vivo.", + "EXPERIMENTAL! uncheck to disable live support for compiling": "EXPERIMENTAL! Desmarque para desactivar a compatibilidade coa compilación dinámica", + "Edge color (left click)": "Cor do bordo (botón esquerdo)", + "Edit input name": "Editar a rañura", + "Edit label fragment": "Editar fragmento de etiqueta", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "A lei de Eisenberg di: Calquer cousa que poida facerse dende a interface gráfica tamén deberá poder facerse dende a linguaxe de programación e viceversa.", + "Ellipse (shift: circle)": "Elipse (maiúsculas: círculo)", + "Empty": "baleiro", + "Enable command drops in all rings": "Activar o arrastre de ordes a todos os aneis", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Introduce o código correspondente á definición do bloque. Escolla os seus propios nomes para os parámetros (ignorando os nomes amosados).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Introduce o código correspondente á definición do bloque. Use os nomes dos parámetros tal como son amosados e empregue para referenciar o código xerado da definición do corpo", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Introduce o código que corresponda á operación do bloque (normalmente unha simple invocación de rutina). Use <#n> para referenciar os argumentos tal como son amosados", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Introduce unha opción por liña. Opcionalmente, use «=» como separador entre chave e valor, e.g. a resposta=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Goma de borrar", + "Error": "", + "Examples": "Exemplos", + "Execute on slider change": "Executar cando hai cambios no potenciómetro", + "Export Project As...": "Exportar o proxecto como…", + "Export all scripts as pic...": "Exportar todos os obxectos como imaxe…", + "Export blocks": "Exportar bloques", + "Export blocks...": "Exportar bloques…", + "Export project as plain text...": "Exportar o proxecto como texto…", + "Export project...": "Exportar o proxecto…", + "Export summary with drop-shadows...": "Exportar resumo coas imaxes sombreadas…", + "Export summary...": "Exportar o resumo…", + "Extension blocks": "", + "Extract substrings of a string in various ways": "Extrae subcadeas dunha cadea de varias formas", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "febreiro", + "Fetching project from the cloud...": "Obtendo o proxecto da nube…", + "Fill a region": "Encher a área", + "Fill color (right click)": "Cor de enchido (botón dereito)", + "Filled Ellipse (shift: circle)": "Elipse chea (maiúsculas: círculo)", + "Filled Rectangle (shift: square)": "Rectángulo cheo (maiúsculas: cadrado)", + "First-Class Sprites": "Obxectos de primeira clase", + "Flat design": "Deseño recto", + "Flat line ends": "Extremos das liñas rectos", + "For all Sprites": "Para todos os obxectos", + "Frequency Distribution Analysis": "Analise da distribución de frecuencias", + "Generate costumes from letters or words of text.": "Xerar traxes a partires de letras ou palabras… ou calquera texto.", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "Asignando o encabezamento", + "Hello!": "Ola!", + "Hello, World!": "Ola mundo", + "Help": "Axuda", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Mmm…", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "Lin e declaro aceptar os Termos do servizo", + "If you cannot find that email, please check your spam folder.": "Se non atopa o correo, comprobe primeiro o cartafol do correo lixo.", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "E se non pode atopalo, empregue a opción de «Enviar de novo o correo de verificación…» nas opcións da nube do menú do Snap!", + "Import": "Importar", + "Import a new costume from your webcam": "Importar unha nova vestimenta coa webcam", + "Import blocks": "Importar bloques", + "Import library": "Importar biblioteca", + "Import sound": "Importar son", + "Import...": "Importar…", + "Imported": "Importado", + "In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "En xeral, as entradas de texto só aceptan unha única liña. O bloque MULTILIÑA acepta texto en varias liñas e pode empregarse como texto de entrada noutros bloques.", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Números enteiros de precisión infinita, racionais exactos e complexos", + "Inheritance support": "Compatibilidade coa a herdanza de obxectos", + "Input Names:": "Nomes de entradas:", + "Input Slot Options": "Opcións de rañura de entrada", + "Input name": "Nome da rañura", + "Input sliders": "Potenciómetros de entrada", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iteracións e composición", + "JIT compiler support": "Compatibilidade coa compilación JIT", + "January": "xaneiro", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "función JavaScript ( _ ) { _ }", + "JavaScript is not enabled": "A execución de Javascript está desactivada", + "July": "xullo", + "June": "xuño", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Edición usando teclado", + "Kind of": "Do tipo de", + "LEAP Motion controller": "Controlador para LEAP Motion", + "Language...": "Idioma…", + "Libraries...": "Bibliotecas…", + "License": "Licenza", + "License...": "Licenza…", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "Como o «switch» de C ou o «cond» de Lisp. Grazas a Nathan Dinsmore por desenvolver a idea dun bloque separado para cada rama!", + "Line tool (shift: constrain to 45º)": "Liñas (maiúsculas: só ángulos de 45º)", + "Line tool (shift: vertical/horizontal)": "Liñas (maiúsculas: vertical/horizontal)", + "List": "Lista", + "List utilities": "Utilidades para listas", + "Lists": "Listas", + "Live coding support": "Compatibilidade de programación ao vivo", + "Loading": "Cargando", + "Local Block(s) in Global Definition": "Bloques locais nunha definición global", + "Log pen vectors": "", + "Login...": "Acceder…", + "Logout": "Saír", + "Long form input dialog": "Forma longa da caixa de diálogo dos parámetros", + "Looks": "Aparencia", + "Make a block": "Crear un bloque", + "Make a variable": "Crear unha variábel", + "Manipulate costumes pixel-wise.": "", + "March": "marzo", + "May": "maio", + "Message name": "Nome da mensaxe", + "Method Editor": "Editor de métodos", + "Microphone": "", + "Microphone resolution...": "Resolución do micrófono…", + "Modules...": "Módulos…", + "Motion": "Movemento", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Condicionais compostos (conmutador)", + "Multiple inputs (value is list of inputs)": "Entradas múltiples (o valor é unha lista de entradas)", + "Nested auto-wrapping": "Encapsular bloques internos", + "New": "Novo", + "New Category": "", + "New Project": "Novo proxecto", + "New category...": "", + "New password:": "Novo contrasinal:", + "New scene": "", + "No": "Non", + "November": "novembro", + "Number": "Número", + "OK": "Aceptar", + "Object": "Obxecto", + "October": "outubro", + "Ok": "Aceptar", + "Old password:": "Contrasinal actual:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "Unha das mellores ideas de Logo non incluída no Scratch é a de considerar un texto como unha secuencia de palabras e frases, no canto de simplemente unha cadea de caracteres. Esta biblioteca recupera esa idea.", + "Open": "Abrir", + "Open Project": "Abrir o proxecto", + "Open in Community Site": "", + "Open...": "Abrir…", + "Opening project...": "Abrindo o proxecto…", + "Operators": "Operadores", + "Other": "Outros", + "Output text using speech synthesis.": "", + "Paint Editor": "Editor de pintura", + "Paint a new costume": "Pintar unha nova vestimenta.", + "Paint a shape (shift: edge color)": "Pintar a forma (maiúsculas: cor do bordo)", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Pincel (man alzada)", + "Parallelization": "Paralelización", + "Part of": "Parte de", + "Parts": "Partes", + "Password:": "Contrasinal:", + "Pen": "Lapis", + "Persist linked sublist IDs": "Persistencia dos ID de sublistas ligadas", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipeta (recoller unha cor en calquera sitio)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Recolector de cor (recolle unha cor de calquera lugar, maiúsculas: para a cor de enchido)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "Píxeles", + "Plain prototype labels": "Etiquetas dos prototipos simples", + "Play": "Reproducir", + "Play sound": "Reproducir o son", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Comprobe que o navegador está actualizado e a webcam ben configurada. Algúns navegadores tamén requiren HTTPS para empregar a cámara. Pode probalo cambiando o enderezo «http://» por «https://»\".", + "Please use the verification link that was sent to your email address when you signed up.": "Utilice a ligazón de verificación que se lle enviou ao seu enderezo de correo-e cando se inscribiu.", + "Polygon": "Polígono", + "Predicate": "Predicado", + "Prefer empty slot drops": "Dar preferencia ás rañuras baleiras", + "Prefer smooth animations": "Preferir animacións suaves", + "Privacy...": "Privacidade…", + "Project Notes": "Notas do proxecto", + "Project URLs": "URL do proxectomostra", + "Project notes...": "Notas do proxecto…", + "Provide 100 selected colors": "Fornece unha paleta de 100 cores seleccionadas", + "Provide getters and setters for all GUI-controlled global settings": "Fornece «getters» e «setters» para todos os axustes globais controlados pola IGU", + "Publish": "Publicar", + "Publish Project": "Publicar o proxecto", + "Rasterize SVGs": "Transformar SVG en mapas de bits", + "Record a new sound": "Gravar un novo son", + "Recover": "Recuperar", + "Rectangle (shift: square)": "Rectángulo (maiúsculaa: cadrado)", + "Reference manual": "Manual de referencia", + "Remove a category...": "", + "Remove unused blocks": "Retirar bloques non utilizados", + "Repeat Password:": "Repite o contrasinal:", + "Repeat new password:": "Repita o contrasinal:", + "Replace Project": "Substituír o proxecto", + "Replace the current project with a new one?": "Substituír o proxecto actual por un novo?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Informa da posición das mans dende un controlador de movemento LEAP (leapmotion.com).", + "Reporter": "Reporteiro", + "Request blocked": "", + "Resend Verification Email...": "Enviar de novo o correo de verificación…", + "Resend verification email": "Enviar de novo o correo de verificación", + "Reset Password...": "Recuperar o contrasinal…", + "Reset password": "Recuperar o contrasinal", + "Restore unsaved project": "", + "Retina display support": "Compatibilidade para pantallas Retina", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Executa un programa; se ocorre un erro, no canto de deter o programa cun aviso vermello, permite executar outro programa para xestionar o erro. Inclúe tamén un bloque para enviar un erro cunha mensaxe dada como entrada e tamén un bloque para crear unha variábel do programa e darlle un valor.", + "Run several scripts in parallel and wait until all are done.": "Executar varios programas en paralelo e agardar que todos eles rematen.", + "SVG costumes are not yet fully supported in every browser": "As vestimentas SVG aínda non son totalmente compatíbeis en todos os navegadores", + "Same Named Blocks": "Bloques co mesmo nome", + "Save": "Gardar", + "Save As...": "Gardar como…", + "Save Project": "Gardar proxecto", + "Save Project As...": "Gardar o proxecto como…", + "Save and restore pictures drawn by pen": "Gardar e restaurar as imaxes debuxadas co lapis", + "Save to disk": "Gardar no disco", + "Saved!": "Gardado!", + "Saving project to the cloud...": "Gardando o proxecto na nube…", + "Scenes...": "", + "Script variable name": "Nome da variábel do programa", + "Scripts": "Programas", + "Select a costume from the media library": "Seleccionar unha vestimenta da mediateca.", + "Select a sound from the media library": "Seleccionar un son da mediateca.", + "Select categories of additional blocks to add to this project.": "Seleccionar categorías de bloques adicionais a engadir a este proxecto.", + "Selection tool": "Ferramenta de selección", + "Sensing": "Sensores", + "September": "setembro", + "Serial Ports": "", + "Service:": "Servizo:", + "Set RGB or HSV pen color": "Estabelecer a cor RGB ou HSV do lapis", + "Set or report pen color as RGB (red, green, blue) or HSV (hue, saturation, value).": "Fixa ou informa da cor do lapis en RGB (vermello, verde e azul) ou en HSV (tonalidade, saturación e valor).", + "Set the rotation center": "Estabelecer o centro de rotación", + "Share": "Compartir", + "Share Project": "Compartir o proxecto", + "Show buttons": "", + "Show categories": "", + "Sign in": "Acceder", + "Sign up": "Rexistrar nova conta", + "Signada (Network remote control)": "", + "Signup": "Rexistro de nova conta", + "Signup...": "Rexistrar unha nova conta…", + "Single input.": "Entrada única", + "Single palette": "", + "Slider maximum value": "Valor máximo do potenciómetro", + "Slider minimum value": "Valor mínimo do potenciómetro", + "Snap! website": "Sitio web do Snap!", + "Snap!Cloud": "NubeSnap!", + "Some standard functions on lists (append, reverse, etc.)": "Algunhas funcións estándar para listas (append, reverse, etc.)", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Son", + "Sound Recorder": "Gravadora de son", + "Sounds": "", + "Sprite": "Obxecto", + "Sprite Nesting": "Obxectos compostos", + "Stage": "Escenario", + "Stage height": "Altura do escenario", + "Stage selected: no motion primitives": "Escenario seleccionado: non hai primitivas de movemento dispoñíbeis", + "Stage size": "Tamaño do escenario", + "Stage size...": "Tamaño do escenario…", + "Stage width": "Largura do escenario", + "Standard library of powerful blocks (for, map, etc.)": "Biblioteca estándar de potentes bloques (for, map, etc.)", + "Stop": "Parar", + "Stop sound": "Parar o son", + "Streams (lazy lists)": "Fluxos (listas preguizosas)", + "String processing": "Procesamento de cadeas de texto", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Elipse (maiúsculas: círculo)", + "Stroked Rectangle (shift: square)": "Rectángulo (maiúsculas: cadrado)", + "Switch back to user mode": "Volver ao modo usuario/a", + "Switch to dev mode": "Cambiar a modo de desenvolvemento", + "Switch to vector editor?": "Queres cambiar para o editor vectorial?", + "Table lines": "Liñas de táboas", + "Table support": "Edición de táboas", + "Table view": "Ver como táboa", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Termos do servizo…", + "Ternary Boolean slots": "Tres opcións para as rañuras booleanas", + "Text": "Texto", + "Text Costumes": "Traxes de texto", + "Text to Speech": "", + "Text to speech": "Texto a voz", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "A torre numérica completa do «Scheme». Empregar «USE BIGNUMS >» para activala.", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "Esta definición de bloque global contén un ou máis bloques personalizados locais que hai que eliminar primeiro.", + "This will convert your vector objects into bitmaps,": "O cambio converterá os obxectos vectoriais nun mapa de bits,", + "This will erase your current drawing.": "O cambio de editor borrará o debuxo actual.", + "Thread safe scripts": "Fíos de execución seguros", + "Title text": "Texto do título", + "Today": "", + "Today,": "Hoxe,", + "Top": "Arriba", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Construcción de bucles estándar (while, until, etc.), construcións «named let« propias de Lisp (unha xeneralización dos bucles «for»), iteración funcional (repeticións de chamadas a unha función) e composición de funcións.", + "Translations": "Traduccións", + "Translators...": "Tradutores…", + "Turbo mode": "Modo turbo", + "Turn JSON strings into lists with the listify block, then retrieve data out of them by using the value at key block.": "Transforma as cadeas JSON en listas co bloque «listify» (listar), e após recupera datos delas usando o valor do bloque de chaves.", + "Turtle": "Tartaruga", + "Undelete sprites...": "", + "Unpublish": "Deixar de publicar", + "Unpublish Project": "Deixar de publicar o proxecto", + "Unsaved Changes!": "", + "Unshare": "Deixar de compartir", + "Unshare Project": "Deixar de compartir o proxecto", + "Untitled": "Sen título", + "Unused blocks...": "Bloques non utilizados…", + "Unverified account:": "Conta sen verificar:", + "Up": "Subir", + "Updating project list...": "Actualizando a lista de proxectos…", + "Uploading": "Enviando", + "Upvar - make internal variable visible to caller": "Saída; fai visíbel unha variábel interna ao chamador", + "Use CPU for graphics": "", + "User name must be four characters or longer": "O nome de usuario/a ten que ter polo menos catro caracteres.", + "User name:": "Nome do usuario:", + "Variable name": "Nome da variábel", + "Variables": "Variábeis", + "Variadic reporters": "Reporteiros de ariedade variábel", + "Vector": "", + "Vector Paint Editor": "Editor vectorial de imaxes", + "Versions of +, x, AND, and OR that take more than two inputs.": "Versións de +, x, AND, e OR que toman máis de dúas rañuras.", + "Virtual keyboard": "Teclado virtual", + "Visible stepping": "Trazado paso a paso visíbel", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Acceso a servizos web (https)", + "Words, sentences": "Palabras e frases", + "World Map": "Mapa do mundo", + "World...": "Mundo…", + "Would you like to replace it?": "Queres substituílo?", + "Yes": "Si", + "Yesterday": "", + "Yesterday,": "Onte,", + "You are not logged in": "Aínda non te autenticaches", + "You are now logged in, and your account is enabled for three days.": "Agora estás conectado e a túa conta estará activada só durante tres días.", + "You have": "Ten", + "Zebra coloring": "Coloración de cebra", + "Zoom blocks": "Ampliación dos bloques", + "Zoom blocks...": "Ampliación dos bloques…", + "[EXPERIMENTAL] analyze data for frequency distribution": "[EXPERIMENTAL] Analizar datos para obter a súa distribución de frecuencias.", + "[EXPERIMENTAL] crunch large lists very fast": "[EXPERIMENTAL] Procesar listas grandes de forma moi rápida.", + "_ at _": "", + "_ combine _ using _": "_ combinar os elementos de _ con _", + "_ contains _": "_ contén _", + "_ effect": "efecto _", + "_ find first item _ in _": "_ primeiro elemento onde _ de _", + "_ in front of _": "inserir _ ao principio de _", + "_ keep items _ from _": "_ mantér os elementos onde _ de _", + "_ map _ over _": "_ asignar _ sobre _", + "_ mod _": "o resto de _ ao dividilo entre _", + "_ of _": "", + "_ of block _": "", + "_ of costume _": "_ da vestimenta _", + "_ of sound _": "_ do son _", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "un novo clon de _", + "a variable of name '": "A variábel chamada «", + "about morphic.js...": "sobre o morphic.js…", + "abs": "abs (valor absoluto)", + "acos": "acos (arco-coseno)", + "add _ to _": "engadir _ á lista _", + "add a new Turtle sprite": "Engadir un novo obxecto.", + "add a new sprite": "engadir un novo obxecto", + "add comment": "Engadir un comentario", + "add comment here...": "Engade aquí un comentario…", + "agent": "", + "alert _": "Amosar alerta con _", + "all": "todo", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ sen o primeiro elemento", + "all but this script": "todos os programas agás este", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "valor d canle alfa:", + "analyze, manipulate and generate sound samples.": "Analiza, manipula e xera mostras de son", + "anchor": "a áncora", + "and": "e", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "e non poderás convertelos de novo a debuxos vectoriais..", + "animation demo": "exemplo de animación", + "answer": "", + "any": "calquera", + "any key": "calquera tecla", + "any message": "calquera mensaxe", + "anything": "", + "append _": "", + "arrange scripts vertically": "Organizar os programas verticalmente", + "arrowDown": "frecha abaixo", + "arrowDownOutline": "contorno de frecha abaixo", + "arrowLeft": "frecha esquerda", + "arrowLeftOutline": "contorno de frecha esquerda", + "arrowRight": "frecha dereita", + "arrowRightOutline": "contorno de frecha dereita", + "arrowUp": "frecha arriba", + "arrowUpOutline": "contorno de frecha arriba", + "asin": "asin (arco-seno)", + "ask _ and wait": "preguntar _ e agardar pola resposta", + "ask _ for _ _": "preguntar a _ por _ _", + "atan": "atan (arco-tanxente)", + "attach...": "xuntar…", + "b": "b", + "back": "atrás", + "balance": "", + "big (2x)": "grande (2x)", + "bigger menu fonts and sliders": "Fai máis grandes os potenciómetros e os menús", + "bins": "compartimentos", + "block": "", + "block deletion dialog text": "Confirmas que queres eliminar este bloque personalizado e todas as súas instancias?", + "block variables": "variábeis de bloque", + "block variables...": "variábeis de bloque…", + "block-solid (0)": "", + "blockify": "", + "blocks": "bloques", + "blue": "", + "blurred shadows...": "sombras difusas…", + "blurry shades, use for new browsers": "Usar sombras difusas para navegadores modernos", + "bottom": "", + "box": "", + "brightness": "brillo", + "broadcast _ _": "enviar _ _", + "broadcast _ _ and wait": "enviar _ _ e agardar", + "brush": "pincel", + "build": "Constrúe", + "but getting a": "", + "c": "c", + "call _ _": "chamar _ _", + "call _ w/continuation": "chamar _ con continuación", + "caller": "", + "camera": "cámara", + "can only write text or numbers, not a": "", + "can rotate": "pode xirar", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "arredondar por riba", + "center": "centro", + "center x": "centro x", + "center y": "centro y", + "change _ by _": "aumentar _ en _", + "change _ effect by _": "engadir ao efecto _ o valor _", + "change background _ by _": "cambiar _ do fondo en _", + "change balance by _": "aumentar o balance en _", + "change pen _ by _": "cambiar _ do lapis a _", + "change pen color by _": "cambiar á cor do lapis a _", + "change pen shade by _": "cambiar á intensidade do lapis en _", + "change pen size by _": "cambiar o tamaño do lapis en _", + "change size by _": "engadir _ % ao tamaño", + "change tempo by _": "aumentar o tempo en _", + "change volume by _": "aumentar o volume en _", + "change x by _": "engadir _ á coordenada x", + "change y by _": "engadir _ á coordenada y", + "check for alternative GUI design": "Marcar para obter unha interface gráfica alternativa.", + "check for block to text mapping features": "Desmarcar para funcionalidades de asignación entre bloques e texto.", + "check for flat ends of lines": "Marcar para facer que os extremos das liñas sexan rectos", + "check for higher contrast table views": "Marcar para vistas de táboa con maior contraste.", + "check for higher resolution, uses more computing resources": "Marcar para maior resolución; consume máis recursos computacionais.", + "check for multi-column list view support": "Marcar para a compatibilidade de vistas multicolumna de listas.", + "check for smooth, predictable animations across computers": "Marcar para obter animacións máis suaves e previsíbeis entre computadoras", + "check for sprite inheritance features": "Marcar para activar funcionalidades de herdanza de obxectos.", + "check to allow empty Boolean slots": "Marcar para permitir rañuras booleanas baleiras", + "check to always show slot types in the input dialog": "Marcar para amosar sempre os tipos de espazos na caixa de diálogo", + "check to cache inputs boosts recursion": "Marcar para memorizar as entradas na caché (acelera a recursividade).", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "Marcar para denegar a reentrada nos programas", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "Marcar para activar as animacións da interface", + "check to enable alternating colors for nested blocks": "Marcar para alternar as cores dos bloques aniñados", + "check to enable auto-wrapping inside nested block stacks": "Marcar para activar a envoltura automática dentro de moreas aniñadas", + "check to enable camera support": "Marcar para activar a compatibilidade da cámara", + "check to enable dropping commands in all rings": "Marcar para activar o arrastre de ordes en todos os aneis", + "check to enable dynamic labels for variadic inputs": "Marcar para activar etiquetas dinámicas para entradas de ariedade variábel", + "check to enable input sliders for entry fields": "Marcar para activar os potenciómetros de entrada.", + "check to enable keyboard editing support": "Marcar para activar a edición usando o teclado.", + "check to enable project data in URLs": "Marcar para activar os datos do proxecto nos URL.", + "check to enable saving linked sublist identities": "Marcar para activar o almacenamento das identidades de sublistas ligadas.", + "check to enable sprite composition": "Marcar para activar a composición de obxectos", + "check to enable support for first-class sprite": "Marcar para activar a compatibilidade de obxectos de primeira clase.", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "Marcar para activar a compatibilidade para teclado virtual para dispositivos móbiles", + "check to hide (+) symbols in block prototype labels": "Marcar para agochar os símbolos (+) no texto dos prototipos dos bloques", + "check to inherit from": "Marcar para herdar de", + "check to prevent contents from being saved": "Marcar para non gardar o contido no proxecto", + "check to prioritize script execution": "Marcar para priorizar a execución dos programa", + "check to rasterize SVGs on import": "Marcar para transformar os ficheiros SVG en mapas de bits durante a importación.", + "check to run the edited script when moving the slider": "Marcar para activar a execución dos programasao mover o potenciómetro", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "Marcar para activar a execución de Javascript", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "Marcar para activar o son ao facer clic", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "Marcar para activar a execución paso a paso visíbel (lento)", + "check to use blurred drop shadows and highlights": "Marcar para usar sombras e realces difusos", + "children": "os descendentes", + "choose another color for this morph": "Escolle outra cor para este «morph»", + "choose the World's background color": "Escolle a cor de fondo do Mundo", + "circle": "circunferencia", + "circle box": "", + "circleSolid": "círculo", + "clean up": "limpar", + "clear": "limpar", + "clear graphic effects": "eliminar efectos gráficos", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "facer clic e arrastrar a mira para alterar o centro de rotación", + "clicked": "facer clic", + "clone": "clonar", + "clones": "os clons", + "closedBrush": "pincel pechado", + "cloud": "nube", + "cloud unavailable without a web server.": "A nube non está dispoñíbel sen un servidor web.", + "cloudGradient": "nube con degradado", + "cloudOutline": "contorno de nube", + "code": "código", + "code mapping...": "asignando o código…", + "code of _": "o código de _", + "collection": "colección", + "color": "cor", + "color _ is touching _ ?": "a cor _ está a tocar na cor _ ?", + "color palette": "paleta de cores", + "color picker": "selector de cor", + "color...": "cor…", + "color:": "cor:", + "columns": "", + "combinations _": "", + "combine _ using _": "combina os elementos de _ con _", + "comic": "historieta", + "command": "orde", + "comment pic...": "imaxe do comentario…", + "compile": "compilar", + "compile _": "", + "compile _ for _ args": "compilar _ para _ argumentos", + "confetti": "", + "console log _": "rexistrar _ na consola", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos (coseno)", + "costume": "vestimenta", + "costume #": "vestimenta núm.", + "costume name": "nome da vestimenta", + "costumes": "vestimentas", + "costumes tab help": "Podes importar unha imaxe doutro sitio web ou do teu computador arrastrándoa aquí", + "could not connect to:": "Non foi posíbel conectar con:", + "cr": "retorno de carro", + "create a clone of _": "crear un clon de _", + "cross": "cruz", + "crosshairs": "punto de mira", + "current": "", + "current _": "_ actuais", + "current module versions:": "Versións actuais dos módulos", + "current parent": "proxenitor actual", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "pendurado doutro?", + "data": "", + "date": "día", + "day of week": "día da semana", + "days left": "días restantes", + "days left.": "dias restantes.", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "Eliminar", + "delete _": "eliminar _", + "delete _ of _": "eliminar _ da lista _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "Eliminar a definición do bloque…", + "delete slot": "", + "delete this clone": "eliminar este clon", + "delete variable": "", + "delimiter": "delimitador", + "demo (1.2x)": "demostración (1.2x)", + "demo...": "exemplo…", + "detach all parts": "soltar todas as partes", + "detach and put into the hand": "Arrastrar e mover co punteiro", + "detach from": "soltar de", + "development mode": "modo de desenvolvemento", + "development mode debugging primitives:": "Primitivas de depuración do modo de desenvolvemento:", + "development mode...": "modo de desenvolvemento…", + "dimensions": "", + "direction": "dirección", + "disable deep-Morphic context menus and show user-friendly ones": "Desactivar os menús de contextodo «Morphic» profundo e amosar menús amigábeis.", + "disable developers' context menus": "Desactiva os menús do modo de desenvolvemento", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "estás desconectado.", + "distance": "distancia", + "distance to _": "distancia ata _", + "distribution": "", + "don't rotate": "non xira", + "down arrow": "frecha abaixo", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "arrastrábel?", + "draggable?": "arrastrábel?", + "dragging threshold": "limiar para o arrastre", + "dropped": "arrastrar e soltar", + "duplicate": "duplicar", + "duplicate block definition...": "Duplicar a definición deste bloque…", + "duration": "duración", + "e": "e", + "e^": "e^ (exponencial)", + "edge": "bordo", + "edit": "editar", + "edit rotation point only...": "editar só o punto de rotación…", + "edit the costume's rotation center": "Cambiar o centro de rotación da vestimenta", + "edit...": "Editar…", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "Activar os menús de contexto e os inspectores do «Morphic», non amigábeis.", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "Entrando no modo de desenvolvemento. A captura de erros está desconectada, empregue a consola web do navegador para ver as mensaxes de erro.", + "entering user mode": "Entrando no modo de usuario", + "eraser": "borrador", + "exceeding maximum number of clones": "", + "expecting": "Agardando", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "Experimental – en construción", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "experimental! faga este reporteiro rápido e ininterrompíbel PRECAUCIÓN: Os erros do anel poden quebrar a súa sesión do Snap!", + "export": "Exportar", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "Exportar proxecto como datos da nube…", + "export project media only...": "Exportar só os medios do proxecto…", + "export project without media...": "Exportar proxecto sen os medios…", + "export script": "", + "export...": "exportar…", + "extract": "", + "f": "f", + "false": "falso", + "file": "ficheiro", + "file menu import hint": "Importar proxectos, bloques, vestimentas ou sons", + "fill": "encher", + "fill page...": "encher a páxina…", + "filtered for _": "filtrado para _", + "find blocks": "Buscar bloques", + "find blocks...": "buscar bloques…", + "find first item _ in _": "primeiro elemento onde _ de _", + "find unused global custom blocks and remove their definitions": "Atopar bloques globais personalizados sen usar e retirar as súas definicións", + "fisheye": "ollo de peixe", + "flag": "bandeira", + "flash": "", + "flat line ends": "puntas do lapis rectas", + "flatten": "", + "flip ↔": "inverter ↔", + "flip ↕": "inverter ↕", + "floor": "arredondar por abaixo", + "footprints": "pegadas", + "for _ = _ to _ _": "para _ = _ ata _ _", + "for all sprites": "para todos os obxectos", + "for each _ in _ _": "para cada _ de _ _", + "for this sprite only": "só para este obxecto", + "forever _": "por sempre _", + "frame": "marco", + "frames": "marcos", + "frequencies": "frecuencias", + "frequency": "frecuencia", + "front": "diante", + "fullScreen": "pantalla completa", + "g": "g", + "gears": "engrenaxes", + "get blocks": "", + "get data": "", + "ghost": "pantasma", + "giant (8x)": "xigante (8x)", + "glide _ secs to x: _ y: _": "esvarar _ seg cara a x: _ y: _", + "glide, grow and rotate using easing functions.": "Facer esvarar, medrar e xirar obxectos usando formas e filtros diferentes nas animacións", + "global?": "", + "globe": "globo terráqueo", + "go back _ layers": "enviar atrás _ capas", + "go to _": "ir a _", + "go to _ layer": "enviar á capa _", + "go to x: _ y: _": "ir a x: _ y: _", + "gray scale palette": "paleta de escala de grises", + "green": "", + "grow": "aumentar", + "h": "h", + "handle": "asa", + "header": "encabezamento", + "header mapping...": "asignando o encabezamento…", + "height": "alto", + "hello": "ola", + "help": "Axuda", + "help...": "Axuda…", + "hide": "agochar", + "hide all...": "agochalo todo…", + "hide blocks...": "", + "hide primitives": "Agochar os bloques primitivos", + "hide variable _": "agochar a variábel _", + "high": "", + "hour": "", + "http:// _": "o recurso http:// _", + "hue": "tonalidade", + "huge (4x)": "enorme (4x)", + "i": "i", + "identical to": "idéntico a", + "if _ _": "se _ _", + "if _ _ else _": "se _ _ se non _", + "if _ then _ else _": "se _ entón _ se non _", + "if on edge, bounce": "rebotar se toca nun bordo", + "import a sound from your computer by dragging it into here": "Podes importar un son do teu computador arrastrándoo aquí", + "import without attempting to parse or format data": "Importar sen tentar analizar ou formatar os datos", + "import...": "importar…", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "herdar _", + "inherited": "herdado", + "input list:": "Lista de entradas:", + "input names:": "nomes de entradas:", + "input(s), but getting": "argumento(s), mais pasaron", + "inputs": "", + "insert _ at _ of _": "inserir _ na posición _ de _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "examinar…", + "is _ ?": "é _ ?", + "is _ a _ ?": "_ é un/unha _ ?", + "is _ empty?": "_ baleira?", + "is _ on?": "está o parámetro _ activado?", + "is not a valid option": "", + "is read-only": "", + "item": "elemento", + "item _ of _": "elemento _ de _", + "items": "elementos", + "j": "j", + "join _": "xuntar _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "Mantér todos os «submorph» dentro e deixalos visíbeis", + "keep items _ from _": "manter os elementos onde _ de _", + "key": "", + "key _ pressed?": "tecla _ premida?", + "keyboard": "teclado", + "keyboardFilled": "teclado", + "l": "l", + "label": "", + "language_name": "Galego", + "language_translator": "tecnoloxia <2016>,Miguel A. Bouzada <2019>", + "large": "grande", + "last": "último", + "last changed": "última modificación", + "last_changed": "2019-07-29", + "launch _ _": "iniciar _ _", + "left": "", + "left arrow": "frecha esquerda", + "length": "lonxitude", + "length of _": "lonxitude de _", + "length:": "lonxitude:", + "let the World automatically adjust to browser resizing": "Permite que o Mundo se axuste automaticamente ao cambio de tamaño do navegador", + "letter": "letra", + "letter _ of _": "letra _ de _", + "light (70)": "", + "lightness": "", + "line": "liña", + "lines": "", + "list": "lista", + "list _": "lista _", + "list view...": "ver como lista…", + "ln": "ln (logaritmo neperiano)", + "location": "localización", + "lock": "bloquear", + "log pen vectors": "", + "login": "acceso", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "contorno de lupa", + "magnifyingGlass": "", + "make a block...": "Crear un bloque…", + "make a category...": "", + "make a copy and pick it up": "Facer unha copia e collela", + "make a morph": "crear un «morph»", + "make temporary and hide in the sprite corral": "faino temporal e agóchao na área dos obxectos", + "make this morph movable": "Fai que este «morph» poida ser movido", + "make this morph unmovable": "Fai que este «morph» non poida ser movido", + "manipulate costumes pixel-wise.": "Manipula vestimentas a nivel de píxel.", + "map String to code _": "asignar texto no código _", + "map _ of _ to code _": "asignar _ de _ no código _", + "map _ over _": "asignar _ sobre _", + "map _ to _ _": "asignar _ no _ _", + "max": "máxima", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "Mensaxe", + "microphone _": "_ do micrófono", + "middle": "medio", + "minimum": "", + "minute": "minuto", + "mirror video": "espello sobre o vídeo", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruoso (10x)", + "month": "", + "mosaic": "mosaico", + "motion": "movemento", + "mouse down?": "botón do rato premido?", + "mouse position": "", + "mouse x": "coordenada x do rato", + "mouse y": "coordenada y do rato", + "mouse-departed": "separar o rato", + "mouse-entered": "tocar co rato", + "mouse-pointer": "punteiro do rato", + "move": "mover", + "move _ steps": "mover _ pasos", + "move all inside...": "mover todo para dentro…", + "move...": "mover…", + "my": "", + "my _": "o() meu(s) _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "eu mesmo", + "n": "n", + "name": "nome", + "neg": "oposto", + "negative": "negativo", + "neighbors": "os veciños", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "Nova liña", + "new sound _ rate _ Hz": "", + "new...": "Nova…", + "next": "", + "next costume": "seguinte vestimenta", + "none": "ningún", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "escenario normal", + "not": "non", + "not _": "non _", + "note": "", + "nothing": "", + "now connected.": "estás conectado.", + "number": "número", + "number of channels": "número de canles", + "numbers from _ to _": "números dende _ a _", + "o": "o", + "object _": "obxecto _", + "octagon": "octógono", + "only duplicate this block": "Duplicar só este bloque", + "only face left/right": "só mira á esquerda ou á dereita", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "Abre unha xanela do navegador cun resumo deste proxecto", + "open a new browser browser window with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "Abrir unha nova xanela no navegador contendo un resumo deste proxecto co todas as imaxes sombreadas (non admitido en todos os navegadores)", + "open a new window with a picture of all scripts": "Abre unha nova xanela cunha imaxe de todos os programas", + "open a new window with a picture of both this script and its result": "Abrir unha nova xanela cunha imaxe tanto deste programa como do seu resultado.", + "open a new window with a picture of the stage": "Abrir unha nova xanela cunha imaxe do escenario", + "open a new window with a picture of this comment": "Abrir unha nova xanela cunha imaxe deste comentario.", + "open a new window with a picture of this morph": "Abre unha xanela cunha imaxe deste «morph»", + "open a new window with a picture of this script": "Abrir unha nova xanela cunha imaxe deste programa", + "open a window on all properties": "Abre unha xanela con todas as propiedades", + "open in another dialog...": "Abrir noutra caixa de diálogo…", + "open in dialog...": "abrir nunha caixa de diálogo…", + "open shared project from cloud...": "Abrir proxecto compartido a partir da nube…", + "options...": "opcións…", + "or": "ou", + "or before": "ou antes", + "other clones": "outros clons", + "other scripts in sprite": "outros programas no obxecto", + "other sprites": "outros obxectos", + "output text using speech synthesis.": "Gracias á síntese de voz computerizada, podemos obter son a partires dun texto", + "p": "p", + "paint a new sprite": "Pintar un novo obxecto.", + "paintbucket": "balde de tinta", + "parameters": "parámetros", + "parent": "o proxenitor", + "parent...": "proxenitor…", + "parts": "as partes", + "password has been changed.": "o seu contrasinal foi cambiado.", + "password must be six characters or longer": "O contrasinal ten que ter polo menos seis caracteres.", + "passwords do not match": "os contrasinais non coinciden.", + "paste on _": "", + "pause": "", + "pause all _": "poñer en pausa todo _", + "pen": "lapis", + "pen _": "_ do lapis", + "pen down": "baixar lapis", + "pen down?": "lapis abaixo?", + "pen trails": "riscos do lapis", + "pen up": "subir lapis", + "pen vectors": "", + "pic...": "imaxe…", + "pick random _ to _": "número ao chou entre _ e _", + "pick up": "coller este «morph»", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "ton", + "pivot": "pivotar", + "pixel": "", + "pixelate": "pixelado", + "pixels": "píxeles", + "play _ Hz for _ secs": "reproducir _ Hz durante _ segundos", + "play frequency _ Hz": "reproducir a frecuencia _ Hz", + "play note _ for _ beats": "reproducir a nota _ durante _ pulsos", + "play sound _": "reproducir son _", + "play sound _ at _ Hz": "reproducir o son _ a _ Hz", + "play sound _ until done": "reproducir son _ ata rematar", + "please agree to the TOS": "Acepta os Termos do servizo.", + "please fill out this field": "Cubre este campo.", + "please provide a valid email address": "Indica un enderezo de correo-e válido.", + "point in direction _": "apuntar na dirección _", + "point towards _": "apuntar cara a _", + "pointRight": "punteiro cara a dereita", + "polygon": "polígono", + "position": "", + "poster": "", + "predicate": "predicado", + "presentation (1.4x)": "presentación (1.4x)", + "pressed": "premer", + "previous": "", + "processes": "procesos", + "product": "", + "published.": "publicado.", + "publishing project...": "publicando o proxecto…", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "ao chou", + "random position": "posición ao chou", + "rank": "", + "raw data...": "datos en bruto…", + "ray length": "", + "read-only": "só lectura", + "receivers...": "", + "recording": "gravación", + "rectangle": "rectangulo", + "rectangleSolid": "rectángulo cheo", + "red": "", + "redo the last undone block drop in this pane": "Refacer o último movemento de bloques desfeito", + "redraw the screen once": "Volve debuxar a pantalla unha vez", + "redrop": "refacer", + "relabel...": "volver etiquetar…", + "release": "liberar", + "remove block variables...": "retirar variábeis de bloque…", + "rename": "Renomear", + "rename all blocks that access this variable": "renomear todos os bloques que acceden a esta variábel", + "rename all...": "renomear todo…", + "rename background": "renomear o fondo", + "rename costume": "Renomear a vestimenta", + "rename only this reporter": "renomear só este reporteiro", + "rename sound": "Renomear o son", + "rename...": "renomear…", + "repeat _ _": "repetir _ _", + "repeat until _ _": "repetir ata _ _", + "replace item _ of _ with _": "substituír _ de _ por _", + "report _": "reportar _", + "reporter": "reporteiro", + "reporter didn't report": "", + "reset columns": "reiniciar columnas", + "reset timer": "reiniciar o cronómetro", + "reshape _ to _": "", + "resize...": "redimensionar…", + "resolution": "resolución", + "rest for _ beats": "silencio durante _ pulsos", + "restore display": "restabelecer a vista", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "frecha dereita", + "ring": "", + "ringify": "Engadir anel", + "robot": "", + "rotate": "xirar", + "rotation style": "estilo de rotación", + "rotation x": "rotación x", + "rotation y": "rotación y", + "round _": "arredondar _", + "run _ _": "executar _ _", + "run _ w/continuation": "executar _ con continuación", + "s": "s", + "sample morphs": "Crea un «morph» de mostra", + "sample rate": "frecuencia de mostraxe", + "samples": "mostras", + "saturation": "saturación", + "save _ as costume named _": "gardar _ coma unha vestimenta co nome _", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "Gardar os datos do proxecto como XML no seu cartafol de descargas.", + "saved.": "gardado.", + "say _": "dicir _", + "say _ for _ secs": "dicir _ durante _ segs.", + "scope": "", + "screenshot": "", + "screenshot...": "captura de pantalla…", + "script": "", + "script pic with result...": "imaxe do programa incluíndo o resultado…", + "script pic...": "Imaxe do programa…", + "script variables _": "variábeis de programa _", + "scripts": "programas", + "scripts pic...": "Imaxe de programas…", + "scroll frame": "marco con desprazamento", + "scrolled-down": "desprazar cara abaixo", + "scrolled-up": "desprazar cara arriba", + "second": "segundo", + "select": "seleccionar", + "selection": "selección", + "self": "eu mesmo", + "send _ to _": "", + "senders...": "", + "sensor demo": "exemplo de sensor", + "set _ effect to _": "fixar efecto _ a _", + "set _ of block _ to _": "", + "set _ to _": "fixar o parámetro _ a _", + "set background _ to _": "fixar _ do fondo a _", + "set background color to _": "fixar a cor do fondo a _", + "set balance to _": "fixar o balance a _", + "set instrument to _": "fixar o instrumento a _", + "set pen _ to _": "fixar _ do lapis a _", + "set pen color to _": "fixar a cor do lapis a _", + "set pen shade to _": "fixar a intensidade en _", + "set pen size to _": "fixar o tamaño do lapis en _", + "set size to _ %": "fixar o tamaño a _ %", + "set tempo to _ bpm": "fixar o tempo a _ bpm", + "set this morph's alpha value": "Fixa o valor da canle alfa para este «morph»", + "set turbo mode to _": "cambiar o modo turbo a _", + "set video transparency to _": "fixar a transparencia do vídeo a _", + "set volume to _ %": "fixar o volume a _ %", + "set x to _": "fixar x en _", + "set y to _": "fixar y en _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Marcar para impedir que os bloques poidan ocupar o lugar doutros a seren soltados", + "several block definitions already match this label": "", + "shared.": "compartido.", + "sharing project...": "compartindo o proxecto…", + "sharp drop shadows use for old browsers": "Usar sombras contrastadas para navegadores antigos", + "sharp shadows...": "sombras contrastadas…", + "shimmering (80)": "", + "show": "amosar", + "show a handle which can be dragged to change this morph's extent": "Amosa un asa que se pode arrastrar para cambiar o límite deste «morph»", + "show a handle which can be dragged to move this morph": "Amosa un asa que se pode arrastrar para mover este «morph»", + "show a picture of all scripts and block definitions": "Amosa unha imaxe con todos os obxectos e definicións de bloques", + "show all": "amosar todos", + "show all...": "amosalo todo…", + "show global custom block definitions as XML in a new browser window": "Amosar definicións de bloques globais personalizados como XML nunha nova xanela", + "show primitives": "Amosar os bloques primitivos", + "show project data as XML in a new browser window": "Amosar a información do proxecto como XML nunha nova xanela", + "show table _": "a mosar a táboa _", + "show the World's menu": "Amosa o menú do Mundo", + "show variable _": "amosar a variábel _", + "shown?": "visíbel?", + "shrink": "reducir", + "shuffled": "", + "signals": "sinais", + "sin": "sin (seno)", + "size": "tamaño", + "slider": "potenciómetro", + "slider max...": "máximo do potenciómetro…", + "slider min...": "mínimo do potenciómetro…", + "slots": "", + "smallStage": "escenario pequeno", + "smaller menu fonts and sliders": "Fai máis pequenos os potenciómetros e os menús", + "snap": "instantánea", + "sorted": "", + "sound": "son", + "sounds": "", + "space": "espazo", + "specify the distance the hand has to move before it picks up an object": "Especificar a distancia que ten que se mover a man antes de coller algún obxecto", + "spectrum": "espectro", + "speech bubble": "globo (de diálogo)", + "speechBubble": "globo (de diálogo)", + "speechBubbleOutline": "contorno de globo (de diálogo)", + "split _ by _": "lista cos anacos de _ entre _", + "sprite": "obxecto", + "sprites": "obxectos", + "sqrt": "sqrt (raíz cadrada)", + "square": "cadrado", + "stack size": "altura da morea", + "stage": "escenario", + "stage image": "imaxe do escenario", + "stamp": "selar", + "standard settings": "axustes estándar", + "stay signed in on this computer until logging out": "Manterme autenticado neste computador ata que saia", + "stepForward": "paso adiante", + "stick this morph to another one": "Pega este morph» a outro", + "stick to": "", + "stop _": "parar _", + "stop all sounds": "parar todos os sons", + "stop frequency": "para a frecuencia", + "stopped": "detido", + "storage": "almacenaxe", + "store this project in the downloads folder (in supporting browsers)": "Gardar este proxecto no cartafol de descargas (nos navegadores que o admitan).", + "stretch _ x: _ y: _ %": "estricar _ a x: _ y: _ %", + "string": "cadea", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "cambiar a vestimenta a _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "ver como táboa…", + "take a camera snapshot and import it as a new sprite": "tirar unha foto coa cámara e importala como un novo obxecto", + "tan": "tan (tanxente)", + "tell _ to _ _": "dicir a _ que _ _", + "tempo": "", + "temporary?": "", + "text": "texto", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "Actualmente non hai bloques globais personalizados sen usar neste proxecto", + "there are currently no vectorizable pen trail segments": "", + "thing": "cousa", + "think _": "pensar _", + "think _ for _ secs": "pensar _ durante _ segs.", + "this _": "", + "this block": "este bloque", + "this project doesn't have any custom global blocks yet": "Este proxecto aínda non ten ningún bloque personalizado global", + "this script": "este programa", + "time in milliseconds": "tempo (en milisegundos)", + "timer": "cronómetro", + "tip": "", + "to": "", + "to use instead of hue for better selection": "Para seleccionar unha cor polo nome e non polo matiz.", + "top": "", + "touch screen settings": "axustes para pantalla táctil", + "touching _ ?": "tocando na cor _ ?", + "transient": "Transitorio", + "translations": "", + "translations...": "traducions…", + "translator_e-mail": "mbouzada@gmail.com,", + "transparency": "transparencia", + "transparency...": "transparencia…", + "trash is empty": "", + "true": "verdadeiro", + "turbo mode": "modo turbo", + "turbo mode?": "modo turbo?", + "turn _ _ degrees": "xirar _ _ graos", + "turn all pen trails and stamps into a new background for the stage": "Crea un novo fondo de escenario a partires da imaxe debuxada e dos selos", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "Transforma todos os trazos do lapis e selos nunha nova vestimenta do obxecto seleccionado neste momento", + "turn pen trails into new background...": "Crear un novo fondo a partires da imaxe debuxada…", + "turn pen trails into new costume...": "Transformar trazos do lapis nunha nova vestimenta...", + "turnBack": "ir cara atrás", + "turnForward": "ir cara adiante", + "turnLeft": "xirar á esquerda", + "turnRight": "xirar á dereita", + "turtle": "tartaruga", + "turtleOutline": "contorno de tartaruga", + "type": "", + "type of _": "tipo de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "Desmarcar para o deseño da IGU predeterminada", + "uncheck for greater speed at variable frame rates": "Desmarcar para aumentar a velocidade a cadros por segundo variábeis", + "uncheck for less contrast multi-column list views": "Desmarcar para vistas multicolumna de listas con menor contraste.", + "uncheck for lower resolution, saves computing resources": "Desmarcar para menor resolución; mellora os recursos computacionais.", + "uncheck for round ends of lines": "Desmarcar para facer que os extremos das liñas sexan arredondados", + "uncheck for smooth scaling of vector costumes": "Desmarcar para un escalado suave das vestimentas vectoriais", + "uncheck to allow dropped reporters to kick out others": "Desmarcar para permitir que os bloques poidan ocupar o lugar doutros ao seren soltados", + "uncheck to allow script reentrance": "Desmarcar para permitir a reentrada nos programas", + "uncheck to always show (+) symbols in block prototype labels": "Desmarcar para amosar os símbolos (+) no texto dos prototipos dos bloques", + "uncheck to confine auto-wrapping to top-level block stacks": "Desmarcar para limitar a envoltura automática a moreas de bloques de nivel superior", + "uncheck to disable IDE animations": "Desmarcar para desactivar as animacións da interface", + "uncheck to disable alternating colors for nested block": "Desmarcar para deixar de alternar as cores dos bloques aniñados", + "uncheck to disable block to text mapping features": "Desmarcar para desactivar as funcións de asignación de bloque a texto", + "uncheck to disable camera support": "Desmarcar para desactivar a compatibilidade da cámara", + "uncheck to disable dropping commands in reporter rings": "Desmarcar para desactivar o arrastre de ordes nos aneis reporteiros", + "uncheck to disable dynamic labels for variadic inputs": "Desmarcar para desactivar as etiquetas dinámicas para entradas de ariedade variábel", + "uncheck to disable input sliders for entry fields": "Desmarcar para desactivar os potenciómetros de entrada.", + "uncheck to disable keyboard editing support": "Desmarcar para desactivar a edición usando o teclado.", + "uncheck to disable multi-column list views": "Desmarcar para desactivar vistas multicolumna de listas.", + "uncheck to disable project data in URLs": "Desmarcar para desactivar os datos do proxecto nos URL.", + "uncheck to disable saving linked sublist identities": "Desmarcar para desactivar o almacenamento das identidades de sublistas ligadas.", + "uncheck to disable sprite composition": "Desmarcar para desactivar a composición de obxectos.", + "uncheck to disable sprite inheritance features": "Desmarcar para desactivar funcionalidades de herdanza de obxectos.", + "uncheck to disable support for first-class sprites": "Desmarcar para desactivar a compatibilidade de obxectos de primeira clase.", + "uncheck to disable support for native JavaScript functions": "Desmarcar para desactivar a execución de Javascript", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "Desmarcar para desactivar a compatibilidade do teclado virtual para dispositivos móbiles", + "uncheck to disinherit": "Desmarcar para desherdar", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "Desmarcar para limitar as rañuras booleanas aos valores verdadeiro / falso", + "uncheck to run scripts at normal speed": "Desmarcar para executar os programas á velocidade normal", + "uncheck to save contents in the project": "Desmarcar para gardar o contido no proxecto", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "Desmarcar para non memorizar entradas na caché (para depurar o avaliador).", + "uncheck to suppress running scripts when moving the slider": "Desmarcar para non iniciar a execución dos programas ao mover o potenciómetro", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "Desmarcar para desactivar o son ao facer clic", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "Desarcar para activar a execución paso a paso visíbel", + "uncheck to use solid drop shadows and highlights": "Desmarcar para usar sombras e realces nidios", + "uncheck to use the input dialog in short form": "Desmarcar para usar a forma curta da caixa de diálogo", + "uncompile": "descompilar", + "undo": "desfacer", + "undo the last block drop in this pane": "Desfacer a última acción nun bloque neste panel", + "undrop": "Desfacer", + "unicode _ as letter": "carácter cuxo código Unicode é _", + "unicode of _": "código Unicode do carácter _", + "unlock": "desbloquear", + "unpublished.": "non publicado", + "unpublishing project...": "deixando de publicar o proxecto…", + "unringify": "Eliminar anel", + "unshared.": "non compartido.", + "unsharing project...": "deixando de compartir o proxecto…", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "sen título", + "unused": "", + "unused block(s) removed": "Retirados os bloques non utilizados", + "up arrow": "frecha arriba", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "Utilizar o teclado para escribir os bloques", + "user features...": "características do usuario…", + "user mode...": "modo de usuario…", + "v": "v", + "value": "", + "variable": "", + "variables": "variábeis", + "video _ on _": "_ do vídeo en _", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "agardar _ s", + "wait until _": "agardar ata _", + "wardrobe": "vestimentas", + "warp _": "Executar _ de súpeto", + "what's your name?": "como te chamas?", + "when I am _": "ao _ nesta personaxe", + "when I receive _ _": "ao recibir _ _", + "when I start as a clone": "cando comece como clon", + "when _": "cando _", + "when _ clicked": "ao facer clic en _", + "when _ is edited _": "", + "when _ key pressed _": "ao premer a tecla _ _", + "whirl": "remuíño", + "whitespace": "espazo en branco", + "width": "largo", + "with data": "", + "with inputs": "con entradas", + "word": "palabra", + "world": "mundo", + "write _ size _": "escribir _ de tamaño _", + "x": "x", + "x position": "posición x", + "y": "y", + "y position": "posición y", + "year": "ano", + "year:": "ano:", + "your own": "os teus propios", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-he.js b/elements/pl-snap/Snap/locale/lang-he.js new file mode 100644 index 00000000..2abd3172 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-he.js @@ -0,0 +1,1389 @@ +SnapTranslator.dict.he = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) שמאלה", + "(0) up": "(0) למעלה", + "(1) sine": "(1) סינוס", + "(180) down": "(180) למטה", + "(2) square": "(2) ריבועי", + "(3) sawtooth": "(3) שיני_מסור", + "(4) triangle": "(4) משולש", + "(90) right": "(90) ימינה", + "(empty)": "(ריק)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "אודות Snap", + "About...": "אודות SNAP!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "אפשר קליטת משפטים מרוביי שורות", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "הנפשה", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "לכל (לא ידוע)", + "Any type": "כל סוג", + "Apply": "החל", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "האם אתה בטוח שברצונך למחוק?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "חזרה...", + "Backgrounds": "רקעים", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "עורך הבלוקים", + "Blocks": "בלוקים", + "Blocks category name:": "", + "Blurred shadows": "צללים מעומעמים", + "Boolean": "בולאני", + "Boolean (T/F)": "בולאני (T/F)", + "Boolean (unevaluated)": "בולאני (לא ידוע)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "גודל מברשת", + "Cache Inputs": "", + "Camera": "מצלמה", + "Camera not supported": "", + "Camera support": "", + "Cancel": "ביטול", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "תפוס שגיאות בתסריט", + "Category color": "", + "Change Password": "", + "Change Password...": "שנה סיסמה...", + "Change block": "שנה בלוק", + "Clear backup": "", + "Clicking sound": "צלילי לחיצה", + "Closed brush (free draw)": "צורה סגורה ציור חופשי", + "Cloud": "", + "Code mapping": "", + "Codification support": "תמיכה בקידוד", + "Colors and Crayons": "", + "Command": "פקודה", + "Command (C-shape)": "פקודה (C-shape)", + "Command (inline)": "פקודה באותה השורה", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "כדי לשמור על פרופורציות אפשר ללחוץ על SHIFT", + "Contents": "תכולה", + "Contributors": "תורמים", + "Control": "בקרה", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "עורך תלבושות", + "Costumes": "תלבושות", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "צור שם קלט", + "Create variables": "", + "Create variables in program": "צור משתנים בתוכנית", + "Credits...": "תודות...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "ברירת מחדל", + "Default Value:": "ערך ברירת מחדל:", + "Delete": "מחק", + "Delete Custom Block": "מחק בלוק מותאם אישית", + "Delete Project": "מחק פרוייקט", + "Delete a variable": "מחק משתנה", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "הורדה...", + "Dragging threshold...": "", + "Dynamic input labels": "תגיות קלט דינאמיות", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "צבע חיצוני (קליק שמאלי)", + "Edit input name": "ערוך שם קלט", + "Edit label fragment": "ערוך את התווית", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "אליפסה (^עיגול)", + "Empty": "ריק", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "מחק", + "Error": "", + "Examples": "דוגמאות", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "ייצא בלוקים", + "Export blocks...": "ייצא בלוקים...", + "Export project as plain text...": "ייצא פרוייקט כטקסט בלבד...", + "Export project...": "ייצא פרוייקט...", + "Export summary with drop-shadows...": "", + "Export summary...": "דוח ייצוא...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "דלי צבע", + "Fill color (right click)": "צבע פנימי (קליק ימני)", + "Filled Ellipse (shift: circle)": "אליפסה מלאה (^עיגול)", + "Filled Rectangle (shift: square)": "מלבן מלא (^ריבוע)", + "First-Class Sprites": "", + "Flat design": "עיצוב שטוח", + "Flat line ends": "סוף קו ישר", + "For all Sprites": "עבור כל הדמויות", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "!שלום", + "Hello, World!": "", + "Help": "עזרה", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "המממ...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "ייבא תלבושת ממצלמה", + "Import blocks": "ייבא בלוקים", + "Import library": "ייבא ספריה", + "Import sound": "", + "Import tools": "כליי יבוא", + "Import...": "ייבוא...", + "Imported": "מיובא", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "מספרים מדוייקים, רציונאלים ומרוכבים", + "Inheritance support": "תמיכה בהורשה", + "Input Names:": "שמות קלט:", + "Input Slot Options": "", + "Input name": "הכנס שם", + "Input sliders": "סרגלי קלט", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "איטרציה, קומפוזיציה", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "( _ ) { _ } פונקציית_גאווהסקריפט", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "עריכת מקלדת", + "Kind of": "סוג", + "LEAP Motion controller": "LEAP בקר_תנועה", + "Language...": "שפה...", + "Libraries...": "ספריות...", + "License": "רישיון", + "License...": "רשיון...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "קווים ישרים (Shift: בזווית 45°)", + "Line tool (shift: vertical/horizontal)": "ציור קו חופשי (^קו מאוזן/מאונך)", + "List": "רשימה", + "List utilities": "עזריי רשימות", + "Lists": "רשימות", + "Live coding support": "", + "Loading": "טוען", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "הקלט מיקומי עט", + "Login...": "הכנס...", + "Logout": "התנתק", + "Long form input dialog": "פקד קלט ארוך", + "Looks": "מראה", + "Make a block": "צור בלוק", + "Make a variable": "צור משתנה", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "שם ההודעה", + "Method Editor": "עורך השיטות", + "Microphone": "מיקרופון", + "Microphone resolution...": "רזולוציית_מיקרופון...", + "Modules...": "רכיבים...", + "Motion": "תנועה", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "תנאי מרובה ענפים (סוויצ)", + "Multiple inputs (value is list of inputs)": "קלטים מרובים (הערך הוא רשימה של קלטים)", + "Nested auto-wrapping": "עטיפה אוטומטית", + "New": "חדש", + "New Category": "", + "New Project": "פרוייקט חדש", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "לא", + "November": "", + "Number": "מספר", + "OK": "אישור", + "Object": "אובייקט", + "October": "", + "Ok": "אישור", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "פתח פרוייקט", + "Open in Community Site": "פתח באתר הקהילתי", + "Open...": "פתח...", + "Opening project...": "", + "Operators": "הפעלה", + "Other": "אחר", + "Output text using speech synthesis.": "", + "Paint Editor": "עורך ציור", + "Paint a new costume": "צייר תלבושת חדשה", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "צבע צורה (Shift: צבע שני)", + "Paintbrush tool (free draw)": "מברשת לצביעה חופשית", + "Parallelization": "", + "Part of": "חלק מ", + "Parts": "חלקים", + "Password:": "", + "Pen": "עט", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "דגימת צבע", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "דגום צבע (Shift: צבע שני)", + "Pixels": "", + "Plain prototype labels": "תויות אבטיפוס בסיסיות", + "Play": "נגן", + "Play sound": "נגן צליל", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "נא וודא שהדפדפן מעודכן ושהמצלמה מתואמת כראוי. חלק מהדפדפנים יבקשו אישור גישה למצלמה בחיבור מאובטח. נסה להחליף בתחילת הכתובת את \"http://\"-ב \"https://\"", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "עבור תנאי", + "Prefer empty slot drops": "העדף הפלה לתאים ריקים", + "Prefer smooth animations": "העדף הנפשה חלקה", + "Press CTRL+C one more time to effectively copy to clipboard.": "לחץ CTRL+C פעם נוספת כדי להעתיק ביעילות.", + "Press CTRL+V one more time to effectively paste from clipboard.": "לחץ CTRL+V פעם נוספת כדי להדביק ביעילות.", + "Press CTRL+X one more time to effectively cut to clipboard.": "לחץ CTRL+X פעם נוספת כדי לגזור ביעילות.", + "Privacy...": "", + "Project Notes": "הערות לפרוייקט", + "Project URLs": "", + "Project notes...": "הערות לפרוייקט...", + "Provide 100 selected colors": "100 צבעים נבחרים", + "Provide getters and setters for all GUI-controlled global settings": "הגדרת מאפייני ממשק", + "Publish": "פרסם", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "הקלט צליל חדש", + "Recover": "שחזר", + "Rectangle (shift: square)": "מלבן (^ריבוע)", + "Reference manual": "מדריך משתמש", + "Remove a category...": "", + "Remove unused blocks": "הסר בלוקים שאינם בשימוש", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "להחליף את הפרוייקט הזה בחדש?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "מדווח", + "Request blocked": "", + "Resend Verification Email...": "שלח מחדש מייל ווידוא...", + "Resend verification email": "", + "Reset Password...": "אפס סיסמה", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "תמיכה במסך רטינה", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "שמור", + "Save As...": "שמור בשם...", + "Save Project": "שמור פרוייקט", + "Save Project As...": "שמור פרוייקט בשם...", + "Save to disk": "שמור לדיסק", + "Saved!": "נשמר!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "שם משתנה תסריט", + "Scripts": "תסריטים", + "Select a costume from the media library": "בחר תלבושת מספריית המדיה", + "Select a sound from the media library": "בחר צליל מבפריית המדיה", + "Select categories of additional blocks to add to this project.": "בחר קטגוריית בלוקיי הרחבה לפרוייקט זה", + "Selection tool": "כלי בחירה", + "Sensing": "חיישנים", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "קביעת צבע מתקדמת", + "Set the rotation center": "קבע את מרכז הסיבוב", + "Share": "שתף", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "הירשם...", + "Single input.": "ערך יחיד.", + "Single palette": "", + "Slider maximum value": "ערך מקסימלי של הסליידר", + "Slider minimum value": "ערך מינימלי של הסליידר", + "Snap! website": "אתר רשמי", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "צליל", + "Sound Recorder": "", + "Sounds": "צלילים", + "Sprite": "דמות", + "Sprite Nesting": "", + "Stage": "במה", + "Stage height": "גובה במה", + "Stage selected: no motion primitives": "במה נבחרה: ללא תנועה", + "Stage size": "גודל הבמה", + "Stage size...": "גודל במה...", + "Stage width": "רוחב במה", + "Stop": "עצור", + "Stop sound": "עצור צליל", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "מסגרת אליפסה (^עיגול)", + "Stroked Rectangle (shift: square)": "מסגרת מלבן (^ריבוע)", + "Switch back to user mode": "חזור למצב משתמש", + "Switch to dev mode": "עבור למצב מפתח", + "Switch to vector editor?": "", + "Table lines": "שורות של טבלאות", + "Table support": "תמיכה בטבלאות", + "Table view": "הצג טבלא", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "בולאני עם שלושה אפשרויות", + "Text": "טקסט", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "טקסט לדיבור", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "תסריטים מוגני מיקבול", + "Title text": "מלל כותרת", + "Today": "היום", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "תרגומים", + "Translators...": "מתרגמים...", + "Turbo mode": "מצב עבודה מהיר", + "Turtle": "צב", + "Undelete sprites...": "", + "Unpublish": "בטל פרסום", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "בטל שיתוף", + "Unshare Project": "", + "Untitled": "ללא שם", + "Unused blocks...": "בלוקים לא בשימוש...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "מעדכן רשימת פרוייקטים", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - גרום למשתנה פנימי להיות חשוף לקורא", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "שם משתנה", + "Variables": "משתנים", + "Variadic reporters": "מדווחי משתנים", + "Vector": "ווקטור", + "Vector Paint Editor": "עריכה ווקטורית", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "מקלדת וירטואלית", + "Visible stepping": "המחשת צעדים", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "גישה לשירותי רשת מאובטחים", + "Words, sentences": "מילים, משפטים", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "כן", + "Yesterday": "אתמול", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "צביעת זברה", + "Zoom blocks": "הקדל בלוקים", + "Zoom blocks...": "גודל בלוקים...", + "_ at _": "_ של _", + "_ combine _ using _": "_ מזג_רשימה_באמצעות _ _", + "_ contains _": "_ נמצא_בתוך _", + "_ effect": "_ אפקט", + "_ find first item _ in _": "_ מצא_פריט_ראשון _ _", + "_ in front of _": "_ בתחילת_רשימה _", + "_ keep items _ from _": "_ שמור_פריטים_של _ _", + "_ map _ over _": "_ צור_מיפוי _ _", + "_ mod _": "_ שארית_חלוקה _", + "_ of _": "_ של _", + "_ of block _": "", + "_ of costume _": "_ מאפיין_של_תלבושת _", + "_ of sound _": "_ של_צליל _", + "_ of text _": "", + "_ to _": "_ חשב _", + "__shout__go__": "לחץ על דגל ירוק", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "שכפול_חדש_של _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "ערך מוחלט", + "acos": "acos", + "add _ to _": "הוסף_את _ ל _", + "add a new Turtle sprite": "הוסף דמות צב חדשה", + "add a new sprite": "הוסף דמות חדשה", + "add comment": "הוסף הערה", + "add comment here...": "הוסף הערה כאן", + "agent": "", + "alert _": "התראה _", + "all": "לכל", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "הכל_מלבד_הראשון _", + "all but this script": "הכל מלבד תסריט זה", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "עוגן", + "and": "וגם", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "תשובה", + "any": "כלשהו", + "any key": "מקש כלשהו", + "any message": "כל הודעה", + "anything": "", + "append _": "", + "arrange scripts vertically": "סדר תסריטים במאונך", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ שאל_והמתן", + "ask _ for _ _": "שאל_עצם_אחר _ _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "רקע", + "balance": "איזון", + "big (2x)": "גדול (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "מלל דיאלוג מניעת מחיקה", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "בלוקים", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "למטה", + "box": "", + "brightness": "בהירות", + "broadcast _ _": "שדר_הודעה _ _", + "broadcast _ _ and wait": "והמתן _ _ שדר_הודעה", + "brush": "", + "build": "בנה", + "but getting a": "", + "c": "c", + "call _ _": "קרא _ _", + "call _ w/continuation": "קרא_ל _ מתמשך", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "ניתן לסובב", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "תקרה", + "center": "מרכז", + "center x": "מרכז x", + "center y": "מרכז y", + "change _ by _": "_ שנה_ערך_משתנה_ב _", + "change _ effect by _": "_ שינוי_ב_אפקט _", + "change background _ by _": "שנה_רקע_ב _ _", + "change balance by _": "שנה_איזון_ב _", + "change pen _ by _": "שנה_עט_ב _ _", + "change pen color by _": "_ שנה_צבע_עט_ב", + "change pen shade by _": "_ שנה_גוון_עט_ב", + "change pen size by _": "_ שנה_גודל_עט_ב", + "change size by _": "שנוי_גודל _", + "change tempo by _": "_ שנה קצב ביטים ב", + "change volume by _": "שנה_עוצמת_צליל_ב _", + "change x by _": "_ ב x שנה", + "change y by _": "_ ב y שנה", + "check for alternative GUI design": "הוסף סימון למראה אלטרנטיבי - שטוח", + "check for block to text mapping features": "סמן למיפוי טקסט לבלוק", + "check for flat ends of lines": "הוסף סימון לקימור ישר של קווים", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "הוסף סימון כדי להעדיף רזולוציה איכותית על חשבון ביצועים", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "הוסף סימון להנפשה בקצב קבוע וחזוי מראש", + "check for sprite inheritance features": "הוסף סימון לאפשר הורשת תכונות מאפייני דמות", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "הוסף סימון כדי להציג תמיד סוג כניסה בדיאלוג קלט", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "הוסף סימון כדי למנוע תסריטים ממוקבלים", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "הוסף סימון כדי להפעיל הנפשת סביבת עבודה", + "check to enable alternating colors for nested blocks": "הוסף סימון כדי לאפשר צבעים מתחלפים עבור בלוקים משורשרים", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "הוסף סימון כדי לבצע תווית דינאמית למשתנים", + "check to enable input sliders for entry fields": "הוסף סימון כדי לאפשר סרגלי קלט", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "הוסף סימון כדי להציג מקלדת וירטואלית במכשירים ניידים", + "check to hide (+) symbols in block prototype labels": "הוסף סימון כדי להסתיר (+) בתוית בלוק אבטיפוס", + "check to inherit from": "סמן_לרשת_מ", + "check to prevent contents from being saved": "הוסף סימון כדי לא לשמור תוכן בפרוייקט", + "check to prioritize script execution": "הוסף סימון כדי להפעיל העדפת הפעלת תסריטים", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "הוסף סימון כדי להפעיל צלילי לחיצת בלוקים", + "check to turn on logging pen vectors": "הוסף סימון להקליט מיקומי עט", + "check to turn on visible stepping (slow)": "הוסף סימון כדי להפעיל המחשת צעדים (איטי)", + "check to use blurred drop shadows and highlights": "הוסף סימון לצל והדגשה מעומעמים", + "children": "צאצא", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "נקה", + "clear": "נקה", + "clear graphic effects": "נקה_אפקטים_גרפיים", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "גרור את הכוונת כדי לקבע את מרכז הסיבוב", + "clicked": "הקלקה", + "clone": "שכפל", + "clones": "שיכפולים", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "צבע", + "color _ is touching _ ?": "_ צבע_נוגע_בצבע _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "מזג_רשימה_באמצעות _ mit _", + "comic": "קומיקס", + "command": "פקודה", + "comment pic...": "הערה לצמונה", + "compile": "בצע קומפילציה", + "compile _": "קומפייל _", + "compile _ for _ args": "", + "confetti": "קונפטי", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "תלבושת", + "costume #": "תלבושת_מספר", + "costume name": "", + "costumes": "תלבושות", + "costumes tab help": "ייבא תמונה מאתר אינטרנט או מהמחשב שלך על ידי גרירתה לכאן", + "could not connect to:": "", + "cr": "תחילת שורה", + "create a clone of _": "_ צור_שכפול_של", + "cross": "", + "crosshairs": "", + "current": "נוכחי", + "current _": "הנוכחי _", + "current module versions:": "גרסה נוכחית", + "current parent": "ההורה הנוכחי", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "מתנדנד?", + "data": "", + "date": "תאריך", + "day of week": "יום בשבוע", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "מחק", + "delete _": "", + "delete _ of _": "מחק_פריט_מספר _ _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "הגדרת מחיקת בלוקים...", + "delete slot": "", + "delete this clone": "מחק_את_השכפול_הזה", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "הדגמה (1.2x)", + "demo...": "", + "detach all parts": "נתק כל החלקים", + "detach and put into the hand": "", + "detach from": "נתק מ...", + "development mode": "מצב פיתוח", + "development mode debugging primitives:": "מצב פיתוח משתני דיבאג", + "development mode...": "", + "dimensions": "", + "direction": "כיוון", + "disable deep-Morphic context menus and show user-friendly ones": "בטל תכונות מתקדמות", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "מרחק", + "distance to _": "_ מרחק_אל", + "distribution": "", + "don't rotate": "ללא סיבוב", + "down arrow": "חץ למטה", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "פריטים נגררים", + "draggable?": "ניתן_לגרור?", + "dragging threshold": "", + "dropped": "הפלה", + "duplicate": "שכפל", + "duplicate block definition...": "שכפל הגדרת בלוק...", + "duration": "למשך", + "e": "e", + "e^": "e^", + "edge": "קצה", + "edit": "ערוך", + "edit rotation point only...": "", + "edit the costume's rotation center": "ערוך את מרכז הסיבוב של הדמות", + "edit...": "ערוך...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "הפעל תכונות מתקדמות", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "ייצא", + "export block definition...": "", + "export pen trails line segments as SVG": "ייצא את עקבות העט לקובץ SVG", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "ייצא...", + "extract": "", + "f": "f", + "false": "שקר", + "file": "", + "file menu import hint": "ייבא פרוייק מקובץ", + "fill": "מלא", + "fill page...": "", + "filtered for _": "סינון_עבור _", + "find blocks": "מצא בלוקים", + "find blocks...": "מצא בלוקים...", + "find first item _ in _": "מצא_פריט_ראשון _ _", + "find unused global custom blocks and remove their definitions": "מצא בלוקים שאינם בשימוש והסר את הגדרתם", + "fisheye": "עין_הדג", + "flag": "", + "flash": "", + "flat line ends": "סיום קו ישר", + "flatten": "", + "flip ↔": "הפוך ↔", + "flip ↕": "הפוך ↕", + "floor": "רצפה", + "footprints": "", + "for _ = _ to _ _": "ספור_במשתנה_בטווח _ = _ _ _", + "for all sprites": "עבור כל הדמויות", + "for each _ in _ _": "_ עבור_כל _ _", + "for this sprite only": "עבור דמות זו בלבד", + "forever _": "לנצח _", + "frame": "", + "frames": "פריימים", + "frequencies": "", + "frequency": "תדר", + "front": "חזית", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "רוח רפאים", + "giant (8x)": "ענקי (8x)", + "glide _ secs to x: _ y: _": "שניות _ גלוש_במשך x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "שכבות _ הזז_לאחור", + "go to _": "_ לך_אל", + "go to _ layer": "לך_אל _", + "go to front": "העבר_לחזית", + "go to x: _ y: _": "לך_אל x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "הגדל", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "גובה", + "hello": "שלום", + "help": "עזרה", + "help...": "עזרה...", + "hide": "הסתר", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "הסתר בסיסיים", + "hide variable _": "_ הסתר_משתנהِ", + "high": "גבוה", + "hour": "שעה", + "http:// _": "", + "hue": "גוון", + "huge (4x)": "ענק (4x)", + "i": "i", + "identical to": "האם_זהים", + "if _ _": "אם _ _", + "if _ _ else _": "אם _ _ אחרת _", + "if _ then _ else _": "→אם _ אז _ אחרת _", + "if on edge, bounce": "אם_בקצה_אז_קפוץ", + "import a sound from your computer by dragging it into here": "ייבא צלילים מהמחשב שלך על-ידי גרירתם לכאן", + "import without attempting to parse or format data": "ייבא מבלי לעבד את המידע", + "import...": "ייבא...", + "in palette": "", + "including dependencies": "", + "index": "אינדקס", + "index of _ in _": "", + "inherit _": "הורש _", + "inherited": "נורש", + "input list:": "רשימת קלט:", + "input names:": "שמות קלט:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "הוסף_פריט_במיקום _ _ _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "? _", + "is _ a _ ?": "האם_משתנה_מסוג _ _ ?", + "is _ empty?": "האם_ריקה _ ?", + "is _ on?": "_ האם_הגדרה_פעילה", + "is not a valid option": "", + "is read-only": "", + "item": "פריט", + "item _ of _": "_ בחר_פריט_מתוך _", + "items": "פריטים", + "j": "j", + "join _": "שרשר_מילים _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "שמור_פריטים_של _ _", + "key": "", + "key _ pressed?": "מקש_נלחץ _ ?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "עברית", + "language_translator": "יוסי כהן", + "large": "גדול", + "last": "אחרון", + "last changed": "", + "last_changed": "2020-04-21", + "launch _ _": "הפעל _ _", + "left": "שמאל", + "left arrow": "חץ שמאלה", + "length": "אורך", + "length of _": "_ מספר_פריטים", + "length:": "אורך:", + "let the World automatically adjust to browser resizing": "", + "letter": "אות", + "letter _ of _": "מיקום_אות_במילה _ _", + "light (70)": "", + "lightness": "", + "line": "שורה", + "lines": "", + "list": "רשימה", + "list _": "_ רשימה", + "list view...": "תצוגת רשימה...", + "ln": "ln", + "load the official library of powerful blocks": "טען את הספריה הרשמית של powerful blocks", + "location": "", + "lock": "", + "log pen vectors": "קווים_ישרים_וארוכים", + "login": "", + "loop": "", + "low": "נמוך", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "צור בלוק...", + "make a category...": "", + "make a copy and pick it up": "צור עותק והרם", + "make a morph": "", + "make temporary and hide in the sprite corral": "הפוך לזמני והסתר תחום דמות", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "צור_מיפוי _ _", + "map _ to _ _": "", + "max": "מקסימום", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "הודעה", + "microphone _": "מיקרופון _", + "middle": "", + "minimum": "", + "minute": "דקה", + "mirror video": "וידאו_תמונת_ראי", + "missing / unspecified extension": "", + "monstrous (10x)": "מפלצתי (10x)", + "month": "חודש", + "mosaic": "פסיפס", + "motion": "תנועה", + "mouse down?": "עכבר_למטה?", + "mouse position": "", + "mouse x": "x עכבר", + "mouse y": "y עכבר", + "mouse-departed": "עכבר-יוצא", + "mouse-entered": "עכבר-נכנס", + "mouse-pointer": "סמן עכבר", + "move": "הזז", + "move _ steps": "צעדים _ זוז", + "move all inside...": "", + "move...": "", + "my": "מאפיינים", + "my _": "מאפיין _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "אני", + "n": "n", + "name": "שם", + "neg": "", + "negative": "נגטיב", + "neighbors": "שכנים", + "neighbors ≠": "", + "new costume _ width _ height _": "תלבושת_חדשה _ רוחב _ גובה _", + "new line": "שורה חדשה", + "new sound _ rate _ Hz": "צליל_חדש _ בקצב _ Hz", + "new...": "חדש...", + "next": "", + "next costume": "התלבושת_הבאה", + "none": "שום דבר", + "normal": "רגיל", + "normal (1x)": "רגיל (1x)", + "normalScreen": "", + "normalStage": "", + "not": "שלילה", + "not _": "לא _", + "note": "תו", + "nothing": "", + "now connected.": "", + "number": "מספר", + "number of channels": "מספר ערוצים", + "numbers from _ to _": "מערך_מספרים_בטווח _ עד _", + "o": "o", + "object _": "אובייקט _", + "octagon": "", + "only duplicate this block": "שכפול בלוק זה בלבד", + "only face left/right": "רק פנים ימינה-שמאלה", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "פתח חלון חדש עם סיכום על פרוייקט זה", + "open a new window with a picture of all scripts": "פתח חלון חדש עם תמונה של כל התסריטים", + "open a new window with a picture of the stage": "פתח חלון חדש עם תמונת הבמה", + "open a new window with a picture of this comment": "פתח תמונה והערה בחלון חדש", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "פתח חלון חדש עם תמונה של תסריט זה", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "פתח בחלונית דיאלוג", + "open shared project from cloud...": "", + "options...": "", + "or": "או", + "or before": "", + "other clones": "שכפול אחר", + "other scripts in sprite": "תסריטים אחרים בדמות", + "other sprites": "דמויות_אחרות", + "p": "p", + "paint a new sprite": "צייר דמות חדשה", + "paintbucket": "", + "parameters": "", + "parent": "הורה", + "parent...": "הורה...", + "parts": "חלקים", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "הדבק_על _", + "pause": "", + "pause all _": "_ הקפא הכל", + "pen": "", + "pen _": "עט _", + "pen down": "עט_למטה", + "pen down?": "עט_למטה?", + "pen trails": "סימוני_עט", + "pen up": "עט_למעלה", + "pen vectors": "סימוני_עט_וקטור", + "pic...": "תמונה...", + "pick random _ to _": "בחר_מספר_אקראי_בתחום _ - _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "ציר", + "pixel": "", + "pixelate": "פיקסלים", + "pixels": "פיקסלים", + "play _ Hz for _ secs": "נגן _ Hz למשך _ שניות", + "play frequency _ Hz": "נגן_תדר _ Hz", + "play note _ for _ beats": "נגן תו _ למשך _ ביטים", + "play sound _": "_ נגן_צליל", + "play sound _ at _ Hz": "נגן_צליל _ בקצב _ Hz", + "play sound _ until done": "נגן_צליל_והמתן_לסיום _", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ פנה_לכיוון", + "point towards _": "_ פנה_לעבר", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "הצהרה", + "presentation (1.4x)": "מצגת (1.4x)", + "pressed": "לחיצה", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "R-G-B-A ערכי_צבע", + "random": "אקראי", + "random position": "מיקום אקראי", + "rank": "", + "raw data...": "מידע גולמי...", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "נתב מחדש", + "relabel...": "תייג מחדש...", + "release": "שחרר", + "remove block variables...": "", + "rename": "שנה שם", + "rename all blocks that access this variable": "שנה שם לכל הבלוקים הניגשים למשתנה זה", + "rename all...": "שנה שם להכל...", + "rename background": "", + "rename costume": "שנה שם לתלבושת", + "rename only this reporter": "שנה שם של מדווח זה בלבד", + "rename sound": "שנה שם לצליל", + "rename...": "שנה שם...", + "repeat _ _": "חזור _ _", + "repeat until _ _": "חזור_עד_ש _ _", + "replace item _ of _ with _": "החלף_פריט_במיקום _ _ _", + "report _": "_ דווח", + "reporter": "מדווח", + "reporter didn't report": "", + "reset columns": "אתחל עמודות", + "reset timer": "איפוס טיימר", + "reshape _ to _": "", + "resize...": "", + "resolution": "רזולוציה", + "rest for _ beats": "נוח_למשך _", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "ימין", + "right arrow": "חץ ימינה", + "ring": "", + "ringify": "מיסגור", + "robot": "", + "rotate": "סובב", + "rotation style": "סוג סיבוב", + "rotation x": "סיבוב x", + "rotation y": "סיבוב y", + "round _": "עגל_למספר_שלם _", + "run _ _": "הרץ _ _", + "run _ w/continuation": "הרץ _ מתמשך", + "s": "s", + "sample morphs": "", + "sample rate": "קצב דגימה", + "samples": "דגימות", + "saturation": "רוויה", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "שמור פרוייקט בתיקיית הורדות כקובץ XML", + "saved.": "", + "say _": "_ אמור", + "say _ for _ secs": "_ שניות_אמור _ למשך", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "תסריט תמונה...", + "script variables _": "_ משתניי_תסריט", + "scripts": "תסריטים", + "scripts pic...": "תמונת תסריטים...", + "scroll frame": "", + "scrolled-down": "נגלל_למטה", + "scrolled-up": "נגלל_למעלה", + "second": "שניה", + "select": "בחר", + "selection": "", + "self": "עצמי", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ קביעת_ערך_אפקט _", + "set _ of block _ to _": "", + "set _ to _": "קבע_הגדרה _ _", + "set background _ to _": "קבע_רקע_ל _ _", + "set background color to _": "קבע_צבע_רקע _", + "set balance to _": "קבע_איזון_ל _", + "set instrument to _": "קבע_כלי_נגינה _", + "set pen _ to _": "קבע_עט_ל _ _", + "set pen color to _": "_ קבע_צבע_עט_ל", + "set pen shade to _": "_ קווע_גוון_עט_ל", + "set pen size to _": "_ קבע_גודל_עט_ל", + "set size to _ %": "% _ קבע_גודל_ל", + "set tempo to _ bpm": "קבע קצב ל _ ביטים בדקה", + "set this morph's alpha value": "", + "set turbo mode to _": "קבע_מצב_מהיר_ל _", + "set video transparency to _": "קבע_שקיפות_וידאו_ל _", + "set volume to _ %": "קבע_עוצמת_צליל_ל _ %", + "set x to _": "_ ל x הגדר", + "set y to _": "_ ל y הגדר", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "תפרית העדפת רמיזה לתאים ריקים", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "הראה", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "הצג הכל", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "הצג מידע אודות בלוקים מותאמים אישית בחלון חדש (XML)", + "show primitives": "הצג בסיסיים", + "show project data as XML in a new browser window": "הצג את מידע הפרוייקט בחלון חדש (XML)", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ הצג_משתנה", + "shown?": "מוצגת?", + "shrink": "כווץ", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "גודל", + "slider": "סליידר - סרגל בחירה", + "slider max...": "מקסימום סליידר...", + "slider min...": "מינימום סליידר...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "הצמדה", + "sorted": "", + "sound": "צליל", + "sounds": "צלילים", + "space": "רווח", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "ספקטרום", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "הפרדת_אותיות_לפי_סימן_מפריד _ _", + "sprite": "דמות", + "sprites": "דמויות", + "sqrt": "שורש ריבועי", + "square": "", + "stack size": "גודל מחסנית", + "stage": "במה", + "stage image": "", + "stamp": "חותמת", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "הצמד_אל", + "stop _": "_ עצור", + "stop all sounds": "עצור_את_כל_הצלילים", + "stop frequency": "עצור_(ניגון_תדר", + "stopped": "נעצר", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "הפרוייקט יישמר בתקיית הורדות", + "stretch _ x: _ y: _ %": "מתיחה _ x: _ y: _ %", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "SVG ייצא_לקובץ...", + "switch to costume _": "_ החלף_לתלבושת", + "switch to scene _ _": "", + "t": "t", + "tab": "מרווח טאב", + "table view...": "תצוגת טבלה...", + "take a camera snapshot and import it as a new sprite": "השתמש במצלמה לייצר דמות חדשה", + "tan": "tan", + "tell _ to _ _": "תודיע_לעצם_אחר_לבצע _ _ _", + "tempo": "קצב", + "temporary?": "זמני?", + "text": "טקסט", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "אין כרגע בלוקים שאינם בשימוש בפרוייקט זה", + "there are currently no vectorizable pen trail segments": "אין כרגע עקבות עט הניתנון לוקטוריזציה", + "thing": "פריט", + "think _": "_ תחשוב", + "think _ for _ secs": "_ שניות_תחשוב _ למשך", + "this _": "", + "this block": "הבלוק הזה", + "this project doesn't have any custom global blocks yet": "בפרוייקט אין בלוקים מותאמים אישית", + "this script": "התסריט הזה", + "time in milliseconds": "זמן במילי שניות", + "timer": "טיימר", + "tip": "", + "to": "", + "top": "למעלה", + "touch screen settings": "", + "touching _ ?": "נוגע _ ?", + "transient": "זמני", + "translations": "", + "translations...": "", + "translator_e-mail": "cohenyossi81@gmail.com", + "transparency": "שקיפות", + "transparency...": "", + "trash is empty": "", + "true": "אמת", + "turbo mode": "מצב מהיר", + "turbo mode?": "מצב מהיר?", + "turn _ _ degrees": "מעלות _ _ פנה", + "turn all pen trails and stamps into a new background for the stage": "הפוך את סימוני העט והחותמת לרקע חדש לבמה", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "הפוך את סימוני העט והחותמת לתלבושת חדשה עבור הדמות הנוכחית", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "הסוג של _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "בטל סימון למראה רגיל תבליטי", + "uncheck for greater speed at variable frame rates": "בטל סימון כדי להעדיף מהירות גבוהה בקצב שעשוי להשתנות", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "בטל סימון כדי לשפר ביצועים על חשבון רזולוציה איכותית", + "uncheck for round ends of lines": "בטל סימון לגימור מעוגל של קווים", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "בטל סימון לאפשר החלפת הקיימים על ידי החדשים", + "uncheck to allow script reentrance": "בטל סימון כדי לאפשר תסריטים ממוקבלים", + "uncheck to always show (+) symbols in block prototype labels": "בטל סימון כדי להציג (+) בתוית בלוק אבטיפוס", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "בטל סימון כדי לכבות הנפשת סביבת עבודה", + "uncheck to disable alternating colors for nested block": "בטל סימון כדי לבטל צבעים מתחלפים עבור בלוקים משורשרים", + "uncheck to disable block to text mapping features": "בטל סימון לביטול מיפוי בין טקסט לבלוק", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "בטל סימון כדי לבטל תווית דינאמית למשתנים", + "uncheck to disable input sliders for entry fields": "בטל סימון כדי לבטל סרגלי קלט", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "בטל סימון לבטל הורשת תכונות מאפייני דמות", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "בטל סימון כדי להסתיר מקלדת וירטואלית במכשירים ניידים", + "uncheck to disinherit": "בטל_סימון_לביטול_הורשה", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "בטל סימון כדי להפעיל תסריטים במהירות רגילה", + "uncheck to save contents in the project": "בטל סימון כדי לשמור תוכן בפרוייקט", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "בטל סימון כדי לכבות צלילי לחיצת בלוקים", + "uncheck to turn off logging pen vectors": "בטל סימון כדי לא לזכור מיקומי עט", + "uncheck to turn off visible stepping": "בטל סימון כדי לא להמחיש צעדים", + "uncheck to use solid drop shadows and highlights": "בטל סימון לצל והדגשה רגילים", + "uncheck to use the input dialog in short form": "בטל סימון כדי להשתמש בדיאלוג קלט מקוצר", + "uncompile": "בטל קומפילציה", + "undo": "בטל", + "undo the last block drop in this pane": "בטל את הפלת הבלוק האחרונה", + "undrop": "בטל הפלה", + "unicode _ as letter": "המר_יוניקוד_לאות _", + "unicode of _": "יוניקוד_של _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "ביטול מיסגור", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "ללא כותרת", + "unused": "", + "unused block(s) removed": "בלוקים שאינם בשימוש הוסרו", + "up arrow": "חץ למעלה", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "השתמש במקלדת להכנס לבלוקים", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "ערך", + "variable": "", + "variables": "", + "video _ on _": "וידאו_על _ _", + "video capture": "לכוד_וידאו", + "volume": "עוצמת_צליל", + "w": "w", + "wait _ secs": "שניות _ המתן", + "wait until _": "_ המתן_עד_ש", + "wardrobe": "", + "warp _": "מעטפת _", + "what's your name?": "?מה_השם_שלך", + "when I am _": "כאשר_אני _", + "when I receive _ _": "_ _ כאשר_אני_מקבל", + "when I start as a clone": "כשאני_מתחיל_בתור_שכפול", + "when _": "_ כאשר", + "when _ clicked": "נלחץ _ כאשר_כפתור", + "when _ is edited _": "", + "when _ key pressed _": "נלחץ _ כאשר_כפתור _", + "whirl": "מערבולת", + "whitespace": "רווח", + "width": "רוחב", + "with data": "", + "with inputs": "עם קלטים", + "word": "מילה", + "world": "עולם", + "write _ size _": "כתוב_בגודל _ _", + "x": "x", + "x position": "x מיקום", + "y": "y", + "y position": "y מיקום", + "year": "שנה", + "year:": "", + "your own": "משלך", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-hi.js b/elements/pl-snap/Snap/locale/lang-hi.js new file mode 100644 index 00000000..f10e2176 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-hi.js @@ -0,0 +1,1378 @@ +SnapTranslator.dict.hi = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) बाएं", + "(0) up": "(0) ऊपर", + "(1) sine": "(1) सिने", + "(180) down": "(180) नीचे", + "(2) square": "(2) स्क्वायर", + "(3) sawtooth": "(3) आराघर का गिटार", + "(4) triangle": "(4) त्रिकोण साधन", + "(90) right": "(90) दाईं", + "(empty)": "", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "स्नैप के बारे में", + "About...": "के बारे में...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "", + "Any type": "", + "Apply": "", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "वापस....", + "Backgrounds": "पृष्ठभूमि", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "", + "Boolean": "बूलियन", + "Boolean (T/F)": "", + "Boolean (unevaluated)": "", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "कैमरा", + "Camera not supported": "", + "Camera support": "", + "Cancel": "", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "", + "Clear backup": "", + "Clicking sound": "", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "", + "Command (C-shape)": "", + "Command (inline)": "", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "योगदानवाला", + "Control": "नियंत्रण", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "", + "Costumes": "पोशाक", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "", + "Create variables": "", + "Create variables in program": "", + "Credits...": "क्रेडिट....", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "", + "Delete": "", + "Delete Custom Block": "", + "Delete Project": "", + "Delete a variable": "एक चर हटाएं", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Download Source", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "खाली", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "", + "Export blocks...": "निर्यात ब्लॉक...", + "Export project as plain text...": "सादा पाठ के रूप में निर्यात परियोजना...", + "Export project...": "निर्यात परियोजना...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "नमस्ते!", + "Hello, World!": "", + "Help": "", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "हम्म....", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "अपने वेबकैम से एक नई पोशाक आयात करें", + "Import blocks": "", + "Import library": "", + "Import sound": "", + "Import...": "आयात...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "", + "Input Slot Options": "", + "Input name": "", + "Input sliders": "", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "Javascript function ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "", + "Libraries...": "", + "License": "लाइसेंस", + "License...": "लाइसेंस....", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "", + "Lists": "सूची", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "", + "Logout": "", + "Long form input dialog": "", + "Looks": "नज़र", + "Make a block": "ब्लॉक बनाना", + "Make a variable": "एक चर बनाओ", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "संदेश का नाम", + "Method Editor": "", + "Microphone": "माइक्रोफ़ोन", + "Microphone resolution...": "माइक्रोफोन संकल्प....", + "Modules...": "मॉड्यूल....", + "Motion": "प्रस्ताव", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "", + "Nested auto-wrapping": "", + "New": "नया", + "New Category": "", + "New Project": "", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "", + "November": "", + "Number": "", + "OK": "", + "Object": "", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "", + "Open in Community Site": "", + "Open...": "खुला हुआ...", + "Opening project...": "", + "Operators": "ऑपरेटर", + "Other": "अन्य", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "एक नई पोशाक पेंट करें", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "कलम", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "", + "Play sound": "", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "", + "Prefer empty slot drops": "", + "Prefer smooth animations": "Fixe Framerate", + "Privacy...": "", + "Project Notes": "", + "Project URLs": "", + "Project notes...": "प्रोजेक्ट नोट्स...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "एक नई ध्वनि रिकॉर्ड करें", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "संदर्भ पुस्तिका", + "Remove a category...": "", + "Remove unused blocks": "अप्रयुक्त ब्लॉक हटाएं", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "बचाएं", + "Save As...": "के रूप रक्षित करें...", + "Save Project": "", + "Save Project As...": "", + "Save to disk": "डिस्क में सहेजो", + "Saved!": "", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "स्क्रिप्ट चर नाम", + "Scripts": "स्क्रिप्ट", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "संवेदन", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "", + "Single input.": "", + "Single palette": "", + "Slider maximum value": "स्लाइडर अधिकतम मूल्य", + "Slider minimum value": "स्लाइडर न्यूनतम मूल्य", + "Snap! website": "Snap! वेबसाइट", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "आवाज़", + "Sound Recorder": "", + "Sounds": "आवाज़", + "Sprite": "स्प्राइट", + "Sprite Nesting": "", + "Stage": "मंच", + "Stage height": "", + "Stage selected: no motion primitives": "चरण चयनित: कोई गति आदिम नहीं", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "", + "Stop sound": "", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "", + "Switch to dev mode": "", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "", + "Title text": "", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "अनुवाद", + "Translators...": "अनुवादकों", + "Turbo mode": "", + "Turtle": "दिशा सूचक", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "", + "Unused blocks...": "अप्रयुक्त ब्लॉक...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "चर का नाम", + "Variables": "चर", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuelle Tastatur", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "", + "Zoom blocks": "", + "Zoom blocks...": "", + "_ at _": "_ पर _", + "_ combine _ using _": "", + "_ contains _": "", + "_ effect": "_ प्रभाव", + "_ find first item _ in _": "", + "_ in front of _": "", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ का _", + "_ of block _": "", + "_ of costume _": "_ की पोशाक _", + "_ of sound _": "_ की आवाज़ _", + "_ of text _": "", + "_ to _": "_ से _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "एक नया क्लोन _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "absolute", + "acos": "acosine", + "add _ to _": "", + "add a new Turtle sprite": "एक नया दिशा सूचक स्प्राइट जोड़ें", + "add a new sprite": "एक नया स्प्राइट जोड़ें", + "add comment": "", + "add comment here...": "टिप्पणी यहाँ जोड़ें....", + "agent": "", + "alert _": "window.alert _", + "all": "सब", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "", + "all but this script": "सभी लेकिन यह स्क्रिप्ट all", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "ऐंकर", + "and": "और", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "उत्तर", + "any": "कोई भी", + "any key": "कोई भी कुंजी", + "any message": "कोई संदेश", + "anything": "", + "append _": "सूची _", + "arrange scripts vertically": "", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asine", + "ask _ and wait": "पूछना _ और प्रतीक्ष करो", + "ask _ for _ _": "पूछना _ को _ _", + "atan": "atangent", + "attach...": "", + "b": "b", + "back": "पीछे", + "balance": "संतुलन", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "तल", + "box": "", + "brightness": "चमक", + "broadcast _ _": "प्रसारण _ _", + "broadcast _ _ and wait": "प्रसारण _ _ और रुको", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "कॉल _ _", + "call _ w/continuation": "कॉल _ w/continuation", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "घुमा सकते हैं", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "मध्य", + "center x": "केन्द्र x", + "center y": "केन्द्र y", + "change _ by _": "परिवर्तन _ से _", + "change _ effect by _": "परिवर्तन _ द्वारा प्रभाव _", + "change background _ by _": "पृष्ठभूमि का रंग बदलें _ से _", + "change balance by _": "द्वारा संतुलन में बदलाव _", + "change pen _ by _": "कलम बदल दो _ से _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "द्वारा लिंग का आकार बदलें _", + "change size by _": "द्वारा आकार बदलें _", + "change tempo by _": "द्वारा गति बदलें _ बी पी एम", + "change volume by _": "द्वारा मात्रा बदलें _", + "change x by _": "परिवर्तन x बदल दो _", + "change y by _": "परिवर्तन y बदल दो _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "einschalten, damit Animationen überall gleich laufen", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "einschalten um die virtuelle Tastatur auf mobilen Geräten zu ermöglichen", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "विरासत की जाँच करें से", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "", + "children": "बच्चे", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "", + "clear": "सब कुछ मिटा दें", + "clear graphic effects": "स्पष्ट ग्राफिक प्रभाव", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "", + "clicked": "क्लिक किया", + "clone": "", + "clones": "क्लोन", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "रंग", + "color _ is touching _ ?": "रंग _ मार्मिक _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "हास्य", + "command": "आदेश", + "comment pic...": "टिप्पणी की तस्वीर....", + "compile": "", + "compile _": "संकलन _", + "compile _ for _ args": "", + "confetti": "कंफ़ेद्दी", + "console log _": "console.log _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cosine", + "costume": "पोशाक", + "costume #": "पोशाक #", + "costume name": "", + "costumes": "पोशाक", + "costumes tab help": "किसी अन्य वेब पेज से या अपने कंप्यूटर से चित्र को यहां ड्रॉप करके आयात करें", + "could not connect to:": "", + "cr": "", + "create a clone of _": "क्लोन बनाएं _", + "cross": "", + "crosshairs": "", + "current": "वर्तमान", + "current _": "वर्तमान _", + "current module versions:": "", + "current parent": "", + "custom?": "", + "cut from _": "से काटो _", + "d": "d", + "dangling?": "झूलने?", + "data": "", + "date": "तारीख", + "day of week": "सप्ताह का दिन", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "", + "delete _": "", + "delete _ of _": "", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "", + "delete slot": "", + "delete this clone": "इस क्लोन को हटाएं", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "विकास मोड", + "development mode debugging primitives:": "", + "development mode...": "", + "dimensions": "", + "direction": "दिशा", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "दूरी", + "distance to _": "", + "distribution": "", + "don't rotate": "घुमाएँ नहीं", + "down arrow": "नीचे ऐरो कुंजी", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "खींचने योग्य", + "draggable?": "खींचने योग्य?", + "dragging threshold": "", + "dropped": "गिरा", + "duplicate": "", + "duplicate block definition...": "", + "duration": "समयांतराल", + "e": "e", + "e^": "e^", + "edge": "एज", + "edit": "", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "", + "extract": "", + "f": "f", + "false": "असत्य", + "file": "", + "file menu import hint": "", + "fill": "भरण", + "fill page...": "", + "filtered for _": "फ़िल्टर करें _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "अप्रयुक्त वैश्विक कस्टम ब्लॉक खोजें and remove their usage", + "fisheye": "मछली की आँख", + "flag": "", + "flash": "", + "flat line ends": "समतल रेखा समाप्त होती है", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "जब _ = _ to _ _", + "for all sprites": "", + "for each _ in _ _": "", + "for this sprite only": "", + "forever _": "उम्र भर _", + "frame": "", + "frames": "फ्रेम्स", + "frequencies": "", + "frequency": "आवृत्ति", + "front": "सामने", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "भूत", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "फिसलन _ सेकंड. to x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "पीछे जाओ _ परतों", + "go to _": "_ जाओ", + "go to _ layer": "जाओ _ परत", + "go to x: _ y: _": "जाओ x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "ऊंचाई", + "hello": "नमस्ते", + "help": "", + "help...": "", + "hide": "छिपाना", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "Basisblöcke ausblenden", + "hide variable _": "चर छुपाएं _", + "high": "उच्च", + "hour": "घंटे", + "http:// _": "", + "hue": "विविध रंग", + "huge (4x)": "", + "i": "i", + "identical to": "के समान है", + "if _ _": "अगर _ _", + "if _ _ else _": "अगर _ _ अन्य _", + "if _ then _ else _": "अगर _ तब फिर _ अन्य _", + "if on edge, bounce": "अगर किनारे पर है तो उछाल", + "import a sound from your computer by dragging it into here": "इसे यहां खींचकर अपने कंप्यूटर से ध्वनि आयात करें", + "import without attempting to parse or format data": "डेटा स्वरूपित करने के प्रयास के बिना आयात", + "import...": "आयात....", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "इनहेरिट _", + "inherited": "विरासत में मिला", + "input list:": "", + "input names:": "", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ ?", + "is _ a _ ?": "यह _ प्रकार _ ?", + "is _ empty?": "", + "is _ on?": "है _ चालू चालू?", + "is not a valid option": "", + "is read-only": "", + "item": "मद", + "item _ of _": "मद _ of _", + "items": "", + "j": "j", + "join _": "शामिल _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "कुंजी _ दबाई गई?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "हिंदी", + "language_translator": "Barthdry", + "large": "big", + "last": "पिछले", + "last changed": "", + "last_changed": "2021-05-08", + "launch _ _": "प्रक्षेपण _ _", + "left": "बाएं", + "left arrow": "बाईं ऐरो कुंजी", + "length": "लंबाई", + "length of _": "लंबाई का _", + "length:": "लंबाई:", + "let the World automatically adjust to browser resizing": "", + "letter": "वर्ण", + "letter _ of _": "वर्ण _ का _", + "light (70)": "", + "lightness": "", + "line": "लाइन", + "lines": "", + "list": "सूची", + "list _": "सूची _", + "list view...": "", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "लॉग पेन वेक्टर", + "login": "", + "loop": "", + "low": "कम", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "", + "make a category...": "", + "make a copy and pick it up": "", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "मैक्स", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "संदेश", + "microphone _": "माइक्रोफ़ोन _", + "middle": "", + "minimum": "", + "minute": "मिनट", + "mirror video": "मिरर वीडियो", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "महीना", + "mosaic": "मौज़ेक", + "motion": "प्रस्ताव", + "mouse down?": "नीचे नीचे?", + "mouse position": "", + "mouse x": "माउस x", + "mouse y": "माउस y", + "mouse-departed": "माउस चला गया", + "mouse-entered": "माउस ने प्रवेश किया", + "mouse-pointer": "माऊस पाइंटर", + "move": "", + "move _ steps": "_ कदम चलें", + "move all inside...": "", + "move...": "", + "my": "मेरे", + "my _": "मेरे _", + "my anchor": "मेरे लंगर", + "my dangling?": "मेरी झूलने?", + "my draggable?": "मेरी खींचने योग्य?", + "my name": "मेरा नाम", + "my parent": "मेरे माता पिता", + "my rotation style": "मेरी रोटेशन शैली", + "my rotation x": "मेरा रोटेशन x", + "my rotation y": "मेरा रोटेशन y", + "my temporary?": "मेरा अस्थायी?", + "myself": "खुद", + "n": "n", + "name": "नाम", + "neg": "", + "negative": "नकारात्मक", + "neighbors": "पड़ोसी", + "neighbors ≠": "", + "new costume _ width _ height _": "नई पोशाक _ चौड़ाई _ ऊंचाई _", + "new line": "", + "new sound _ rate _ Hz": "नया आवाज़ _ मूल्यांकन _ हेटर्स", + "new...": "नया....", + "next": "", + "next costume": "अगली पोशाक", + "none": "", + "normal": "साधारण", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "नहीं", + "not _": "नहीं _", + "note": "राग", + "nothing": "", + "now connected.": "", + "number": "संख्या", + "number of channels": "चैनलों की संख्या", + "numbers from _ to _": "numbers _ to _", + "o": "o", + "object _": "वस्तु _", + "octagon": "", + "only duplicate this block": "", + "only face left/right": "केवल बाएं / दाएं चेहरा", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "या", + "or before": "", + "other clones": "अन्य क्लोन", + "other scripts in sprite": "इस स्प्राइट में अन्य लिपि", + "other sprites": "अन्य स्प्राइट्स", + "p": "p", + "paint a new sprite": "एक नया स्प्राइट पेंट करें", + "paintbucket": "", + "parameters": "", + "parent": "माता-पिता", + "parent...": "", + "parts": "पार्ट्स", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "पर पेस्ट करें _", + "pause": "", + "pause all _": "सभी को रोकें _", + "pen": "", + "pen _": "कलम _", + "pen down": "नीचे कलम", + "pen down?": "नीचे कलम?", + "pen trails": "कलम का निशान", + "pen up": "कलम ऊपर", + "pen vectors": "पेन वेक्टर", + "pic...": "", + "pick random _ to _": "यादृच्छिक चुनें _ से _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "पिक्सेलेट", + "pixels": "पिक्सल", + "play _ Hz for _ secs": "सचलाएं _ हेटर्स for _ सेकंड", + "play frequency _ Hz": "संगीत प्ले आवृत्ति _ हेटर्स", + "play note _ for _ beats": "संगीत नोट चलाएं _ तक _ बीट्स", + "play sound _": "आवाज़ बजाना _", + "play sound _ at _ Hz": "आवाज़ बजाना _ पर _ हेटर्स", + "play sound _ until done": "आवाज़ बजाना _ जब तक किया गया", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ दिशा में इंगित करें", + "point towards _": "_ की ओर इशारा", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "विधेय", + "presentation (1.4x)": "", + "pressed": "दब गया", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "यादृच्छिक", + "random position": "यादृच्छिक स्थान", + "rank": "", + "raw data...": "कच्चा डेटा....", + "ray length": "किरण की लंबाई", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "", + "rename only this reporter": "", + "rename sound": "", + "rename...": "", + "repeat _ _": "दोहराना _ _", + "repeat until _ _": "दोहराओ जब तक _ _", + "replace item _ of _ with _": "", + "report _": "रिपोर्ट _", + "reporter": "रिपोर्टर", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "टाइमर रीसेट करें", + "reshape _ to _": "", + "resize...": "", + "resolution": "संकल्प के", + "rest for _ beats": "विश्राम करना _ बीट्स", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "दाईं", + "right arrow": "दाईं ऐरो कुंजी", + "ring": "", + "ringify": "", + "robot": "", + "rotate": "", + "rotation style": "रोटेशन अंदाज", + "rotation x": "रोटेशन x", + "rotation y": "रोटेशन y", + "round _": "", + "run _ _": "चलाना _ _", + "run _ w/continuation": "चलाना _ w/continuation", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "नमूने", + "saturation": "परिपूर्णता", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "इस टिप्पणी की एक तस्वीर को बचाओ", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "प्रोजेक्ट डेटा को इस रूप में सहेजें XML to your downloads folder", + "saved.": "", + "say _": "कहो _", + "say _ for _ secs": "कहो _ तक _ सेकंड", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "", + "script variables _": "स्क्रिप्ट चर _", + "scripts": "स्क्रिप्ट", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "नीचे स्क्रॉल किया गया", + "scrolled-up": "ऊपर स्क्रॉल किया गया", + "second": "सेकंड", + "select": "", + "selection": "", + "self": "स्वयं", + "send _ to _": "भेजने _ को _", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "सेट _ -Effekt auf _", + "set _ of block _ to _": "", + "set _ to _": "सेट _ से _", + "set background _ to _": "पृष्ठभूमि सेट _ सेवा मेरे _", + "set background color to _": "पकरने के लिए पृष्ठभूमि रंग सेट _", + "set balance to _": "के लिए संतुलन सेट करें _", + "set instrument to _": "करने के लिए उपकरण सेट करें _", + "set pen _ to _": "पेन सेट _ सेवा मेरे _", + "set pen color to _": "पेन रंग सेट करें _", + "set pen shade to _": "", + "set pen size to _": "पेन का आकार निर्धारित करें _", + "set size to _ %": "आकार निर्धारित करें _ %", + "set tempo to _ bpm": "के लिए टेम्पो सेट करें _ बी पी एम", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "वीडियो पारदर्शिता सेट करें _", + "set volume to _ %": "की मात्रा निर्धारित करें _ %", + "set x to _": "सेट x से _", + "set y to _": "सेट y से _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "प्रदर्शन", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "", + "show all...": "", + "show primitives": "Basisblöcke anzeigen", + "show project data as XML in a new browser window": "", + "show table _": "", + "show the World's menu": "", + "show variable _": "चर दिखाओ _", + "shown?": "दिखाया?", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sine", + "size": "आकार", + "slider": "स्लाइडर", + "slider max...": "स्लाइडर अधिकतम", + "slider min...": "स्लाइडर न्यूनतम", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "स्नैप", + "sorted": "", + "sound": "", + "sounds": "आवाज़", + "space": "स्पेस बार", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "स्पेक्ट्रम", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "विभाजित करें _ द्वारा _", + "sprite": "स्प्राइट", + "sprites": "स्प्राइट", + "sqrt": "वर्गमूल", + "square": "", + "stack size": "ढेर का आकार", + "stage": "मंच", + "stage image": "", + "stamp": "स्टाम्प", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "रुकें _", + "stop all sounds": "सभी आवाज़ बंद करो", + "stop frequency": "रुकें आवृत्ति", + "stopped": "रोका हुआ", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "खिंचाव _ x: _ y: _ %", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "_ कॉस्ट्यूम पर स्विच करें", + "switch to scene _ _": "", + "t": "t", + "tab": "टैबुलाटर", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "एक कैमरा स्नैपशॉट लें और इसे एक नए स्प्राइट के रूप में आयात करें", + "tan": "tangent", + "tell _ to _ _": "बताओ _ _ को _", + "tempo": "टेम्पो", + "temporary?": "अस्थायी?", + "text": "टेक्स्ट", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "", + "think _": "सोचो _", + "think _ for _ secs": "सोचो _ तक _ सेकंड", + "this _": "", + "this block": "यह ब्लॉक", + "this project doesn't have any custom global blocks yet": "", + "this script": "यह स्क्रिप्ट", + "time in milliseconds": "मिलीसेकेंड", + "timer": "टाइमर", + "tip": "", + "to": "", + "top": "ऊपर", + "touch screen settings": "", + "touching _ ?": "मार्मिक _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "barathkumarbasker2007@gmail.com", + "transparency": "पारदर्शिता", + "transparency...": "", + "trash is empty": "", + "true": "सच", + "turbo mode": "टर्बो मोड", + "turbo mode?": "", + "turn _ _ degrees": "_ _ डिग्री बारी", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "के प्रकार _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "ausschalten, um Animationen dynamischer auszuführen", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "", + "uncheck to allow script reentrance": "", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "ausschalten um die virtuelle Tastatur auf mobilen Geräten zu sperren", + "uncheck to disinherit": "डिस्चार्ज करने से अनचेक करें", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "Unicode _ as letter", + "unicode of _": "Unicode Of _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "शीर्षकहीन", + "unused": "", + "unused block(s) removed": "", + "up arrow": "ऊपर ऐरो कुंजी", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "मूल्य", + "variable": "", + "variables": "", + "video _ on _": "वीडियो _ पर _", + "video capture": "विडियो रिकॉर्ड", + "volume": "वॉल्यूम", + "w": "w", + "wait _ secs": "रुको _ सेकंड.", + "wait until _": "जब तक इंतजार _", + "wardrobe": "", + "warp _": "ताना _", + "what's your name?": "तुम्हारा नाम क्या हे?", + "when I am _": "जब मैं _ werde", + "when I receive _ _": "जब मैं प्राप्त करता हूँ _ _", + "when I start as a clone": "जब मैं क्लोन के रूप में शुरू करता हूं", + "when _": "जब _", + "when _ clicked": "जब _ क्लिक किया", + "when _ is edited _": "", + "when _ key pressed _": "जब _ दबाई जाती है _", + "whirl": "चक्कर", + "whitespace": "खाली स्थान के", + "width": "चौड़ाई", + "with data": "", + "with inputs": "", + "word": "शब्द", + "world": "विश्व", + "write _ size _": "लिखना _ आकार _", + "x": "x", + "x position": "x स्थिति", + "y": "y", + "y position": "y स्थिति", + "year": "साल", + "year:": "", + "your own": "", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-hr.js b/elements/pl-snap/Snap/locale/lang-hr.js new file mode 100644 index 00000000..0234f014 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-hr.js @@ -0,0 +1,1385 @@ +SnapTranslator.dict.hr = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) lijevo", + "(0) up": "(0) gore", + "(1) sine": "", + "(180) down": "(180) dolje", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) desno", + "(empty)": "(prazno)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "O Snap-u", + "About...": "O programu...", + "Account created.": "Račun je kreiran.", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "E-mail sa zaporkom je poslan na upisanu adresu", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animacije", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Bilo koji (neizračunat)", + "Any type": "Bilo koji tip", + "Apply": "Primijeni", + "April": "Travanj", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Jesi siguran da želiš izbrisati?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "Kolovoz", + "Back...": "Natrag...", + "Backgrounds": "Pozadine", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Datum rođenja:", + "Bitmap": "", + "Block Editor": "Uređivač blokova", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Zamagljene sjene", + "Boolean": "logički", + "Boolean (T/F)": "Logički (T/F)", + "Boolean (unevaluated)": "Logički (neizračunat)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "Preglednik", + "Brush size": "Veličina olovke", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Odustani", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "Promjena zaporke", + "Change Password...": "Promjena zaporke…", + "Change block": "Promijeni blok", + "Clear backup": "", + "Clicking sound": "Zvuk klikanja", + "Closed brush (free draw)": "", + "Cloud": "Oblak", + "Code mapping": "", + "Codification support": "Podrška za kodiranje", + "Colors and Crayons": "", + "Command": "Potprogram", + "Command (C-shape)": "Naredba (C-oblika)", + "Command (inline)": "Naredba (u liniji)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Održati proporcije? (možete i držati shift)", + "Contents": "", + "Contributors": "Doprinijeli", + "Control": "Upravljanje", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Uređivač kostima", + "Costumes": "Kostimi", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Kreiraj ime parametra", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Suradnici...", + "Custom Block Translations": "", + "Database": "", + "December": "Prosinac", + "Default": "", + "Default Value:": "Default vrijednost:", + "Delete": "Obriši", + "Delete Custom Block": "Obriši korisnički blok", + "Delete Project": "Izbrisati projekt", + "Delete a variable": "Obriši varijablu", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Skini izvorni kod", + "Dragging threshold...": "", + "Dynamic input labels": "Dinamičke oznake parametara", + "E-mail address of parent or guardian:": "E-mail adresa roditelja ili staratelja:", + "E-mail address:": "E-mail adresa:", + "ERROR: INVALID PASSWORD": "Greška: nevažeća zaporka", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Uredi ime parametra", + "Edit label fragment": "Uredi oznaku", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Prazno", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Upišite jednu opciju po liniji. Koristite \"=\" kao key/value delimiter npr: odgovor=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Brisalica (gumica)", + "Error": "", + "Examples": "Primjeri", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "Izvezi sve skripte kao sliku...", + "Export blocks": "Izvezi blokove", + "Export blocks...": "Izvoz blokova", + "Export project as plain text...": "Izvezi projekt kao obični tekst...", + "Export project...": "Izvoz projekta...", + "Export summary with drop-shadows...": "", + "Export summary...": "Izvezi sažetak...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "Veljača", + "Fetching project from the cloud...": "Povlačenje projekta iz oblaka...", + "Fill a region": "Ispuna područja", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "Ispunjena elipsa (shift: krug)", + "Filled Rectangle (shift: square)": "Ispunjeni pravokutnik (shift: kvadrat)", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "Ravni završeci linija", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Pozdrav!", + "Hello, World!": "", + "Help": "Pomoć", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "Pročitao/la sam i slažem se s uvjetima korištenja", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Uvezi blokove", + "Import library": "Uvezi bibloteku", + "Import sound": "", + "Import tools": "Uvezi alate", + "Import...": "Uvezi...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Podrži nasljeđivanje", + "Input Names:": "Imena parametara:", + "Input Slot Options": "Opcije ulaznog utora", + "Input name": "Ime parametra", + "Input sliders": "Klizači za parametre", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "Siječanj", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "Srpanj", + "June": "Lipanj", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Uređivanje tipkovnicom", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Jezik...", + "Libraries...": "Biblioteke...", + "License": "Licenca", + "License...": "Licenca...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "Línije (shift: okomite/vodoravne)", + "List": "Lista", + "List utilities": "", + "Lists": "Liste", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Prijava...", + "Logout": "Odjava", + "Long form input dialog": "Duži dijalog parametara", + "Looks": "Izgled", + "Make a block": "Napravi novi blok", + "Make a variable": "Napravi varijablu", + "Manipulate costumes pixel-wise.": "", + "March": "Ožujak", + "May": "Svibanj", + "Message name": "Ime događaja", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Moduli...", + "Motion": "Kretanje", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Više parametara (vrijednost je lista parametara)", + "Nested auto-wrapping": "Automatsko ugnježđivanje", + "New": "Novi", + "New Category": "", + "New Project": "Novi projekt", + "New category...": "", + "New password:": "Nova zaporka:", + "New scene": "", + "No": "Ne", + "November": "Studeni", + "Number": "Broj", + "OK": "", + "Object": "", + "October": "Listopad", + "Ok": "", + "Old password:": "Stara zaporka:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Otvori", + "Open Project": "Otvori projekt", + "Open in Community Site": "", + "Open...": "Otvori...", + "Opening project...": "Otvaram projekt...", + "Operators": "Operatori", + "Other": "Ostalo", + "Output text using speech synthesis.": "", + "Paint Editor": "Uređivač slika", + "Paint a new costume": "nacrtaj novi kostim", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Olovka (slobodno crtanje)", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "Zaporka:", + "Pen": "Olovka", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Kapaljka (pokupit će uzorak boje)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Označavanje blokova", + "Play": "Sviraj", + "Play sound": "Sviraj zvuk", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Tvrdnja", + "Prefer empty slot drops": "Preferiraj spuštanje u prazne utore", + "Prefer smooth animations": "Preferiraj glatke animacije", + "Privacy...": "Privatnost...", + "Project Notes": "Napomene o projektu", + "Project URLs": "", + "Project notes...": "Napomene o projektu...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Korisnički priručnik", + "Remove a category...": "", + "Remove unused blocks": "Makni nekorištene blokove", + "Repeat Password:": "", + "Repeat new password:": "Ponovi novu zaporku:", + "Replace Project": "", + "Replace the current project with a new one?": "Zamijeniti trenutni projekt s novim?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funkcija", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Obnova zaporke…", + "Reset password": "Obnova zaporke", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Spremi", + "Save As...": "Spremi kao...", + "Save Project": "", + "Save Project As...": "Spremi projekt kao...", + "Save to disk": "Spremi na disk", + "Saved!": "Spremljeno!", + "Saving project to the cloud...": "Spremanje projekta u oblak...", + "Scenes...": "", + "Script variable name": "Ime skriptne varijable", + "Scripts": "", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Osjetila", + "September": "Rujan", + "Serial Ports": "", + "Service:": "Servis:", + "Set RGB or HSV pen color": "", + "Set the rotation center": "Postavi centar rotacije", + "Share": "Dijeli", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "Prijava", + "Sign up": "Registracija", + "Signada (Network remote control)": "", + "Signup": "Registracija", + "Signup...": "Registracija računa...", + "Single input.": "Jedan parametar.", + "Single palette": "", + "Slider maximum value": "Maksimalna vrijednost klizača", + "Slider minimum value": "Minimalna vrijednost klizača", + "Snap! website": "Snap! web stranica", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Zvuk", + "Sound Recorder": "", + "Sounds": "Zvukovi", + "Sprite": "", + "Sprite Nesting": "Ugnježđivanje objekata", + "Stage": "Scena", + "Stage height": "Visina scene", + "Stage selected: no motion primitives": "Scena je izabrana: - bez blokova kretanja", + "Stage size": "Veličina scene", + "Stage size...": "Veličina scene...", + "Stage width": "Širina scene", + "Stop": "Zaustavi", + "Stop sound": "Zaustavi zvuk", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Elipsa (shift: krug)", + "Stroked Rectangle (shift: square)": "Pravokutnik (shift: kvadrat)", + "Switch back to user mode": "Prebaci natrag na korisniški način", + "Switch to dev mode": "Prebaci na razvojni način", + "Switch to vector editor?": "", + "Table lines": "Linije tablica", + "Table support": "Podrška za tablice", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Uvjeti korištenja...", + "Ternary Boolean slots": "", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Skripte - višestrukost", + "Title text": "Tekst u naslovu", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Prijevodi", + "Translators...": "Prevoditelji", + "Turbo mode": "Turbo način", + "Turtle": "Kostim zero", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Bez imena", + "Unused blocks...": "Nekorišteni blokovi", + "Unverified account:": "", + "Up": "", + "Updating project list...": "Osvježavam listu projekata...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Interna varijabla vidljiva pozivaocu", + "Use CPU for graphics": "", + "User name must be four characters or longer": "Korisničko ime mora imati više od 4 znaka", + "User name:": "Korisničko ime:", + "Variable name": "Ime varijable", + "Variables": "Varijable", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtualna tipkovnica", + "Visible stepping": "Prikazuj izvršavanje blokova", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Da", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "Niste prijavljeni", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebra boje", + "Zoom blocks": "Zumiraj blok", + "Zoom blocks...": "Zumiraj blokove...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "lista _ sadrži _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ ispred _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ modul _", + "_ of _": "_ od _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "dodaj _ na listu _", + "add a new Turtle sprite": "dodaj novi objekt", + "add a new sprite": "dodaj novi objekt", + "add comment": "dodaj komentar", + "add comment here...": "ovdje napiši komentar...", + "agent": "", + "alert _": "upozorenje: _", + "all": "sve", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "svi osim prvog iz liste _", + "all but this script": "sve osim ove skripte", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "odgovor", + "any": "", + "any key": "", + "any message": "bilo koji događaj", + "anything": "", + "append _": "", + "arrange scripts vertically": "posloži skripte okomito", + "arrowDown": "strelica dolje", + "arrowDownOutline": "obris strelice dolje", + "arrowLeft": "strelica lijevo", + "arrowLeftOutline": "obris strelice lijevo", + "arrowRight": "strelica desno", + "arrowRightOutline": "obris strelice desno", + "arrowUp": "strelica gore", + "arrowUpOutline": "obris strelice gore", + "asin": "asin", + "ask _ and wait": "pitaj _ i čekaj", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "velik (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Da li da obrišem taj blok sa svim potprogramima?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blokove", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "svjetlina", + "broadcast _ _": "objavljujem događaj _ _", + "broadcast _ _ and wait": "objavljujem događaj _ _ i čekam", + "brush": "olovka", + "build": "napravi", + "but getting a": "", + "c": "c", + "call _ _": "pozovi _ _", + "call _ w/continuation": "pozovi _ s nastavkom", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "može se rotirati", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "promijeni varijablu _ za _", + "change _ effect by _": "promijeni efekt _ za _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "promijeni boju olovke za _", + "change pen shade by _": "promijeni sjenu olovke za _", + "change pen size by _": "promijeni veličinu olovke za _", + "change size by _": "promijeni veličinu za _", + "change tempo by _": "promijeni tempo za _", + "change volume by _": "", + "change x by _": "promijeni x za _", + "change y by _": "promijeni y za _", + "check for alternative GUI design": "", + "check for block to text mapping features": "označi za pretvaranje blokova u kod", + "check for flat ends of lines": "označi za ravne završetke linija", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "označi za glatke, predvidive animacije na raznim računalima", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "označi da bi uvijek pokazao sve opcije u dijalogu parametara", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "označi da zabraniš višekratni poziv skripti", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "označi da se omogućiš IDE- animacije", + "check to enable alternating colors for nested blocks": "označi za nijansiranje boja ugnježđenih blokova", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "označi za omogućiti dinamičke oznake", + "check to enable input sliders for entry fields": "označi da uključiš klizače vrijednosti kod parametara", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "označi da se može koristiti virtualna tipkovnica za mobilne uređaje", + "check to hide (+) symbols in block prototype labels": "označi za sakriti (+) simbol u oznakama novih blokova", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "označi da daš prioritet izvršavanju skripti", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "označi da uključiš zvuk klikanja bloka", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "označi za zamagljene sjene i osvjetljenja", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "krug", + "circle box": "", + "circleSolid": "ispunjeni krug", + "clean up": "posloži", + "clear": "obriši", + "clear graphic effects": "isključi grafičke efekte", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Klikni ili povuci križić za promjenu centra rotacije", + "clicked": "klikneš", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "oblak", + "cloud unavailable without a web server.": "", + "cloudGradient": "gradijent oblaka", + "cloudOutline": "obris oblaka", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "boja _ dodiruje _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "komično", + "command": "potprogram", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "šareno", + "console log _": "ispiši na konzolu _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "kostim br.", + "costume name": "ime kostima", + "costumes": "", + "costumes tab help": "Slike uvoziš povlačenjem s druge web stranice ili s računala", + "could not connect to:": "ne može se spojiti na:", + "cr": "novi red", + "create a clone of _": "stvori klona od _", + "cross": "", + "crosshairs": "križić", + "current": "", + "current _": "trenutni _", + "current module versions:": "Verzije učitanih modula:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "dan", + "day of week": "dan u tjednu", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "izbriši", + "delete _": "", + "delete _ of _": "obriši _ iz liste _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "obriši definiciju bloka", + "delete slot": "", + "delete this clone": "obriši ovog klona", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "odlijepi sve dijelove", + "detach and put into the hand": "", + "detach from": "odlijepi od", + "development mode": "razvojni način", + "development mode debugging primitives:": "razvojni način debagiranje osnovnih blokova", + "development mode...": "", + "dimensions": "", + "direction": "smjer", + "disable deep-Morphic context menus and show user-friendly ones": "onemogući deep-Morphic kontekstne menije i koristi user-friendly menije", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "odspojen.", + "distance": "", + "distance to _": "udaljenost do _", + "distribution": "", + "don't rotate": "ne rotiraj", + "down arrow": "strelica dolje", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "povlačiv", + "draggable?": "", + "dragging threshold": "", + "dropped": "ispustiš", + "duplicate": "dupliciraj", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "rub", + "edit": "uredi", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "uredi...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "omogući Morphic kontekstne menije i inspektore, nisu baš user-friendly", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "brisalica (gumica)", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "izvezi", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "izvezi...", + "extract": "", + "f": "f", + "false": "laž", + "file": "", + "file menu import hint": "uvoz izvezenog projekta tj. biblioteke s blokovima, kostimima i/ili zvukovima", + "fill": "", + "fill page...": "", + "filtered for _": "filtrirano za _", + "find blocks": "", + "find blocks...": "nađi blokove...", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "Napravljeni blokovi - nekorišteni", + "fisheye": "", + "flag": "zastava", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "izvrni ↔", + "flip ↕": "izvrni ↕", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "za sve objekte", + "for each _ in _ _": "", + "for this sprite only": "samo za trenutni objekt", + "forever _": "zauvijek _", + "frame": "", + "frames": "sličice", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "pun ekran", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "prozirnost", + "giant (8x)": "gigantski (8x)", + "glide _ secs to x: _ y: _": "kliži _ s do x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "idi natrag _ slojeva", + "go to _": "kreni na _", + "go to _ layer": "", + "go to front": "prebaci u prednji plan", + "go to x: _ y: _": "kreni na x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "veće", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "pozdrav", + "help": "Pomoć", + "help...": "pomoć...", + "hide": "sakrij", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "sakrij osnovne blokove", + "hide variable _": "sakrij varijablu _", + "high": "", + "hour": "sat", + "http:// _": "", + "hue": "", + "huge (4x)": "ogroman (4x)", + "i": "i", + "identical to": "isti kao", + "if _ _": "ako _ _", + "if _ _ else _": "ako _ _ inače _", + "if _ then _ else _": "", + "if on edge, bounce": "kad budeš na rubu, odbij se", + "import a sound from your computer by dragging it into here": "Zvuk uvoziš tako, da ga povučeš ovdje", + "import without attempting to parse or format data": "", + "import...": "uvezi...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "lista parametara:", + "input names:": "imena parametara:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "ubaci _ na _ mjesto liste _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "da li je _ ?", + "is _ a _ ?": "da li je _ tipa _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "element _ liste _", + "items": "", + "j": "j", + "join _": "spoji _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "tipka _ pritisnuta?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Hrvatski", + "language_translator": "Željko Hrvoj", + "large": "veliko", + "last": "zadnji", + "last changed": "zadnja promjena", + "last_changed": "2017-08-15", + "launch _ _": "startaj _ _", + "left": "", + "left arrow": "strelica lijevo", + "length": "", + "length of _": "duljina od _", + "length:": "duljina:", + "let the World automatically adjust to browser resizing": "", + "letter": "znak", + "letter _ of _": "znak _ od _", + "light (70)": "", + "lightness": "", + "line": "linija", + "lines": "", + "list": "lista", + "list _": "lista _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "učitaj službenu biblioteku s naprednim blokovima", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "prijava", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "napravi novi blok...", + "make a category...": "", + "make a copy and pick it up": "napravi kopiju i pokupi", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "događaj", + "microphone _": "", + "middle": "sredina", + "minimum": "", + "minute": "minuta", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruozni (10x)", + "month": "mjesec", + "mosaic": "", + "motion": "", + "mouse down?": "gumb miša pritisnut?", + "mouse position": "", + "mouse x": "x položaj miša", + "mouse y": "y položaj miša", + "mouse-departed": "miš napusti", + "mouse-entered": "miš posjeti", + "mouse-pointer": "strelica miša", + "move": "pomakni", + "move _ steps": "pomak _ koraka", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "mene", + "n": "n", + "name": "", + "neg": "", + "negative": "negativ", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "novo...", + "next": "", + "next costume": "idući kostim", + "none": "nijedan", + "normal": "normalno", + "normal (1x)": "", + "normalScreen": "normal ekran", + "normalStage": "normal scena", + "not": "", + "not _": "ne _", + "note": "", + "nothing": "", + "now connected.": "sad sam spojen.", + "number": "brojka", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "oktogon", + "only duplicate this block": "dupliciraj samo taj blok", + "only face left/right": "gledaj samo lijevo-desno", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "otvara novi prozor preglednika sa sažetkom projekta", + "open a new window with a picture of all scripts": "otvori novi prozor sa slikom svih skripti", + "open a new window with a picture of the stage": "otvori novi prozor sa slikom scene", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "otvori novi prozor sa slikom te skripte", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "opcije...", + "or": "ili", + "or before": "ili prije", + "other clones": "", + "other scripts in sprite": "ostale skripte objekta", + "other sprites": "", + "p": "p", + "paint a new sprite": "nacrtaj novi objekt", + "paintbucket": "kanta s bojom", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "zaporka mora imati 6 znakova ili više", + "passwords do not match": "zaporke se ne podudaraju", + "paste on _": "", + "pause": "pauza", + "pause all _": "pauziraj sve _", + "pen": "pero", + "pen _": "", + "pen down": "olovku pritisni", + "pen down?": "", + "pen trails": "tragovi olovke", + "pen up": "olovku digni", + "pen vectors": "", + "pic...": "slikaj...", + "pick random _ to _": "slučajni broj od _ do _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "kapaljka", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "sviraj notu _ tokom _ udaraca", + "play sound _": "odsviraj zvuk _", + "play sound _ at _ Hz": "", + "play sound _ until done": "odsviraj zvuk _ do kraja", + "please agree to the TOS": "molimo prihvatite uvjete", + "please fill out this field": "molimo ispunite ovo polje", + "please provide a valid email address": "molimo upišite važeću e-mail adresu", + "point in direction _": "okreni se u smjeru _", + "point towards _": "okreni se prema _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "tvrdnja", + "presentation (1.4x)": "prezentacija (1.4x)", + "pressed": "pritisneš", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "bilo koji", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "samo za čitanje", + "receivers...": "", + "recording": "", + "rectangle": "pravokutnik", + "rectangleSolid": "ispunjeni pravokutnik", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "promijeni tip...", + "release": "", + "remove block variables...": "", + "rename": "preimenuj", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "preimenuj kostim", + "rename only this reporter": "", + "rename sound": "preimenuj zvuk", + "rename...": "preimenuj...", + "repeat _ _": "ponavljaj _ _", + "repeat until _ _": "ponavljaj dok ne bude _ _", + "replace item _ of _ with _": "zamijeni _ element liste _ sa _", + "report _": "vrati vrijednost ili tvrdnju _", + "reporter": "funkcija", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "resetiraj timer", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "sviraj pauzu tokom _ udaraca", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "strelica desno", + "ring": "", + "ringify": "opkruži", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "", + "run _ _": "pokreni _ _", + "run _ w/continuation": "pokreni _ s nastavkom", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "spremljeno.", + "say _": "reci _", + "say _ for _ secs": "reci _ tokom _ s", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "slikaj skriptu...", + "script variables _": "skriptna varijabla _", + "scripts": "", + "scripts pic...": "slikaj skriptu...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "sekunda", + "select": "izaberi", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "postavi efekt _ na _", + "set _ of block _ to _": "", + "set _ to _": "postavi _ na _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "boja olovke _", + "set pen shade to _": "sjena olovke _", + "set pen size to _": "veličina olovke _", + "set size to _ %": "postavi veličinu na _ %", + "set tempo to _ bpm": "postavi tempo na _ udar./min.", + "set this morph's alpha value": "", + "set turbo mode to _": "postavi turbo način na _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "postavi x na _", + "set y to _": "postavi y na _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "uključi da se blokovi radije spuštaju na slobodna mjesta pri postavljanju", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "pokaži", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "pokaž ži sliku svih skripti i definicija blokova", + "show all": "pokaži sve", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "prikaz globalnih definicija korisničkih blokova u XML obliku u novom prozoru preglednika", + "show primitives": "pokaži osnovne blokove", + "show project data as XML in a new browser window": "prikaz projekta u XML obliku u novom prozoru preglednika", + "show table _": "", + "show the World's menu": "", + "show variable _": "prikaži varijablu _", + "shown?": "", + "shrink": "manje", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "veličina", + "slider": "klizač", + "slider max...": "klizač max...", + "slider min...": "klizač min...", + "slots": "", + "smallStage": "mala scena", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "razmaknica", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "balončić teksta", + "speechBubbleOutline": "obris balončića teksta", + "split _ by _": "razdvoji _ kod _", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "kvadrat", + "stack size": "veličina stoga", + "stage": "", + "stage image": "", + "stamp": "pečat", + "standard settings": "", + "stay signed in on this computer until logging out": "ostani prijavljen na računalu do odjave", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "zaustavi _", + "stop all sounds": "zaustavi sve zvukove", + "stop frequency": "", + "stopped": "", + "storage": "pohrana", + "store this project in the downloads folder (in supporting browsers)": "spremi ovaj projekt u Download mapu(nije podržano baš kod svih preglednika)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "prebaci na kostim _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulator", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "tekst", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "nema nekorištenih blokova u ovom projektu", + "there are currently no vectorizable pen trail segments": "", + "thing": "stvar", + "think _": "razmišljaj _", + "think _ for _ secs": "razmišljaj _ tokom _ s", + "this _": "", + "this block": "ovaj blok", + "this project doesn't have any custom global blocks yet": "ovaj projekt nema još nijedan korisnički globalni blok", + "this script": "ovu skriptu", + "time in milliseconds": "vrijeme u ms", + "timer": "", + "tip": "vrh", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "dodiruje _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "zeljko.hrvoj@zg.t-com.hr", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "istina", + "turbo mode": "", + "turbo mode?": "turbo način?", + "turn _ _ degrees": "okreni se _ _ stupnjeva", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "pretvori sve tragove olovke i žigove u novi kostim za trenutni objekt", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "pretvori trag olovke u novi kostim...", + "turnBack": "", + "turnForward": "", + "turnLeft": "okreni lijevo", + "turnRight": "okreni desno", + "turtle": "objekt", + "turtleOutline": "obris objekta", + "type": "", + "type of _": "tip od _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "odznači za veću brzinu kod promjenljive frekvencije osvježavanja", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "odznači za zaobljene završetke linija", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "odznači za to da ispuštene vrijednosti izbacuju druge", + "uncheck to allow script reentrance": "odznači da dopustiš višekratni poziv skripti", + "uncheck to always show (+) symbols in block prototype labels": "odznači za uvijek prikazati (+) simbol u oznakama novih blokova", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "odznači da onemogućiš IDE- animacije", + "uncheck to disable alternating colors for nested block": "odznači da ne nijansiram boje ugnježđenih blokova", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "odznači za isključiti dinamičke oznake", + "uncheck to disable input sliders for entry fields": "odznači da isključiš klizače vrijednosti kod parametara", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "odznačite da onemogućite kombiniranje objekata", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "odznači da se ne koristi virtualna tipkovnica za mobilne uređaje", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "odznači za normalni prioritet izvršavanja skripti", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "odznači da isključiš zvuk klikanja bloka", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "odznači za čvrste sjene i osvjetljenja", + "uncheck to use the input dialog in short form": "odznači za kratke dijaloge parametara", + "uncompile": "", + "undo": "poništi", + "undo the last block drop in this pane": "poništi zadnje ispuštanje bloka u tom okviru", + "undrop": "poništi ispuštanje", + "unicode _ as letter": "unicode _ kao znak", + "unicode of _": "unicode vrijednost od _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "odstrani obruč", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "bez imena", + "unused": "", + "unused block(s) removed": "nekorištenih blokova izbrisano", + "up arrow": "strelica gore", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "čekam _ s", + "wait until _": "čekam dok ne bude _", + "wardrobe": "", + "warp _": "", + "what's your name?": "kako ti je ime?", + "when I am _": "kad me _", + "when I receive _ _": "kad spazim događaj _ _", + "when I start as a clone": "kad startam kao klon", + "when _": "", + "when _ clicked": "kad kliknem na _", + "when _ is edited _": "", + "when _ key pressed _": "kad pritisnem tipku _ _", + "whirl": "", + "whitespace": "razmak", + "width": "", + "with data": "", + "with inputs": "s parametrima", + "word": "", + "world": "svijet", + "write _ size _": "", + "x": "x", + "x position": "položaj x", + "y": "y", + "y position": "položaj y", + "year": "godina", + "year:": "godina:", + "your own": "svoje vlastite", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-hu.js b/elements/pl-snap/Snap/locale/lang-hu.js new file mode 100644 index 00000000..8c8d7103 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-hu.js @@ -0,0 +1,1377 @@ +SnapTranslator.dict.hu = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "» nincs ebben a környezetben", + "(-90) left": "(-90) balra", + "(0) up": "(0) fel", + "(1) sine": "(1) szinusz", + "(180) down": "(180) le", + "(2) square": "(2) négyzetes", + "(3) sawtooth": "(3) fűrészfog", + "(4) triangle": "(4) háromszög", + "(90) right": "(90) jobbra", + "(empty)": "(üres)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "(ideiglenes)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "A Snap névjegye", + "About...": "A Snap! névjegye...", + "Account created.": "Az azonosító létrejött.", + "Add interactive maps to projects": "", + "Add scene...": "Jelenet hozzáadása...", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Többsoros szövegbevitel megengedése", + "An e-mail with your password has been sent to the address provided": "A megadott címre e-mailben elküldtük a jelszavát.", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animációk", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Bármilyen (nem kiértékelt)", + "Any type": "Bármilyen típus", + "Apply": "Alkalmaz", + "April": "április", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Biztos, hogy törlöd?", + "Are you sure you want to publish": "Biztosan nyilvánossá teszi", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "Biztos, hogy nemnyilvánossá teszi", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "augusztus", + "Back...": "Vissza...", + "Backgrounds": "Hátterek", + "Backup failed. This cannot be undone, proceed anyway?": "Sikertelen biztonsági mentés. Nem visszavonható, folytatod?", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Születési idő:", + "Bitmap": "", + "Block Editor": "Blokk Szerkesztő", + "Block variable name": "Blokk változó neve", + "Blocks": "Blokkok", + "Blocks category name:": "Új kategória neve:", + "Blurred shadows": "Elmosódó árnyékok", + "Boolean": "logikai", + "Boolean (T/F)": "Logikai (I/H)", + "Boolean (unevaluated)": "Logikai (nem kiértékelt)", + "Bottom": "", + "Bring back deleted sprites": "Állítsd vissza a törölt szereplőket", + "Browser": "Böngésző", + "Brush size": "Ecsetméret", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Mégsem", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Programban hibák elkapása", + "Category color": "Kategória színe", + "Change Password": "Jelszó megváltoztatása", + "Change Password...": "Jelszó megváltoztatása...", + "Change block": "Blokk változtatása", + "Clear backup": "", + "Clicking sound": "A kattintás hangja", + "Closed brush (free draw)": "Kitöltött ecset (szabad rajz)", + "Cloud": "Felhő", + "Code mapping": "Kód leképezés", + "Codification support": "A kodifikáció támogatása", + "Colors and Crayons": "", + "Command": "Parancs", + "Command (C-shape)": "Parancs (C-forma)", + "Command (inline)": "Parancs (egysoros)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Megmaradjanak az alakzat arányai? (ehhez használhatja a SHIFT billentyűt is)", + "Contents": "Tartalom", + "Contributors": "Közreműködők", + "Control": "Vezérlés", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Jelmezszerkesztő", + "Costumes": "Jelmezek", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "A bevitel nevének létrehozása", + "Create variables": "", + "Create variables in program": "Programban változók létrehozása", + "Credits...": "Közreműködők...", + "Custom Block Translations": "", + "Database": "", + "December": "december", + "Default": "Alapérték", + "Default Value:": "Alapérték:", + "Delete": "Törlés", + "Delete Custom Block": "Felhasználói blokk törlése", + "Delete Project": "Projekt törlése", + "Delete a variable": "Változó törlése", + "Disable click-to-run": "Blokkon-kattintáskor-futtatás tiltása", + "Disable dragging data": "", + "Down": "", + "Download source": "A forráskód letöltése", + "Dragging threshold...": "", + "Dynamic input labels": "Dinamikus beviteli feliratok", + "E-mail address of parent or guardian:": "A szülő vagy gondozó email címe:", + "E-mail address:": "E-mail cím:", + "ERROR: INVALID PASSWORD": "HIBA: ÉRVÉNYTELEN JELSZÓ", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Vonal színe (bal gomb)", + "Edit input name": "A bevitel nevének szerkesztése", + "Edit label fragment": "A címke rész szerkesztése", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Ellipszis (Shift: kör)", + "Empty": "Üres", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Gépeld be a blokk definíciójának megfelelő programkódot. Használd a saját formális paramétereit (hagyd figyelmen kívül a példákat).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Gépeld be a blokk definíciójának megfelelő programkódot. Használd a látható formális paramétereket és a referenciát a törzs generált szövegkódodhoz.", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Gépeld be a blokk működésének megfelelő programkódot (általában egy függvény bevezetésével). Használd a <#n> hivatkozási helyen látható aktuális argumentumokat.", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Soronként egy lehetőséget írjon be. Szükség esetén használhatja az \"=\" jelet kulcs/érték pár elválasztására, pl. a válasz=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Törlő eszköz", + "Error": "Hiba", + "Examples": "Példák", + "Execute on slider change": "", + "Export Project As...": "Projekt exportálása mint...", + "Export all scripts as pic...": "Minden feladat exportálása képként...", + "Export blocks": "Blokkok exportja", + "Export blocks...": "Blokk exportálása...", + "Export project as plain text...": "Projekt exportálása egyszerű szövegként...", + "Export project...": "Projekt exportálása...", + "Export summary with drop-shadows...": "", + "Export summary...": "Összefoglaló exportálása...", + "Extension blocks": "Kiegészítő blokkok", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Blokkok átlátszósága", + "Fade blocks...": "Blokkok átlátszósága...", + "February": "február", + "Fetching project from the cloud...": "Projekt letöltése a felhőből...", + "Fill a region": "Terület kitöltése", + "Fill color (right click)": "Kitöltő szín (jobb klikk)", + "Filled Ellipse (shift: circle)": "Kitöltött ellipszis (shift: kör)", + "Filled Rectangle (shift: square)": "Kitöltött téglalap (shift: négyzet)", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "Egyszerű vonalvégződés", + "For all Sprites": "Minden szereplőre", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "HSL színmodell", + "Header mapping": "A fejléc leképezése", + "Hello!": "Szia!", + "Hello, World!": "", + "Help": "Súgó", + "Hide blocks in palette": "Blokkok elrejtése a palettáról", + "Hide blocks...": "Blokkok elrejtése...", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "Hyper blokk támogatás", + "I have read and agree to the Terms of Service": "Elolvastam és egyetértek a felhasználási feltételekkel", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Új jelmez importálása a webkamerával", + "Import blocks": "Blokkok importja", + "Import library": "Modulkönyvtár importálása", + "Import sound": "Hang importálása", + "Import...": "Importálás...", + "Imported": "Importálva", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Végtelen pontosság a számokban", + "Inheritance support": "Öröklődés támogatás", + "Input Names:": "Beviteli név:", + "Input Slot Options": "Bemenő adat csatlakozási lehetőségek", + "Input name": "A bevitel neve", + "Input sliders": "Beviteli csúszkák", + "Inside a custom block": "Egy egyedi blokkban", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Ismétlés, Kompozíció", + "JIT compiler support": "", + "January": "január", + "JavaScript extensions": "JavaScript kiegészítők", + "JavaScript extensions for Snap! are turned off": "JavaScript natív függvények kikapcsolva", + "JavaScript function ( _ ) { _ }": "JavaScript függvény ( _ ) { _ }", + "July": "július", + "June": "június", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Billentyűzet Szerkesztés", + "Kind of": "Típus", + "LEAP Motion controller": "LEAP mozgásvezérlő", + "Language...": "Nyelv...", + "Libraries...": "Modulkönyvtárak...", + "License": "Licenc", + "License...": "Licenc...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Vonal (Shift: korlátozza 45°)", + "Line tool (shift: vertical/horizontal)": "Vonalrajzoló eszköz (shift: függőleges/vízszintes)", + "List": "Lista", + "List utilities": "Lista eszközök", + "Lists": "Listák", + "Live coding support": "", + "Loading": "Betöltés", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Toll vektorok mentése", + "Login...": "Belépés...", + "Logout": "Kijelentkezés", + "Long form input dialog": "Hosszú formátumú beviteli párbeszéd", + "Looks": "Kinézet", + "Make a block": "Blokk készítése", + "Make a variable": "Új változó", + "Manipulate costumes pixel-wise.": "", + "March": "március", + "May": "május", + "Message name": "Az üzenet neve", + "Method Editor": "Függvény Szekesztő", + "Microphone": "", + "Microphone resolution...": "Mikrofon felbontás...", + "Modules...": "Modulok...", + "Motion": "Mozgás", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Több-ágú feltételes blokk (elágazás)", + "Multiple inputs (value is list of inputs)": "Több érték bevitele (az érték a bevitelek listája)", + "Nested auto-wrapping": "Automatikus beágyazás", + "New": "Új", + "New Category": "Új kategória", + "New Project": "Új projekt", + "New category...": "Új kategória...", + "New password:": "Új jelszó:", + "New scene": "Új jelenet", + "No": "Nem", + "Notes...": "A projekt jegyzetei", + "November": "november", + "Number": "Szám", + "OK": "", + "Object": "Objektum", + "October": "október", + "Ok": "", + "Old password:": "A jelenlegi jelszó:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Megnyitás", + "Open Project": "Projekt megnyitása", + "Open in Community Site": "Projektoldalon megnyítás", + "Open...": "Megnyitás...", + "Opening project...": "Projekt megnyitása...", + "Operators": "Műveletek", + "Other": "Egyebek", + "Output text using speech synthesis.": "", + "Paint Editor": "Képszerkesztő", + "Paint a new costume": "Új jelmez rajzolása", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "Minta kitöltése (Shift: másodlagos színnel)", + "Paintbrush tool (free draw)": "Festőecset eszköz (szabadkézi rajz)", + "Parallelization": "", + "Part of": "Része", + "Parts": "Részei", + "Password:": "Jelszó:", + "Pen": "Toll", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipetta (szín felvétele bárhonnan)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Pipetta eszköz (Tetszőleges hlyről szín felszedése shift: másodlagos színnel)", + "Pixels": "", + "Plain prototype labels": "Egyszerű blokk prototípus címkék", + "Play": "Lejátszás", + "Play sound": "Hang lejátszása", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Győződj meg arról, hogy a böngésződ naprakész és a kamerát is megfelelően beállítottad. Pár böngésző megköveteli, hogy HTTPS kapcsolaton keresztül nyisd meg a Snap oldalát Próbáld meg kicserélni a cím \"http://\" részét \"https://\" előtagra és próbáld meg újra!", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Kijelentés", + "Prefer empty slot drops": "Üres helyre ejt először", + "Privacy...": "Jogvédelem...", + "Project Notes": "A projekt jegyzetei", + "Project URLs": "", + "Project notes...": "Projektadatok...", + "Provide 100 selected colors": "100 kiválasztott szín", + "Provide getters and setters for all GUI-controlled global settings": "Érték-olvasó és -író minden felületen megjelenő beállításhoz", + "Publish": "Publikálás", + "Publish Project": "", + "Rasterize SVGs": "SVG átalakítása bittérképbe", + "Record a new sound": "Új hang felvétele", + "Recover": "Visszaállítás", + "Rectangle (shift: square)": "Négyszög (Shift: négyzet)", + "Reference manual": "Kézikönyv", + "Remove a category...": "Kategória törlése...", + "Remove unused blocks": "Töröld a nem használt blokkokat", + "Repeat Password:": "", + "Repeat new password:": "Az új jelszó ismét:", + "Replace Project": "", + "Replace the current project with a new one?": "Felülírja az aktuális projektet egy újjal?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Függvény", + "Request blocked": "Kérés blokkolva", + "Resend Verification Email...": "Ellenörző e-mail újraküldése...", + "Resend verification email": "", + "Reset Password...": "A jelszó alaphelyzetre állítása...", + "Reset password": "A jelszó alaphelyzetre állítása", + "Restore unsaved project": "", + "Retina display support": "Retina felbontás támogatása", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "Az SVG ábrákat nem minden böngésző támogatja", + "Same Named Blocks": "", + "Save": "Mentés", + "Save As...": "Mentés másként...", + "Save Project": "A projekt mentése", + "Save Project As...": "Projekt mentése másként...", + "Save to disk": "Lemezre írás", + "Saved!": "Mentve!", + "Saving project to the cloud...": "Projekt mentése a felhőbe...", + "Scenes...": "Jelenetek...", + "Script variable name": "Feladatváltozó név", + "Scripts": "Feladatok", + "Select a costume from the media library": "Válasszon ki egy jelmezt a médiakönyvtárból.", + "Select a sound from the media library": "Válasszon ki egy hangot a médiakönyvtárból.", + "Select categories of additional blocks to add to this project.": "Válassza ki a projekthez adandó blokkok kategóriáit.", + "Selection tool": "Kijelölő", + "Sensing": "Érzékelés", + "September": "szeptember", + "Serial Ports": "", + "Service:": "Szolgáltatás:", + "Set RGB or HSV pen color": "Toll RGB vagy HSV szín szerint", + "Set the rotation center": "A forgatás középpontjának beállítása", + "Share": "Megosztás", + "Share Project": "A projekt megosztása", + "Show buttons": "Gombok megjelenítése", + "Show categories": "Kategóriák kijelzése", + "Sign in": "Regisztráció", + "Sign up": "Újként regisztrálni", + "Signada (Network remote control)": "", + "Signup": "Új regisztráció", + "Signup...": "Feliratkozás...", + "Single input.": "Egyszerű bevitel.", + "Single palette": "Egyesített paletta", + "Slider maximum value": "Csúszka maximális értéke", + "Slider minimum value": "Csúszka minimális értéke", + "Snap! website": "A Snap! webhelye", + "Snap!Cloud": "Snap!Felhő", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Hang", + "Sound Recorder": "", + "Sounds": "Hangok", + "Sprite": "Szereplő", + "Sprite Nesting": "Szereplők összefűzése", + "Stage": "Játéktér", + "Stage height": "Játéktér magassága", + "Stage selected: no motion primitives": "Választott játéktér: nincs mozgó elem", + "Stage size": "Játéktér mérete", + "Stage size...": "Játéktér mérete...", + "Stage width": "Játéktér szélessége", + "Stop": "Állj", + "Stop sound": "A hang leállítása", + "Streams (lazy lists)": "", + "String": "Szöveg", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Ellipszis (shift: kör)", + "Stroked Rectangle (shift: square)": "Téglalap (shift: négyzet)", + "Switch back to user mode": "Vissza a felhasználói üzemmódra", + "Switch to dev mode": "Átkapcsolás fejlesztői módba", + "Switch to vector editor?": "", + "Table lines": "Táblázat sorok", + "Table support": "Táblázat támogatás", + "Table view": "Tábla nézet", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Felhasználási feltételek...", + "Ternary Boolean slots": "Ternary boolean támogatás", + "Text": "Szöveg", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Szöveg beszéddé", + "The error occured at": "Hiba történt ezen a", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Biztonságos programszálak", + "Title text": "A cím szövege", + "Today": "Ma", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Fordítások", + "Translators...": "Fordítók", + "Turbo mode": "Turbó mód", + "Turtle": "Teknős", + "Undelete sprites...": "Szereplők visszaállítása...", + "Unpublish": "Publikálás visszavonása", + "Unpublish Project": "", + "Unsaved Changes!": "Nem mentett változások!", + "Unshare": "Nincs megosztás", + "Unshare Project": "A projekt megosztásának megszüntetése", + "Untitled": "Névtelen", + "Unused blocks...": "Nem használt blokkok...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "A projeklista frissítése...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "A belső változók láthatóvá tétele a hívó számára", + "Use CPU for graphics": "", + "User name must be four characters or longer": "A felhasználói név legalább négy karakteres legyen.", + "User name:": "Felhasználói név:", + "Variable name": "Változónév", + "Variables": "Változók", + "Variadic reporters": "Változó függvények", + "Vector": "", + "Vector Paint Editor": "Vektor Szerkesztő", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Visible stepping": "Léptetés látható", + "Web Audio API is not supported in this browser": "a Web Audio API nem támogatott ezen a böngészőn", + "Web services access (https)": "Web service hozzáférés (https)", + "Words, sentences": "Szavak, mondatok", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Igen", + "Yesterday": "Tegnap", + "Yesterday,": "", + "You are not logged in": "Még nem lépett be", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebra színezés", + "Zoom blocks": "Blokkokra közelítés", + "Zoom blocks...": "Blokkok nagyítása...", + "_ at _": "_ itt _", + "_ combine _ using _": "_ kombináld _ így _", + "_ contains _": "_ tartalmazza _", + "_ effect": "_ hatás", + "_ find first item _ in _": "_ keresd ki az első _ elemet ebből _", + "_ in front of _": "_ megelőzi _", + "_ keep items _ from _": "_ válogasd ki az ilyen _ elemeket ebből _", + "_ map _ over _": "_ képezd le _ erre _", + "_ mod _": "_ osztva _ maradéka", + "_ of _": "_ itt _", + "_ of block _": "blokk _ _", + "_ of costume _": "_ jelmez _", + "_ of sound _": "hangminta _ _", + "_ of text _": "", + "_ to _": "_ ehhez _", + "__shout__go__": "__zöld__zászló__", + "a": "a", + "a custom block definition is missing": "hiányzó egyedi blokk definíció", + "a new clone of _": "új másolat _", + "a variable of name '": "ilyen nevű változó «", + "about morphic.js...": "", + "abs": "abszolútérték", + "acos": "acos", + "add _ to _": "_ hozzáadása _ listához", + "add a new Turtle sprite": "új teknőc rajzának hozzáadása", + "add a new sprite": "Új szereplő", + "add comment": "megjegyzés hozzáadása", + "add comment here...": "tegye ide a megjegyzést", + "agent": "", + "alert _": "felbukkanó: _", + "all": "minden feladat", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ elsőnkívüli elemei", + "all but this script": "minden más feladat", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "horgony", + "and": "és", + "and send": "és küldd", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "válasz", + "any": "valamelyik", + "any key": "bármelyik gomb", + "any message": "bármilyen üzenet", + "anything": "", + "append _": "fűzd hozzá _", + "arrange scripts vertically": "a program függőleges átméretezése", + "arrowDown": "lefelé nyíl", + "arrowDownOutline": "a lefelényíl körvonala", + "arrowLeft": "balra nyíl", + "arrowLeftOutline": "a balra nyíl körvonala", + "arrowRight": "jobbra nyíl", + "arrowRightOutline": "a jobbranyíl körvonala", + "arrowUp": "felfelé nyíl", + "arrowUpOutline": "a felfelényíl körvonala", + "asin": "asin", + "ask _ and wait": "kérdezd meg _ és várj", + "ask _ for _ _": "kérdezd le _ _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "hátulra", + "balance": "hangmérleg", + "big (2x)": "nagy (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Biztos, hogy eltávolítja ezt a blokkot és minden példányát?", + "block variables": "blokk változók", + "block variables...": "blokk változók...", + "block-solid (0)": "normál (0)", + "blockify": "blokkosdítsd", + "blocks": "blokkok", + "blue": "kék", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "alja", + "box": "", + "brightness": "világosság", + "broadcast _ _": "küldj mindenkinek _ _ üzenetet", + "broadcast _ _ and wait": "küldj mindenkinek _ _ üzenetet és várj", + "brush": "ecset", + "build": "építés", + "but getting a": "helyette találtunk egy", + "c": "c", + "call _ _": "hívd _ _", + "call _ w/continuation": "hívd meg _ folytatással", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "csak szöveget vagy számot adhatsz meg, ezt nem érvényes", + "can rotate": "foroghat", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "nem tudok törölt szereplővel dolgozni", + "cannot send media, sprites or procedures to another scene": "nem lehetséges média, szerepl[ vagy eljárás küldése másik jelenetbe", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "felső egészrész", + "center": "közép", + "center x": "középpont x", + "center y": "középpont y", + "change _ by _": "_ változzon ennyivel: _", + "change _ effect by _": "_ hatás változzon _", + "change background _ by _": "háttér _ változzon _", + "change balance by _": "hangmérleg változzon: _", + "change pen _ by _": "toll _ változzon _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "tollméret változzon _", + "change size by _": "a méret változzon _", + "change tempo by _": "a tempó változzon: _", + "change volume by _": "hangerő változzon: _", + "change x by _": "x változzon: _", + "change y by _": "y változzon: _", + "check for alternative GUI design": "bekapcsolva más kinézetű grafikus felületet látsz", + "check for block to text mapping features": "Assinalar para funcionalidades de mapeamento entre blocos e texto.", + "check for flat ends of lines": "kapcsolja be az egyszerű vonalvégződéshez", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "bekapcsolva magasabb felbontást mutat és több erőforrást használ", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "bejelölve mindig látszik a csatlakozás típusa a beviteli párbeszédablakban", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "bekapcsolva a blokkon kattintva a hozzá tartozó kód futtatása nem indul el", + "check to disallow script reentrance": "bekapcsolva engedélyezi a programok többszörös végrehajtását", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "bekapcsolva engedélyezi az IDE animációit", + "check to enable alternating colors for nested blocks": "engedélyezi a beágyazott blokkok eltérő színezését", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "bejelölve engedélyezi a többszörös beviteli mezők dinamikus feliratait", + "check to enable input sliders for entry fields": "bekapcsolva engedélyezi a csúszkákat a beviteli mezőknél", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "jelöld be, hogy engedélyezd a műveleteket listákon és táblázatokon", + "check to hide (+) symbols in block prototype labels": "bejelölve látszik a (+) jel a blokk prototípus cimkéjében", + "check to inherit from": "bekapcsolva öröklődik innen", + "check to prevent contents from being saved": "bekapcsolva nem menti el a változó értékét a projekttel", + "check to prioritize script execution": "bekapcsolva a programozott végrehajtás lesz az elsődleges", + "check to rasterize SVGs on import": "SVG bittérképpé alakíthatóságának ellenőrzése az importálás során", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "bekapcsolva minden blokkot egy palettán mutat", + "check to show buttons in the palette": "bekapcsolva megjeleníti a gombokat a palettán", + "check to show category names in the palette": "bekapcsolva megjeleníti a kategóriák neveit a palettán", + "check to show extension primitives in the palette": "bekapcsolva a kiegészítő blokkokat megjeleníti a palettán", + "check to show in palette": "", + "check to support native JavaScript functions": "bekapcsolva a natív JavaScript függvények elérhetőek", + "check to switch pen colors and graphic effects to HSL": "bekapcsolva a toll színekhez és a grafikai hatásokhoz a HSL színmodellt használja", + "check to turn block clicking sound on": "bekapcsolva engedélyezi a blokkra kattintás hangját", + "check to turn on logging pen vectors": "kapcsold be, hogy a toll vektorok mentését elindítsd", + "check to turn on visible stepping (slow)": "bekapcsolva lassítva láthatod a program lépéseit", + "check to use blurred drop shadows and highlights": "jelölje be, ha elmosódó árnyékokat és kiemeléseket kíván használni", + "children": "gyermek", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "kör", + "circle box": "", + "circleSolid": "kitöltött kör", + "clean up": "törlés", + "clear": "töröld a rajzokat", + "clear graphic effects": "töröld a grafikus hatásokat", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "kattints oda vagy vidd a szálkeresztet a forgás középpontjába", + "clicked": "rám kattintanak", + "clone": "másolás", + "clones": "másolat", + "closedBrush": "", + "cloud": "felhő", + "cloud unavailable without a web server.": "", + "cloudGradient": "a felhő áttetszősége", + "cloudOutline": "a felhő körvonala", + "code": "kód", + "code mapping...": "kód leképezés...", + "code of _": "_ kódja", + "collection": "gyűjtemény", + "color": "szín", + "color _ is touching _ ?": "_ szín érint _ színt?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "oszlopok", + "combinations _": "", + "combine _ using _": "kombináld _ így _", + "comic": "moáré", + "command": "parancsblokk", + "comment pic...": "megjegyzés képe...", + "compile": "fordítás", + "compile _": "fordítsd _", + "compile _ for _ args": "", + "confetti": "konfetti", + "console log _": "konzolra írás: _", + "continuation": "", + "continuations cannot be forked": "Folytatásokat nem tudom indítani", + "cos": "cos", + "costume": "jelmez", + "costume #": "a jelmez sorszáma", + "costume name": "a jelmez neve", + "costumes": "jelmezek", + "costumes tab help": "Kép importálása egy webhelyről vagy a számítógépről", + "could not connect to:": "nem tud csatlakozni ide:", + "cr": "kocsivissza", + "create a clone of _": "készíts másolatot _", + "cross": "", + "crosshairs": "szálkereszt", + "current": "jelenlegi", + "current _": "aktuális _", + "current module versions:": "a jelenlegi modulverziók", + "current parent": "aktuális szülő", + "custom?": "egyedi?", + "cut from _": "vágd ki innen _", + "d": "d", + "dangling?": "külön forgó?", + "data": "", + "date": "nap", + "day of week": "a hét napja", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "definíció", + "delete": "törlés", + "delete _": "", + "delete _ of _": "_ elem törlése _ listából", + "delete a category...": "kategória törlése...", + "delete block _": "", + "delete block definition...": "blokkdefiníció törlése", + "delete slot": "", + "delete this clone": "töröld ezt a másolatot", + "delete variable": "", + "delimiter": "határoló", + "demo (1.2x)": "Demó (1.2x)", + "demo...": "", + "detach all parts": "minden rész szétválasztása", + "detach and put into the hand": "", + "detach from": "leválasztás erről", + "development mode": "fejlesztői mód", + "development mode debugging primitives:": "fejlesztő mód blokkok hibakeresése", + "development mode...": "", + "dimensions": "dimenziók", + "direction": "irány", + "disable deep-Morphic context menus and show user-friendly ones": "A deep-Morphic helyzetérzékeny menük és a felhasználóbarát menük kikapcsolása", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "leválasztva.", + "distance": "távolság", + "distance to _": "", + "distribution": "", + "don't rotate": "nem foroghat", + "down arrow": "lefelé nyíl", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "húzható", + "draggable?": "húzható?", + "dragging threshold": "", + "dropped": "leejtenek", + "duplicate": "megkettőzés", + "duplicate block definition...": "blokk definíció másolása...", + "duration": "hossz", + "e": "e", + "e^": "e^", + "edge": "játéktér széle", + "edit": "szerkesztés", + "edit rotation point only...": "csak a forgáspont szerkesztése...", + "edit the costume's rotation center": "szerkezd a jelmez forgatási középpontját", + "edit...": "szerkesztés...", + "editables": "", + "elegant (90)": "elegáns (90)", + "enable Morphic context menus and inspectors, not user-friendly!": "A Morphic helyzetérzékeny menük, nyomkövetők és a nem felhasználóbarát mód bekapcsolása", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "radír", + "exceeding maximum number of clones": "meghaladta a maximális másolatok számát", + "expecting": "kötelező", + "expecting a": "Számítunk egy", + "expecting a finite number but getting Infinity or NaN": "véges számot várunk helyette végtelen vagy NaN érkezett", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportálás", + "export block definition...": "blokk definíció exportálása...", + "export pen trails line segments as SVG": "toll vonalak exportálása SVG forámumba", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "exportálás...", + "extract": "emeld ki", + "f": "f", + "false": "hamis", + "file": "állomány", + "file menu import hint": "egy exportált projekt, feladatkönyvtár, jelmez vagy hang betöltése", + "fill": "kitöltés", + "fill page...": "", + "filtered for _": "_ szín szűrése", + "find blocks": "blokk keresése", + "find blocks...": "blokkok keresése...", + "find first item _ in _": "keresd ki az első _ elemet ebből _", + "find unused global custom blocks and remove their definitions": "keresd meg a nem használt blokkokat és töröld a definícióikat", + "fisheye": "halszem", + "flag": "zászló", + "flash": "villám", + "flat line ends": "egyszerű vonalvégződés", + "flatten": "laposít", + "flip ↔": "tükrözés ↔", + "flip ↕": "tükrözés ↕", + "floor": "alsó egészrész", + "footprints": "", + "for _ = _ to _ _": "ciklus _ = _ tól _ ig _", + "for all sprites": "minden alakzatra", + "for each _ in _ _": "minden elemre _ ebből _ _", + "for this sprite only": "csak erre az alakzatra", + "forever _": "mindig _", + "frame": "", + "frames": "keretek", + "frequencies": "", + "frequency": "frekvencia", + "front": "előre", + "fullScreen": "teljes képernyő", + "g": "g", + "gears": "fogaskerék", + "get blocks": "", + "get data": "", + "ghost": "átlátszóság", + "giant (8x)": "gigantikus (8x)", + "glide _ secs to x: _ y: _": "csússz _ mp-ig x: _ y: _", + "global?": "globális?", + "globe": "", + "go back _ layers": "kerülj _ szinttel hátrébb", + "go to _": "ugorj _ helyére", + "go to _ layer": "kerülj _", + "go to x: _ y: _": "ugorj x: _ y: _", + "gray scale palette": "", + "green": "zöld", + "grow": "növekedés", + "h": "h", + "handle": "", + "header": "fejléc", + "header mapping...": "fejléc leképezés...", + "height": "magasság", + "hello": "", + "help": "Súgó", + "help...": "Súgó...", + "hide": "tűnj el", + "hide all...": "", + "hide blocks...": "blokkok elrejtése...", + "hide variable _": "rejtsd el: _", + "high": "magas", + "hour": "óra", + "http:// _": "", + "hue": "árnyalat", + "huge (4x)": "óriási (4x)", + "i": "i", + "identical to": "ugyanaz, mint", + "if _ _": "ha _ _", + "if _ _ else _": "ha _ _ különben _", + "if _ then _ else _": "ha _ _ különben _", + "if on edge, bounce": "ha szélén vagy, pattanj vissza", + "import a sound from your computer by dragging it into here": "Hang importálása egy webhelyről vagy a számítógépről", + "import without attempting to parse or format data": "importálj anélkül, hogy megpróbálnádértelmezni vagy formázni az adatot", + "import...": "importálás...", + "in palette": "a palettán", + "including dependencies": "függőségekkel együtt", + "index": "", + "index of _ in _": "index _ itt _", + "inherit _": "örököld _", + "inherited": "örökölt", + "input list:": "Beviteli lista:", + "input names:": "beviteli név:", + "input(s), but getting": "adatbevitel, de ez érkezett", + "inputs": "", + "insert _ at _ of _": "_ beszúrása _ . pozícióba ebbe: _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ ?", + "is _ a _ ?": "_ egy _ ?", + "is _ empty?": "üres _ ?", + "is _ on?": "_ bállítás bekapcsolva?", + "is not a valid option": "nem választható", + "is read-only": "csak olvasható", + "item": "elem", + "item _ of _": "_ eleme a _ listának", + "items": "elemek", + "j": "j", + "join _": "összefűz _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "válogasd ki az ilyen _ elemeket ebből _", + "key": "", + "key _ pressed?": "_ gomb lenyomva?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Magyar", + "language_translator": "Makány György, Faragó Attila", + "large": "nagy", + "last": "utolsó", + "last changed": "utoljára változtatva", + "last_changed": "2022-01-25", + "launch _ _": "induljon _ _", + "left": "bal", + "left arrow": "balra nyíl", + "length": "elemek száma", + "length of _": "_ hossza", + "length:": "hossz:", + "let the World automatically adjust to browser resizing": "", + "letter": "betű", + "letter _ of _": "_ karaktere ennek: _", + "light (70)": "halvány (70)", + "lightness": "", + "line": "újsor", + "lines": "sorok", + "list": "lista", + "list _": "lista _", + "list view...": "lista nézet...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "toll vektorok mentése", + "login": "bejelentkezés", + "loop": "", + "low": "alacsony", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "blokk létrehozása...", + "make a category...": "új kategória...", + "make a copy and pick it up": "másolat felvétele", + "make a morph": "", + "make temporary and hide in the sprite corral": "tedd ideiglenessé és rejtsd el a szereplők közül", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "képezd le _ ebben _ erre a kódre _", + "map _ over _": "képezd le _ erre _", + "map _ to _ _": "képezd le _ erre _ _", + "map _ to code _": "képezd le _ kódra _", + "max": "max", + "maximum": "", + "medium (50)": "közepes (50)", + "menus": "", + "message": "üzenet", + "microphone _": "mikrofon _", + "middle": "közép", + "minimum": "", + "minute": "perc", + "mirror video": "video tükrözése", + "missing / unspecified extension": "Hiányzó vagy nem specifikált kiegészítő", + "monstrous (10x)": "szörnyeteg (10x)", + "month": "hónap", + "mosaic": "mozaik", + "motion": "mozgás", + "mouse down?": "egér lenyomva?", + "mouse position": "", + "mouse x": "egér x", + "mouse y": "egér y", + "mouse-departed": "az egér lemegy rólam", + "mouse-entered": "az egér fölém kerül", + "mouse-pointer": "egérmutató", + "move": "mozgatás", + "move _ steps": "menj _ lépést", + "move all inside...": "", + "move...": "", + "my": "saját", + "my _": "saját _", + "my anchor": "horgonyom", + "my dangling?": "külön forgok?", + "my draggable?": "húzható vagyok?", + "my name": "nevem", + "my parent": "szülőm", + "my rotation style": "forgatási stílusom", + "my rotation x": "forgatás x attribútumom", + "my rotation y": "forgatás y attribútumom", + "my temporary?": "ideiglenes vagyok?", + "myself": "magam", + "n": "n", + "name": "név", + "neg": "", + "negative": "negatív", + "neighbors": "szomszéd", + "neighbors ≠": "", + "new costume _ width _ height _": "új jelmez _ szélesség _ magasság _", + "new line": "új sor", + "new sound _ rate _ Hz": "új hang _ mintavételezéssel _ Hz", + "new...": "új...", + "next": "következő", + "next costume": "a következő jelmez", + "none": "egyik sem", + "normal": "normál", + "normal (1x)": "normál (1x)", + "normalScreen": "normál képernyő", + "normalStage": "normál játéktér", + "not": "nem", + "not _": "nem _", + "note": "hangjegy", + "nothing": "semmi", + "now connected.": "csatlakozva.", + "number": "szám", + "number of channels": "csatornák száma", + "numbers from _ to _": "számok ettől _ eddig _", + "o": "o", + "object _": "objektum _", + "octagon": "nyolcszög", + "only duplicate this block": "csak készítsen egy másolatot erről a blokkról", + "only face left/right": "jobbra-balra fordulhat", + "only grab this block": "csak ezt a blokkot fogd meg", + "open a new window with a picture of both this script and its result": "Új böngészőablak megnyitása a programnak és eredményének képével.", + "open a new window with a picture of this comment": "új ablak megnyitása ennek a megjegyzésnek a képével", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "nyisd meg párbeszédablakban...", + "open shared project from cloud...": "", + "options...": "", + "or": "vagy", + "or before": "vagy előtte", + "other clones": "többi másolat", + "other scripts in sprite": "ennek a szereplőnek minden más feladata", + "other sprites": "más szereplők", + "p": "p", + "paint a new sprite": "új alakzat rajzolása", + "paintbucket": "festékesvödör", + "parameters": "paraméterek", + "parent": "szülő", + "parent...": "szülő...", + "parts": "részek", + "password has been changed.": "a jelszó megváltozott.", + "password must be six characters or longer": "a jelszó legyen legalább hat karakter hosszú.", + "passwords do not match": "A jelszavak nem egyeznek.", + "paste on _": "nyomtasd erre _", + "pause": "szünet", + "pause all _": "várakozz _", + "pen": "toll", + "pen _": "toll _", + "pen down": "tollat le", + "pen down?": "toll lent?", + "pen trails": "ceruza nyomvonala", + "pen up": "tollat fel", + "pen vectors": "toll vektor", + "pic...": "kép exportálása...", + "pick random _ to _": "véletlen _ és _ között", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "pipetta", + "pitch": "", + "pivot": "forgatás", + "pixel": "", + "pixelate": "pixeles", + "pixels": "pixelek", + "play _ Hz for _ secs": "játssz _ Hz _ mp hosszan", + "play frequency _ Hz": "játszt le frekvenciát _ Hz", + "play note _ for _ beats": "játszd le a _ hangot _ ütemig", + "play sound _": "játszd le: _", + "play sound _ at _ Hz": "játszd le _ hangot _ Hz mintavételezéssel", + "play sound _ until done": "játszd le: _ és várd meg", + "please agree to the TOS": "fogadja el a felhasználási feltételeket.", + "please fill out this field": "kérem, töltse ki ezt a mezőt.", + "please provide a valid email address": "kérem, adjon meg egy érvényes email címet.", + "point in direction _": "nézz _ fokos irányba", + "point towards _": "nézz _ irányába", + "pointRight": "háromszög jobbra", + "polygon": "", + "position": "", + "poster": "háttérkép", + "predicate": "kijelentés", + "presentation (1.4x)": "Prezentáció (1.4x)", + "pressed": "gombnyomásra", + "previous": "előző", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "r-g-b-a szín", + "random": "véletlen", + "random position": "véletlenszerű hely", + "rank": "", + "raw data...": "nyers adat...", + "ray length": "távolság a széléig", + "read-only": "csak olvasható", + "receivers...": "fogadók...", + "recording": "", + "rectangle": "téglalap", + "rectangleSolid": "kitöltött téglalap", + "red": "piros", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "újra", + "relabel...": "átcimkézés...", + "release": "engedd el", + "remove block variables...": "blokk változók törlése...", + "rename": "átnevezés", + "rename all blocks that access this variable": "minden blokk átnevezése amely ezt a változót használja", + "rename all...": "mindegyik átnevezése...", + "rename background": "háttér átnevezése", + "rename costume": "jelmez átnevezése", + "rename only this reporter": "nevezd át csak ezt a függvényt", + "rename sound": "A hang átnevezése", + "rename...": "átnevezés...", + "repeat _ _": "ismételd _ -szer _", + "repeat until _ _": "ismételd amíg _ _", + "replace item _ of _ with _": "_ helyettesítése _ listában erre: _", + "report _": "jelents _", + "reporter": "függvényblokk", + "reporter didn't report": "a függvény érték nélkül tért vissza", + "reset columns": "oszlopok visszaállítása", + "reset timer": "nullázd az órát", + "reshape _ to _": "formáld át _ így _", + "resize...": "", + "resolution": "felbontás", + "rest for _ beats": "szünetelj _ ütemet", + "restore display": "", + "result pic...": "kép...", + "reverse": "visszafelé", + "right": "jobb", + "right arrow": "jobbra nyíl", + "ring": "gyűrű", + "ringify": "körülfog", + "robot": "", + "rotate": "forgatás", + "rotation style": "forgási stílus", + "rotation x": "forgatás x", + "rotation y": "forgatás y", + "round _": "_ kerekítve", + "run _ _": "futtasd _ _ értékkel", + "run _ w/continuation": "futtasd _ folytatással", + "s": "s", + "sample morphs": "", + "sample rate": "mintavétel", + "samples": "hangminta", + "saturation": "színtelítettség", + "save _ as costume named _": "", + "save a picture of all scripts": "mentsd el minden program képét", + "save a picture of both this script and its result": "mentsd le a képét ennek a programnak az eredményével együtt", + "save a picture of the stage": "mentsd el a játéktér képét", + "save a picture of this comment": "kép erről a megjegyzésről", + "save a picture of this script": "mentsd le a képét ennek a programnak", + "save a summary of this project": "mentsd el a projekt összefoglalóját", + "save global custom block definitions as XML": "mentsd el a saját blokkokat XML formátumban", + "save project data as XML to your downloads folder": "mentsd le a projektet XML formátumban a letöltés mappába", + "saved.": "mentve.", + "say _": "mondd _", + "say _ for _ secs": "mondd _ _ mp-ig", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "a program képe az eredménnyel...", + "script pic...": "program képe...", + "script variables _": "feladatváltozó: _", + "scripts": "programok", + "scripts pic...": "minden feladat képpé...", + "scroll frame": "", + "scrolled-down": "lefelé görgetnek", + "scrolled-up": "felfelé görgetnek", + "second": "másodperc", + "select": "választás", + "selection": "", + "self": "saját", + "send _ to _": "küldd _ a szereplőnek _", + "senders...": "küldők...", + "sensor demo": "", + "set _ effect to _": "_ hatás legyen _", + "set _ of block _ to _": "", + "set _ to _": "legyen _ beállítás _", + "set background _ to _": "háttér _ legyen a _", + "set background color to _": "hátteret állítsd _", + "set balance to _": "hangmérleg legyen _", + "set instrument to _": "hangeszközt állítsd: _", + "set pen _ to _": "toll _ legyen a _", + "set pen color to _": "tollszín legyen _", + "set pen shade to _": "", + "set pen size to _": "tollméret legyen _", + "set size to _ %": "a méret legyen _ %", + "set tempo to _ bpm": "a tempó legyen _ ütem/perc", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "legyen video átlátszósága _", + "set volume to _ %": "hangerő legyen _ %", + "set x to _": "x legyen _", + "set y to _": "y legyen _", + "setting the rotation center requires a costume": "a forgáspont beállításához szükség van egy jelmezre", + "settings menu prefer empty slots hint": "bekapcsolva az üres helyre ejti először a behúzott blokkot", + "several block definitions already match this label": "", + "shared.": "megosztva.", + "sharing project...": "a projekt megosztása...", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "csillámló (80)", + "show": "jelenj meg", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "minden feladat és blokk definícióról készült kép mutatása", + "show all": "mindent mutat", + "show all...": "", + "show project data as XML in a new browser window": "a projekt adatainak megtekintése egy új böngészőablakban", + "show table _": "", + "show the World's menu": "", + "show variable _": "írd ki: _", + "shown?": "látható?", + "shrink": "kicsinyítés", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "méret", + "slider": "csúszka", + "slider max...": "a csúszka maximuma...", + "slider min...": "a csúszka minimuma...", + "slots": "", + "smallStage": "kis játéktér", + "smaller menu fonts and sliders": "", + "snap": "pillanatfelvétel", + "sorted": "", + "sound": "", + "sounds": "hangok", + "space": "szóköz", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "frekvenciaspektrum", + "speech bubble": "", + "speechBubble": "buborék", + "speechBubbleOutline": "a buborék körvonala", + "split _ by _": "_ szétvágása _ jeleknél", + "sprite": "szereplő", + "sprites": "", + "sqrt": "négyzetgyök", + "square": "négyzet", + "stack size": "veremméret", + "stage": "játéktér", + "stage image": "", + "stamp": "készíts lenyomatot", + "standard settings": "", + "stay signed in on this computer until logging out": "maradjon bejelentkezve, amíg ki nem jelentkezem a számítógépről", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "tapadjon", + "stop _": "_ álljon le", + "stop all sounds": "minden hangot állíts le", + "stop frequency": "állítsd le a frekvenciát", + "stopped": "megállítottak", + "storage": "tárolás", + "store this project in the downloads folder (in supporting browsers)": "a projekt tárolása a letöltési mappába (ha a böngésző engedi)", + "stretch _ x: _ y: _ %": "nyújtsd _ x: _ y: _ %", + "string": "", + "subtle (95)": "kifinomult (95)", + "sum": "", + "svg...": "", + "switch to costume _": "a jelmez legyen _", + "switch to scene _ _": "válts jelenetet _ _", + "t": "t", + "tab": "tabulátor", + "table view...": "tábla nézet...", + "take a camera snapshot and import it as a new sprite": "készíts fotót a webkamerával és importáld új szereplőként", + "tan": "tan", + "tell _ to _ _": "hajtsd végre _ _ _", + "tempo": "tempó", + "temporary?": "ideiglenes?", + "text": "szöveg", + "text-only (100)": "csak szöveg (100)", + "the predicate takes too long for a custom hat block": "az előzmény túl hosszú ideig fut egy egyedi kalap blokkhoz", + "there are currently no unused global custom blocks in this project": "nem találtam nem használt saját blokkot a projektben", + "there are currently no vectorizable pen trail segments": "jelenleg nincs vektoros toll vonal", + "thing": "dolog", + "think _": "gondold _", + "think _ for _ secs": "gondold _ _ mp-ig", + "this _": "", + "this block": "ez a blokk", + "this project doesn't have any custom global blocks yet": "ennek a projektnek még nincs globális felhasználói blokkjai", + "this script": "ez a feladat", + "time in milliseconds": "idő (ezredmásodpercben)", + "timer": "stopper", + "tip": "tipp", + "to": "", + "top": "teteje", + "touch screen settings": "", + "touching _ ?": "érint _ színt?", + "transient": "átmeneti", + "translations": "", + "translations...": "fordítások...", + "translator_e-mail": "makany.gyorgy@gmail.com, attila.farago@sap.com", + "transparency": "áttetszőség", + "transparency...": "", + "trash is empty": "üres a kuka", + "true": "igaz", + "turbo mode": "turbo mód", + "turbo mode?": "", + "turn _ _ degrees": "fordulj _ _ fokot", + "turn all pen trails and stamps into a new background for the stage": "játéktér háttérképévé változtasd az összes tollvonás és békyegzőt", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "minden tollbeállítás átállítása és átvitele az aktuális alak egy új jelmezébe", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "a toll beállításainak alkalmazása egy új jelmezre...", + "turnBack": "", + "turnForward": "", + "turnLeft": "fordulj balra", + "turnRight": "fordulj jobbra", + "turtle": "teknős", + "turtleOutline": "a teknős körvonala", + "type": "", + "type of _": "típus: _", + "u": "u", + "unable to convert to": "nem tudom konvertálni", + "unable to inherit (disabled or circular?)": "nem örökölhető (inaktív vagy körkörös hivatkozás?)", + "unable to nest (disabled or circular?)": "nem lehet beágyazni (inaktív vagy körkörös hivatkozás?)", + "uncheck for default GUI design": "kikapcsolva a normál grafikus felületet látod", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "kikapcsolva alacsonyabb felbontást mutat és kíméli az erőforrásokat", + "uncheck for round ends of lines": "kapcsolja ki a lekerekített vonalvégződésekhez", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "kikapcsolva engedélyezed, hogy a behúzott blokk kirúgjon más blokkokat", + "uncheck to allow script reentrance": "kikapcsolva engedélyezi a programok többszörös végrehajtását", + "uncheck to always show (+) symbols in block prototype labels": "üresen hagyva mindig látszik a (+) jel a blokk prototípus cimkéjében", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "kikapcsolva letiltja az IDE animációit", + "uncheck to disable alternating colors for nested block": "tiltja a beágyazott blokkok eltérő színezését", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "üresen hagyva tiltja a többszörös beviteli mezők dinamikus feliratait", + "uncheck to disable input sliders for entry fields": "kikapcsolva letiltja a csúszkákat a beviteli mezőknél", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "kapcsolja ki a szereplők összefűzésének megakadályozásához.", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "kikapcsolva a natív JavaScript függvények nem elérhetőek", + "uncheck to disable using operators on lists and tables": "kapcsold ki, hogy letiltsd a műveleteket listákon és táblázatokon", + "uncheck to disinherit": "kikapcsolva nem öröklődik tovább", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "kikapcsolva a blokkon kattintva a hozzá tartozó kód futtatása", + "uncheck to hide buttons in the palette": "kikapcsolva elrejti a gombokat a palettáról", + "uncheck to hide category names in the palette": "kikacsolva elrejti a kategóriák neveit a palettáról", + "uncheck to hide extension primitives in the palette": "kikapcsolva a kiegészítő blokkokat elrejti a palettáról", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "kikapcsolva normál sebességen futnak a programok", + "uncheck to save contents in the project": "kikapcsolva elmenti a változó értékét a projekttel", + "uncheck to show only the selected category's blocks": "kikapcsolva csak a kiválasztott kategóriához tartozó blokkokat mutatja", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "kikapcsolva a toll színekhez és a grafikai hatásokhoz a HSV színmodellt használja", + "uncheck to turn block clicking sound off": "kikapcsolva letiltja a blokkra kattintás hangját", + "uncheck to turn off logging pen vectors": "kapcsold ki, hogy a toll vektorok mentését leáálítsd", + "uncheck to turn off visible stepping": "kikapcsolva nem látod már lassítva láthatod a program lépéseit", + "uncheck to use solid drop shadows and highlights": "vedd ki a jelölést, ha éles árnyékokat és kiemeléseket kíván használni", + "uncheck to use the input dialog in short form": "kapcsolja ki, ha rövidített párbeszédablakot akar használni", + "uncompile": "fordítás visszavonása", + "undo": "visszavon", + "undo the last block drop in this pane": "az utolsó blokk visszavétele erről a lapról", + "undrop": "visszavétel", + "unicode _ as letter": "unicode _ betűként", + "unicode of _": "_ Unicode-ra alakítva", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "körülfogás megszüntetése", + "unshared.": "nincs megosztva.", + "unsharing project...": "a projekt megosztásának megszüntetése...", + "unsupported attribute": "nem támogatott tulajdonság", + "unsupported data type": "nem támogatott adattípus", + "unsupported graphic effect": "nem támogatott grafikai hatás", + "untitled": "névtelen", + "unused": "nem használt", + "unused block(s) removed": "nem használt blokkok törölve", + "up arrow": "felfelé nyíl", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "a billenytűzet segítségével hozz létre blokkokat", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "érték", + "variable": "", + "variables": "változók", + "video _ on _": "video _ ezen _", + "video capture": "video felvétel", + "volume": "hangerő", + "w": "w", + "wait _ secs": "várj _ mp-et", + "wait until _": "várj amíg _", + "wardrobe": "", + "warp _": "gyorsítva _", + "what's your name?": "Mi a neved?", + "when I am _": "amikor _", + "when I receive _ _": "_ üzenet érkezésekor _", + "when I start as a clone": "másolatként indítva", + "when _": "amikor _", + "when _ clicked": "_ -ra kattintáskor", + "when _ is edited _": "", + "when _ key pressed _": "_ lenyomásakor _", + "whirl": "örvény", + "whitespace": "szóköz", + "width": "szélesség", + "with data": "", + "with inputs": "bevitelekkel", + "word": "szó", + "world": "világ", + "write _ size _": "írd _ mérettel _", + "x": "x", + "x position": "x hely", + "y": "y", + "y position": "y hely", + "year": "év", + "year:": "év:", + "your own": "saját", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-hy.js b/elements/pl-snap/Snap/locale/lang-hy.js new file mode 100644 index 00000000..24ada932 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-hy.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.hy = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) ձախ", + "(0) up": "(0) վեր", + "(1) sine": "", + "(180) down": "(180) վար", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) աջ", + "(empty)": "(դատարկ)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snap-ի մասին", + "About...": "Snap! -ի մասին ...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Շարժապատկերներ", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Կամայական (չգնահատված)", + "Any type": "Ցանկացած տիպի", + "Apply": "Կիրառել", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Վստա՞հ եք, որ ուզում եք ջնջել", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Հետ...", + "Backgrounds": "Ետնապատկեր", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Մասնիկների խմբագիր", + "Blocks": "Մասնիկներ", + "Blocks category name:": "", + "Blurred shadows": "Մշուշված ստվեր", + "Boolean": "Բուլյան", + "Boolean (T/F)": "Բուլյան (Ճ/Ս)", + "Boolean (unevaluated)": "Բուլյան (չգնահատված)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Չեղարկել", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Փոխել մասնիկը", + "Clear backup": "", + "Clicking sound": "Կտտոցի ձայնը", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Հրաման", + "Command (C-shape)": "Հրաման (C-տեսքի)", + "Command (inline)": "Հրաման (մեկ տողով)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "Բովանդակություն", + "Contributors": "Աջակվողներ", + "Control": "Կառավարում", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "զգեստի խմբագիր", + "Costumes": "Զգեստներ", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Ստեղծել մուտքի անուն", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Երախտիք...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Գործարանային", + "Default Value:": "Գործարանային արժեքը:", + "Delete": "Ջնջել", + "Delete Custom Block": "Ջնջել նորաստեղծ մասնիկը", + "Delete Project": "Ջնջել նախագիծը", + "Delete a variable": "Ջնջել փոփոխականը", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Ներբեռնել աղբյուրը", + "Dragging threshold...": "", + "Dynamic input labels": "Մուտքերի փոփոխվող պիտակներ", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Խմբագրել մուտքի անունը", + "Edit label fragment": "Խմբագրել պիտակի մի մասը", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Դատարկ", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Արտահանել մասնիկները", + "Export blocks...": "Արտահանել մասնիկները...", + "Export project as plain text...": "Արտահանել նախագիծը տեքստի տեսքով...", + "Export project...": "Արտահանել նախագիծը...", + "Export summary with drop-shadows...": "", + "Export summary...": "Արտահանել ամփոփագիրը...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Հարթ ձևավորում", + "Flat line ends": "Գծերի հարթ ծայրեր", + "For all Sprites": "Բոլոր կերպարների համար", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Բարև", + "Hello, World!": "", + "Help": "Օգնություն", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Հմմ...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Ներմուշել մասնիկներ", + "Import library": "Ներառել գրադարան", + "Import sound": "", + "Import tools": "Ներմուծել գործիքներ", + "Import...": "Ներմուծել...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Ժառանգության աջակցություն", + "Input Names:": "Մուտքերի անունները:", + "Input Slot Options": "", + "Input name": "Մուտքանուն", + "Input sliders": "Մուտքի սահուն կոճակներ", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Ստեղնաշարի խմբագրում", + "Kind of": "Տեսակը", + "LEAP Motion controller": "", + "Language...": "Լեզու...", + "Libraries...": "Գրադարաններ...", + "License": "Հավաստագիր", + "License...": "Արտոնագիր...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Ցուցակ", + "List utilities": "", + "Lists": "Ցուցակ", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Մուտք...", + "Logout": "", + "Long form input dialog": "Մուտքի երկխոսության երկար ձևաչափ", + "Looks": "Տեսք", + "Make a block": "ստեղծել նոր մասնիկ", + "Make a variable": "Ստեղծել փոփոխական", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "հաղորդագրության անունը", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Մոդուլներ...", + "Motion": "Շարժ", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Բազմակի մուտքեր (արժեքը մուտքերի ցանկն է)", + "Nested auto-wrapping": "Ներկառուցված ինքնաձևավորում", + "New": "Նոր", + "New Category": "", + "New Project": "Նոր Նախագիծ", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Ոչ", + "November": "", + "Number": "Թիվ", + "OK": "ԼԱՎ", + "Object": "Առարկա", + "October": "", + "Ok": "Լավ", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Բացել նախագիծը", + "Open in Community Site": "", + "Open...": "Բացել...", + "Opening project...": "", + "Operators": "Հաշվարկ", + "Other": "Այլ", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "Մասը", + "Parts": "Մասերը", + "Password:": "", + "Pen": "Գրիչ", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Հարթ նախատիպի պիտակներ", + "Play": "Արտաբերել", + "Play sound": "արտաբերել ձայնը", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Տրամաբանական", + "Prefer empty slot drops": "Նախընտրել դատարկ դաշտերը (slot drops)", + "Prefer smooth animations": "Նախընտրել սահուն շարժապատկերներ", + "Privacy...": "", + "Project Notes": "Նախագշի նշումները", + "Project URLs": "", + "Project notes...": "Նախագծի նշումները...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Հրահանգների ձեռնարկ", + "Remove a category...": "", + "Remove unused blocks": "Հեռացնել չօգտագործված մասնիկները", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Փոխարինե՞լ ընթացիկ նախագիծը նորով", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Զեկուցող", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Պահել", + "Save As...": "Պահել որպես...", + "Save Project": "", + "Save Project As...": "Պահել նախագիծը որպես...", + "Save to disk": "Պահել սկավառակի վրա", + "Saved!": "Պահված!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Ծրագրային փոփոխականի անունը", + "Scripts": "Սցենար", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Ընկալում", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Գրանցվել...", + "Single input.": "Եզակի մուտք։", + "Single palette": "", + "Slider maximum value": "Սողնակի առավելագույն արժեքը", + "Slider minimum value": "Սողնակի նվազագույն արժեքը", + "Snap! website": "Snap! -ի վեբկայքը", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Ձայն", + "Sound Recorder": "", + "Sounds": "Ձայն", + "Sprite": "Կերպար", + "Sprite Nesting": "", + "Stage": "Բեմ", + "Stage height": "Բեմի բարձրությունը", + "Stage selected: no motion primitives": "Բեմն ընտրված է: շարժման ստանդարտ մասնիկներ չկան", + "Stage size": "Տեսարանի չափը", + "Stage size...": "Բեմի չափսը...", + "Stage width": "Բեմի լայնությունը", + "Stop": "Դադար", + "Stop sound": "Դադարեցնել ձայնը", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Անցնել օգտագործման ռեժիմին", + "Switch to dev mode": "Անցնել մշակման ռեժիմին", + "Switch to vector editor?": "", + "Table lines": "Աղյուսակի տողեր", + "Table support": "Աղյուսակների օժանդակում", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "Եռակի երկուական դատարկ դաշտեր", + "Text": "Տեքստ", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "", + "Title text": "Վերնագրել տեքստը", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Թարգմանություններ", + "Translators...": "Թարգմանիչներ", + "Turbo mode": "Տուրբո ռեժիմ", + "Turtle": "Կրիայ", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Անանուն", + "Unused blocks...": "Չօգտագործված մասնիկներ...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - ներքին փոփոխականը տեսանելի դարձնել կանչի համար", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Փոփոխականի անունը", + "Variables": "Փոփոխական", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Վերացական ստեղնաշար", + "Visible stepping": "Տեսանելի քայլ", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Այո", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Զեբրա գունավորում", + "Zoom blocks": "Մեծացնել մասնիկները", + "Zoom blocks...": "Մեծացնել մասնիկները...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ -ը պարունակում է _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ -ը _ -ի առջևում", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ մնացորդ _", + "_ of _": "_ _ -ից", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "_ տողիի _", + "_ to _": "_ մինչև _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "բացարձակ արժեք", + "acos": "acos", + "add _ to _": "ավելացնել _ -ը _ -ին", + "add a new Turtle sprite": "", + "add a new sprite": "Ավելացնել նոր կերպար", + "add comment": "ավելացնել մեկնաբանություն", + "add comment here...": "ավելացնել մեկնաբանություն", + "agent": "", + "alert _": "", + "all": "ամենը", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "բոլորը, բացի _ -ի առաջինից", + "all but this script": "ամենը, բացի այս սցենարից", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "խարիսխ", + "and": "և", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "պատասխան", + "any": "որևէ", + "any key": "կամայական կոճակ", + "any message": "ցանկացած հաղորդագրություն", + "anything": "", + "append _": "", + "arrange scripts vertically": "դասավորել սցենարներըուղղահայաց տեսքով", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "հարցնել _ -ը և սպասել", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "մեծ (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Մասնիկների ջնջման երկխոսության տեքստ", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "մասնիկները", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "պայծառություն", + "broadcast _ _": "հաղորդել _ _", + "broadcast _ _ and wait": "հաղորդել _ _ և սպասել", + "brush": "", + "build": "կառուցել", + "but getting a": "", + "c": "c", + "call _ _": "կանչել _ -ը _ -ից", + "call _ w/continuation": "կանչել _ -ը w/շարունակությամբ", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "Կարողանալ պտտվել", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "առավելագույնը", + "center": "", + "center x": "x կենտրոն", + "center y": "y կենտրոն", + "change _ by _": "փոխել _ -ը _ -ով", + "change _ effect by _": "փոխել _ էֆեկտը _ -ով", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "թոխել գրիչի _ _ -ով", + "change pen color by _": "", + "change pen shade by _": "փոխել գրչի ստվերը _ -ով", + "change pen size by _": "գրչի չափը փոխել _ -ով", + "change size by _": "փոխել չափսը _ -ով", + "change tempo by _": "փոխել տեմպը _ -ով", + "change volume by _": "", + "change x by _": "փոխել x -ը _ -ով", + "change y by _": "փոխել y -ը _ -ով", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "Նշել, գծերի հարթ ծայրեր ունենալու համար", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "նշել, համակարգիչների մեջ սահուն, կանխատեսելի շարժապատկերներ ունենալու համար", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "նշել, դատարկ դաշտի տեսակը մուտքի երկխոսությունում մշտապես ցույց տալու համար", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "նշել, ծրագրի վերադարձն արգելելու համար", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "նշել, միջավայրում շարժապատկերները թուլատրելու համար", + "check to enable alternating colors for nested blocks": "նշել, ներառված մասնիկները այլ գույնով տեսնելու համար", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "նշել, փոփոխական գործառույթներով մուտքերի փոփոխվող պիտակները գործարկելու համար", + "check to enable input sliders for entry fields": "նշել, մուտքային դաշտերում սահուն կոճակները ակտիվացնելու համար", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "նշել, շարժական սարքերում վերացական ստեղնաշարը ակտիվացնելու համար", + "check to hide (+) symbols in block prototype labels": "նշել, (+) նշանը մասնիկի նախատիպի պիտակում թաքցնելու համար", + "check to inherit from": "", + "check to prevent contents from being saved": "նշել, բովանդակության պահպանումն արգելելու համար", + "check to prioritize script execution": "նշել, սցենարի կատարումը նախապատվություններով իրականացնելու համար", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "նշել, մասնիկի կտտոցի ձայնը միացնելու համար", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "նշել, մշուշված ստվերներ ու ընդգծումներ տեսնելու համար", + "children": "զավակներ", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "մաքրել", + "clear": "մաքրել", + "clear graphic effects": "մաքրել գրաֆիկական էֆեկտները", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "սեղմել կամ քաշել խաչմերուկը պտտման կենտրոն տեղափոխելու համար", + "clicked": "սեղմված է", + "clone": "", + "clones": "կրկնօրինակներ", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "գույն", + "color _ is touching _ ?": "_ գույնը հպվո՞ւմ է _ -ին", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "զվարճալի", + "command": "հրահանգ", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "պուտավոր", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "զգեստ #", + "costume name": "", + "costumes": "", + "costumes tab help": "Զգեստների էջի օգնություն/nՆերմուծել համացանցից, կամ ձեր համակարգչից/n", + "could not connect to:": "", + "cr": "տողադարձ (cr)", + "create a clone of _": "ստեղծել _ -ի կրկնօրինակը", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "մոդուլի ներկա տարբերակները", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "կախվե՞լ է", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "ջնջել", + "delete _": "", + "delete _ of _": "ջնջել _ -ը _ -ում", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "ջնջել մասնիկի սահմանումը", + "delete slot": "", + "delete this clone": "ջնջել այս կրկնօրինակը", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "ցուցադրական (1.2x)", + "demo...": "", + "detach all parts": "անջատել բոլոր մասերը", + "detach and put into the hand": "", + "detach from": "անջատել", + "development mode": "Մշակման ռեժիմ", + "development mode debugging primitives:": "", + "development mode...": "", + "dimensions": "", + "direction": "ուղղություն", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "", + "distribution": "", + "don't rotate": "չպտտել", + "down arrow": "սլաք վար", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "քաշվող", + "draggable?": "", + "dragging threshold": "", + "dropped": "գցված է", + "duplicate": "կրկնօրինակել", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "եզր", + "edit": "խմբագրել", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "խմբագրել", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "արտահանել", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "արտահանել...", + "extract": "", + "f": "f", + "false": "սխալ", + "file": "", + "file menu import hint": "Նիշքի ընտրացանկի ներմուծման ակնարկ", + "fill": "լցնել", + "fill page...": "", + "filtered for _": "զտված է _ -ի համար", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "գտնել չօգտագործվող մասնիկները և հեռացնել դրանց սահմանումները", + "fisheye": "ձկան աչք", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "նվազագույնը", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "բոլոր կերպարների համար", + "for each _ in _ _": "", + "for this sprite only": "միայն այս կերպարի համար", + "forever _": "անվերջ _", + "frame": "", + "frames": "շրջանակներ", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "ուրվական", + "giant (8x)": "հսկա (8x)", + "glide _ secs to x: _ y: _": "սահել _ վայրկյան դեպի x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "վերադառնալ _ շերտ", + "go to _": "գնալ դեպի _", + "go to _ layer": "գնալ _ շերտ", + "go to x: _ y: _": "գնալ դեպի x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "բարև", + "help": "օգնություն", + "help...": "օգնություն...", + "hide": "թաքցնել", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "թաքցնել պարզունակները (primitives)", + "hide variable _": "թաքցնել _ փոփոխականը", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "խոշոր (4x)", + "i": "i", + "identical to": "-ը նույնակա՞ն է -ի հետ", + "if _ _": "եթե _ _", + "if _ _ else _": "եթե _ _ այլապես _", + "if _ then _ else _": "", + "if on edge, bounce": "եթե եզրին է, հրվել", + "import a sound from your computer by dragging it into here": "Ներմուծե՛ք ձայնը ձեր համակարգչից քաշելով այն այստեղ", + "import without attempting to parse or format data": "", + "import...": "ներմուծել...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "մուտքերի ցուցակ:", + "input names:": "մուտքերի անունները:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "հավելել _ -ը _ դիրքում _ -ում", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "", + "is _ a _ ?": "արդյո՞ք _ -ը _ է", + "is _ empty?": "", + "is _ identical to _ ?": "_ -ը նույնակա՞ն է _ -ի հետ", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ տարրը _ -ում", + "items": "տարրերը", + "j": "j", + "join _": "միավորել _ -ը", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ ստեղնը սեղմվա՞ծ է", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Հայերեն", + "language_translator": "Symotec LLC and Armath team", + "large": "մեծ", + "last": "վերջին", + "last changed": "", + "last_changed": "2023-04-12", + "launch _ _": "բացել _ -ը _ -ից", + "left": "", + "left arrow": "սլաք ձախ", + "length": "", + "length of _": "", + "length:": "երկարություն՝", + "let the World automatically adjust to browser resizing": "", + "letter": "տառ", + "letter _ of _": "_ -ի _ -րդ տառը", + "light (70)": "", + "lightness": "", + "line": "գիծ", + "lines": "", + "list": "ցուցակ", + "list _": "ցուցակ _", + "list view...": "ցուցակային դիտում...", + "ln": "ln", + "load the official library of powerful blocks": "բեռնել հզոր մասնիկների պաշտոնական գրադարանը", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "ստեղծել մասնիկ...", + "make a category...": "", + "make a copy and pick it up": "ստեղծել կրկնօրինակն ու վերցնել այն", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "հաղորդագրություն", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "վիթխարի (10x)", + "month": "", + "mosaic": "մանրապատկեր", + "motion": "", + "mouse down?": "մկնիկը սեղմվա՞ծ է", + "mouse position": "", + "mouse x": "մկնիկի x -ը", + "mouse y": "մկնիկի y -ը", + "mouse-departed": "մկնիկը բաց է թողնված", + "mouse-entered": "մկնիկը սեղմված է", + "mouse-pointer": "մկնիկի ցուցիչը", + "move": "տեղափոխել", + "move _ steps": "տեղափոխվել _ քայլ", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "իմ _ -ը", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "ինքս", + "n": "n", + "name": "անուն", + "neg": "", + "negative": "բացասական", + "neighbors": "հարևանները", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "նոր տող", + "new sound _ rate _ Hz": "", + "new...": "նոր...", + "next": "", + "next costume": "հաջորդ զգեստը", + "none": "ոչ մի", + "normal": "նորմալ", + "normal (1x)": "նորմալ (1x)", + "normalScreen": "", + "normalStage": "", + "not": "ոչ", + "not _": "ոչ _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "թիվ", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "միայն կրկնօրինակել այս մասնիկը", + "only face left/right": "միայն դեմքը՝ աջ-ձախ", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "բածել զննարկիչի նոր պատուհան այս նախագծի ամփոփումով", + "open a new window with a picture of all scripts": "բացել նոր պատուհան բոլոր սեցնարների պատկերով", + "open a new window with a picture of the stage": "բացել նոր պատուհան բեմի պատկերով", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "բացել նոր պատուհան այս սցենարի պատկերով", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "բացել երկխոսությունում", + "open shared project from cloud...": "", + "options...": "", + "or": "կամ", + "or before": "", + "other clones": "այլ կրկնօրինակներ", + "other scripts in sprite": "կերպարի այլ սցենարները", + "other sprites": "այլ կերպարներ", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "ծնող", + "parent...": "", + "parts": "մասերը", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "դադարեցնել ամենը _", + "pen": "", + "pen _": "", + "pen down": "գրիչն իջեցնել", + "pen down?": "գրիչը ցած?", + "pen trails": "գրչի ակոսներ", + "pen up": "գրիչը բարձրացնել", + "pen vectors": "", + "pic...": "վերցնել...", + "pick random _ to _": "պատահական թիվ՝ _ -ից _ -ը", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "պիքսելների խոշորացում", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "նվագել _ նոտան _ տակտ", + "play sound _": "արտաբերել _ ձայնը", + "play sound _ at _ Hz": "", + "play sound _ until done": "արտաբերել _ ձայնը մինչև ավարտը", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "շրջվել _ ուղղությամբ", + "point towards _": "շրջվել դեպի _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "կանխել", + "presentation (1.4x)": "ներկայացման համար (1.4x)", + "pressed": "սեղմված է", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "կրկին քաշել այստեղ", + "relabel...": "վերանշել...", + "release": "", + "remove block variables...": "", + "rename": "վերանվանել", + "rename all blocks that access this variable": "վերանվանել այն բոլոր մասնիկները որոնք ունեն հասանելիություն այս փոփոխականին", + "rename all...": "վերանվանել բոլորը...", + "rename background": "", + "rename costume": "վերանվանել զգեստը", + "rename only this reporter": "վերանվանել միայն այս զեկուցողին", + "rename sound": "վերանվանել ձայնը", + "rename...": "վերանվանել...", + "repeat _ _": "կրկնել _ _", + "repeat until _ _": "կրկնել մինչև _ _", + "replace item _ of _ with _": "փոխարինել թիվ _ տարրը _ -ում _ -ով", + "report _": "զեկուցել _", + "reporter": "զեկուցող", + "reporter didn't report": "", + "reset columns": "վերարկել սյուները", + "reset timer": "զրոյացնել վարկյանաչափը", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "սպասել _ տակտ", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "սլաք աջ", + "ring": "", + "ringify": "օղակավորել", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "x պտույտ", + "rotation y": "y պտույտ", + "round _": "կլորացնել _ -ը", + "run _ _": "գործարկել _ -ը _ -ից", + "run _ w/continuation": "գործարկել _ -ը w/շարունակությամբ", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "հագեցածություն", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "ասել _", + "say _ for _ secs": "ասել _ _ վայրկյան", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "սցենարի պատկերը...", + "script variables _": "ծրագրային փոփոխականներ _", + "scripts": "", + "scripts pic...": "սցենարի պատկերը...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "ընտրել", + "selection": "", + "self": "սեփական", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "կիրառել _ էֆեկտը _ արժեքով", + "set _ of block _ to _": "", + "set _ to _": "_ -ին տալ _ արժեքը", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "գրիչի _ _", + "set pen color to _": "գրչի գույնը՝ _", + "set pen shade to _": "գրչի ստվերը՝ _", + "set pen size to _": "գրչի չափսը՝ _", + "set size to _ %": "չափսը՝ _ %", + "set tempo to _ bpm": "տեմպը՝ _ զարկ/րոպե", + "set this morph's alpha value": "", + "set turbo mode to _": "տուրբո ռեժիմը՝ _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "x -ը՝ _", + "set y to _": "y -ը՝ _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "կարգավորումների մենյուն նախընտրել դատարկ տեղերում", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "ցույց տալ", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "ցուցադրել բոլորը", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Ցույց տալ բոլոր նոր մասնիկների սահմանումները XML ձևաչափով զննարկիչի նոր պատուհանում", + "show primitives": "ցուցադրել պարզունակները (primitives)", + "show project data as XML in a new browser window": "Ցույց տալ նախագծի տվյալները XML ձևաչափով զննարկիչի նոր պատուհանում", + "show table _": "", + "show the World's menu": "", + "show variable _": "ցույց տալ _ փոփոխականը", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "չափս", + "slider": "սահուն կոճակ", + "slider max...": "սողնակի առավելագույնը...", + "slider min...": "սողնակի նվազագույնը...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "բացատ", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "բաժանել _ -ը ըստ _ -ի", + "sprite": "կերպար", + "sprites": "", + "sqrt": "քառակուսի արմատ", + "square": "", + "stack size": "ստեկի չափը", + "stage": "բեմ", + "stage image": "", + "stamp": "կնիք", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "դադարեցնել _", + "stop all sounds": "դադարեցնել բոլոր ձայները", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "պահել նախագիծը «ներբռնումներ» թղթապանակում (աջակցվող զննարկիչներում)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "զգեստը՝ _", + "switch to scene _ _": "", + "t": "t", + "tab": "ներդիր", + "table view...": "աղյուսակային դիտում...", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "տեմպ", + "temporary?": "", + "text": "տեքստ", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "այս պահին նախագծում չի գտնվել նոր մասնիկներ", + "there are currently no vectorizable pen trail segments": "", + "thing": "կերպար", + "think _": "մտածել _", + "think _ for _ secs": "մտածել _ _ վայրկյան", + "this _": "", + "this block": "այս մասնիկը", + "this project doesn't have any custom global blocks yet": "այս նախագծում դեռ առկա չէ նոր ստեղծված մասնիկներ", + "this script": "այս սցենարը", + "time in milliseconds": "", + "timer": "վարկյանաչափ", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "հպվո՞ւմ է _ գույնին", + "transient": "անցումային", + "translations": "", + "translations...": "", + "translator_e-mail": "info@symotec.am and info@armath.am", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "ճիշտ", + "turbo mode": "", + "turbo mode?": "տուրբո ռեժիմը միացվա՞ծ է", + "turn _ _ degrees": "շրջվել _ _ աստիճան", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ -ի տիպը", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "հանել նշումը, փոփոխականների մշակման ավելի բարձր արագություն (frame rates) ունենալու համար", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "հանել նշումը, գծերի կլոր ծայրեր ունենալու համար", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "հանել, զեկուցողներին թույլ տալու դուրս մղել մյուսներին", + "uncheck to allow script reentrance": "հանել նշումը, ծրագրի վերադարձը թուլատրելու համար", + "uncheck to always show (+) symbols in block prototype labels": "հանել, (+) նշանը մասնիկի նախատիպի պիտակում մշտապես ցույց տալու համար", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "հանել նշումը, միջավայրում շարժապատկերները արգելելու համար", + "uncheck to disable alternating colors for nested block": "հանել, նշումը ներառված մասնիկները նույն գույնով տեսնելու համար", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "հանել, նշումը տարատեսակ մուտքերի փոփոխվող պիտակների համար", + "uncheck to disable input sliders for entry fields": "հանել նշումը, մուտքային դաշտերում սահուն կոճակները ապաակտիվացնելու համար", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "հանել նշումը, շարժական սարքերում վերացական ստեղնաշարը ապաակտիվացնելու համար", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "հանել, նշումը ծրագիրը նորմալ արագությամբ կատարելու համար", + "uncheck to save contents in the project": "հանել նշումը, նախագծի բովանդակությունը պահպանելու համար", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "հանել նշումը, մասնիկի կտտոցի ձայնը անջատելու համար", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "հանել նշումը, հստակ ստվերներ ու ընդգծումներ տեսնելու համար", + "uncheck to use the input dialog in short form": "հանել նշումը, մուտքի երկխոսությունից կարճ տեսքով օգտվելու համար", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "չեղարկել վերջին մասնիկի հետարկումը այս վահանակի վրա", + "undrop": "հետ տանել (undrop)", + "unicode _ as letter": "_ յունիկոդը որպես տառ", + "unicode of _": "_ -ի յունիկոդը", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "օղակազրկել", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Անանուն", + "unused": "", + "unused block(s) removed": "չօգտագործված մասնիկ(ներ)ը հեռացվել է", + "up arrow": "սլաք վեր", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "սպասել _ վայրկյան", + "wait until _": "սպասել մինչև _", + "wardrobe": "", + "warp _": "անմիջապես _", + "what's your name?": "Ի՞նչ է քո անունը։", + "when I am _": "Երբ _", + "when I receive _ _": "երբ ստանում եմ _ _", + "when I start as a clone": "երբ սկսում եմ որպես կրկնօրինակ", + "when _": "երբ _", + "when _ clicked": "Երբ _ սեղմված է", + "when _ is edited _": "", + "when _ key pressed _": "Երբ _ ստեղնը սեղմված է _", + "whirl": "մրրիկ", + "whitespace": "բացատ", + "width": "", + "with data": "", + "with inputs": "մուտքերով", + "word": "", + "world": "աշխարհ", + "write _ size _": "", + "x": "x", + "x position": "x -ը", + "y": "y", + "y position": "y -ը", + "year": "", + "year:": "", + "your own": "ձեր սեփական", + "z": "z", + "Սցենարների անվտանգ հոսքեր": "Thread safe scripts" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ia.js b/elements/pl-snap/Snap/locale/lang-ia.js new file mode 100644 index 00000000..8ea5b493 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ia.js @@ -0,0 +1,1384 @@ +SnapTranslator.dict.ia = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) sinistra", + "(0) up": "(0) alto", + "(1) sine": "", + "(180) down": "(180) basso", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) dextera", + "(empty)": "(vacue)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "in re Snap", + "About...": "In re Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Qualcunque (non-evaluta)", + "Any type": "Qualcunque Typo", + "Apply": "Applica", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "A certe que vos vole a dele?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "a retro!...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Editor de blocos", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Umbre indistincte", + "Boolean": "Ver o False", + "Boolean (T/F)": "Ver o False (V/F)", + "Boolean (unevaluated)": "Ver o False (non-evaluta)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Revoca", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Cambia bloco", + "Clear backup": "", + "Clicking sound": "Sona de clicca", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Commando", + "Command (C-shape)": "Commando (C-forma)", + "Command (inline)": "Commando (in linea)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Contribuentes", + "Control": "Reger", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "", + "Costumes": "", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Crea entrata nomine", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Credito...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "Valor predefiniva:", + "Delete": "Dele", + "Delete Custom Block": "Dele bloco artificiose", + "Delete Project": "Dele Projecto", + "Delete a variable": "Dele un Cassa", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Discarga fonte", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamic etiquettas entrata", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Edita entrata nomine", + "Edit label fragment": "Edita etiquetta fragmento", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Vacue", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Exporta blocos", + "Export blocks...": "Exporta blocos...", + "Export project as plain text...": "Exporta projecto in texto simple...", + "Export project...": "Exporta projecto...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "Lineas fin quadrate", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "", + "Hello, World!": "", + "Help": "Adjuta", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Importa blocos", + "Import library": "Importa bibliotheca", + "Import sound": "", + "Import tools": "Importa utensiles", + "Import...": "", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "Entrata nomines:", + "Input Slot Options": "", + "Input name": "Entrata nomine", + "Input sliders": "Entrata glissatores", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Lingua...", + "Libraries...": "Bibliothecas...", + "License": "Licentia", + "License...": "Licentia...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "", + "Lists": "Listas", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Authenticar se...", + "Logout": "", + "Long form input dialog": "Usa dialogo entrata forma longe", + "Looks": "Apparentia", + "Make a block": "Face un bloco", + "Make a variable": "Nove Cassa", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Nomine de message", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Modulos...", + "Motion": "Movimento", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "entrata plure (valor es lista)", + "Nested auto-wrapping": "", + "New": "Nova", + "New Category": "", + "New Project": "Projecto Nove", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Non", + "November": "", + "Number": "Numero", + "OK": "", + "Object": "Objecto", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Aperte Projecto", + "Open in Community Site": "", + "Open...": "Aperte...", + "Opening project...": "", + "Operators": "", + "Other": "Altere", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Penna", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Face plan le etiquettas prototypic", + "Play": "Sona", + "Play sound": "Sona le sono", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Proposition", + "Prefer empty slot drops": "Dar le preferentia a cader in apatur vacue", + "Prefer smooth animations": "Prefere aminationes lisia", + "Privacy...": "", + "Project Notes": "Annotos del projecto", + "Project URLs": "", + "Project notes...": "Annotos de projecto...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Manual referentia", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "A surroga le projecto existente pro un nove?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Salvo", + "Save As...": "Salvo como nomine...", + "Save Project": "", + "Save Project As...": "Secur Projecto Como...", + "Save to disk": "Salvo in file", + "Saved!": "Secur!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Nomine de Scripte Cassa", + "Scripts": "Scriptes", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Sensation", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Abonamento...", + "Single input.": "Sol entrata", + "Single palette": "", + "Slider maximum value": "glissator maxime valor", + "Slider minimum value": "glissator minime valor", + "Snap! website": "Snap! sito web", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Sono", + "Sound Recorder": "", + "Sounds": "Sonas", + "Sprite": "Spirito", + "Sprite Nesting": "", + "Stage": "Scena", + "Stage height": "Scena statura", + "Stage selected: no motion primitives": "Scena selecte: nulle motion primitives", + "Stage size": "Scena dimensiones", + "Stage size...": "Scena dimensiones...", + "Stage width": "Scena traverso", + "Stop": "Halto", + "Stop sound": "Arresta sono", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Cambio retro a modo usator", + "Switch to dev mode": "Cambio a modo disveloppator", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Texto", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Filo secur scriptes", + "Title text": "Titulo texto", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Traductiones..", + "Translators...": "Traductores...", + "Turbo mode": "Turbo modo", + "Turtle": "Tortuca", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Nulle titulo", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Cassa in Alto - face cassa interne visible a evocator", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Nomine de Cassa", + "Variables": "Cassas", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtual claviero", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Si", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebra colorito", + "Zoom blocks": "Zoom blocos", + "Zoom blocks...": "Zoom blocos...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ contine _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ es ante que _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "adde _ e _", + "add a new Turtle sprite": "", + "add a new sprite": "adde spirito nove", + "add comment": "adde un commento", + "add comment here...": "adde commento hic", + "agent": "", + "alert _": "alerte _", + "all": "omni", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "onme excepte prime de _", + "all but this script": "omni excepte iste scripte", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "e", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "responde", + "any": "alcuno", + "any key": "", + "any message": "qualcosa message", + "anything": "", + "append _": "", + "arrange scripts vertically": "presentar scriptes verticalitate", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "demanda _ e attende", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "grande (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Edita bloco dele dialogo texto", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blocos", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "brillantia", + "broadcast _ _": "mitte _ _", + "broadcast _ _ and wait": "mitte _ _ e attende", + "brush": "", + "build": "edifica", + "but getting a": "", + "c": "c", + "call _ _": "evoca _ _", + "call _ w/continuation": "evoca _ con continuation", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "capabile de rota", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "cambio _ per _", + "change _ effect by _": "cambia _ effecto per _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "cambia color del penna a _", + "change pen shade by _": "cambio tinta del penna per _", + "change pen size by _": "cambio dimension del penna per _", + "change size by _": "accrescimento dimensiones per _", + "change tempo by _": "cambio tempo per _", + "change volume by _": "", + "change x by _": "cambia x per _", + "change y by _": "cambia y per _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "marca pro lineas fin quadrate", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "marca pro predice lisia animationes trans computator systemas", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "marca a expone apatur typos in dialogo entrata", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "marca a prohibi scripte readmitte", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "marca a activar IDE animations", + "check to enable alternating colors for nested blocks": "marca a selecta colors alternative por blocos annida", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "marca a activa dynamic etiquetta varia entrata", + "check to enable input sliders for entry fields": "marca a activar entrata glissatores pro campos entrate", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "marca a activar virtual claviero per dispositivo mobile", + "check to hide (+) symbols in block prototype labels": "marca a cella (+) symbols in etiquettas prototypic per blocos", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "marca a prioitate execution de scripte", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "marca a activar sona de clicca", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "marca a selecte por usa gutta umbras e accentuas indistincte", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "abluenta", + "clear": "depura", + "clear graphic effects": "depura effectos graphic", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "clicca o trahe capilo cruce a move le centro de rotation", + "clicked": "clicco", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "color _ es continge _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "Commando", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "entra in registration _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "costume numero", + "costume name": "", + "costumes": "", + "costumes tab help": "costumes adjuta", + "could not connect to:": "", + "cr": "fin de linea", + "create a clone of _": "face un copia de _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "currente modulo versiones", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "dele", + "delete _": "", + "delete _ of _": "dele _ de _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "dele definition del bloco", + "delete slot": "", + "delete this clone": "dele ista copia", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "por demonstration (1.2x)", + "demo...": "", + "detach all parts": "distacca omni partes", + "detach and put into the hand": "", + "detach from": "distacca de", + "development mode": "disveloppation moda", + "development mode debugging primitives:": "disveloppa modo anti-defacto primitives", + "development mode...": "", + "dimensions": "", + "direction": "", + "disable deep-Morphic context menus and show user-friendly ones": "Face inactive profunde Morphic menus contexto e expone se usator amicabile", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "distantia a _", + "distribution": "", + "don't rotate": "non rota", + "down arrow": "basso flecha", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "traheribile", + "draggable?": "", + "dragging threshold": "", + "dropped": "depone", + "duplicate": "", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "bordo talia", + "edit": "", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "Face active Morphic menus contexto e inspector, non amicabile de usatores", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "", + "extract": "", + "f": "f", + "false": "", + "file": "", + "file menu import hint": "Importa insinua per menu de file", + "fill": "", + "fill page...": "", + "filtered for _": "filtra per _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "por omni spiritos", + "for each _ in _ _": "", + "for this sprite only": "solo por este spirito", + "forever _": "sin termino _", + "frame": "", + "frames": "quadros", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "apparition", + "giant (8x)": "gigante (8x)", + "glide _ secs to x: _ y: _": "glissa _ secundes a x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "ir detra _ strato", + "go to _": "ir a _", + "go to _ layer": "", + "go to front": "antepone", + "go to x: _ y: _": "ir a x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "", + "help": "adjuva", + "help...": "adjunta...", + "hide": "cela", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "cela primativos", + "hide variable _": "cella cassa _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "grosse (4x)", + "i": "i", + "identical to": "identic a", + "if _ _": "si _ _", + "if _ _ else _": "si _ _ nisi _", + "if _ then _ else _": "", + "if on edge, bounce": "si in bordo talia, recula", + "import a sound from your computer by dragging it into here": "face importa un sono per trahe hic", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "Entrata Listes:", + "input names:": "Entrata nomines:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "inserta _ in _ de _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "a es _ ?", + "is _ a _ ?": "a es _ de _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "elemento _ de _", + "items": "", + "j": "j", + "join _": "junge _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "a clave _ pressa?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Interlingua", + "language_translator": "Ken Dickey", + "large": "grande", + "last": "ultime", + "last changed": "", + "last_changed": "2015-08-09", + "launch _ _": "lancea _ _", + "left": "", + "left arrow": "sinistra flecha", + "length": "", + "length of _": "longor de _", + "length:": "Longor:", + "let the World automatically adjust to browser resizing": "", + "letter": "character", + "letter _ of _": "character _ de _", + "light (70)": "", + "lightness": "", + "line": "linea", + "lines": "", + "list": "Lista", + "list _": "", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "Incarga bibliotheca official de blocos potente", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "face un bloco...", + "make a category...": "", + "make a copy and pick it up": "duplica e prende in mano", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "maxima (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "a mure es a basso?", + "mouse position": "", + "mouse x": "mure x position", + "mouse y": "mure y position", + "mouse-departed": "mure parti", + "mouse-entered": "mure entra", + "mouse-pointer": "mure punctator", + "move": "", + "move _ steps": "move _ passos", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "io mesme", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "Nove...", + "next": "", + "next costume": "proxime costume", + "none": "necun", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "non _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "Numero", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "duploca solo esto bloco", + "only face left/right": "sol facie sinistre o dextre", + "only grab this block": "", + "open a new window with a picture of all scripts": "expone nove fenestra con pictura del omni scriptes", + "open a new window with a picture of the stage": "expone nove fenestra con pictura del scena", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "Aperte fenestra nove con pictura de este scripte", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "", + "or before": "", + "other clones": "", + "other scripts in sprite": "altere scriptes in iste spirito", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "pausa omni _", + "pen": "", + "pen _": "", + "pen down": "face penna a basso", + "pen down?": "", + "pen trails": "penna tracia", + "pen up": "face penna in alto", + "pen vectors": "", + "pic...": "pictura...", + "pick random _ to _": "al aventura inter _ e _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "sona nota _ per _ pulsia", + "play sound _": "sona _", + "play sound _ at _ Hz": "", + "play sound _ until done": "sona _ usque complete", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "puncta direction _", + "point towards _": "puncta erga _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "Proposition", + "presentation (1.4x)": "por presentation (1.4x)", + "pressed": "pressa", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "aleatori", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "redacto etiquettas...", + "release": "", + "remove block variables...": "", + "rename": "edita le nomine", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "edita le nomine del costume", + "rename only this reporter": "", + "rename sound": "Edita le nomine del sono", + "rename...": "Edita le nomine...", + "repeat _ _": "itera _ _", + "repeat until _ _": "itera donec _ _", + "replace item _ of _ with _": "reimplacia elemento _ de _ con _", + "report _": "reporta _", + "reporter": "Reporter", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "recomenciar le chronometria", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "pausa per _ pulsia", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "dextera flecha", + "ring": "", + "ringify": "Anulamento", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ rotunda", + "run _ _": "comencia _ _", + "run _ w/continuation": "comencia _ con continuation", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "dice _", + "say _ for _ secs": "dice _ per _ secundes", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "scripte pictura...", + "script variables _": "cassas de scripte _", + "scripts": "", + "scripts pic...": "scriptes pictura...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "selecta", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "in _ pone effecto _", + "set _ of block _ to _": "", + "set _ to _": "in _ pone _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "face color del penna a _", + "set pen shade to _": "face tinta del penna a _", + "set pen size to _": "face dimension del penna a _", + "set size to _ %": "delimita dimentiones a _ %", + "set tempo to _ bpm": "face tempo a _ pulsia per minuta", + "set this morph's alpha value": "", + "set turbo mode to _": "face turbo modo a _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "in x pone _", + "set y to _": "in y pone _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Dar le preferentia in menu predefinite per apatur vacue insinua", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "expone", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "monstra omni", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Expone blocos artificiose global como XML immane nove fenestra de navigator", + "show primitives": "expone primativos", + "show project data as XML in a new browser window": "Expone dato de projecto in XML immane nove fenestra de navigator", + "show table _": "", + "show the World's menu": "", + "show variable _": "expone cassa _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "dimentiones", + "slider": "glissator", + "slider max...": "glissator maxime...", + "slider min...": "glissator minime...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "spatio vacue", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "fisse _ de _", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "", + "stack size": "pila dimensione", + "stage": "", + "stage image": "", + "stamp": "timbra", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "cessa _", + "stop all sounds": "cessar sona tote", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Pone esti projecto in dossier discarga (per navigators sustene)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "cambio a costume _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulator", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "Texto", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "", + "think _": "", + "think _ for _ secs": "pensa _ per _ secundes", + "this _": "", + "this block": "iste bloco", + "this project doesn't have any custom global blocks yet": "esti projecto no trova blocos artificiose global", + "this script": "iste scripte", + "time in milliseconds": "", + "timer": "chronometria", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "continge _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "Ken.Dickey@whidbey.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "ver", + "turbo mode": "", + "turbo mode?": "a turbo modo?", + "turn _ _ degrees": "torna _ _ grados", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "typo de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "dismarca pro plus veloce ma variable rata de frame monstra", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "dismarca pro lineas fin rotunde", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "dismarca a activar reporters cadera a capabile displacia alteres", + "uncheck to allow script reentrance": "dismarca a permitte scripte readmitte", + "uncheck to always show (+) symbols in block prototype labels": "dismarca a expone (+) symbolos in etiquettas prototypic per blocos", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "dismarca a disactivar IDE-Animations", + "uncheck to disable alternating colors for nested block": "dismarca a disactiva colors alternative por blocos annida", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "dismarca a disactiva dynamic etiquettas varia entrata", + "uncheck to disable input sliders for entry fields": "dismarca a disactivar entrata glissatores pro campos entrate", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "dismarca a disactivar virtual claviero per dispositivo mobile", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "dismarca a comencia scriptes a velocitate normal", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "dismarca a disactivar sona de clicca", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "dismarca por usa gutta umbras e accentuas solide", + "uncheck to use the input dialog in short form": "dismarka a usa dialogo entrata forma curte", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "disfacer bloco depone antea in este pannello", + "undrop": "disdepone", + "unicode _ as letter": "Unicode character pro _", + "unicode of _": "Unicode valor de _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "Disanulamento", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "innominate", + "unused": "", + "unused block(s) removed": "", + "up arrow": "alto flecha", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "attende _ secundes", + "wait until _": "attende donec _", + "wardrobe": "", + "warp _": "ordi _", + "what's your name?": "que es tu nomine?", + "when I am _": "cuando io es _", + "when I receive _ _": "cuando io recipe _ _", + "when I start as a clone": "quando io comencia como copia", + "when _": "", + "when _ clicked": "cuando _ clic", + "when _ is edited _": "", + "when _ key pressed _": "cuando _ clave pressa _", + "whirl": "", + "whitespace": "spatio blanco", + "width": "", + "with data": "", + "with inputs": "Con entratas", + "word": "", + "world": "Mundo", + "write _ size _": "", + "x": "x", + "x position": "", + "y": "y", + "y position": "", + "year": "", + "year:": "", + "your own": "vostre", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-id.js b/elements/pl-snap/Snap/locale/lang-id.js new file mode 100644 index 00000000..066683f8 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-id.js @@ -0,0 +1,1385 @@ +SnapTranslator.dict.id = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) kiri", + "(0) up": "(0) atas", + "(1) sine": "", + "(180) down": "(180) bawah", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) kanan", + "(empty)": "(kosong)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Tentang Snap", + "About...": "Tentang...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animasi", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Apapun (tidak dievaluasi)", + "Any type": "Tipe apapun", + "Apply": "Aplikasikan", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Apakah kamu yakin mau menghapus?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Kembali...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Editor Balok", + "Blocks": "Balok", + "Blocks category name:": "", + "Blurred shadows": "Bayangan blur", + "Boolean": "", + "Boolean (T/F)": "Boolean (B/S)", + "Boolean (unevaluated)": "Boolean (tidak dievaluasi)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Batalkan", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Ganti balok", + "Clear backup": "", + "Clicking sound": "Suara klik", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Perintah", + "Command (C-shape)": "Perintah (bentuk-C)", + "Command (inline)": "Perintah", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "Konten", + "Contributors": "Kontributor", + "Control": "Kontrol", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Editor kostum", + "Costumes": "Kostum", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Buat nama input", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Kredit...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "Nilai Standar:", + "Delete": "Hapus", + "Delete Custom Block": "Hapus Balok", + "Delete Project": "Hapus projek", + "Delete a variable": "Hapus variabel", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Unduh sumber", + "Dragging threshold...": "", + "Dynamic input labels": "Label input yang dinamik", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Sunting nama input", + "Edit label fragment": "Sunting bagian label", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Kosong", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Ekspor balok", + "Export blocks...": "Ekspor balok...", + "Export project as plain text...": "Ekspor projek sebagai file .txt", + "Export project...": "Ekspor projek", + "Export summary with drop-shadows...": "", + "Export summary...": "Ekspor ringkasan...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Desain datar", + "Flat line ends": "Garis ujung rata", + "For all Sprites": "Untuk semua karakter", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Halo!", + "Hello, World!": "", + "Help": "Bantuan", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Impor balok", + "Import library": "Impor pustaka", + "Import sound": "", + "Import tools": "Impor peralatan", + "Import...": "Impor...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Dukungan inheritance", + "Input Names:": "Nama input:", + "Input Slot Options": "", + "Input name": "Nama input", + "Input sliders": "Slider input", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Editing melalui kibor", + "Kind of": "Seperti", + "LEAP Motion controller": "", + "Language...": "Bahasa...", + "Libraries...": "Pustaka...", + "License": "Lisensi", + "License...": "Lisensi...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Daftar", + "List utilities": "", + "Lists": "Daftar", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Masuk...", + "Logout": "", + "Long form input dialog": "Form input panjang", + "Looks": "Penampilan", + "Make a block": "Buat balok baru", + "Make a variable": "Buat variabel", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Nama pesan", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Modul...", + "Motion": "Gerakan", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Input majemuk (nilai adalah daftar input)", + "Nested auto-wrapping": "", + "New": "Baru", + "New Category": "", + "New Project": "Projek Baru", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Tidak", + "November": "", + "Number": "Angka", + "OK": "", + "Object": "Obyek", + "October": "", + "Ok": "Oke", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Buka projek", + "Open in Community Site": "", + "Open...": "Buka", + "Opening project...": "", + "Operators": "Operator", + "Other": "Lainnya", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "Bagian dari", + "Parts": "Bagian", + "Password:": "", + "Pen": "Pena", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Label prototipe/purwarupa polos", + "Play": "Mainkan bunyi", + "Play sound": "Mainkan suara", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikat", + "Prefer empty slot drops": "Memilih jatuh slot kosong", + "Prefer smooth animations": "Memilih animasi lembut", + "Privacy...": "", + "Project Notes": "Catatan Projek", + "Project URLs": "", + "Project notes...": "Catatan projek...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Panduan", + "Remove a category...": "", + "Remove unused blocks": "Hapus balok yang tidak dipakai", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Ganti projek yang sudah ada dengan yang baru?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Pelapor", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Simpan", + "Save As...": "Simpan sebagai...", + "Save Project": "", + "Save Project As...": "Simpan Projek Sebagai...", + "Save to disk": "Simpan ke komputer", + "Saved!": "Tersimpan!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Skrip nama variabel", + "Scripts": "Skrip", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Sensor", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Daftar...", + "Single input.": "Input tunggal.", + "Single palette": "", + "Slider maximum value": "Nilai maksimum slider:", + "Slider minimum value": "Nilai minimum slider:", + "Snap! website": "Situsweb Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Suara", + "Sound Recorder": "", + "Sounds": "Suara", + "Sprite": "Karakter", + "Sprite Nesting": "", + "Stage": "Panggung", + "Stage height": "Tinggi panggung", + "Stage selected: no motion primitives": "Panggung terpilih: tidak ada primitif (balok) gerak", + "Stage size": "Ukuran panggung", + "Stage size...": "Ukuran panggung", + "Stage width": "Lebar panggung", + "Stop": "Berhenti", + "Stop sound": "Hentikan suara", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Kembali ke mode pengguna", + "Switch to dev mode": "Ganti ke mode percobaan", + "Switch to vector editor?": "", + "Table lines": "Garis tabel", + "Table support": "Dukungan tabel", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Teks", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Skrip aman untuk thread", + "Title text": "Teks judul", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Terjemahan", + "Translators...": "Penerjemah...", + "Turbo mode": "", + "Turtle": "Kura-Kura", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Tak berjudul", + "Unused blocks...": "Balok yang tidak dipakai", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - buat var internal mirip dengan pemanggil", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Nama variabel", + "Variables": "Variabel", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Kibor virtual", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Ya", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Warna zebra", + "Zoom blocks": "Balok zoom", + "Zoom blocks...": "Perbesar balok", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ mempunyai _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ di depan _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ dari _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "tambahkan _ ke _", + "add a new Turtle sprite": "", + "add a new sprite": "tambah sprite baru", + "add comment": "tambahkan komen", + "add comment here...": "tambahkan komentar di sini...", + "agent": "", + "alert _": "tampilkan pop-up: _", + "all": "semuanya", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "semua kecuali barang pertama dari _", + "all but this script": "semuanya selain skrip ini", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "dan", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "jawaban", + "any": "", + "any key": "tombol apapun", + "any message": "pesan apapun", + "anything": "", + "append _": "", + "arrange scripts vertically": "urutkan skripnya secara vertikal", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "tanya _ dan tunggu", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Apakah kamu yakin kamu mau menghapus balok ini dan instansinya?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "balok", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "kecerahan", + "broadcast _ _": "beritakan _ _", + "broadcast _ _ and wait": "beritakan _ _ dan tunggu", + "brush": "", + "build": "bangun", + "but getting a": "", + "c": "c", + "call _ _": "panggil _ _", + "call _ w/continuation": "panggil _ dengan kontinuasi", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "bisa berputar", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "ubah _ sebanyak _", + "change _ effect by _": "ubah efek _ sebanyak _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ubah warna pena sebanyak _", + "change pen shade by _": "ubah kegelapan pena sebanyak _", + "change pen size by _": "ubah ukuran pena sebesar _", + "change size by _": "ubah ukuran sebanyak _", + "change tempo by _": "ubah tempo sebanyak _", + "change volume by _": "", + "change x by _": "ubah x sebanyak _", + "change y by _": "ubah y sebanyak _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "centang untuk ujung rata dari garis pena", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "centang untuk animasi lembut, bisa diramalkan di komputer", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "centang untuk selalu menunjukan slot tipe di input dialog", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "klik untuk menghindari skrip masuk ulang", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "centang untuk menyalahkan animasi IDE", + "check to enable alternating colors for nested blocks": "centang untuk menyalahkan warna berganti di balok bersarang", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "centang untuk menyalahkan label dinamik untu input variadik", + "check to enable input sliders for entry fields": "centang untuk menyalahkan slider input intuk bagian entry", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "centang untuk meyalahkan kibor virtual untuk alat mobile", + "check to hide (+) symbols in block prototype labels": "centang untuk menyembunykan (+) di label balok prototype", + "check to inherit from": "", + "check to prevent contents from being saved": "centang untuk mencegah konten disimpan", + "check to prioritize script execution": "centang untuk mementingkan eksekusi skrip", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "centang untuk menyalahkan suara klik", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "centang untuk mengunakan bayangan dan cahaya blur saat jatuh", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "rapikan", + "clear": "bersihkan layar", + "clear graphic effects": "hapus efek grafis", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "klik atau seret crosshair untuk memindahkan pusat rotasi", + "clicked": "diklik", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "warna _ menyentuh _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "komik", + "command": "perintah", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "konfetti", + "console log _": "catat di konsol _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "nomor kostum", + "costume name": "", + "costumes": "", + "costumes tab help": "impor gambar dari situs atau sebuah file dengan cara menyeret berkasnya", + "could not connect to:": "", + "cr": "", + "create a clone of _": "buat klon baru dari _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "versi modul sekarang", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "hapus", + "delete _": "", + "delete _ of _": "hapus _ dari _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "hapus definisi balok", + "delete slot": "", + "delete this clone": "hapus klon ini", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "lepaskan semua bagian", + "detach and put into the hand": "", + "detach from": "lepaskan dari", + "development mode": "mode percobaan", + "development mode debugging primitives:": "primitif debugging mode percobaan", + "development mode...": "", + "dimensions": "", + "direction": "arah", + "disable deep-Morphic context menus and show user-friendly ones": "matikan menu konteks deep-morphic dan tunjukan konteks menu yang ramah", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "jarak ke _", + "distribution": "", + "don't rotate": "jangan berputar", + "down arrow": "panah bawah", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "bisa diseret", + "draggable?": "", + "dragging threshold": "", + "dropped": "dijatuhkan", + "duplicate": "gandakan", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "pinggir", + "edit": "sunting", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "sunting...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "Nyalakan Morphic context menu dan inspektor, tidak ramah pengguna!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "ekspor", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "ekspor...", + "extract": "", + "f": "f", + "false": "salah", + "file": "", + "file menu import hint": "impor sebuah projek yang sudah diekspor atau pustaka balok, kostum atau suara", + "fill": "isi dengan cat", + "fill page...": "", + "filtered for _": "disaring untuk _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "cari balok kostum global yang tidak dipakai dan hapus definisi mereka", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "untuk semua sprite", + "for each _ in _ _": "", + "for this sprite only": "hanya untuk sprite ini", + "forever _": "selamanya lakukan: _", + "frame": "", + "frames": "jumlah frame:", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "keburaman", + "giant (8x)": "raksasa (8x)", + "glide _ secs to x: _ y: _": "meluncur _ dtk. ke x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "ke belakang _ lapisan", + "go to _": "pergi ke _", + "go to _ layer": "", + "go to front": "ke depan", + "go to x: _ y: _": "pergi ke x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "halo", + "help": "Tolong", + "help...": "bantuan...", + "hide": "sembunyikan", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "sembunyikan primitif", + "hide variable _": "sembunyikan variabel _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "besar sekali (4x)", + "i": "i", + "identical to": "identik dengan", + "if _ _": "jika _ _", + "if _ _ else _": "jika _ _ jika tidak _", + "if _ then _ else _": "", + "if on edge, bounce": "jika ada di pinggir, melambung", + "import a sound from your computer by dragging it into here": "impor sebuah suara dari komputermu dengan menyeret berkasnya ke sini", + "import without attempting to parse or format data": "", + "import...": "impor...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "Dafta input:", + "input names:": "Nama input:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "tambahkan _ di _ dari _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "apakah _ ?", + "is _ a _ ?": "apakah _ sebuah _ ?", + "is _ empty?": "", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "barang _ dari _", + "items": "barang", + "j": "j", + "join _": "gabungkan _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "kunci _ ditekan?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Bahasa Indonesia", + "language_translator": "Alexander Raphael Liu, Emmanuella Rumanti", + "large": "besar", + "last": "terakhir", + "last changed": "", + "last_changed": "2019-01-21", + "launch _ _": "luncurkan _ _", + "left": "", + "left arrow": "panah kiri", + "length": "", + "length of _": "panjang dari _", + "length:": "panjang:", + "let the World automatically adjust to browser resizing": "", + "letter": "huruf", + "letter _ of _": "huruf _ dari _", + "light (70)": "", + "lightness": "", + "line": "garis", + "lines": "", + "list": "daftar", + "list _": "daftar _", + "list view...": "tampilan daftar", + "ln": "ln", + "load the official library of powerful blocks": "impor modul resmi dari balok hebat", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "buat balok baru.", + "make a category...": "", + "make a copy and pick it up": "buat kopi dat ambil", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "pesan", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "sangat besar (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "tetikus diklik?", + "mouse position": "", + "mouse x": "posisi x tetikus", + "mouse y": "posisi y tetikus", + "mouse-departed": "ditinggalkan tetikus", + "mouse-entered": "disentuh tetikus", + "mouse-pointer": "penunjuk tetikus/mouse", + "move": "bergerak", + "move _ steps": "maju _ langkah", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "diriku", + "n": "n", + "name": "", + "neg": "", + "negative": "negatif", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "baru...", + "next": "", + "next costume": "kostum selanjutnya", + "none": "tidak ada", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "tidak _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "angka", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "hanya gandakan balok ini", + "only face left/right": "hanya boleh menghadap kiri/kanan", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "buka jendela peramban baru dengan ringkasan dari projek ini", + "open a new window with a picture of all scripts": "buka jendela baru dengan gambar semua skrip", + "open a new window with a picture of the stage": "buka jendela baru dengan gambar dari panggung", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "buka jendela baru dengan gambar dari skrip ini", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "buka di dialog...", + "open shared project from cloud...": "", + "options...": "", + "or": "atau", + "or before": "", + "other clones": "", + "other scripts in sprite": "skrip-skrip lain di karakter ini", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "hentikan sementara semua _", + "pen": "", + "pen _": "", + "pen down": "turunkan pena", + "pen down?": "", + "pen trails": "jejak pena", + "pen up": "naikkan pena", + "pen vectors": "", + "pic...": "expor gambar...", + "pick random _ to _": "pilih angka acak dari _ ke _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "mainkan not _ selama _ ketukan", + "play sound _": "mainkan suara _", + "play sound _ at _ Hz": "", + "play sound _ until done": "mainkan _ sampai selesai", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "tunjuk ke arah _", + "point towards _": "tunjuk ke arah _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predikat", + "presentation (1.4x)": "presentasi (1.4x)", + "pressed": "ditekan", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "apapun", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "label ulang...", + "release": "", + "remove block variables...": "", + "rename": "namakan ulang", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "namakan ulang kostum", + "rename only this reporter": "", + "rename sound": "namakan ulang bunyi", + "rename...": "namakan ulang...", + "repeat _ _": "ulangi _ kali _", + "repeat until _ _": "ulangi sampai _ _", + "replace item _ of _ with _": "ganti barang _ di _ dengan _", + "report _": "laporkan _", + "reporter": "pelapor", + "reporter didn't report": "", + "reset columns": "atur ulang kolum", + "reset timer": "atur ulang timer", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "istirahat selama _ ketukan", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "panah kanan", + "ring": "", + "ringify": "cincinkan", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "bulatkan _", + "run _ _": "jalankan _ _", + "run _ w/continuation": "jalankan _ dengan kontinuasi", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "katakan _", + "say _ for _ secs": "katakan _ selama _ dtk.", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "gambar skrip...", + "script variables _": "skrip variabel _", + "scripts": "", + "scripts pic...": "Gambar skrip", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "pilih", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "atur efek _ ke _", + "set _ of block _ to _": "", + "set _ to _": "atur _ ke _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "atur warna pena ke _", + "set pen shade to _": "atur kegelapan pena ke _", + "set pen size to _": "atur ukuran pena ke _", + "set size to _ %": "atur ukuran ke _ %", + "set tempo to _ bpm": "atur tempo ke _ ketukan per menit", + "set this morph's alpha value": "", + "set turbo mode to _": "atur mode turbo ke _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "atur x ke _", + "set y to _": "atur y ke _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "jangan centang untuk mengizinkan reporter yang jatuh menendangyang lain", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "tampilkan", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "tunjukkan semua", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "tunjukkan definisi balok kostum global sebagai xml di jendela baru", + "show primitives": "tampilkan primitif", + "show project data as XML in a new browser window": "tunjukkan data projek sebagai XML di jendela peramban", + "show table _": "", + "show the World's menu": "", + "show variable _": "tampilkan variabel _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "ukuran", + "slider": "", + "slider max...": "max slider...", + "slider min...": "min slider...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "spasi", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "potong _ di setiap _", + "sprite": "", + "sprites": "", + "sqrt": "akar kuadrat", + "square": "", + "stack size": "ukuran tumpukan:", + "stage": "", + "stage image": "", + "stamp": "stempel", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "hentikan _", + "stop all sounds": "hentikan semua suara", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "simpan projek ini di folder downloads (hanya untuk browser yang mendukung!)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "ganti ke kostum _", + "switch to scene _ _": "", + "t": "t", + "tab": "indentasi", + "table view...": "tampilan tabel", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "teks", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "sekarang tidak ada balok kostum global yang tidak dipakai", + "there are currently no vectorizable pen trail segments": "", + "thing": "barang", + "think _": "pikirkan _", + "think _ for _ secs": "pikirkan _ selama _ dtk.", + "this _": "", + "this block": "balok ini", + "this project doesn't have any custom global blocks yet": "projek ini sepertinya tidak punya balok global buatan sendiri", + "this script": "skrip ini", + "time in milliseconds": "", + "timer": "", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "menyentuh _ ?", + "transient": "sementara", + "translations": "", + "translations...": "", + "translator_e-mail": "raphaxander@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "benar", + "turbo mode": "", + "turbo mode?": "mode turbo menyala?", + "turn _ _ degrees": "berputar _ _ derajat", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "tipe dari _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "jangan centang untuk kecepatan lebih dan frame rate dinamis", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "matikan untuk ujung bulat dari garis pena", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "jangan centang untuk mengizinkan reporter yang jatuh menendangyang lain", + "uncheck to allow script reentrance": "jangan centang, untuk mengizinkan skrip masuk ulang", + "uncheck to always show (+) symbols in block prototype labels": "jangan centang untuk selalu menunjukan (+) di label balok prototype", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "jangan centang untuk mematikan animasi IDE", + "uncheck to disable alternating colors for nested block": "jangan centang untu mematikan warna berganti di balok bersarang", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "jangan centang untuk mematika label dinamik untuk input variadik", + "uncheck to disable input sliders for entry fields": "jangan centang untuk mematikan slider input untuk bagian entry", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "jangan centang untuk mematikan kibor virtual untuk alat mobile", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "jangan centang untuk menjalankan skrip pada kecepatan normal", + "uncheck to save contents in the project": "jangan centang untuk menymimpan konten di dalam projek", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "jangan centang untuk mematiakn suara klik", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "jangan centang untuk mengunakan bayangan dan cahaya saat jatuh", + "uncheck to use the input dialog in short form": "jangan centang untuk menggunakan input dialog dalam bentuk pendek", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "undo mendrag dan jatuhkan balok terakhir di panel ini", + "undrop": "undo jatuhkan", + "unicode _ as letter": "Unicode _ sebagai huruf", + "unicode of _": "nilai unicode dari _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "hapus cincin", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "tak berjudul", + "unused": "", + "unused block(s) removed": "balok yang tidak dipakai terhapus", + "up arrow": "panah atas", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "tungu _ dtk.", + "wait until _": "tunggu sampai _", + "wardrobe": "", + "warp _": "bungkus _", + "what's your name?": "siapa namamu?", + "when I am _": "ketika aku _", + "when I receive _ _": "ketika aku menerima _ _", + "when I start as a clone": "ketika aku mulai sebagai klon", + "when _": "ketika _", + "when _ clicked": "ketika _ diklik", + "when _ is edited _": "", + "when _ key pressed _": "ketika _ ditekan _", + "whirl": "", + "whitespace": "ruang putih", + "width": "", + "with data": "", + "with inputs": "dengan input", + "word": "", + "world": "dunia", + "write _ size _": "", + "x": "x", + "x position": "posisi x", + "y": "y", + "y position": "posisi y", + "year": "", + "year:": "", + "your own": "punyamu", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-it.js b/elements/pl-snap/Snap/locale/lang-it.js new file mode 100644 index 00000000..ebe89d7e --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-it.js @@ -0,0 +1,1374 @@ +SnapTranslator.dict.it = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": " non esiste in questo contesto", + "(-90) left": "(-90) sinistra", + "(0) up": "(0) su", + "(1) sine": "(1) con onda sinusoidale", + "(180) down": "(180) giù", + "(2) square": "(2) con onda quadrata", + "(3) sawtooth": "(3) con onda a dente di sega", + "(4) triangle": "(4) con onda triangolare", + "(90) right": "(90) destra", + "(empty)": "(vuoto)", + "(in a new window)": "(in una nuova finestra)", + "(no matches)": "(nessun risultato)", + "(temporary)": "(temporaneo)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "Una variazione del tipo di dati lista nella quale ogni elemento della lista non è definito fino a che non occorre, permettendoti di costruire liste composte da milioni di elementi senza spreco di tempo e di memoria, anche liste infinite. (Come esempio è incluso un blocco che restituisce tutti i numeri primi). Consulta SICP 3.5 per un tutorial.", + "APL primitives": "Primitive APL", + "About Snap": "Informazioni su Snap", + "About...": "Informazioni su Snap!...", + "Account created.": "Account creato.", + "Add interactive maps to projects": "Aggiunge mappe interattive ai progetti", + "Add scene...": "Aggiungi scena...", + "Adds features from the APL language supporting hyperblocks.": "Aggiunge caratteristiche del linguaggio APL che supportano gli iperblocchi.", + "Allow multi-line text input to a block": "Argomenti multilinea di tipo testo per i blocchi", + "An e-mail with your password has been sent to the address provided": "Una mail con la tua password è stata inviata all'indirizzo che hai indicato", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "Una versione estesa del blocco URL che consente di usare POST, PUT e DELETE e richieste GET requests, permette di usare il protocollo sicuro HTTPS e permette di gestire gli header, ecc. Permette anche di analizzare i dati JSON.", + "Analyze data for frequency distribution": "Analizza i dati per ricavare la distribuzione delle frequenze", + "Analyze, manipulate and generate sound samples.": "Analizza, manipola e genera brani audio.", + "Animation": "Animazione", + "Animations": "Animazioni", + "Another custom block with this name exists.": "Un nuovo blocco con questo nome esiste già.", + "Any (unevaluated)": "Qualunque (non valutato)", + "Any type": "Qualunque tipo", + "Apply": "Applica", + "April": "Aprile", + "Are you sure you want to continue?": "Sei sicuro di voler continuare?", + "Are you sure you want to delete": "Sei sicuro di voler eliminare", + "Are you sure you want to publish": "Sei sicuro di voler pubblicare", + "Are you sure you want to replace": "Sei sicuro di voler sostituire", + "Are you sure you want to share": "Sei sicuro di voler condividire", + "Are you sure you want to unpublish": "Sei sicuro di voler non pubblicare", + "Are you sure you want to unshare": "Sei sicuro di voler non condividere", + "Audio Comp": "Compressione Audio", + "August": "Agosto", + "Back...": "Indietro...", + "Backgrounds": "Sfondi", + "Backup failed. This cannot be undone, proceed anyway?": "Backup fallito. Questa operazione non può essere annullata, vuoi procedere?", + "Bar charts": "Grafico a barre", + "Bignums, rationals, complex #s": "Numeri a precisione infinita, razionali, complessi", + "Birth date:": "Data di nascita", + "Bitmap": "Bitmap", + "Block Editor": "Editor di Blocchi", + "Blocks": "Blocchi", + "Blocks category name:": "Nome della nuova categoria di blocchi:", + "Blurred shadows": "Ombreggiature attenuate", + "Boolean": "booleano", + "Boolean (T/F)": "Booleano (V/F)", + "Boolean (unevaluated)": "Booleano (non valutato)", + "Bottom": "In fondo", + "Bring back deleted sprites": "Ripristina gli sprite rimossi", + "Browser": "Browser", + "Brush size": "Dimensione pennello", + "Cache Inputs": "Conserva gli argomenti in Cache", + "Camera": "Webcam", + "Camera not supported": "Webcam non supportata", + "Camera support": "Supporto webcam", + "Cancel": "Annulla", + "Case sensitivity": "Sensibile alle maiuscole", + "Catch errors": "Intercettazione degli errori", + "Catch errors in a script": "Intercetta errori degli script", + "Category color": "Colore della categoria", + "Change Password": "Cambia Password", + "Change Password...": "Cambia Password...", + "Change block": "Cambia categoria e tipo del blocco", + "Clear backup": "Cancella backup", + "Clicking sound": "Click di aggancio dei blocchi", + "Closed brush (free draw)": "Pennello (disegno a mano libera)", + "Cloud": "Cloud", + "Code mapping": "Mappa il codice", + "Codification support": "Supporto codificazione", + "Colors and Crayons": "Colori e Pastelli", + "Command": "Comando", + "Command (C-shape)": "Comando (a forma di C)", + "Command (inline)": "Comando (in linea)", + "Computer": "Computer", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "Collega a estensioni hardware usando la Web Serial API (è richiesto Chromium, Chrome o Edge)", + "Constrain proportions of shapes? (you can also hold shift)": "Vincola proporzioni delle forme? (in alternativa puoi tenere premuto shift)", + "Contents": "Contenuti", + "Contributors": "Hanno contribuito:", + "Control": "Controllo", + "Control the Hummingbird robotics kit processor": "Controlla il kit processore robotico di Hummingbird", + "Controller LEAP Motion": "Controller LEAP Motion", + "Convert to bitmap?": "Convertire in bitmap?", + "Costume Editor": "Editor di Costumi", + "Costumes": "Costumi", + "Crayons": "Pastelli", + "Create and manage global/sprite/script variables in a script": "Crea e gestisce in uno script variabili globali/dello sprite/dello script", + "Create input name": "Crea parametro", + "Create variables": "Crea variabili", + "Create variables in program": "Crea variabili programmaticamente", + "Credits...": "Crediti...", + "Custom Block Translations": "Traduzioni dei Nuovi Blocchi", + "Database": "Database", + "December": "Dicembre", + "Default": "Predefinite", + "Default Value:": "Valore predefinito:", + "Delete": "Cancella", + "Delete Custom Block": "Cancella Blocco", + "Delete Project": "Elimina Progetto", + "Delete a variable": "Cancella variabile", + "Disable click-to-run": "Disabilitare esecuzione con click", + "Disable dragging data": "Disabilita il trascinamento di media", + "Down": "Giù", + "Download source": "Scarica il codice sorgente", + "Dragging threshold...": "Soglia di trascinamento...", + "Dynamic input labels": "Etichette degli input dinamiche", + "E-mail address of parent or guardian:": "Indirizzo e-mail del genitore o tutore", + "E-mail address:": "Indirizzo e-mail", + "ERROR: INVALID PASSWORD": "ERRORE: PASSWORD NON VALIDA", + "EXPERIMENTAL! check to enable live custom control structures": "SPERIMENTALE! clicca per abilitare strutture di controllo personalizzate dinamiche", + "EXPERIMENTAL! check to enable support for compiling": "SPERIMENTALE! clicca per abilitare il supporto per la compilazione", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "SPERIMENTALE! ottimizza le operazioni di lettura di Canvas2D usando l'attributo \"willReadFrequently\" a spese del rendering in alcuni browser", + "EXPERIMENTAL! uncheck to disable live custom control structures": "SPERIMENTALE! clicca per disabilitare strutture di controllo personalizzate dinamiche", + "EXPERIMENTAL! uncheck to disable live support for compiling": "SPERIMENTALE! clicca per disabilitare il supporto dinamico per la compilazione", + "Edge color (left click)": "Colore Bordo (click sinistro)", + "Edit input name": "Modifica parametro", + "Edit label fragment": "Modifica porzione di etichetta", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "Legge di Eisenberg: Qualunque cosa che può essere fatta tramite la GUI dovrebbe poter essere fatta tramite il linguaggio di programmazione, e viceversa.", + "Ellipse (shift: circle)": "Ellisse (shift: cerchio)", + "Empty": "Vuoto", + "Enable command drops in all rings": "Abilita l'inserimento di comandi in tutti gli anelli", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Inserisci il codice che corresponde alla definizione del blocco. Scegli il nome per i tuoi parametri formali (ignora quelli mostrati).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Inserisci il codice che corresponde alla definizione del blocco. Usa i nomi dei parametri formali mostrati e per fare riferimento al codice testuale generato dal corpo della definizione.", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Inserisci il codice che corrisponde alle operazioni del blocco (solitamente una singola chiamata di funzione). Usa <#n> per far riferimento ai parametri attuali, come mostrato.", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Inserisci una opzione per riga. Usa opzionalmente \"=\" come delimitatore per le chiavi/valori ad es. the answer=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "Inserisci una traduzione per riga. Usa i due punti (\":\") come delimitatore per lang/spec e l'underscore (\"_\") come segnaposto per un argomento, ad es.: en:say _ for _ secs", + "Eraser tool": "Gomma", + "Error": "Errore", + "Examples": "Esempi", + "Execute on slider change": "Esegui quando si sposta il cursore", + "Export Project As...": "Esporta Progetto Come...", + "Export all scripts as pic...": "Esporta tutti gli script come immagine...", + "Export blocks": "Esporta blocchi", + "Export blocks...": "Esporta blocchi...", + "Export project as plain text...": "Esporta il progetto come un file di testo...", + "Export project...": "Esporta il progetto...", + "Export summary with drop-shadows...": "Esporta sommario con ombreggiatura...", + "Export summary...": "Esporta sommario...", + "Extension blocks": "Blocchi estensione", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "Estrae sottostringhe di una stringa in diversi modi. In generale, le caselle di testo hanno una sola riga. Il blocco MULTILINE accetta valori composti da più righe e può essere usato negli argomenti di altri blocchi.", + "Fade blocks": "Trasparenza blocchi", + "Fade blocks...": "Trasparenza dei blocchi...", + "February": "Febbraio", + "Fetching project from the cloud...": "Caricamento del progetto dal cloud...", + "Fill a region": "Riempie un'area", + "Fill color (right click)": "Colore riempimento (click destro)", + "Filled Ellipse (shift: circle)": "Ellisse piena (shift: cerchio)", + "Filled Rectangle (shift: square)": "Rettangolo pieno (shift: quadrato)", + "First-Class Sprites": "Sprite di Prima Classe", + "Flat design": "Aspetto piatto interfaccia", + "Flat line ends": "Estremità delle linee squadrata", + "For all Sprites": "Per tutti gli sprite", + "Frequency Distribution Analysis": "Analisi della Distribuzione delle Frequenze", + "Generate costumes from letters or words of text.": "Genera costumi da lettere o parole di testo.", + "Getters and setters": "Metodi di accesso e di modifica", + "Glide, grow and rotate using easing functions.": "Scivola, cambia dimensione e ruota usando funzioni di interpolazione.", + "HSL pen color model": "Modello HSL per i colori della penna", + "Header mapping": "Conversione intestazione", + "Hello!": "Ciao!", + "Hello, World!": "Ciao, Mondo!", + "Help": "Aiuto", + "Hide blocks in palette": "Nascondi i blocchi nell'elenco dei blocchi", + "Hide blocks...": "Nascondi blocchi...", + "Hmm...": "Uhm...", + "Hummingbird robotics": "Kit robotico Hummingbird", + "Hyper blocks support": "Supporto Iperblocchi", + "I have read and agree to the Terms of Service": "Ho letto e accetto i Termini di Servizio", + "If you cannot find that email, please check your spam folder.": "Se non trovi la mail, controlla la tua cartella della spam.", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "Se ancora non riesci a trovarla, Usa l'opzione \"Invia di nuovo Email di Verifica...\" nel menu cloud.", + "Import": "Importa", + "Import a new costume from your webcam": "Scatta una foto con la webcam", + "Import blocks": "Importa blocchi", + "Import library": "Importa modulo", + "Import sound": "Importa suono", + "Import...": "Importa...", + "Imported": "Importato", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "Incorpora le librerie precedenti per i colori pastello e RGB. Implementa tonalità equilibrate (più arancio, meno verde, aggiungi marrone) e una scala di colori lineare che include scale di grigi e sfumature basate su tonalità equilibrate", + "Infinite precision integers, exact rationals, complex": "Interi a precisione arbitraria, razionali esatti, complessi", + "Inheritance support": "Supporto ereditarietà degli sprite", + "Input Names:": "Con Variabili:", + "Input Slot Options": "Opzioni Parametro", + "Input name": "Parametro", + "Input sliders": "Usa cursore per i parametri", + "Inside a custom block": "All'interno di un nuovo blocco", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "Interagisce con dispositivi MicroBlocks via WiFi. Richiede che il dispositivo sia dotato di un display TFT, due pulsanti e di WiFi, e che il progetto Signada MicroBlocks sia stato caricato. La Citilab ED1 e alcune schede M5Stack sono alcuni dei dispositivi che funzionano con Signada.", + "Iteration, composition": "Iterazione, composizione", + "JIT compiler support": "Supporto compilatore JIT", + "January": "Gennaio", + "JavaScript extensions": "Estensioni JavaScript", + "JavaScript extensions for Snap! are turned off": "Le estensioni JavaScript per Snap! sono disabilitate", + "JavaScript function ( _ ) { _ }": "funzione JavaScript ( _ ) { _ }", + "July": "Luglio", + "June": "Giugno", + "Just the crayons, without the rest of the colors library. Fast and simple.": "Solo i pastelli, senza il resto della libreria dei colori. Semplice e veloce.", + "Keyboard Editing": "Modifica della tastiera", + "Kind of": "Tipo di", + "LEAP Motion controller": "Controller LEAP Motion", + "Language...": "Lingua...", + "Libraries...": "Modulo...", + "License": "Licenza", + "License...": "Licenza...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "Come \"switch\" nei linguaggi tipo C o \"cond\" in Lisp. Grazie a Nathan Dinsmore per inventare l'idea di avere blocchi separati per ogni singolo ramo!", + "Line tool (shift: constrain to 45º)": "Strumento Linea (shift: linee a 45º)", + "Line tool (shift: constrain to 45º)": "Strumento Linea (shift: linee a 45°)", + "Line tool (shift: vertical/horizontal)": "Strumento Linea (shift: verticale/orizzontale)", + "List": "Lista", + "List utilities": "Operazioni su liste", + "Lists": "Liste", + "Live coding support": "Supporto al live coding", + "Loading": "Caricamento in corso", + "Local Block(s) in Global Definition": "Blocchi Locali in Definizione Globale", + "Log pen vectors": "Log dei vettori della penna", + "Login...": "Accedi...", + "Logout": "Esci...", + "Long form input dialog": "Usa finestra degli input estesa", + "Looks": "Aspetto", + "Make a block": "Crea un blocco", + "Make a variable": "Nuova variabile", + "Manipulate costumes pixel-wise.": "Manipola i costumi pixel per pixel", + "March": "Marzo", + "May": "Maggio", + "Message name": "Nome messaggio", + "Method Editor": "Editor di Metodi", + "Microphone": "microfono", + "Microphone resolution...": "Risoluzione microfono...", + "Modules...": "Moduli...", + "Motion": "Movimento", + "Multi-branched conditional": "Condizioni ramificate ", + "Multi-branched conditional (switch)": "Condizioni ramificate (switch)", + "Multiple inputs (value is list of inputs)": "Molti valori (il valore è una lista di argomenti)", + "Nested auto-wrapping": "Autowrapping annidato", + "New": "Nuovo", + "New Category": "Nuova Categoria", + "New Project": "Nuovo Progetto", + "New category...": "Nuova categoria...", + "New password:": "Nuova password:", + "New scene": "Nuova scena", + "No": "No", + "November": "Novembre", + "Number": "Numero", + "OK": "OK", + "Object": "Oggetto", + "October": "Ottobre", + "Ok": "Ok", + "Old password:": "Password precedente:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "Una delle grandi idee del Logo che è stata lasciata fuori da Scratch è quella di pensare al testo come strutturato in parole e frasi, invece che solo come una sequenza di caratteri. Questa libreria recupera questa idea.", + "Open": "Apri", + "Open Project": "Apri Progetto", + "Open in Community Site": "Apri nel Sito di Snap", + "Open...": "Apri...", + "Opening project...": "Apertura del progetto in corso...", + "Operators": "Operatori", + "Other": "Altro", + "Output text using speech synthesis.": "Pronuncia il testo usando un sintetizzatore", + "Paint Editor": "Editor di Immagini", + "Paint a new costume": "Disegna un nuovo costume", + "Paint a shape (shift: edge color)": "Colora una forma (shift: colore del bordo)", + "Paint a shape (shift: secondary color)": "Colora una forma (shift: colore secondario)", + "Paintbrush tool (free draw)": "Pennello (disegno a mano libera)", + "Parallelization": "Parallelizzazione", + "Part of": "Parte di", + "Parts": "Parti", + "Password:": "Password:", + "Pen": "Penna", + "Persist linked sublist IDs": "Mantieni gli ID delle liste linkate", + "Persistent key-value storage across Snap! sessions in the same browser": "Memorizzazione persistente di chiavi-valori in diverse sessioni di Snap! nello stesso browser", + "Pipette tool (pick a color anywhere)": "Contagocce (seleziona un colore)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Contagocce (seleziona un colore shift: colore di riempimento)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Contagocce (seleziona un colore shift: colore secondario)", + "Pixels": "Pixel", + "Plain prototype labels": "Etichetta prototipo base", + "Play": "Riproduci", + "Play sound": "Riproduci questo suono", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Assicurati che il tuo browser sia aggiornato e che la webcam sia correttamente configurata. Alcuni browser richiedono di accedere a Snap! via HTTPS per usare la webcam. Sostituisci nel suo browser la parte \"http://\" con \"https://\" e riprova.", + "Please use the verification link that was sent to your email address when you signed up.": "Usa il link di verifica che è stato inviato alla tua casella di e-mail quando ti sei iscritto.", + "Polygon": "Poligono", + "Predicate": "Condizione", + "Prefer empty slot drops": "Favorisci l'aggancio a slot vuoti", + "Privacy...": "Privacy...", + "Project Notes": "Note di Progetto", + "Project URLs": "URL dei Progetto", + "Project notes...": "Note di Progetto...", + "Provide 100 selected colors": "100 colori", + "Provide getters and setters for all GUI-controlled global settings": "Accesso e modifica a tutte le impostazioni controllate dalla GUI", + "Publish": "Pubblica", + "Publish Project": "Pubblica Progetto", + "Rasterize SVGs": "Rasterizza SVG", + "Record a new sound": "Registra un suono", + "Recover": "Recupero", + "Rectangle (shift: square)": "Rettangolo (shift: quadrato)", + "Reference manual": "Manuale", + "Remove a category...": "Rimuovi una categoria...", + "Remove unused blocks": "Rimuovi blocchi inutilizzati", + "Repeat Password:": "Ripeti Password:", + "Repeat new password:": "Ripeti la nuova password:", + "Replace Project": "Sostituisci Progetto", + "Replace the current project with a new one?": "Vuoi sostituire il progetto attuale con uno nuovo?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Restituisce la posizione della mano dal Controller LEAP Motion (leapmotion.com).", + "Reporter": "Monitor", + "Request blocked": "Richiesta bloccata:", + "Resend Verification Email...": "Invia di nuovo Email di Verifica...", + "Resend verification email": "Invia di nuovo email di Verifica...", + "Reset Password...": "Azzera Password...", + "Reset password": "Azzera password", + "Restore unsaved project": "Ripristina progetto non salvato", + "Retina display support": "Supporto schermo Retina", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Esegui uno script; se si verifica un errore, invece di arrestare lo script con un bordo rosso, esegue un altro script per gestire l'errore. Include anche un blocco per generare un errore con un messaggio fornito come argomento. Include anche un blocco per creare una variabile dello script e assegnarle un valore.", + "Run several scripts in parallel and wait until all are done.": "Esegue diversi script in parallelo e attende che tutti siano terminati.", + "SVG costumes are not yet fully supported in every browser": "I costumi SVG non sono completamente supportati in tutti i browser", + "Same Named Blocks": "Blocchi Omonimi", + "Save": "Salva", + "Save As...": "Salva con nome...", + "Save Project": "Salva Progetto", + "Save Project As...": "Salva Progetto Come...", + "Save to disk": "Salva su disco", + "Saved!": "Salvato!", + "Saving project to the cloud...": "Salvataggio del progetto nel cloud...", + "Scenes...": "Scene...", + "Script variable name": "Nome della variabile locale?", + "Scripts": "Script", + "Select a costume from the media library": "Seleziona un costume dalla libreria dei media", + "Select a sound from the media library": "Seleziona un suono dalla libreria dei media", + "Select categories of additional blocks to add to this project.": "Seleziona le categorie di blocchi addizionali da aggiungere al progetto.", + "Selection tool": "Selezione", + "Sensing": "Sensori", + "September": "Settembre", + "Serial Ports": "Porte Seriali", + "Service:": "Servizio", + "Set RGB or HSV pen color": "Colori della penna RGB o HSV", + "Set the rotation center": "Imposta il centro di rotazione", + "Share": "Condividi", + "Share Project": "Condividi Progetto", + "Show buttons": "Mostra pulsanti", + "Show categories": "Mostra categorie", + "Sign in": "Accedi", + "Sign up": "Registrati", + "Signada (Network remote control)": "Signada (Controllo remoto di rete)", + "Signup": "Registrati", + "Signup...": "Registrati...", + "Single input.": "Un solo valore.", + "Single palette": "Elenco dei blocchi continuo", + "Slider maximum value": "Valore massimo del cursore", + "Slider minimum value": "Valore minimo del cursore", + "Snap! website": "Sito web di Snap!", + "Snap!Cloud": "Snap!Cloud", + "Some standard functions on lists (reverse, sort, etc.)": "Alcune funzioni standard per le liste (inverti, ordina, etc.)", + "Sound": "Suono", + "Sound Recorder": "Registratori di Suoni", + "Sounds": "Suoni", + "Sprite": "Sprite", + "Sprite Nesting": "Annidamento degli Sprite", + "Stage": "Stage", + "Stage height": "Altezza Stage", + "Stage selected: no motion primitives": "Stage selezionato: Nessun blocco per il movimento", + "Stage size": "Dimensioni Stage", + "Stage size...": "Dimensioni Stage...", + "Stage width": "Larghezza Stage", + "Stop": "Ferma", + "Stop sound": "Ferma il suono", + "Streams (lazy lists)": "Stream (liste rilasciate)", + "Strings, Multi-line input": "Stringhe, argomento multilinea", + "Stroked Ellipse (shift: circle)": "Ellisse (shift: cerchio)", + "Stroked Rectangle (shift: square)": "Rettangolo (shift: quadrato)", + "Switch back to user mode": "Torna alla modalità utente", + "Switch to dev mode": "Passa alla modalità sviluppo", + "Switch to vector editor?": "Vuoi passare all'editor vettoriale?", + "Table lines": "Tabelle con linee", + "Table support": "Supporto per le tabelle", + "Table view": "Vista tabella", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "Parte da una tabella (tipicamente sotto forma di CSV) e restituisce un sommario della tabella raggruppata secondo il campo corrisponde al numero di colonna indicato. I restanti tre argomenti vengono usati solo se i valori dei campi sono numeri, nel qual caso possono essere raggruppati in fasce (ad es. decadi, secoli, ecc.). Questi tre argomenti definiscono il valore minimo e massimo a cui siamo interessati e, soprattutto, la dimensione della fascia (10 per le decadi, 100 per i secoli). Se il campo non è numerico, lascia questi tre argomenti vuoti, o assegnagli il valore zero. In questo caso, ogni valore di testo si troverà in una sua diversa fascia e appariranno ordinati in ordine alfabetico. Il blocco restituisce una nuova tabella con tre colonne. La prima colonna contiene il nome della fascia o il valore più piccolo. La seconda colonna contiene un numero intero non negativo che indica quante righe della tabella originale ricadono in questa fascia. La terza colonna è una sottotabella contenente le righe della tabella originale che rientrano in quella fascia. Se le fasce che ti interessano non sono tutte della stessa misura, o vuoi raggruppare i valori secondo criteri che dipendono da più di un campo, usa la libreria \"Analisi di Distribuzione delle Frequenze\".", + "Terms of Service...": "Termini di Servizio", + "Ternary Boolean slots": "Argomenti Booleani Ternari", + "Text": "Testo", + "Text Costumes": "Costumi Testo", + "Text to Speech": "Da Testo a Voce", + "Text to speech": "Da testo a voce", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "La gerarchia completa di tipi numerici del linguaggio Scheme. \"USA NUMERI A PRECISIONE INFINITA \" per abilitarlo.", + "The question came up at": "La domanda è sorta a", + "This global block definition contains one or more local custom blocks which must be removed first.": "Questa definizione di un blocco globale contiene uno o più nuovi blocchi che devono essere prima rimossi.", + "This will convert your vector objects into bitmaps,": "Gli elementi vettoriali verranno convertiti in bitmap", + "This will erase your current drawing.": "Il tuo disegno attuale verrà cancellato.", + "Thread safe scripts": "Script interrompibili", + "Title text": "Parole della definizione", + "Today": "Oggi", + "Today,": "Oggi,", + "Top": "In alto", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Strutture cicliche tradizionali (mentre, fino a che, ecc.)", + "Translations": "Traduzioni", + "Translators...": "Traduttori", + "Turbo mode": "Modalità Turbo", + "Turtle": "Tartaruga", + "Undelete sprites...": "Ripristina sprite...", + "Unpublish": "Non pubblicare", + "Unpublish Project": "Non pubblicare il Progetto", + "Unsaved Changes!": "Ci sono modifiche non salvate!", + "Unshare": "Non condividere", + "Unshare Project": "Non condividere il Progetto", + "Untitled": "Senza Titolo", + "Unused blocks...": "Blocchi inutilizzati...", + "Unverified account:": "Account non verificato:", + "Up": "Su", + "Updating project list...": "Aggiornamento lista dei progetti...", + "Uploading": "Caricamento in corso", + "Upvar - make internal variable visible to caller": "Rendi il parametro visibile all'esterno", + "Use CPU for graphics": "Usa la CPU per la grafica", + "User name must be four characters or longer": "Lo username deve essere di almeno quattro caratteri", + "User name:": "Username:", + "Variable name": "Nome della variabile?", + "Variables": "Variabili", + "Variadic reporters": "Monitor con argomenti variabili", + "Vector": "Immagine vettoriale", + "Vector Paint Editor": "Editor di Immagini Vettoriale", + "Versions of +, x, AND, and OR that take more than two inputs.": "Versioni di +, x, E, e O che accettano più di due argomenti.", + "Visible stepping": "Esecuzione passo-passo", + "Web Audio API is not supported in this browser": "L'API Web Audio non è supportata da questo browser", + "Web services access (https)": "Accesso ai servizi web (https)", + "Words, sentences": "Parole, frasi", + "World Map": "Mappamondo", + "World...": "Mondo...", + "Would you like to replace it?": "Vuoi rimpiazzarlo?", + "Yes": "Si", + "Yesterday": "Ieri", + "Yesterday,": "Ieri,", + "You are not logged in": "Non sei collegato", + "You are now logged in, and your account is enabled for three days.": "Ora sei collegato, il tuo account risulterà attivo per tre giorni.", + "You have": "Hai", + "Zebra coloring": "Colorazione alternata", + "Zoom blocks": "Zoom dei blocchi", + "Zoom blocks...": "Zoom dei blocchi...", + "_ at _": "_ alla posizione di _", + "_ combine _ using _": "_ combina elementi di _ usando _", + "_ contains _": "_ contiene _", + "_ effect": "effetto _", + "_ find first item _ in _": "_ trova il primo elemento _ di _", + "_ in front of _": "_ davanti a _", + "_ keep items _ from _": "_ seleziona elementi _ in _", + "_ map _ over _": "_ applica _ su _", + "_ mod _": "resto della divisione di _ diviso _", + "_ of _": "_ di _", + "_ of block _": "_ del blocco _", + "_ of costume _": "_ del costume _", + "_ of sound _": "_ del suono _", + "_ of text _": "_ del testo _", + "_ to _": "_ da _", + "__shout__go__": "cliccata bandiera verde", + "a": "a", + "a custom block definition is missing": "manca la definizione di un nuovo blocco", + "a new clone of _": "un nuovo clone di _", + "a variable of name '": "una variabile chiamata '", + "about morphic.js...": "info su morphic.js...", + "abs": "valore assoluto", + "acos": "acos", + "add _ to _": "aggiungi _ a _", + "add a new Turtle sprite": "aggiungi un nuovo sprite Tartaruga", + "add a new sprite": "aggiungi un nuovo sprite", + "add comment": "aggiungi un commento", + "add comment here...": "aggiunto un commento qui...", + "agent": "agente", + "alert _": "avviso: _", + "all": "tutti", + "all <": "tutti <", + "all =": "tutti =", + "all >": "tutti >", + "all but first of _": "tutto meno il primo elemento di _", + "all but this script": "tutto tranne questo script", + "all identical": "tutti identici", + "all scenes": "tutte le scene", + "all ≤": "tutti ≤", + "all ≥": "tutti ≥", + "alpha value:": "valore alpha", + "anchor": "ancoraggio", + "and": "e", + "and send": "e invia", + "and you will not be able to convert them back into vector drawings.": "e non sarà possibile riconvertirli in disegni vettoriali", + "animation demo": "demo animazione", + "answer": "risposta", + "any": "qualunque", + "any key": "qualsiasi tasto", + "any message": "qualunque messaggio", + "anything": "qualunque sprite", + "append _": "unisci _", + "arrange scripts vertically": "riordina gli script uno sotto l'altro", + "arrowDown": "frecciaGiù", + "arrowDownOutline": "frecciaGiùContorno", + "arrowLeft": "frecciaSinistra", + "arrowLeftOutline": "frecciaSinistraContorno", + "arrowRight": "frecciaDestra", + "arrowRightOutline": "frecciaDestraContorno", + "arrowUp": "frecciaSu", + "arrowUpOutline": "frecciaSuContorno", + "asin": "asen", + "ask _ and wait": "chiedi _ e attendi", + "ask _ for _ _": "chiedi a _ il valore di _ _", + "atan": "atan", + "attach...": "attacca a...", + "b": "b", + "back": "secondo", + "balance": "bilanciamento", + "big (2x)": "grandi (2x)", + "bigger menu fonts and sliders": "caratteri dei menu e cursori più grandi", + "bins": "cestini", + "block": "blocco", + "block deletion dialog text": "Sei sicuro di voler cancellare questo blocco e tutte le sue occorrenze?", + "block variables": "variabili del blocco", + "block variables...": "variabili del blocco...", + "block-solid (0)": "nessuna (0)", + "blockify": "crea blocco", + "blocks": "blocco", + "blue": "blu", + "blurred shadows...": "ombreggiature attenuate...", + "blurry shades, use for new browsers": "ombreggiature attenuate, disponibile nei nuovi browser", + "bottom": "estremo inferiore", + "box": "rettangolo", + "brightness": "luminosità", + "broadcast _ _": "invia _ _", + "broadcast _ _ and wait": "invia _ _ e attendi", + "brush": "pennello", + "build": "costruisci", + "but getting a": "ma ottenuto un", + "c": "c", + "call _ _": "chiama _ _", + "call _ w/continuation": "chiama _ con continuazione", + "caller": "sprite chiamante", + "camera": "webcam", + "can only write text or numbers, not a": "può solo scrivere testo o numeri, non un", + "can rotate": "può ruotare", + "cannot handle zero width or height": "non può usare larghezza o altezza nulle", + "cannot operate on a deleted sprite": "non può agire su uno sprite rimosso", + "cannot send media, sprites or procedures to another scene": "non può inviare media, sprite o procedure ad un'altra scena", + "case sensitivity": "sensibile alle maiuscole", + "categories": "categorie", + "category": "categoria", + "ceiling": "intero superiore", + "center": "centro dello Stage", + "center x": "x del centro", + "center y": "y del centro", + "change _ by _": "cambia _ di _", + "change _ effect by _": "cambia effetto _ di _", + "change background _ by _": "cambia _ sfondo di _", + "change balance by _": "cambia bilanciamento di _", + "change pen _ by _": "cambia _ della penna di _", + "change pen color by _": "cambia colore penna di _", + "change pen shade by _": "cambia tonalità penna di _", + "change pen size by _": "cambia dimensione penna di _", + "change size by _": "cambia dimensione di _", + "change tempo by _": "cambia tempo di _", + "change volume by _": "cambia volume di _", + "change x by _": "cambia x di _", + "change y by _": "cambia y di _", + "check for alternative GUI design": "abilita per GUI alternativa", + "check for block to text mapping features": "abilita per aggiungere la conversione da blocchi a testo", + "check for flat ends of lines": "abilita per estremità delle linee squadrata", + "check for higher contrast table views": "abilita per tabelle ad alto contrasto", + "check for higher resolution, uses more computing resources": "abilita per alta risoluzione, usa maggiori risorse di calcolo", + "check for multi-column list view support": "abilita per supporto alla visualizzazione di tabelle multi-colonna", + "check for sprite inheritance features": "abilita per attivare l'ereditarietà degli sprite", + "check to allow empty Boolean slots": "abilita per consentire argomenti Booleani vuoti", + "check to always show slot types in the input dialog": "abilita per mostrare sempre i tipi degli slot nella finestra di creazione degli input", + "check to cache inputs boosts recursion": "abilita per salvare gli argomenti in cache velocizzando la ricorsione", + "check to disable directly running blocks by clicking on them": "abilita per non eseguire direttamente i blocchi cliccandoli", + "check to disallow script reentrance": "abilita per impedire di interrompere gli script", + "check to distinguish upper- and lowercase when comparing texts": "abilita per distinguere tra maiuscole e minuscole quando si confrontano due stringhe", + "check to enable IDE animations": "abilita per consentire le animazioni dell'IDE", + "check to enable alternating colors for nested blocks": "abilita per visualizzare i blocchi annidati a colori alternati", + "check to enable auto-wrapping inside nested block stacks": "abilita per consentire l'accapo automatico anche nelle pile di blocchi annidati", + "check to enable camera support": "abilita per attivare il supporto della webcam", + "check to enable dropping commands in all rings": "abilita per consentire l'inserimento di comandi in tutti gli anelli", + "check to enable dynamic labels for variadic inputs": "abilitare per avere etichette dinamiche per input variabili", + "check to enable input sliders for entry fields": "abilitare per visualizzare i cursori per inserire valori numerici", + "check to enable keyboard editing support": "abilita per consentire la modifica degli script tramite la tastiera", + "check to enable project data in URLs": "abilita per consentire la presenza del codice XML dei progetti negli URL", + "check to enable saving linked sublist identities": "abilita per consentire il salvataggio delle identità delle sottoliste collegate", + "check to enable sprite composition": "abilita per attivare la composizione di sprite", + "check to enable support for first-class sprite": "abilita per rendere gli sprite oggetti di prima classe", + "check to enable using operators on lists and tables": "abilita per usare gli operatori su liste e tabelle", + "check to hide (+) symbols in block prototype labels": "abilita per non mostrare i segni (+) nelle etichette dei blocchi prototipo", + "check to inherit from": "abilita per consentire l'ereditarietà", + "check to prevent contents from being saved": "abilita per prevenire il salvataggio dei contenuti", + "check to prioritize script execution": "abilita per dare priorità all'esecuzione degli script", + "check to rasterize SVGs on import": "abilita per convertire in bitmap le immagini SVG durante l'importazione", + "check to run the edited script when moving the slider": "abilita per eseguire gli script modificati quando si spostano i cursori", + "check to show all blocks in a single palette": "abilita per mostrare tutti i blocchi in un'unica lista", + "check to show buttons in the palette": "abilita per mostrare i pulsanti nell'elenco dei blocchi", + "check to show category names in the palette": "abilitare per mostrare i nomi delle categorie nell'elenco dei blocchi", + "check to show extension primitives in the palette": "abilitare per mostrare le primitive delle estensioni nell'elenco dei blocchi", + "check to show in palette": "abilita per mostrare nell'elenco dei blocchi", + "check to support native JavaScript functions": "abilita per attivare il supporto delle funzioni JavaScript native", + "check to switch pen colors and graphic effects to HSL": "disabilita per passare a colori della penna e effetti grafici HSL", + "check to turn block clicking sound on": "abilita per riprodurre il suono di aggancio dei blocchi", + "check to turn on logging pen vectors": "abilitare per registrare i vettori della penna", + "check to turn on visible stepping (slow)": "abilitare per mostrare l'esecuzione passo passo (lenta)", + "check to use blurred drop shadows and highlights": "abilita per visualizzare ombreggiature ed evidenziature attenuate", + "children": "figli", + "choose another color for this morph": "scegli un altro colore per questo elemento", + "choose the World's background color": "scegli il colore di sfondo del Mondo", + "circle": "cerchio", + "circle box": "rettangolo cerchio", + "circleSolid": "cerchioSolido", + "clean up": "riordina", + "clear": "pulisci", + "clear graphic effects": "rimuovi effetti grafici", + "clear undrop queue": "svuota coda degli inserimenti negli argomenti", + "click or drag crosshairs to move the rotation center": "clicca o trascina il mirino per spostare il centro di rotazione", + "clicked": "cliccato", + "clone": "clona", + "clones": "cloni", + "closedBrush": "pennelloChiuso", + "cloud": "cloud", + "cloud unavailable without a web server.": "il cloud non è disponibile se si usa Snap locale", + "cloudGradient": "cloudGradiente", + "cloudOutline": "cloudContorno", + "code": "codice", + "code mapping...": "conversione del codice...", + "code of _": "codice di _", + "collection": "collezione", + "color": "colore", + "color _ is touching _ ?": "il colore _ sta toccando il colore _", + "color palette": "tavolozza dei colori", + "color picker": "contagocce", + "color...": "color...", + "color:": "colore:", + "columns": "colonne", + "combinations _": "combinazioni _", + "combine _ using _": "combina elementi di _ usando _", + "comic": "fumetto", + "command": "comando", + "comment pic...": "immagine commento...", + "compile": "compila", + "compile _": "compila _", + "compile _ for _ args": "compila _ per argomenti _", + "confetti": "coriandoli", + "console log _": "console log: _", + "continuation": "continuazione", + "continuations cannot be forked": "le continuazioni non possono essere divise", + "cos": "cos", + "costume": "costume", + "costume #": "numero costume", + "costume name": "nome costume", + "costumes": "costumi", + "costumes tab help": "Importa un'immagine da una pagina web o da un file sul tuo computer trascinandolo qui", + "could not connect to:": "impossibile collegarsi a:", + "cr": "accapo", + "create a clone of _": "crea un clone di _", + "cross": "croce", + "crosshairs": "mirino", + "current": "attuale", + "current _": "_ attuale", + "current module versions:": "versione attuale dei moduli:", + "current parent": "genitore attuale", + "custom?": "è nuovo", + "cut from _": "ritaglia da _", + "d": "d", + "dangling?": "è appeso", + "data": "dati", + "date": "giorno", + "day of week": "giorno della settimana", + "days left": "giorni rimasti", + "days left.": "giorni rimasti.", + "defaults": "valori predefiniti", + "define _ _ _": "definisci _ _ _", + "definition": "definizione", + "delete": "cancella", + "delete _": "cancella _", + "delete _ of _": "cancella _ da _", + "delete a category...": "rimuovi una categoria...", + "delete block _": "rimuovi blocco _", + "delete block definition...": "cancella la definizione del blocco...", + "delete slot": "rimuovi parametro", + "delete this clone": "elimina questo clone", + "delete variable": "cancella variabile", + "delimiter": "delimitatore", + "demo (1.2x)": "demo (1.2x)", + "demo...": "demo...", + "detach all parts": "separa tutte le parti", + "detach and put into the hand": "separa e attacca al puntatore", + "detach from": "separa da", + "development mode": "modalità sviluppo", + "development mode debugging primitives:": "comandi di debug delle modalità sviluppo", + "development mode...": "modalità sviluppo...", + "dimensions": "dimensioni", + "direction": "direzione", + "disable deep-Morphic context menus and show user-friendly ones": "disabilita i menu contestuali di Morphic e mostra quelli user-friendly", + "disable developers' context menus": "disabilita i menu contestuali per sviluppatori", + "disable dragging media and blocks out of watchers and balloons": "disabilita trascinamento dei media e dei blocchi fuori dai monitor e dai fumetti", + "disconnected.": "disconnesso.", + "distance": "distanza", + "distance to _": "distanza da _", + "distribution": "distribuzione", + "don't rotate": "non ruotare", + "down arrow": "freccia giù", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "scarica e salva un sommario del progetto con ombreggiature su tutte le immagini. non supportato da tutti i browser", + "download script": "scarica script", + "download this script as an XML file": "scarica questo script come file XML", + "draggable": "trascinabile", + "draggable?": "è trascinabile", + "dragging threshold": "soglia trascinamento", + "dropped": "lasciato", + "duplicate": "duplica", + "duplicate block definition...": "duplica la definizione del blocco...", + "duration": "durata", + "e": "e", + "e^": "e^", + "edge": "bordo", + "edit": "modifica", + "edit rotation point only...": "modifica soltanto centro di rotazione...", + "edit the costume's rotation center": "cambia il centro di rotazione del costume", + "edit...": "modifica...", + "editables": "valori modificabili", + "elegant (90)": "elegante (90)", + "enable Morphic context menus and inspectors, not user-friendly!": "abilita i menu contestuali di Morphic e gli inspector, non user-friendly!", + "enable directly running blocks by clicking on them": "abilita esecuzione diretta dei blocchi cliccandoli", + "enter": "invio", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "modalità di sviluppo. intercettazione degli errori disattivata, usa la console del browser per visualizzare i messaggi di errore.", + "entering user mode": "modalità utente", + "eraser": "gomma", + "exceeding maximum number of clones": "numero massimo di cloni superato", + "expecting": "in attesa di", + "expecting a": "in attesa di un", + "expecting a finite number but getting Infinity or NaN": "in attesa di un numero finito ma ricevuto invece Infinito o NaN", + "experimental - under construction": "sperimentale - in costruzione", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "sperimentale! rende questo monitor veloce e non interrompibile ATTENZIONE: Errori nell'anello possono bloccare la tua sessione Snap!", + "export": "esporta", + "export block definition...": "esporta la definizione del blocco...", + "export pen trails line segments as SVG": "esporta i tratti della penna come SVG", + "export project as cloud data...": "esporta il progetto come dati cloud...", + "export project media only...": "esporta solo i media del progetto...", + "export project without media...": "esporta il progetto senza i media...", + "export script": "esporta script", + "export...": "esporta...", + "extract": "estrai", + "f": "f", + "false": "falso", + "file": "file", + "file menu import hint": "carica un file di progetto, una libreria di blocchi, un costume o un suono esportati. Non supportato da tutti i browser", + "fill": "riempi", + "fill page...": "riempi la pagina...", + "filtered for _": "selezionati per colore _", + "find blocks": "trova blocchi", + "find blocks...": "trova blocchi...", + "find first item _ in _": "trova il primo elemento _ di _", + "find unused global custom blocks and remove their definitions": "trova i nuovi blocchi non utilizzati e rimuove le loro definizioni", + "fisheye": "fisheye", + "flag": "bandiera", + "flash": "flash", + "flat line ends": "terminazione piatta delle linee", + "flatten": "appiattimento", + "flip ↔": "inverti ↔", + "flip ↕": "inverti ↕", + "floor": "intero superiore", + "footprints": "impronte", + "for _ = _ to _ _": "per _ = _ a _ _", + "for all sprites": "per tutti gli sprite", + "for each _ in _ _": "per ogni _ di _ _", + "for this sprite only": "solo per questo sprite", + "forever _": "per sempre _", + "frame": "fotogramma", + "frames": "fotogrammi", + "frequencies": "frequenze", + "frequency": "frequenza", + "front": "primo", + "fullScreen": "schermo intero", + "g": "g", + "gears": "ingranaggi", + "get blocks": "ottieni i blocchi", + "get data": "ottieni i dati", + "ghost": "fantasma", + "giant (8x)": "giganti (8x)", + "glide _ secs to x: _ y: _": "scivola in _ secondi a x: _ y: _", + "global?": "è globale", + "globe": "globo", + "go back _ layers": "vai indietro di _ livelli", + "go to _": "raggiungi _", + "go to _ layer": "vai in _ piano", + "go to x: _ y: _": "vai a x: _ y: _", + "gray scale palette": "tavolozza scala di grigi", + "green": "verde", + "grow": "ingrandisci", + "h": "h", + "handle": "maniglia", + "header": "intestazione", + "header mapping...": "conversione intestazione", + "height": "altezza", + "hello": "ciao", + "help": "aiuto", + "help...": "aiuto...", + "hide": "nascondi", + "hide all...": "nascondi tutto...", + "hide blocks...": "nascondi blocchi...", + "hide variable _": "nascondi variabile _", + "high": "alto", + "hour": "ora", + "http:// _": "leggi pagina web http:// _", + "hue": "tonalità", + "huge (4x)": "molto grandi (4x)", + "i": "i", + "identical to": "è identico a", + "if _ _": "se _ _", + "if _ _ else _": "se _ _ altrimenti _", + "if _ then _ else _": "se _ allora _ altrimenti _", + "if on edge, bounce": "rimbalza quando tocchi il bordo", + "import a sound from your computer by dragging it into here": "importa un suono dal tuo computer trascinandolo qui", + "import without attempting to parse or format data": "importa i dati senza elaborarli o formattarli", + "import...": "importa...", + "in palette": "nell'elenco dei blocchi", + "including dependencies": "incluse le dipendenze", + "index": "posizione", + "index of _ in _": "posizione di _ in _", + "inherit _": "eredita _", + "inherited": "ereditato", + "input list:": "con liste:", + "input names:": "con variabili:", + "input(s), but getting": "argomento/i, ma ottenuto", + "inputs": "parametri", + "insert _ at _ of _": "inserisci _ alla posizione _ di _", + "insert a slot": "inserisci un parametro", + "insert a variable": "inserisci una variabile", + "inspect...": "ispeziona...", + "is _ ?": "_ ?", + "is _ a _ ?": "_ è di tipo _", + "is _ empty?": "_ è vuota", + "is _ identical to _ ?": "_ è identico a _", + "is _ on?": "_ è attivo", + "is not a valid option": "non è un'opzione valida", + "is read-only": "è di sola lettura", + "item": "elemento", + "item _ of _": "elemento _ di _", + "items": "elementi", + "j": "j", + "join _": "unione di _", + "jukebox": "elenco dei suoni", + "k": "k", + "keep all submorphs within and visible": "mantieni tutti gli elementi all'interno e visibili", + "keep items _ from _": "seleziona elementi _ in _", + "key": "tasto", + "key _ pressed?": "tasto _ premuto", + "keyboard": "tastiera", + "keyboardFilled": "tastieraRiempita", + "l": "l", + "label": "etichetta", + "language_name": "Italiano", + "language_translator": "Stefano Federici, Alice Andrea Deiana, Alberto Firpo, Massimo Ghisalberti", + "large": "grande", + "last": "ultimo", + "last changed": "ultimo cambiamento", + "last_changed": "2023-11-04", + "launch _ _": "lancia _ _", + "left": "estremo sinistro", + "left arrow": "freccia sinistra", + "length": "lunghezza", + "length of _": "lunghezza di _", + "length:": "lunghezza:", + "let the World automatically adjust to browser resizing": "permette al Mondo di adattarsi automaticamente quando il browser viene ridimensionato", + "letter": "lettera", + "letter _ of _": "lettera in posizione _ di _", + "light (70)": "leggera (70)", + "lightness": "luminosità", + "line": "riga", + "lines": "linee", + "list": "lista", + "list _": "lista _", + "list view...": "vista lista...", + "ln": "ln", + "location": "posizione", + "lock": "blocca", + "log pen vectors": "registrazione vettori della penna", + "login": "accedi", + "loop": "ciclo", + "low": "basso", + "lower case": "minuscolo", + "m": "m", + "magnifierOutline": "lenteContorno", + "magnifyingGlass": "lenteIngrandimento", + "make a block...": "crea un blocco...", + "make a category...": "crea una categoria...", + "make a copy and pick it up": "crea una copia", + "make a morph": "crea un elemento", + "make temporary and hide in the sprite corral": "rendi temporaneo e nascondi nell'area degli sprite", + "make this morph movable": "rendi questo elemento riposizionabile", + "make this morph unmovable": "rendi questo elemento non riposizionabile", + "map String to code _": "converti Stringa in codice _", + "map _ of _ to code _": "converti _ di _ in codice _", + "map _ over _": "applica _ su _", + "map _ to _ _": "converti _ a _ _", + "max": "massimo", + "maximum": "massimo", + "medium (50)": "media (50)", + "menus": "menu", + "message": "messaggio", + "microphone _": "_ del microfono", + "middle": "centro", + "minimum": "minimo", + "minute": "minuto", + "mirror video": "video riflesso", + "missing / unspecified extension": "estensione mancante / non specificata", + "monstrous (10x)": "grandissimi (10x)", + "month": "mese", + "mosaic": "mosaico", + "motion": "movimento", + "mouse down?": "pulsante del mouse premuto", + "mouse position": "posizione del mouse", + "mouse x": "x del mouse", + "mouse y": "y del mouse", + "mouse-departed": "non a contatto con il mouse", + "mouse-entered": "a contatto con il mouse", + "mouse-pointer": "puntatore del mouse", + "move": "sposta", + "move _ steps": "fai _ passi", + "move all inside...": "sposta tutto dentro...", + "move...": "sposta...", + "my": "attributo", + "my _": "attributo _", + "my anchor": "ancora", + "my dangling?": "appeso", + "my draggable?": "trascinabile", + "my name": "nome", + "my parent": "genitore", + "my rotation style": "stile di rotazione", + "my rotation x": "rotazione x", + "my rotation y": "rotazione y", + "my temporary?": "temporaneo", + "myself": "me stesso", + "n": "n", + "name": "nome", + "neg": "opposto", + "negative": "negativo", + "neighbors": "vicini", + "neighbors ≠": "vicini ≠ da", + "new costume _ width _ height _": "nuovo costume _ larghezza _ altezza _", + "new line": "nuova linea", + "new sound _ rate _ Hz": "nuovo suono _ frequenza _ Hz", + "new...": "nuovo...", + "next": "successiva", + "next costume": "passa al costume seguente", + "none": "nessuno", + "normal": "normale", + "normal (1x)": "normale (1x)", + "normalScreen": "schermoNormale", + "normalStage": "stageNormale", + "not": "non", + "not _": "non _", + "note": "nota", + "nothing": "nulla", + "now connected.": "è connesso.", + "number": "numero", + "number of channels": "numero di canali", + "numbers from _ to _": "numeri da _ a _", + "o": "o", + "object _": "oggetto _", + "octagon": "ottagono", + "only duplicate this block": "duplica solo questo blocco", + "only face left/right": "voltati solo a destra/sinistra", + "only grab this block": "estrai solo questo blocco", + "open a new window with a picture of this morph": "apri una nuova finestra con un'immagine di questo elemento", + "open a new window with a picture of this script": "apri una nuova finestra con un'immagine di questo script", + "open a window on all properties": "apri una nuova finestra su tutte le proprietà", + "open in another dialog...": "apri in una nuova finestra...", + "open in dialog...": "apri in una finestra...", + "open shared project from cloud...": "apri progetto condiviso dal cloud...", + "options...": "opzioni...", + "or": "o", + "or before": "o prima", + "other clones": "altri cloni", + "other scripts in sprite": "altri script dello sprite", + "other sprites": "altri sprite", + "p": "p", + "paint a new sprite": "disegna un nuovo sprite", + "paintbucket": "secchiello", + "parameters": "parametri", + "parent": "genitore", + "parent...": "cambia genitore...", + "parts": "parti", + "password has been changed.": "la password è stata modificata.", + "password must be six characters or longer": "la password deve essere lunga almeno sei caratteri", + "passwords do not match": "le password non corrispondono", + "paste on _": "timbra su _", + "pause": "pausa", + "pause all _": "metti tutto in pausa _", + "pen": "posizione penna", + "pen _": "_ della penna", + "pen down": "penna giù", + "pen down?": "penna è giù", + "pen trails": "tratti della penna", + "pen up": "penna su", + "pen vectors": "vettori penna", + "pic...": "salva immagine dello Stage...", + "pick random _ to _": "numero a caso tra _ e _", + "pick up": "prendi", + "pipe _ $arrowRight _": "linearizza _ $arrowRight _", + "pipette": "contagocce", + "pitch": "altezza", + "pivot": "cambia centro di rotazione...", + "pixel": "pixel", + "pixelate": "pixelato", + "pixels": "pixel", + "play _ Hz for _ secs": "riproduci _ Hz per _ secondi", + "play frequency _ Hz": "riproduci frequenza _ Hz", + "play note _ for _ beats": "riproduci nota _ per _ battute", + "play sound _": "produci suono _", + "play sound _ at _ Hz": "riproduci suono _ a _ Hz", + "play sound _ until done": "produci suono _ e attendi la fine", + "please agree to the TOS": "accetta i TdS", + "please fill out this field": "compila questo campo", + "please provide a valid email address": "fornisci un indirizzo email valido", + "point in direction _": "punta in direzione _", + "point towards _": "punta verso _", + "pointRight": "aDestra", + "polygon": "poligono", + "position": "posizione", + "poster": "poster", + "predicate": "condizione", + "presentation (1.4x)": "presentazione(1.4x)", + "pressed": "premuto", + "previous": "precedente", + "processes": "processi", + "product": "prodotto", + "published.": "pubblicato.", + "publishing project...": "pubblicazione progetto in corso...", + "q": "q", + "r": "r", + "r-g-b-a": "RGBA", + "random": "scelto a caso", + "random position": "posizione casuale", + "rank": "rango", + "raw data...": "formato originale...", + "ray length": "lunghezza raggio", + "read-only": "sola lettura", + "receivers...": "destinatari...", + "recording": "registrazione in corso", + "rectangle": "rettangolo", + "rectangleSolid": "rettangoloPieno", + "red": "rosso", + "redo the last undone block drop in this pane": "ripeti l'ultimo inserimento di un blocco annullato in questa area degli script", + "redraw the screen once": "ridisegna lo schermo una volta", + "redrop": "ripristina l'ultimo inserimento di un blocco in questa area degli script", + "relabel...": "rinomina...", + "release": "rilascia", + "remove block variables...": "removi variabili del blocco...", + "rename": "rinomina", + "rename all blocks that access this variable": "rinomina tutti i blocchi che accedono questa variabile", + "rename all...": "rinomina tutto...", + "rename background": "rinomina sfondo", + "rename costume": "rinomina costume", + "rename only this reporter": "rinomina solo questo monitor", + "rename sound": "rinomina suono", + "rename...": "rinomina...", + "repeat _ _": "ripeti _ volte _", + "repeat until _ _": "ripeti fino a quando _ _", + "replace item _ of _ with _": "sostituisci elemento _ di _ con _", + "report _": "risultato _", + "reporter": "monitor", + "reporter didn't report": "il monitor non ha fornito un risultato", + "reset columns": "resetta colonne", + "reset timer": "azzera cronometro", + "reshape _ to _": "ridimensiona _ come _", + "resize...": "ridimensiona...", + "resolution": "risoluzione", + "rest for _ beats": "fai una pausa di _ battute", + "restore display": "ripristina display", + "result pic...": "immagine risultato...", + "reverse": "inverti", + "right": "estremo destro", + "right arrow": "freccia destra", + "ring": "anello", + "ringify": "inserisci in un anello", + "robot": "robot", + "rotate": "ruota", + "rotation style": "stile di rotazione", + "rotation x": "x del centro di rotazione", + "rotation y": "y del centro di rotazione", + "round _": "arrotonda _", + "run _ _": "esegui _ _", + "run _ w/continuation": "esegui _ con continuazione", + "s": "s", + "sample morphs": "elementi di esempio", + "sample rate": "frequenza di campionamento", + "samples": "campioni", + "saturation": "saturazione", + "save _ as costume named _": "salva _ come costume con nome _", + "save a picture of all scripts": "salva immagine di tutti gli script", + "save a picture of both this script and its result": "salva un'immagine dello scrip e del risultato", + "save a picture of the stage": "salva immagine dello Stage", + "save a picture of this comment": "salva un'immagine del commento", + "save a picture of this script": "salva un'immagine dello script", + "save a summary of this project": "salva un sommario del progetto", + "save global custom block definitions as XML": "salva le definizioni dei nuovi blocchi globali in formato XML", + "save project data as XML to your downloads folder": "salva i dati del progetto in formato XML nella cartella Download", + "saved.": "salvato.", + "say _": "dire _", + "say _ for _ secs": "dire _ per _ secondi", + "scope": "ambito", + "screenshot": "schermata", + "screenshot...": "schermata...", + "script": "script", + "script pic with result...": "immagine script con risultato...", + "script pic...": "immagine script...", + "script variables _": "variabili dello script _", + "scripts": "tutti gli script", + "scripts pic...": "immagine script...", + "scroll frame": "scrolla area", + "scrolled-down": "scrollato verso il basso", + "scrolled-up": "scrollato verso l'alto", + "second": "secondo", + "select": "seleziona", + "selection": "selezione", + "self": "me stesso", + "send _ to _": "invia _ a _", + "senders...": "mittenti...", + "sensor demo": "demo sensori", + "set _ effect to _": "porta effetto _ a _", + "set _ of block _ to _": "porta _ del blocco _ a _", + "set _ to _": "porta _ a _", + "set background _ to _": "porta _ sfondo a _", + "set background color to _": "porta colore sfondo a _", + "set balance to _": "porta bilanciamento a _", + "set instrument to _": "passa a strumento _", + "set pen _ to _": "usa penna con _ _", + "set pen color to _": "usa penna di colore _", + "set pen shade to _": "usa penna di tonalità _", + "set pen size to _": "usa penna di dimensione _", + "set size to _ %": "porta dimensione a _ %", + "set tempo to _ bpm": "porta tempo a _ bpm", + "set this morph's alpha value": "imposta valore alpha di questo elemento", + "set turbo mode to _": "modalità turbo _", + "set video transparency to _": "porta trasparenza del video a _", + "set volume to _ %": "porta volume a _ %", + "set x to _": "vai dove x è _", + "set y to _": "vai dove y è _", + "setting the rotation center requires a costume": "per definire il centro di rotazione occorre un costume", + "settings menu prefer empty slots hint": "abilita per favorire l'inserimento in argomenti vuoti quando si trascinano e rilasciano dei monitor", + "several block definitions already match this label": "esistono altri blocchi con la stessa etichetta", + "shared.": "condiviso.", + "sharing project...": "condivisione del progetto in corso...", + "sharp drop shadows use for old browsers": "ombreggiature nette, per browser datati", + "sharp shadows...": "ombreggiature nette...", + "shimmering (80)": "accentuata (80)", + "show": "mostra", + "show a handle which can be dragged to change this morph's extent": "mostra una maniglia che può essere trascinata per cambiare la grandezza di questo elemento", + "show a handle which can be dragged to move this morph": "mostra una maniglia che può essere trascinata per spostare questo elemento", + "show a picture of all scripts and block definitions": "mostra un'immagine di tutti gli script e di tutte le definizioni dei blocchi", + "show all": "mostra tutti gli sprite", + "show all...": "mostra tutti...", + "show project data as XML in a new browser window": "mostra i dati del progetto in formato XML in una nuova finestra del browser", + "show table _": "mostra tabella _", + "show the World's menu": "mostra il menu del Mondo", + "show variable _": "mostra variabile _", + "shown?": "è visibile", + "shrink": "riduci", + "shuffled": "mescolato", + "signals": "segnali", + "sin": "sen", + "size": "dimensione", + "slider": "cursore", + "slider max...": "Scegli il max del cursore...", + "slider min...": "Scegli il min del cursore...", + "slots": "parametri", + "smallStage": "stagePiccolo", + "smaller menu fonts and sliders": "caratteri del menu e cursori più piccoli", + "snap": "porzione", + "sorted": "ordinato", + "sound": "suono", + "sounds": "suoni", + "space": "spazio", + "specify the distance the hand has to move before it picks up an object": "specifica la distanza che il puntatore deve percorrere prima di poter afferrare un oggetto", + "spectrum": "spettro", + "speech bubble": "fumetto", + "speechBubble": "fumetto", + "speechBubbleOutline": "fumettoContorno", + "split _ by _": "divisione di _ ad ogni _", + "sprite": "sprite", + "sprites": "elenco sprite", + "sqrt": "radq", + "square": "quadrato", + "stack size": "dimensione stack", + "stage": "stage", + "stage image": "immagine stage", + "stamp": "timbra", + "standard settings": "impostazioni standard", + "stay signed in on this computer until logging out": "resta connesso su questo computer fino a che non esci", + "stepForward": "passoAvanti", + "stick this morph to another one": "attacca questo elemento ad un'altro", + "stick to": "attacca a", + "stop _": "ferma _", + "stop all sounds": "arresta tutti i suoni", + "stop frequency": "interrompi riproduzione frequenza", + "stopped": "fermato", + "storage": "archivio", + "store this project in the downloads folder (in supporting browsers)": "salva questo progetto nella cartella Download (nei browser compatibili)", + "stretch _ x: _ y: _ %": "deforma costume _ x: _ % y: _ %", + "string": "stringa", + "subtle (95)": "poco elevata (95)", + "sum": "somma", + "svg...": "esporta come SVG...", + "switch to costume _": "passa al costume _", + "switch to scene _ _": "passa alla scena _ _", + "t": "t", + "tab": "tabulazione", + "table view...": "vista tabella...", + "take a camera snapshot and import it as a new sprite": "scatta una foto e importala come un nuovo sprite", + "tan": "tan", + "tell _ to _ _": "chiedi a _ di eseguire _ _", + "tempo": "tempo", + "temporary?": "è temporaneo", + "text": "testo", + "text-only (100)": "solo testo (100)", + "the predicate takes too long for a custom hat block": "la valutazione della condizione richiede troppo tempo per un cappello personalizzato", + "there are currently no unused global custom blocks in this project": "al momento non sono presenti in questo progetto nuovi blocchi non utilizzati", + "there are currently no vectorizable pen trail segments": "al momento non sono presenti tratti della penna vettorializzabili", + "thing": "cosa", + "think _": "pensa _", + "think _ for _ secs": "pensa _ per _ secondi", + "this _": "questo _", + "this block": "questo blocco", + "this project doesn't have any custom global blocks yet": "in questo progetto non sono stati ancora definiti nuovi blocchi", + "this script": "questo script", + "time in milliseconds": "ora in millisecondi", + "timer": "cronometro", + "tip": "punta", + "to": "a", + "top": "estremo superiore", + "touch screen settings": "impostazioni touchscreen", + "touching _ ?": "sta toccando _", + "transient": "non persistente", + "translations": "traduzioni", + "translations...": "traduzioni...", + "translator_e-mail": "s_federici@yahoo.com, albertofirpo12@gmail.com, zairik@gmail.com", + "transparency": "trasparenza", + "transparency...": "trasparenza...", + "trash is empty": "il cestino è vuoto", + "true": "vero", + "turbo mode": "modalità turbo", + "turbo mode?": "modalità turbo attiva", + "turn _ _ degrees": "ruota di _ _ gradi", + "turn all pen trails and stamps into a new background for the stage": "crea un nuovo sfondo usando i tratti della penna e i timbri sullo Stage", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "crea un nuovo costume per lo sprite selezionato usando i tratti della penna e i timbri sullo Stage", + "turn pen trails into new background...": "crea un nuovo sfondo usando i tratti della penna...", + "turn pen trails into new costume...": "crea un nuovo costume usando i tratti della penna...", + "turnBack": "svoltaIndientro", + "turnForward": "svoltaAvanti", + "turnLeft": "svoltaSinistra", + "turnRight": "svoltaDestra", + "turtle": "tartaruga", + "turtleOutline": "tartarugaContorno", + "type": "tipo", + "type of _": "tipo di _", + "u": "u", + "unable to convert to": "impossibile convertire in", + "unable to inherit (disabled or circular?)": "impossibile ereditare (disabilitato o circolarità?)", + "unable to nest (disabled or circular?)": "impossibile annidare (disabilitato o circolarità?)", + "uncheck for default GUI design": "disabilitare per GUI standard", + "uncheck for less contrast multi-column list views": "disabilita per liste multicolonna a basso contrasto", + "uncheck for lower resolution, saves computing resources": "disabilita per bassa risoluzione, risparmio di risorse di calcolo", + "uncheck for round ends of lines": "disabilita per estremità delle linee arrotondate", + "uncheck for smooth scaling of vector costumes": "disabilita per ridimensionamento ", + "uncheck to allow dropped reporters to kick out others": "disabilita per permettere ai monitor rilasciati di espellere i monitor già presenti negli argomenti", + "uncheck to allow script reentrance": "disabilita per permettere agli script di essere riavviati prima della fine", + "uncheck to always show (+) symbols in block prototype labels": "disabilita per visualizzare i segni (+) nelle etichette dei blocchi prototipo", + "uncheck to confine auto-wrapping to top-level block stacks": "disabilita per limitare l'accapo automatico alle pile di blocchi non annidati", + "uncheck to disable IDE animations": "disabilita per non consentire le animazioni dell'IDE", + "uncheck to disable alternating colors for nested block": "disabilitare per non visualizzare i blocchi annidati a colori alternati", + "uncheck to disable block to text mapping features": "disabilita per rimuovere la conversione da blocchi a testo", + "uncheck to disable camera support": "disabilita per disattivare il supporto della webcam", + "uncheck to disable dropping commands in reporter rings": "abilita per consentire l'inserimento di comandi in tutti gli anelli", + "uncheck to disable dynamic labels for variadic inputs": "disabilita per disattivare le etichette dinamiche per input variabili", + "uncheck to disable input sliders for entry fields": "disabilita per non visualizzare i cursori negli argomenti numerici", + "uncheck to disable keyboard editing support": "disabilita per disattivare il supporto della tastiera per la modifica degli script", + "uncheck to disable multi-column list views": "disabilita per disattivare il supporto alla visualizzazione di tabelle multi-colonna", + "uncheck to disable project data in URLs": "disabilita per non consentire la presenza del codice XML dei progetti negli URL", + "uncheck to disable saving linked sublist identities": "disabilita per disattivare il salvataggio delle identità delle sottoliste collegate", + "uncheck to disable sprite composition": "disabilita per disattivare la composizione di sprite", + "uncheck to disable sprite inheritance features": "disabilita per non consentire l'ereditarietà degli sprite", + "uncheck to disable support for first-class sprites": "abilita per non rendere gli sprite oggetti di prima classe", + "uncheck to disable support for native JavaScript functions": "disabilita per rimuovere il supporto alle funzioni JavaScript native", + "uncheck to disable using operators on lists and tables": "disabilita per non consentire l'uso degli operatori su liste e tabelle", + "uncheck to disinherit": "disabilita per non consentire l'ereditarietà", + "uncheck to drag media and blocks out of watchers and balloons": "disabilita per impedire il trascinamento di media e blocchi fuori da reporter e fumetti", + "uncheck to drag media, and blocks out of watchers and balloons": "disabilita per impedire il trascinamento di media e blocchi fuori da reporter e fumetti", + "uncheck to enable directly running blocks by clicking on them": "disabilita per consentire l'esecuzione diretta dei blocchi cliccandoli", + "uncheck to hide buttons in the palette": "disabilita per nascondere i pulsanti nell'elenco dei blocchi", + "uncheck to hide category names in the palette": "disabilita per nascondere i nomi delle categorie nell'elenco dei blocchi", + "uncheck to hide extension primitives in the palette": "disabilitare per nascondere le primitive delle estensioni nell'elenco dei blocchi", + "uncheck to hide in palette": "disabilita per nascondere nell'elenco dei blocchi", + "uncheck to ignore upper- and lowercase when comparing texts": "disabilita per ignorare la distinzione tra maiuscole e minuscole quando si confrontano due stringhe", + "uncheck to limit Boolean slots to true / false": "disabilita per limitare gli argomenti Booleani a vero / falso", + "uncheck to run scripts at normal speed": "disabilita per eseguire gli script a velocità normale", + "uncheck to save contents in the project": "disabilita per salvare i contenuti nel progetto", + "uncheck to show only the selected category's blocks": "disabilita per mostrare solo i blocchi della categoria selezionata", + "uncheck to stop caching inputs (for debugging the evaluator)": "disabilita per non salvare gli argomenti in cache (per debuggare il valutatore)", + "uncheck to suppress running scripts when moving the slider": "disabilita per non eseguire gli script quando si spostano i cursori", + "uncheck to switch pen colors and graphic effects to HSV": "disabilita per passare a colori della penna e effetti grafici HSV", + "uncheck to turn block clicking sound off": "disabilita per non riprodurre il suono di aggancio dei blocchi", + "uncheck to turn off logging pen vectors": "disabilita per non registrare i vettori della penna", + "uncheck to turn off visible stepping": "disabilita per disattivare esecuzione passo passo", + "uncheck to use solid drop shadows and highlights": "disabilita per ombreggiature ed evidenziature solide", + "uncheck to use the input dialog in short form": "disabilita per non mostrare automaticamente i tipi degli argomenti nella finestra di creazione degli argomenti dei blocchi", + "uncompile": "decompila", + "undo": "annulla", + "undo the last block drop in this pane": "annulla l'ultimo inserimento di un blocco in un argomento in questa area degli script", + "undrop": "annulla inserimento", + "unicode _ as letter": "lettera con codice unicode _", + "unicode of _": "codice unicode di _", + "unlock": "sblocca", + "unpublished.": "rimosso dai progetti pubblicati.", + "unpublishing project...": "rimozione dai progetti pubblicati in corso...", + "unringify": "estrai dall'anello", + "unshared.": "rimosso dai progetti condivisi.", + "unsharing project...": "rimozione dai progetti condivisi in corso...", + "unsupported attribute": "attributo non supportato", + "unsupported data type": "tipo di dati non supportato", + "unsupported graphic effect": "effetto grafico non supportato", + "untitled": "senza titolo", + "unused": "non usati", + "unused block(s) removed": "blocchi non utilizzati rimossi", + "up arrow": "freccia su", + "upper case": "maiuscolo", + "url...": "url...", + "use the keyboard to enter blocks": "usa la tastiera per inserire i blocchi", + "user features...": "opzioni menu utente", + "user mode...": "modalità utente...", + "v": "v", + "value": "valore", + "variable": "variabile", + "variables": "variabili", + "video _ on _": "_ del video su _", + "video capture": "cattura video", + "volume": "volume", + "w": "w", + "wait _ secs": "attendi _ secondi", + "wait until _": "attendi fino a quando _", + "wardrobe": "elenco dei costumi", + "warp _": "esegui in modalità turbo _", + "what's your name?": "come ti chiami?", + "when I am _": "quando sono _", + "when I receive _ _": "quando ricevo _ _", + "when I start as a clone": "quando vengo clonato", + "when _": "quando _", + "when _ clicked": "quando si clicca su _", + "when _ is edited _": "quando _ viene modificato", + "when _ key pressed _": "quando si preme il tasto _ _", + "whirl": "mulinello", + "whitespace": "spazio", + "width": "larghezza", + "with data": "con dati", + "with inputs": "con argomenti", + "word": "parola", + "world": "mondo", + "write _ size _": "scrivi _ di dimensione _", + "x": "x", + "x position": "posizione x", + "y": "y", + "y position": "posizione y", + "year": "anno", + "year:": "anno:", + "your own": "i tuoi", + "z": "z" +} diff --git a/elements/pl-snap/Snap/locale/lang-ja.js b/elements/pl-snap/Snap/locale/lang-ja.js new file mode 100644 index 00000000..b586e3f9 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ja.js @@ -0,0 +1,1389 @@ +SnapTranslator.dict.ja = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) 左", + "(0) up": "(0) 上", + "(1) sine": "", + "(180) down": "(180) 下", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) 右", + "(empty)": "(空)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "1993 or before": "1993年以前", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snapについて", + "About...": "Snap!について...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "アニメーション", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "任意 (未評価)", + "Any type": "全タイプ", + "Apply": "適用", + "April": "4月", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "本当に削除しますか", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "8月", + "Back...": "戻る...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "年:", + "Bitmap": "", + "Block Editor": "ブロックエディター", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "半透明の影", + "Boolean": "真偽値", + "Boolean (T/F)": "真偽値 (はい/いいえ)", + "Boolean (unevaluated)": "真偽値 (未評価)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "キャンセル", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "ブロックを変更", + "Clear backup": "", + "Clicking sound": "クリック音", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "コマンド", + "Command (C-shape)": "コマンド (C形)", + "Command (inline)": "コマンド (インライン)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "貢献者:", + "Control": "制御", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "コスチュームエディター", + "Costumes": "コスチューム", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "引数名を作成", + "Create variables": "", + "Create variables in program": "", + "Credits...": "クレジット...", + "Custom Block Translations": "", + "Database": "", + "December": "12月", + "Default": "", + "Default Value:": "デフォルト値:", + "Delete": "削除", + "Delete Custom Block": "カスタムブロックを削除", + "Delete Project": "プロジェクトを削除", + "Delete a variable": "変数を削除", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "ソースをダウンロード", + "Dragging threshold...": "", + "Dynamic input labels": "動的な入力ラベル", + "E-mail address of parent or guardian:": "", + "E-mail address:": "電子メールアドレス:", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "引数名を編集", + "Edit label fragment": "ラベルの断片を編集", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "空", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "ブロックを書き出し", + "Export blocks...": "ブロックを書き出す...", + "Export project as plain text...": "テキストファイルとしてプロジェクトを書き出す...", + "Export project...": "プロジェクトを書き出す...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "2月", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "こんにちは!", + "Hello, World!": "", + "Help": "ヘルプ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "うーん...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "サービス利用規約を読み それに同意します", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "ブロックを読み込み", + "Import library": "", + "Import sound": "", + "Import tools": "ツールを読み込む", + "Import...": "読み込み...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "引数名:", + "Input Slot Options": "", + "Input name": "引数名", + "Input sliders": "入力スライダー", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "1月", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "7月", + "June": "6月", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "言語...", + "Libraries...": "", + "License": "ライセンス", + "License...": "ライセンス...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "リスト", + "List utilities": "", + "Lists": "リスト", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "ログイン...", + "Logout": "", + "Long form input dialog": "引数ダイアログを長い形式にする", + "Looks": "見た目", + "Make a block": "ブロックを作る", + "Make a variable": "新しい変数を作る", + "Manipulate costumes pixel-wise.": "", + "March": "3月", + "May": "5月", + "Message name": "メッセージ名", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "モジュール...", + "Motion": "動き", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "複数の引数 (値は引数のリスト)", + "Nested auto-wrapping": "", + "New": "新規", + "New Category": "", + "New Project": "新しいプロジェクト", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "いいえ", + "November": "11月", + "Number": "数", + "OK": "", + "Object": "オブジェクト", + "October": "10月", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "開く", + "Open Project": "プロジェクトを開く", + "Open Projekt": "プロジェクトを開く", + "Open in Community Site": "", + "Open...": "開く...", + "Opening project...": "", + "Operators": "演算", + "Other": "その他", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "パスワード:", + "Pen": "ペン", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "再生", + "Play sound": "音を鳴らす", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "述語", + "Prefer empty slot drops": "空のスロットのドロップを許す", + "Prefer smooth animations": "なめらかなアニメーションにする", + "Privacy...": "個人情報...", + "Project Notes": "プロジェクトのメモ", + "Project URLs": "", + "Project notes...": "プロジェクトのメモ...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "リファレンスマニュアル", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "現在のプロジェクトを新しいもので置き換えますか?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "モニター", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "保存", + "Save As...": "名前をつけて保存...", + "Save Project": "", + "Save Project As...": "名前を付けてプロジェクトを保存...", + "Save to disk": "", + "Saved!": "保存しました!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "スクリプト", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "調べる", + "September": "9月", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "サインイン", + "Sign up": "サインアップ", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "サインアップ...", + "Single input.": "単一引数.", + "Single palette": "", + "Slider maximum value": "スライダーの最大値", + "Slider minimum value": "スライダーの最小値", + "Snap! website": "Snap!のWebサイト", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "音", + "Sound Recorder": "", + "Sounds": "音", + "Sprite": "スプライト", + "Sprite Nesting": "", + "Stage": "ステージ", + "Stage height": "", + "Stage selected: no motion primitives": "選択されたステージ: 動きのプリミティブがありません", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "停止", + "Stop sound": "音を止める", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "ユーザーモードに切り替え", + "Switch to dev mode": "開発者モードに切り替える", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "サービス利用規約...", + "Ternary Boolean slots": "", + "Text": "テキスト", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "スクリプトをスレッドセーフにする", + "Title text": "タイトルテキスト", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "翻訳", + "Translators...": "翻訳者", + "Turbo mode": "ターボモード", + "Turtle": "タートル", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "名称未設定", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - 呼び出し元から見える内部的な変数", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "ユーザー名:", + "Variable name": "変数名", + "Variables": "変数", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "仮想キーボード", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "はい", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "縞々で表示", + "Zoom blocks": "ブロックをズーム", + "Zoom blocks...": "ブロックをズーム...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ に _ が含まれているか", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ を _ の先頭に置く", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ を _ で割った余り", + "_ of _": "_ _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "絶対値", + "acos": "acos", + "add _ to _": "_ を _ に追加する", + "add a new Turtle sprite": "", + "add a new sprite": "新しいスプライトを追加する", + "add comment": "コメントを追加", + "add comment here...": "ここにコメントを追加...", + "agent": "", + "alert _": "警告: _", + "all": "すべて", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ の先頭以外", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "かつ", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "答え", + "any": "", + "any key": "", + "any message": "", + "anything": "", + "append _": "", + "arrange scripts vertically": "スクリプトを 縦に整列します", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ と聞いて待つ", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "大 (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "このカスタムブロックとすべてのインスタンスを 削除してもよいですか?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "ブロックを", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "_ _ を送る", + "broadcast _ _ and wait": "_ _ を送って待つ", + "brush": "", + "build": "作ろう", + "but getting a": "", + "c": "c", + "call _ _": "_ を _ で呼ぶ", + "call _ w/continuation": "継続付きで _ を呼ぶ", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "回転する", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ を _ ずつ変える", + "change _ effect by _": "_ の効果を _ ずつ変える", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ペンの色を _ ずつ変える", + "change pen shade by _": "ペンの濃さを _ ずつ変える", + "change pen size by _": "ペンの太さを _ ずつ変える", + "change size by _": "大きさを _ ずつ変える", + "change tempo by _": "テンポを _ ずつ変える", + "change volume by _": "", + "change x by _": "x座標を _ ずつ変える", + "change y by _": "y座標を _ ずつ変える", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "チェックするとコンピューター間で なめらかで予測可能なアニメーションにします", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "チェックすると引数ダイアログに 常にスロットの型を表示します", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to disallow script reentrancy": "チェックするとスクリプトを 再入不能にします", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "チェックするとIDEの アニメーションを入れます", + "check to enable alternating colors for nested blocks": "チェックすると入れ子になった ブロックを縞々で表示します", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "チェックすると可変個引数の 動的ラベルを可能にします", + "check to enable input sliders for entry fields": "チェックすると入力フィールドのスライダーを有効にします", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "チェックするとモバイル機器用の 仮想キーボードを有効にします", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "チェックするとスクリプトの 処理を優先します", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "チェックを外すとブロックの クリック音を入れます", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "チェックすると半透明の影と ハイライトになります", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "きれいにする", + "clear": "消す", + "clear graphic effects": "画像効果をなくす", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "クリックかドラッグで回転中心を移動する", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ 色が _ 色に触れた", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "コマンド", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "コンソールログ _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "コスチュームの番号", + "costume name": "", + "costumes": "", + "costumes tab help": "他のWebページやコンピューター上の画像を ここにドロップして読み込みます", + "could not connect to:": "", + "cr": "", + "create a clone of _": "_ のクローンを作る", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "現在のモジュールのバージョン:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "削除", + "delete _": "", + "delete _ of _": "_ 番目を _ から削除する", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "ブロックの定義を削除", + "delete slot": "", + "delete this clone": "このクローンを削除する", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "デモ (1.2x)", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "開発者モード", + "development mode debugging primitives:": "開発者モード デバッグ用プリミティブ:", + "development mode...": "", + "dimensions": "", + "direction": "向き", + "disable deep-Morphic context menus and show user-friendly ones": "高度なモーフィックコンテクストメニューを無効にして ユーザーフレンドリーなメニューを表示する", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ までの距離", + "distribution": "", + "don't rotate": "回転しない", + "down arrow": "下向き矢印", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "ドラッグ可能", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "複製", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "端", + "edit": "編集", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "編集...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "ユーザーフレンドリーではない モーフィックコンテクストメニューと インスペクターを有効にする", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "書き出し", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "書き出し...", + "extract": "", + "f": "f", + "false": "いいえ", + "file": "", + "file menu import hint": "チェックするとレポーターをドラッグ&ドロップするとき 空のレポーターにフォーカスします いくつかのブラウザーではサポートされません", + "fill": "塗りつぶす", + "fill page...": "", + "filtered for _": "_ 色を抽出", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "すべてのスプライト用", + "for each _ in _ _": "", + "for this sprite only": "このスプライト用", + "forever _": "ずっと _", + "frame": "", + "frames": "フレーム", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "幽霊", + "giant (8x)": "巨大 (8x)", + "glide _ secs to x: _ y: _": "_ 秒でx座標を _ に、y座標を _ に変える", + "global?": "", + "globe": "", + "go back _ layers": "_ 層下げる", + "go to _": "_ へ行く", + "go to _ layer": "", + "go to front": "前に出す", + "go to x: _ y: _": "x座標を _ 、y座標を _ にする", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "ハロー", + "help": "ヘルプ", + "help...": "ヘルプ...", + "hide": "隠す", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "_ を隠す", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "特大 (4x)", + "i": "i", + "identical to": "と同一", + "if _ _": "もし _ なら _", + "if _ _ else _": "もし _ なら _ でなければ _", + "if _ then _ else _": "", + "if on edge, bounce": "もし端に着いたら、跳ね返る", + "import a sound from your computer by dragging it into here": "コンピューター上のサウンドを ここにドラッグして読み込みます", + "import without attempting to parse or format data": "", + "import...": "読み込み...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "引数リスト:", + "input names:": "引数名:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "_ を _ 番目になるように _ に挿入する", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "は _ ?", + "is _ a _ ?": "_ は _ 型", + "is _ empty?": "", + "is _ identical to _ ?": "_ は _ と同一", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ 番目 _", + "items": "", + "j": "j", + "join _": "_ をつなぐ", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ が押された", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "日本語", + "language_translator": "Kazuhiro Abe", + "large": "大", + "last": "最後", + "last changed": "", + "last_changed": "2013-04-02", + "launch _ _": "_ を _ で起動する", + "left": "", + "left arrow": "左向き矢印", + "length": "", + "length of _": "_ の長さ", + "length:": "長さ:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "_ 文字目の文字 _", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "リスト", + "list _": "リスト _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "強力なブロックの公式 ライブラリを読み込む", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "ブロックを作る...", + "make a category...": "", + "make a copy and pick it up": "コピーを作って それを掴みます", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "超巨大 (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "マウスが押された", + "mouse position": "", + "mouse x": "マウスのx座標", + "mouse y": "マウスのy座標", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "マウスのポインター", + "move": "", + "move _ steps": "_ 歩動かす", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "自分自身", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "新規...", + "next": "", + "next costume": "次のコスチュームにする", + "none": "なし", + "normal": "通常", + "normal (1x)": "ノーマル (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "_ ではない", + "note": "", + "nothing": "", + "now connected.": "", + "number": "数", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "このブロックをコピーするだけ", + "only face left/right": "左右に反転するだけ", + "only grab this block": "", + "open a new window with a picture of the stage": "このステージの画像で 新しいウィンドウを開く", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "このスクリプトの画像を表示する新しいウィンドウを開きます", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "または", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "ペンを下ろす", + "pen down?": "", + "pen trails": "ペンの軌跡", + "pen up": "ペンを上げる", + "pen vectors": "", + "pic...": "画像...", + "pick random _ to _": "_ から _ までの乱数", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ の音符を _ 拍鳴らす", + "play sound _": "_ の音を鳴らす", + "play sound _ at _ Hz": "", + "play sound _ until done": "終わるまで _ の音を鳴らす", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ 度に向ける", + "point towards _": "_ へ向ける", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "述語", + "presentation (1.4x)": "プレゼンテーション (1.4x)", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "任意", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "名前を変更", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "コスチュームの名前を変更", + "rename only this reporter": "", + "rename sound": "音の名前を変更", + "rename...": "名前を変更...", + "repeat _ _": "_ 回繰り返す _", + "repeat until _ _": "_ まで繰り返す _", + "replace item _ of _ with _": "_ 番目の _ の要素を _ で置き換える", + "report _": "_ を返す", + "reporter": "レポーター", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "タイマーをリセット", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "_ 拍休む", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "右向き矢印", + "ring": "", + "ringify": "リング化", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ を丸める", + "run _ _": "_ を _ で実行する", + "run _ w/continuation": "継続付きで _ を実行する", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ という", + "say _ for _ secs": "_ と _ 秒言う", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "スクリプトの画像...", + "script variables _": "スクリプト変数 _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "選択", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ の効果を _ にする", + "set _ of block _ to _": "", + "set _ to _": "_ を _ にする", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "ペンの色を _ にする", + "set pen shade to _": "ペンの濃さを _ にする", + "set pen size to _": "ペンの太さを _ にする", + "set size to _ %": "大きさを _ にする", + "set tempo to _ bpm": "テンポを _ BPMにする", + "set this morph's alpha value": "", + "set turbo mode to _": "ターボーモードを _ にする", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "x座標を _ にする", + "set y to _": "y座標を _ にする", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "設定メニューが空のスロットのヒントを許します", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "表示する", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "すべてを表示", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "グローバルカスタムブロックの定義をXMLとして ブラウザの新しいウインドウに表示する", + "show project data as XML in a new browser window": "プロジェクトのデータをXMLとして ブラウザの新しいウインドウに表示する", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ 表示する", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "大きさ", + "slider": "スライダー", + "slider max...": "スライダーの最大値...", + "slider min...": "スライダーの最小値...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "スペース", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "平方根", + "square": "", + "stack size": "スタックの大きさ", + "stage": "", + "stage image": "", + "stamp": "スタンプ", + "standard settings": "", + "stay signed in on this computer until logging out": "ログアウトするまでこのコンピューターに サインインしたままにする", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all _": "すべてを止める _", + "stop all sounds": "すべての音を止める", + "stop block": "ブロックを止める", + "stop frequency": "", + "stop script": "スクリプトを止める", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "コスチュームを _ にする", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "テンポ", + "temporary?": "", + "text": "テキスト", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "なにか", + "think _": "_ と考える", + "think _ for _ secs": "_ と _ 秒考える", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "このプロジェクトはカスタムグローバルブロックを持っていません", + "this script": "", + "time in milliseconds": "", + "timer": "タイマー", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "_ 色に触れた", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "abee@squeakland.jp", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "はい", + "turbo mode": "", + "turbo mode?": "ターボモード?", + "turn _ _ degrees": "_ _ 度回す", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ の型", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "チェックを外すとフレームレート 当たりの速度を上げます", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "チェックを外すとドロップしたレポーターが 他を押し出せるようになります", + "uncheck to allow script reentrance": "", + "uncheck to allow script reentrancy": "チェックを外すとスクリプトを 再入可能にします", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "チェックを外すとIDEの アニメーションを切ります", + "uncheck to disable alternating colors for nested block": "チェックを外すと入れ子になった ブロックを普通に表示します", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "チェックを外すと可変個引数の 動的ラベルを不可にします", + "uncheck to disable input sliders for entry fields": "チェックを外すと入力フィールドのスライダーを無効にします", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "チェックを外すとモバイル機器用の 仮想キーボードを無効にします", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "チェックを外すとスクリプトを 通常の速度で実行します", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "チェックを外すとブロックの クリック音を切ります", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "チェックを外すと単色の影と ハイライトになります", + "uncheck to use the input dialog in short form": "チェックを外すと引数ダイアログを短く表示します", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "Unicodeで _ の文字", + "unicode of _": "_ のUnicode", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "非リング化", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "名称未設定", + "unused": "", + "unused block(s) removed": "", + "up arrow": "上向き矢印", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ 秒待つ", + "wait until _": "_ まで待つ", + "wardrobe": "", + "warp _": "ワープする _", + "what's your name?": "あなたの名前は何ですか?", + "when I am _": "_ 自分がクリックされたとき", + "when I receive _ _": "_ _ を受け取ったとき", + "when I start as a clone": "クローンされたとき", + "when _": "", + "when _ clicked": "_ が押されたとき", + "when _ is edited _": "", + "when _ key pressed _": "_ _ が押されたとき", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "引数", + "word": "", + "world": "ワールド", + "write _ size _": "", + "x": "x", + "x position": "x座標", + "y": "y", + "y position": "y座標", + "year": "", + "year:": "", + "your own": "あなた自身の", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ja_HIRA.js b/elements/pl-snap/Snap/locale/lang-ja_HIRA.js new file mode 100644 index 00000000..42612536 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ja_HIRA.js @@ -0,0 +1,1389 @@ +SnapTranslator.dict.ja_HIRA = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) ひだり", + "(0) up": "(0) じょう", + "(1) sine": "", + "(180) down": "(180) か", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) みぎ", + "(empty)": "(そら)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "1993 or before": "1993ねんいぜん", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snapについて", + "About...": "Snap!について...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "アニメーション", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "にんい (みひょうか)", + "Any type": "ぜんタイプ", + "Apply": "てきよう", + "April": "4がつ", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "ほんとうにさくじょしますか", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "8がつ", + "Back...": "もどる...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "とし:", + "Bitmap": "", + "Block Editor": "ブロックエディター", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "はんとうめいのかげ", + "Boolean": "しんぎち", + "Boolean (T/F)": "しんぎち (はい/いいえ)", + "Boolean (unevaluated)": "しんぎち (みひょうか)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "キャンセル", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "ブロックをへんこう", + "Clear backup": "", + "Clicking sound": "クリックおん", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "コマンド", + "Command (C-shape)": "コマンド (Cけい)", + "Command (inline)": "コマンド (インライン)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "こうけんしゃ:", + "Control": "せいぎょ", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "コスチュームエディター", + "Costumes": "コスチューム", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "ひきすうめいをさくせい", + "Create variables": "", + "Create variables in program": "", + "Credits...": "クレジット...", + "Custom Block Translations": "", + "Database": "", + "December": "12がつ", + "Default": "", + "Default Value:": "デフォルトち:", + "Delete": "さくじょ", + "Delete Custom Block": "カスタムブロックをさくじょ", + "Delete Project": "プロジェクトをさくじょ", + "Delete a variable": "へんすうをさくじょ", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "ソースをダウンロード", + "Dragging threshold...": "", + "Dynamic input labels": "どうてきなにゅうりょくラベル", + "E-mail address of parent or guardian:": "", + "E-mail address:": "でんしメールアドレス:", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "ひきすうめいをへんしゅう", + "Edit label fragment": "ラベルのだんぺんをへんしゅう", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "そら", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "ブロックをかきだし", + "Export blocks...": "ブロックをかきだす...", + "Export project as plain text...": "テキストファイルとしてプロジェクトをかきだす...", + "Export project...": "プロジェクトをかきだす...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "2がつ", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "こんにちは!", + "Hello, World!": "", + "Help": "ヘルプ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "うーん...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "サービスりようきやくをよみ それにどういします", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "ブロックをよみこみ", + "Import library": "", + "Import sound": "", + "Import tools": "ツールをよみこむ", + "Import...": "よみこみ...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "ひきすうめい:", + "Input Slot Options": "", + "Input name": "ひきすうめい", + "Input sliders": "にゅうりょくスライダー", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "1がつ", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "7がつ", + "June": "6がつ", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "げんご...", + "Libraries...": "", + "License": "ライセンス", + "License...": "ライセンス...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "リスト", + "List utilities": "", + "Lists": "リスト", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "ログイン...", + "Logout": "", + "Long form input dialog": "ひきすうダイアログをながいけいしきにする", + "Looks": "みため", + "Make a block": "ブロックをつくる", + "Make a variable": "あたらしいへんすうをつくる", + "Manipulate costumes pixel-wise.": "", + "March": "3がつ", + "May": "5がつ", + "Message name": "メッセージめい", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "モジュール...", + "Motion": "うごき", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "ふくすうのひきすう (あたいはひきすうのリスト)", + "Nested auto-wrapping": "", + "New": "しんき", + "New Category": "", + "New Project": "あたらしいプロジェクト", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "いいえ", + "November": "11がつ", + "Number": "かず", + "OK": "", + "Object": "オブジェクト", + "October": "10がつ", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "ひらく", + "Open Project": "プロジェクトをひらく", + "Open Projekt": "プロジェクトをひらく", + "Open in Community Site": "", + "Open...": "ひらく...", + "Opening project...": "", + "Operators": "えんざん", + "Other": "そのた", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "パスワード:", + "Pen": "ペン", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "さいせい", + "Play sound": "おとをならす", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "じゅつご", + "Prefer empty slot drops": "そらのスロットのドロップをゆるす", + "Prefer smooth animations": "なめらかなアニメーションにする", + "Privacy...": "こじんじょうほう...", + "Project Notes": "プロジェクトのメモ", + "Project URLs": "", + "Project notes...": "プロジェクトのメモ...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "リファレンスマニュアル", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "げんざいのプロジェクトをあたらしいものでおきかえますか?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "モニター", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "ほぞん", + "Save As...": "なまえをつけてほぞん...", + "Save Project": "", + "Save Project As...": "なまえをつけてプロジェクトをほぞん...", + "Save to disk": "", + "Saved!": "ほぞんしました!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "スクリプト", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "しらべる", + "September": "9がつ", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "サインイン", + "Sign up": "サインアップ", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "サインアップ...", + "Single input.": "たんいつひきすう.", + "Single palette": "", + "Slider maximum value": "スライダーのさいだいち", + "Slider minimum value": "スライダーのさいしょうち", + "Snap! website": "Snap!のWebサイト", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "おと", + "Sound Recorder": "", + "Sounds": "おと", + "Sprite": "スプライト", + "Sprite Nesting": "", + "Stage": "ステージ", + "Stage height": "", + "Stage selected: no motion primitives": "せんたくされたステージ: うごきのプリミティブがありません", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "ていし", + "Stop sound": "おとをとめる", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "ユーザーモードにきりかえ", + "Switch to dev mode": "かいはつしゃモードにきりかえる", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "サービスりようきやく...", + "Ternary Boolean slots": "", + "Text": "テキスト", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "スクリプトをスレッドセーフにする", + "Title text": "タイトルテキスト", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "ほんやく", + "Translators...": "ほんやくしゃ", + "Turbo mode": "ターボモード", + "Turtle": "タートル", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "めいしょうみせってい", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - よびだしもとからみえるないぶてきなへんすう", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "ユーザーめい:", + "Variable name": "へんすうめい", + "Variables": "へんすう", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "かそうキーボード", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "はい", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "じま々でひょうじ", + "Zoom blocks": "ブロックをズーム", + "Zoom blocks...": "ブロックをズーム...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ に _ がふくまれているか", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ を _ のせんとうにおく", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ を _ でわったあまり", + "_ of _": "_ _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "ぜったいち", + "acos": "acos", + "add _ to _": "_ を _ についかする", + "add a new Turtle sprite": "", + "add a new sprite": "あたらしいスプライトをついかする", + "add comment": "コメントをついか", + "add comment here...": "ここにコメントをついか...", + "agent": "", + "alert _": "けいこく: _", + "all": "すべて", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ のせんとういがい", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "かつ", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "こたえ", + "any": "", + "any key": "", + "any message": "", + "anything": "", + "append _": "", + "arrange scripts vertically": "スクリプトを たてにせいれつします", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ ときいてまつ", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "だい (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "このカスタムブロックとすべてのインスタンスを さくじょしてもよいですか?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "ブロックを", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "_ _ をおくる", + "broadcast _ _ and wait": "_ _ をおくってまつ", + "brush": "", + "build": "つくろう", + "but getting a": "", + "c": "c", + "call _ _": "_ を _ でよぶ", + "call _ w/continuation": "けいぞくつきで _ をよぶ", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "かいてんする", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ を _ ずつかえる", + "change _ effect by _": "_ のこうかを _ ずつかえる", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ペンのいろを _ ずつかえる", + "change pen shade by _": "ペンのこさを _ ずつかえる", + "change pen size by _": "ペンのふとさを _ ずつかえる", + "change size by _": "おおきさを _ ずつかえる", + "change tempo by _": "テンポを _ ずつかえる", + "change volume by _": "", + "change x by _": "xざひょうを _ ずつかえる", + "change y by _": "yざひょうを _ ずつかえる", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "チェックするとコンピューターかんで なめらかでよそくかのうなアニメーションにします", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "チェックするとひきすうダイアログに つねにスロットのかたをひょうじします", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to disallow script reentrancy": "チェックするとスクリプトを さいにゅうふのうにします", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "チェックするとIDEの アニメーションをいれます", + "check to enable alternating colors for nested blocks": "チェックするといれこになった ブロックをじま々でひょうじします", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "チェックするとかへんこひきすうの どうてきラベルをかのうにします", + "check to enable input sliders for entry fields": "チェックするとにゅうりょくフィールドのスライダーをゆうこうにします", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "チェックするとモバイルききようの かそうキーボードをゆうこうにします", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "チェックするとスクリプトの しょりをゆうせんします", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "チェックをはずすとブロックの クリックおんをいれます", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "チェックするとはんとうめいのかげと ハイライトになります", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "きれいにする", + "clear": "けす", + "clear graphic effects": "がぞうこうかをなくす", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "クリックかドラッグでかいてんちゅうしんをいどうする", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ いろが _ いろにふれた", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "コマンド", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "コンソールログ _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "コスチュームのばんごう", + "costume name": "", + "costumes": "", + "costumes tab help": "ほかのWebページやコンピューターじょうのがぞうを ここにドロップしてよみこみます", + "could not connect to:": "", + "cr": "", + "create a clone of _": "_ のクローンをつくる", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "げんざいのモジュールのバージョン:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "さくじょ", + "delete _": "", + "delete _ of _": "_ を _ からさくじょする", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "ブロックのていぎをさくじょ", + "delete slot": "", + "delete this clone": "このクローンをさくじょする", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "デモ (1.2x)", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "かいはつしゃモード", + "development mode debugging primitives:": "かいはつしゃモード デバッグようプリミティブ:", + "development mode...": "", + "dimensions": "", + "direction": "むき", + "disable deep-Morphic context menus and show user-friendly ones": "こうどなモーフィックコンテクストメニューをむこうにして ユーザーフレンドリーなメニューをひょうじする", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ までのきょり", + "distribution": "", + "don't rotate": "かいてんしない", + "down arrow": "したむきやじるし", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "ドラッグかのう", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "ふくせい", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "はし", + "edit": "へんしゅう", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "へんしゅう...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "ユーザーフレンドリーではない モーフィックコンテクストメニューと インスペクターをゆうこうにする", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "かきだし", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "かきだし...", + "extract": "", + "f": "f", + "false": "いいえ", + "file": "", + "file menu import hint": "チェックするとレポーターをドラッグ&ドロップするとき そらのレポーターにフォーカスします いくつかのブラウザーではサポートされません", + "fill": "ぬりつぶす", + "fill page...": "", + "filtered for _": "_ いろをちゅうしゅつ", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "すべてのスプライトよう", + "for each _ in _ _": "", + "for this sprite only": "このスプライトよう", + "forever _": "ずっと _", + "frame": "", + "frames": "フレーム", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "ゆうれい", + "giant (8x)": "きょだい (8x)", + "glide _ secs to x: _ y: _": "_ びょうでxざひょうを _ に、yざひょうを _ にかえる", + "global?": "", + "globe": "", + "go back _ layers": "_ そうさげる", + "go to _": "_ へいく", + "go to _ layer": "", + "go to front": "まえにだす", + "go to x: _ y: _": "xざひょうを _ 、yざひょうを _ にする", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "ハロー", + "help": "ヘルプ", + "help...": "ヘルプ...", + "hide": "かくす", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "_ をかくす", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "とくだい (4x)", + "i": "i", + "identical to": "とどういつ", + "if _ _": "もし _ なら _", + "if _ _ else _": "もし _ なら _ でなければ _", + "if _ then _ else _": "", + "if on edge, bounce": "もしはしについたら、はねかえる", + "import a sound from your computer by dragging it into here": "コンピューターじょうのサウンドを ここにドラッグしてよみこみます", + "import without attempting to parse or format data": "", + "import...": "よみこみ...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "ひきすうリスト:", + "input names:": "ひきすうめい:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "_ を _ ばんめにそうにゅうする _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "は _ ?", + "is _ a _ ?": "_ は _ がた", + "is _ empty?": "", + "is _ identical to _ ?": "_ は _ とどういつ", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ ばんめ _", + "items": "", + "j": "j", + "join _": "_ をつなぐ", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ がおされた", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "にほんご", + "language_translator": "Kazuhiro Abe", + "large": "だい", + "last": "さいご", + "last changed": "", + "last_changed": "2013-04-02", + "launch _ _": "_ を _ できどうする", + "left": "", + "left arrow": "ひだりむきやじるし", + "length": "", + "length of _": "_ のながさ", + "length:": "ながさ:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "_ もじめのもじ _", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "リスト", + "list _": "リスト _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "きょうりょくなブロックのこうしき ライブラリをよみこむ", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "ブロックをつくる...", + "make a category...": "", + "make a copy and pick it up": "コピーをつくって それをつかみます", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "ちょうきょだい (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "マウスがおされた", + "mouse position": "", + "mouse x": "マウスのxざひょう", + "mouse y": "マウスのyざひょう", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "マウスのポインター", + "move": "", + "move _ steps": "_ ほうごかす", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "じぶんじしん", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "しんき...", + "next": "", + "next costume": "つぎのコスチュームにする", + "none": "なし", + "normal": "つうじょう", + "normal (1x)": "ノーマル (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "_ ではない", + "note": "", + "nothing": "", + "now connected.": "", + "number": "かず", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "このブロックをコピーするだけ", + "only face left/right": "さゆうにはんてんするだけ", + "only grab this block": "", + "open a new window with a picture of the stage": "このステージのがぞうで あたらしいウィンドウをひらく", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "このスクリプトのがぞうをひょうじするあたらしいウィンドウをひらきます", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "または", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "ペンをおろす", + "pen down?": "", + "pen trails": "ペンのきせき", + "pen up": "ペンをあげる", + "pen vectors": "", + "pic...": "がぞう...", + "pick random _ to _": "_ から _ までのらんすう", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ のおんぷを _ はくならす", + "play sound _": "_ のおとをならす", + "play sound _ at _ Hz": "", + "play sound _ until done": "おわるまで _ のおとをならす", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ どにむける", + "point towards _": "_ へむける", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "じゅつご", + "presentation (1.4x)": "プレゼンテーション (1.4x)", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "にんい", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "なまえをへんこう", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "コスチュームのなまえをへんこう", + "rename only this reporter": "", + "rename sound": "おとのなまえをへんこう", + "rename...": "なまえをへんこう...", + "repeat _ _": "_ かいくりかえす _", + "repeat until _ _": "_ までくりかえす _", + "replace item _ of _ with _": "_ ばんめ _ を _ でおきかえる", + "report _": "_ をかえす", + "reporter": "レポーター", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "タイマーをリセット", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "_ はくやすむ", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "みぎむきやじるし", + "ring": "", + "ringify": "リングか", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ をまるめる", + "run _ _": "_ を _ でじっこうする", + "run _ w/continuation": "けいぞくつきで _ をじっこうする", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ という", + "say _ for _ secs": "_ と _ びょういう", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "スクリプトのがぞう...", + "script variables _": "スクリプトへんすう _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "せんたく", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ のこうかを _ にする", + "set _ of block _ to _": "", + "set _ to _": "_ を _ にする", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "ペンのいろを _ にする", + "set pen shade to _": "ペンのこさを _ にする", + "set pen size to _": "ペンのふとさを _ にする", + "set size to _ %": "おおきさを _ にする", + "set tempo to _ bpm": "テンポを _ BPMにする", + "set this morph's alpha value": "", + "set turbo mode to _": "ターボーモードを _ にする", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "xざひょうを _ にする", + "set y to _": "yざひょうを _ にする", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "せっていメニューがそらのスロットのヒントをゆるします", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "ひょうじする", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "すべてをひょうじ", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "グローバルカスタムブロックのていぎをXMLとして ブラウザのあたらしいウインドウにひょうじする", + "show project data as XML in a new browser window": "プロジェクトのデータをXMLとして ブラウザのあたらしいウインドウにひょうじする", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ ひょうじする", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "おおきさ", + "slider": "スライダー", + "slider max...": "スライダーのさいだいち...", + "slider min...": "スライダーのさいしょうち...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "スペース", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "へいほうこん", + "square": "", + "stack size": "スタックのおおきさ", + "stage": "", + "stage image": "", + "stamp": "スタンプ", + "standard settings": "", + "stay signed in on this computer until logging out": "ログアウトするまでこのコンピューターに サインインしたままにする", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all _": "すべてをとめる _", + "stop all sounds": "すべてのおとをとめる", + "stop block": "ブロックをとめる", + "stop frequency": "", + "stop script": "スクリプトをとめる", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "コスチュームを _ にする", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "テンポ", + "temporary?": "", + "text": "テキスト", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "なにか", + "think _": "_ とかんがえる", + "think _ for _ secs": "_ と _ びょうかんがえる", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "このプロジェクトはカスタムグローバルブロックをもっていません", + "this script": "", + "time in milliseconds": "", + "timer": "タイマー", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "_ にふれた", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "abee@squeakland.jp", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "はい", + "turbo mode": "", + "turbo mode?": "ターボモード?", + "turn _ _ degrees": "_ _ どまわす", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ のかた", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "チェックをはずすとフレームレート あたりのそくどをあげます", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "チェックをはずすとドロップしたレポーターが ほかをおしだせるようになります", + "uncheck to allow script reentrance": "", + "uncheck to allow script reentrancy": "チェックをはずすとスクリプトを さいにゅうかのうにします", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "チェックをはずすとIDEの アニメーションをきります", + "uncheck to disable alternating colors for nested block": "チェックをはずすといれこになった ブロックをふつうにひょうじします", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "チェックをはずすとかへんこひきすうの どうてきラベルをふかにします", + "uncheck to disable input sliders for entry fields": "チェックをはずすとにゅうりょくフィールドのスライダーをむこうにします", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "チェックをはずすとモバイルききようの かそうキーボードをむこうにします", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "チェックをはずすとスクリプトを つうじょうのそくどでじっこうします", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "チェックをはずすとブロックの クリックおんをきります", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "チェックをはずすとたんしょくのかげと ハイライトになります", + "uncheck to use the input dialog in short form": "チェックをはずすとひきすうダイアログをみじかくひょうじします", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "Unicodeで _ のもじ", + "unicode of _": "_ のUnicode", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "ひリングか", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "めいしょうみせってい", + "unused": "", + "unused block(s) removed": "", + "up arrow": "うわむきやじるし", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ びょうまつ", + "wait until _": "_ までまつ", + "wardrobe": "", + "warp _": "ワープする _", + "what's your name?": "あなたのなまえはなんですか?", + "when I am _": "_ じぶんがクリックされたとき", + "when I receive _ _": "_ _ をうけとったとき", + "when I start as a clone": "クローンされたとき", + "when _": "", + "when _ clicked": "_ がおされたとき", + "when _ is edited _": "", + "when _ key pressed _": "_ _ がおされたとき", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "ひきすう", + "word": "", + "world": "ワールド", + "write _ size _": "", + "x": "x", + "x position": "xざひょう", + "y": "y", + "y position": "yざひょう", + "year": "", + "year:": "", + "your own": "あなたじしんの", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-kn.js b/elements/pl-snap/Snap/locale/lang-kn.js new file mode 100644 index 00000000..d91ff16d --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-kn.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.kn = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) ಎಡ ಭಾಗ", + "(0) up": "(0) ಮೇಲೆ", + "(1) sine": "", + "(180) down": "(180) ಕೆಳಗಡೆ", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) ಬಲ ಭಾಗ", + "(empty)": "(ಖಾಲಿ)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "ಸ್ನ್ಯಾಪ್ ನ ಬಗ್ಗೆ", + "About...": "ಸುತ್ತಮುತ್ತ !...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "ಯಾವುದಾದರು (ಮೌಲ್ಯೀಕರಿಸದ)", + "Any type": "ಯಾವುದಾದರು ಮಾದರಿ", + "Apply": "ಅನ್ವಯಿಸು", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "ನೀವು ಅಳಿಸಲು ಸಿದ್ಧವಾಗಿದ್ದಿರಾ?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "ಹಿಂದೆ...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "ವಿಭಾಗಗಳ ಸಂಪಾದಕ", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "ಅಸ್ಪಷ್ಟ ನೆರಳು", + "Boolean": "ಬೂಲಿಯನ್", + "Boolean (T/F)": "ಬೂಲಿಯನ್ (ಸರಿ/ತಪ್ಪು)", + "Boolean (unevaluated)": "ಬೂಲಿಯನ್ (ಮೌಲ್ಯೀಕರಿಸದ)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "ರದ್ದುಮಾಡು", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "ವಿಭಾಗವನ್ನು ಬದಲಾಯಿಸಿ", + "Clear backup": "", + "Clicking sound": "", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "ಆದೇಶ", + "Command (C-shape)": "ಆದೇಶ (ಸಿ-ಆಕೃತಿ)", + "Command (inline)": "ಆದೇಶ (ಮಧ್ಯಸ್ಥ )", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "ಸಹಾಯಕ", + "Control": "ಹಿಡಿತ", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "ಉಡುಪಿನ ಸಂಪಾದಕ", + "Costumes": "ಉಡುಪುಗಳು", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "ಊಡಿಕೆಯ ಹೆಸರನ್ನು ರಚಿಸಿ", + "Create variables": "", + "Create variables in program": "", + "Credits...": "ಪ್ರತ್ಯಯಗಳು...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "ಗೈರುಹಾಜರಿ", + "Default Value:": "ಗೈರುಹಾಜರಿ ಮೌಲ್ಯ:", + "Delete": "ಅಳಿಸು", + "Delete Custom Block": "ಸ್ವಯಂ ನಿರ್ಮಿತ ವಿಭಾಗವನ್ನು ಅಳಿಸಿ", + "Delete Project": "ಪ್ರಾಯೋಜನೆಯನ್ನು ಅಳಿಸು", + "Delete a variable": "ಪರಿವರ್ತನೆಯನ್ನು ಅಳಿಸು", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "ಆಧಾರವನ್ನು ಇಳಿಸು", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "ಊಡಿಕೆಯ ಹೆಸರನ್ನು ಸಂಪಾದಿಸು", + "Edit label fragment": "ತಲೆಚೀಟಿಯ ಚೂರನ್ನು ಸಂಪಾದಿಸು", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "ಖಾಲಿ", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "ವಿಭಾಗಗಳನ್ನು ರಪ್ತು ಮಾಡಿರಿ", + "Export blocks...": "ವಿಭಾಗವನ್ನು ರಪ್ತು ಮಾಡಿರಿ...", + "Export project as plain text...": "ಪ್ರಾಯೋಜನೆಯನ್ನು ಸ್ಪಷ್ಟ ಅಕ್ಷರದಂತೆ ರಪ್ತು ಮಾಡಿರಿ...", + "Export project...": "ಪ್ರಾಯೋಜನೆಯನ್ನು ರಪ್ತು ಮಾಡಿರಿ...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "ನಮಸ್ಕಾರ!", + "Hello, World!": "", + "Help": "ಸಹಾಯ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "ಅಹಃ...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "ವಿಭಾಗಗಳನ್ನು ಆಮದು ಮಾಡಿರಿ", + "Import library": "ಭಂಡಾರವನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ", + "Import sound": "", + "Import tools": "ಉಪಕರಣಗಳನ್ನೂ ಆಮದು ಮಾಡಿಕೊಳ್ಳಿರಿ", + "Import...": "ಆಮದು...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "ಊಡಿಕೆಯ ಹೆಸರುಗಳು:", + "Input Slot Options": "", + "Input name": "ಊಡಿಕೆಯ ಹೆಸರು", + "Input sliders": "", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "ಭಾಷೆ...", + "Libraries...": "ಭಂಡಾರ...", + "License": "ಅನುಮತಿ", + "License...": "ಅನುಮತಿ...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "ಪಟ್ಟಿ", + "List utilities": "", + "Lists": "ಪಟ್ಟಿಗಳು", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "ಪ್ರವೇಶಿಸು...", + "Logout": "", + "Long form input dialog": "", + "Looks": "ಕಾಣುವುದು", + "Make a block": "ಹೊಸದಾದ ವಿಭಾಗ", + "Make a variable": "ಪರಿವರ್ತನೆ ಮಾಡು", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "ಮಾಹಿತಿಯ ಹೆಸರು", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "ಅಧ್ಯಾಯಗಳು...", + "Motion": "ಚಲನೆ", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "ಬಹುರೀತಿಯ ಊಡಿಕೆ (ಮೌಲ್ಯವು ಒಂದಕಿಂತ ಹೆಚ್ಚಾಗಿದೆ)", + "Nested auto-wrapping": "", + "New": "ಹೊಸ", + "New Category": "", + "New Project": "ಹೊಸ ಪ್ರಾಯೋಜನೆ", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "ಇಲ್ಲ", + "November": "", + "Number": "ಅಂಕಿ", + "OK": "ಸರಿ", + "Object": "ವಸ್ತು", + "October": "", + "Ok": "ಸರಿ", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "ಪ್ರಾಯೋಜನೆಯನ್ನು ತೆರೆ", + "Open in Community Site": "", + "Open...": "ತೆರೆ...", + "Opening project...": "", + "Operators": "ಚಿಹ್ನ್ಹೆಗಳು", + "Other": "ಇತರೆ", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "ಲೇಖನಿ", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "ಕೇಳಿಸು", + "Play sound": "ಶಬ್ದವನ್ನು ಕೇಳಿಸು", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "ವಿಜ್ಝ್ನ್ಯಾಪಿಸು", + "Prefer empty slot drops": "", + "Prefer smooth animations": "Fixe Framerate", + "Privacy...": "", + "Project Notes": "ಪ್ರಾಯೋಜನೆಯ ಟಿಪ್ಪಣಿಗಳು", + "Project URLs": "", + "Project notes...": "ಪ್ರಾಯೋಜನೆ ಟಿಪ್ಪಣಿಗಳು...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "ಉಲ್ಲೇಖ ಕೈಪಿಡಿ", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "ಹೀಗಿನ ಪ್ರಾಯೋಜನೆಯನ್ನು ಹೊಸದರ ಜೊತೆ ಬದಲಾಯಿಸಿ ?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "ವರದಿಗಾರ", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "ಉಳಿಸು", + "Save As...": "ಎಂದು ಉಳಿಸು...", + "Save Project": "", + "Save Project As...": "ಪ್ರಾಯೋಜನೆಯನ್ನು ಎಂದು ಉಳಿಸಿ ...", + "Save to disk": "", + "Saved!": "ಉಳಿಸಲಾಗಿದೆ!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "ಆಜ್ಞ್ಹೆ ಪರಿವರ್ತನೆಯ ಹೆಸರು", + "Scripts": "ಆಜ್ಞ್ಹೆಗಳು", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "ಗ್ರಹಿಸುವುದು", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "ರುಜು ಮಾಡು...", + "Single input.": "ಒಂದೇ ಒಂದು ಊಡಿಕೆ .", + "Single palette": "", + "Slider maximum value": "ಜಾರು ನಿಯಂತ್ರಕದ ಅಧಿಕ ಮೌಲ್ಯ", + "Slider minimum value": "ಜಾರು ನಿಯಂತ್ರಕದ ಕಡಿಮೆ ಮೌಲ್ಯ", + "Snap! website": "Snap! ಜಾಲತಾಣ", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "ಶಬ್ದ", + "Sound Recorder": "", + "Sounds": "ಶಬ್ದಗಳು", + "Sprite": "ಯಕ್ಷಿಣಿ", + "Sprite Nesting": "", + "Stage": "ವೇದಿಕೆ", + "Stage height": "ವೇದಿಕೆಯ ಉದ್ದ", + "Stage selected: no motion primitives": "", + "Stage size": "ವೇದಿಕೆಯ ಗಾತ್ರ", + "Stage size...": "ವೇದಿಕೆಯ ಗಾತ್ರ...", + "Stage width": "ವೇದಿಕೆಯ ಅಗಲ", + "Stop": "ನಿಲ್ಲಿಸು", + "Stop sound": "ಶಬ್ದವನ್ನು ನಿಲ್ಲಿಸು", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "ಬಳಕೆದಾರರ ದಿಶೆಗೆ ಮರುಕರಳಿಸಿ", + "Switch to dev mode": "ಬೆಳವಣಿಗೆಯ ದಿಶೆಗೆ ಮರುಕರಳಿಸಿ", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "ಪಠ್ಯ", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "", + "Title text": "ಶೀರ್ಷಿಕೆಯ ಅಕ್ಷರ", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "ಭಾಷಾಂತರಕಾರ", + "Translators...": "ಭಾಷಾಂತರಕಾರ...", + "Turbo mode": "", + "Turtle": "ಆಮೆ", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "ಹೆಸರಿಡದ", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "ಹೊರಗಡೆ ಪರಿವರ್ತಕವನ್ನು ರಚಿಸುವುದರಿಂದ ಬೇಟಿಗಾರರಿಗೆ ಕಾಣಬಹುದು", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "ಪರಿವರ್ತನೆಯ ಹೆಸರು", + "Variables": "ಪರಿವರ್ತನೆಗಳು", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuelle Tastatur", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "ಹೌದು", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "ಪಟ್ಟೆಕುದುರೆ ಬಣ್ಣ ಹಚ್ಚುವಿಕೆ", + "Zoom blocks": "ವಿಭಾಗಗಳನ್ನು ಹಿಗ್ಗಿಸು", + "Zoom blocks...": "ವಿಭಾಗಗಳನ್ನು ಹಿಗ್ಗಿಸು...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ ಹೊಂದಿದೆ _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ ಮುಂದೆ _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ ಶೇಷ _", + "_ of _": "_ ರದ್ದು _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "ಕೂಡಿಸು _ ಗೆ _", + "add a new Turtle sprite": "", + "add a new sprite": "ಹೊಸ ಯಕ್ಷಿಣಿಯನ್ನು ಕೂಡಿಸು", + "add comment": "ಟೀಕೆಯನ್ನು ಕೂಡಿಸಿ", + "add comment here...": "ಟೀಕೆಯನ್ನು ಇಲ್ಲಿ ಕೂಡಿಸಿ", + "agent": "", + "alert _": "ಎಚ್ಚರಿಕೆ _", + "all": "ಎಲ್ಲಾ", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "ಎಲ್ಲಾ ಆದರೆ ಮೊದಲನೆಯದು _", + "all but this script": "ಇ ಆಜ್ಞ್ಹೆಯನ್ನು ಬಿಟ್ಟು ಮತ್ತದ್ದೆಲ್ಲ", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "ಮತ್ತು", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "ಉತ್ತರ", + "any": "", + "any key": "", + "any message": "ಯಾವುದಾದರು ಮಾಹಿತಿ", + "anything": "", + "append _": "", + "arrange scripts vertically": "ಲಂಬವಾಗಿ ಆಜ್ಞ್ಹೆಗಳನ್ನೂ\\n ಹೊಂದಿಸಿರಿ", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "ಕೇಳು _ ಮತ್ತು ನಿಧಾನಿಸು", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "ದೊಡ್ಡದು (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "ವಿಭಾಗ ಅಳಿಸಬೇಕಾದ ಸಂಭಾಷಣಾ ಪಠ್ಯ", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "ವಿಭಾಗಗಳು", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "ಪ್ರಕಾಶಮಾನ", + "broadcast _ _": "ಪ್ರಸರಿಸು _ _", + "broadcast _ _ and wait": "ಪ್ರಸರಿಸು _ _ ಮತ್ತು ಕಾಯಬೇಕು", + "brush": "", + "build": "ನಿರ್ಮಿಸು", + "but getting a": "", + "c": "c", + "call _ _": "ಕರೆ _ _", + "call _ w/continuation": "ಕರೆ _ ಅಥವಾ ಮುಂದುವರಿಕೆ", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "ತಿರುಗಿಸಬಹುದು", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "ಬದಲಾಹಿಸು _ ರಷ್ಟು _", + "change _ effect by _": "ಪರಿಣಾಮವನ್ನು _ ಗೆ ಬದಲಾಹಿಸು _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ಗೆ ಲೇಖನಿ ಬಣ್ಣವನ್ನು ಬದಲಾಹಿಸು _", + "change pen shade by _": "ರಷ್ಟು ಲೇಖನಿ ನೆರಳನ್ನು ಬದಲಾಹಿಸು _", + "change pen size by _": "ರಷ್ಟು ಲೇಖನಿ ಗಾತ್ರವನ್ನು ಬದಲಾಹಿಸು _", + "change size by _": "ರಷ್ಟು ಗಾತ್ರವನ್ನು ಬದಲಾಹಿಸು _", + "change tempo by _": "ರಷ್ಟು ತಾಳವನ್ನು ಬದಲಾಹಿಸು _", + "change volume by _": "", + "change x by _": "ಬದಲಾಹಿಸು x ಅನ್ನು _", + "change y by _": "ಬದಲಾಹಿಸು y ಅನ್ನು _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "einschalten, damit Animationen überall gleich laufen", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "einschalten um die virtuelle Tastatur auf mobilen Geräten zu ermöglichen", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "ಎಲ್ಲಾವನ್ನು ಅಳಿಸು", + "clear": "ಅಳಿಸು", + "clear graphic effects": "ಎಲ್ಲಾ ಪರಿಣಾಮಗಳನ್ನು ಅಳಿಸು", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "ಬಣ್ಣ _ ಅನ್ನು ಮುಟ್ಟಿದಾಗ _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "ಹಾಸ್ಯ", + "command": "ಆದೇಶ", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "ಮುಖ್ಯ ಟರ್ಮಿನಲ್ ಕಡತ: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "ಉಡುಪು", + "costume name": "", + "costumes": "", + "costumes tab help": "ಇನ್ನಿತರ ಜಾಲತಾಣ ಅಥವಾ ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಿಂದ ಚಿತ್ರವನ್ನು ಇಲ್ಲಿಗೆ ಎಳೆಯುವುದರಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಬಹುದು", + "could not connect to:": "", + "cr": "ಸಿಅರ್", + "create a clone of _": "ನಂತೆ ತದ್ರೂಪುನ್ನು ರಚಿಸಿ _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "ಹೀಗಿನ ಅಧ್ಯಾಯದ ಆವೃತ್ತಿ", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "ಅಳಿಸು", + "delete _": "", + "delete _ of _": "ಅಳಿಸು _ ನ _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "ವಿಭಾಗದ ವ್ಯಾಖ್ಯೆಗಳನ್ನೂ ಅಳಿಸಿ", + "delete slot": "", + "delete this clone": "ತದ್ರೂಪುನ್ನು ಅಳಿಸು", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "ಪ್ರಾತ್ಯಕ್ಷಿಕೆ (1.2x)", + "demo...": "", + "detach all parts": "ಎಲ್ಲಾ ಭಾಗಗಳನ್ನು ಅಗುಲಿಸು", + "detach and put into the hand": "", + "detach from": "ಇದರಿಂದ ಅಗುಲಿಸು", + "development mode": "", + "development mode debugging primitives:": "ಬೆಳವಣಿಗೆಯ ಕ್ರಮ ದೋಷ ನಿದಾನ ಮುಲಾಗಳು", + "development mode...": "", + "dimensions": "", + "direction": "ದಿಕ್ಕು", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "ಕ್ಕೆ ದೂರ _", + "distribution": "", + "don't rotate": "ತಿರುಗಬೇಡ", + "down arrow": "ಕೆಳಮುಖ ಬಾಣ", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "ಎಳೆಯಬಹುದಾದ", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "ನಕಲು", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "ಅಂಚು", + "edit": "ಚಿತ್ರ ಸಂಕಲನ", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "ಚಿತ್ರ ಸಂಕಲನ...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "ರಪ್ತು ಮಾಡು", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "ರಫ್ತುಮಾಡು...", + "extract": "", + "f": "f", + "false": "ತಪ್ಪು", + "file": "", + "file menu import hint": "ಕಡತದ ಪರಿವಿಡಿ ಸೂಚನೆಯನ್ನು ಆಮದು ಮಾಡಿಕೊಳ್ಳಿ", + "fill": "", + "fill page...": "", + "filtered for _": "ಇದಕ್ಕೆ ಶೋಧಿಸಲಾಗಿದೆ _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "ಎಲ್ಲಾ ಯಕ್ಷಿಣಿಗಳಿಗೆ", + "for each _ in _ _": "", + "for this sprite only": "ಈ ಯಕ್ಷಿಣಿಗೆ ಮಾತ್ರ", + "forever _": "ಯಾವಾಗಲು _", + "frame": "", + "frames": "ಚೌಕಟ್ಟುಗಳು", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "ದೆವ್ವ", + "giant (8x)": "ದೈತ್ಯ (8x)", + "glide _ secs to x: _ y: _": "ಸರಿ _ ಸೆಕೆಂಡಿನಲ್ಲಿ,ಬಿಂದುವಿಗೆ x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "ಪದರಗಳು _ ರಷ್ಟು ಹಿಂದಕ್ಕೆ ಹೋಗು", + "go to _": "ಹೋಗು _", + "go to _ layer": "", + "go to front": "ಮುಂದಕ್ಕೆ ಹೋಗು", + "go to x: _ y: _": "ಹೋಗು x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "ನಮಸ್ಕಾರ", + "help": "ಸಹಾಯ", + "help...": "ಸಹಾಯ...", + "hide": "ಬಚ್ಚಿಡು", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "Basisblöcke ausblenden", + "hide variable _": "ಪರಿವರ್ತನೆಯನ್ನು ಬಚ್ಚಿಡು _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "ಅಧಿಕ (4x)", + "i": "i", + "identical to": "ಒಂದೇ ರೀತಿಯಾಗಿದೆ", + "if _ _": "ಒಂದುವೇಳೆ _ _", + "if _ _ else _": "ಒಂದುವೇಳೆ _ _ ಇಲ್ಲದಿದ್ದರೆ _", + "if _ then _ else _": "", + "if on edge, bounce": "ಒಂದು ವೇಳೆ ಕೊನೆಗೆ ಹೋದಾಗ ಜಿಗಿ", + "import a sound from your computer by dragging it into here": "ಶಬ್ದವನ್ನು ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಿಂದ ಇಲ್ಲಿಗೆ ಎಳೆಯುವುದರಿಂದ ಆಮದು ಮಾಡಿಕೊಳ್ಳಬಹುದು", + "import without attempting to parse or format data": "", + "import...": "ಆಮದು...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "ಊಡಿಕೆಯ ಪಟ್ಟಿ:", + "input names:": "ಊಡಿಕೆಯ ಹೆಸರುಗಳು:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "ಕೂಡಿಸು _ ರಲ್ಲಿ _ ನ _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "ಇದು _ ?", + "is _ a _ ?": "ಇದು _ ಇದರದೇ _ ?", + "is _ empty?": "", + "is _ identical to _ ?": "ಇದು _ ಒಂದೇ ರೀತಿಯಾಗಿದೆ _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "ಅಂಶ _ ರ _", + "items": "", + "j": "j", + "join _": "ಕೂಡಿಸು _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "ಕೀ _ ಒತ್ತಿದಾಗ?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "ಕನ್ನಡ", + "language_translator": "Vinayakumar R", + "large": "ದೊಡ್ಡದು", + "last": "ಕೊನೆ", + "last changed": "", + "last_changed": "2014-25-11", + "launch _ _": "ಉಡಾಯಿಸು _ _", + "left": "", + "left arrow": "ಎಡ ಬಾಣ", + "length": "", + "length of _": "ನ ಉದ್ದ _", + "length:": "ಉದ್ದ:", + "let the World automatically adjust to browser resizing": "", + "letter": "ಅಕ್ಷರ", + "letter _ of _": "ಅಕ್ಷರ _ ರಲ್ಲಿ _", + "light (70)": "", + "lightness": "", + "line": "ಸಾಲು", + "lines": "", + "list": "ಪಟ್ಟಿ", + "list _": "ಪಟ್ಟಿ _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "ಶಕ್ತಿಯುತವಾದ ವಿಭಾಗಗಳ\\n ಅಧಿಕೃತ ಭಂಡಾರವನ್ನು ತುಂಬಿಸಿರಿ", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "ಹೊಸ ವಿಭಾಗವನ್ನು ಮಾಡಿ ...", + "make a category...": "", + "make a copy and pick it up": "ನಕಲನ್ನು ಮಾಡಿ \\nಮತ್ತು ತೆಗೆದುಕೊಳ್ಳಿ", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "ಮಾಹಿತಿ", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "ಘೋರಾಕಾರದ (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "ಮೌಸ್ ಮುಕ್ತ?", + "mouse position": "", + "mouse x": "ಮೌಸ್ x", + "mouse y": "ಮೌಸ್ y", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "ಸೂಚಕಸಾಧನ ಮೌಸ್", + "move": "ಚಲಿಸು", + "move _ steps": "ಚಲಿಸು _ ಹೆಜ್ಜೆಗಳು", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "ಸ್ವತಃ ನಾನು", + "n": "n", + "name": "", + "neg": "", + "negative": "ನಕಾರಾತ್ಮಕ", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "ಹೊಸ...", + "next": "", + "next costume": "ಮುಂದಿನ ಉಡುಪು", + "none": "ಯಾವುದೂ ಇಲ್ಲ", + "normal": "ಸಾಮಾನ್ಯ", + "normal (1x)": "ಸಾಮಾನ್ಯ (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "ಇಲ್ಲ _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "ಅಂಕಿ:", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "ಈ ವಿಭಾಗವನ್ನು ಮಾತ್ರ ನಕಲು ಮಾಡಿ", + "only face left/right": "ಮುಖ ಬಲಗಡೆ/ಎಡಗಡೆ", + "only grab this block": "", + "open a new window with a picture of all scripts": "ಎಲ್ಲಾ ಆಜ್ಞ್ಹೆಗಳ ಚಿತ್ರದ ಜೊತೆ\\n ಹೊಸ ಕಿಟಕಿಯನ್ನು ತೆರೆ", + "open a new window with a picture of the stage": "ಈ ವೇದಿಕೆಯ ಚಿತ್ರದ ಜೊತೆ\\n ಹೊಸ ಕಿಟಕಿಯನ್ನು ತೆರೆ", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "ಈ ಆಜ್ಞ್ಹೆಯ ಚಿತ್ರದ ಜೊತೆ \\nಹೊಸ ಕಿಟಕಿಯನ್ನು ತೆರೆ", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "ಅಥವಾ", + "or before": "", + "other clones": "", + "other scripts in sprite": "ಇ ಯಕ್ಷಿಣಿಯಲ್ಲಿ ಇನ್ನಿತರ ಆಜ್ಞ್ಹೆಗಳು", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "ಎಲ್ಲವನ್ನು ನಿಲ್ಲಿಸು _", + "pen": "", + "pen _": "", + "pen down": "ಲೇಖನಿಯುಕ್ತ", + "pen down?": "", + "pen trails": "ಲೇಖನಿಯ ಪರೀಕ್ಷಣೆ", + "pen up": "ಲೇಖನಿಮುಕ್ತ", + "pen vectors": "", + "pic...": "ಚಿತ್ರ...", + "pick random _ to _": "ಎಷ್ಟನಾದರು ಯಾದೃಚಿಕವಾಗಿ ಆಯ್ದುಕೋ _ ರಿಂದ _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "ಸಂಗೀತಸ್ವರ _ ಅನ್ನು _ ಲಯದಲ್ಲಿ ಕೇಳಿಸಿ", + "play sound _": "ಶಬ್ದ ಕೇಳಿಸು _", + "play sound _ at _ Hz": "", + "play sound _ until done": "ಆಗುವವರಗೆ _ ಶಬ್ದ ಕೇಳಿಸು", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "ಬಿಂದುವಿನ ದಿಕ್ಕಿನ ಕಡೇ _", + "point towards _": "ದಿಕ್ಕಿನ ಕಡೇಗೆ _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "ವಿಜ್ಝ್ನ್ಯಾಪಿಸು", + "presentation (1.4x)": "ಪ್ರದರ್ಶನ (1.4x)", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "ಯಾವುದಾದರು", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "ಮತ್ತೆ ಬರೆ...", + "release": "", + "remove block variables...": "", + "rename": "ಪುನರ್ನಾಮಕರಣ", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "ಉಡುಪನ್ನು ಪುನರ್ನಾಮಕರಣ ಮಾಡು", + "rename only this reporter": "", + "rename sound": "ಶಬ್ದವನ್ನು ಪುನರ್ನಾಮಕರಣ ಮಾಡು", + "rename...": "ಪುನರ್ನಾಮಕರಣ...", + "repeat _ _": "ಮರುಕಳಿಸು _ mal _", + "repeat until _ _": "ವರೆಗೂ ಮರುಕಳಿಸು _ _", + "replace item _ of _ with _": "ಅಂಶವನ್ನು ಬದಲಾಹಿಸು _ ರ _ ಜೊತೆ _", + "report _": "ನಿರೂಪಿಸು _", + "reporter": "ವರದಿಗಾರ", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "ಸಮಯಸೂಚಕವನ್ನು ಮರುಹೊಂದಿಸು", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "ಲಯವನ್ನು _ ರಷ್ಟು ನಿಲ್ಲಿಸಿ", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "ಬಲ ಬಾಣ", + "ring": "", + "ringify": "", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "ಸರಿಮಾಡು _", + "run _ _": "ಓಡಿಸು _ _", + "run _ w/continuation": "ಓಡಿಸು _ ಅಥವಾ ಮುಂದುವರಿಕೆ", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "ಹೇಳು _", + "say _ for _ secs": "ಹೇಳು _ ಅಂತ _ ಸೆಕೆಂಡಿನಲ್ಲಿ", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "ಆಗ್ನ್ಹೆಯ ಚಿತ್ರ...", + "script variables _": "ಆಜ್ಞ್ಹೆಗಳ ಪರಿವರ್ತಕಗಳು _", + "scripts": "", + "scripts pic...": "ಆಜ್ಞ್ಹೆಯ ಚಿತ್ರ ...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "ಆಯ್ಕೆ", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "ಪರಿಣಾಮವನ್ನು _ ಗೆ ಹೊಂದಿಸು _", + "set _ of block _ to _": "", + "set _ to _": "ಗೆ ಕೂಡಿಸು _ ಅನ್ನು _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "ಗೆ ಲೇಖನಿ ಬಣ್ಣವನ್ನು ಹೊಂದಿಸು _", + "set pen shade to _": "ರಷ್ಟು ಲೇಖನಿ ನೆರಳನ್ನು ಹೊಂದಿಸು _", + "set pen size to _": "ರಷ್ಟು ಲೇಖನಿ ಗಾತ್ರವನ್ನು ಹೊಂದಿಸು _", + "set size to _ %": "ರಷ್ಟು ಗಾತ್ರವನ್ನು ಹೊಂದಿಸು _ %", + "set tempo to _ bpm": "ತಾಳವನ್ನು _ ಗೆ ಹೊಂದಿಸು", + "set this morph's alpha value": "", + "set turbo mode to _": "ಗೆ ಗಾಳಿ ವಿಧಾನವನ್ನು ಹೊಂದಿಸು _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "ಹೊಂದಿಸು x ಅನ್ನು _", + "set y to _": "ಹೊಂದಿಸು y ಅನ್ನು _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "ತೋರಿಸು", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "ಎಲ್ಲಾವನ್ನು ತೋರಿಸು", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "ಹೊಸ ವೀಕ್ಷಕ ತಂತ್ರಾಂಶದಲ್ಲಿ\\n ಜಾಗತಿಕವಾದ ಗ್ರಾಹಕೀಕೃತ ವಿಭಾಗಗಳ ವ್ಯಾಖ್ಯೆಗಳನ್ನೂ ತೋರಿಸಿರಿ", + "show primitives": "ಮೂಲಗಳನ್ನೂ ಬಚ್ಚಿಡಿ", + "show project data as XML in a new browser window": "ಹೊಸ ವೀಕ್ಷಕ ತಂತ್ರಾಂಶದಲ್ಲಿ\\n ಪ್ರಾಯೋಜನೆಯ ದತ್ತಾಂಶವನ್ನು XML ನಂತೆ ತೋರಿಸಿರಿ", + "show table _": "", + "show the World's menu": "", + "show variable _": "ಪರಿವರ್ತನೆಯನ್ನು ತೋರಿಸು _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "ಗಾತ್ರ", + "slider": "ಜಾರು ನಿಯಂತ್ರಕ", + "slider max...": "ಅಧಿಕ ಜಾರು ನಿಯಂತ್ರಕ...", + "slider min...": "ಕಡಿಮೆ ಜಾರು ನಿಯಂತ್ರಕ...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "ಜಾಗ", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "ಬೇರೆಮಾಡು _ ಅನ್ನು _", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "", + "stack size": "ಮೆದೆಯ ಗಾತ್ರ", + "stage": "", + "stage image": "", + "stamp": "ಮುದ್ರಿಸು", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "ನಿಲ್ಲಿಸು _", + "stop all sounds": "ಎಲ್ಲಾ ಶಬ್ದಗಳನ್ನು ನಿಲ್ಲಿಸು", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "ಉಡುಪನ್ನು _ ಗೆ ಬದಲಾಹಿಸು", + "switch to scene _ _": "", + "t": "t", + "tab": "ಕೀಲಿ", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "ತಾಳ", + "temporary?": "", + "text": "ಪಠ್ಯ", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "ಅಂಶ", + "think _": "ಯೋಚಿಸು _", + "think _ for _ secs": "ಯೋಚಿಸು _ ಅಂತ _ ಸೆಕೆಂಡುಗಳವರಗೆ", + "this _": "", + "this block": "ಇ ವಿಭಾಗ", + "this project doesn't have any custom global blocks yet": "", + "this script": "ಇ ಆಜ್ಞ್ಹೆ", + "time in milliseconds": "", + "timer": "ಸಮಯಸೂಚಕ", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "ಮುಟ್ಟಿದಾಗ _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "vnkmr7620@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "", + "turbo mode": "", + "turbo mode?": "ಗಾಳಿ ವಿಧಾನ?", + "turn _ _ degrees": "ತಿರುಗು _ _ ಕೋನದಲ್ಲಿ", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "ಬಗೆ _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "ausschalten, um Animationen dynamischer auszuführen", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "", + "uncheck to allow script reentrance": "", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "ausschalten um die virtuelle Tastatur auf mobilen Geräten zu sperren", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "ದೃಢ ಇಳಿತ ಉಪಯೋಗವನ್ನು ನಿಷ್ಕ್ರಿಯೆಗೊಳಿಸಿ ನೆರಳು ಮತ್ತು ಸುಪ್ರಕಾಶಕ", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "ಈ ಫಲಕದಲ್ಲಿ\\n ಕೊನೆಯ ವಿಭಾಗದ\\n ಅವನತಿಯನ್ನು ರದ್ದು ಮಾಡು", + "undrop": "ಅವನತಿ ಮಾಡದ", + "unicode _ as letter": "ಯೂನಿಕೋಡ್ _ ನ ಅಕ್ಷರ", + "unicode of _": "ರ ಯೂನಿಕೋಡ್ _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "", + "unused": "", + "unused block(s) removed": "", + "up arrow": "ಮೇಲಿನಬಾಣ", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "ನಿಧಾನಿಸು _ ಸೆಕೆಂಡಿನಷ್ಟು", + "wait until _": "ವರಗೂ ಕಾಯಬೇಕು _", + "wardrobe": "", + "warp _": "ಸುತ್ತಿಹಾಕು _", + "what's your name?": "ನಿಮ್ಮ ಹೆಸರೇನು?", + "when I am _": "ಯಾವಾಗಲಾದರೂ ನಾನು ಒತ್ತಿದಾಗ _", + "when I receive _ _": "ಯಾವಾಗಲಾದರು _ _ ಸ್ವೀಕರಿಸಿದಾಗ", + "when I start as a clone": "ಯಾವಾಗಲಾದರು ತದ್ರೂಪು ತರಹ ಪ್ರಾರಂಭಿಸಿದಾಗ", + "when _": "", + "when _ clicked": "ಯಾವಾಗಲಾದರೂ _ ಒತ್ತಿದಾಗ", + "when _ is edited _": "", + "when _ key pressed _": "ಯಾವಾಗಲಾದರೂ _ _ ಕೀ ಒತ್ತಿದಾಗ", + "whirl": "", + "whitespace": "ಖಾಲಿಜಾಗ", + "width": "", + "with data": "", + "with inputs": "ಊಡಿಕೆಯ ಜೊತೆ", + "word": "", + "world": "ಪ್ರಪಂಚ", + "write _ size _": "", + "x": "x", + "x position": "x-ಸ್ಥಾನ", + "y": "y", + "y position": "y-ಸ್ಥಾನ", + "year": "", + "year:": "", + "your own": "ನಿಮ್ಮ ಸ್ವಂತಿಕೆ", + "z": "z", + "ಸರಿ": "wahr" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ko.js b/elements/pl-snap/Snap/locale/lang-ko.js new file mode 100644 index 00000000..bd325b21 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ko.js @@ -0,0 +1,1388 @@ +SnapTranslator.dict.ko = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) 왼쪽", + "(0) up": "(0) 위", + "(1) sine": "", + "(180) down": "(180) 아래", + "(180) right": "(180) 아래", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) 오른쪽", + "(empty)": "(공란)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snap에 대해서", + "About...": "Snap! 에 대해서...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "애니메이션", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "아무값 (평가되지 않음)", + "Any type": "아무타입", + "Apply": "적용", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "정말로 삭제합니까?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "뒤로…", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "블록 편집기", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "반투명 그림자", + "Boolean": "불리언", + "Boolean (T/F)": "불리언 (참/거짓)", + "Boolean (unevaluated)": "불리언 (평가되지 않음)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "펜 크기", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "취소", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "블록 변경", + "Clear backup": "", + "Clicking sound": "블록 클릭시 소리", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "체계화 지원", + "Colors and Crayons": "", + "Command": "커맨드", + "Command (C-shape)": "커맨드 (C-모양)", + "Command (inline)": "커맨드 (인라인)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "도형 크기 비율을 고정하는가? (shift 키를 눌러서 사용할 수 있습니다.)", + "Contents": "", + "Contributors": "기여자:", + "Control": "제어", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "모양 편집기", + "Costumes": "모양", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "입력 이름 생성", + "Create variables": "", + "Create variables in program": "", + "Credits...": "크레디트...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "기본설정", + "Default Value:": "기본 값:", + "Delete": "삭제", + "Delete Custom Block": "블록 삭제하기", + "Delete Project": "프로젝트 삭제", + "Delete a variable": "변수 삭제하기", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "소스코드 다운로드", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "입력 이름 편집", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "지우개 도구", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "모든 스크립트를 그림파일로 내보내기", + "Export blocks": "블록 내보내기", + "Export blocks...": "블록 내보내기...", + "Export project as plain text...": "프로젝트를 텍스트 파일로 내보내기...", + "Export project...": "프로젝트 내보내기...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "색 채우기", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "채워진 타원 그리기 도구 (shift: 원)", + "Filled Rectangle (shift: square)": "채워진 사각형 그리기 도구 (shift: 정사각형)", + "First-Class Sprites": "", + "Flat design": "플랫(Flat) 디자인", + "Flat line ends": "선 끝을 평평하게 만들기", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "안녕!", + "Hello, World!": "", + "Help": "도움말", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "흠…", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "라이브러리 가져오기", + "Import sound": "", + "Import tools": "추가 도구 가져오기", + "Import...": "가져오기...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "매개변수이름:", + "Input Slot Options": "", + "Input name": "입력 이름", + "Input sliders": "입력창에서 슬라이더 사용", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "언어선택...", + "Libraries...": "라이브러리...", + "License": "라이센스", + "License...": "라이센스...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "선 그리기 도구 (shift: 수평/수직)", + "List": "리스트", + "List utilities": "", + "Lists": "리스트", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "로그인...", + "Logout": "", + "Long form input dialog": "긴 형태의 입력 대화창", + "Looks": "형태", + "Make a block": "블록 만들기", + "Make a variable": "변수 만들기", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "메시지 이름", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "모듈...", + "Motion": "동작", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "다중 입력 (값은 리스트의 입력값입니다)", + "Nested auto-wrapping": "", + "New": "새로 만들기", + "New Category": "", + "New Project": "새로운 프로젝트", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "아니오", + "November": "", + "Number": "숫자", + "OK": "확인", + "Object": "객체", + "October": "", + "Ok": "확인", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "열기", + "Open Project": "프로젝트 열기", + "Open Projekt": "프로젝트 열기", + "Open in Community Site": "", + "Open...": "열기...", + "Opening project...": "", + "Operators": "연산", + "Other": "기타", + "Output text using speech synthesis.": "", + "Paint Editor": "그림 편집기", + "Paint a new costume": "새로운 모양 그리기", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "붓 도구", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "펜", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "스포이드 도구 (원하는 색 선택하기)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "새로 만든 블록 인수 설정", + "Play": "재생", + "Play sound": "소리 재생", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "프레디키트", + "Prefer empty slot drops": "빈 슬롯에 입력 가능", + "Prefer smooth animations": "자연스러운 애니메이션", + "Privacy...": "", + "Project Notes": "프로젝트 메모", + "Project URLs": "", + "Project notes...": "프로젝트 메모...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "참고자료 다운로드", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "현재 프로젝트를 새로운 프로젝트로 교체하시겠습니까?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "리포터", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "비밀번호 재설정...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "저장하기", + "Save As...": "다른 이름으로 저장하기...", + "Save Project": "", + "Save Project As...": "프로젝트 저장...", + "Save to disk": "내 컴퓨터에 저장하기", + "Saved!": "저장했습니다!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "스크립트", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "추가적인 블록을 선택해서 사용할 수 있습니다.", + "Selection tool": "", + "Sensing": "관찰", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "회전축 설정하기", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "계정만들기...", + "Single input.": "단일 입력", + "Single palette": "", + "Slider maximum value": "슬라이더 최대값 설정", + "Slider minimum value": "슬라이더 최소값 설정", + "Snap! website": "Snap! 웹사이트", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "소리", + "Sound Recorder": "", + "Sounds": "소리", + "Sprite": "스프라이트", + "Sprite Nesting": "", + "Stage": "무대", + "Stage height": "세로(높이)", + "Stage selected: no motion primitives": "무대 선택: 사용 가능한 동작 블록이 없습니다.", + "Stage size": "무대 크기", + "Stage size...": "무대 크기 설정...", + "Stage width": "가로(너비)", + "Stop": "정지", + "Stop sound": "소리 정지", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "타원 그리기 도구 (shift: 원)", + "Stroked Rectangle (shift: square)": "사각형 그리기 도구 (shift: 정사각형)", + "Switch back to user mode": "사용자 모드로 전환", + "Switch to dev mode": "개발자 모드로 전환", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "텍스트", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "스레드 안전 스크립트", + "Title text": "제목 텍스트", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "번역", + "Translators...": "번역자", + "Turbo mode": "터보 모드", + "Turtle": "화살표", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "이름없음", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - 호출자에게 내부 변수 보이게 만들기", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "변수 이름", + "Variables": "변수", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "가상 키보드", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "예", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "중첩 블록 구분하기", + "Zoom blocks": "블록 크기 설정", + "Zoom blocks...": "블록 크기 설정...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "리스트 _ 에 _ 포함되었는가?", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ 을(를) 리스트 _ 의 맨 앞에 추가하기", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "( _ / _ ) 의 나머지", + "_ of _": "_ ( _ 에 대한)", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "절대값(abs)", + "acos": "acos", + "add _ to _": "_ 을(를) 리스트 _ 의 마지막에 추가하기", + "add a new Turtle sprite": "새로운 스프라이트 추가하기", + "add a new sprite": "", + "add comment": "주석 추가하기", + "add comment here...": "여기에 주석 추가…", + "agent": "", + "alert _": "경고: _", + "all": "모두", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "리스트 _ 에서 첫 번째 항목 제외하기", + "all but this script": "이 스크립트를 제외한 모두", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "그리고", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "대답", + "any": "", + "any key": "", + "any message": "어떤 메시지", + "anything": "", + "append _": "", + "arrange scripts vertically": "스크립트를 수직으로 정렬한다.", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ 을(를) 묻고 기다리기", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "큰 크기 (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "이 블록과 모든 인스턴스를 삭제해도 괜찮습니까?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "블록", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "밝기", + "broadcast _ _": "_ _ 방송하기", + "broadcast _ _ and wait": "_ _ 방송하고 기다리기", + "brush": "", + "build": "만들기", + "but getting a": "", + "c": "c", + "call _ _": "_ 을(를) _ 으로 호출하기", + "call _ w/continuation": "반복해서 _ 을(를) 호출하기", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "회전가능", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "변수 _ 을(를) _ 만큼 바꾸기", + "change _ effect by _": "_ 효과를 _ 만큼 바꾸기", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "펜 색깔을 _ 만큼 바꾸기", + "change pen shade by _": "펜 음영을 _ 만큼 바꾸기", + "change pen size by _": "펜 굵기를 _ 만큼 바꾸기", + "change size by _": "크기를 _ 만큼 바꾸기", + "change tempo by _": "빠르기를 _ 만큼 바꾸기", + "change volume by _": "", + "change x by _": "x좌표 _ 만큼 바꾸기", + "change y by _": "y좌표 _ 만큼 바꾸기", + "check for alternative GUI design": "체크하면, 플랫(Flat) 디자인으로 변경합니다.", + "check for block to text mapping features": "체크하면, check for block to text mapping features", + "check for flat ends of lines": "체크하면, 선 끝을 평평하게 만듭니다.", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "체크하면, 애니메이션이 자연스러워 집니다.", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "체크하면, 입력 대화창에 항상 슬롯의 형태를 보여줍니다.", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "체크하면, 스크립트 재진입성을 허락하지 않습니다.", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "체크하면, 중첩된 블록을 다른 색으로 구분할 수 있습니다.", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "체크하면, 입력창에서 슬라이더를 사용할 수 있습니다.", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "체크하면, 모바일 기기에서 가상 키보드를 사용할 수 있습니다.", + "check to hide (+) symbols in block prototype labels": "체크하면, 블록 편집기에서 블록 인수 추가 버튼(+)을 숨깁니다.", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "체크하면, 스크립트를 빠르게 실행합니다.", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "체크하면, 블록 클릭시 소리가 켜집니다.", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "체크하면, 그림자와 하이라이트가 반투명 상태로 됩니다.", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "스크립트 정리하기", + "clear": "펜 자국 지우기", + "clear graphic effects": "그래픽 효과 지우기", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "클릭 또는 드래그 해서 회전 중심 설정하기", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ 색이 _ 색에 닿았는가?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "코믹", + "command": "커맨드", + "comment pic...": "주석을 그림파일로 내보내기...", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "색종이", + "console log _": "콘솔 로그 _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "모양 번호", + "costume name": "", + "costumes": "", + "costumes tab help": "다른 웹페이지나 컴퓨터에 있는 이미지 파일을 여기로 드래그해서 가져옵니다.", + "could not connect to:": "", + "cr": "새줄(cr)", + "create a clone of _": "_ 을(를) 복제하기", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "현재 _", + "current module versions:": "현재 모듈 버전:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "일", + "day of week": "요일(1~7)", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "삭제하기", + "delete _": "", + "delete _ of _": "_ 번째 항목 삭제하기 (리스트 _ 에 대한)", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "블록 삭제하기", + "delete slot": "", + "delete this clone": "이 복제본 삭제하기", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "데모 크기 (1.2x)", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "개발자 모드", + "development mode debugging primitives:": "개발자 모드 디버깅 프리미티브:", + "development mode...": "", + "dimensions": "", + "direction": "방향", + "disable deep-Morphic context menus and show user-friendly ones": "고도의 모픽 컨텍스트 메뉴를 숨겨 사용자 친화적으로 보여줍니다.", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ 까지 거리", + "distribution": "", + "don't rotate": "회전할 수 없습니다", + "down arrow": "아래쪽 화살표", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "마우스로 직접 움직이기", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "복사하기", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "벽", + "edit": "스크립트 편집하기", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "편집…", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "모픽 컨텍스트 메뉴와 인스펙터를 사용할 수 있으나, 사용자 친화적이지 않습니다!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - store this project in your downloads folder": "실험적 - 이 프로젝트를 다운로드 폴더에 저장합니다.", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "내보내기", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "내보내기...", + "extract": "", + "f": "f", + "false": "거짓", + "file": "", + "file menu import hint": "내보낸 프로젝트 파일, 블록 라이브러리 스프라이트 모양 또는 소리를 가져옵니다.", + "fill": "", + "fill page...": "", + "filtered for _": "_ 색 추출하기", + "find blocks": "", + "find blocks...": "블록 찾기...", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "↔ 반전", + "flip ↕": "↕ 반전", + "floor": "바닥(floor)", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "모든 스프라이트에 대해", + "for each _ in _ _": "", + "for this sprite only": "이 스프라이트에 대해", + "forever _": "무한 반복하기 _", + "frame": "", + "frames": "프레임", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "유령", + "giant (8x)": "정말 큰 크기 (8x)", + "glide _ secs to x: _ y: _": "_ 초 동안 x: _ 、y: _ 쪽으로 이동하기", + "global?": "", + "globe": "", + "go back _ layers": "_ 번째로 물러나기", + "go to _": "_ 위치로 이동하기", + "go to _ layer": "", + "go to front": "맨 앞으로 나오기", + "go to x: _ y: _": "x: _ 、y: _ 쪽으로 이동하기", + "gray scale palette": "", + "green": "", + "grow": "확대", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "안녕", + "help": "도움말", + "help...": "블록 도움말...", + "hide": "숨기기", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "기본 블록 숨기기", + "hide variable _": "변수 _ 숨기기", + "high": "", + "hour": "시간", + "http:// _": "", + "hue": "", + "huge (4x)": "매우 큰 크기(4x)", + "i": "i", + "identical to": "가 동일한가", + "if _ _": "만약 _ 라면 _", + "if _ _ else _": "만약 _ 라면 _ 아니면 _", + "if _ then _ else _": "", + "if on edge, bounce": "벽에 닿으면 튕기기", + "import a sound from your computer by dragging it into here": "컴퓨터에 있는 소리 파일을 여기로 드래그해서 가져옵니다.", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "", + "input names:": "매개변수이름:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "_ 을(를) _ 위치에 추가하기 (리스트 _ 에 대한)", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "와(과) _ ?", + "is _ a _ ?": "_ 이(가) _ 인가?", + "is _ empty?": "", + "is _ identical to _ ?": "_ 와(과) _ 가 동일한가?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "_ 번째 항목 (리스트 _ 에 대한)", + "items": "", + "j": "j", + "join _": "_ 결합하기", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ 키를 눌렀는가?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "한국어", + "language_translator": "Yunjae Jang", + "large": "크게 보기", + "last": "마지막", + "last changed": "", + "last_changed": "2015-01-21", + "launch _ _": "_ 을(를) _ 으로 동시실행하기", + "left": "", + "left arrow": "왼쪽 화살표", + "length": "", + "length of _": "리스트 _ 의 항목 갯수", + "length:": "길이:", + "let the World automatically adjust to browser resizing": "", + "letter": "글자", + "letter _ of _": "_ 번째 글자 ( _ 에 대한)", + "light (70)": "", + "lightness": "", + "line": "줄", + "lines": "", + "list": "리스트", + "list _": "리스트 _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "강력한 기능을 제공하는 블록들을 가져옵니다.", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "블록 만들기...", + "make a category...": "", + "make a copy and pick it up": "복사해서 들고 있습니다.", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "메시지", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "분", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "믿을 수 없는 크기 (10x)", + "month": "월", + "mosaic": "", + "motion": "", + "mouse down?": "마우스를 클릭했는가?", + "mouse position": "", + "mouse x": "마우스의 x좌표", + "mouse y": "마우스의 y좌표", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "마우스의 포인터", + "move": "", + "move _ steps": "_ 만큼 움직이기", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "나 자신", + "n": "n", + "name": "", + "neg": "", + "negative": "반전", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "새로 만들기...", + "next": "", + "next costume": "다음 모양", + "none": "모두 취소", + "normal": "보통 읽기", + "normal (1x)": "기본 크기 (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "_ 이(가) 아니다", + "note": "", + "nothing": "", + "now connected.": "", + "number": "숫자", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "", + "only face left/right": "왼쪽에서 오른쪽으로만", + "only grab this block": "", + "open a new window with a picture of all scripts": "새로운 창을 열어서 모든 스크립트를 그림으로 저장한다.", + "open a new window with a picture of the stage": "새로운 창을 열고 무대의 화면을 그림파일로 저장한다.", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "이 스크립트 그림을 새로운 윈도우에서 엽니다.", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "또는", + "or before": "", + "other clones": "", + "other scripts in sprite": "이 스프라이트에 있는 다른 스크립트", + "other sprites": "", + "p": "p", + "paint a new sprite": "새로운 스프라이트 그리기", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "모두 잠시 멈추기 _", + "pen": "", + "pen _": "", + "pen down": "펜 내리기", + "pen down?": "", + "pen trails": "펜의 궤적", + "pen up": "펜 올리기", + "pen vectors": "", + "pic...": "그림파일로 내보내기...", + "pick random _ to _": "_ 부터 _ 사이의 난수", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ 음을 _ 박자로 연주하기", + "play sound _": "_ 소리내기", + "play sound _ at _ Hz": "", + "play sound _ until done": "_ 을(를) 끝까지 소리내기", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ 도 방향 보기", + "point towards _": "_ 쪽 보기", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "프레디키트", + "presentation (1.4x)": "발표용 크기 (1.4x)", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "임의", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "블록 바꾸기...", + "release": "", + "remove block variables...": "", + "rename": "이름 수정하기", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "", + "rename only this reporter": "", + "rename sound": "", + "rename...": "이름수정...", + "repeat _ _": "_ 번 반복하기 _", + "repeat until _ _": "_ 까지 반복하기 _", + "replace item _ of _ with _": "_ 번째 (리스트 _ 에 대한) 를 _ (으)로 바꾸기", + "report _": "_ 출력하기", + "reporter": "리포터", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "타이머 초기화", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "_ 박자 동안 쉬기", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "오른쪽 화살표", + "ring": "", + "ringify": "블록형태 변환하기", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ 반올림", + "run _ _": "_ 을(를) _ 으로 실행하기", + "run _ w/continuation": "반복해서 _ 을(를) 실행하기", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ 말하기", + "say _ for _ secs": "_ 을(를) _ 초 동안 말하기", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "이 스크립트를 그림파일로 내보내기...", + "script variables _": "스크립트 변수 _", + "scripts": "", + "scripts pic...": "모든 스크립트를 그림파일로 내보내기...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "초", + "select": "선택", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ 효과를 _ 만큼 정하기", + "set _ of block _ to _": "", + "set _ to _": "변수 _ 에 _ 저장하기", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "펜 색깔을 _ 으로 정하기", + "set pen shade to _": "펜 음영을 _ 으로 정하기", + "set pen size to _": "펜 굵기를 _ (으)로 정하기", + "set size to _ %": "크기를 _ % 로 정하기", + "set tempo to _ bpm": "빠르기를 _ bpm으로 정하기", + "set this morph's alpha value": "", + "set turbo mode to _": "터보 모드 _ 으로 설정하기", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "x좌표 _ (으)로 정하기", + "set y to _": "y좌표 _ (으)로 정하기", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "설정 메뉴에 빈 슬롯의 힌트를 사용할 수 있습니다.", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "보이기", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "모든 스크립트와 정의된 블록을 그림파일로 보여줍니다.", + "show all": "모든 스프라이트 나타내기", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "새롭게 정의한 전역 블록 데이터를 새로운 윈도우에 XML 형태로 보여주기", + "show primitives": "기본 블록 보이기", + "show project data as XML in a new browser window": "프로젝트 데이터를 새로운 윈도우에 XML 형태로 보여주기", + "show table _": "", + "show the World's menu": "", + "show variable _": "변수 _ 보이기", + "shown?": "", + "shrink": "축소", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "크기", + "slider": "슬라이더", + "slider max...": "슬라이더 최대값 설정...", + "slider min...": "슬라이더 최소값 설정...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "스페이스", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "_ 를 _ 기준으로 나누기", + "sprite": "", + "sprites": "", + "sqrt": "제곱근(sqrt)", + "square": "", + "stack size": "스택 크기", + "stage": "", + "stage image": "", + "stamp": "도장찍기", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "_ 멈추기", + "stop all sounds": "모든 소리 끄기", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "모양 _ 로 바꾸기", + "switch to scene _ _": "", + "t": "t", + "tab": "탭", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "빠르기", + "temporary?": "", + "text": "문자", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "어떤 것", + "think _": "_ 생각하기", + "think _ for _ secs": "_ 을(를) _ 초 동안 생각하기", + "this _": "", + "this block": "이 블록", + "this project doesn't have any custom global blocks yet": "이 프로젝트에는 아직 새로 만든 전역 블록이 없습니다.", + "this script": "이 스크립트", + "time in milliseconds": "밀리세컨드초", + "timer": "타이머", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "_ 에 닿았는가?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "janggoons@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "참", + "turbo mode": "", + "turbo mode?": "터보 모드인가?", + "turn _ _ degrees": "_ _ 도 돌기", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ 의 타입", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "체크해제하면, 기본 GUI 디자인으로 변경합니다.", + "uncheck for greater speed at variable frame rates": "체크해제하면, 프레임 전환 비율이 빨라집니다.", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "체크해제하면, 선 끝을 둥글게 만듭니다.", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "체크해제하면, 기존 리포터 블록에 새로운 리포터 블록으로 대체할 수 있습니다.", + "uncheck to allow script reentrance": "체크해제하면, 스크립트 재진입성을 허락합니다.", + "uncheck to always show (+) symbols in block prototype labels": "체크해제하면, 블록 편집기에서 블록 인수 추가 버튼(+)을 보입니다.", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "체크해제하면, IDE 애니메이션을 사용할 수 없습니다.", + "uncheck to disable alternating colors for nested block": "체크해제하면, 중첩된 블록을 다른 색으로 구분할 수 없습니다.", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "체크해제하면, 입력창에서 슬라이더를 사용할 수 없습니다.", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "체크해제하면, 모바일 기기에서 가상 키보드를 사용할 수 없습니다.", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "체크해제하면, 스크립트 실행 속도를 보통으로 합니다.", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "체크해제하면, 블록 클릭시 소리가 꺼집니다.", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "체크해제하면, 그림자와 하이라이트가 불투명 상태로 됩니다.", + "uncheck to use the input dialog in short form": "체크해제하면, 입력 대화창을 짧은 형태로 사용합니다.", + "uncompile": "", + "undo": "되돌리기", + "undo the last block drop in this pane": "마지막으로 가져온 블록을 확인한다.", + "undrop": "마지막으로 가져온 블록", + "unicode _ as letter": "유니코드 _ 에 대한 문자", + "unicode of _": "_ 의 유니코드", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "블록형태변환 취소하기", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "이름없음", + "unused": "", + "unused block(s) removed": "", + "up arrow": "위쪽 화살표", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ 초 기다리기", + "wait until _": "_ 까지 기다리기", + "wardrobe": "", + "warp _": "워프 _", + "what's your name?": "당신의 이름은?", + "when I am _": "이 스프라이트를 클릭했을 때 _", + "when I receive _ _": "_ _ 을(를) 받았을 때", + "when I start as a clone": "복제되었을 때", + "when _": "", + "when _ clicked": "_ 클릭했을 때", + "when _ is edited _": "", + "when _ key pressed _": "_ _ 키를 눌렀을 때", + "whirl": "", + "whitespace": "빈칸", + "width": "", + "with data": "", + "with inputs": "매개변수", + "word": "", + "world": "세상", + "write _ size _": "", + "x": "x", + "x position": "x좌표", + "y": "y", + "y position": "y좌표", + "year": "연도", + "year:": "", + "your own": "나만의", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ml.js b/elements/pl-snap/Snap/locale/lang-ml.js new file mode 100644 index 00000000..8664c755 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ml.js @@ -0,0 +1,1385 @@ +SnapTranslator.dict.ml = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "", + "(0) up": "", + "(1) sine": "", + "(180) down": "", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "", + "(empty)": "", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "", + "About...": "", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "", + "Any type": "", + "Apply": "", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "", + "Boolean": "", + "Boolean (T/F)": "", + "Boolean (unevaluated)": "", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "ക്യാന്‍സല്‍ ചെയ്യുക", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "", + "Clear backup": "", + "Clicking sound": "", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "", + "Command (C-shape)": "", + "Command (inline)": "", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "", + "Control": "നിയന്ത്രണം", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "", + "Costumes": "വേഷം", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "", + "Create variables": "", + "Create variables in program": "", + "Credits...": "", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "", + "Delete": "", + "Delete Custom Block": "", + "Delete Project": "", + "Delete a variable": "ഒരു ചരം ഡിലീറ്റ് ചെയ്യുക", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "", + "Export blocks...": "", + "Export project as plain text...": "", + "Export project...": "", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "ഹലോ!", + "Hello, World!": "", + "Help": "സഹായ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "ഹ് മ് മും...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "", + "Import sound": "", + "Import tools": "Tools laden", + "Import...": "കൊണ്ടുവരിക...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "", + "Input Slot Options": "", + "Input name": "", + "Input sliders": "", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "ഭാഷ...", + "Libraries...": "", + "License": "", + "License...": "", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "", + "Lists": "പട്ടിക", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "", + "Logout": "", + "Long form input dialog": "", + "Looks": "കാഴ്‌ച", + "Make a block": "", + "Make a variable": "ഒരു ചരം ഉണ്ടാക്കുക", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "സന്ദേശത്തിന്റെ പേര്", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "", + "Motion": "ചലനം", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "", + "Nested auto-wrapping": "", + "New": "പുതിയ", + "New Category": "", + "New Project": "", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "അല്ല", + "November": "", + "Number": "", + "OK": "ഓക", + "Object": "", + "October": "", + "Ok": "ഓക", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "പ്രോജെക്റ്റ്‌ ഓപ്പണ്‍ ചെയ്യുക", + "Open in Community Site": "", + "Open...": "ഓപ്പണ്‍ ചെയ്യുക...", + "Opening project...": "", + "Operators": "ക്രിയകള്", + "Other": "വേറൊന്ന്", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "പേന", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "തുടങ്ങുക", + "Play sound": "ശബ്ദമുണ്ടാക്കുക", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "", + "Prefer empty slot drops": "", + "Prefer smooth animations": "Fixe Framerate", + "Privacy...": "", + "Project Notes": "പ്രോജെക്റ്റ്‌ കുറിപ്പുകള്‍", + "Project URLs": "", + "Project notes...": "പ്രോജെക്റ്റ്‌ കുറിപ്പുകള്‍....", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "സേവ് ചെയ്യുക", + "Save As...": "എന്ന് സേവ് ചെയ്യുക...", + "Save Project": "", + "Save Project As...": "", + "Save to disk": "", + "Saved!": "", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "കോഡ് ചരത്തിന്റെ പേര്", + "Scripts": "ലിപികള്‍", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "ഗ്രഹണം", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "", + "Single input.": "", + "Single palette": "", + "Slider maximum value": "", + "Slider minimum value": "", + "Snap! website": "", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "ശബ്‌ദം", + "Sound Recorder": "", + "Sounds": "ശബ്‌ദകള്‍", + "Sprite": "ദേവത", + "Sprite Nesting": "", + "Stage": "നില", + "Stage height": "", + "Stage selected: no motion primitives": "", + "Stage size": "സ്റ്റേജ് വലിപ്", + "Stage size...": "സ്റ്റേജ് വലിപ്...", + "Stage width": "", + "Stop": "", + "Stop sound": "", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "", + "Switch to dev mode": "", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "", + "Title text": "", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "", + "Translators...": "", + "Turbo mode": "", + "Turtle": "", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "ചരത്തിന്റെ പേര്", + "Variables": "ചരങ്ങള്‍", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuelle Tastatur", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "അതെ", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "", + "Zoom blocks": "", + "Zoom blocks...": "", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ ശിഷ് _", + "_ of _": "_ ന്‍റ _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "", + "add a new Turtle sprite": "", + "add a new sprite": "പുതിയ ദേവത ചേര്‍ക്കുക", + "add comment": "", + "add comment here...": "", + "agent": "", + "alert _": "", + "all": "എല്ലാ", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "കൂടാത", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "ഉത്തര", + "any": "", + "any key": "", + "any message": "", + "anything": "", + "append _": "", + "arrange scripts vertically": "", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ ചോദിച്ചു കാത്തിരിക്കുക", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "Helligeit", + "broadcast _ _": "_ _ വിളംബരം ചെയ്യുക", + "broadcast _ _ and wait": "_ _ വിളംബരം ചെയ്തു കാത്തിരിക്കുക", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "", + "call _ w/continuation": "", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "തിരിക്കാന്‍ കഴിയും", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ നെ _ കൊണ്ട് മാറ്റുക", + "change _ effect by _": "_ നെ _ കൊണ്ട് മാറ്റുക", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "പേനയുടെ നിറം _ കൊണ്ട് മാറ്റുക", + "change pen shade by _": "പേനയുടെ ഷേഡ് _ കൊണ്ട് മാറ്റുക", + "change pen size by _": "പേനയുടെ വലിപ്പം _ കൊണ്ട് മാറ്റുക", + "change size by _": "വലിപ്പം _ കൊണ്ട് മാറ്റുക", + "change tempo by _": "ടെംപോ _ കൊണ്ട് മാറ്റുക", + "change volume by _": "", + "change x by _": "xനെ _ കൊണ്ട് മാറ്റുക", + "change y by _": "yനെ _ കൊണ്ട് മാറ്റുക", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "einschalten, damit Animationen überall gleich laufen", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "einschalten um die virtuelle Tastatur auf mobilen Geräten zu ermöglichen", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "", + "clear": "മായ്ക്കുക", + "clear graphic effects": "ഗ്രാഫിക്‌ ഇഫെക്റ്റ്സ് മാറ്റുക", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ കളര്‍ _ നെ തൊടുന്നുണ്ടോ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "രൂപ #", + "costume name": "", + "costumes": "", + "costumes tab help": "വേഷം ലഘുപട്ടിക സഹായം", + "could not connect to:": "", + "cr": "", + "create a clone of _": "", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "ഡിലീറ്റ് ചെയ്യുക", + "delete _": "", + "delete _ of _": "", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "Blockdefinition löschen", + "delete slot": "", + "delete this clone": "", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "വികസനം സമ്പ്രദായം", + "development mode debugging primitives:": "", + "development mode...": "", + "dimensions": "", + "direction": "ദിശ", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ ലേക്കുള്ള ദൂരം", + "distribution": "", + "don't rotate": "തിരികരുത്", + "down arrow": "", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "വലിച്ചിഴയ്‌ക്കുക", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "ഡ്യൂപ്ലിക്കേറ്റ്‌", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "", + "edit": "എഡിറ്റ്‌", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "കൊടുത്തയയ്ക്കുക", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "കൊടുത്തയയ്ക്കുക...", + "extract": "", + "f": "f", + "false": "തെറ്റ്", + "file": "", + "file menu import hint": "lädt ein exportiertes Projekt, eine Bibliothek mit Blöcken ein Kostüm oder einen Klang", + "fill": "", + "fill page...": "", + "filtered for _": "", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "", + "for each _ in _ _": "", + "for this sprite only": "", + "forever _": "എല്ലായ്പ്പോഴു _", + "frame": "", + "frames": "", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "സെകന്റില്‍ _ ലേക്ക് നീങ്ങുക x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "_ പാളി അകത്തേക്ക് പോവുക", + "go to _": "ലേക്ക് പോവുക _", + "go to _ layer": "", + "go to front": "ഉപരിതലത്തിലോട്ടു വരിക", + "go to x: _ y: _": "ലേക്ക് പോവുക x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "ഹലോ", + "help": "സഹായ", + "help...": "സഹായ...", + "hide": "ഒളിക്കുക", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "Basisblöcke ausblenden", + "hide variable _": "_ എന്ന ചരത്തെ ഒളിപ്പിച്ചു വയ്ക്കുക", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "", + "i": "i", + "identical to": "", + "if _ _": "_ _ ആണെങ്കില്‍", + "if _ _ else _": "_ _ ആണെങ്കില്‍ അല്ലെങ്കില്‍ _", + "if _ then _ else _": "", + "if on edge, bounce": "അറ്റത്താണെങ്കില്‍ തിരിച്ചു നടക്കുക", + "import a sound from your computer by dragging it into here": "കമ്പ്യൂട്ടറില്‍ നിന്നും ശബ്തം ഇറക്കുമതി ഇവിടെ വലിച്ചിട്ടുക", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "", + "input names:": "", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "", + "is _ a _ ?": "", + "is _ empty?": "", + "is _ identical to _ ?": "ist _ identisch mit _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "", + "items": "", + "j": "j", + "join _": "മായി യോജിപ്പിക്കുക _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ കീ അമര്‍ത്തിയോ?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Malayalam", + "language_translator": "vinayakumar R", + "large": "", + "last": "", + "last changed": "", + "last_changed": "2015-02-20", + "launch _ _": "", + "left": "", + "left arrow": "", + "length": "", + "length of _": "_ ന്‍റെ നീള", + "length:": "", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "_ ന്‍റെ _ മത്തെ അക്ഷരം", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "", + "list _": "", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "das offizielle Modul mit mächtigen Blöcken laden", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "", + "make a category...": "", + "make a copy and pick it up": "", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "സന്ദേശത്തിന്റ", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "മൗസ് താഴെയാണോ?", + "mouse position": "", + "mouse x": "മൗസിന്റെ x സ്ഥാന", + "mouse y": "മൗസിന്റെ y സ്ഥാന", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "", + "move": "നീങ്ങുക", + "move _ steps": "ചലിക്കുക _ പടികള്", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "mich", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "", + "next": "", + "next costume": "അടുത്ത രൂപം", + "none": "", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "_ അല്ല", + "note": "", + "nothing": "", + "now connected.": "", + "number": "", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "", + "only face left/right": "മാത്രം നോകുക ഇടത്‌/വലത്ത്", + "only grab this block": "", + "open a new window with a picture of all scripts": "ein neues Browserfenster mit einem Bild aller Skripte öffnen", + "open a new window with a picture of the stage": "ein neues Browserfenster mit einem Bild der Bühne öffnen", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "ein neues Browserfenster mit einem Bild dieses Skripts öffnen", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "അഥവ", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "വരയ്ക്കാന്‍ തുടങ്ങുക", + "pen down?": "", + "pen trails": "", + "pen up": "വരയുന്നത് നിര്‍ത്തുക", + "pen vectors": "", + "pic...": "", + "pick random _ to _": "_ മുതല്‍ _ വരെയുള്ള ഏതെങ്കിലും സംഖ്യ എടുക്കുക", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ മത്തെ സ്വരം _ ബീറ്റ്സ് അവതരിപ്പിക്കുക", + "play sound _": "_ ശബ്ദമുണ്ടാക്കുക", + "play sound _ at _ Hz": "", + "play sound _ until done": "തീരുന്നതു വരെ _ ശബ്ദമുണ്ടാക്കുക", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "ലേക്ക് തിരിയുക _", + "point towards _": "ലേക്ക് തിരിയുക _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "", + "presentation (1.4x)": "", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "", + "rename only this reporter": "", + "rename sound": "", + "rename...": "", + "repeat _ _": "തവണ ആവര്‍ത്തിക്കുക _ _", + "repeat until _ _": "_ _ ആവുന്നത് വരെ ആവര്‍ത്തിക്കുക", + "replace item _ of _ with _": "", + "report _": "", + "reporter": "", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "ടൈമര്‍ വീണ്ടും തുടങ്ങുക", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "_ ബീറ്റ് സമയം കാത്തിരിക്കുക", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "", + "ring": "", + "ringify": "", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ റൗണ്ട് ചെയ്യുക", + "run _ _": "", + "run _ w/continuation": "", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ പറയുക", + "say _ for _ secs": "_ _ സെകന്റ് പറയുക", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "", + "script variables _": "", + "scripts": "", + "scripts pic...": "Bild aller Scripte...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ എന്ന സ്പെഷല്‍ എഫെക്റ്റ് _ ആക്കുക", + "set _ of block _ to _": "", + "set _ to _": "_ നെ _ ആക്കി മാറ്റുക", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "പേനയുടെ നിറം _ ആക്കുക", + "set pen shade to _": "പേനയുടെ ഷേഡ് _ ആക്കുക", + "set pen size to _": "പേനയുടെ വലിപ്പം _ ആക്കുക", + "set size to _ %": "വലിപ്പം _ % ആക്കുക", + "set tempo to _ bpm": "ടെംപോ _ ബീറ്റ്സ്/മിനിറ്റ് ആക്കുക", + "set this morph's alpha value": "", + "set turbo mode to _": "setze Turbomodus auf _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "xനെ _ ആക്കുക", + "set y to _": "yനെ _ ആക്കുക", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "പ്രത്യക്ഷമാവുക", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "zeigt globale Benutzerblockdefinitionen als XML im Browser an", + "show primitives": "Basisblöcke anzeigen", + "show project data as XML in a new browser window": "", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ എന്ന ചരം കാണിക്കുക", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "വലിപ്", + "slider": "", + "slider max...": "", + "slider min...": "", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "", + "stack size": "", + "stage": "", + "stage image": "", + "stamp": "ഒട്ടിക്കുക", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "നിര്‍ത്തുക _", + "stop all sounds": "", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "മത്തെ രൂപമാക്കുക _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "ടെംപ", + "temporary?": "", + "text": "", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "", + "think _": "_ ചിന്തിക്കുക", + "think _ for _ secs": "_ സെകന്റ് _ ചിന്തിക്കുക", + "this _": "", + "this block": "ഈ ബ്ലോക്കുകള്‍", + "this project doesn't have any custom global blocks yet": "", + "this script": "ഈ സീരിയല്‍", + "time in milliseconds": "", + "timer": "ടൈമര്‍", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "_ തൊടുന്നുണ്ടോ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "vnkmr7620@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "ശര", + "turbo mode": "", + "turbo mode?": "Turbomodus?", + "turn _ _ degrees": "", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "ausschalten, um Animationen dynamischer auszuführen", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "", + "uncheck to allow script reentrance": "", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "ausschalten um die virtuelle Tastatur auf mobilen Geräten zu sperren", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "", + "unicode of _": "", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "തലക്കെട്ടില്ലാത്ത", + "unused": "", + "unused block(s) removed": "", + "up arrow": "", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ സെകന്റ് കാത്തിരിക്കുക", + "wait until _": "_ ആവുന്നത് വരെ കാത്തിരിക്കുക", + "wardrobe": "", + "warp _": "", + "what's your name?": "താങ്കളുടെ പേര് എന്താണ്?", + "when I am _": "", + "when I receive _ _": "ഞാന്‍ _ _ സ്വീകരിക്കുമ്പോള്‍", + "when I start as a clone": "Wenn ich geklont werde", + "when _": "", + "when _ clicked": "_ ക്ലിക്ക് ചെയ്യുമ്പോള്‍", + "when _ is edited _": "", + "when _ key pressed _": "_ _ കീ അമര്‍ത്തുമ്പോള്‍", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "", + "word": "", + "world": "ലോകം", + "write _ size _": "", + "x": "x", + "x position": "xസ്ഥാന", + "y": "y", + "y position": "yസ്ഥാനം", + "year": "", + "year:": "", + "your own": "", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-nl.js b/elements/pl-snap/Snap/locale/lang-nl.js new file mode 100644 index 00000000..b3fda587 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-nl.js @@ -0,0 +1,1388 @@ +SnapTranslator.dict.nl = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "", + "(0) up": "(0) omhoog", + "(1) sine": "", + "(180) down": "(180) omlaag", + "(2) square": "(2) blokgolf", + "(3) sawtooth": "(3) zaagtand", + "(4) triangle": "(4) driehoek", + "(90) right": "", + "(empty)": "(leeg)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Over Snap", + "About...": "Over Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Meerregelige tekst invoer in blokken", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animaties", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Willekeurig (ongeëvalueerd)", + "Any type": "Elk type", + "Apply": "Toepassen", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Weet je zeker dat je wilt verwijderen?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Vorige...", + "Backgrounds": "Achtergronden", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blok bewerken", + "Blocks": "Blokken", + "Blocks category name:": "", + "Blurred shadows": "Onscherpe schaduwen", + "Boolean": "booleaans", + "Boolean (T/F)": "Booleaans (waar / onwaar)", + "Boolean (unevaluated)": "Booleaans (ongeëvalueerd)", + "Bottom": "achter", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Kwastdikte", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Annuleren", + "Case sensitivity": "Verschil tussen kleine letters en hoofdletters", + "Catch errors": "", + "Catch errors in a script": "Foutafhandeling in script", + "Category color": "", + "Change Password": "", + "Change Password...": "Wachtwoord wijzigen...", + "Change block": "Blok veranderen", + "Clear backup": "", + "Clicking sound": "Klikgeluid", + "Closed brush (free draw)": "gesloten gevulde vorm (vrij tekenen)", + "Cloud": "", + "Code mapping": "", + "Codification support": "Ondersteuning voor codificatie", + "Colors and Crayons": "", + "Command": "Opdracht", + "Command (C-shape)": "Opdracht (C-vorm)", + "Command (inline)": "Opdracht (inline)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Vorm vasthouden? (kan ook met Shift-toets)", + "Contents": "inhoud", + "Contributors": "Bijdragers", + "Control": "Besturen", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Uiterlijk bewerken", + "Costumes": "Uiterlijken", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Maak invoernaam", + "Create variables": "", + "Create variables in program": "Maak variabelen met een script", + "Credits...": "", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Standaard", + "Default Value:": "Standaardwaarde:", + "Delete": "Verwijder", + "Delete Custom Block": "Verwijder zelfgemaakt blok", + "Delete Project": "Projekt verwijderen", + "Delete a variable": "Variabele wissen", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "naar achter", + "Download source": "Broncode downloaden", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamische inputlabels", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Randkleur (Linksklik)", + "Edit input name": "Invoernaam bewerken", + "Edit label fragment": "Labelfragment bewerken", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Ellips (Shift: cirkel)", + "Empty": "leeg", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Gum", + "Error": "", + "Examples": "Voorbeelden", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Exporteer blokkken", + "Export blocks...": "Blokken exporteren...", + "Export project as plain text...": "Project exporteren als tekst...", + "Export project...": "Project exporteren...", + "Export summary with drop-shadows...": "", + "Export summary...": "Exporteer samenvatting...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Blokken dimmen", + "Fade blocks...": "Blokken dimmen...", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "Vul een gedeelte", + "Fill color (right click)": "Vulkleur (Rechtsklik)", + "Filled Ellipse (shift: circle)": "Gevulde ellips (Shift: cirkel)", + "Filled Rectangle (shift: square)": "Gevulde rechthoek (Shift: vierkant)", + "First-Class Sprites": "", + "Flat design": "Eenvoudige layout", + "Flat line ends": "Rechte lijn uiteinden", + "For all Sprites": "Voor alle objecten", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "", + "Hello, World!": "", + "Help": "", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "Hyperblokken", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Maak nieuw uiterlijk met de webcam", + "Import blocks": "Importeer blokken", + "Import library": "Bibliotheek laden", + "Import sound": "", + "Import...": "Importeer...", + "Imported": "Geïmporteerd", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Oneindige precisie met gehele getallen, exacte breuken, complexe getallen", + "Inheritance support": "Gebruik overerving", + "Input Names:": "Invoernamen:", + "Input Slot Options": "", + "Input name": "Invoernaam", + "Input sliders": "Invoer schuifbalk", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Herhaling, Samenstelling", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript functie ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Bewerken met toetsenbord", + "Kind of": "Soort van", + "LEAP Motion controller": "", + "Language...": "Taal...", + "Libraries...": "Bibliotheken...", + "License": "Licentie", + "License...": "Licentie...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Lijn (Shift: veelvouden van 45°)", + "Line tool (shift: vertical/horizontal)": "Lijn (Shift: vertikal / horizontaal)", + "List": "Lijst", + "List utilities": "Lijst gereedschappen", + "Lists": "Lijsten", + "Live coding support": "", + "Loading": "Aan het laden", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Log pen als vector", + "Login...": "Inloggen...", + "Logout": "Uitloggen", + "Long form input dialog": "Lang formulier-invoerscherm", + "Looks": "Uiterlijk", + "Make a block": "Maak een blok", + "Make a variable": "Maak een variabele", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "signaalnaam", + "Method Editor": "Methode editor", + "Microphone": "Microfoon", + "Microphone resolution...": "Microfoon resolutie...", + "Modules...": "", + "Motion": "Bewegen", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Meervoudige voorwaarden (switch)", + "Multiple inputs (value is list of inputs)": "Meervoudige invoer (als lijst)", + "Nested auto-wrapping": "Automatisch omvatten", + "New": "Nieuw", + "New Category": "", + "New Project": "Nieuw project", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nee", + "November": "", + "Number": "Getal", + "OK": "", + "Object": "", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Project openen", + "Open in Community Site": "Ga naar projectpagina", + "Open...": "", + "Opening project...": "", + "Operators": "Functies", + "Other": "Overig", + "Output text using speech synthesis.": "", + "Paint Editor": "Tekenprogramma", + "Paint a new costume": "Teken een nieuw uiterlijk", + "Paint a shape (shift: edge color)": "vul een vorm (Shift: randkleur)", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Kwast (vrij tekenen)", + "Parallelization": "", + "Part of": "Een onderdeel van", + "Parts": "Onderdelen", + "Password:": "", + "Pen": "", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipet (klik ergens op de gewenste kleur)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Pipet klik ergens op de gewenste kleur (Shift: secundaire kleur)", + "Pixels": "", + "Plain prototype labels": "Eenvoudige protoype-labels", + "Play": "Speel", + "Play sound": "Geluid afspelen", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Controleer of je webbrowser is bijgewerkt en de webcam goed geconfigureerd is. In sommige browsers moet Snap! met HTTPS geöpend worden, om de webcam aan te kunnen gebruiken. Vervang daartoe het \"http://\"-deel in de adresbalk door \"https://\"", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predicaat", + "Prefer empty slot drops": "Voorkeur voor lege plaatshouders", + "Prefer smooth animations": "Voorkeur voor vloeiende animatie", + "Privacy...": "", + "Project Notes": "Projectnotities", + "Project URLs": "", + "Project notes...": "Notities...", + "Provide 100 selected colors": "100 uitgezochte kleuren", + "Provide getters and setters for all GUI-controlled global settings": "Blokken om interface instellingen op te vragen en in te stellen", + "Publish": "Publiek maken", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Neem een nieuw geluid op", + "Recover": "Herstellen", + "Rectangle (shift: square)": "Rechthoek (Shift: vierkant)", + "Reference manual": "Handleiding", + "Remove a category...": "", + "Remove unused blocks": "Ruim ongebruikte blokken op", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Vervang het huidige project door een nieuwe?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Functie", + "Request blocked": "", + "Resend Verification Email...": "Stuur bevestigingsmail nogmaals...", + "Resend verification email": "", + "Reset Password...": "Wachtwoord herstellen...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Retina beeldscherm ondersteuning", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Bewaar", + "Save As...": "Bewaar als...", + "Save Project": "", + "Save Project As...": "Project opslaan als...", + "Save to disk": "Opslaan op schijf", + "Saved!": "Opgeslagen!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Scriptvariabelenaam", + "Scripts": "", + "Select a costume from the media library": "Kies een uiterlijk uit de bibliotheek met uiterlijken", + "Select a sound from the media library": "Kies een geluid uit de bibliotheek met geluiden", + "Select categories of additional blocks to add to this project.": "Selecteer een groep van extra blokken om aan dit project toe te voegen", + "Selection tool": "Selecteer", + "Sensing": "Waarnemen", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Penkleuren instellen op RGB of HSV waarde", + "Set the rotation center": "Draaipunt instellen", + "Share": "Delen", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Registreren...", + "Single input.": "Enkelvoudige invoer.", + "Single palette": "", + "Slider maximum value": "Maximumwaarde van schuifbalk", + "Slider minimum value": "Minimumwaarde van schuifbalk", + "Snap! website": "Snap!-website", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Geluid", + "Sound Recorder": "", + "Sounds": "Geluiden", + "Sprite": "Object", + "Sprite Nesting": "", + "Stage": "Speelveld", + "Stage height": "Speelveld hoogte", + "Stage selected: no motion primitives": "Speelveld geselecteerd: geen bewegingsblokken beschikbaar", + "Stage size": "Speelveld afmeting", + "Stage size...": "Afmeting speelveld...", + "Stage width": "Speelveld breedte", + "Stop": "", + "Stop sound": "Geluid stoppen", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Ellips (Shift: cirkel)", + "Stroked Rectangle (shift: square)": "Rechthoek (Shift: vierkant)", + "Switch back to user mode": "Terug naar gebruikersmodus", + "Switch to dev mode": "naar ontwikkelmodus wisselen", + "Switch to vector editor?": "", + "Table lines": "Tabellen met lijntjes", + "Table support": "Gebruik tabellen", + "Table view": "Tabelweergave", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "Drieledige invoer van Booleans", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Tekst naar spraak", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Thread-veilige scripts", + "Title text": "Titel", + "Today": "Vandaag", + "Today,": "", + "Top": "voor", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Vertalingen", + "Translators...": "Vertalers...", + "Turbo mode": "Turbomodus", + "Turtle": "Schildpad", + "Undelete sprites...": "", + "Unpublish": "Privé maken", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Niet meer delen", + "Unshare Project": "", + "Untitled": "Zonder titel", + "Unused blocks...": "Ongebruikte blokken...", + "Unverified account:": "", + "Up": "naar voren", + "Updating project list...": "Lijst van projecten laden", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - maak interne variabele zichtbaar voor aanroeper", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Variabelenaam", + "Variables": "Variabelen", + "Variadic reporters": "Variadische functies", + "Vector": "", + "Vector Paint Editor": "Vector Tekenprogramma", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtueel toetsenbord", + "Visible stepping": "Stapsgewijs programma verloop", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Verbinding met Webservices", + "Words, sentences": "Woorden en zinnen", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "", + "Yesterday": "Gisteren", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebrakleuren", + "Zoom blocks": "Blokken inzoomen", + "Zoom blocks...": "Blokken inzoomen...", + "_ at _": "_ op _", + "_ combine _ using _": "_ combineer elementen van _ met _", + "_ contains _": "_ bevat _", + "_ effect": "_ -effect", + "_ find first item _ in _": "_ vind eerste element met _ in _", + "_ in front of _": "_ voor _", + "_ keep items _ from _": "_ behoud elementen met _ uit _", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ van _", + "_ of block _": "_ van blok _", + "_ of costume _": "_ van uiterlijk _", + "_ of sound _": "_ van geluid _", + "_ of text _": "_ van tekst _", + "_ to _": "_ tot _", + "__shout__go__": "groene vlag geklikt", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "nieuwe kloon van _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "voeg _ in op _", + "add a new Turtle sprite": "een nieuw object toevoegen", + "add a new sprite": "een nieuw object toevoegen", + "add comment": "opmerking toevoegen", + "add comment here...": "hier opmerking toevoegen", + "agent": "", + "alert _": "waarschuwing _", + "all": "", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "alles, behalve de eerste van _", + "all but this script": "alle scripts behalve deze", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "ankerpunt", + "and": "en", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "antwoord", + "any": "willekeurig", + "any key": "willekeurige toets", + "any message": "elk signaal", + "anything": "", + "append _": "voeg _ samen", + "arrange scripts vertically": "scripts verticaal ordenen", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "vraag _ en wacht", + "ask _ for _ _": "vraag _ naar _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "achterste", + "balance": "balans", + "big (2x)": "groot (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Moet dit blok met al zijn instanties verwijderd worden?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "normaal (0)", + "blockify": "als blok", + "blocks": "blokken", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "ruimte onder", + "box": "", + "brightness": "helderheid", + "broadcast _ _": "zend signaal _ _", + "broadcast _ _ and wait": "zend signaal _ _ en wacht", + "brush": "", + "build": "bouw", + "but getting a": "", + "c": "c", + "call _ _": "roep _ aan _", + "call _ w/continuation": "roep _ aan en ga door", + "caller": "oproeper", + "camera": "camera", + "can only write text or numbers, not a": "", + "can rotate": "draaibaar", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "verschil tussen kleine letters en hoofdletters", + "categories": "", + "category": "categorie", + "ceiling": "afgerond omhoog", + "center": "midden", + "center x": "middelpunt x", + "center y": "middelpunt y", + "change _ by _": "verander _ met _", + "change _ effect by _": "verander _ -effect met _", + "change achtergrondkleur _ by _": "verander pen _ met _", + "change background _ by _": "", + "change balance by _": "verander balans met _", + "change pen _ by _": "verander pen _ met _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "verander pengrootte met _", + "change size by _": "verander grootte met _", + "change tempo by _": "verander tempo met _", + "change volume by _": "verander volume met _", + "change x by _": "verander x met _", + "change y by _": "verander y met _", + "check for alternative GUI design": "aanvinken voor alternatieve weergave", + "check for block to text mapping features": "", + "check for flat ends of lines": "aanvinken voor rechte uiteinden van lijnen", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "aanvinken voor een hogere beeldschermresolutie maakt programma langzamer", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "aanvinken voor vloeiende, voorspelbare animaties tussen computers", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "aanvinken om data type in invoerscherm te zien", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "aanvinken om niet- afgewerkte scripts niet opnieuw te starten", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "aanvinken om IDE-animaties toe te laten", + "check to enable alternating colors for nested blocks": "afwisselende kleuren voor geneste blokken aanzetten", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "dynamische labels voor meervaksinvoer aanzetten", + "check to enable input sliders for entry fields": "aanvinken om schuifbalken voor invoer in te schakelen", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "aanvinken om operatoren ook op lijsten en tabellen te laten werken", + "check to enable virtual keyboard support for mobile devices": "aanvinken om het virtueel toetsenbord in te schakelen voor mobiele apparaten", + "check to hide (+) symbols in block prototype labels": "aanvinken om (+) symbolen in block prototye labels te verbergen", + "check to inherit from": "aanvinken, om te erven van", + "check to prevent contents from being saved": "aanvinken om te verhinderen dat de inhoud wordt opgeslagen", + "check to prioritize script execution": "aanvinken om scriptuitvoering prioriteit te geven", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "aanvinken om klikgeluid in te schakelen", + "check to turn on logging pen vectors": "aanvinken om pensporen als vector op te slaan", + "check to turn on visible stepping (slow)": "aanvinken om programma stap-voor-stap te volgen (langzaam)", + "check to use blurred drop shadows and highlights": "aanvinken om onscherpe schaduwen en uitlichtingen te krijgen", + "children": "kinderen", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "opruimen", + "clear": "wissen", + "clear graphic effects": "zet grafische effecten uit", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Klik of sleep de kruisdraden om het rotatiecentrum te verplaatsen", + "clicked": "aangeklikt", + "clone": "klonen", + "clones": "kloon", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "kleur", + "color _ is touching _ ?": "kleur _ raakt _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "kolommen", + "combinations _": "combinatie _", + "combine _ using _": "combineer elementen van _ met _", + "comic": "strepenpatroon", + "comment": "opmerking", + "command": "opdracht", + "comment pic...": "beeld van opmerking", + "compile": "compileren", + "compile _": "compileer _", + "compile _ for _ args": "", + "confetti": "kleureffect", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "uiterlijk", + "costume #": "uiterlijk #", + "costume name": "", + "costumes": "uiterlijken", + "costumes tab help": "je kunt afbeeldingen van een andere website of je eigen computer naar dit werkblad slepen", + "could not connect to:": "", + "cr": "", + "create a clone of _": "maak kloon van _", + "cross": "", + "crosshairs": "", + "current": "huidige", + "current _": "huidig(e) _", + "current module versions:": "huidige moduleversies", + "current parent": "huidige ouder", + "custom?": "gebruikersgedefinieerd?", + "cut from _": "knip uit _", + "d": "d", + "dangling?": "slingeren?", + "data": "gegevens", + "date": "datum", + "day of week": "weekdag", + "days left": "", + "days left.": "", + "defaults": "defaults", + "define _ _ _": "defineer _ _ _", + "definition": "definitie", + "delete": "verwijder", + "delete _": "", + "delete _ of _": "verwijder _ van _", + "delete a category...": "", + "delete block _": "verwijder blok _", + "delete block definition...": "verwijder blokdefinitie", + "delete slot": "", + "delete this clone": "verwijder deze kloon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "alle onderdelen losmaken", + "detach and put into the hand": "", + "detach from": "losmaken van", + "development mode": "ontwikkelmodus", + "development mode debugging primitives:": "ontwikkelmodus debugging basisblokken", + "development mode...": "", + "dimensions": "dimensies", + "direction": "richting", + "disable deep-Morphic context menus and show user-friendly ones": "verlaat Morphic", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "afstand", + "distance to _": "", + "distribution": "verdeling", + "don't rotate": "niet draaibaar", + "down arrow": "pijltje omlaag", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "versleepbaar", + "draggable?": "versleepbaar?", + "dragging threshold": "", + "dropped": "losgelaten", + "duplicate": "kopieer", + "duplicate block definition...": "kopiëer blokdefinitie...", + "duration": "duur", + "e": "e", + "e^": "e^", + "edge": "rand", + "edit": "bewerken", + "edit rotation point only...": "", + "edit the costume's rotation center": "draaipunt van uiterlijk tonen en aanpassen", + "edit...": "bewerken...", + "editables": "vervanging", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "gebruik Morphic niet gebruikersvriendelijk!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exporteren", + "export block definition...": "exporteer blokdefinitie...", + "export pen trails line segments as SVG": "exporteer pensporen als vektorafbeelding (SVG)", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "exporteren...", + "extract": "onttrekken", + "f": "f", + "false": "onwaar", + "file": "", + "file menu import hint": "importeer een project, een bibliotheek met blokken, een uiterlijk of een geluid", + "fill": "vul", + "fill page...": "", + "filtered for _": "gefilterd op _", + "find blocks": "vind blokken", + "find blocks...": "", + "find first item _ in _": "vind eerste element met _ in _", + "find unused global custom blocks and remove their definitions": "zoek ongebruikte globale zelfgemaakte blokken en ruim ze op", + "fisheye": "vissenoog", + "flag": "", + "flash": "", + "flat line ends": "rechte lijneindes", + "flatten": "listing", + "flip horizontal": "spiegelen ↔", + "flip vertical": "spiegelen ↕", + "flip ↔": "", + "flip ↕": "", + "floor": "afgerond omlaag", + "footprints": "", + "for _ = _ to _ _": "voor _ = _ tot _ _", + "for all sprites": "voor alle objecten", + "for each _ in _ _": "voor iedere _ van _ _", + "for this sprite only": "alleen voor dit object", + "forever _": "herhaal _", + "frame": "", + "frames": "beelden", + "frequencies": "", + "frequency": "frequentie", + "front": "voorste", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "spook", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "glijd in _ sec. naar x: _ y: _", + "global?": "globaal?", + "globe": "", + "go back _ layers": "ga _ lagen terug", + "go to _": "ga naar _", + "go to _ layer": "ga naar _ laag", + "go to front": "ga naar voorgrond", + "go to x: _ y: _": "ga naar x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "groter", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "hoogte", + "hello": "hallo", + "help": "", + "help...": "", + "hide": "verdwijn", + "hide all...": "", + "hide blocks...": "verberg blokken...", + "hide primitives": "basisblokken verbergen", + "hide variable _": "verberg variabele _", + "high": "hoog", + "hour": "uur", + "http:// _": "", + "hue": "", + "huge (4x)": "enorm (4x)", + "i": "i", + "identical to": "identiek aan", + "if _ _": "als _ _", + "if _ _ else _": "als _ _ anders _", + "if _ then _ else _": "als _ dan _ anders _", + "if on edge, bounce": "aan de rand, keer om", + "import a sound from your computer by dragging it into here": "importeer een geluid vanaf je computer door deze naar dit werkblad te slepen", + "import without attempting to parse or format data": "gegevens importeren zonder poging te bewerken", + "import...": "importeren...", + "in palette": "", + "including dependencies": "inclusief alle gebruikte blokken", + "index": "", + "index of _ in _": "index van _ in _", + "inherit _": "erf _ van ouder", + "inherited": "geërfd", + "input list:": "invoerlijst:", + "input names:": "invoernamen:", + "input(s), but getting": "", + "inputs": "invoers", + "insert _ at _ of _": "voeg _ op _ aan _ toe", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "", + "is _ a _ ?": "is _ een _ ?", + "is _ empty?": "is _ leeg?", + "is _ identical to _ ?": "is _ identiek aan _ ?", + "is _ on?": "is _ aan?", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "item _ van _", + "items": "elementen", + "j": "j", + "join _": "voeg _ samen", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "behoud elementen met _ uit _", + "key": "", + "key _ pressed?": "toets _ ingedrukt?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "opschrift", + "language_name": "Nederlands", + "language_translator": "Joek van Montfort, Sjoerd Dirk Meijer, Frank Sierens, Jan-Gerard van der Toorn, Jule Rapp", + "large": "groot", + "last": "laatste", + "last changed": "", + "last_changed": "2024-02-12", + "launch _ _": "start _ _", + "left": "ruimte links", + "left arrow": "pijltje naar links", + "length": "lengte", + "length of _": "lengte van _", + "length:": "lengte:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "letter _ van _", + "light (70)": "licht (70)", + "lightness": "", + "line": "regel", + "lines": "", + "list": "lijst", + "list _": "lijst _", + "list view...": "lijstweergave...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "vectortekening", + "login": "", + "loop": "", + "low": "laag", + "lower case": "kleine letters", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "maak een blok...", + "make a category...": "", + "make a copy and pick it up": "maak een kopie en gebruikt het", + "make a morph": "", + "make temporary and hide in the sprite corral": "maak tijdelijk en verberg icoon", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "max", + "maximum": "", + "medium (50)": "half (50)", + "menus": "menu's", + "message": "signaal", + "microphone _": "microfoon _", + "middle": "", + "minimum": "", + "minute": "minuut", + "mirror video": "spiegel video", + "missing / unspecified extension": "", + "monstrous (10x)": "monsterlijk (10x)", + "month": "maand", + "mosaic": "mosaiek", + "motion": "beweging", + "mouse down?": "muis ingedrukt?", + "mouse position": "", + "mouse x": "muis x", + "mouse y": "muis y", + "mouse-departed": "niet meer door de muis aangeraakt", + "mouse-entered": "aangeraakt door de muis", + "mouse-pointer": "muisaanwijzer", + "move": "verplaatsen", + "move _ steps": "neem _ stappen", + "move all inside...": "", + "move...": "", + "my": "eigenschap", + "my _": "mijn _", + "my anchor": "eigenschap verankering", + "my dangling?": "eigenschap slingerend?", + "my draggable?": "eigenschap versleepbaar?", + "my name": "eigenschap naam", + "my parent": "eigenschap ouder", + "my rotation style": "eigenschap draaistijl", + "my rotation x": "eigenschap draaipunt x", + "my rotation y": "eigenschap draaipunt y", + "my temporary?": "eigenschap tijdelijk?", + "myself": "mijzelf", + "n": "n", + "name": "naam", + "neg": "", + "negative": "negatief", + "neighbors": "buren", + "neighbors ≠": "", + "new costume _ width _ height _": "nieuw uiterlijk _ breedte _ hoogte _", + "new line": "nieuwe regel", + "new sound _ rate _ Hz": "nieuw geluid _ op _ Hz", + "new...": "nieuw...", + "next": "volgende", + "next costume": "volgend uiterlijk", + "none": "niets", + "normal": "normaal", + "normal (1x)": "normaal (1x)", + "normalScreen": "", + "normalStage": "", + "not": "niet", + "not _": "niet _", + "note": "noot", + "nothing": "", + "now connected.": "", + "number": "getal", + "number of channels": "aantal kanalen", + "numbers from _ to _": "getallen van _ tot _", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "alleen dit blok kopiëren", + "only face left/right": "alleen links/rechts draaibaar", + "only grab this block": "alleen dit blok oppakken", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "in nieuw venster openen...", + "open shared project from cloud...": "", + "options...": "", + "or": "of", + "or before": "", + "other clones": "andere klonen", + "other scripts in sprite": "andere scripts van dit object", + "other sprites": "andere objecten", + "p": "p", + "paint a new sprite": "teken een nieuwe sprite", + "paintbucket": "", + "parameters": "", + "parent": "ouder", + "parent...": "ouder...", + "parts": "onderdelen", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "plak op _", + "pause": "", + "pause all _": "pauzeer alles _", + "pen": "", + "pen _": "", + "pen down": "pen neer", + "pen down?": "pen neer?", + "pen trails": "penspoor", + "pen up": "pen omhoog", + "pen vectors": "pen vectoren", + "pic...": "afbeelding...", + "pick random _ to _": "willekeurig getal tussen _ en _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "draaipunt", + "pixel": "", + "pixelate": "blokkig", + "pixels": "", + "play _ Hz for _ secs": "speel _ Hz gedurende _ Sek.", + "play frequency _ Hz": "speel frequentie _ Hz", + "play note _ for _ beats": "speel noot _ _ tellen", + "play sound _": "speel geluid _", + "play sound _ at _ Hz": "speel geluid _ op _ Hz", + "play sound _ until done": "speel geluid _ en wacht", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "wijs naar richting _", + "point towards _": "richt naar _", + "pointRight": "", + "polygon": "", + "position": "positie", + "poster": "", + "predicate": "predicaat", + "presentation (1.4x)": "presentatie (1.4x)", + "pressed": "ingedrukt", + "previous": "vorige", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "R-G-B-A kleurcode", + "random": "willekeurig", + "random position": "willekeurige positie", + "rank": "", + "raw data...": "ruwe gegevens...", + "ray length": "straallengte", + "read-only": "", + "receivers...": "ontvangers...", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "opnieuw uitvoeren", + "relabel...": "label hernoemen...", + "release": "loslaten", + "remove block variables...": "", + "rename": "hernoemen", + "rename all blocks that access this variable": "alle blokken hernoemen, die naar deze variabele verwijzen", + "rename all...": "hernoem alle...", + "rename background": "achtergrond hernoemen", + "rename costume": "uiterlijk hernoemen", + "rename only this reporter": "hernoem alleen dit blok", + "rename sound": "geluid hernoemen", + "rename...": "hernoemen...", + "repeat _ _": "herhaal _ keer _", + "repeat until _ _": "herhaal tot _ _", + "replace item _ of _ with _": "vervang item _ van _ door _", + "report _": "rapporteer _", + "reporter": "functie", + "reporter didn't report": "", + "reset columns": "kolombreedte terugzetten", + "reset timer": "zet tijd op nul", + "reshape _ to _": "structureer _ naar _", + "resize...": "", + "resolution": "resolutie", + "rest for _ beats": "pauzeer _ tellen", + "restore display": "", + "result pic...": "script en resultaat...", + "reverse": "achteruit", + "right": "ruimte rechts", + "right arrow": "pijltje naar rechts", + "ring": "", + "ringify": "omringen", + "robot": "", + "rotate": "draaien", + "rotation style": "draaistijl", + "rotation x": "draaipunt x", + "rotation y": "draaipunt y", + "round _": "afgerond _", + "run _ _": "voer _ uit _", + "run _ w/continuation": "voer _ uit en ga door", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "verzadiging", + "save _ as costume named _": "", + "save a picture of all scripts": "bewaar een afbeelding van alle scripts", + "save a picture of both this script and its result": "bewaar een afbeelding van dit script met het resultaat", + "save a picture of the stage": "", + "save a picture of this comment": "bewaar een beeld van deze opmerking", + "save a picture of this script": "bewaar een afbeelding van dit script", + "save a summary of this project": "Bewaar samenvatting van project in map Downloads", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "Bewaar project als XML-file in map Downloads", + "saved.": "", + "say _": "zeg _", + "say _ for _ secs": "zeg _ gedurende _ sec.", + "scope": "gebied", + "screenshot": "", + "screenshot...": "", + "script": "script", + "script pic with result...": "", + "script pic...": "scriptafbeelding...", + "script variables _": "scriptvariabelen _", + "scripts": "", + "scripts pic...": "Afbeelding van alle scripts...", + "scroll frame": "", + "scrolled-down": "naar beneden gescrollt", + "scrolled-up": "naar boven gescrollt", + "second": "seconde", + "select": "selecteer", + "selection": "", + "self": "zelf", + "send _ to _": "zend _ naar _", + "senders...": "zenders...", + "sensor demo": "", + "separators": "scheidingsteken", + "set _ effect to _": "maak _ -effect _", + "set _ of block _ to _": "zet _ van blok _ op _", + "set _ to _": "zet _ op _", + "set achtergrondkleur _ to _": "maak pen _ _", + "set background _ to _": "", + "set background color to _": "maak achtergrondkleur _", + "set balance to _": "zet balans op _", + "set instrument to _": "zet klank op _", + "set pen _ to _": "maak pen _ _", + "set pen color to _": "maak penkleur _", + "set pen shade to _": "", + "set pen size to _": "maak pengrootte _", + "set size to _ %": "maak grootte _ %", + "set tempo to _ bpm": "maak tempo _ bpm", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "zet videotransparantie op _", + "set volume to _ %": "zet volume op _ %", + "set x to _": "maak x _", + "set y to _": "maak y _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "lege plaatshouders in instellingenmenu", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "schemerend (80)", + "show": "verschijn", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "toon alles", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "toon globale zelfgemaakte blokdefinities als XML in browser", + "show primitives": "basisblokken tonen", + "show project data as XML in a new browser window": "Toon projectdata als XML in een nieuw browservenster", + "show table _": "", + "show the World's menu": "", + "show variable _": "toon variabele _", + "shown?": "getoond?", + "shrink": "kleiner", + "shuffled": "gemengd", + "signals": "", + "sin": "sin", + "size": "grootte", + "slider": "schuifbalk", + "slider max...": "schuif max...", + "slider min...": "schuif min...", + "slots": "vakken", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "beeld", + "sorted": "gesorteerd", + "sound": "", + "sounds": "geluiden", + "space": "spatiebalk", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "frequentie spectrum", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "splits _ bij _", + "sprite": "object", + "sprites": "objecten", + "sqrt": "wortel", + "square": "", + "stack size": "stapelgrootte", + "stage": "speelveld", + "stage image": "", + "stamp": "stempel", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "vastmaken aan", + "stop _": "", + "stop all sounds": "stop alle geluiden", + "stop frequency": "stop afspelen frequentie", + "stopped": "gestopt", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Sla dit projekt op in de downloads folder (alleen voor browsers die dit ondersteunen)", + "stretch _ x: _ y: _ %": "rek uit _ x: _ y: _ %", + "string": "", + "subtle (95)": "subtiel (95)", + "sum": "", + "svg...": "SVG exporteren...", + "switch to costume _": "wissel naar uiterlijk _", + "switch to scene _ _": "wissel naar _ scène _", + "t": "t", + "tab": "", + "table view...": "tabelweergave...", + "take a camera snapshot and import it as a new sprite": "nieuw object met webcam-uiterlijk toevoegen", + "tan": "tan", + "tell _ to _ _": "zeg _ _ te doen _", + "tempo": "", + "temporary?": "tijdelijk?", + "text": "tekst", + "text-only (100)": "alleen tekst (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "er zijn nu geen ongebruikte globale zelfgemaakte blokken in dit project", + "there are currently no vectorizable pen trail segments": "er zijn nu geen vertoriseerbare pensporen", + "thing": "ding", + "think _": "denk _", + "think _ for _ secs": "denk _ gedurende _ sec.", + "this _": "dit _", + "this block": "dit blok", + "this project doesn't have any custom global blocks yet": "dit project bevat nog geen zelfgemaakte globale blokken", + "this script": "dit script", + "time in milliseconds": "tijd in millisecondes", + "timer": "tijd", + "tip": "", + "to": "naar", + "top": "ruimte boven", + "touch screen settings": "", + "touching _ ?": "raak ik kleur _ ?", + "transient": "niet blijvend", + "translations": "vertalingen", + "translations...": "vertalingen...", + "translator_e-mail": "joek@xota.nl, sjoerddirk@fromScratchEd.nl, frank.sierens@telenet.be, jg.2019@xs4all.nl", + "transparency": "transparantie", + "transparency...": "transparantie...", + "trash is empty": "", + "true": "waar", + "turbo mode": "turbomodus", + "turbo mode?": "turbomodus?", + "turn _ _ degrees": "draai _ _ graden", + "turn all pen trails and stamps into a new background for the stage": "gebruik pensporen en stempels als nieuwe achtergrond van het speelveld", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "gebruik pensporen en stempels als nieuw uiterlijk van de geselecteerde sprite", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "type", + "type of _": "type van _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "uitvinken voor de standaard weergave", + "uncheck for greater speed at variable frame rates": "uitvinken voor hogere snelheid bij variabele framerates", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "uitvinken voor een lagere beeldschermresolutie maakt programma sneller", + "uncheck for round ends of lines": "uitvinken voor ronde uiteinden van lijnen", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "uitschakelen om toe te staan dat lege functies anderen uitsluiten", + "uncheck to allow script reentrance": "uitvinken om niet- afgewerkte scripts opnieuw te starten", + "uncheck to always show (+) symbols in block prototype labels": "uitvinken om altijd (+) symbolen te tonen in blok prototype labels", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "IDE-animaties uitschakelen", + "uncheck to disable alternating colors for nested block": "afwisselende kleuren voor geneste blokken uitzetten", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "dynamische labels voor meervaksinvoer uitzetten", + "uncheck to disable input sliders for entry fields": "uitvinken om schuifbalken voor invoer uit te schakelen", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "uitvinken om operatoren niet op lijsten en tabellen te laten werken", + "uncheck to disable virtual keyboard support for mobile devices": "uitvinken om het virtueel toetsenbord uit te schakelen voor mobiele apparaten", + "uncheck to disinherit": "uitvinken, om niet meer te erven", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "uitvinken voor scripuitvoering op normale snelheid", + "uncheck to save contents in the project": "uitvinken om de inhoud in het project op te slaan", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "uitvinken om klikgeluiden uit te schakelen", + "uncheck to turn off logging pen vectors": "uitvinken om pensporen niet op te slaan", + "uncheck to turn off visible stepping": "uitvinken om programma niet meer stap-voor-stap te volgen", + "uncheck to use solid drop shadows and highlights": "uitvinken om scherpe schaduwen en uitlichtingen te krijgen", + "uncheck to use the input dialog in short form": "uitvinken voor verkort invoerscherm", + "uncompile": "decompileren", + "undo": "maak ongedaan", + "undo the last block drop in this pane": "de laatste blokbeweging ongedaan maken", + "undrop": "ongedaan maken", + "unicode _ as letter": "unicode _ als letter", + "unicode of _": "unicode waarde van _", + "uniques": "unieke waarden", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "niet omringen", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "zonder titel", + "unused": "ongebruikt", + "unused block(s) removed": "ongebruikte blokken opgeruimd", + "up arrow": "pijltje omhoog", + "upper case": "hoofdletters", + "url...": "", + "use the keyboard to enter blocks": "gebruik toetsenbord om blokken te verplaatsen", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "waarde", + "variable": "", + "variables": "", + "video _ on _": "video _ op _", + "video capture": "videoopname", + "volume": "", + "w": "w", + "wait _ secs": "wacht _ sec.", + "wait until _": "wacht tot _", + "wardrobe": "", + "warp _": "", + "what's your name?": "Hoe heet je?", + "when I am _": "wanneer ik _ word", + "when I receive _ _": "wanneer ik _ ontvang _", + "when I start as a clone": "wanneer ik als kloon start", + "when _": "wanneer _", + "when _ clicked": "wanneer _ wordt aangeklikt", + "when _ is edited _": "Wanneer _ wordt bewerkt", + "when _ key pressed _": "wanneer _ wordt ingedrukt _", + "whirl": "draaikolk", + "whitespace": "witruimte", + "width": "breedte", + "with data": "met gegevens", + "with inputs": "met invoer", + "word": "woord", + "world": "wereld", + "write _ size _": "schrijf _ grootte _", + "x": "x", + "x position": "x-positie", + "y": "y", + "y position": "y-positie", + "year": "jaar", + "year:": "", + "your own": "je eigen", + "z": "z" +} diff --git a/elements/pl-snap/Snap/locale/lang-no.js b/elements/pl-snap/Snap/locale/lang-no.js new file mode 100644 index 00000000..ca148f83 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-no.js @@ -0,0 +1,1380 @@ +SnapTranslator.dict.no = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) venstre", + "(0) up": "(0) oppe", + "(1) sine": "", + "(180) down": "(180) nede", + "(2) square": "(2) kvadrat", + "(3) sawtooth": "(3) sagtann", + "(4) triangle": "(4) trekant", + "(90) right": "(90) høyre", + "(empty)": "(tomt)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Om Snap", + "About...": "Om Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Tillat fler-linjet tekst inputt i blokker", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animasjoner", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Hvilken som helst (uevaluert)", + "Any type": "Hvilken som helst type", + "Apply": "Anvende", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Er du sikker om sletting?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Tilbake...", + "Backgrounds": "Bakgrunner", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blokk editor", + "Blocks": "Blokker", + "Blocks category name:": "", + "Blurred shadows": "Mindre skarpe skygger", + "Boolean": "Boolsk", + "Boolean (T/F)": "Boolsk (S/U)", + "Boolean (unevaluated)": "Boolsk (uevaluert)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Penselsize", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Avbryt", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Feilhåndtering i skript", + "Category color": "", + "Change Password": "", + "Change Password...": "Endre passord...", + "Change block": "Endre blokken", + "Clear backup": "", + "Clicking sound": "Hørbar klikkelyd", + "Closed brush (free draw)": "Lukket og fylt form (fritegning)", + "Cloud": "", + "Code mapping": "", + "Codification support": "Kodifikasjonsstøtte", + "Colors and Crayons": "", + "Command": "", + "Command (C-shape)": "Command (C-Form)", + "Command (inline)": "Command", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Fastsett proporsjoner til formene (Skift-tast)", + "Contents": "Innhold", + "Contributors": "Bidragsytere", + "Control": "Styring", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Drakteditor", + "Costumes": "Drakter", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Lag input navn", + "Create variables": "", + "Create variables in program": "Lag variabler i skripter", + "Credits...": "Takk til...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "Default verdi:", + "Delete": "Slette", + "Delete Custom Block": "Slett blokken", + "Delete Project": "Slett prosjekt", + "Delete a variable": "Slett variabel", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "laste ned kildekode", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamiske innputtnavn", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Kantfarge (klikk venstre)", + "Edit input name": "Endre input navn", + "Edit label fragment": "Endre navn", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Ellipse (Skift: sirkel)", + "Empty": "Tomt", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Viskelær", + "Error": "", + "Examples": "Eksempler", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Eksporter blokker", + "Export blocks...": "Eksporter blokker...", + "Export project as plain text...": "Eksporter prosjekt som tekst...", + "Export project...": "Eksporter prosjekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "Eksporter sammendraget...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Fade ut blokker", + "Fade blocks...": "Fade ut blokkene...", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "fyll område med valgt farge", + "Fill color (right click)": "Fyllfarge (klikk høyre)", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "fylt rektangel (Skift: kvadrat)", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "Flate linje avslutninger", + "For all Sprites": "For alle figurer", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "", + "Hello, World!": "", + "Help": "Hjelp", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "Hyper-blokker støtte", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Importer ny drakt med webcam", + "Import blocks": "Importer blokker", + "Import library": "Importer bibliotek", + "Import sound": "", + "Import...": "Importer...", + "Imported": "Importert", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Ubegrenset presisjons heltall, eksakt rasjonelle tall, komplekse tall", + "Inheritance support": "Prototypisk arving støtte", + "Input Names:": "Inndata Navn:", + "Input Slot Options": "", + "Input name": "Input navn", + "Input sliders": "Input slidere", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iterasjon, komposisjon", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript funktion ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Tastatur editing", + "Kind of": "Slags", + "LEAP Motion controller": "", + "Language...": "Språk...", + "Libraries...": "Biblioteker...", + "License": "Lisens", + "License...": "Lisens...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Linieverktøy (Skift: Multippel av 45°)", + "Line tool (shift: vertical/horizontal)": "Linieverktøy (Skift: vertikal/horisontal)", + "List": "", + "List utilities": "Liste verktøy", + "Lists": "Lister", + "Live coding support": "", + "Loading": "Laster ned", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Logg penn vektorer", + "Login...": "Loginn...", + "Logout": "Logg ut", + "Long form input dialog": "Lange inputt dialogvindu", + "Looks": "Utseende", + "Make a block": "Ny blokk", + "Make a variable": "Ny variabel", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "melding navn", + "Method Editor": "Metode editor", + "Microphone": "mikrofon", + "Microphone resolution...": "Mikrofonoppløsning...", + "Modules...": "Moduler...", + "Motion": "Bevegelse", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Fler-grenete betingelser (Switch)", + "Multiple inputs (value is list of inputs)": "Flere input (som liste)", + "Nested auto-wrapping": "Nestet auto-wrapping", + "New": "Ny", + "New Category": "", + "New Project": "Nytt prosjekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nei", + "November": "", + "Number": "Tall", + "OK": "", + "Object": "Figur", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Åpne", + "Open Project": "Åpne prosjekt", + "Open in Community Site": "Åpne i Community Site", + "Open...": "Åpne...", + "Opening project...": "", + "Operators": "Operatorer", + "Other": "Andre", + "Output text using speech synthesis.": "", + "Paint Editor": "Tegne editor", + "Paint a new costume": "Tegn ny drakt", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "fyll området med ønsket farge (Skift: Sekundærfarge)", + "Paintbrush tool (free draw)": "Penselverktøy (fri tegning)", + "Parallelization": "", + "Part of": "Del av", + "Parts": "Deler", + "Password:": "", + "Pen": "Penn", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipette (klikk for henting av ønsket farge)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Pipetteverktøy (klikk for henting av ønsket farge) (Skift: Sekundærfarge)", + "Pixels": "", + "Plain prototype labels": "Enkle prototype navn", + "Play": "", + "Play sound": "Spill lyd", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Sjekk om nettleser er oppdatert og om Webcam er konfigurert. For noen nettlesere må Snap! åpnes med HTTPS , for bruk av kamera. Erstatt \"http://\"-delen med \"https://\"", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikat", + "Prefer empty slot drops": "Preferanse for tomme slots", + "Prefer smooth animations": "Preferanse for jevne animasjoner", + "Privacy...": "", + "Project Notes": "Prosjektnotater", + "Project URLs": "", + "Project notes...": "Prosjekt notater...", + "Provide 100 selected colors": "100 utvalgte farger", + "Provide getters and setters for all GUI-controlled global settings": "GUI elementer i egne programmer", + "Publish": "Publiser", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Ta opp ny lyd", + "Recover": "Tilbakestille", + "Rectangle (shift: square)": "Rektangel (Skift: kvadrat)", + "Reference manual": "Snap Manual", + "Remove a category...": "", + "Remove unused blocks": "Fjern ikke brukte blokker", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Erstatt dette prosjekt med et nytt", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funksjon", + "Request blocked": "", + "Resend Verification Email...": "Send verifikasjonsmail på nytt...", + "Resend verification email": "", + "Reset Password...": "Tilbakestill passord...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Retina skjermstøtte", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Lagre", + "Save As...": "Lagre som...", + "Save Project": "Lagre prosjekt", + "Save Project As...": "Lagre prosjekt som...", + "Save to disk": "Lagre til disk", + "Saved!": "Lagret!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "skriptvariabel navn", + "Scripts": "Skripter", + "Select a costume from the media library": "Velg drakt fra mediabiblioteket", + "Select a sound from the media library": "Velg lyd fra mediabiblioteket", + "Select categories of additional blocks to add to this project.": "Velg kategorier for tilleggsblokker i prosjektet", + "Selection tool": "Markeringsverktøy", + "Sensing": "Sansning", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Sett pennfarge RGB eller HSV", + "Set the rotation center": "Sett rotasjonssenteret", + "Share": "Dele", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Lag brukerkonto...", + "Single input.": "Singel input.", + "Single palette": "", + "Slider maximum value": "Max-verdi slider", + "Slider minimum value": "Min-verdi slider", + "Snap! website": "Snap! webbside", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Lyd", + "Sound Recorder": "", + "Sounds": "Lyder", + "Sprite": "Figur", + "Sprite Nesting": "", + "Stage": "Scene", + "Stage height": "Scene høyde", + "Stage selected: no motion primitives": "Scene gjeldende: ingen standard bevegelser:", + "Stage size": "Scene størrelse", + "Stage size...": "Scene størrelse...", + "Stage width": "Scene bredde", + "Stop": "Stopp", + "Stop sound": "Stopp lyd", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Stroked ellipse (Skift: sirkel)", + "Stroked Rectangle (shift: square)": "Stroked rektangel (Skift: kvadrat)", + "Switch back to user mode": "bytt tilbake til brukermodus", + "Switch to dev mode": "bytt til utviklermodus", + "Switch to vector editor?": "", + "Table lines": "Tabeller med linjer", + "Table support": "Tabell støtte", + "Table view": "Tabellvisning", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "Ternære Boolske inputt", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Tekst til tale", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Thread-sikre skripter", + "Title text": "Tittel tekst", + "Today": "I dag", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Oversettelser", + "Translators...": "Oversettere", + "Turbo mode": "", + "Turtle": "retningspeker", + "Undelete sprites...": "", + "Unpublish": "Ikke lenger publisere", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Ikke lenger dele", + "Unshare Project": "", + "Untitled": "Uten navn", + "Unused blocks...": "Ikke brukte blokker...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "Oppdatere prosjektliste...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Interne variable - synlig for den som kaller", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "variabelnavn", + "Variables": "Variabler", + "Variadic reporters": "Variadiske funksjoner", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuelt keyboard", + "Visible stepping": "Vis trinn-for-trinn (stepping) programkjøring", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Webservices tilgang (htpps)", + "Words, sentences": "Ord, setninger", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "", + "Yesterday": "I går", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Sebrafarger", + "Zoom blocks": "Zoom in blokker", + "Zoom blocks...": "Zoom blokker...", + "_ at _": "_ ved _", + "_ combine _ using _": "_ COMBINE el. i _ med _", + "_ contains _": "_ inneholder _", + "_ effect": "_ -effekt", + "_ find first item _ in _": "_ FINN første el. som _ i _", + "_ in front of _": "_ først i _", + "_ keep items _ from _": "_ KEEP el. som _ i _", + "_ map _ over _": "_ MAP _ på _", + "_ mod _": "", + "_ of _": "_ til _", + "_ of block _": "", + "_ of costume _": "_ for drakt _", + "_ of sound _": "_ fra lyd _", + "_ of text _": "", + "_ to _": "_ til _", + "__shout__go__": "grønt flagg klikket", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "ny klon av _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "cos-1", + "add _ to _": "legg til _ til _", + "add a new Turtle sprite": "legg til ny figur med retningspeker", + "add a new sprite": "legg til ny figur", + "add comment": "legg til kommentar", + "add comment here...": "legg til kommentar her...", + "agent": "", + "alert _": "pop-up: _", + "all": "", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "alle første i _", + "all but this script": "alle unntatt dette skriptet", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "anker", + "and": "OG", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "svar", + "any": "noen", + "any key": "hvilken som helst tast", + "any message": "melding...", + "anything": "", + "append _": "slå sammen _", + "arrange scripts vertically": "ordne skripter vertikalt", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "sin-1", + "ask _ and wait": "spør _ og vent", + "ask _ for _ _": "spø _ om _ _", + "atan": "tan-1", + "attach...": "", + "b": "b", + "back": "bakerst", + "balance": "balanse", + "big (2x)": "stor (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Slette denne blokken med alle dens brukene?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "som blokk", + "blocks": "blokker", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "bunn kant", + "box": "", + "brightness": "lysstyrke", + "broadcast _ _": "kringkast _ _", + "broadcast _ _ and wait": "kringkast _ _ og vent", + "brush": "", + "build": "bygge", + "but getting a": "", + "c": "c", + "call _ _": "kall _ med _", + "call _ w/continuation": "kall _ med kontinuering", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "roterer", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "rundet opp", + "center": "senter", + "center x": "senter x", + "center y": "senter y", + "change _ by _": "endre _ med _", + "change _ effect by _": "endre _ -effekt med _", + "change background _ by _": "endre bakgrunn _ med _", + "change balance by _": "endre balanse med _", + "change pen _ by _": "endre penn _ med _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "endre pennbredde med _", + "change size by _": "endre størrelse med _", + "change tempo by _": "endre tempo med _", + "change volume by _": "endre volum med _", + "change x by _": "endre x med _", + "change y by _": "endre y med _", + "check for alternative GUI design": "PÅ for alternativ GUI design", + "check for block to text mapping features": "", + "check for flat ends of lines": "PÅ flate linje avslutninger", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "PÅ for høyere oppløsning, bruker større regnekapasitet", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "PÅ for jevne, forutsigbare animasjoner jevnt over datamaskinen", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "PÅ alltid vis slot typer i inputt dialoger", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to disallow skript reentrance": "PÅ tillat ikke script reentrance", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "PÅ to enable IDE animations", + "check to enable alternating colors for nested blocks": "PÅ alternerende fargenyanser i nestete blokker", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "PÅ dynamiske navn for flersvarinputt", + "check to enable input sliders for entry fields": "PÅ bruk inputt sliders forinputt felt", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "PÅ bruk operatorer på lister og tabeller", + "check to enable virtual keyboard support for mobile devices": "PÅ bruk virtuell tastatur support for mobile enheter", + "check to hide (+) symbols in block prototype labels": "PÅ vis (+) symboler i blokk prototype navn", + "check to inherit from": "PÅ for å arve fra", + "check to prevent contents from being saved": "PÅ unngå lagring av innhold i prosjektet", + "check to prioritize script execution": "PÅ Prioriter script kjøring", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "PÅ slå block klikke lyd på", + "check to turn on logging pen vectors": "PÅ bruk logging penn vektorer", + "check to turn on visible stepping (slow)": "PÅ slå på programstegkjøring (slow)", + "check to use blurred drop shadows and highlights": "PÅ skarpe skygger og highlights", + "children": "barn", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "rydd opp", + "clear": "slett", + "clear graphic effects": "nullstill grafiske effekter", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "klikk kors og dra for å flytte rotasjonssenteret", + "clicked": "klikket", + "clone": "klone", + "clones": "klon", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "farge", + "color _ is touching _ ?": "farge _ berører _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "COMBINE el. i _ med _", + "comic": "moire", + "command": "Command", + "comment pic...": "kommentarbilde...", + "compile": "kompiler", + "compile _": "kompiler _", + "compile _ for _ args": "", + "confetti": "fargeforskyvninger", + "console log _": "skriv i konsoll: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "Drakt", + "costume #": "drakt nr.", + "costume name": "", + "costumes": "Drakter", + "costumes tab help": "Drakter tab-panel hjelp", + "could not connect to:": "", + "cr": "CR", + "create a clone of _": "klon _", + "cross": "", + "crosshairs": "", + "current": "gjeldende", + "current _": "nåværende _", + "current module versions:": "gjeldende modulversjon:", + "current parent": "gjeldende forelder", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "hengende??", + "data": "", + "date": "dato", + "day of week": "ukedag", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "slett", + "delete _": "", + "delete _ of _": "slett _ fra _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "slett blokkdefinisjoner...", + "delete slot": "", + "delete this clone": "slett denne klon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "separer alle deler", + "detach and put into the hand": "", + "detach from": "separer fra", + "development mode": "utviklermodus", + "development mode debugging primitives:": "utviklermodus Debugging-blokker", + "development mode...": "", + "dimensions": "", + "direction": "retning", + "disable deep-Morphic context menus and show user-friendly ones": "ut av Morphic kontekst menyer og vis brukervennlige", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "avstand", + "distance to _": "", + "distribution": "", + "don't rotate": "roterer ikke", + "down arrow": "pil ned", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "flyttbar", + "draggable?": "kan dras?", + "dragging threshold": "", + "dropped": "sluppet", + "duplicate": "duplisere", + "duplicate block definition...": "dupliser blokkdefinisjoner...", + "duration": "lengde i sek", + "e": "e", + "e^": "e^", + "edge": "kant", + "edit": "editer", + "edit rotation point only...": "", + "edit the costume's rotation center": "endre draktens rotasjonspunkt", + "edit...": "editer...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "slå på Morphic funksjoner", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "eksporter", + "export block definition...": "", + "export pen trails line segments as SVG": "eksporter pennesporsom SVG", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "eksporter...", + "extract": "", + "f": "f", + "false": "USANN", + "file": "", + "file menu import hint": "fil meny import hint", + "fill": "fyll", + "fill page...": "", + "filtered for _": "filtrert med _", + "find blocks": "finn bokker", + "find blocks...": "", + "find first item _ in _": "FINN første el. som _ i _", + "find unused global custom blocks and remove their definitions": "Finn ikke brukte blokker og fjern", + "fisheye": "fiskeøye", + "flag": "", + "flash": "", + "flat line ends": "flate pennlinjeavslutninger", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "rundet ned", + "footprints": "", + "for _ = _ to _ _": "for _ = _ til _ _", + "for all sprites": "for alle figurer", + "for each _ in _ _": "for hver _ i _ _", + "for this sprite only": "kun for denne figur", + "forever _": "for alltid _", + "frame": "", + "frames": "", + "frequencies": "", + "frequency": "frekvens", + "front": "fremst", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "gjennomsiktighet", + "giant (8x)": "gigantisk (8x)", + "glide _ secs to x: _ y: _": "glide _ sek til x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "gå tilbake _ lag", + "go to _": "gå til _", + "go to _ layer": "gå til lag _", + "go to x: _ y: _": "gå til x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "høyde", + "hello": "hallo", + "help": "hjelp", + "help...": "Hjelp...", + "hide": "skjul", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "skjul basisblokker", + "hide variable _": "skjul variabel _", + "high": "høy", + "hour": "time", + "http:// _": "", + "hue": "fargetone", + "huge (4x)": "kjempestor (4x)", + "i": "i", + "identical to": "identisk", + "if _ _": "hvis _ _", + "if _ _ else _": "hvis _ _ ellers _", + "if _ then _ else _": "hvis _ så _ ellers _", + "if on edge, bounce": "sprett tilbake fra kanten", + "import a sound from your computer by dragging it into here": "importere lyder ved å dra over", + "import without attempting to parse or format data": "importer uformatert (uten parsing)", + "import...": "Importer...", + "in palette": "", + "including dependencies": "", + "index": "indeks", + "index of _ in _": "indeks til _ i _", + "inherit _": "arver _", + "inherited": "arvet", + "input list:": "inndata liste:", + "input names:": "inndata navn:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "sett inn _ som _ i _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "er _ ?", + "is _ a _ ?": "er _ type _ ?", + "is _ empty?": "er _ tom?", + "is _ identical to _ ?": "er _ identisk _ ?", + "is _ on?": "_ på?", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "element _ fra _", + "items": "elementer", + "j": "j", + "join _": "skjøt _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "KEEP el. som _ i _", + "key": "", + "key _ pressed?": "tast _ trykket?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Norsk", + "language_translator": "Olav A Marschall", + "large": "stor", + "last": "siste", + "last changed": "", + "last_changed": "2020-08-19", + "launch _ _": "start _ _", + "left": "venstre kant", + "left arrow": "pil venstre", + "length": "lengde i # samples", + "length of _": "lengde til _", + "length:": "lengde:", + "let the World automatically adjust to browser resizing": "", + "letter": "bokstav", + "letter _ of _": "tegn _ av _", + "light (70)": "lett (70)", + "lightness": "", + "line": "nylinje", + "lines": "", + "list": "", + "list _": "liste _", + "list view...": "liste visning...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "logg penn vektorer", + "login": "", + "loop": "", + "low": "lav", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "lag ny blokk...", + "make a category...": "", + "make a copy and pick it up": "lag en kopi og ta den med", + "make a morph": "", + "make temporary and hide in the sprite corral": "lag midlertidig og skjul i figur corral", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "MAP _ på _", + "map _ to _ _": "", + "max": "max", + "maximum": "", + "medium (50)": "middels (50)", + "menus": "", + "message": "melding", + "microphone _": "mikrofon _", + "middle": "", + "minimum": "", + "minute": "minutt", + "mirror video": "video speilet", + "missing / unspecified extension": "", + "monstrous (10x)": "monsterstort (10x)", + "month": "måned", + "mosaic": "mosaik", + "motion": "bevegelse", + "mouse down?": "mustast trykket?", + "mouse position": "", + "mouse x": "mus x-posisjon", + "mouse y": "mus y-posisjon", + "mouse-departed": "mus ut av", + "mouse-entered": "mus over", + "mouse-pointer": "muspeker", + "move": "bevege", + "move _ steps": "gå _ steg", + "move all inside...": "", + "move...": "", + "my": "attributt", + "my _": "min(e) _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "meg", + "n": "n", + "name": "navn", + "neg": "", + "negative": "fargenegativ", + "neighbors": "naboer", + "neighbors ≠": "", + "new costume _ width _ height _": "ny drakt _ bredde _ høyde _", + "new line": "ny linje", + "new sound _ rate _ Hz": "ny lyd _ _ Hz", + "new...": "ny...", + "next": "", + "next costume": "neste drakt", + "none": "ingen", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "IKKE", + "not _": "IKKE _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "Tall", + "number of channels": "antall kanaler", + "numbers from _ to _": "tall fra _ til _", + "o": "o", + "object _": "figur _", + "octagon": "", + "only duplicate this block": "kun denne blokken dupliseres", + "only face left/right": "kun mot venstre/høyre", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "åpne med dialogvindu", + "open shared project from cloud...": "", + "options...": "", + "or": "ELLER", + "or before": "", + "other clones": "andre kloner", + "other scripts in sprite": "andre skripter i figuren", + "other sprites": "andre figurer", + "p": "p", + "paint a new sprite": "tegn ny figur", + "paintbucket": "", + "parameters": "", + "parent": "forelder", + "parent...": "forelder...", + "parts": "deler", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "lim inn på _", + "pause": "", + "pause all _": "pause (alle) _", + "pen": "", + "pen _": "penn _", + "pen down": "penn ned", + "pen down?": "penn nede?", + "pen trails": "pennsporer", + "pen up": "penn opp", + "pen vectors": "penn vektorer", + "pic...": "eksporter bilde...", + "pick random _ to _": "tilfeldig tall fra _ til _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "senterpunkt", + "pixel": "", + "pixelate": "pixler", + "pixels": "pixler", + "play _ Hz for _ secs": "spill _ Hz i _ sek", + "play frequency _ Hz": "spill frekvens _ Hz", + "play note _ for _ beats": "spill note _ for _ slag", + "play sound _": "spill lyd _", + "play sound _ at _ Hz": "spill lyd _ med _ Hz", + "play sound _ until done": "spill hele lyden _", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "pek i retning _", + "point towards _": "pek mot _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "Predikat", + "presentation (1.4x)": "presentasjon (1.4x)", + "pressed": "trykket", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "R-G-B-A fargeverdier", + "random": "tilfeldig", + "random position": "tilfeldig posisjon", + "rank": "", + "raw data...": "basisdata...", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "re-dropp", + "relabel...": "gi nytt navn...", + "release": "slipp", + "remove block variables...": "", + "rename": "endre navn", + "rename all blocks that access this variable": "endre navn til alle blokker, som refererer til denne variabelen", + "rename all...": "endre navn på alle...", + "rename background": "", + "rename costume": "endre draktnavn", + "rename only this reporter": "endre navn kun for denne funksjonen", + "rename sound": "endre lydnavn", + "rename...": "nytt navn...", + "repeat _ _": "_ ganger _", + "repeat until _ _": "gjenta til _ _", + "replace item _ of _ with _": "erstatt el. _ i _ med _", + "report _": "rapporterer _", + "reporter": "Funksjon", + "reporter didn't report": "", + "reset columns": "tilbakestill kolonner", + "reset timer": "nullstille timer", + "reshape _ to _": "", + "resize...": "", + "resolution": "oppløsning", + "rest for _ beats": "pause for _ slag", + "restore display": "", + "result pic...": "resultatbilde...", + "reverse": "", + "right": "høyde kant", + "right arrow": "pil høyre", + "ring": "", + "ringify": "omringe", + "robot": "", + "rotate": "roter", + "rotation style": "rotasjonsstil", + "rotation x": "rotasjon x", + "rotation y": "rotasjon y", + "round _": "avrund _", + "run _ _": "kjør _ med _", + "run _ w/continuation": "kjør _ med kontinuering", + "s": "s", + "sample morphs": "", + "sample rate": "samplerate", + "samples": "", + "saturation": "mettning", + "save _ as costume named _": "", + "save a picture of all scripts": "lagre et bilde av samtlige skripter", + "save a picture of both this script and its result": "lagre bilde av både dette skript og resultatet", + "save a picture of the stage": "lagre et bilde av scenen", + "save a picture of this comment": "lagre et bilde av kommentaren", + "save a picture of this script": "lagre bildeav dette skriptet", + "save a summary of this project": "Lagre sammendraget til prosjektet", + "save global custom block definitions as XML": "Lagre globale brukerblokkdefinisjoner som XML", + "save project data as XML to your downloads folder": "Lagre prosjekt som XML i Downloadmappe", + "saved.": "", + "say _": "si _", + "say _ for _ secs": "si _ i _ sek", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "skript bilde...", + "script variables _": "skript variabler _", + "scripts": "Skripter", + "scripts pic...": "skript bilde...", + "scroll frame": "", + "scrolled-down": "bladd ned", + "scrolled-up": "bladd opp", + "second": "sekund", + "select": "velge", + "selection": "", + "self": "selv", + "send _ to _": "send _ til _", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "sett _ -effekt til _", + "set _ of block _ to _": "", + "set _ to _": "sett _ til _", + "set background _ to _": "sett bakgrunn _ til _", + "set background color to _": "sett bakgrunnsfarge til _", + "set balance to _": "sett balanse til _", + "set instrument to _": "sett instrument til _", + "set pen _ to _": "sett penn _ til _", + "set pen color to _": "sett pennfarge til _", + "set pen shade to _": "", + "set pen size to _": "sett pennbredde til _", + "set size to _ %": "set størrelse til _ %", + "set tempo to _ bpm": "sett tempo til _ slag/min.", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "sett videotransparens til _", + "set volume to _ %": "sett volum til _ %", + "set x to _": "sett x til _", + "set y to _": "sett y til _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "settings meny preferanser tom slots hint", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "skimrende (80)", + "show": "vis", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "vis alle", + "show all...": "", + "show primitives": "vis basisblokker", + "show project data as XML in a new browser window": "Vis prosjektdata som XML i et nytt nettleservindu", + "show table _": "", + "show the World's menu": "", + "show variable _": "vis variabel _", + "shown?": "synlig?", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "størrelse", + "slider": "", + "slider max...": "max.verdi...", + "slider min...": "min.verdi...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "Lyder", + "space": "mellomrom", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "frekvensspektrum", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "splitt _ gitt _", + "sprite": "Figur", + "sprites": "figurer", + "sqrt": "kvadratrot", + "square": "", + "stack size": "stack størrelse", + "stage": "Scene", + "stage image": "", + "stamp": "", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "lim til", + "stop _": "stopp _", + "stop all sounds": "stoppe alle lyder", + "stop frequency": "stopp frekvens", + "stopped": "stoppet", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Last ned prosjektet lokal lagring (kun i noen browsere mulig!)", + "stretch _ x: _ y: _ %": "forlenge _ x: _ y: _ %", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "SVG eksport...", + "switch to costume _": "bytt til drakt _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulator", + "table view...": "tabell visning...", + "take a camera snapshot and import it as a new sprite": "legg til ny figur med webcam snapshot", + "tan": "tan", + "tell _ to _ _": "be _ gjøre _ _", + "tempo": "", + "temporary?": "midlertidig?", + "text": "Tekst", + "text-only (100)": "bare tekst (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "det er ingen ubrukte globale og bruker definerte blokker i prosjektet", + "there are currently no vectorizable pen trail segments": "det finnes ingen tilgjengelige vektoriserbare pennespor", + "thing": "noe", + "think _": "tenk _", + "think _ for _ secs": "tenk _ i _ sek", + "this _": "", + "this block": "denne blokken", + "this project doesn't have any custom global blocks yet": "dette prosjektet har ikke egne globale blokker enda", + "this script": "dette skriptet", + "time in milliseconds": "tid i millisekunder", + "timer": "", + "tip": "", + "to": "til", + "top": "topp kant", + "touch screen settings": "", + "touching _ ?": "berører _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "olavmarschall@gmail.com", + "transparency": "transparens", + "transparency...": "", + "trash is empty": "", + "true": "SANN", + "turbo mode": "turbomodus", + "turbo mode?": "", + "turn _ _ degrees": "drei _ _ grader", + "turn all pen trails and stamps into a new background for the stage": "gjør alle pennespor og trykk til en ny bakgrunn", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "gjør alle pennespor og trykk til en ny drakt for valgte figur", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "type av _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "AV for default GUI design", + "uncheck for greater speed at variable frame rates": "AV raskere at variable frame rates", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "AV gir lavere oppløsning, bruker mindre regnekapasitet", + "uncheck for round ends of lines": "AV Avrundete linje avslutninger", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "AV tillat droppete reportere kikker ut andre", + "uncheck to allow script reentrance": "AV tillat skript reentrance", + "uncheck to always show (+) symbols in block prototype labels": "AV vis alltid (+) symboler i prototype navn", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "AV slå av IDE animasjoner", + "uncheck to disable alternating colors for nested block": "AV alternerende fargenyanser i nestete blokker", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "AV dynamiske navn for flersvarinputt", + "uncheck to disable input sliders for entry fields": "AV ikke bruk inputt sliders for inputt felt", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "AV Ikke bruk operatorer på lister og tabeller", + "uncheck to disable virtual keyboard support for mobile devices": "AV ikke bruk virtuell tastatur support for mobile enheter", + "uncheck to disinherit": "AV for ikke lenger arve fra", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "AV kjør skripter med normal hastighet", + "uncheck to save contents in the project": "AV, lagre innhold i prosjektet", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "AV slå block klikke lyd av", + "uncheck to turn off logging pen vectors": "AV ikke logging penn vektorer", + "uncheck to turn off visible stepping": "AV slå av programstegkjøring", + "uncheck to use solid drop shadows and highlights": "AV skarpe skygger og highlights", + "uncheck to use the input dialog in short form": "AV bruk inputt dialoger i kort format", + "uncompile": "dekompiler", + "undo": "gjør om", + "undo the last block drop in this pane": "gjør om siste blokk dropp i dette panelet", + "undrop": "un-dropp", + "unicode _ as letter": "unicode _ som bokstav", + "unicode of _": "unicode til _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "fjernring", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "uten navn", + "unused": "", + "unused block(s) removed": "ikke brukte blokker er fjernet", + "up arrow": "pil opp", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "bruk tastatur til å lage blokker", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "verdi", + "variable": "", + "variables": "", + "video _ on _": "video _ av _", + "video capture": "videoopptak", + "volume": "", + "w": "w", + "wait _ secs": "vent _ sek", + "wait until _": "vent til _", + "wardrobe": "", + "warp _": "", + "what's your name?": "hva heter du?", + "when I am _": "når jeg blir _", + "when I receive _ _": "når jeg mottar _ _", + "when I start as a clone": "når jeg starter som klon", + "when _": "når _", + "when _ clicked": "når _ klikket", + "when _ is edited _": "", + "when _ key pressed _": "når tast _ trykket _", + "whirl": "virvel", + "whitespace": "mellomrom", + "width": "bredde", + "with data": "", + "with inputs": "med inndata", + "word": "ord", + "world": "verden", + "write _ size _": "skriv _ størrelse _", + "x": "x", + "x position": "x-posisjon", + "y": "y", + "y position": "y-posisjon", + "year": "år", + "year:": "", + "your own": "egne", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-pl.js b/elements/pl-snap/Snap/locale/lang-pl.js new file mode 100644 index 00000000..053b90db --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-pl.js @@ -0,0 +1,1381 @@ +SnapTranslator.dict.pl = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) lewo", + "(0) up": "(0) góra", + "(1) sine": "(1) sinusoidalna", + "(180) down": "(180) dół", + "(2) square": "(2) prostokątna", + "(3) sawtooth": "(3) piłokształtna", + "(4) triangle": "(4) trójkątna", + "(90) right": "(90) prawo", + "(empty)": "(puste)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "O Snap", + "About...": "O Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Zezwalaj na wprowadzanie tekstu wielowierszowego do bloku", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animacje", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Dowolny (nieokreślony)", + "Any type": "Dowolnego rodzaju", + "Apply": "Zastosuj", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Czy napewno chcesz usunąć?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Wstecz...", + "Backgrounds": "Tła", + "Backup failed. This cannot be undone, proceed anyway?": "Kopia zapasowa nie jest możliwa. Czy mimo to kontynuować?", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "bitmapa", + "Block Editor": "Edytor bloków", + "Blocks": "Bloki", + "Blocks category name:": "", + "Blurred shadows": "Rozmyte cienie", + "Boolean": "logiczna", + "Boolean (T/F)": "Logiczny (P/F)", + "Boolean (unevaluated)": "Logiczny (nieokreślony)", + "Bottom": "spód", + "Bring back deleted sprites": "Odzyskaj usunięte duszki", + "Browser": "", + "Brush size": "Rozmiar pędzla", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Anuluj", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Złap błędy w skrypcie", + "Category color": "", + "Change Password": "", + "Change Password...": "Zmień hasło...", + "Change block": "Zmień blok", + "Clear backup": "", + "Clicking sound": "Dźwięk kliknięcia", + "Closed brush (free draw)": "Pędzel zamykający krzywe (swobodne rysowanie)", + "Cloud": "", + "Code mapping": "", + "Codification support": "Kodowanie bloków", + "Colors and Crayons": "", + "Command": "Komenda", + "Command (C-shape)": "Komenda (C-Form)", + "Command (inline)": "Komenda", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Zachowaj proporcje kształtów (możesz też przytrzymać shift)", + "Contents": "Zawartość", + "Contributors": "Współpracownicy", + "Control": "Kontrola", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Edytor kostiumów", + "Costumes": "Kostiumy", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Utwórz nazwę parametru", + "Create variables": "", + "Create variables in program": "Utwórz zmienne w skrypcie", + "Credits...": "Podziękowania...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Domyślny", + "Default Value:": "Wartość standardowa:", + "Delete": "Usuń", + "Delete Custom Block": "Usuń własny blok", + "Delete Project": "Usuń projekt", + "Delete a variable": "Usuń zmienną", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "w dół", + "Download source": "Pobierz źródło", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamiczne opisy parametrów", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Kolor linii (lewy przycisk myszy)", + "Edit input name": "Edytuj nazwę parametru", + "Edit label fragment": "Edytuj opis parametru", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Elipsa (+shift: okrąg)", + "Empty": "Pusty", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Gumka", + "Error": "", + "Examples": "Przykłady", + "Execute on slider change": "", + "Export Project As...": "Eksportuj projekt jako...", + "Export all scripts as pic...": "", + "Export blocks": "Eksportuj bloki", + "Export blocks...": "Eksportuj bloki...", + "Export project as plain text...": "Eksportuj projekt jako tekst...", + "Export project...": "Eksportuj projekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "Eksport podsumowania...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Przygaś bloki", + "Fade blocks...": "Przygaś bloki...", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "Wypełnij obszar wybranym kolorem", + "Fill color (right click)": "Kolor wypełnienia (prawy przycisk myszy)", + "Filled Ellipse (shift: circle)": "Wypełniona elipsa (+shift: koło)", + "Filled Rectangle (shift: square)": "Prostokąt (+shift: kwadrat)", + "First-Class Sprites": "", + "Flat design": "Prosty wygląd", + "Flat line ends": "Płaskie końce linii", + "For all Sprites": "Dla wszystkich duszków", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Cześć!", + "Hello, World!": "", + "Help": "Pomoc", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "Obsługa hiperbloków", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Nowy kostium z kamery", + "Import blocks": "Importuj bloki", + "Import library": "Importuj bibliotekę", + "Import sound": "", + "Import...": "Importuj...", + "Imported": "Zaimportowane", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Liczby całkowite nieskończonej precyzji, dokładne liczby wymierne, liczby zespolone", + "Inheritance support": "Podtrzymywanie dziedziczenia", + "Input Names:": "Nazwy Parametrów:", + "Input Slot Options": "", + "Input name": "Nazwa", + "Input sliders": "Suwaki wejściowe", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iteracja, kompozycja", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "funkcja JavaScript ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Edytowanie Klawiaturą", + "Kind of": "Rodzaj", + "LEAP Motion controller": "Kontroler ruchu LEAP", + "Language...": "Język...", + "Libraries...": "Biblioteki...", + "License": "Licencja", + "License...": "Licencja...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Odcinek (+shift: nachylenie co 45°)", + "Line tool (shift: vertical/horizontal)": "Odcinek (+shift: pionowy/poziomy)", + "List": "Lista", + "List utilities": "Metody listy", + "Lists": "Listy", + "Live coding support": "", + "Loading": "Ładowanie", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Zapis wektorowy pisaka", + "Login...": "Logowanie...", + "Logout": "Wyloguj", + "Long form input dialog": "Długa forma dialogu wejścia", + "Looks": "Wygląd", + "Make a block": "Nowy blok", + "Make a variable": "Utwórz zmienną", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Nazwa wiadomości", + "Method Editor": "Edytor metod", + "Microphone": "", + "Microphone resolution...": "Rozdzielczość mikrofonu...", + "Modules...": "Moduły...", + "Motion": "Ruch", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Tryb wieloargumentowy (switch)", + "Multiple inputs (value is list of inputs)": "Wiele parametrów (jako lista)", + "Nested auto-wrapping": "Przyleganie do kompletnych skryptów", + "New": "Nowy", + "New Category": "", + "New Project": "Nowy projekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nie", + "November": "", + "Number": "Liczba", + "OK": "", + "Object": "Obiekt", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Otwórz", + "Open Project": "Otwórz projekt", + "Open in Community Site": "Pokaż stronę projektu", + "Open...": "Otwórz...", + "Opening project...": "", + "Operators": "Wyrażenia", + "Other": "Inne", + "Output text using speech synthesis.": "", + "Paint Editor": "Edytor grafiki rastrowej", + "Paint a new costume": "Narysuj nowy kostium", + "Paint a shape (shift: edge color)": "Wypełnij obszar wybranym kolorem (+shift: kolor linii)", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Pędzel (swobodne rysowanie)", + "Parallelization": "", + "Part of": "Część", + "Parts": "Części", + "Password:": "", + "Pen": "Pisak", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipeta (wybierz kolor w dowolnym miejscu)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Pipeta wybierz kolor klikając w dowolnym miejscu (+shift: kolor wypełnienia)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Prosta etykieta prototypu", + "Play": "Graj", + "Play sound": "Zagraj dżwięk", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "Wielokąt", + "Predicate": "Predykat", + "Prefer empty slot drops": "Preferuj puste gniazda", + "Prefer smooth animations": "Preferuj gładkie animacje", + "Privacy...": "", + "Project Notes": "Opis projektu", + "Project URLs": "", + "Project notes...": "O projekcie...", + "Provide 100 selected colors": "100 wybranych kolorów", + "Provide getters and setters for all GUI-controlled global settings": "Dostarcz gettery i settery (pobierające i ustawiające) dla wszystkich globalnych ustawień kontrolowanych przez GUI", + "Publish": "Publikuj", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Nagraj nowy dźwięk", + "Recover": "Odzyskaj", + "Rectangle (shift: square)": "Brzeg prostokąta (+shift: kwadratu)", + "Reference manual": "Podręcznik", + "Remove a category...": "", + "Remove unused blocks": "Usuń niewykorzystane bloki", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Zastąpić aktualny projekt przez nowy?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funkcja", + "Request blocked": "", + "Resend Verification Email...": "Wyślij ponownie email weryfikacyjny...", + "Resend verification email": "", + "Reset Password...": "Zresetuj hasło...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Wsparcie wyświetlacza Retina", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Zapisz", + "Save As...": "Zapisz jako...", + "Save Project": "Zapisz projekt", + "Save Project As...": "Zapisz projekt jako...", + "Save to disk": "Zapisz na dysku", + "Saved!": "Zapisane!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "nazwa zmiennej skryptu", + "Scripts": "Skrypty", + "Select a costume from the media library": "Wybierz kostium z biblioteki multimediów", + "Select a sound from the media library": "Wybierz dźwięk z biblioteki multimediów", + "Select categories of additional blocks to add to this project.": "Wybierz kategorie dodatkowych bloków, które chcesz dodać do tego projektu.", + "Selection tool": "Narzędzie do zaznaczania", + "Sensing": "Czujniki", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Ustaw kolor pisaka RGB lub HSV", + "Set the rotation center": "Ustaw środek obrotu", + "Share": "Udostępnij", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Rejestracja...", + "Single input.": "Jeden parametr.", + "Single palette": "", + "Slider maximum value": "Maksymalna wartość suwaka", + "Slider minimum value": "Minimalna wartość suwaka", + "Snap! website": "Strona Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Dźwięk", + "Sound Recorder": "", + "Sounds": "Dźwięki", + "Sprite": "Duszek", + "Sprite Nesting": "", + "Stage": "Scena", + "Stage height": "Wysokość sceny", + "Stage selected: no motion primitives": "Wybrana scena: nie ma bloków ruchu", + "Stage size": "Rozmiar sceny", + "Stage size...": "Rozmiar sceny...", + "Stage width": "Szerokość sceny", + "Stop": "", + "Stop sound": "Zatrzymaj dżwięk", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Elipsa (+shift: okrąg)", + "Stroked Rectangle (shift: square)": "Brzeg prostokąta (+shift: kwadratu)", + "Switch back to user mode": "Przełącz do trybu użytkownika", + "Switch to dev mode": "do trybu budowania", + "Switch to vector editor?": "", + "Table lines": "Tabele z liniami", + "Table support": "Tablice 2D", + "Table view": "Widok tabeli", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "Potrójne wejścia boolowskie", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Tekst na mowę", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Omijaj bezpieczne skrypty", + "Title text": "Tekst tytułowy", + "Today": "Dzisiaj", + "Today,": "", + "Top": "wierzch", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Tłumaczenia", + "Translators...": "Tłumacze", + "Turbo mode": "Tryb turbo", + "Turtle": "Żółw", + "Undelete sprites...": "Przywróć duszki...", + "Unpublish": "Cofnij publikację", + "Unpublish Project": "", + "Unsaved Changes!": "Niezapisane zmiany!", + "Unshare": "Wyłącz udostępnianie", + "Unshare Project": "", + "Untitled": "Bez nazwy", + "Unused blocks...": "Niewykorzystane bloki...", + "Unverified account:": "", + "Up": "w górę", + "Updating project list...": "Aktualizuję listę projektów...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Wewnętrzna zmienna widoczna dla wywołania", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "nazwa zmiennej", + "Variables": "Dane", + "Variadic reporters": "Zmienna liczba argumentów", + "Vector": "wektor", + "Vector Paint Editor": "Edytor grafiki wektorowej", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Witualna klawiatura", + "Visible stepping": "Debugowanie krokowe", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Dostęp do usług sieciowych (https)", + "Words, sentences": "Słowa, zdania", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Tak", + "Yesterday": "Wczoraj", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Kolorowanie zebrą", + "Zoom blocks": "Zoom bloków", + "Zoom blocks...": "Powiększ bloki...", + "_ at _": "_ w _", + "_ combine _ using _": "_ połącz _ używając _", + "_ contains _": "_ zawiera _", + "_ effect": "efekt _", + "_ find first item _ in _": "_ znajdź pierwszy element _ w _", + "_ in front of _": "wstaw _ przed _", + "_ keep items _ from _": "_ zachowaj elementy _ od _", + "_ map _ over _": "_ mapuj _ na _", + "_ mod _": "", + "_ of _": "_ z _", + "_ of block _": "", + "_ of costume _": "_ kostiumu _", + "_ of sound _": "_ dźwięku _", + "_ of text _": "_ z tekst _", + "_ to _": "_ do _", + "__shout__go__": "kliknięto zieloną flagę", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "nowy klon _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "moduł", + "acos": "arccos", + "add _ to _": "dodaj _ do _", + "add a new Turtle sprite": "dodaj nowego duszka-żółwia", + "add a new sprite": "dodaj nowego duszka", + "add comment": "dodaj komentarz", + "add comment here...": "dodaj komentarz tutaj...", + "agent": "", + "alert _": "alert: _", + "all": "wszystkich", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "bez pierwszego z _", + "all but this script": "wszystko oprócz tego skryptu", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "kotwica", + "and": "", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "odpowiedź", + "any": "dowolny", + "any key": "dowolny klawisz", + "any message": "dowolna wiadomość", + "anything": "", + "append _": "przyłącz _", + "arrange scripts vertically": "ustaw skrypty w pionie", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "arcsin", + "ask _ and wait": "zapytaj _ i czekaj", + "ask _ for _ _": "zapytaj _ o _ _", + "atan": "arctg", + "attach...": "", + "b": "b", + "back": "w głębi", + "balance": "balans", + "big (2x)": "duże (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "czy ten blok ze wszystkimi wystąpieniami rzeczywiście usunąć?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "normalny (0)", + "blockify": "jako blok", + "blocks": "bloki", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "dolna krawędź", + "box": "", + "brightness": "jasność", + "broadcast _ _": "nadaj _ _", + "broadcast _ _ and wait": "nadaj _ _ i czekaj", + "brush": "", + "build": "buduj", + "but getting a": "", + "c": "c", + "call _ _": "wywołaj _ z _", + "call _ w/continuation": "wywołaj _ z kontynuacją", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "dowolny obrót", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "zaokrąglenie w górę", + "center": "środek", + "center x": "x środka", + "center y": "y środka", + "change _ by _": "zmień _ o _", + "change _ effect by _": "zmień efekt _ o _", + "change background _ by _": "zmień tło _ o _", + "change balance by _": "zmień balans o _", + "change pen _ by _": "zmień pisak _ o _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "zmień rozmiar pisaka o _", + "change size by _": "zmień rozmiar o _", + "change tempo by _": "zmień tempo o _", + "change volume by _": "zmień głośność o _", + "change x by _": "zmień x o _", + "change y by _": "zmień y o _", + "check for alternative GUI design": "zaznacz, aby przełączyć na alternatywny wygląd GUI", + "check for block to text mapping features": "", + "check for flat ends of lines": "zaznacz, aby końce linii były płaskie", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "zaznacz, aby uzyskać wyższą rozdzielczość, (większa moc obliczeniowa)", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "zaznacz, aby zapewnićna jednakowe, gładkie animacje", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "zaznacz, aby włączyć długą formę dialogu wejścia", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "zaznacz, aby nie pozwolić na restartowanie skryptu", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "zaznacz, aby pozwolić na animacje IDE", + "check to enable alternating colors for nested blocks": "zaznacz, aby pozowlić na zmianę barw zagnieżdżonych bloków", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "zaznacz, aby włączyć dynamiczne opisy dla wejść variadic", + "check to enable input sliders for entry fields": "zaznacz, aby pozwolić na suwaki w polach wejściowych", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "zaznacz, aby umożliwić używanien wyrażeń na listach i tabelach", + "check to enable virtual keyboard support for mobile devices": "zaznacz, aby używać klawiatury wirtualnej dla urzdzeń mobilnych", + "check to hide (+) symbols in block prototype labels": "zaznacz, aby ukryć symbol (+) na etykietach prototypowych bloków", + "check to inherit from": "zaznacz, żeby dziedziczyć od", + "check to prevent contents from being saved": "zaznacz, aby zapobiec zapisaniu zawartości", + "check to prioritize script execution": "zaznacz, aby nadać priorytet wykonaniu skryptu", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "zaznacz, aby włączyć dźwięk klikniźcia", + "check to turn on logging pen vectors": "zaznacz, aby włączyć zapis wektorowy pisaka", + "check to turn on visible stepping (slow)": "zaznacz, aby włączyć widoczne kroki (wolne)", + "check to use blurred drop shadows and highlights": "zaznacz, aby uzyskać ozmyte cienie i granice", + "children": "potomstwo", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "wyczyść", + "clear": "wyczyść", + "clear graphic effects": "wyczyść efekty graficzne", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "kliknij lub przeciągnij krzyżyk, aby przesunąć środek obrotu", + "clicked": "kliknięty", + "clone": "klonuj", + "clones": "klony", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "kolor", + "color _ is touching _ ?": "czy kolor _ dotyka _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "kolumny", + "combinations _": "", + "combine _ using _": "połącz _ używając _", + "comic": "mora", + "command": "komenda", + "comment pic...": "obrazek komentarza", + "compile": "kompiluj", + "compile _": "skompiluj _", + "compile _ for _ args": "", + "confetti": "konfetti", + "console log _": "log konsoli: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "kostium", + "costume #": "kostium nr", + "costume name": "nazwa kostiumu", + "costumes": "kostiumy", + "costumes tab help": "Importuj obrazy z innej strony lub z komputera przeciągając tu", + "could not connect to:": "", + "cr": "koniec linii", + "create a clone of _": "sklonuj _", + "cross": "", + "crosshairs": "", + "current": "obecny", + "current _": "obecnie _", + "current module versions:": "aktualna wersja modułów", + "current parent": "aktualny pierwowzór", + "custom?": "", + "cut from _": "wytnij z _", + "d": "d", + "dangling?": "wiszący?", + "data": "", + "date": "dzień", + "day of week": "dzień tygodnia", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "usuń", + "delete _": "", + "delete _ of _": "usuń _ z _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "usuń definicję bloku", + "delete slot": "", + "delete this clone": "usuń tego klona", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "odłącz wszystkie części", + "detach and put into the hand": "", + "detach from": "odłącz od", + "development mode": "tryb budowania", + "development mode debugging primitives:": "tryb budowania debugowanie procedur pierwotnych", + "development mode...": "", + "dimensions": "wymiary", + "direction": "kierunek", + "disable deep-Morphic context menus and show user-friendly ones": "wyłącz menu kontekstowe deep-Morphic i pokaż przyjazne dla użytkownika", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "odległość", + "distance to _": "", + "distribution": "", + "don't rotate": "nie obracaj", + "down arrow": "strzałka w dół", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "przeciąganie", + "draggable?": "przeciągalny?", + "dragging threshold": "", + "dropped": "upuszczony", + "duplicate": "powiel", + "duplicate block definition...": "powiel definicję bloku...", + "duration": "czas trwania", + "e": "e", + "e^": "e^", + "edge": "krawędzie", + "edit": "edytuj", + "edit rotation point only...": "", + "edit the costume's rotation center": "edytuj środek obrotu kostiumu", + "edit...": "edytuj...", + "editables": "", + "elegant (90)": "elegancki (90)", + "enable Morphic context menus and inspectors, not user-friendly!": "włąz Morphic menu kontekstowe i inspectors, niezbyt przyjazne dla użytkownika!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "eksportuj", + "export block definition...": "eksportuj definicję bloku...", + "export pen trails line segments as SVG": "eksportuj ślady pisaka jako grafikę wektorową", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "eksportuj...", + "extract": "wyodrębnij", + "f": "f", + "false": "fałsz", + "file": "", + "file menu import hint": "ładuje wyeksportowany projekt biblitekę kostium lub dźwięk", + "fill": "wypełnij", + "fill page...": "", + "filtered for _": "przefiltrowane dla _", + "find blocks": "znajdź bloki", + "find blocks...": "", + "find first item _ in _": "znajdź pierwszy element _ w _", + "find unused global custom blocks and remove their definitions": "znajdź i usuń niewykorzystane bloki", + "fisheye": "rybie oko", + "flag": "", + "flash": "", + "flat line ends": "płaskie końce linii", + "flatten": "spłaszcz", + "flip horizontal": "przerzuć ↔", + "flip vertical": "przerzuć ↕", + "flip ↔": "", + "flip ↕": "", + "floor": "zaokrąglenie w dół", + "footprints": "", + "for _ = _ to _ _": "dla _ = _ do _ _", + "for all sprites": "dla wszystkich duszków", + "for each _ in _ _": "dla każdego _ z _ _", + "for this sprite only": "tylko dla tego duszka", + "forever _": "zawsze _", + "frame": "", + "frames": "klatki", + "frequencies": "", + "frequency": "częstotliwość", + "front": "na wierzchu", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "duch", + "giant (8x)": "gigantyczne (8x)", + "glide _ secs to x: _ y: _": "leć przez _ s do x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "wróć o _ poziomów", + "go to _": "idź do _", + "go to _ layer": "idź do _", + "go to x: _ y: _": "idź do x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "większy", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "wysokość", + "hello": "witaj", + "help": "pomoc", + "help...": "pomoc...", + "hide": "ukryj", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "ukryj pierwotne", + "hide variable _": "ukryj zmienną _", + "high": "wysoka", + "hour": "godzina", + "http:// _": "", + "hue": "odcień", + "huge (4x)": "ogromne (4x)", + "i": "i", + "identical to": "identyczne z", + "if _ _": "jeżeli _ _", + "if _ _ else _": "jeżeli _ _ w przeciwnym razie _", + "if _ then _ else _": "jeżeli _ to _ w przeciwnym razie _", + "if on edge, bounce": "jeżeli na brzegu, odbij się", + "import a sound from your computer by dragging it into here": "Importuj dźwięk z komputera przeciągając tu", + "import without attempting to parse or format data": "Importuj dane niesformatowane", + "import...": "importuj...", + "in palette": "", + "including dependencies": "w tym zależności", + "index": "indeks", + "index of _ in _": "indeks _ w _", + "inherit _": "dziedzicz _", + "inherited": "odziedziczone", + "input list:": "parametr - lista:", + "input names:": "nazwy parametrów:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "wstaw _ na pozycji _ do _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "jest _ ?", + "is _ a _ ?": "jest _ typu _ ?", + "is _ empty?": "czy _ jest puste?", + "is _ identical to _ ?": "jest _ identyczne z _ ?", + "is _ on?": "_ włączone?", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "element _ z _", + "items": "pozycje", + "j": "j", + "join _": "połącz _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "zachowaj elementy _ od _", + "key": "", + "key _ pressed?": "klawisz _ naciśnięty?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Polski", + "language_translator": "Witek Kranas & deKrain & Andrzej Batorski", + "large": "wielki", + "last": "ostatni", + "last changed": "", + "last_changed": "2021-05-15", + "launch _ _": "zacznij _ _", + "left": "lewa krawędź", + "left arrow": "strzałka w lewo", + "length": "długość", + "length of _": "", + "length:": "długość:", + "let the World automatically adjust to browser resizing": "", + "letter": "litera", + "letter _ of _": "litera _ z _", + "light (70)": "jasny (70)", + "lightness": "", + "line": "linia", + "lines": "linie", + "list": "lista", + "list _": "lista _", + "list view...": "widok listy...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "zapis wektorowy", + "login": "", + "loop": "", + "low": "niska", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "buduj nowy blok...", + "make a category...": "", + "make a copy and pick it up": "wykonaj i weź kopię", + "make a morph": "", + "make temporary and hide in the sprite corral": "zrób tymczasowy i ukryj ikonę", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "mapuj _ na _", + "map _ to _ _": "", + "max": "max", + "maximum": "", + "medium (50)": "średni (50)", + "menus": "", + "message": "wiadomość", + "microphone _": "mikrofon _", + "middle": "", + "minimum": "", + "minute": "minuta", + "mirror video": "wideo lustrzane", + "missing / unspecified extension": "", + "monstrous (10x)": "monstrualne (10x)", + "month": "miesiąc", + "mosaic": "mozaika", + "motion": "ruch", + "mouse down?": "przycisk myszy naciśnięty?", + "mouse position": "", + "mouse x": "x myszy", + "mouse y": "y myszy", + "mouse-departed": "opuszczony przez kursor myszy", + "mouse-entered": "najechany przez kursor myszy", + "mouse-pointer": "wskaźnik myszy", + "move": "porusz", + "move _ steps": "przesuń o _ kroków", + "move all inside...": "", + "move...": "", + "my": "moje", + "my _": "ja _", + "my anchor": "moja kotwica", + "my dangling?": "ja wiszący?", + "my draggable?": "ja przeciągalny?", + "my name": "moja nazwa", + "my parent": "mój rodzic", + "my rotation style": "mój typ obrotu", + "my rotation x": "mój obrót x", + "my rotation y": "mój obrót y", + "my temporary?": "ja tymczasowy?", + "myself": "ja", + "n": "n", + "name": "nazwa", + "neg": "", + "negative": "negatyw", + "neighbors": "sąsiedzi", + "neighbors ≠": "", + "new costume _ width _ height _": "nowy kostium _ szerokość _ wysokość _", + "new line": "nowa linia", + "new sound _ rate _ Hz": "nowy dźwięk _ próbkowanie _ Hz", + "new...": "nowy...", + "next": "", + "next costume": "następny kostium", + "none": "nic", + "normal": "normalny", + "normal (1x)": "normalne (1x)", + "normalScreen": "", + "normalStage": "", + "not": "nie", + "not _": "nie _", + "note": "nuta", + "nothing": "", + "now connected.": "", + "number": "liczba", + "number of channels": "liczba kanałów", + "numbers from _ to _": "liczby od _ do _", + "o": "o", + "object _": "obiekt _", + "octagon": "", + "only duplicate this block": "powiel tylko ten blok", + "only face left/right": "tylko lewo/prawo", + "only grab this block": "chwyć tylko ten blok", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "otwórz w nowym oknie dialogowym", + "open shared project from cloud...": "", + "options...": "", + "or": "lub", + "or before": "", + "other clones": "inne klony", + "other scripts in sprite": "inne skrypty tego duszka", + "other sprites": "inne duszki", + "p": "p", + "paint a new sprite": "namaluj nowego duszka", + "paintbucket": "", + "parameters": "", + "parent": "rodzic", + "parent...": "pierwowzór...", + "parts": "części", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "wklej na _", + "pause": "", + "pause all _": "pauzuj wszystko _", + "pen": "", + "pen _": "pisak _", + "pen down": "przyłóż pisak", + "pen down?": "pisak przyłożony?", + "pen trails": "ślady pisaka", + "pen up": "podnieś pisak", + "pen vectors": "wektory pisaka", + "pic...": "obrazek...", + "pick random _ to _": "losuj od _ do _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "oś", + "pixel": "", + "pixelate": "pikselizacja", + "pixels": "piksele", + "play _ Hz for _ secs": "zagraj _ Hz przez _ s.", + "play frequency _ Hz": "zagraj częstotliwość _ Hz", + "play note _ for _ beats": "zagraj nutę _ przez _ taktów", + "play sound _": "zagraj dźwięk _", + "play sound _ at _ Hz": "zagraj dźwięk _ z _ Hz", + "play sound _ until done": "zagraj dźwięk _ i czekaj", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "ustaw kierunek na _", + "point towards _": "ustaw w stronę _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predykat", + "presentation (1.4x)": "prezentacja (1.4x)", + "pressed": "naciśnięty", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "R-G-B-A", + "random": "losowo", + "random position": "losowa pozycja", + "rank": "ranga", + "raw data...": "surowe dane...", + "ray length": "długość promienia", + "read-only": "", + "receivers...": "odbiorcy...", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "ponownie upuść", + "relabel...": "przemianuj...", + "release": "wydanie", + "remove block variables...": "", + "rename": "zmień nazwę", + "rename all blocks that access this variable": "zmień nazwy wszystkich bloków,z nazwą tej zmiennej", + "rename all...": "zmień nazwy wszystkich...", + "rename background": "zmień nazwę tła", + "rename costume": "zmień nazwę kostiumu", + "rename only this reporter": "zmień nazwę tylko tej zmiennej", + "rename sound": "zmień nazwę dżwięku", + "rename...": "przemianuj...", + "repeat _ _": "powtórz _ razy _", + "repeat until _ _": "powtarzaj aż _ _", + "replace item _ of _ with _": "zamień element _ z _ na _", + "report _": "wynik _", + "reporter": "funkcja", + "reporter didn't report": "", + "reset columns": "zresetuj szerokość kolumn", + "reset timer": "kasuj zegar", + "reshape _ to _": "przebuduj _ do _", + "resize...": "", + "resolution": "rozdzielczość", + "rest for _ beats": "pauzuj przez _ taktów", + "restore display": "", + "result pic...": "obrazek wyniku...", + "reverse": "odwrócenie", + "right": "prawa krawędź", + "right arrow": "strzałka w prawo", + "ring": "", + "ringify": "obwiednia", + "robot": "", + "rotate": "obróć", + "rotation style": "typ obrotu", + "rotation x": "obrót x", + "rotation y": "obrót y", + "round _": "zaokrąglij _", + "run _ _": "uruchom _ z _", + "run _ w/continuation": "uruchom _ z kontynuacją", + "s": "s", + "sample morphs": "", + "sample rate": "częstotliwość próbkowania", + "samples": "próbki", + "saturation": "nasycenie", + "save _ as costume named _": "", + "save a picture of all scripts": "zapisz obrazek wszystkich skryptów", + "save a picture of both this script and its result": "zapisz obrazek zarówno tego skryptu, jak i jego wyniku", + "save a picture of the stage": "zapisz obrazek sceny", + "save a picture of this comment": "zapisz obrazek tego komentarza", + "save a picture of this script": "zapisz obrazek tego skryptu", + "save a summary of this project": "zapisz podsumowanie tego projektu", + "save global custom block definitions as XML": "zapisz definicje bloków jako XML", + "save project data as XML to your downloads folder": "zapisz dane projektu jako XML w folderze ładowania", + "saved.": "", + "say _": "powiedz _", + "say _ for _ secs": "powiedz _ przez _ s", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "obrazek skryptu...", + "script variables _": "zmienne skryptu _", + "scripts": "skrypty", + "scripts pic...": "obrazek skryptu...", + "scroll frame": "", + "scrolled-down": "przewijany w dół", + "scrolled-up": "przewijany w górę", + "second": "sekunda", + "select": "wybierz", + "selection": "", + "self": "sam", + "send _ to _": "nadaj _ do _", + "senders...": "nadawcy...", + "sensor demo": "", + "set _ effect to _": "ustaw efekt _ na _", + "set _ of block _ to _": "", + "set _ to _": "ustaw _ na _", + "set background _ to _": "ustaw tło _ na _", + "set background color to _": "ustaw kolor tła _", + "set balance to _": "ustaw balans na _", + "set instrument to _": "ustaw instrument (falę) na _", + "set pen _ to _": "ustaw pisak _ na _", + "set pen color to _": "ustaw kolor pisaka _", + "set pen shade to _": "", + "set pen size to _": "ustaw rozmiar pisaka na _", + "set size to _ %": "ustaw rozmiar na _ %", + "set tempo to _ bpm": "ustaw tempo na _ taktów na min.", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "ustaw przezroczystość wideo na _", + "set volume to _ %": "ustaw głośność na _ %", + "set x to _": "ustaw x na _", + "set y to _": "ustaw y na _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "włącz, aby preferować puste gniazda podczas upuszczaniabloków", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "lśniący (80)", + "show": "pokaż", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "pokaż wszystko", + "show all...": "", + "show primitives": "pokaż pierwotne", + "show project data as XML in a new browser window": "pokaż projekt jako XML w nowej karcie", + "show table _": "", + "show the World's menu": "", + "show variable _": "pokaż zmienną _", + "shown?": "pokazany?", + "shrink": "mniejszy", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "rozmiar", + "slider": "suwak", + "slider max...": "maksimum suwaka...", + "slider min...": "minimum suwaka...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "fotka", + "sorted": "", + "sound": "dźwięk", + "sounds": "dźwięki", + "space": "spacja", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "widmo", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "podziel _ na _", + "sprite": "duszek", + "sprites": "duszki", + "sqrt": "pierwiastek kwadratowy", + "square": "", + "stack size": "rozmiar stosu", + "stage": "scena", + "stage image": "", + "stamp": "stempluj", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "przyczep do", + "stop _": "zatrzymaj _", + "stop all sounds": "zatrzymaj wszystkie dźwięki", + "stop frequency": "zatrzymaj częstotliwość", + "stopped": "zatrzymany", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "pobierz ten projekt i zapisz go lokalnie (nieobsługiwane przez wszystkie przeglądarki)", + "stretch _ x: _ y: _ %": "zmień rozmiar _ x: _ y: _ %", + "string": "", + "subtle (95)": "subtelny (95)", + "sum": "", + "svg...": "eksportuj SVG...", + "switch to costume _": "zmień kostium na _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulator", + "table view...": "widok tabeli...", + "take a camera snapshot and import it as a new sprite": "nowy duszek z kamery", + "tan": "tg", + "tell _ to _ _": "powiedz _ do _ _", + "tempo": "", + "temporary?": "tymczasowy?", + "text": "tekst", + "text-only (100)": "tylko tekst (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "obecnie nie ma niewykorzystanych bloków w tym projekcie", + "there are currently no vectorizable pen trail segments": "obecnie nie ma odcinków śladu pisaków, które można wektoryzować", + "thing": "coś", + "think _": "pomyśl _", + "think _ for _ secs": "pomyśl _ przez _ s", + "this _": "", + "this block": "ten blok", + "this project doesn't have any custom global blocks yet": "ten projekt nie ma jeszcze własnych globalnych bloków", + "this script": "ten skrypt", + "time in milliseconds": "czas w milisekundach", + "timer": "czasomierz", + "tip": "", + "to": "do", + "top": "górna krawędź", + "touch screen settings": "", + "touching _ ?": "dotyka koloru _ ?", + "transient": "chwilowo", + "translations": "", + "translations...": "", + "translator_e-mail": "witek@oeiizk.waw.pl", + "transparency": "przezroczystość", + "transparency...": "", + "trash is empty": "kosz jest pusty", + "true": "prawda", + "turbo mode": "tryb turbo", + "turbo mode?": "", + "turn _ _ degrees": "obróć _ o _ stopni", + "turn all pen trails and stamps into a new background for the stage": "zamień wszystkie ślady pisaka i stemple w nowe tło dla sceny", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "zamień wszystkie ślady pisaka i stemple w nowy kostium dla aktualnie wybranego duszka", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "typ _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "odznacz, aby przywrócić normalny wygląd GUI", + "uncheck for greater speed at variable frame rates": "odznacz, aby pozwolićna większ prędkość ramek animacji", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "odznacz, aby uzyskać niższą rozdzielczość (mniejsza moc obliczeniowa)", + "uncheck for round ends of lines": "odznacz, aby końce linii były zaokrąglone", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "odznacz, aby umożliwić blokom zastępowanie innych po zwolnieniu", + "uncheck to allow script reentrance": "odznacz, aby pozwolić na restartowanie skryptu", + "uncheck to always show (+) symbols in block prototype labels": "odznacz, aby pokazywać symbol (+) na etykietach prototypowych bloków", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "odznacz, aby nie pozwolić na animacje IDE", + "uncheck to disable alternating colors for nested block": "odznacz, aby nie pozowlić na zmianę barw zagnieżdżonych bloków", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "odznacz, aby wyłączyć dynamiczne opisy dla wejść variadic", + "uncheck to disable input sliders for entry fields": "odznacz, aby nie pozwolić na suwaki w polach wejściowych", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "odznacz, aby wyłączyć używanie wyrażeń na listach i tabelach", + "uncheck to disable virtual keyboard support for mobile devices": "odznacz, aby nie używać klawiatury wirtualnej dla urzdzeń mobilnych", + "uncheck to disinherit": "odznacz, żeby nie dziedziczyć", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "odznacz, aby wykonać skrypt z normalną szybkością", + "uncheck to save contents in the project": "odznacz, aby zapisać zawartość w projekcie", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "odznacz, aby wyłączyć dźwięk klikniźcia", + "uncheck to turn off logging pen vectors": "odznacz, aby wyłączyć zapis wektorowy pisaka", + "uncheck to turn off visible stepping": "odznacz, aby wyłączyć widoczne kroki", + "uncheck to use solid drop shadows and highlights": "odznacz, aby uzyskać mocne cienie i granice", + "uncheck to use the input dialog in short form": "odznacz, aby używać dialogu wejścia w krótkiej formie", + "uncompile": "odkompiluj", + "undo": "cofnij", + "undo the last block drop in this pane": "cofnij ostatnie upuszczenie bloku na tej planszy", + "undrop": "odklej", + "unicode _ as letter": "Unicode _ jako litera", + "unicode of _": "Unicode z _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "bez obwiedni", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "bez nazwy", + "unused": "", + "unused block(s) removed": "usunięto niewykorzystane bloki", + "up arrow": "strzałka w górę", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "użyj klawiatury, aby wprowadzić bloki", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "wartość", + "variable": "", + "variables": "", + "video _ on _": "wideo _ na _", + "video capture": "nagranie wideo", + "volume": "głośność", + "w": "w", + "wait _ secs": "czekaj _ s", + "wait until _": "czekaj aż _", + "wardrobe": "", + "warp _": "wykonaj błyskawicznie _", + "what's your name?": "Jak masz na imię?", + "when I am _": "kiedy zostanę _", + "when I receive _ _": "kiedy otrzymam _ _", + "when I start as a clone": "kiedy zaczynam jako klon", + "when _": "kiedy _", + "when _ clicked": "kiedy kliknięto _", + "when _ is edited _": "", + "when _ key pressed _": "kiedy klawisz _ naciśnięty _", + "whirl": "wir", + "whitespace": "spacja", + "width": "szerokość", + "with data": "", + "with inputs": "z parametrami", + "word": "słowo", + "world": "świecie", + "write _ size _": "pisz _ rozmiar _", + "x": "x", + "x position": "pozycja X", + "y": "y", + "y position": "pozycja Y", + "year": "rok", + "year:": "", + "your own": "swoje", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-pt.js b/elements/pl-snap/Snap/locale/lang-pt.js new file mode 100644 index 00000000..e9533429 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-pt.js @@ -0,0 +1,1478 @@ +SnapTranslator.dict.pt = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "\"Bigger\" Data": "Dados «maiores»", + "' does not exist in this context": "» neste contexto", + "(-90) left": "-90° (esquerda)", + "(0) up": "0° (cima)", + "(1) sine": "(1) sinusoisal", + "(180) down": "180° (baixo)", + "(2) square": "(2) quadrada", + "(3) sawtooth": "(3) dente de serra", + "(4) triangle": "(4) triangular", + "(90) right": "90° (direita)", + "(empty)": "(nada)", + "(in a new window)": "(numa nova janela)", + "(no matches)": "", + "(none)": "(nenhum)", + "(temporary)": "(temporária)", + "360° dial": "um mostrador de 360°", + "A variation on the list data type in which each list item aren't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.)": "Uma variação do tipo de dados lista para o qual cada item da lista não é calculado senão quando é necessário, pelo que pode criar listas com milhões de itens sem que isso demore demasiado tempo ou ocupe demasiada memória, ou mesmo listas de comprimento infinito. (É incluído como exemplo um bloco que reporta todos os números primos.)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Sobre o Snap!", + "About...": "Acerca do Snap!…", + "Account created.": "Conta criada.", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Permitir texto com múltiplas linhas como entrada", + "An e-mail with your password has been sent to the address provided": "Foi enviada uma mensagem para o endereço disponibilizado contendo a sua palavra-passe.", + "An extended version of the HTTP:// block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc.": "Uma versão estendida do bloco HTTP:// que permite realizar pedidos POST, PUT e DELETE, bem como GET, permite utilizar o protocolo seguro HTTPS e dá controlo sobre os cabeçalhos, etc.", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animações", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Repórter (forma especial)", + "Any type": "Qualquer tipo", + "Apply": "Aplicar", + "April": "Abril", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Quer mesmo remover", + "Are you sure you want to publish": "Quer mesmo publicar", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "Quer mesmo deixar de publicar", + "Are you sure you want to unshare": "", + "Audio Comp": "Computação áudio", + "August": "Agosto", + "Back...": "Para trás…", + "Backgrounds": "Cenários", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Data de nascimento:", + "Bitmap": "", + "Block Editor": "Editor de Blocos", + "Blocks": "Blocos", + "Blocks category name:": "", + "Blurred shadows": "Sombras desfocadas", + "Boolean": "booleano", + "Boolean (T/F)": "Booleano (V/F)", + "Boolean (unevaluated)": "Predicado (forma especial)", + "Bottom": "Base", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Espessura do pincel", + "Cache Inputs": "Memorizar entradas", + "Camera": "Câmara", + "Camera not supported": "", + "Camera support": "Suporte para câmara", + "Cancel": "Cancelar", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Capturar erros num guião", + "Category color": "", + "Change Password": "Alterar palavra-passe", + "Change Password...": "Alterar palavra-passe…", + "Change block": "Alterar tipo de bloco", + "Clear backup": "", + "Clicking sound": "Som de cliques", + "Closed brush (free draw)": "Pincel fechado (desenho livre)", + "Cloud": "Nuvem", + "Code mapping": "Mapeamento para código", + "Codification support": "Suportar produção de código", + "Colors and Crayons": "", + "Command": "Comando", + "Command (C-shape)": "Comando (em forquilha)", + "Command (inline)": "Comando (em linha)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Preservar proporções das formas? (também pode pressionar shift)", + "Contents": "Índice", + "Contributors": "Contribuidores", + "Control": "Controlo", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Editor de Trajes", + "Costumes": "Trajes", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "Criar e gerir variáveis globais, de objecto e de guião a partir de um guião.", + "Create input name": "Criar parâmetro", + "Create variables": "", + "Create variables in program": "Criar variáveis não locais (globais ou de objecto) num guião", + "Credits...": "Créditos…", + "Custom Block Translations": "Traduções do Bloco Personalizado", + "Database": "", + "Deal with JSON data": "Lidar com dados JSON", + "December": "Dezembro", + "Default": "", + "Default Value:": "Valor em caso de omissão do argumento:", + "Delete": "Remover", + "Delete Custom Block": "Remover Bloco Personalizado", + "Delete Project": "Remover Projecto", + "Delete a variable": "Remover uma variável", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "Baixo", + "Download source": "Descarregar o código fonte", + "Dragging threshold...": "Limiar de arrastamento…", + "Dynamic input labels": "Etiquetas de entrada dinâmicas", + "E-mail address of parent or guardian:": "Endereço de encarregado de educação:", + "E-mail address:": "Endereço de correio electrónico:", + "ERROR: INVALID PASSWORD": "ERRO: PALAVRA-PASSE INVÁLIDA", + "EXPERIMENTAL! check to enable live custom control structures": "EXPERIMENTAL! Assinalar para activar estruturas de controlo personalizadas ao vivo.", + "EXPERIMENTAL! check to enable support for compiling": "EXPERIMENTAL! Assinalar para activar o suporte da compilação dinâmica.", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "EXPERIMENTAL! Desassinalar para desactivar estruturas de controlo personalizadas ao vivo.", + "EXPERIMENTAL! uncheck to disable live support for compiling": "EXPERIMENTAL! Desassinalar para desactivar o suporte da compilação dinâmica.", + "Edge color (left click)": "Cor de aresta (clique esquerdo)", + "Edit input name": "Editar parâmetro", + "Edit label fragment": "Editar etiqueta", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "Lei de Eisenberg: O quer que se possa fazer através da interface com o utilizador deve ser possível de fazer a partir da linguagem de programação e vice-versa.", + "Ellipse (shift: circle)": "Elipse (shift: círculo)", + "Empty": "Vazio", + "Enable command drops in all rings": "Activar encaixe de comandos em todos os anéis", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Introduza o código correspondente à definição do bloco. Escolha os seus próprios nomes para os parâmetros (ignorando os nomes mostrados).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Introduza o código correspondente à definição do bloco. Use os nomes dos parâmetros tal como mostrados e use para referenciar o código gerado da definição do corpo", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Introduza o código que corresponda à operação do bloco (normalmente uma simples invocação de rotina). Use <#n> para referenciar os argumentos tal como mostrado", + "Enter one option per line. Optionally use \"=\" as key/value delimiter and {} for submenus. e.g. the answer=42": "Introduza uma opção por linha. Opcionalmente, use \"=\" como separador entre chave e valor e {} para submenus. E.g. a resposta=42", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "Introduza uma tradução por linha. Utilize (:) para separar a língua da especificação traduzida do bloco e sublinhado (_) nos locais dos parâmetros, por exemplo: pt:diz _ durante _ s", + "Eraser tool": "Borracha", + "Error": "", + "Examples": "Exemplos", + "Execute on slider change": "Executar quando o potenciometro varia", + "Export Project As...": "Exportar Projecto Como…", + "Export all scripts as pic...": "Exportar todos os guiões como fotografia…", + "Export blocks": "Exportar blocos", + "Export blocks...": "Exportar blocos deste projecto…", + "Export project as plain text...": "Exportar este projecto como texto simples…", + "Export project...": "Exportar este projecto…", + "Export summary with drop-shadows...": "Exportar resumo com sombreamento…", + "Export summary...": "Exportar resumo…", + "Extension blocks": "", + "Extract substrings of a string in various ways": "Extrair partes de cadeias de caracteres de formas variadas", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Desvanecimento de blocos", + "Fade blocks...": "Desvanecimento de blocos…", + "February": "Fevereiro", + "Fetching project from the cloud...": "Obtendo o projecto da nuvem…", + "Fill a region": "Balde de tinta", + "Fill color (right click)": "Cor de preenchimento (clique direito)", + "Filled Ellipse (shift: circle)": "Elipse preenchida (shift: círculo)", + "Filled Rectangle (shift: square)": "Rectângulo preenchido (shift: quadrado)", + "First-Class Sprites": "Actores de primeira classe", + "Flat design": "Design plano", + "Flat line ends": "Extremos das linhas planos", + "For all Sprites": "Para todos os Actores", + "Frequency Distribution Analysis": "Análise da distribuição de frequências", + "Generate costumes from letters or words of text.": "Gerar trajes a partir de letras ou palavras de texto.", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "Mapeamento para cabeçalho", + "Hello!": "Olá!", + "Hello, World!": "", + "Help": "", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Hmm…", + "Hummingbird robotics": "", + "Hyper blocks support": "Suporte para hiperblocos", + "I have read and agree to the Terms of Service": "Li e declaro concordar com os Termos do Serviço", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "Importar", + "Import a new costume from your webcam": "Importar um novo traje da sua câmara.", + "Import blocks": "Importar blocos", + "Import library": "Importar biblioteca", + "Import sound": "Importar som", + "Import...": "Importar…", + "Imported": "Importada", + "In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "Em geral as entradas de texto permitem apenas uma única linha. O bloco MULTILINHA aceita texto multilinha na sua entrada e pode ser usado em ranhuras de entradas de texto de outros blocos.", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Inteiros com precisão infinita, racionais exactos e números complexos", + "Inheritance support": "Suporte para herança", + "Input Names:": "Parâmetros:", + "Input Slot Options": "Opções de Ranhura de Entrada", + "Input name": "Parâmetro", + "Input sliders": "Deslizadores nas ranhuras", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iteração e composição", + "JIT compiler support": "Suportar compilação JIT", + "January": "Janeiro", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "a função JavaScript ( _ ) { _ }", + "July": "Julho", + "June": "Junho", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Edição usando o teclado", + "Keyboard edition": "Edição com o teclado", + "Kind of": "Do tipo de", + "LEAP Motion controller": "Controlador LEAP Motion", + "Language": "Língua", + "Language...": "Língua…", + "Libraries...": "Bibliotecas…", + "License": "Licença", + "License...": "Licença…", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "Tal como o «switch» em linguagens como o C ou o «cond» no Lisp. Obrigado ao Nathan Dinsmore por inventar a ideia de ter um bloco separado para cada ramo!", + "Line tool (shift: constrain to 45º)": "Linha (shift: restringe a 45°)", + "Line tool (shift: vertical/horizontal)": "Segmento de recta (shift: vertical/horizontal)", + "List": "Lista", + "List utilities": "Utilitários para listas", + "Lists": "Listas", + "Live coding support": "Suporte de programação ao vivo", + "Loading": "Carregando", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Registar vectores da caneta", + "Login...": "Entrar na sua conta…", + "Logout": "Sair", + "Long form input dialog": "Forma longa da caixa de diálogo dos parâmetros", + "Looks": "Aparência", + "Make a block": "Criar um bloco", + "Make a variable": "Criar uma variável", + "Manipulate costumes pixel-wise.": "", + "March": "Março", + "May": "Maio", + "Message name": "Qual o nome da mensagem?", + "Method Editor": "Editor de Métodos", + "Microphone": "Microfone", + "Microphone resolution...": "Resolução do microfone...", + "Modules...": "Módulos…", + "Motion": "Movimento", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Comandos de selecção com múltiplos ramos", + "Multiple inputs (value is list of inputs)": "Múltiplos argumentos (o valor do parâmetro é a lista dos argumentos).", + "Nested auto-wrapping": "Quebras de linha aninhadas", + "New": "Criar novo", + "New Category": "", + "New Project": "Novo Projecto", + "New category...": "", + "New password:": "Nova palavra-passe:", + "New scene": "", + "No": "Não", + "November": "Novembro", + "Number": "Número", + "OK": "", + "Object": "Objecto", + "October": "Outubro", + "Ok": "", + "Old password:": "Palavra-passe actual:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "Um das grandes ideias do Logo que ficou de fora no Scratch é pensar no texto como estruturado em palavras e frases, em vez de só como uma cadeia de caracteres. Esta biblioteca reintroduz esta ideia.", + "Open": "Abrir", + "Open Project": "Abrir Projecto", + "Open in Community Site": "Abrir na Comunidade Snap!", + "Open...": "Abrir…", + "Opening project...": "Abrindo o projecto…", + "Operators": "Operadores", + "Other": "Outros", + "Output text using speech synthesis.": "", + "Paint Editor": "Editor de Pintura", + "Paint a new costume": "Pintar um novo traje.", + "Paint a shape (shift: edge color)": "Pintar uma forma (shift: cor de aresta)", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Pincel (desenho livre)", + "Parallelization": "Paralelização", + "Part of": "Uma parte de", + "Parts": "Partes", + "Password:": "Palavra-passe:", + "Pen": "Caneta", + "Persist linked sublist IDs": "Persistir ID de sublistas ligadas", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipeta (recolher uma cor em qualquer lado)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Pipeta (recolher uma cor de qualquer lado shift: cor de preenchimento)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "Píxeis", + "Plain prototype labels": "Texto dos protótipos simples", + "Play": "Tocar", + "Play sound": "Tocar som.", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Por favor assegure-se de que o seu navegador está actualizado e de que a sua câmara está correctamente configurada. Alguns navegadores também exigem que aceda ao Snap! através de HTTPS para usar a câmara. Por favor substitua a parte \"http://\" do endereço no seu navegador por \"https:// e tente de novo.\"", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "Polígono", + "Predicate": "Predicado", + "Prefer empty slot drops": "Preferir largadas em ranhuras vazias", + "Prefer smooth animations": "Preferir animações suaves", + "Presentation mode": "Modo de apresentação", + "Privacy...": "Privacidade…", + "Project Notes": "Notas do Projecto", + "Project URLs": "URL de projecto", + "Project name": "Nome do projecto", + "Project notes": "Notas do projecto", + "Project notes...": "Notas deste projecto…", + "Provide 100 selected colors": "Trabalhar com 100 cores pré-seleccionadas", + "Provide getters and setters for all GUI-controlled global settings": "Repórteres para obter e comandos para alterar todas as configurações globais", + "Publish": "Publicar", + "Publish Project": "", + "Rasterize SVGs": "Transformar SVG em mapas de bits", + "Record a new sound": "Gravar um novo som.", + "Recover": "Recuperar", + "Rectangle (shift: square)": "Rectângulo (shift: quadrado)", + "Reference manual": "Ler o Manual de referência", + "Remove a category...": "", + "Remove unused blocks": "Remover blocos não usados", + "Repeat Password:": "", + "Repeat new password:": "Repita a nova palavra-passe:", + "Replace Project": "", + "Replace the current project with a new one?": "Substituir este projecto por um novo projecto?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Reportar posições das mãos dadas pelo controlador LEAP Motion (leapmotion.com).", + "Reporter": "Repórter", + "Request blocked": "", + "Resend Verification Email...": "Reenviar Mensagem de Verificação…", + "Resend verification email": "", + "Reset Password...": "Recuperar palavra-passe…", + "Reset password": "Recuperar palavra-passe", + "Restore unsaved project": "", + "Retina display support": "Suporte para o ecrã retina", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Execute um guião; se ocorrer um erro, em vez de parar o guião com um halo vermelho, execute outro guião para lidar com o erro. Inclui também um bloco que causa um erro com uma mensagem dada como entrada. Inclui ainda um bloco para criar uma variável de guião inicializando-a imediatamente.", + "Run several scripts in parallel and wait until all are done.": "Executar vários guiões em paralelo e esperar que todos eles terminem.", + "SVG costumes are not yet fully supported in every browser": "trajes SVG ainda não são totalmente suportados em todos os navegadores", + "Same Named Blocks": "", + "Satellite": "Satélite", + "Save": "Guardar", + "Save As...": "Guardar como…", + "Save Project": "Guardar Projecto", + "Save Project As...": "Guardar Projecto Como…", + "Save to disk": "Guardar no disco", + "Saved!": "Guardado!", + "Saving project to the cloud...": "Guardando o projecto na nuvem…", + "Scenes...": "", + "Script variable name": "Qual o nome da variável de guião?", + "Scripts": "Guiões", + "Select a costume from the media library": "Seleccionar um traje da biblioteca de média.", + "Select a sound from the media library": "Seleccionar um som da biblioteca de média.", + "Select categories of additional blocks to add to this project.": "Seleccionar categorias de blocos adicionais a acrescentar a este projecto.", + "Selection tool": "Selecção", + "Sensing": "Sensores", + "September": "Setembro", + "Serial Ports": "", + "Service:": "Serviço:", + "Set RGB or HSV pen color": "Alterar ou obter corer RGB e HVS da caneta", + "Set or report pen color as RGB (red, green, blue) or HSV (hue, saturation, value).": "Alterar ou reportar a cor da caneta nos formatos RGB (vermelho/«red», verde/«green», azul/«blue») ou HSV (matiz/«hue«, saturação/«saturation», brilho/«value»).", + "Set the rotation center": "Estabelecer centro de rotação", + "Shading": "Sombreamento", + "Share": "Partilhar", + "Share Project": "Partilhar Projecto", + "Show buttons": "", + "Show categories": "", + "Sign in": "Entrar", + "Sign up": "Registar nova conta", + "Signada (Network remote control)": "", + "Signup": "Registo de nova conta", + "Signup...": "Registar uma nova conta…", + "Single input.": "Parâmetro único.", + "Single palette": "", + "Slider maximum value": "Valor máximo do potenciómetro", + "Slider minimum value": "Valor mínimo do potenciómetro", + "Snap! website": "Ir para o sítio Web do Snap!", + "Snap!Cloud": "Snap!Nuvem", + "Some standard functions on lists (append, reverse, etc.)": "Algumas funções padrão sobre listas (acrescentar, inverter, etc.)", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Som", + "Sound Recorder": "", + "Sounds": "", + "Sprite": "o actor", + "Sprite Nesting": "Actores compostos", + "Stage": "o palco", + "Stage height": "Altura do palco", + "Stage scale": "Escala do palco", + "Stage selected: no motion primitives": "Palco seleccionado: sem primitivas de movimento", + "Stage size": "Tamanho do palco", + "Stage size...": "Tamanho do palco…", + "Stage width": "Largura do palco", + "Stop": "Parar", + "Stop sound": "Parar som.", + "Streams (lazy lists)": "Canais (listas preguiçosas)", + "Streets": "Estradas", + "String": "texto", + "String processing": "Processamento de cadeias de caracteres", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Elipse (shift: circunferência)", + "Stroked Rectangle (shift: square)": "Rectângulo (shift: quadrado)", + "Switch back to user mode": "Regressar ao modo de utilizador", + "Switch to dev mode": "Passar ao modo de desenvolvimento", + "Switch to vector editor?": "", + "Table lines": "Tabelas com linhas", + "Table support": "Suporte de tabelas", + "Table view": "Vista de tabela", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Termos do Serviço…", + "Ternary Boolean slots": "Ranhuras booleanas ternárias", + "Terrain": "Terreno", + "Text": "Texto", + "Text Costumes": "Trajes de texto", + "Text to Speech": "", + "Text to speech": "Texto para fala", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "A torre numérica do Scheme completa. Usar «usa números grandes \" para activar.", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Guiões seguros face a threads", + "Title text": "Etiqueta", + "Today": "Hoje", + "Today,": "", + "Toner": "Tons", + "Top": "Topo", + "Topographic": "Topográfico", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Comandos tradicionais para ciclos (enquanto, até que, etc.), o «named let» do Lisp (uma generalização do ciclo PARA), iteração funcional (invocação repetida de uma função) e composição de funções.", + "Translations": "Traduções", + "Translators...": "Tradutores…", + "Turbo mode": "Modo turbo", + "Turn JSON strings into lists with the listify block, then retrieve data out of them by using the value at key block.": "Converter em listas texto com formato JSON usando o bloco «a lista em» e obter dados dessas listas usando o bloco «o valor com chave em».", + "Turtle": "Tartaruga", + "Undelete sprites...": "", + "Unpublish": "Deixar de Publicar", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Deixar de Partilhar", + "Unshare Project": "Deixar de Partilhar Projecto", + "Untitled": "Sem título", + "Unused blocks...": "Blocos não usados…", + "Unverified account:": "", + "Up": "Cima", + "Updating project list...": "Actualizando a lista de projectos…", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Tornar o parâmetro visível ao invocador.", + "Use CPU for graphics": "", + "User": "Utilizador", + "User name must be four characters or longer": "O nome de utilizador tem de ter pelo menos quatro caracteres.", + "User name:": "Nome de utilizador:", + "Variable name": "Qual o nome da variável?", + "Variables": "Variáveis", + "Variadic reporters": "repórteres variádicos", + "Vector": "", + "Vector Paint Editor": "Editor de Pintura Vectorial", + "Versions of +, x, AND, and OR that take more than two inputs.": "Versões de +, x, E, e OU que aceitam mais do que duas entradas.", + "Virtual keyboard": "Teclado virtual", + "Visible palette": "Palete visível", + "Visible stepping": "Traçado passo a passo visível", + "Watercolor": "Aguarela", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Acesso a serviços web (https)", + "Words, sentences": "Palavras e frases", + "World Map": "Mapa do mundo", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Sim", + "Yesterday": "Ontem", + "Yesterday,": "", + "You are not logged in": "Ainda não se autenticou", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Coloração em zebra", + "Zoom blocks": "Ampliação de blocos", + "Zoom blocks...": "Ampliação dos blocos…", + "[EXPERIMENTAL] add interactive maps to projects": "[EXPERIMENTAL] Adicionar mapas interactivos a projectos.", + "[EXPERIMENTAL] analyze data for frequency distribution": "[EXPERIMENTAL] Analisar dados para obter a sua distribuição de frequências.", + "[EXPERIMENTAL] crunch large lists very fast": "[EXPERIMENTAL] Processar listas grandes de forma muito rápida.", + "_ at _": "_ em _", + "_ combine _ using _": "_ a combinação dos itens de _ com _", + "_ contains _": "_ contém _", + "_ effect": "o efeito _", + "_ find first item _ in _": "_ o primeiro item tal que _ de _", + "_ in front of _": "a prefixação de _ a _", + "_ keep items _ from _": "_ os itens tais que _ de _", + "_ map _ over _": "_ a aplicação de _ aos itens de _", + "_ mod _": "o resto de _ a dividir por _", + "_ of _": "", + "_ of block _": "", + "_ of costume _": "_ do traje _", + "_ of sound _": "_ do som _", + "_ of text _": "", + "_ to _": "_ até _", + "__shout__go__": "bandeira verde clicada", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "um novo clone de _", + "a variable of name '": "não existe uma variável «", + "about morphic.js...": "", + "abs": "o valor absoluto", + "acos": "o arco-cosseno", + "add _ to _": "acrescenta _ a _", + "add a new Turtle sprite": "Adicionar um novo actor tartaruga.", + "add a new sprite": "adicionar um novo actor", + "add comment": "adicionar comentário", + "add comment here...": "colocar aqui um comentário…", + "agent": "", + "alert _": "mostra janela de alerta com _", + "all": "tudo", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "uma lista com os itens de _ menos o primeiro", + "all but this script": "todos os guiões de objecto excepto este", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "analyze, manipulate and generate sound samples.": "Analisar, manipular e gerar amostras de som.", + "anchor": "a âncora", + "and": "e", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "angle": "o argumento", + "animation demo": "", + "answer": "a resposta dada", + "any": "um item ao acaso", + "any key": "qualquer", + "any message": "qualquer mensagem", + "anything": "", + "append _": "a concatenação de _", + "arrange scripts vertically": "Organizar os guiões verticalmente.", + "arrowDown": "seta para baixo", + "arrowDownOutline": "contorno de seta para baixo", + "arrowLeft": "seta para a esquerda", + "arrowLeftOutline": "contorno de seta para a esquerda", + "arrowRight": "seta para a direita", + "arrowRightOutline": "contorno de seta para a direita", + "arrowUp": "seta para cima", + "arrowUpOutline": "contorno de seta para cima", + "asin": "o arco-seno", + "ask _ and wait": "pergunta _ e espera pela resposta", + "ask _ for _ _": "o resultado de _ invocar _ _", + "atan": "o arco-tangente", + "attach...": "", + "b": "b", + "back": "trás", + "balance": "o balanço", + "big (2x)": "grande (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Quer mesmo remover este bloco e todas as suas utilizações?", + "block variables": "com variáveis de bloco", + "block variables...": "adicionar variáveis de bloco…", + "block-solid (0)": "", + "blockify": "como bloco", + "blocks": "blocos", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "a coordenada y da base", + "box": "", + "brightness": "o brilho", + "brightness effect": "o efeito brilho", + "broadcast _ _": "difunde a mensagem _ _", + "broadcast _ _ and wait": "difunde a mensagem _ _ e espera", + "brush": "pincel", + "build": "cria", + "but getting a": "", + "c": "c", + "call _ _": "o resultado da invocação de _ _", + "call _ w/continuation": "o resultado da invocação de _ com continuação", + "caller": "", + "camera": "câmara", + "can only write text or numbers, not a": "", + "can rotate": "roda", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "o arredondamento para cima", + "center": "o centro", + "center x": "a coordenada x do centro", + "center y": "a coordenada y do centro", + "change _ by _": "adiciona a _ o valor _", + "change _ effect by _": "adiciona ao efeito _ o valor _", + "change background _ by _": "adiciona a _ do fundo o valor _", + "change balance by _": "adiciona _ ao balanço", + "change pen _ by _": "adiciona a _ da tua caneta o valor _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "adiciona _ à espessura da tua caneta", + "change size by _": "adiciona _ % ao teu tamanho", + "change tempo by _": "adiciona _ bpm ao teu andamento", + "change volume by _": "adiciona _ % ao volume", + "change x by _": "adiciona _ à tua coordenada x", + "change y by _": "adiciona _ à tua coordenada y", + "check for alternative GUI design": "Assinalar para um design alternativo da interface gráfica com o utilizador.", + "check for block to text mapping features": "Assinalar para funcionalidades de mapeamento entre blocos e texto.", + "check for flat ends of lines": "Assinalar para que os extremos das linhas desenhadas pela caneta sejam planos.", + "check for higher contrast table views": "Assinalar para vistas de tabela com maior contraste.", + "check for higher resolution, uses more computing resources": "Assinalar para maior resolução; gasta mais recursos computacionais.", + "check for multi-column list view support": "Assinalar para suporte de vistas multicoluna de listas.", + "check for smooth, predictable animations across computers": "Assinalar para obter animações mais suaves e previsíveis de computador para computador.", + "check for sprite inheritance features": "Assinalar para activar funcionalidades de herança de actores.", + "check to allow empty Boolean slots": "assinalar para permitir ranhuras booleanas vazias", + "check to always show slot types in the input dialog": "Assinalar para mostrar sempre o tipo das ranhuras na caixa de diálogo dos parâmetros.", + "check to cache inputs boosts recursion": "Assinalar para memorizar as entradas (acelera recursividade).", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "Assinar para não permitir reentrância nos guiões.", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "Assinalar para activar as animações do AID", + "check to enable alternating colors for nested blocks": "Assinalar para alternar as cores de blocos aninhados.", + "check to enable auto-wrapping inside nested block stacks": "assinalar para activar as quebras de linha em pilhas de blocos aninhadas", + "check to enable camera support": "assinalar para activar o suporte para a câmara", + "check to enable dropping commands in all rings": "Assinalar para activar o encaixe de comandos em anéis de reporter", + "check to enable dynamic labels for variadic inputs": "Assinalar para activar etiquetas dinâmicas nas entradas variádicas.", + "check to enable input sliders for entry fields": "Assinalar para activar deslizadores nas ranhuras dos blocos.", + "check to enable keyboard editing support": "Assinalar para activar a edição usando o teclado.", + "check to enable project data in URLs": "Assinalar para activar dados do projecto nos URL.", + "check to enable saving linked sublist identities": "Assinalar para activar o armazenamento das identidades de sublistas ligadas.", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "Assinalar para activar o suporte de actores de primeira classe.", + "check to enable using operators on lists and tables": "Assinalar para activar a utilização de operadores em listas e tabelas.", + "check to enable virtual keyboard support for mobile devices": "Assinalar para activar o suporte do teclado virtual para dispositivos móveis.", + "check to hide (+) symbols in block prototype labels": "Assinalar para esconder os símbolos (+) no texto dos protótipos dos blocos", + "check to inherit from": "assinalar para herdar de", + "check to prevent contents from being saved": "Assinalar para não guardar o conteúdo no projecto", + "check to prioritize script execution": "Assinalar para dar prioridade à execução de guiões.", + "check to rasterize SVGs on import": "Assinalar para transformar os arquivos SVG em mapas de bits durante a importação.", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "Assinalar para activar o som produzido ao clicar nos blocos.", + "check to turn on logging pen vectors": "Assinalar para activar o registo de vectores da caneta", + "check to turn on visible stepping (slow)": "Assinalar para activar execução passo a passo visível (lento).", + "check to use blurred drop shadows and highlights": "Assinalar para usar sombras e realces desfocados.", + "children": "os descendentes", + "choose another color for this morph": "", + "choose the World's background color": "", + "cintilante (80)": "schimmernd (80)", + "circle": "circunferência", + "circle box": "", + "circleSolid": "círculo", + "clean up": "arrumar", + "clear": "apaga tudo do palco", + "clear graphic effects": "limpa os efeitos gráficos", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Clique ou arraste a mira para alterar o centro de rotação.", + "clicked": "clicar em ti", + "clone": "clonar", + "clones": "os clones", + "closedBrush": "pincelada fechada", + "cloud": "nuvem", + "cloud unavailable without a web server.": "Nuvem indisponível sem um servidor web.", + "cloudGradient": "nuvem com gradiente", + "cloudOutline": "contorno de nuvem", + "code": "código", + "code mapping...": "mapeamento para código…", + "code of _": "o código de _", + "collection": "colecção", + "color": "a cor", + "color _ is touching _ ?": "a cor _ está a tocar na cor _", + "color effect": "o efeito cor", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "a combinação dos itens de _ com _", + "comic": "ondeado", + "command": "comando", + "comment pic...": "fotografia do comentário…", + "compile": "compilar", + "compile _": "a compilação de _", + "compile _ for _ args": "a compilação de _ para _ argumentos", + "complex?": "é complexo, o valor", + "confetti": "confetes", + "console log _": "regista _ na consola", + "continuation": "", + "continuations cannot be forked": "", + "cos": "o cosseno", + "costume": "o traje", + "costume #": "o número do traje", + "costume name": "o nome do traje", + "costumes": "os trajes", + "costumes tab help": "Importe uma imagem de uma página Web ou de um arquivo do seu computador arrastando-a para aqui.", + "could not connect to:": "Não foi possível ligar a:", + "cr": "retornos", + "create a clone of _": "cria um novo clone de _", + "cross": "cruz", + "crosshairs": "mira", + "cubic": "cúbica", + "cubic-in": "cúbica à entrada", + "cubic-in-out": "cúbica à entrada e à saída", + "cubic-out": "cúbica à saída", + "current": "", + "current _": "", + "current module versions:": "versões actuais dos módulos", + "current parent": "progenitor actual", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "estás pendurado", + "data": "", + "date": "o dia", + "day of week": "o dia da semana", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "remover", + "delete _": "remove _", + "delete _ of _": "remove _ de _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "remover definição do bloco…", + "delete slot": "", + "delete this clone": "remove-te", + "delete variable": "", + "delimiter": "delimitador", + "demo (1.2x)": "demonstração (1.2x)", + "demo...": "", + "denominator": "o denominador", + "detach all parts": "soltar todas as partes", + "detach and put into the hand": "", + "detach from": "soltar de", + "development mode": "modo de desenvolvimento", + "development mode debugging primitives:": "primitivas de depuração do modo de desenvolvimento:", + "development mode...": "", + "dimensions": "", + "direction": "a direcção", + "disable deep-Morphic context menus and show user-friendly ones": "Desactivar menus de contexto profundos do Morphic e mostrar menus amigáveis.", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "saiu.", + "distance": "a distância", + "distance to _": "", + "distribution": "", + "don't rotate": "não roda", + "down arrow": "seta para baixo", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "descarregar guião", + "download this script as an XML file": "", + "draggable": "arrastável", + "draggable?": "és arrastável", + "dragging threshold": "", + "dropped": "te largar", + "duplicate": "duplicar", + "duplicate block definition...": "duplicar definição do bloco…", + "duration": "a duração", + "e": "e", + "e^": "a exponencial", + "edge": "a borda", + "edit": "editar", + "edit rotation point only...": "editar apenas ponto de rotação…", + "edit the costume's rotation center": "", + "edit...": "editar…", + "editables": "", + "elastic": "elástica", + "elegant (90)": "elegante (90)", + "ellipse": "elipse", + "enable Morphic context menus and inspectors, not user-friendly!": "Activar menus de contexto e inspectores não amigáveis do Morphic!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "borracha", + "exact": "a versão exacta", + "exact?": "é exacto, o valor", + "exceeding maximum number of clones": "", + "expecting": "esperavam-se", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "Experimental – em construção", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportar", + "export block definition...": "", + "export pen trails line segments as SVG": "exportar os traços da caneta no formato SVG", + "export project as cloud data...": "Exportar projecto como dados da nuvem…", + "export project media only...": "Exportar apenas os média do projecto…", + "export project without media...": "Exportar projecto sem os média…", + "export script": "", + "export...": "exportar…", + "extract": "", + "f": "f", + "false": "falso", + "file": "arquivo", + "file menu import hint": "Abrir um projecto exportado, substitundo o projecto corrente, ou importar uma biblioteca de blocos, um traje ou um som para o projecto corrente.", + "fill": "enche o palco", + "fill page...": "", + "filtered for _": "filtrado para _", + "find blocks": "procurar blocos", + "find blocks...": "procurar blocos…", + "find first item _ in _": "o primeiro item tal que _ de _", + "find unused global custom blocks and remove their definitions": "Procurar os blocos personalizados globais não usados e remover as suas definições", + "finite?": "é finito, o valor", + "fisheye": "olho-de-peixe", + "fisheye effect": "o efeito olho-de-peixe", + "flag": "bandeira", + "flash": "relâmpago", + "flat line ends": "extremos das linhas planos", + "flatten": "", + "flip ↔": "inverter ↔", + "flip ↕": "inverter ↕", + "floor": "o arredondamento para baixo", + "footprints": "pegadas", + "for _ = _ to _ _": "para _ de _ a _ , repete _", + "for all sprites": "para todos os objectos", + "for each _ in _ _": "para cada _ de _ , repete _", + "for this sprite only": "apenas para este objecto", + "forever _": "repete _ para sempre", + "frame": "", + "frames": "molduras", + "frequencies": "", + "frequency": "a frequência", + "front": "a frente", + "fullScreen": "ecrã inteiro", + "g": "g", + "gears": "roda dentada", + "get blocks": "", + "get data": "", + "ghost": "", + "ghost effect": "o efeito fantasma", + "giant (8x)": "gigante (8x)", + "glide _ secs to x: _ y: _": "desliza em _ s para as coordenadas (x: _ , y: _ )", + "glide, grow and rotate using easing functions.": "Deslizar, aumentar e rodar usando funções de forma (de «easing»).", + "global?": "", + "globe": "globo", + "go back _ layers": "recua _ camadas", + "go to _": "vai para a posição de _", + "go to _ layer": "vai para _", + "go to x: _ y: _": "vai para as coordenadas (x: _ , y: _ )", + "gray scale palette": "", + "green": "", + "grow": "aumentar", + "h": "h", + "handle": "", + "header": "cabeçalho", + "header mapping...": "mapeamento para cabeçalho…", + "height": "a altura", + "hello": "Olá", + "help": "", + "help...": "ajuda…", + "hide": "esconde-te", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "esconder blocos primitivos", + "hide variable _": "esconde a variável _", + "high": "", + "hour": "a hora", + "http:// _": "o recurso http:// _", + "hue": "o matiz", + "huge (4x)": "enorme (4x)", + "i": "i", + "identical to": "é idêntico a", + "if _ _": "se _ , então _", + "if _ _ else _": "se _ , então _ senão, _", + "if _ then _ else _": "se _ então _ , senão _", + "if on edge, bounce": "se estiveres a bater na borda, ressalta", + "imag-part": "a parte imaginária", + "import a sound from your computer by dragging it into here": "Importe um som do seu computador arrastando-o para aqui.", + "import without attempting to parse or format data": "Importar sem tentar analisar ou formatar os dados", + "import...": "importar…", + "in palette": "", + "including dependencies": "", + "index": "o índice", + "index of _ in _": "o índice de _ em _", + "inexact": "a versão inexacta", + "inexact?": "é inexacto, o valor", + "infinite?": "é infinito, o valor", + "inherit _": "herda _ do teu progenitor", + "inherited": "herdado", + "input list:": "os itens de", + "input names:": "com parâmetros", + "input(s), but getting": "argumento(s), mas foram passados", + "inputs": "", + "insert _ at _ of _": "insere _ como _ de _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "integer?": "é inteiro, o valor", + "is _ ?": "_ ?", + "is _ a _ ?": "_ é um/uma _", + "is _ empty?": "_ está vazia", + "is _ identical to _ ?": "_ é idêntico a _", + "is _ on?": "o modo _ está activo", + "is not a valid option": "", + "is read-only": "", + "item": "o item", + "item _ of _": "_ de _", + "items": "itens", + "j": "j", + "join _": "a junção de _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "os itens tais que _ de _", + "key": "", + "key _ pressed?": "a tecla _ está a ser pressionada", + "keyboard": "teclas", + "keyboardFilled": "teclado", + "l": "l", + "label": "", + "language_name": "Português", + "language_translator": "Manuel Menezes de Sequeira", + "large": "grande", + "last": "o último item", + "last changed": "alterado pela última vez em", + "last_changed": "2020-08-03", + "launch _ _": "lança execução de _ _", + "left": "a coordenada x da esquerda", + "left arrow": "seta para a esquerda", + "length": "o número de amostras", + "length of _": "o comprimento de _", + "length:": "comprimento:", + "let the World automatically adjust to browser resizing": "", + "letter": "letra", + "letter _ of _": "o caractere _ de _", + "light (70)": "leve (70)", + "lightness": "", + "line": "linha", + "lines": "", + "list": "lista", + "list _": "uma lista com _", + "list view...": "vista de lista…", + "ln": "o logaritmo natural", + "location": "localização", + "lock": "", + "log": "o logaritmo", + "log pen vectors": "registo de vectores da caneta", + "login": "autenticação", + "loop": "ciclo", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "contorno de lupa", + "magnifyingGlass": "", + "magnitude": "o módulo", + "make a block...": "criar um bloco…", + "make a category...": "", + "make a copy and pick it up": "Fazer uma cópia do bloco e agarrá-la.", + "make a morph": "", + "make temporary and hide in the sprite corral": "tornar temporário e esconder da lista de actores", + "make this morph movable": "", + "make this morph unmovable": "", + "manipulate costumes pixel-wise.": "Manipular trajes píxel a píxel.", + "map String to code _": "", + "map _ of _ to code _": "mapear _ de _ no código _", + "map _ over _": "a aplicação de _ aos itens de _", + "map _ to _ _": "mapear _ no _ _", + "map _ to code _": "mapear _ no código _", + "max": "máxima", + "maximum": "", + "medium (50)": "médio (50)", + "menus": "", + "message": "a mensagem", + "messages": "as mensagens", + "microphone _": "_ do microfone", + "middle": "meio", + "minimum": "", + "minute": "o minuto", + "mirror video": "vídeo espelhado", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruosa (10x)", + "month": "o mês", + "mosaic": "mosaico", + "mosaic effect": "o efeito mosaico", + "motion": "o movimento", + "mouse down?": "o botão do rato está pressionado", + "mouse position": "", + "mouse x": "a coordenada x do rato", + "mouse y": "a coordenada y do rato", + "mouse-departed": "sair de ti", + "mouse-entered": "entrar em ti", + "mouse-pointer": "o ponteiro do rato", + "move": "mover", + "move _ steps": "anda _ passos", + "move all inside...": "", + "move...": "", + "multi-line": "multilinha", + "my": "próprios", + "my _": "_", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "ti", + "n": "n", + "name": "o nome", + "nan?": "é NaN, o valor", + "neg": "o simétrico", + "negative": "negativo", + "negative effect": "o efeito negativo", + "neighbors": "os vizinhos", + "neighbors ≠": "", + "new costume _ width _ height _": "um novo traje com _ de largura _ e altura _", + "new line": "nova linha", + "new sound _ rate _ Hz": "um novo som com _ e frequência _ Hz", + "new...": "Nova…", + "next": "", + "next costume": "passa para o próximo traje", + "none": "nenhum", + "normal": "", + "normal (1x)": "", + "normalScreen": "ecrã normal", + "normalStage": "palco normal", + "not": "é falso que", + "not _": "é falso que _", + "note": "a nota", + "notes": "nota", + "nothing": "", + "now connected.": "entrou.", + "number": "número", + "number of channels": "o número de canais", + "number?": "é número, o valor", + "numbers from _ to _": "uma lista com os números de _ a _", + "numerator": "o numerador", + "o": "o", + "object _": "o objecto de _", + "objects": "os objectos", + "octagon": "octógono", + "only duplicate this block": "Duplicar apenas este bloco.", + "only face left/right": "olha apenas para a esquerda ou para a direita", + "only grab this block": "", + "open a new browser browser window with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "Abrir uma nova janela no navegador contendo um resumo deste projecto com sombreamento em todas as imagens (não suportado em todos os navegadores)", + "open a new window with a picture of all scripts": "Abrir uma nova janela com uma fotografia de todos os guiões.", + "open a new window with a picture of both this script and its result": "Abrir uma nova janela com uma fotografia tanto deste guião como do seu resultado.", + "open a new window with a picture of the stage": "Abrir uma nova janela com uma fotografia do palco.", + "open a new window with a picture of this comment": "Abrir uma nova janela com uma fotografia deste comentário.", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "abrir noutra caixa de diálogo…", + "open in dialog...": "abrir em caixa de diálogo…", + "open shared project from cloud...": "Abrir projecto partilhado a partir da nuvem…", + "options": "opções", + "options...": "", + "or": "ou", + "or before": "ou antes", + "other clones": "os outros clones", + "other scripts in sprite": "os outros guiões deste objecto", + "other sprites": "os outros actores", + "output text using speech synthesis.": "Falar texto usando síntese de voz.", + "p": "p", + "paint a new sprite": "Pintar um novo actor.", + "paintbucket": "balde de tinta", + "parameters": "parâmetros", + "parent": "o progenitor", + "parent...": "progenitor…", + "parts": "as partes", + "password has been changed.": "a sua palavra-passe foi alterada.", + "password must be six characters or longer": "A palavra-passe tem de ter pelo menos seis caracteres.", + "passwords do not match": "As palavras-passe não correspondem.", + "paste on _": "carimba-te em _", + "pause": "", + "pause all _": "faz pausa em tudo _", + "pen": "caneta", + "pen _": "_ da tua caneta", + "pen down": "baixa a tua caneta", + "pen down?": "a tua caneta está baixa", + "pen trails": "os traços da caneta", + "pen up": "levanta a tua caneta", + "pen vectors": "os vectores da caneta", + "piano keyboard": "um teclado de piano", + "pic...": "fotografia…", + "pick random _ to _": "um valor ao acaso entre _ e _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "editar centro de rotação", + "pixel": "", + "pixelate": "pixelização", + "pixelate effect": "o efeito pixelização", + "pixels": "píxeis", + "play _ Hz for _ secs": "toca a frequência _ Hz durante _ s", + "play frequency _ Hz": "toca a frequência _ Hz", + "play note _ for _ beats": "toca a nota _ durante _ tempos", + "play sound _": "toca o som _", + "play sound _ at _ Hz": "toca o som _ a _ Hz", + "play sound _ until done": "toca o som _ até terminar", + "please agree to the TOS": "Por favor concorde com os Termos do Serviço.", + "please fill out this field": "Por favor preencha este campo.", + "please provide a valid email address": "Por favor indique um endereço de correio electrónico válido.", + "point in direction _": "altera a tua direcção para _ °", + "point towards _": "aponta em direcção a _", + "pointRight": "triângulo para a direita", + "polygon": "polígono", + "position": "", + "poster": "", + "predicate": "predicado", + "presentation (1.4x)": "apresentação (1.4x)", + "pressed": "pressionar em ti", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "quadratic": "quadrática", + "quadratic-in": "quadrática à entrada", + "quadratic-in-out": "quadrática à entrada e à saída", + "quadratic-out": "quadrática à saída", + "quart": "quártica", + "quart-in": "quártica à entrada", + "quart-in-out": "quártica à entrada e à saída", + "quart-out": "quártica à saída", + "r": "r", + "r-g-b-a": "os valores de R, G, B e Alpha", + "random": "um valor ao acaso", + "random position": "um ponto ao acaso", + "rank": "", + "rational?": "é racional, o valor", + "raw data...": "dados em bruto…", + "ray length": "", + "read-only": "apenas leitura", + "real-part": "a parte real", + "real?": "é real, o valor", + "receivers...": "", + "recording": "Gravação", + "rectangle": "rectângulo", + "rectangleSolid": "rectângulo preenchido", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "refazer última largada", + "relabel...": "mudar para outro bloco…", + "release": "tornar clone temporário", + "remove block variables...": "remover variáveis de bloco…", + "rename": "alterar o nome", + "rename all blocks that access this variable": "alterar todos os blocos que usam esta variável", + "rename all...": "alterar o nome em todo o lado…", + "rename background": "", + "rename costume": "Qual o novo nome do traje?", + "rename only this reporter": "alterar o nome apenas neste repórter", + "rename sound": "Qual o novo nome do som?", + "rename...": "alterar o nome…", + "repeat _ _": "repete _ vezes _", + "repeat until _ _": "até que _ , repete _", + "replace item _ of _ with _": "substitui _ de _ por _", + "report _": "reporta _", + "reporter": "repórter", + "reporter didn't report": "", + "reset columns": "reiniciar colunas", + "reset timer": "reinicia o cronómetro", + "reshape _ to _": "", + "resize...": "", + "resolution": "a resolução", + "rest for _ beats": "faz uma pausa de _ tempos", + "restore display": "", + "result pic...": "fotografia do resultado…", + "reverse": "", + "right": "a coordenada x da direita", + "right arrow": "seta para a direita", + "ring": "", + "ringify": "adicionar anel", + "robot": "robô", + "rotate": "rodar", + "rotation style": "estilo de rotação", + "rotation x": "a coordenada x de rotação", + "rotation y": "a coordenada y de rotação", + "round _": "o arredondamento de _", + "run _ _": "", + "run _ w/continuation": "executa _ com continuação", + "s": "s", + "sample morphs": "", + "sample rate": "a frequência de amostragem", + "samples": "as amostras", + "saturation": "a saturação", + "saturation effect": "o efeito saturação", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "Guardar uma fotografia deste guião e do seu resultado.", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "guardar uma fotografia deste guião", + "save a summary of this project": "Guardar um resumo deste projecto", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "Guardar dados do projecto como XML na sua pasta de descarregamentos.", + "saved.": "guardado.", + "say _": "diz _", + "say _ for _ secs": "diz _ durante _ s", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic": "fotografia de guião", + "script pic with result...": "fotografia do guião incluindo resultado…", + "script pic...": "fotografia do guião…", + "script variables _": "cria as variáveis de guião _", + "scripts": "os guiões", + "scripts pic...": "fotografia dos guiões…", + "scroll frame": "", + "scrolled-down": "rolar para baixo", + "scrolled-up": "rolar para cima", + "second": "o segundo", + "select": "seleccionar", + "selection": "selecção", + "self": "tu próprio", + "send _ to _": "envia a mensagem _ a _", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "altera o teu efeito _ para _", + "set _ of block _ to _": "", + "set _ to _": "altera o modo _ para _", + "set background _ to _": "altera _ do fundo para _", + "set background color to _": "altera a cor do fundo para _", + "set balance to _": "altera o balanço para _", + "set instrument to _": "altera o teu instrumento para _", + "set pen _ to _": "altera _ da tua caneta para _", + "set pen color to _": "altera a cor da tua caneta para _", + "set pen shade to _": "", + "set pen size to _": "altera a espessura da tua caneta para _", + "set size to _ %": "altera o teu tamanho para _ %", + "set tempo to _ bpm": "altera o teu andamento para _ bpm", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "altera a transparência do vídeo para _", + "set volume to _ %": "altera o volume para _ %", + "set x to _": "altera a tua coordenada x para _", + "set y to _": "altera a tua coordenada y para _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Assinalar para focar em ranhuras vazias quando arrastando e largando repórteres.", + "several block definitions already match this label": "", + "shared.": "partilhado.", + "sharing project...": "partilhando projecto…", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "mostra-te", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "Mostra uma imagem com todos os guiões e definições de blocos", + "show all": "mostrar todos os actores", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Mostrar as definições de blocos personalizados globais no formato XML numa nova janela do navegador.", + "show primitives": "mostrar blocos primitivos", + "show project data as XML in a new browser window": "Mostrar os dados do projecto no formato XML numa nova janela do navegador.", + "show table _": "", + "show the World's menu": "", + "show variable _": "mostra a variável _", + "shown?": "estás a ser mostrado", + "shrink": "reduzir", + "shuffled": "", + "signals": "", + "sin": "o seno", + "sine-in": "sinusoidal à entrada", + "sine-in-out": "sinusoidal à entrada e à saída", + "sine-out": "sinusoidal à saída", + "size": "o tamanho", + "slider": "potenciómetro", + "slider max...": "máximo do potenciómetro…", + "slider min...": "mínimo do potenciómetro…", + "slots": "", + "smallStage": "palco pequeno", + "smaller menu fonts and sliders": "", + "snap": "a fotografia", + "sorted": "", + "sound": "som", + "sounds": "os sons", + "space": "espaço", + "special": "especial", + "specify the distance the hand has to move before it picks up an object": "Especificar a distância que mão tem de se mover antes de agarrar algum objecto", + "spectrum": "o espectro", + "speech bubble": "", + "speechBubble": "balão de fala", + "speechBubbleOutline": "contorno de balão de fala", + "split _ by _": "uma lista com os troços de _ por _", + "sprite": "actor", + "sprites": "os actores", + "sqrt": "a raiz quadrada", + "square": "quadrado", + "stack size": "altura da pilha", + "stage": "o palco", + "stage image": "", + "stamp": "carimba-te", + "standard settings": "", + "stay signed in on this computer until logging out": "manter-me autenticado neste computador até que saia", + "stepForward": "avançar um passo", + "stick this morph to another one": "", + "stick to": "prender a", + "stop _": "pára _", + "stop all sounds": "pára todos os sons", + "stop frequency": "pára de tocar a frequência", + "stopped": "parar", + "storage": "armazenagem", + "store this project in the downloads folder (in supporting browsers)": "Guardar este projecto na sua pasta de descargas (em navegadores que o suportem).", + "stretch _ x: _ y: _ %": "o traje _ escalado de (x: _ % , y: _ % )", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "exportar SVG…", + "switch to costume _": "muda o traje para _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabuladores", + "table view...": "vista de tabela…", + "take a camera snapshot and import it as a new sprite": "Tirar uma fotografia com a câmara e importá-la como novo actor.", + "tan": "a tangente", + "tell _ to _ _": "diz a _ para executar _ _", + "tempo": "o andamento", + "temporary?": "és temporário", + "text": "texto", + "text-only (100)": "apenas texto (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "de momento não há blocos personalizados globais não usados neste projecto", + "there are currently no vectorizable pen trail segments": "de momento não há traços da caneta vectorizáveis", + "thing": "um valor", + "think _": "", + "think _ for _ secs": "pensa _ durante _ s", + "this _": "", + "this block": "este guião de bloco", + "this project doesn't have any custom global blocks yet": "Este projecto ainda não tem nenhum bloco personalizado global.", + "this script": "este guião de objecto", + "time in milliseconds": "o tempo (em milisegundos)", + "timer": "o valor do cronómetro", + "tip": "ponta", + "to": "", + "to use instead of hue for better selection": "Para usar em vez da matiz de modo a permitir uma melhor selecção.", + "top": "a coordenada y da topo", + "touch screen settings": "", + "touching _ ?": "estás a tocar na cor _", + "transient": "transiente", + "translations": "", + "translations...": "traduções…", + "translator_e-mail": "mmsequeira@gmail.com", + "transparency": "a transparência", + "transparency...": "", + "trash is empty": "", + "true": "verdadeiro", + "turbo mode": "turbo", + "turbo mode?": "", + "turn _ _ degrees": "gira _ _ °", + "turn all pen trails and stamps into a new background for the stage": "Transforma todos os traços da caneta e carimbagens num novo cenário do palco.", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "Transforma todos os traços da caneta e carimbagens num novo traje do actor seleccionado neste momento.", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "transformar traços da caneta em novo traje…", + "turnBack": "voltar para trás", + "turnForward": "voltar para a frente", + "turnLeft": "girar à esquerda", + "turnRight": "girar à direita", + "turtle": "tartaruga", + "turtleOutline": "contorno de tartaruga", + "type": "", + "type of _": "o tipo de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "Desassinalar para o design por omissão da interface gráfica com o utilizador.", + "uncheck for greater speed at variable frame rates": "Desassinalar para aumentar a velocidade permitindo ritmos variáveis das tramas.", + "uncheck for less contrast multi-column list views": "Desassinalar para vistas multicoluna de listas com menor contraste.", + "uncheck for lower resolution, saves computing resources": "Desassinalar para menor resolução; poupa recursos computacionais.", + "uncheck for round ends of lines": "Desassinalar para que os extremos das linhas desenhadas pela caneta sejam redondos.", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "Desassinalar para permitir que repórteres largados desalojem outros.", + "uncheck to allow script reentrance": "Desassinar para permitir reentrância nos guiões.", + "uncheck to always show (+) symbols in block prototype labels": "Desassinalar para mostrar sempre os símbolos (+) no texto dos protótipos dos blocos", + "uncheck to confine auto-wrapping to top-level block stacks": "desassinalar para limitar as quebras de linha às pilhas de blocos do nível de topo", + "uncheck to disable IDE animations": "Desassinalar para desactivar as animações do AID", + "uncheck to disable alternating colors for nested block": "Desassinalar para deixar de alternar as cores de blocos aninhados.", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "desassinalar para desactivar o suporte para a câmara", + "uncheck to disable dropping commands in reporter rings": "Desassinalar para desactivar o encaixe de comandos em anéis de reporter", + "uncheck to disable dynamic labels for variadic inputs": "Desassinalar para desactivar etiquetas dinâmicas nas entradas variádicas.", + "uncheck to disable input sliders for entry fields": "Desassinalar para desactivar deslizadores nas ranhuras dos blocos.", + "uncheck to disable keyboard editing support": "Desassinalar para desactivar a edição usando o teclado.", + "uncheck to disable multi-column list views": "Desassinalar para desactivar vistas multicoluna de listas.", + "uncheck to disable project data in URLs": "Desassinalar para desactivar dados do projecto nos URL.", + "uncheck to disable saving linked sublist identities": "Desassinalar para desactivar o armazenamento das identidades de sublistas ligadas.", + "uncheck to disable sprite composition": "Desassinalar para desactivar a composição de actores.", + "uncheck to disable sprite inheritance features": "Desassinalar para desactivar funcionalidades de herança de actores.", + "uncheck to disable support for first-class sprites": "Desassinalar para desactivar o suporte de actores de primeira classe.", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "Desassinalar para desactivar a utilização de operadores em listas e tabelas.", + "uncheck to disable virtual keyboard support for mobile devices": "Desassinalar para desactivar o suporte do teclado virtual para dispositivos móveis.", + "uncheck to disinherit": "desassinalar para não herdar", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "desassinalar para limitar as ranhuras booleanas aos valores verdadeiro / falso", + "uncheck to run scripts at normal speed": "Desassinalar para executar os guiões à velocidade normal.", + "uncheck to save contents in the project": "Desassinalar para guardar o conteúdo no projecto", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "Desassinalar para parar de memorizar entradas (para depurar o avaliador).", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "Desassinalar para desactivar o som produzido ao clicar nos blocos.", + "uncheck to turn off logging pen vectors": "Desassinalar para desactivar o registo de vectores da caneta", + "uncheck to turn off visible stepping": "desassinalar para desactivar execução passo a passo visível", + "uncheck to use solid drop shadows and highlights": "Desassinalar para usar sombras e realces nítidos.", + "uncheck to use the input dialog in short form": "Desassinalar para usar a forma curta da caixa de diálogo dos parâmetros.", + "uncompile": "descompilar", + "undo": "desfazer", + "undo the last block drop in this pane": "Desfazer a última largada de um bloco neste separador.", + "undrop": "desfazer última largada", + "unicode _ as letter": "o caractere cujo código Unicode é _", + "unicode of _": "o código Unicode do caractere _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "remover anel", + "unshared.": "deixado de partilhar.", + "unsharing project...": "deixando de partilhar projecto…", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Sem título", + "unused": "", + "unused block(s) removed": "blocos não usados removidos", + "up arrow": "seta para cima", + "upper case": "", + "url _": "o recurso http:// _", + "url...": "", + "use the keyboard to enter blocks": "usar o teclado para introduzir blocos", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "o valor", + "variable": "", + "variables": "as variáveis", + "video _ on _": "_ do vídeo em _", + "video capture": "", + "volume": "o volume", + "w": "w", + "wait _ secs": "espera _ s", + "wait until _": "espera até que _", + "wardrobe": "", + "warp _": "executa atomicamente _", + "what's your name?": "Como te chamas?", + "when I am _": "Quando o rato _", + "when I receive _ _": "Quando receberes a mensagem _ _", + "when I start as a clone": "Quando fores criado como clone", + "when _": "Quando _", + "when _ clicked": "Quando alguém clicar em _", + "when _ is edited _": "", + "when _ key pressed _": "Quando alguém pressionar a tecla _ _", + "whirl": "remoinho", + "whirl effect": "o efeito remoinho", + "whitespace": "espaços em branco", + "width": "a largura", + "with data": "", + "with inputs": "com argumentos", + "word": "palavra", + "world": "mundo!", + "write _ size _": "escreve _ com tamanho _", + "x": "x", + "x position": "a coordenada x da posição", + "y": "y", + "y position": "a coordenada y da posição", + "year": "o ano", + "year:": "ano:", + "your own": "os teus próprios", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-pt_BR.js b/elements/pl-snap/Snap/locale/lang-pt_BR.js new file mode 100644 index 00000000..7b1e2ee9 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-pt_BR.js @@ -0,0 +1,1391 @@ +SnapTranslator.dict.pt_BR = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "does not exist in this context": "não existe neste contexto", + "(-90) left": "-90° (esquerda ou oeste)", + "(0) up": "0° (cima ou norte)", + "(1) sine": "(1) ∿∿ (onda senoidal)", + "(180) down": "180° (baixo ou sul)", + "(2) square": "(2) ⎍⎍ (onda quadrada)", + "(3) sawtooth": "(3) ⩘⩘ (onda dentada)", + "(4) triangle": "(4) ⋀⋀ (onda triangular)", + "(90) right": "90° (direita ou leste)", + "(empty)": "(vazio)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Sobre o Snap", + "About...": "Sobre Snap…", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "Adicionar cena...", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animações", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Repórter (forma especial)", + "Any type": "Qualquer tipo", + "Apply": "Aplicar", + "April": "Abril", + "Are you sure you want to continue?": "Tem certeza que quer continuar?", + "Are you sure you want to delete": "Tem certeza que quer apagar?", + "Are you sure you want to publish": "Tem certeza que quer publicar?", + "Are you sure you want to replace": "Tem certeza que quer substituir?", + "Are you sure you want to share": "Tem certeza que quer compartilhar?", + "Are you sure you want to unpublish": "Tem certeza que quer despublicar?", + "Are you sure you want to unshare": "Tem certeza que quer descompartilhar?", + "Audio Comp": "", + "August": "Agosto", + "Back...": "Para trás…", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "Data de nascimento:", + "Bitmap": "", + "Block Editor": "Editor de Blocos", + "Blocks": "", + "Blocks category name:": "Nome da nova categoria de blocos:", + "Blurred shadows": "Sombras borradas", + "Boolean": "booleano", + "Boolean (T/F)": "Booleano (V/F)", + "Boolean (unevaluated)": "Predicado (forma especial)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Cancela", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "Alterar senha", + "Change block": "Altere o tipo do bloco", + "Clear backup": "", + "Clicking sound": "Som de cliques", + "Closed brush (free draw)": "", + "Cloud": "Nuvem", + "Code mapping": "", + "Codification support": "Suporte a produção de código", + "Colors and Crayons": "", + "Command": "Comando", + "Command (C-shape)": "Comando (bloco de repetição)", + "Command (inline)": "Comando (em linha)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Contribuidores", + "Control": "Controle", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Editor de Fantasias", + "Costumes": "Fantasias", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Criar parâmetro", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Créditos…", + "Custom Block Translations": "", + "Database": "", + "December": "Dezembro", + "Default": "", + "Default Value:": "Valor em caso de omissão (default):", + "Delete": "Remover", + "Delete Custom Block": "Remova Bloco Personalizado", + "Delete Project": "Apague Projeto", + "Delete a variable": "Remova uma variável", + "Disable click-to-run": "Desativar clique para executar", + "Disable dragging data": "", + "Down": "", + "Download source": "Baixar código fonte", + "Dragging threshold...": "", + "Dynamic input labels": "Nomes de entrada dinâmicos", + "E-mail address of parent or guardian:": "Endereço de encarregado de educação:", + "E-mail address:": "Endereço de email:", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Editar parâmetro", + "Edit label fragment": "Editar rótulo", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "vazio", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Entre com uma opção por linha. Opcionalmente, use \"=\" como separador entre chave e valor, e.g. a resposta=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "Exemplos", + "Execute on slider change": "", + "Export Project As...": "Exportar projeto como...", + "Export all scripts as pic...": "", + "Export blocks": "Exportar blocos", + "Export blocks...": "Exportar blocos…", + "Export project as plain text...": "Exportar este projeto em modo texto…", + "Export project...": "Exportar este projeto…", + "Export summary with drop-shadows...": "", + "Export summary...": "Exportar resumo...", + "Extension blocks": "Blocos de extensão", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "Nível de transparência dos blocos...", + "February": "Fevereiro", + "Fetching project from the cloud...": "Obtendo o projeto da nuvem…", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Visual achatado", + "Flat line ends": "Extremos de linhas retos", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "Modelo de cor HSL", + "Header mapping": "", + "Hello!": "Olá!", + "Hello, World!": "", + "Help": "", + "Hide blocks in palette": "Esconder blocos", + "Hide blocks...": "Esconder blocos...", + "Hmm...": "Hmm…", + "Hummingbird robotics": "", + "Hyper blocks support": "Suporte a hiper-blocos", + "I have read and agree to the Terms of Service": "Li e declaro concordar com os Termos do Serviço", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "Importar", + "Import a new costume from your webcam": "importar uma nova fantasia da sua webcam", + "Import blocks": "Importar blocos", + "Import library": "Importar biblioteca", + "Import sound": "", + "Import tools": "Importar ferramentas oficiais", + "Import...": "Importar…", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "Parâmetros:", + "Input Slot Options": "Opções de Campos de Entrada", + "Input name": "Parâmetro", + "Input sliders": "Sliders nos campos de entrada", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "Janeiro", + "JavaScript extensions": "Extensões do JavaScript", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "Julho", + "June": "Junho", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Língua…", + "Libraries...": "Bibliotecas...", + "License": "Licença", + "License...": "Licença…", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Lista", + "List utilities": "", + "Lists": "Listas", + "Live coding support": "", + "Loading": "Carregando", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Registrar os vetores da caneta", + "Login...": "Entrar na sua conta…", + "Logout": "Encerrar sessão", + "Long form input dialog": "Forma longa da caixa de diálogo dos parâmetros", + "Looks": "Aparência", + "Make a block": "Criar um bloco", + "Make a variable": "Criar uma variável", + "Manipulate costumes pixel-wise.": "", + "March": "Março", + "May": "Maio", + "Message name": "nome da mensagem", + "Method Editor": "", + "Microphone": "Microfone", + "Microphone resolution...": "Resolução do microfone...", + "Modules...": "Módulos…", + "Motion": "Movimento", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Múltiplos argumentos (o valor do parâmetro é a lista dos argumentos).", + "Nested auto-wrapping": "", + "New": "Criar um novo projeto", + "New Category": "Nova categoria", + "New Project": "Novo Projeto", + "New category...": "Nova categoria...", + "New password:": "Nova senha", + "New scene": "Nova cena", + "No": "Não", + "November": "Novembro", + "Number": "Número", + "OK": "", + "Object": "Objeto", + "October": "Outubro", + "Ok": "", + "Old password:": "Senha antiga:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Abrir", + "Open Project": "Abrir Projeto", + "Open in Community Site": "Abrir no site da comunidade", + "Open...": "Abrir um projeto…", + "Opening Costumes...": "Abrindo acervo de fantasias...", + "Opening project...": "Abrindo o projeto…", + "Operators": "Operadores", + "Other": "Outros", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "Desenhar uma nova fantasia.", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "Senha:", + "Pen": "Caneta", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Textos simples nos protótipos dos blocos", + "Play": "Tocar", + "Play sound": "Toque som.", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "Poligono", + "Predicate": "Predicado", + "Prefer empty slot drops": "Procure encaixar blocos de valor (repórteres) em campos vazios ao soltar", + "Prefer smooth animations": "Prefira animações suaves", + "Privacy...": "Privacidade…", + "Project Notes": "Notas do Projeto", + "Project URLs": "", + "Project notes...": "Notas deste projeto…", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "Publicar", + "Publish Project": "Publicar Projeto", + "Rasterize SVGs": "Transformar desenhos vetoriais (SVG) em mapas de bits", + "Record a new sound": "Gravar novo som", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Manual de Referência", + "Remove a category...": "Apagar uma categoria...", + "Remove unused blocks": "", + "Repeat Password:": "Repetir senha:", + "Repeat new password:": "Repetir nova senha:", + "Repeat password": "Repetir senha", + "Replace Project": "", + "Replace the current project with a new one?": "Substituir este projeto por um novo projeto?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Repórter", + "Request blocked": "", + "Resend Verification Email...": "Reenviar e-mail de verificação...", + "Resend verification email": "", + "Reset Password...": "Recuperar a sua senha...", + "Reset password": "Recuperar senha", + "Restore unsaved project": "Restaurar projeto não salvo", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Salvar", + "Save As...": "Salvar como…", + "Save Project": "", + "Save Project As...": "Salvar Projeto Como…", + "Save to disk": "Salvar no disco", + "Saved!": "Salvo!", + "Saving project to the cloud...": "Salvando o projeto na nuvem…", + "Scenes...": "", + "Script variable name": "Nome da variável de Roteiro", + "Scripts": "Roteiros", + "Select a costume from the media library": "Escolha uma fantasia da biblioteca de mídia", + "Select a sound from the media library": "Escolha um som da biblioteca de mídia", + "Select categories of additional blocks to add to this project.": "Selecionar categorias de blocos adicionais para este projeto", + "Selection tool": "", + "Sensing": "Sensores", + "September": "Setembro", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "Compartilhar", + "Share Project": "", + "Show buttons": "Mostrar botões", + "Show categories": "Mostrar as categorias", + "Sign in": "Entrar", + "Sign up": "Registrar nova conta", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Registar uma nova conta…", + "Single input.": "Parâmetro único.", + "Single palette": "", + "Slider maximum value": "Valor máximo do potenciómetro deslizante", + "Slider minimum value": "Valor mínimo do potenciómetro deslizante", + "Snap! website": "Site do Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Som", + "Sound Recorder": "", + "Sounds": "Sons", + "Sprite": "ator", + "Sprite Nesting": "Atores aninhados", + "Stage": "palco", + "Stage height": "", + "Stage selected: no motion primitives": "Palco selecionado: sem primitivas de movimento", + "Stage size": "", + "Stage size...": "Tamanho do palco...", + "Stage width": "", + "Stop": "Parar", + "Stop sound": "Pare som.", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Volte ao modo de usuário", + "Switch to dev mode": "Mude para modo de desenvolvimento", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Termos do Serviço…", + "Ternary Boolean slots": "", + "Text": "Texto", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Roteiros seguros relativos a threads", + "Title text": "Nome", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Traduções", + "Translators...": "Tradutores…", + "Turbo mode": "Modo turbo", + "Turbo mode.": "Modo turbo", + "Turtle": "seta", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "Modificações não salvas!", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Sem título", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "Atualizando a lista de projetos…", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Tornar o parâmetro visível ao invocador.", + "Use CPU for graphics": "", + "User name must be four characters or longer": "O nome de usuário tem de ter pelo menos quatro caracteres.", + "User name:": "Nome de usuário:", + "Variable name": "Nome da variável", + "Variables": "Variáveis", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Teclado virtual", + "Visible stepping": "Depuração passo a passo", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Sim", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "Ainda não se autenticou", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Coloração em zebra", + "Zoom blocks": "Zoom dos blocos", + "Zoom blocks...": "Tamanho dos blocos…", + "_ at _": "_ em _", + "_ combine _ using _": "", + "_ contains _": "_ contém _", + "_ effect": "efeito _", + "_ find first item _ in _": "", + "_ in front of _": "_ em frente a _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "resto de _ por _", + "_ of _": "_ de _", + "_ of block _": "_ do bloco _", + "_ of costume _": "_ da fantasia _", + "_ of sound _": "_ do som _", + "_ of text _": "_ de texto _", + "_ to _": "_ até _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "um novo clone de _", + "a variable of name": "uma variável de nome", + "about morphic.js...": "", + "abs": "valor absoluto", + "acos": "arco-cosseno", + "add _ to _": "adicione _ a _", + "add a new Turtle sprite": "Adicionar um novo ator.", + "add a new sprite": "adicionar um novo ator", + "add comment": "adicione um comentário", + "add comment here...": "coloque aqui um comentário…", + "agent": "", + "alert _": "mostre janela de alerta com _", + "all": "tudo", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "todos os itens de _ menos o primeiro", + "all but this script": "todos os roteiros exceto este", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "âncoras", + "and": "e", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "resposta", + "any": "qualquer", + "any key": "qualquer tecla", + "any message": "qualquer mensagem", + "anything": "", + "append _": "concatene _", + "arrange scripts vertically": "Organize roteiros verticalmente.", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "arco-seno", + "ask _ and wait": "pergunte _ e aguarde a resposta", + "ask _ for _ _": "pergunte a _ por _ _", + "atan": "arco-tangente", + "attach...": "", + "b": "b", + "back": "traseira", + "balance": "balanço", + "big (2x)": "grande (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "bloco", + "block deletion dialog text": "Quer mesmo remover este bloco e todas as suas aplicações?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blocos", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "brilho", + "broadcast _ _": "envie _ _", + "broadcast _ _ and wait": "envie _ _ e aguarde", + "brush": "", + "build": "construa", + "but getting a": "Mas ganhando", + "c": "c", + "call _ _": "chame _ _", + "call _ w/continuation": "chame _ com continuação", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "rode", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "arredondamento para cima (teto)", + "center": "centro", + "center x": "centro x", + "center y": "centro y", + "change _ by _": "adicione a _ o valor _", + "change _ effect by _": "adicione ao efeito _ _", + "change background _ by _": "", + "change balance by _": "adicione _ ao balanço", + "change pen _ by _": "adicione ao/à _ da caneta o valor _", + "change pen color by _": "adicione _ à cor da caneta", + "change pen shade by _": "adicione _ à intensidade da caneta", + "change pen size by _": "adicione _ à espessura da caneta", + "change size by _": "adicione _ ao seu tamanho", + "change tempo by _": "adicione _ tempos/bpm ao andamento", + "change volume by _": "adicione _ ao volume", + "change x by _": "adicione _ a x", + "change y by _": "adicione _ a y", + "check for alternative GUI design": "Marque para um design alternativo da interface gráfica de usuário.", + "check for block to text mapping features": "Assinalar para funcionalidades de mapeamento entre blocos e texto.", + "check for flat ends of lines": "marque para desenhar linhas com extremos retos", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "Marque para obter animações mais suaves e previsíveis de computador para computador.", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "Marque para sempre mostrar o tipo dos campos na caixa de diálogo dos parâmetros.", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "Marque para desativar a execução direta dos blocos clicando neles", + "check to disallow script reentrance": "Marque para não permitir reentrância nos roteiros.", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "Marque para ativar as animações da interface de usuário.", + "check to enable alternating colors for nested blocks": "Marque para alternar as cores de blocos aninhados.", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "Marque para ativar nomes dinâmicos nas variáveis de entrada.", + "check to enable input sliders for entry fields": "Marque para ativar sliders nos campos de entrada dos blocos.", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "marque para habilitar o uso de operadores em listas e tabelas", + "check to enable virtual keyboard support for mobile devices": "Marque para ativar o suporte ao teclado virtual para dispositivos móveis.", + "check to hide (+) symbols in block prototype labels": "Marque para esconder os símbolos (+) no texto dos protótipos dos blocos", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "Marque para priorizar a execução de roteiros.", + "check to rasterize SVGs on import": "Marque para transformar os arquivos vetoriais SVG em mapas de bits durante a importação.", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "marque para mostrar todos os blocos em uma única paleta", + "check to show buttons in the palette": "Marque para mostrar os botões na paleta", + "check to show category names in the palette": "Marque para mostrar os nomes das categorias na paleta", + "check to show extension primitives in the palette": "Marque para mostrar extensões primitivas na paleta", + "check to show in palette": "", + "check to support native JavaScript functions": "Marque para suportar funções JavaScript nativas", + "check to switch pen colors and graphic effects to HSL": "Marque para mudar as cores da caneta e efeitos gráficos para HSL", + "check to turn block clicking sound on": "Marque para ativar o som produzido ao clicar nos blocos.", + "check to turn on logging pen vectors": "Marque para registrar movimento da caneta como vetores", + "check to turn on visible stepping (slow)": "marque para ativar a depuração passo a passo (lento)", + "check to use blurred drop shadows and highlights": "Marque para usar sombras e realces borrados.", + "children": "filhos", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "limpar", + "clear": "apague tudo", + "clear graphic effects": "apague os efeitos gráficos", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Clique ou arraste a mira para mudar o centro de rotação.", + "clicked": "clicado", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "nuvem indisponível sem web server", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "cor", + "color _ is touching _ ?": "a cor _ está tocando na cor _", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "colunas", + "combinations _": "combinações _", + "combine _ using _": "combinar/reduzir os itens de _ com _", + "comic": "", + "command": "comando", + "comment pic...": "fotografia do comentário…", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "registre _ no console", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cosseno", + "costume": "fantasia", + "costume #": "n° da fantasia", + "costume name": "nome da fantasia", + "costumes": "fantasias", + "costumes tab help": "Importa uma imagem de uma página Web ou de um arquivo no teu computador arrastando-a para aqui", + "could not connect to:": "", + "cr": "retornos", + "create a clone of _": "crie clone de _", + "cross": "", + "crosshairs": "", + "current": "atual", + "current _": "_ atual", + "current module versions:": "versões actuais dos módulos", + "current parent": "", + "custom?": "customizado?", + "cut from _": "recorte de _", + "d": "d", + "dangling?": "penso?", + "data": "dado", + "date": "data", + "day of week": "daa da semana", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "definição", + "delete": "apague", + "delete _": "", + "delete _ of _": "apague _ de _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "remova definição do bloco…", + "delete slot": "", + "delete this clone": "apague este clone", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "demonstração (1.2x)", + "demo...": "", + "detach all parts": "desencaixe todas as partes", + "detach and put into the hand": "", + "detach from": "desencaixe de", + "development mode": "modo de desenvolvimento", + "development mode debugging primitives:": "primitivas de depuração do modo de desenvolvimento:", + "development mode...": "", + "dimensions": "dimensões", + "direction": "direção", + "disable deep-Morphic context menus and show user-friendly ones": "Desative menus de contexto profundos do Morphic e mostrar menus amigáveis.", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "saiu.", + "distance": "distância", + "distance to _": "distância até _", + "distribution": "", + "don't rotate": "não rode", + "down arrow": "seta para baixo", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "arrastável", + "draggable?": "arrastável?", + "dragging threshold": "", + "dropped": "arrastado e solto", + "duplicate": "duplicar", + "duplicate block definition...": "", + "duration": "duração", + "e": "e", + "e^": "exponencial", + "edge": "borda", + "edit": "editar", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "editar…", + "editables": "entradas", + "elegant (90)": "", + "else if _ _": "senão se _ _", + "enable Morphic context menus and inspectors, not user-friendly!": "Ativar menus de contexto e inspectores não amigáveis do Morphic!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "Esperando", + "expecting a": "Esperando", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - store this project in your downloads folder": "Experimental - Salvar este projeto na sua pasta de downloads.", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportar", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "exportar…", + "extract": "", + "f": "f", + "false": "falso", + "file": "", + "file menu import hint": "Importar para este projecto um projeto exportado, uma biblioteca de blocos, um traje ou um som.", + "fill": "preencha", + "fill page...": "", + "filtered for _": "filtrado por _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "encontrar primeiro item que satisfaça _ em _", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "olho de peixe", + "flag": "", + "flash": "", + "flat line ends": "extremos de linhas retos", + "flatten": "achatamento", + "flip ↔": "", + "flip ↕": "", + "floor": "arredondamento para baixo (piso)", + "footprints": "", + "for _ = _ to _ _": "repita de _ = _ a _ _", + "for all sprites": "para todos os atores", + "for each _ in _ _": "repita para cada _ de _ _", + "for this sprite only": "apenas para este ator", + "forever _": "sempre _", + "frame": "", + "frames": "quadros", + "frequencies": "", + "frequency": "frequência", + "front": "dianteira", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "", + "giant (8x)": "gigante (8x)", + "glide _ secs to x: _ y: _": "deslize por _ segundos até x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "vá _ camadas para trás", + "go to _": "vá para _", + "go to _ layer": "vá para camada _", + "go to front": "vá para a frente", + "go to x: _ y: _": "vá para x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "altura", + "hello": "Olá", + "help": "", + "help...": "ajuda…", + "hide": "esconder", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "esconda blocos primitivos", + "hide variable _": "esconda variável _", + "high": "", + "hour": "", + "http:// _": "página http:// _", + "hue": "tonalidade", + "huge (4x)": "enorme (4x)", + "i": "i", + "identical to": "é idêntico a", + "if _ _ _": "se _ então _ _", + "if _ _ else _": "se _ então _ senão _", + "if _ then _ else _": "se _ então _ senão _", + "if on edge, bounce": "se tocar na borda, volte", + "import a sound from your computer by dragging it into here": "Importe um som de seu computador arrastando-o para cá", + "import without attempting to parse or format data": "", + "import...": "importar…", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "índice do item _ em _", + "inherit _": "herde _", + "inherited": "", + "input list:": "lista de entradas", + "input names:": "com parâmetros", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "insira _ na posição _ em _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ ?", + "is _ a _ ?": "_ é um/uma _", + "is _ empty?": "_ vazia?", + "is _ identical to _ ?": "_ é idêntico a _", + "is _ on?": "parâmetro _ ativo?", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "item _ de _", + "items": "", + "j": "j", + "join _": "junte _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "manter/filtrar os itens que satisfaçam _ de _", + "key": "tecla", + "key _ pressed?": "tecla _ pressionada?", + "keyboard": "teclado", + "keyboardFilled": "", + "l": "l", + "label": "rótulo", + "language_name": "Português do Brasil", + "language_translator": "Aldo von Wangenheim, Cassiano D'Andrea, Artur Arnhold-Müller, Ville Medeiros", + "large": "grande", + "last": "último item", + "last changed": "", + "last_changed": "2023-10-17", + "launch _ _": "inicie execução de _ _", + "left": "esquerda", + "left arrow": "seta para a esquerda", + "length": "comprimento", + "length of _": "tamanho de _", + "length:": "tamanho:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "o caractere _ de _", + "light (70)": "", + "lightness": "", + "line": "avanços de linha", + "lines": "linhas", + "list": "lista", + "list _": "lista _", + "list view...": "", + "ln": "logaritmo natural", + "load the official library of powerful blocks": "Importar a biblioteca oficial de blocos.", + "location": "", + "lock": "", + "log pen vectors": "registro dos vetores da caneta", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "crie um bloco…", + "make a category...": "", + "make a copy and pick it up": "Faça uma cópia do bloco e pegue-a.", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "mapear _ sobre _", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "menu", + "message": "mensagem", + "microphone _": "_ do microfone", + "middle": "", + "minimum": "", + "minute": "minuto", + "mirror video": "espelhamento de vídeo", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruoso (10x)", + "month": "mês", + "mosaic": "mosaico", + "motion": "movimento", + "mouse down?": "mouse pressionado?", + "mouse position": "posição do mouse", + "mouse x": "posição x do mouse", + "mouse y": "posição y do mouse", + "mouse-departed": "deixado de ser tocado com o mouse", + "mouse-entered": "tocado com o mouse", + "mouse-pointer": "ponteiro do mouse", + "move": "", + "move _ steps": "mova _ passos", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "meu(s)/minha(s) _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "este ator", + "n": "n", + "name": "nome", + "neg": "", + "negative": "negativo", + "neighbors": "vizinhos", + "neighbors ≠": "", + "new costume _ width _ height _": "nova fantasia _ com largura _ e altura _", + "new line": "", + "new sound _ rate _ Hz": "nova _ com taxa de som de _ Hz", + "new...": "Nova…", + "next": "proximo", + "next costume": "próxima fantasia", + "none": "nenhum", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "não _", + "note": "", + "nothing": "", + "now connected.": "entrou.", + "number": "número", + "number of channels": "número de canais", + "numbers from _ to _": "números entre _ e _", + "o": "o", + "object _": "Objeto _", + "octagon": "", + "only duplicate this block": "Duplique apenas este bloco.", + "only face left/right": "olhe apenas para a esquerda ou para a direita", + "only grab this block": "", + "open a new window with a picture of all scripts": "Abra uma nova janela com uma fotografia de todos os roteiros.", + "open a new window with a picture of the stage": "Abrir uma nova janela com uma fotografia do palco.", + "open a new window with a picture of this comment": "Abrir uma nova janela com uma foto deste comentário.", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "Abra uma nova janela com uma fotografia deste roteiro.", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "opções…", + "or": "ou", + "or before": "ou antes", + "other clones": "outros clones", + "other scripts in sprite": "outros roteiros deste ator", + "other sprites": "outras sprites", + "p": "p", + "paint a new sprite": "Desenhar um novo ator.", + "paintbucket": "", + "parameters": "", + "parent": "pai", + "parent...": "", + "parts": "partes", + "password has been changed.": "", + "password must be six characters or longer": "A senha tem de ter pelo menos seis caracteres.", + "passwords do not match": "As senhas não correspondem.", + "paste on _": "cole sobre _", + "pause": "", + "pause all _": "pause tudo _", + "pen": "", + "pen _": "_ da caneta", + "pen down": "abaixe a caneta", + "pen down?": "caneta abaixada?", + "pen trails": "traços da caneta", + "pen up": "levante a caneta", + "pen vectors": "", + "pic...": "fotografia…", + "pick random _ to _": "escolha um valor aleatório entre _ e _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "pixelado", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "reproduzir frequência de _ Hz", + "play note _ for _ beats": "toque a nota _ durante _ batidas", + "play sound _": "toque o som _", + "play sound _ at _ Hz": "toque o som _ em _ Hz", + "play sound _ until done": "toque o som _ até o fim", + "please agree to the TOS": "Por favor concorde com os Termos do Serviço.", + "please fill out this field": "Por favor preencha este campo.", + "please provide a valid email address": "Por favor indique um endereço de email válido.", + "point in direction _": "aponte para a direção _ graus", + "point towards _": "aponte para _", + "pointRight": "", + "polygon": "", + "position": "coordenadas da posição", + "poster": "", + "predicate": "predicado", + "presentation (1.4x)": "apresentação (1.4x)", + "pressed": "pressionado", + "previous": "anterior", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "aleatória", + "random position": "posição aleatória", + "rank": "ranking", + "raw data...": "", + "ray length": "comprimento do raio", + "read-only": "apenas leitura", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "renomear…", + "release": "", + "remove block variables...": "", + "rename": "renomear", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "Qual o novo nome da fantasia?", + "rename only this reporter": "", + "rename sound": "Qual o novo nome do som?", + "rename...": "alterar o nome…", + "repeat _ _": "repita _ vezes _", + "repeat until _ _": "repita até que _ _", + "replace item _ of _ with _": "substitua o item _ de _ por _", + "report _": "reporte _", + "reporter": "repórter", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "zere o cronômetro", + "reshape _ to _": "altere as dimensões de _ para _", + "resize...": "", + "resolution": "resolução", + "rest for _ beats": "silêncio por _ batidas", + "restore display": "", + "result pic...": "", + "reverse": "reverso", + "right": "direita", + "right arrow": "seta para a direita", + "ring": "", + "ringify": "adicione anel", + "robot": "", + "rotate": "", + "rotation style": "estilo de rotação", + "rotation x": "rotação x", + "rotation y": "rotação y", + "round _": "arredondamento de _", + "run _ _": "execute _ _", + "run _ w/continuation": "execute _ com continuação", + "s": "s", + "sample morphs": "", + "sample rate": "taxa de amostragem", + "samples": "amostras", + "saturation": "saturação", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "Salvar um resumo deste projeto", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "Salve os dados do projeto como XML na sua pasta de downloads", + "saved.": "salvo.", + "say _": "diga _", + "say _ for _ secs": "diga _ por _ segundos", + "scope": "área", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "fotografia do roteiro", + "script variables _": "crie as variáveis de roteiro _", + "scripts": "", + "scripts pic...": "fotografe os roteiros…", + "scroll frame": "", + "scrolled-down": "girado com a roda do mouse para cima", + "scrolled-up": "girado com a roda do mouse para baixo", + "second": "segundo", + "select": "selecionar", + "selection": "", + "self": "eu mesmo", + "send _ to _": "enviar _ a _", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "mude o efeito _ para _", + "set _ of block _ to _": "define o/a _ do bloco _ para _", + "set _ to _": "mude _ para _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "mude o balanço para _", + "set instrument to _": "mude o instrumento para _", + "set pen _ to _": "mude o/a _ da caneta para _", + "set pen color to _": "mude a cor da caneta para _", + "set pen shade to _": "mude a intensidade da caneta para _", + "set pen size to _": "mude a espessura da caneta para _", + "set size to _ %": "mude o tamanho para _ %", + "set tempo to _ bpm": "mude o andamento para _ tempos/bpm", + "set this morph's alpha value": "", + "set turbo mode to _": "mude o modo turbo para _", + "set video transparency to _": "mude a transparência do vídeo para _", + "set volume to _ %": "mude o volume para _ %", + "set x to _": "mude x para _", + "set y to _": "mude y para _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Marque para focar em campos vazios quando estiver arrastando e soltando blocos de valor (repórteres).", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "mostrar", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "mostre todos os atores", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Mostrar as definições globais de blocos personalizados no formato XML numa nova janela do navegador.", + "show primitives": "mostre blocos primitivos", + "show project data as XML in a new browser window": "Mostrar os dados no formato XML numa nova janela do navegador.", + "show table _": "", + "show the World's menu": "", + "show variable _": "mostre variável _", + "shown?": "visível?", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "seno", + "size": "tamanho", + "slider": "", + "slider max...": "máximo do slider…", + "slider min...": "mínimo do slider…", + "slots": "campos", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "captura instantânea", + "sorted": "", + "sound": "som", + "sounds": "sons", + "space": "espaço", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "espectro", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "separe _ por _", + "sprite": "", + "sprites": "Atores", + "sqrt": "raiz quadrada", + "square": "", + "stack size": "altura da pilha", + "stage": "palco", + "stage image": "", + "stamp": "carimbe", + "standard settings": "", + "stay signed in on this computer until logging out": "manter-me autenticado neste computador\naté que saia", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "pare _", + "stop all sounds": "pare todos os sons", + "stop frequency": "parar a frequência", + "stopped": "parado", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "estique a fantasia _ em x: _ y: _ %", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "mude para a fantasia _", + "switch to scene _ _": "trocar para a cena _ _", + "t": "t", + "tab": "tabuladores", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "Tire uma foto com a webcam importe-o como um novo ator", + "tan": "tangente", + "tell _ to _ _": "diga a _ que _ _", + "tempo": "andamento", + "temporary?": "temporário?", + "text": "texto", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "valor", + "think _": "pense _", + "think _ for _ secs": "pense _ por _ segundos", + "this _": "", + "this block": "este bloco", + "this project doesn't have any custom global blocks yet": "Este projeto ainda não possui nenhum bloco global personalizado.", + "this script": "este roteiro", + "time in milliseconds": "tempo en milisegundos", + "timer": "valor do cronômetro", + "tip": "", + "to": "para", + "top": "", + "touch screen settings": "", + "touching _ ?": "tocando na cor _", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "awangenh@inf.ufsc.br, cassiano.dandrea@tagview.com.br", + "transparency": "transparência", + "transparency...": "", + "trash is empty": "O lixo está vazio", + "true": "verdadeiro", + "turbo mode": "modo turbo", + "turbo mode?": "modo turbo?", + "turn _ _ degrees": "gire _ _ graus", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "Tipo", + "type of _": "o tipo de _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "Desmarque para aumentar a velocidade permitindo ritmos variáveis das tramas nas animações.", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "desmarque para desenhar linhas com extremos arredondados", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "Desmarque para permitir que blocos repórteres soltos em um campo desalojem outros.", + "uncheck to allow script reentrance": "Desmarque para permitir reentrância nos roteiros.", + "uncheck to always show (+) symbols in block prototype labels": "Desmarque para mostrar sempre os símbolos (+) no texto dos protótipos dos blocos", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "Desmarque para desativar as animações da interface de usuário.", + "uncheck to disable alternating colors for nested block": "Desmarque para deixar de alternar as cores de blocos aninhados.", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "Desmarque para desativar nomes dinâmicos nas variáveis de entrada.", + "uncheck to disable input sliders for entry fields": "Desmarque para desativar sliders nos campos de entrada dos blocos.", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "Desmarque para desativar a composição de atores.", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "Desmarque para desabilitar o suporte para funções JavaScript nativas", + "uncheck to disable using operators on lists and tables": "desmarque para desabilitar o uso de operadores em listas e tabelas", + "uncheck to disable virtual keyboard support for mobile devices": "Desmarque para desativar o suporte ao teclado virtual para dispositivos móveis.", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "Desmarque para ativar a execução direta dos blocos clicando neles", + "uncheck to hide buttons in the palette": "Desmarque para ocultar botões na paleta", + "uncheck to hide category names in the palette": "Desmarque para ocultar os nomes das categorias na paleta", + "uncheck to hide extension primitives in the palette": "desmarque para esconder extensões primitivas na paleta", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "Desmarque para executar os roteiros na velocidade normal.", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "Desmarque para mostrar apenas os blocos da categoria selecionada", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "Desmarque para mudar as cores da caneta e efeitos gráficos para HSV", + "uncheck to turn block clicking sound off": "Desmarque para desativar o som produzido ao clicar nos blocos.", + "uncheck to turn off logging pen vectors": "Desarque para não registrar movimento da caneta como vetores", + "uncheck to turn off visible stepping": "desmarque para desativar a depuração passo a passo", + "uncheck to use solid drop shadows and highlights": "Desmarque para usar sombras e realces nítidos.", + "uncheck to use the input dialog in short form": "Desmarque para usar texto abreviado da caixa de diálogo dos parâmetros.", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "Desfazer o último posicionamento de um bloco neste painel.", + "undrop": "desfaça posicionamento", + "unicode _ as letter": "o caractere cujo código Unicode é _", + "unicode of _": "o código Unicode do caractere _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "apague anel", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Sem título", + "unused": "", + "unused block(s) removed": "", + "up arrow": "seta para cima", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "Use o teclado para inserir blocos", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "variável", + "variables": "variáveis", + "video _ on _": "_ do vídeo do(e) _", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "aguarde _ segundos", + "wait until _": "aguarde até que _", + "wardrobe": "", + "warp _": "execute atomicamente _", + "what's your name?": "qual é o seu nome?", + "when I am _": "quando eu for _", + "when I receive _ _": "quando receber _ _", + "when I start as a clone": "quando este ator começar como clone", + "when _": "quando _", + "when _ clicked": "quando clicar em _", + "when _ is edited _": "", + "when _ key pressed _": "quando a tecla _ for pressionada _", + "whirl": "redemoinho", + "whitespace": "espaços em branco", + "width": "largura", + "with data": "com dado", + "with inputs": "com argumentos", + "word": "", + "world": "mundo", + "write _ size _": "escreva _ com tamanho _", + "x": "x", + "x position": "coordenada x da posição", + "y": "y", + "y position": "coordenada y da posição", + "year": "ano", + "year:": "ano:", + "your own": "os seus próprios", + "z": "z" +} diff --git a/elements/pl-snap/Snap/locale/lang-ro.js b/elements/pl-snap/Snap/locale/lang-ro.js new file mode 100644 index 00000000..4346dfe5 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ro.js @@ -0,0 +1,1386 @@ +SnapTranslator.dict.ro = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) stanga", + "(0) up": "(0) sus", + "(1) sine": "", + "(180) down": "(180) jos", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) dreapta", + "(empty)": "(gol)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Despre Snap", + "About...": "Despre Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animatii", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Orice (necalculat)", + "Any type": "Orice tip", + "Apply": "Aplica actiunea", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Esti sigur ca vrei sa stergi?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Inapoi...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Editor de blocuri", + "Blocks": "Blocuri", + "Blocks category name:": "", + "Blurred shadows": "Umbre neclare", + "Boolean": "boolean", + "Boolean (T/F)": "Boolean (Adevarat/Fals)", + "Boolean (unevaluated)": "Boolean (necalculat)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Renunta", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Schimba blocul", + "Clear backup": "", + "Clicking sound": "Sunet la apasarea tastelor", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "", + "Command (C-shape)": "Comanda (in forma de C)", + "Command (inline)": "Comanda (pe acelasi rand)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "Continut", + "Contributors": "Contribuitori", + "Control": "", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Modificare costume", + "Costumes": "Costume", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Creaza nume", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Multumiri...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Implicit", + "Default Value:": "Valoare implicita:", + "Delete": "Sterge", + "Delete Custom Block": "Sterge blocul utilizator", + "Delete Project": "Sterge proiect", + "Delete a variable": "sterge o variabila", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Descarca codul sursa", + "Dragging threshold...": "", + "Dynamic input labels": "Etichete intrare dinamice", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Schimba nume", + "Edit label fragment": "Schimba eticheta", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Gol", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Exporta blocurile", + "Export blocks...": "Exporta blocurile...", + "Export project as plain text...": "Exporta proiectul ca text...", + "Export project...": "Exporta proiectul...", + "Export summary with drop-shadows...": "", + "Export summary...": "Exporta sumarul...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Design cu colturi", + "Flat line ends": "Sfarsit de linii cu colturi", + "For all Sprites": "Pentru toate animatiile", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Salut!", + "Hello, World!": "", + "Help": "Ajutor", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Hmmm...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Importa blocurile", + "Import library": "Importa biblioteca", + "Import sound": "", + "Import tools": "Importa unelte", + "Import...": "", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Suport pentru mostenire", + "Input Names:": "Numele intrarii:", + "Input Slot Options": "", + "Input name": "Nume", + "Input sliders": "Slidere pentru intrare", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Editare tastatura", + "Kind of": "De tipul", + "LEAP Motion controller": "", + "Language...": "Selecteaza limba...", + "Libraries...": "Biblioteci...", + "License": "Licenta", + "License...": "Licenta...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Lista", + "List utilities": "", + "Lists": "Liste", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Autentificare...", + "Logout": "", + "Long form input dialog": "Dialoguri lungi", + "Looks": "Infatisare", + "Make a block": "creaza bloc", + "Make a variable": "creaza o variabila", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Mesaj", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Componente...", + "Motion": "Miscare", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Intrari multiple (dintr-o lista)", + "Nested auto-wrapping": "", + "New": "", + "New Category": "", + "New Project": "Proiect nou", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nu", + "November": "", + "Number": "Nume", + "OK": "", + "Object": "Obiect", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Deschide proiect", + "Open in Community Site": "", + "Open...": "Deschide...", + "Opening project...": "", + "Operators": "Operatori", + "Other": "Altele", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "Parte din", + "Parts": "Parti", + "Password:": "", + "Pen": "Scriere", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Etichete simple", + "Play": "Ruleaza", + "Play sound": "Ruleaza sunet", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "", + "Prefer empty slot drops": "Foloseste slot drops goale", + "Prefer smooth animations": "Animatii fluide", + "Privacy...": "", + "Project Notes": "Note de proiect", + "Project URLs": "", + "Project notes...": "Note de proiect...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Manual utilizator", + "Remove a category...": "", + "Remove unused blocks": "Sterge blocurile nefolosite", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Inlocuieste proiectul cu un altul?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Salveaza", + "Save As...": "Salveaza sub numele...", + "Save Project": "", + "Save Project As...": "Salveaza proiectul sub alt nume...", + "Save to disk": "Salveaza pe disc", + "Saved!": "Salvat!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "variabila script", + "Scripts": "Scripturi", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Interactiune", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Creaza-ti cont...", + "Single input.": "Intrare.", + "Single palette": "", + "Slider maximum value": "Valoare maxima slidere", + "Slider minimum value": "Valoare minima slidere", + "Snap! website": "Siteul Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Sunet", + "Sound Recorder": "", + "Sounds": "Sunete", + "Sprite": "Animatie", + "Sprite Nesting": "", + "Stage": "Scena", + "Stage height": "Inaltime scena", + "Stage selected: no motion primitives": "Scena selectata: fara primitive de miscare", + "Stage size": "Marime scena", + "Stage size...": "Marime scena...", + "Stage width": "Latime scena", + "Stop": "Opreste", + "Stop sound": "Opreste sunet", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Treci in modul utilizator", + "Switch to dev mode": "Treci in modul dezvoltator", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Scripturi thread-safe", + "Title text": "Text titlu", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Traduceri", + "Translators...": "Traducatori", + "Turbo mode": "Modul turbo", + "Turtle": "Broasca", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "fara nume", + "Unused blocks...": "Blocuri nefolosite...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Fa variabilele locale vizibile blocului chemator", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "numele variabilei", + "Variables": "Variabile", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Tastatura pe ecran", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Da", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Culoare zebra", + "Zoom blocks": "Nivel zoom blocuri", + "Zoom blocks...": "Marimeblocuri...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ contine _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ in fata _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ din _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "val absoluta", + "acos": "acos", + "add _ to _": "adauga _ la _", + "add a new Turtle sprite": "", + "add a new sprite": "adauga o noua animatie", + "add comment": "adauga comentariu", + "add comment here...": "adauga comentariu...", + "agent": "", + "alert _": "anunta _", + "all": "toate", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "toate, mai putin primul din _", + "all but this script": "toate scripturile, mai putin pe acesta", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "si", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "raspuns", + "any": "", + "any key": "", + "any message": "orice mesaj", + "anything": "", + "append _": "", + "arrange scripts vertically": "Afiseaza scripturile vertical", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "intreaba _ si asteapta", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "mare (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "textul pentru stergerea unui bloc", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blocuri", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "luminozitate", + "broadcast _ _": "trimite mesajul _ _ tuturor", + "broadcast _ _ and wait": "trimite mesajul _ _ tuturor si asteapta", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "apeleaza _ cu _", + "call _ w/continuation": "apeleaza _ cu Continuation", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "rotire libera", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "rotunjire in sus", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "modifica _ cu _", + "change _ effect by _": "modifica efectul _ cu _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "modifica culoarea stiloului cu _", + "change pen shade by _": "modifica umbra stiloului cu _", + "change pen size by _": "modifica grosimea penitei cu _", + "change size by _": "modifica marimea cu _", + "change tempo by _": "modifica tempoul cu _", + "change volume by _": "", + "change x by _": "modifica x cu _", + "change y by _": "modifica y cu _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "bifeaza pentru sfarsit de linii cu colturi", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "bifeaza pentru afisare fluida pe ecran in detrimentul vitezei", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "bifeaza pentru a afisa tipuri slotN in dialoguri de intrare", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "bifeaza pentru a interzice reentranta in scripturi", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "bifeaza pentru a activa animatiile IDE", + "check to enable alternating colors for nested blocks": "bifeaza pentru a folosi culori alternative in blocurile imbricate", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "difeaza pentru a folosi etichete dinamice pentru intrari variabile", + "check to enable input sliders for entry fields": "bifeaza pentru a afisa slidere in campurile de intrare", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "bifeaza pentru a afisa tastatura pe ecranul echipamentelor mobile", + "check to hide (+) symbols in block prototype labels": "bifeaza pentru a ascunde (+) in blocurile eticheta", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "bifeaza pentru a da prioritate executiei scripului", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "bifeaza pentru sunete la schimbare blocuri", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "bifeaza pentru a utiliza umbre neclare si evidentieri", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "curata", + "clear": "sterge", + "clear graphic effects": "anuleaza efectele grafice", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "apasa mouseul sau trage de cursor pentru a muta centrul de rotatie", + "clicked": "apasat", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "culoarea _ atinge _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "glumet", + "command": "", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "contetti", + "console log _": "jurnal consola: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "costumul nr", + "costume name": "", + "costumes": "", + "costumes tab help": "ajutor pentru costume", + "could not connect to:": "", + "cr": "enter", + "create a clone of _": "creaza o clona a _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "versiuni componente:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "sterge", + "delete _": "", + "delete _ of _": "sterge _ din _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "sterge definitia blocului....", + "delete slot": "", + "delete this clone": "sterge aceasta clona", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "demonstratie (1.2x)", + "demo...": "", + "detach all parts": "desparte toate bucatile", + "detach and put into the hand": "", + "detach from": "desparte", + "development mode": "modul dezvoltare", + "development mode debugging primitives:": "Modul dezvoltare primitive de debug:", + "development mode...": "", + "dimensions": "", + "direction": "directia", + "disable deep-Morphic context menus and show user-friendly ones": "Afiseaza meniuri simplificate in locul celor morfice", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "distanta pana la _", + "distribution": "", + "don't rotate": "fara rotire", + "down arrow": "sageata jos", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "poate fi mutat", + "draggable?": "", + "dragging threshold": "", + "dropped": "eliberat", + "duplicate": "", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "margine", + "edit": "modifica", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "modifica...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "Afiseaza meniuri morfice in locul celor simplificate", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "", + "extract": "", + "f": "f", + "false": "", + "file": "", + "file menu import hint": "indiciu import meniul fisiere", + "fill": "", + "fill page...": "", + "filtered for _": "filtrat pentru _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "cauta blocuri utilizator nefolosite si sterge-le", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "rotunjire in jos", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "pentru toate animatiile", + "for each _ in _ _": "", + "for this sprite only": "doar pentru aceasta animatie", + "forever _": "la infinit _", + "frame": "", + "frames": "cadre", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "umbra", + "giant (8x)": "gigant (8x)", + "glide _ secs to x: _ y: _": "mergi in _ secunde la x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "muta spre spate _ niveluri", + "go to _": "mergi la _", + "go to _ layer": "", + "go to front": "adu in fata", + "go to x: _ y: _": "mergi la x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "salut", + "help": "ajutor", + "help...": "ajutor...", + "hide": "ascunde", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "Ascunde primitivele", + "hide variable _": "ascunde variabila _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "enorm (4x)", + "i": "i", + "identical to": "identic cu", + "if _ _": "daca _ fa _", + "if _ _ else _": "daca _ fa _ altfel fa _", + "if _ then _ else _": "", + "if on edge, bounce": "daca esti pe margine, sari", + "import a sound from your computer by dragging it into here": "adauga un sunet tragandu-l aici", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "lista intrare:", + "input names:": "numele intrarii:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "adauga _ la pozitia _ in _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "este _ ?", + "is _ a _ ?": "este _ un/o _ ?", + "is _ empty?": "", + "is _ identical to _ ?": "este _ identic cu _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "elementul _ din _", + "items": "", + "j": "j", + "join _": "lipeste _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "este tasta _ apasata?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Romanian", + "language_translator": "Cristian Macarascu", + "large": "mare", + "last": "ultimul", + "last changed": "", + "last_changed": "2015-10-24", + "launch _ _": "porneste _ cu _", + "left": "", + "left arrow": "sageata stanga", + "length": "", + "length of _": "lungimea lui _", + "length:": "lungime:", + "let the World automatically adjust to browser resizing": "", + "letter": "litera", + "letter _ of _": "litera _ din _", + "light (70)": "", + "lightness": "", + "line": "linie", + "lines": "", + "list": "lista", + "list _": "lista _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "incarca biblioteca oficiala de blocuri importante", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "creaza bloc...", + "make a category...": "", + "make a copy and pick it up": "fa o copie si selecteaz-o", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "mesaj", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "monstruos (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "este mouseul apasat?", + "mouse position": "", + "mouse x": "pozitia x a mouseului", + "mouse y": "pozitia y a mouseului", + "mouse-departed": "indepratat de langa mouse", + "mouse-entered": "in contact cu mouse-ul", + "mouse-pointer": "cursor mouse", + "move": "muta", + "move _ steps": "inainteaza _ pasi", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "eu insumi", + "n": "n", + "name": "", + "neg": "", + "negative": "negativ", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "", + "next": "", + "next costume": "urmatorul costum", + "none": "nici un/o", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "", + "note": "", + "nothing": "", + "now connected.": "", + "number": "numar", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "duplica doar acest bloc", + "only face left/right": "doar stanga/dreapta", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "Deschide o noua fereastra de browser cu sumarul acestui proiect", + "open a new window with a picture of all scripts": "afiseaza imaginea scripturilor intr-o noua fereastra", + "open a new window with a picture of the stage": "deschide o imagine a scenei intr-o fereastra noua", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "deschide fereastra noua cu imaginea acestui script", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "sau", + "or before": "", + "other clones": "", + "other scripts in sprite": "toate scripturile din animatie", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "pune pauza pentru _", + "pen": "", + "pen _": "", + "pen down": "stiloul jos", + "pen down?": "", + "pen trails": "urme stilou", + "pen up": "stiloul sus", + "pen vectors": "", + "pic...": "imagine...", + "pick random _ to _": "alege aleator de la _ la _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "canta nota _ pentru _ masuri", + "play sound _": "scoate sunetul _", + "play sound _ at _ Hz": "", + "play sound _ until done": "scoate sunetul _ pana termini", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "arata spre directia _", + "point towards _": "arata spre _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "", + "presentation (1.4x)": "prezentare (1.4x)", + "pressed": "tinut apasat", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "oricare", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "redenumeste...", + "release": "", + "remove block variables...": "", + "rename": "redenumeste", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "redenumeste costum", + "rename only this reporter": "", + "rename sound": "redenumeste sunet", + "rename...": "redenumeste...", + "repeat _ _": "repeta de _ ori _", + "repeat until _ _": "repeta pana cand _ _", + "replace item _ of _ with _": "inlocuieste elementul _ din _ cu _", + "report _": "anunta _", + "reporter": "", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "restarteaza cronometrul", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "pauza pentru _ masuri", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "sageata dreapta", + "ring": "", + "ringify": "", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ rotunjit", + "run _ _": "ruleaza _ cu _", + "run _ w/continuation": "ruleaza _ cu Continuation", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "spune _", + "say _ for _ secs": "spune _ pentru _ secunde", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "imagine script...", + "script variables _": "variabilele script _", + "scripts": "", + "scripts pic...": "imagine scripturi...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "selecteaza", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "schimba efectul _ in _", + "set _ of block _ to _": "", + "set _ to _": "schimba _ in _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "schimba culoarea stiloului in _", + "set pen shade to _": "schimba umbra stiloului in _", + "set pen size to _": "schimba grosimea penitei in _", + "set size to _ %": "schimba marimea la _ %", + "set tempo to _ bpm": "schimba tempoul in _ bpm", + "set this morph's alpha value": "", + "set turbo mode to _": "seteaza modul turbo la _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "schimba x in _", + "set y to _": "schimba y in _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "indicii de slot goale in meniul setari", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "afiseaza", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "afiseaza tot", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "afiseaza definitiile blocurilor ca XML intr-o fereastra noua de browser", + "show primitives": "Afiseaza primitivele", + "show project data as XML in a new browser window": "afiseaza continut proiect ca XML in fereastra noua de browser", + "show table _": "", + "show the World's menu": "", + "show variable _": "afiseaza variabila _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "marime", + "slider": "", + "slider max...": "slider maxim...", + "slider min...": "slider minim...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "spatiu", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "desparte _ folosind _", + "sprite": "", + "sprites": "", + "sqrt": "radical", + "square": "", + "stack size": "marimea stivei", + "stage": "", + "stage image": "", + "stamp": "stampila", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "opreste _", + "stop all sounds": "opreste toate sunetele", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Salveaza proiectul in meniul Descarcari (functie de browser)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "schimba-te in costumul _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "test", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "nu exista blocuri utilizator nefolosite in acest proiect", + "there are currently no vectorizable pen trail segments": "", + "thing": "lucru", + "think _": "gandeste _", + "think _ for _ secs": "gandeste _ pentru _ secunde", + "this _": "", + "this block": "acest bloc", + "this project doesn't have any custom global blocks yet": "acest proiect nu are blocuri globale", + "this script": "acest script", + "time in milliseconds": "", + "timer": "cronometrul", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "atinge _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "adevarat", + "turbo mode": "", + "turbo mode?": "modul turbo?", + "turn _ _ degrees": "roteste _ _ grade", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "tipul lui _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "debifeaza pentru viteza mai mare in detrimentul afisarii pe ecran", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "debifeaza pentru sfarsit de linii rotunjite", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "debifeaza pentru a folosi reporteri pentru a elimina altii", + "uncheck to allow script reentrance": "debifeaza pentru a permite reentranta in scripturi", + "uncheck to always show (+) symbols in block prototype labels": "debifeaza pentru a folosi (+) in blocurile eticheta", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "debifeaza pentru a dezactiva animatiile IDE", + "uncheck to disable alternating colors for nested block": "debifeaza pentru a folosi culori obisnuite in blocurile imbricate", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "debifeaza pentru a renunta la etichete dinamice pentru intrari variabile", + "uncheck to disable input sliders for entry fields": "debifeaza pentru a ascunde sliderele campurilor de intrare", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "debifeaza pentru a ascunde tastatura de pe ecranul echipamentelor mobile", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "debifeaza pentru a rula scripul la viteza normala", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "debifeaza pentru a opri sunete la schimbarea blocurilor", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "debifeaza pentru a utiliza umbre clare si evidentieri", + "uncheck to use the input dialog in short form": "debifeaza pentru a afisa dialoguri de intrare in forma scurta", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "renunta la ultimul drop de block in aceasta fereastra", + "undrop": "", + "unicode _ as letter": "codul Unicode _ ca litera", + "unicode of _": "codul Unicode al _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "fara nume", + "unused": "", + "unused block(s) removed": "blocuri nefolosite eliminate", + "up arrow": "sageata sus", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "asteapta _ secunde", + "wait until _": "asteapta pana cand _", + "wardrobe": "", + "warp _": "", + "what's your name?": "care e numele tau?", + "when I am _": "cand sunt _", + "when I receive _ _": "cand primesc _ _", + "when I start as a clone": "cand sunt pornit ca o clona", + "when _": "", + "when _ clicked": "cand se apasa _", + "when _ is edited _": "", + "when _ key pressed _": "cand se apasa tasta _ _", + "whirl": "", + "whitespace": "spatiu", + "width": "", + "with data": "", + "with inputs": "cu intrari", + "word": "", + "world": "lume", + "write _ size _": "", + "x": "x", + "x position": "pozitia x", + "y": "y", + "y position": "pozitia y", + "year": "", + "year:": "", + "your own": "al tau", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ru.js b/elements/pl-snap/Snap/locale/lang-ru.js new file mode 100644 index 00000000..0ee10a97 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ru.js @@ -0,0 +1,1378 @@ +SnapTranslator.dict.ru = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) налево", + "(0) up": "(0) вверх", + "(1) sine": "(1) синус (sine)", + "(180) down": "(180) вниз", + "(2) square": "(2) квадрат (square)", + "(3) sawtooth": "(3) пила (sawtooth)", + "(4) triangle": "(4) треугольник (triangle)", + "(90) right": "(90) направо", + "(empty)": "(пусто)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "О программе", + "About...": "О программе...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Aнимация", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Любой (неопределенный)", + "Any type": "Любой тип", + "Apply": "Применить", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Вы уверены вы хотите удалить?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Bозврат...", + "Backgrounds": "Фоны", + "Backup failed. This cannot be undone, proceed anyway?": "Создание резервной копии не удалось. Это не может быть отменено. Продолжить?", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "в растровый формат", + "Block Editor": "Редактор блоков", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Контрастность тени", + "Boolean": "булев", + "Boolean (T/F)": "Булев (И/Л)", + "Boolean (unevaluated)": "Булев (неопределенный)", + "Bottom": "Вниз", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Размер кисти", + "Cache Inputs": "", + "Camera": "Камера", + "Camera not supported": "Ошибка подключения к камере", + "Camera support": "", + "Cancel": "Отменить", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "Изменить пароль...", + "Change block": "Заменить блок", + "Clear backup": "", + "Clicking sound": "Звук щелчка", + "Closed brush (free draw)": "Произвольная замкнутая кривая", + "Cloud": "", + "Code mapping": "", + "Codification support": "Поддержка кодификации блоков", + "Colors and Crayons": "", + "Command": "Команда", + "Command (C-shape)": "Команда (С-форма)", + "Command (inline)": "Команда (встроенная)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Сохранять пропорции фигур (круг, квадрат)? Так же можно использовать Shift", + "Contents": "", + "Contributors": "Участники", + "Control": "Управление", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Редактор костюмов", + "Costumes": "Костюмы", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Определить имя вводимых данных", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Сотрудники...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "По умолчанию", + "Default Value:": "Значение по умолчанию:", + "Delete": "Удалить", + "Delete Custom Block": "Удалить Пользовательский Блок", + "Delete Project": "Удалить Проект", + "Delete a variable": "Удалить переменную", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "Ниже", + "Download source": "Загрузить исходники программы", + "Dragging threshold...": "", + "Dynamic input labels": "Использование динамических обозначений", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Цвет линии (левая кн. мыши)", + "Edit input name": "Редактировать имя вводимых данных", + "Edit label fragment": "Редактировать фрагмент обозначения", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Эллипс (shift: окружность)", + "Empty": "Пусто", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Ластик", + "Error": "", + "Examples": "Примеры", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Экспорт блоки", + "Export blocks...": "Экспортировать блоки...", + "Export project as plain text...": "Экспортировать проект как текстовый файл...", + "Export project...": "Экспортировать проект...", + "Export summary with drop-shadows...": "", + "Export summary...": "Сводка экспортируемых данных...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Обесцвечивание блоков", + "Fade blocks...": "Обесцвечивание блоков...", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "Заливка", + "Fill color (right click)": "Цвет заливки (прав. кн. мыши)", + "Filled Ellipse (shift: circle)": "Закрашенный эллипс (shift: окружность)", + "Filled Rectangle (shift: square)": "Закрашенный прямоугольник (shift: квадрат)", + "First-Class Sprites": "", + "Flat design": "Плоский дизайн", + "Flat line ends": "Прямоугольные завершения линий", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Привет!", + "Hello, World!": "", + "Help": "Справка", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "Хмм...", + "Hummingbird robotics": "", + "Hyper blocks support": "Поддержка гиперблоков", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Сделать костюм из фотографии вебкамерой", + "Import blocks": "Импорт блоки", + "Import library": "Загрузка библиотек", + "Import sound": "", + "Import...": "Импорт...", + "Imported": "Импортировано", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Поддержка наследования", + "Input Names:": "Имена Вводимых Данных:", + "Input Slot Options": "", + "Input name": "Имя вводимых данных", + "Input sliders": "Использование бегунков ввода", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "функция на JavaScript ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Редактирование с клавиатуры", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Язык...", + "Libraries...": "Библиотеки...", + "License": "Лицензия", + "License...": "Лицензия...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "Линия (shift: с шагом 45°)", + "Line tool (shift: vertical/horizontal)": "Линия (shift: вертикальная/горизонтальная)", + "List": "Список", + "List utilities": "", + "Lists": "Списки", + "Live coding support": "", + "Loading": "Загрузка", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Сохранять линии пера в векторном виде", + "Login...": "Войти в аккаунт...", + "Logout": "Выйти из аккаунта", + "Long form input dialog": "Расширенная форма диалога ввода", + "Looks": "Внешность", + "Make a block": "Новый блок", + "Make a variable": "Объявить переменную", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Название сообщения", + "Method Editor": "Редактор методов", + "Microphone": "Микрофон", + "Microphone resolution...": "Разрешение микрофона...", + "Modules...": "Модули...", + "Motion": "Движение", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Многократный ввод (список)", + "Nested auto-wrapping": "", + "New": "Новый проект", + "New Category": "", + "New Project": "Новый Проект", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Нет", + "November": "", + "Number": "Число", + "OK": "", + "Object": "Объект", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Открыть", + "Open Project": "Открыть Проект", + "Open in Community Site": "", + "Open...": "Открыть...", + "Opening project...": "", + "Operators": "Операторы", + "Other": "Прочее", + "Output text using speech synthesis.": "", + "Paint Editor": "Растровый редактор костюмов", + "Paint a new costume": "Нарисовать новый костюм", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "Кисть (свободное рисование)", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Перо", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Пипетка (взять цвет кликом на любую точку)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Пипетка (взять цвет кликом на любую точку, shift: цвет заливки):", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Простые заголовки блоков", + "Play": "Воспроизводить", + "Play sound": "Воспроизводить звук", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Пожалуйста, убедитесь, что ваш браузер обновлён до последней версии, а камера корректно настроена. Некоторые браузеры для работы камеры могут требовать подключения к Snap! по протоколу HTTPS. Пожалуйста, замените в адресной строке символы \"http://\" на \"https://\" и попробуйте ещё раз.", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Предикат", + "Prefer empty slot drops": "Использование незанятых ячеек ввода", + "Privacy...": "", + "Project Notes": "Проектные Записки", + "Project URLs": "", + "Project notes...": "Проектные Записки...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "Опубликовать", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Записать новый звук", + "Recover": "Восстановить", + "Rectangle (shift: square)": "Прямоугольник (shift: квадрат)", + "Reference manual": "Справочное руководство", + "Remove a category...": "", + "Remove unused blocks": "Удалить неиспользуемые блоки", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Заменить данный проект на новый?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Генератор значений", + "Request blocked": "", + "Resend Verification Email...": "Выслать ещё раз письмо для подтверждения e-mail...", + "Resend verification email": "", + "Reset Password...": "Сбросить пароль...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Поддержка технологии Retina display", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Сохранить", + "Save As...": "Сохранить как...", + "Save Project": "Сохранить проект", + "Save Project As...": "Сохранить Проект как...", + "Save to disk": "Сохранить на диск", + "Saved!": "Сохранен!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Имя переменной скрипта", + "Scripts": "Скрипты", + "Select a costume from the media library": "Выбор костюма из библиотеки изображений", + "Select a sound from the media library": "Выбор звука из медиа-библиотеки", + "Select categories of additional blocks to add to this project.": "выбрать дополнительные библиотеки блоков для добавления к проекту", + "Selection tool": "Выделение", + "Sensing": "Сенсоры", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "Установка центра вращения", + "Share": "Поделиться", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Зарегистрироваться...", + "Single input.": "Единичный ввод.", + "Single palette": "", + "Slider maximum value": "Бегунок - max значение", + "Slider minimum value": "Бегунок - min значение", + "Snap! website": "Веб-сайт программы Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Звук", + "Sound Recorder": "", + "Sounds": "Звуки", + "Sprite": "Спрайт", + "Sprite Nesting": "", + "Stage": "Сцена", + "Stage height": "Высота сцены", + "Stage selected: no motion primitives": "Выбрана сцена: нет блоков движения", + "Stage size": "Размер сцены", + "Stage size...": "Размер сцены...", + "Stage width": "Ширина сцены", + "Stop": "Стоп", + "Stop sound": "Остановить звук", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Эллипс (shift: окружность)", + "Stroked Rectangle (shift: square)": "Прямоугольник (shift: квадрат)", + "Switch back to user mode": "Вернуться в режим пользователя", + "Switch to dev mode": "перейти в режим разрабатываемой версии", + "Switch to vector editor?": "", + "Table lines": "Выделить линии у таблицы", + "Table support": "Поддержка таблиц", + "Table view": "Табличный вид", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Текст", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Защищенность скрипта в многопоточном режиме", + "Title text": "Заголовок текста", + "Today": "Сегодня", + "Today,": "", + "Top": "Наверх", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Переводы", + "Translators...": "Переводчики", + "Turbo mode": "Режим Турбо", + "Turtle": "Стрела", + "Undelete sprites...": "", + "Unpublish": "Не публиковать", + "Unpublish Project": "", + "Unsaved Changes!": "Несохранённые изменения!", + "Unshare": "Не делиться", + "Unshare Project": "", + "Untitled": "Неозаглавленный", + "Unused blocks...": "Неиспользуемые блоки...", + "Unverified account:": "", + "Up": "Выше", + "Updating project list...": "Обновление списка проектов...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Сделать внутреннюю переменную видимой извне", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Имя переменной", + "Variables": "Переменные", + "Variadic reporters": "", + "Vector": "в векторный формат", + "Vector Paint Editor": "Векторный редактор костюмов", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Виртуальная клавиатура", + "Visible stepping": "Отображение шагов выполнения", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Да", + "Yesterday": "Вчера", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Использование альтернативных цветов", + "Zoom blocks": "Масштаб блоков кода", + "Zoom blocks...": "Масштаб блоков кода...", + "_ at _": "получить _ в точке _", + "_ combine _ using _": "", + "_ contains _": "_ содержит _", + "_ effect": "значение эффекта _", + "_ find first item _ in _": "", + "_ in front of _": "_ впереди _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ по модулю _", + "_ of _": "_ у _", + "_ of block _": "", + "_ of costume _": "_ костюма _", + "_ of sound _": "_ звука _", + "_ of text _": "", + "_ to _": "_ до _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "новый клон _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "абсолютное значение", + "acos": "acos", + "add _ to _": "добавить _ к _", + "add a new Turtle sprite": "создать новый стандартный спрайт", + "add a new sprite": "Добавить новый спрайт", + "add comment": "добавить комментарий", + "add comment here...": "добавьте комментарий сюда...", + "agent": "", + "alert _": "предупреждение _", + "all": "всё", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "все кроме первого из _", + "all but this script": "всех, кроме меня", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "якорь", + "and": "и", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "ответ", + "any": "любой", + "any key": "любая клавиша", + "any message": "любое сообщение", + "anything": "", + "append _": "объединить _", + "arrange scripts vertically": "разместить скрипты вертикально", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "спросить _ и ждать", + "ask _ for _ _": "запросить у _ информацию _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "задний", + "balance": "баланс", + "big (2x)": "большой (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Вы уверены вы хотите удалить этот блок?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "представить как блок", + "blocks": "блоки", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "нижняя граница", + "box": "", + "brightness": "яркость", + "broadcast _ _": "разослать _ _", + "broadcast _ _ and wait": "разослать _ _ и ждать", + "brush": "", + "build": "создавай", + "but getting a": "", + "c": "c", + "call _ _": "вызвать _ _", + "call _ w/continuation": "вызвать _ с продолжением", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "вращаемый", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "округление до большего", + "center": "центр", + "center x": "x центра спрайта", + "center y": "y центра спрайта", + "change _ by _": "изменить _ на _", + "change _ effect by _": "изменить эффект _ на _", + "change background _ by _": "изменить _ фона на _", + "change balance by _": "изменить баланс на _", + "change pen _ by _": "изменить _ пера на _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "изменить размер пера на _", + "change size by _": "изменить размер на _", + "change tempo by _": "изменить темп на _", + "change volume by _": "изменить громкость на _", + "change x by _": "изменить х на _", + "change y by _": "изменить y на _", + "check for alternative GUI design": "отметьте для включения альтернативного дизайна среды разработки", + "check for block to text mapping features": "", + "check for flat ends of lines": "отметьте, чтобы отключить закругления на концах нарисованных линий", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "отметьте, чтобы использовать высокое разрешение это увеличит нагрузку на ресурсы компьютера", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "отметьте, чтобы указывать типы ячеек ввода в диалоге ввода", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "отметьте, чтобы отключить перезапуск скрипта до его завершения", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "отметьте, чтобы разрешить IDE aнимацию", + "check to enable alternating colors for nested blocks": "отметьте, чтобы разрешить использование перемежающихся цветов для вложенных блоков", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "отметьте, чтобы разрешить использование динамических обозначений при вводе с переменным числом аргументов", + "check to enable input sliders for entry fields": "отметьте, чтобы разрешить использование бегунков при заполнении полей ввода", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "включите возможность применять стандартные операторы к спискам и таблицам", + "check to enable virtual keyboard support for mobile devices": "отметьте, чтобы разрешить использование виртуальной клавиатуры для мобильных устройств", + "check to hide (+) symbols in block prototype labels": "отметьте, чтобы отключить (+) при редактировании заголовка в редакторе блоков", + "check to inherit from": "отметьте чтобы унаследовать от", + "check to prevent contents from being saved": "отметьте чтобы не сохранять значение переменной в проекте", + "check to prioritize script execution": "отметьте, чтобы ускорить выполнение скрипта", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "отметьте, чтобы включить звук при щелчке на блок", + "check to turn on logging pen vectors": "включите чтобы линии пера сохранялись в векторном виде (как объекты)", + "check to turn on visible stepping (slow)": "отметьте, чтобы отображались шаги выполнения скрипта (медленно)", + "check to use blurred drop shadows and highlights": "отметьте, чтобы использовать размытые тени и подсветки", + "children": "потомок", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "упорядочить", + "clear": "очистить всё", + "clear graphic effects": "убрать эффекты", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "щелкните или перетащите перекрестье чтобы переместить центр вращения", + "clicked": "кликнут", + "clone": "клонировать", + "clones": "клоны", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "цвет", + "color _ is touching _ ?": "цвет _ касается _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "скомбинировать элементы _ с помощью _", + "comic": "комикс", + "command": "команда", + "comment pic...": "изображение комментария...", + "compile": "Компилировать", + "compile _": "компилировать _", + "compile _ for _ args": "", + "confetti": "конфетти", + "console log _": "консоль-регистрация _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "костюм", + "costume #": "костюм №", + "costume name": "", + "costumes": "костюмы", + "costumes tab help": "Вы можете перенести и бросить сюда изображение со своего компьютера", + "could not connect to:": "", + "cr": "концам строк", + "create a clone of _": "клонировать _", + "cross": "", + "crosshairs": "", + "current": "текущий", + "current _": "сейчас _", + "current module versions:": "Версии модулей:", + "current parent": "родитель спрайта", + "custom?": "", + "cut from _": "вырезать из _", + "d": "d", + "dangling?": "подвешенный?", + "data": "", + "date": "день", + "day of week": "день недели", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "удалить", + "delete _": "", + "delete _ of _": "удалить _ из _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "удалить определение блока...", + "delete slot": "", + "delete this clone": "удалить этого клона", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "для демонстрации (1.2x)", + "demo...": "", + "detach all parts": "открепить все части", + "detach and put into the hand": "", + "detach from": "открепить от", + "development mode": "Разрабатываемая версия", + "development mode debugging primitives:": "Разрабатываемая версия отладка примитивов:", + "development mode...": "", + "dimensions": "", + "direction": "направление", + "disable deep-Morphic context menus and show user-friendly ones": "отключить deep-Morphic контекст меню", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "расстояние", + "distance to _": "", + "distribution": "", + "don't rotate": "не вращаемый", + "down arrow": "стрелка вниз", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "движимый", + "draggable?": "движимый?", + "dragging threshold": "", + "dropped": "бросят", + "duplicate": "продублировать", + "duplicate block definition...": "дублировать определение блока...", + "duration": "длительность", + "e": "e", + "e^": "e^", + "edge": "края", + "edit": "редактировать", + "edit rotation point only...": "", + "edit the costume's rotation center": "указать центр вращения для костюма", + "edit...": "редактировать...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "включить Morphic контекст меню", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "экспорт", + "export block definition...": "экспорт определения блока...", + "export pen trails line segments as SVG": "экспортировать линии пера в векторном формате (SVG)", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "экспорт...", + "extract": "извлечь", + "f": "f", + "false": "ложь", + "file": "", + "file menu import hint": "загрузить экспортированный проект или библиотеку блоков, костюм или звук", + "fill": "заливка", + "fill page...": "", + "filtered for _": "отфильтровано для _", + "find blocks": "найти блоки...", + "find blocks...": "", + "find first item _ in _": "первый подходящий под _ из _", + "find unused global custom blocks and remove their definitions": "поиск и удаление неиспользуемых блоков", + "fisheye": "рыбий глаз", + "flag": "", + "flash": "", + "flat line ends": "прямоугольные завершения линий", + "flatten": "", + "flip horizontal": "отразить ↔", + "flip vertical": "отразить ↕", + "flip ↔": "", + "flip ↕": "", + "floor": "округление до меньшего", + "footprints": "", + "for _ = _ to _ _": "для _ от _ до _ _", + "for all sprites": "для всех спрайтов", + "for each _ in _ _": "для каждого _ из _ _", + "for this sprite only": "только для текущего спрайта", + "forever _": "непрерывно _", + "frame": "", + "frames": "рамки", + "frequencies": "", + "frequency": "частота", + "front": "передний", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "прозрачность", + "giant (8x)": "гигантский (8x)", + "glide _ secs to x: _ y: _": "скользить _ сек к x _ y _", + "global?": "", + "globe": "", + "go back _ layers": "переместиться на _ слоёв назад", + "go to _": "перейти в точку _", + "go to _ layer": "перейти на _ слой", + "go to x: _ y: _": "перейти в точку x _ y _", + "gray scale palette": "", + "green": "", + "grow": "увеличить", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "высота", + "hello": "Привет", + "help": "Справка", + "help...": "справка...", + "hide": "спрятаться", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "скрыть стандартные блоки", + "hide variable _": "спрятать переменную _", + "high": "высокое", + "hour": "часов", + "http:// _": "", + "hue": "тон", + "huge (4x)": "огромный (4x)", + "i": "i", + "identical to": "тождественно", + "if _ _": "если _ _", + "if _ _ else _": "если _ _ иначе _", + "if _ then _ else _": "если _ то _ иначе _", + "if on edge, bounce": "на границе развернуться", + "import a sound from your computer by dragging it into here": "Вы можете перенести и бросить сюда звуковой файл со своего компьютера", + "import without attempting to parse or format data": "импортировать данные из файла без парсинга и форматирования", + "import...": "импорт...", + "in palette": "", + "including dependencies": "включая блоки, вызываемые данным (зависимости)", + "index": "номер", + "index of _ in _": "номер элемента _ в _", + "inherit _": "наследовать _", + "inherited": "наследовать", + "input list:": "вводимый список:", + "input names:": "имена вводимых данных:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "встав. _ в позицию _ в _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ ?", + "is _ a _ ?": "_ это _ ?", + "is _ empty?": "_ пуст?", + "is _ identical to _ ?": "_ тождественно _ ?", + "is _ on?": "_ включено?", + "is not a valid option": "", + "is read-only": "", + "item": "элемент", + "item _ of _": "элемент _ из _", + "items": "элементы", + "j": "j", + "join _": "объединить _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "все подходящие под _ из _", + "key": "", + "key _ pressed?": "клавиша _ нажата?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Русский", + "language_translator": "Svetlana Ptashnaya, Проскурнёв Артём, Pavel Belousov", + "large": "масштабированный", + "last": "последний", + "last changed": "", + "last_changed": "2020-12-22", + "launch _ _": "запустить _ _", + "left": "левая граница", + "left arrow": "стрелка влево", + "length": "длина", + "length of _": "длина _", + "length:": "длина:", + "let the World automatically adjust to browser resizing": "", + "letter": "буквам", + "letter _ of _": "_ буква слова _", + "light (70)": "", + "lightness": "", + "line": "строкам", + "lines": "", + "list": "список", + "list _": "список _", + "list view...": "в виде списка...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "сохранять линии пера в вект. виде", + "login": "", + "loop": "", + "low": "низкое", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "новый блок...", + "make a category...": "", + "make a copy and pick it up": "скопировать и запомнить", + "make a morph": "", + "make temporary and hide in the sprite corral": "сделать временным и убрать отдельный спрайт", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "применить _ ко всему _", + "map _ to _ _": "", + "max": "максимальное", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "сообщение", + "microphone _": "_ микрофона", + "middle": "центр", + "minimum": "", + "minute": "минут", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "исполинский (10x)", + "month": "месяц", + "mosaic": "мозаика", + "motion": "", + "mouse down?": "клавиша мышки нажата?", + "mouse position": "", + "mouse x": "мышка x-позиция", + "mouse y": "мышка y-позиция", + "mouse-departed": "покинет курсор", + "mouse-entered": "заденет курсор", + "mouse-pointer": "курсор мышки", + "move": "переместить", + "move _ steps": "передвинуть на _ шагов", + "move all inside...": "", + "move...": "", + "my": "мой...", + "my _": "атрибут _", + "my anchor": "мой якорь", + "my dangling?": "я подвешенный?", + "my draggable?": "я движимый?", + "my name": "моё имя", + "my parent": "мой родитель", + "my rotation style": "мой тип вращения", + "my rotation x": "мой центр вращения по x", + "my rotation y": "мой центр вращения по y", + "my temporary?": "я временный?", + "myself": "я", + "n": "n", + "name": "имя", + "neg": "", + "negative": "негатив", + "neighbors": "соседи", + "neighbors ≠": "", + "new costume _ width _ height _": "новый костюм из _ шириной _ высотой _", + "new line": "", + "new sound _ rate _ Hz": "новый звук из _ с част. дискр. _ Гц", + "new...": "новый...", + "next": "", + "next costume": "следующий костюм", + "none": "ничего", + "normal": "стандартный", + "normal (1x)": "нормальный (1x)", + "normalScreen": "", + "normalStage": "", + "not": "не", + "not _": "не _", + "note": "нота", + "nothing": "", + "now connected.": "", + "number": "число", + "number of channels": "число каналов", + "numbers from _ to _": "числа от _ до _", + "o": "o", + "object _": "объект _", + "octagon": "", + "only duplicate this block": "продублировать только данный блок", + "only face left/right": "зеркальное отображение лево-право при вращении", + "only grab this block": "захватить только этот блок", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "открыть в отдельном окне...", + "open shared project from cloud...": "", + "options...": "", + "or": "или", + "or before": "", + "other clones": "другие клоны", + "other scripts in sprite": "все другие мои скрипты", + "other sprites": "другие спрайты", + "p": "p", + "paint a new sprite": "нарисовать новый спрайт", + "paintbucket": "", + "parameters": "", + "parent": "родитель", + "parent...": "родитель...", + "parts": "части", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "отпечатать на _", + "pause": "", + "pause all _": "пауза для всех _", + "pen": "перо", + "pen _": "_ пера", + "pen down": "опустить перо", + "pen down?": "перо опущено?", + "pen trails": "линии пера", + "pen up": "поднять перо", + "pen vectors": "линии пера (вект.)", + "pic...": "изображение...", + "pick random _ to _": "случайное число от _ до _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "центр вращения", + "pixel": "", + "pixelate": "пикселизация", + "pixels": "пикселы", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "воспроизводить частоту _ Гц", + "play note _ for _ beats": "играть ноту _ длит. _", + "play sound _": "воспроизводить звук _", + "play sound _ at _ Hz": "воспроизвести _ с част. дискр. _ Гц", + "play sound _ until done": "воспроизвести звук _ до конца", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "указывать в направлении _", + "point towards _": "указывать на _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "предикат", + "presentation (1.4x)": "для презентации (1.4x)", + "pressed": "нажмут", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "цвет (r-g-b-a)", + "random": "случайное", + "random position": "случайную точку", + "rank": "", + "raw data...": "\"сырые\" данные...", + "ray length": "длина луча", + "read-only": "", + "receivers...": "получатели...", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "вернуть", + "relabel...": "переобозначить...", + "release": "освободить", + "remove block variables...": "", + "rename": "переименовать", + "rename all blocks that access this variable": "переименовать переменную везде где она используется", + "rename all...": "переименовать везде...", + "rename background": "Переименовать фон", + "rename costume": "Переименовать костюм", + "rename only this reporter": "переименовать только саму переменную", + "rename sound": "переименовать звук", + "rename...": "переименовать...", + "repeat _ _": "повторять _ _", + "repeat until _ _": "повторять пока не _ _", + "replace item _ of _ with _": "заменить элем. _ в _ на _", + "report _": "результат _", + "reporter": "генератор значений", + "reporter didn't report": "", + "reset columns": "ширины по умолчанию", + "reset timer": "переустановить таймер", + "reshape _ to _": "", + "resize...": "", + "resolution": "разрешение", + "rest for _ beats": "пауза в тактах _", + "restore display": "", + "result pic...": "изображение скрипта с результатом...", + "reverse": "", + "right": "правая граница", + "right arrow": "стрелка вправо", + "ring": "", + "ringify": "обвести", + "robot": "", + "rotate": "повернуть", + "rotation style": "тип вращения", + "rotation x": "центр вращения по x", + "rotation y": "центр вращения по y", + "round _": "округлить _", + "run _ _": "выполнить _ _", + "run _ w/continuation": "выполнить _ с продолжением", + "s": "s", + "sample morphs": "", + "sample rate": "частота дискретизации", + "samples": "сигнал", + "saturation": "насыщенность", + "save _ as costume named _": "", + "save a picture of all scripts": "сохранить изображение всех скриптов", + "save a picture of both this script and its result": "сохранить изображение скрипта и результата его работы", + "save a picture of the stage": "сохранить изображение текущей сцены", + "save a picture of this comment": "сохранить изображение этого комментария", + "save a picture of this script": "сохранить изображение этого скрипта", + "save a summary of this project": "сохранить сводку по данному проекту", + "save global custom block definitions as XML": "сохранить определения глобальных пользовательских блоков в виде XML файла", + "save project data as XML to your downloads folder": "сохранить проект в виде XML файла", + "saved.": "", + "say _": "говорить _", + "say _ for _ secs": "говорить _ в течение _ сек", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "изображение скрипта...", + "script variables _": "переменные скрипта _", + "scripts": "скрипты", + "scripts pic...": "скрипты в изображение...", + "scroll frame": "", + "scrolled-down": "прокрутят вниз", + "scrolled-up": "прокрутят вверх", + "second": "секунд", + "select": "выделить", + "selection": "", + "self": "я", + "send _ to _": "отправить _ адресату _", + "senders...": "отправители...", + "sensor demo": "", + "set _ effect to _": "установить эффект _ в _", + "set _ of block _ to _": "", + "set _ to _": "установить _ знач. _", + "set background _ to _": "установить _ фона _", + "set background color to _": "установить фоновый цвет _", + "set balance to _": "установить баланс _", + "set instrument to _": "инструмент _", + "set pen _ to _": "установить _ пера _", + "set pen color to _": "установить цвет пера _", + "set pen shade to _": "", + "set pen size to _": "установить размер пера _", + "set size to _ %": "установить размер в _", + "set tempo to _ bpm": "установить темп _ такт/мин", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "", + "set volume to _ %": "установить громкость _ %", + "set x to _": "установить х _", + "set y to _": "установить y _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "отметьте, чтобы помещать генераторы значений только в незанятые ячейки ввода", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "показаться", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "показать все", + "show all...": "", + "show primitives": "отобразить стандартные блоки", + "show project data as XML in a new browser window": "", + "show table _": "", + "show the World's menu": "", + "show variable _": "показать переменную _", + "shown?": "видим?", + "shrink": "уменьшить", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "размер", + "slider": "бегунок", + "slider max...": "бегунок max...", + "slider min...": "бегунок min...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "звуки", + "space": "пробел", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "частотный спектр", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "разделить _ по _", + "sprite": "спрайт", + "sprites": "спрайты", + "sqrt": "квадратный корень", + "square": "", + "stack size": "размер стека", + "stage": "сцена", + "stage image": "", + "stamp": "оттиск", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "прикрепить к", + "stop _": "стоп _", + "stop all sounds": "остановить все звуки", + "stop frequency": "остановить частоту", + "stopped": "остановят", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Сохранить этот проект в папке Загрузки (в поддерживаемых браузерах)", + "stretch _ x: _ y: _ %": "растянуть _ по x: _ по y: _ %", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "экспорт в SVG...", + "switch to costume _": "изменить костюм на _", + "switch to scene _ _": "", + "t": "t", + "tab": "табуляторам", + "table view...": "в виде таблицы...", + "take a camera snapshot and import it as a new sprite": "сделать фотографию камерой и использовать изображение как новый спрайт", + "tan": "tan", + "tell _ to _ _": "передать _ команды _ _", + "tempo": "темп", + "temporary?": "временный?", + "text": "текст", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "в этом проекте нет неиспользуемых глобальных блоков", + "there are currently no vectorizable pen trail segments": "на данный момент линии пера в векторном виде отсутствуют", + "thing": "что-либо", + "think _": "думать _", + "think _ for _ secs": "думать _ в течение _ сек", + "this _": "", + "this block": "этот блок", + "this project doesn't have any custom global blocks yet": "У этого проекта пока нет глобальных пользовательских блоков", + "this script": "этот скрипт", + "time in milliseconds": "время в миллисекундах", + "timer": "таймер", + "tip": "кончик", + "to": "адресату", + "top": "верхняя граница", + "touch screen settings": "", + "touching _ ?": "касается _ ?", + "transient": "оперативная", + "translations": "", + "translations...": "", + "translator_e-mail": "svetlanap@berkeley.edu, tema@school830.ru, pbsite@mail.ru", + "transparency": "прозрачность", + "transparency...": "", + "trash is empty": "", + "true": "истина", + "turbo mode": "режим Турбо", + "turbo mode?": "", + "turn _ _ degrees": "повернуть _ на _ градусов", + "turn all pen trails and stamps into a new background for the stage": "превратить все линии пера и оттиски в новый фон сцены", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "превратить все линии пера и оттиски в новый костюм для текущего спрайта", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "тип _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "снимите флажок для включения стандартного дизайна среды разработки", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "снимите флажок для использования низкого разрешения это уменьшит нагрузку на ресурсы компьютера", + "uncheck for round ends of lines": "снимите флажок, чтобы концы нарисованных линий закруглялись", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "снимите флажок, чтобы разрешить помещать генераторы значений в занятые ячейки ввода", + "uncheck to allow script reentrance": "снимите флажок, чтобы включить перезапуск скрипта до его завершения", + "uncheck to always show (+) symbols in block prototype labels": "снимите флажок, чтобы показывать (+) при редактировании заголовка в редакторе блоков", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "снимите флажок, чтобы отключить IDE aнимацию", + "uncheck to disable alternating colors for nested block": "снимите флажок, чтобы отключить использование перемежающихся цветов для вложенных блоков", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "снимите флажок, чтобы отключить использование динамических обозначений при вводе с переменным числом аргументов", + "uncheck to disable input sliders for entry fields": "снимите флажок, чтобы отключить использование бегунков при заполнении полей ввода", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "отключите возможность применять стандартные операторы к спискам и таблицам", + "uncheck to disable virtual keyboard support for mobile devices": "снимите флажок, чтобы отключить использование виртуальной клавиатуры для мобильных устройств", + "uncheck to disinherit": "снимите флажок чтобы не наследовать", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "снимите флажок для выполнения скрипта с нормальной скоростью", + "uncheck to save contents in the project": "снимите флажок чтобы сохранять значение переменной в проекте", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "снимите флажок, чтобы выключить звук при щелчке на блок", + "uncheck to turn off logging pen vectors": "отключите чтобы линии пера сохранялись в растровом виде (как пикселы)", + "uncheck to turn off visible stepping": "снимите флажок, чтобы отключить отображение шагов выполнения скрипта", + "uncheck to use solid drop shadows and highlights": "снимите флажок, чтобы использовать сплошные тени и подсветки", + "uncheck to use the input dialog in short form": "снимите флажок, чтобы использовать краткую форму диалога ввода", + "uncompile": "", + "undo": "отменить", + "undo the last block drop in this pane": "отменить последнее действие с блоком", + "undrop": "отменить", + "unicode _ as letter": "буква с Unicode _", + "unicode of _": "Unicode буквы _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "убрать обводку", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Безымянный", + "unused": "", + "unused block(s) removed": "неиспользуемых блоков удалено", + "up arrow": "стрелка вверх", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "использовать клавиатуру для работы с блоками", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "значение", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "громкость", + "w": "w", + "wait _ secs": "ждать _ сек.", + "wait until _": "ждать до _", + "wardrobe": "", + "warp _": "сразу _", + "what's your name?": "Как Вас зовут?", + "when I am _": "когда меня _", + "when I receive _ _": "когда я получу _ _", + "when I start as a clone": "когда я создан как клон", + "when _": "когда _", + "when _ clicked": "при нажатии на _", + "when _ is edited _": "", + "when _ key pressed _": "при нажатии клавиши _ _", + "whirl": "вихрь", + "whitespace": "пробелам", + "width": "ширина", + "with data": "", + "with inputs": "с вводимыми данными", + "word": "словам", + "world": "мир", + "write _ size _": "написать _ шрифтом размера _", + "x": "x", + "x position": "x позиция", + "y": "y", + "y position": "y позиция", + "year": "год", + "year:": "", + "your own": "собственные", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-si.js b/elements/pl-snap/Snap/locale/lang-si.js new file mode 100644 index 00000000..0045b051 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-si.js @@ -0,0 +1,1387 @@ +SnapTranslator.dict.si = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) levo", + "(0) up": "(0) gor", + "(1) sine": "", + "(180) down": "", + "(180) right": "(180) dol", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) desno", + "(empty)": "(prazno)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "nekaj o Snap", + "About...": "Nekaj o Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animacije", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Poljuben (neovrednoten)", + "Any type": "Poljuben tip", + "Apply": "Uporabi", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Ste prepričani da želite izbrisati?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Nazaj...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Urejevalnik blokov", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Mehke sence", + "Boolean": "logična spr.", + "Boolean (T/F)": "Boolova spr. (W/F)", + "Boolean (unevaluated)": "Boolova spr. (neovrednotena)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Prekliči", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Spremeni blok", + "Clear backup": "", + "Clicking sound": "Akustično klikanje", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Ukaz", + "Command (C-shape)": "Ukaz (C-oblika)", + "Command (inline)": "Ukaz", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "Prispevali", + "Control": "Krmiljenje", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Urejevalnik oblek", + "Costumes": "Obleke", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Tvori ime vhoda", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Sodelujoči...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Normalno", + "Default Value:": "Privzeta vrednost:", + "Delete": "Briši", + "Delete Custom Block": "Zbriši latni blok", + "Delete Project": "Zbriši projekt", + "Delete a variable": "Zbriši spremenljivko", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Naloži izvorno kodo", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Uredi ime vhoda", + "Edit label fragment": "Uredi ime dela", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Prazno", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Izvoz blokov", + "Export blocks...": "Izvozi bloke", + "Export project as plain text...": "Izvozi projekt kot navadno besedilo...", + "Export project...": "Izvozi projekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "Povzetek izvoza...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Svetli izgled", + "Flat line ends": "Ravni zaključki črt", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Halo!", + "Hello, World!": "", + "Help": "Pomoč", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Uvoz blokov", + "Import library": "Naloži knjižnico", + "Import sound": "", + "Import tools": "Uvozi orodja", + "Import...": "Uvozi...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Podpora za dedovanje", + "Input Names:": "imena vhodov:", + "Input Slot Options": "", + "Input name": "ime vhoda", + "Input sliders": "Vhodni drsniki", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Urejanje s tipkovnico", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Jezik...", + "Libraries...": "Knjižnice...", + "License": "Licenca", + "License...": "Licenca...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Seznam", + "List utilities": "", + "Lists": "Seznami", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Prijava...", + "Logout": "", + "Long form input dialog": "Vhodni dialog dolge oblike", + "Looks": "Izgled", + "Make a block": "Nov blok", + "Make a variable": "Nova spremenljivka", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Obvestilo", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Komponente...", + "Motion": "Premikanje", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Več vnosov (kot seznam)", + "Nested auto-wrapping": "", + "New": "Nov", + "New Category": "", + "New Project": "Nov projekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Ne", + "November": "", + "Number": "Število", + "OK": "V redu", + "Object": "", + "October": "", + "Ok": "V redu", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Odpri projekt", + "Open in Community Site": "", + "Open...": "Odpri...", + "Opening project...": "", + "Operators": "Operatorji", + "Other": "Drugo", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Svinčnik", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "Predvajaj", + "Play sound": "Predvajaj zvok", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikat", + "Prefer empty slot drops": "Imejmo raje prazne reže", + "Prefer smooth animations": "Gladka animacija", + "Privacy...": "", + "Project Notes": "Opis projekta", + "Project URLs": "", + "Project notes...": "Opis projekta...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Uporabniška navodila", + "Remove a category...": "", + "Remove unused blocks": "Odstrani neuporabljene bloke", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Zamenjam trenutni projekt z novim?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funkcija", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Pozabljeno geslo...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Shrani", + "Save As...": "Shrani kot...", + "Save Project": "", + "Save Project As...": "Shrani projekt kot...", + "Save to disk": "Shrani na disk", + "Saved!": "Shranjeno!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "Zaznavanje", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Registracija...", + "Single input.": "En vnos.", + "Single palette": "", + "Slider maximum value": "Maksimalna vrednost drsnika", + "Slider minimum value": "Minimalna vrednost drsnika", + "Snap! website": "Spletna stran Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Zvok", + "Sound Recorder": "", + "Sounds": "Zvoki", + "Sprite": "", + "Sprite Nesting": "", + "Stage": "Oder", + "Stage height": "Višina scene", + "Stage selected: no motion primitives": "Oder je izbran: ni na voljo gibljivih gradnikov", + "Stage size": "Velikost scene", + "Stage size...": "Velikost scene...", + "Stage width": "Širina scene", + "Stop": "Ustavi", + "Stop sound": "Ustavi zvok", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Preklop nazaj na uporabniški način", + "Switch to dev mode": "preklop na razvojni način", + "Switch to vector editor?": "", + "Table lines": "Črte med celicami v tabeli", + "Table support": "Podpora za tabele", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "Tekst", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Varnost niti", + "Title text": "Naslovno besedilo", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "prevodi", + "Translators...": "Prevajalci", + "Turbo mode": "Hitri način", + "Turtle": "Kazalec smeri", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Neimenovano", + "Unused blocks...": "Neuporabljeni bloki...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "interne spremenljivke naj bodo navzven vidne", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Ime spremenljivke", + "Variables": "Spremenljivke", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtualna tipkovnicaa", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Da", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "barvanje kot zebra", + "Zoom blocks": "Povečaj blok", + "Zoom blocks...": "Povečaj bloke...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ vsebuje _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ na začetku _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "dodaj _ k _", + "add a new Turtle sprite": "", + "add a new sprite": "dodaj nov objekt", + "add comment": "dodaj komentar", + "add comment here...": "tu vneseš komentar", + "agent": "", + "alert _": "pozor: _", + "all": "vse", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "vsi razen prvega od _", + "all but this script": "vse razen te skripte", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "in", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "odgovor", + "any": "", + "any key": "poljuden", + "any message": "poljudno sporočilo", + "anything": "", + "append _": "", + "arrange scripts vertically": "uredi skripte vertikalno", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "vprašaj _ in čakaj", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "veliko (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Ali naj res zbrišem ta blok z vsemi njegovimi primeri?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "blok", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "svetlost", + "broadcast _ _": "pošlji _ _ vsem", + "broadcast _ _ and wait": "pošlji vsem _ _ in počakaj", + "brush": "", + "build": "zgradi", + "but getting a": "", + "c": "c", + "call _ _": "pokliči _ _", + "call _ w/continuation": "pokliči _ z nadaljevanjem", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "prosto vrtenje", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "zaokroževanje navzgor", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "spremeni spremenljivko _ za _", + "change _ effect by _": "spremeni učinek _ za _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "spremeni barvo svinčnika za _", + "change pen shade by _": "spremeni senco svinčnika za _", + "change pen size by _": "spremeni debelino svinčnika za _", + "change size by _": "spremeni velikost za _", + "change tempo by _": "spremeni tempo za _", + "change volume by _": "", + "change x by _": "spremeni x za _", + "change y by _": "spremeni y za _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "odkljukaj za ravne zaključke črt", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "odkljukaj za bolj predvidljivo hitrost animacij med različnimi računalniki", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "odkljukaj za prikaz tipov v vhodnih dialogih", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "odkljukaj za onemogočanje večkratnega vstopa skript", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "odkljukaj za IDE animacije", + "check to enable alternating colors for nested blocks": "vklopi izmenjujoče barve vgnezdenih blokov", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "odkljukaj za aktiviranje vhodnih drsnikov", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "odkljukaj za vklop podpore z virtualni tipkovnico za mobilne naprave", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "odkljukaj za večjo prioriteto izvajanja skript", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "odkljukaj za vklop akustičnega klikanja", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "vklopi za mehke sence in osvetlitve", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "počisti", + "clear": "zbriši", + "clear graphic effects": "zbriši grafične učinke", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Klikni ali povleči križec za premik centra vrtenja", + "clicked": "miška kliknjena", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "barva _ se dotika _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "ukaz", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "izpiši na konzolo: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "Št.obleke", + "costume name": "", + "costumes": "", + "costumes tab help": "Slike uvoziš s povlečenjem iz ene druge spletne strani ali računalnika", + "could not connect to:": "", + "cr": "", + "create a clone of _": "kloniraj _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "trenutni _", + "current module versions:": "Verzije komponent", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "dan", + "day of week": "dan v tednu", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "briši", + "delete _": "", + "delete _ of _": "zbriši _ iz _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "briši definicijo bloka", + "delete slot": "", + "delete this clone": "izbriši ta klon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "odklopi vse dele", + "detach and put into the hand": "", + "detach from": "odklopi", + "development mode": "Razvojni način", + "development mode debugging primitives:": "razvojni način razhroščevanje gradnikov", + "development mode...": "", + "dimensions": "", + "direction": "smer", + "disable deep-Morphic context menus and show user-friendly ones": "izklop Morfic menujev in prikaz uporabniško prijaznih", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "razdalja do _", + "distribution": "", + "don't rotate": "ne vrti", + "down arrow": "puščica dol", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "vlečljiv", + "draggable?": "", + "dragging threshold": "", + "dropped": "konec vlečenja", + "duplicate": "podvoji", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "rob", + "edit": "uredi", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "uredi...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "omogoči Morphic menuje in inšpektorje, i uporabniku prijazno", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "izvozi", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "izvozi...", + "extract": "", + "f": "f", + "false": "ni res", + "file": "", + "file menu import hint": "Nalaganje izvoženega projekta, knjižnice z bloki obleko ali zvokom", + "fill": "", + "fill page...": "", + "filtered for _": "filtriran za _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "najdi in odstrani uporabniške neuporabljene globalne bloke", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "zaokroževanje navzdol", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "za vse objekte", + "for each _ in _ _": "", + "for this sprite only": "le za ta objekt", + "forever _": "za vedno _", + "frame": "", + "frames": "sličice", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "prosojnost", + "giant (8x)": "ogromno (8x)", + "glide _ secs to x: _ y: _": "drsi _ sekund do x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "prestavi _ ravnin nazaj", + "go to _": "pojdi k _", + "go to _ layer": "", + "go to front": "prestavi v ospredje", + "go to x: _ y: _": "pojdi na x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "Halo", + "help": "Pomoč...", + "help...": "pomoč...", + "hide": "skrij", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "skrij osnovne bloke", + "hide variable _": "skrij spremenljivko _", + "high": "", + "hour": "ura", + "http:// _": "", + "hue": "", + "huge (4x)": "večje(4x)", + "i": "i", + "identical to": "identičen", + "if _ _": "če _ _", + "if _ _ else _": "če _ _ sicer _", + "if _ then _ else _": "", + "if on edge, bounce": "odbij se, če si na robu", + "import a sound from your computer by dragging it into here": "Zvok uvoziš tako, da ga povlečeš sem", + "import without attempting to parse or format data": "", + "import...": "uvozi...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "vhodni seznam:", + "input names:": "imena vhodov:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "vstavi _ na mesto _ v _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "je _ ?", + "is _ a _ ?": "je _ tipa _ ?", + "is _ empty?": "", + "is _ identical to _ ?": "je _ identičen _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "Element _ od _", + "items": "elementi", + "j": "j", + "join _": "poveži _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "tipka _ pritisnjena?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Slovenščina", + "language_translator": "Sasa Divjak, Gorazd Breskvar", + "large": "velik", + "last": "zadnji", + "last changed": "", + "last_changed": "2016-04-22", + "launch _ _": "poženi _ _", + "left": "", + "left arrow": "puščica levo", + "length": "", + "length of _": "dolžina _", + "length:": "Dolžina:", + "let the World automatically adjust to browser resizing": "", + "letter": "črke", + "letter _ of _": "črka _ od _", + "light (70)": "", + "lightness": "", + "line": "vrstica", + "lines": "", + "list": "seznam", + "list _": "Seznam _", + "list view...": "prikaži kot seznam...", + "ln": "ln", + "load the official library of powerful blocks": "uvozi uradni modul z naprednimi bloki", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "Gradnja novega bloka...", + "make a category...": "", + "make a copy and pick it up": "kopiraj", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "sporočilo", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "minuta", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "največje(10x)", + "month": "mesec", + "mosaic": "", + "motion": "", + "mouse down?": "gumb miške pritisnjen?", + "mouse position": "", + "mouse x": "x položaj miške", + "mouse y": "y položaj miške", + "mouse-departed": "miška se ne dotika več", + "mouse-entered": "miška se dotika", + "mouse-pointer": "kazalec miške", + "move": "premakni", + "move _ steps": "premakni se _ korakov", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "sebe", + "n": "n", + "name": "", + "neg": "", + "negative": "obratno", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "nov...", + "next": "", + "next costume": "naslednja obleka", + "none": "nič", + "normal": "normalen", + "normal (1x)": "normalno (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "ne _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "število", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "podvoji ta blok", + "only face left/right": "lahko obrnemo le levo/desno", + "only grab this block": "", + "open a new window with a picture of all scripts": "odpri novo okno s sliko vseh skript", + "open a new window with a picture of the stage": "odpri novo okno s sliko te scene", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "odpri novo okno s sliko tega skripta", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "odpri v novem oknu", + "open shared project from cloud...": "", + "options...": "", + "or": "ali", + "or before": "", + "other clones": "", + "other scripts in sprite": "ostale skripte tega objekta", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "pavziraj vse _", + "pen": "", + "pen _": "", + "pen down": "svinčnik spuščen", + "pen down?": "", + "pen trails": "sledi svinčnika", + "pen up": "svinčnik dvignjen", + "pen vectors": "", + "pic...": "izvozi sliko...", + "pick random _ to _": "naključno število od _ do _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "predvajaj noto _ za _ udarcev", + "play sound _": "predvajaj zvok _", + "play sound _ at _ Hz": "", + "play sound _ until done": "predvajaj zvok _ do konca", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "obrni se v smeri _", + "point towards _": "obrni se proti _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "Predikat", + "presentation (1.4x)": "predstavitev(1.4x)", + "pressed": "gumb miške pritisnjen", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "poljuben", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "razkljukaj za uporabo kratke oblike vhodnih dialogov": "razkljukaj za uporabo dialoga kratke oblike", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "spremeni tip...", + "release": "", + "remove block variables...": "", + "rename": "preimenuj", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "preimenuj izgled", + "rename only this reporter": "", + "rename sound": "Preimenuj zvok", + "rename...": "preimenuj...", + "repeat _ _": "ponovi _ krat _", + "repeat until _ _": "ponavljaj, dokler _ _", + "replace item _ of _ with _": "zamenjaj element _ v _ z _", + "report _": "sporoči _", + "reporter": "funkcijski blok", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "reset štoparice", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "počivaj _ udarcev", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "puščica desno", + "ring": "", + "ringify": "Obkroži", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "zaokroženo _", + "run _ _": "izvajaj _ _", + "run _ w/continuation": "izvajaj _ z nadaljevanjem", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "reci _", + "say _ for _ secs": "reci _ za _ sekund.", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "slika skript...", + "script variables _": "spremenljivke programa _", + "scripts": "", + "scripts pic...": "slika skript...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "sekunda", + "select": "izberi", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "nastavi učinek _ na _", + "set _ of block _ to _": "", + "set _ to _": "nastavi _ na _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "nastavi barvo svinčnika na _", + "set pen shade to _": "nastavi senco svinčnika na _", + "set pen size to _": "nastavi debelino svinčnika na _", + "set size to _ %": "nastavi velikost na _ %", + "set tempo to _ bpm": "nastavi tempo na _ udarcev na minuto.", + "set this morph's alpha value": "", + "set turbo mode to _": "nastavi hitri način na _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "nastavi x na _", + "set y to _": "nastavi y na _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "vklop raje namiga za prazne režezu bevorzugen", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "prikaži", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "prilaži vse", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Prikaz definicij globalnih lastnih blokov kot XML v novem oknu brkljalnika", + "show primitives": "pokaži osnovne bloke", + "show project data as XML in a new browser window": "Prikaz projekta kot XML v novem oknu brkljalnika", + "show table _": "", + "show the World's menu": "", + "show variable _": "prikaži spremenljivko _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "velikost", + "slider": "drsnik", + "slider max...": "maks vrednost...", + "slider min...": "min vrednost...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "presledek", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "razdeli _ z _", + "sprite": "", + "sprites": "", + "sqrt": "koren", + "square": "", + "stack size": "velikost sklada", + "stage": "", + "stage image": "", + "stamp": "štampiljka", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "ustavi _", + "stop all sounds": "ustavi vse zvoke", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "shrani v mapo Prenosi (ni na voljo v vseh brkljalnika)", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "Preklopi na obleko _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "prikaži kot tabelo", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "Tekst", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "trenutno ni neuporabljenih globalnih blokov v tem projektu", + "there are currently no vectorizable pen trail segments": "", + "thing": "stvar", + "think _": "misli _", + "think _ for _ secs": "misli _ za _ sekund", + "this _": "", + "this block": "ta blok", + "this project doesn't have any custom global blocks yet": "ta projekt še nima lastnih globalnih blokov", + "this script": "to skripto", + "time in milliseconds": "čas v tisočinkah sekunde", + "timer": "štoparica", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "se dotika _ ?", + "transient": "se ne shranjuje", + "translations": "", + "translations...": "", + "translator_e-mail": "sasa.divjak@fri.uni-lj.si", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "res", + "turbo mode": "", + "turbo mode?": "hitri način?", + "turn _ _ degrees": "obrni se _ _ stopinj", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "Tip od _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "razkljukaj za hitrejše animacije s spremenljivo hitrostjo osveževanja", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "razkljukaj za zaobljene zaključke črt", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "razkljukaj za to, da reporterji odrinejo druge", + "uncheck to allow script reentrance": "razkljukaj za dopuščanje večkraten vstop skript (reentrancy)", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "razkljukaj za izklop IDE animacij", + "uncheck to disable alternating colors for nested block": "izklopi izmenjujoče barve gnezdenih blokov", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "razkljukaj za izklop vhodnih drsnikov", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "razkljukaj za izklop podpore virtualne tipkovnice za mobilne naprave", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "razkljukaj za normalno hitrost izvajanja skript", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "razkljukaj za deaktiviranje akustičnega klikanja", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "izklopi za uporabo trdih senc in osvetlitev", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "prekliči dodajanje zadnjega bloka v tem okviru", + "undrop": "ponovno povleči", + "unicode _ as letter": "Unicode _ kot črka", + "unicode of _": "Unicode vrednost od _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "odstrani obroč", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Neimenovan", + "unused": "", + "unused block(s) removed": "neuporabljeni bloki so bili odstranjeni", + "up arrow": "puščica gor", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "čakaj _ sekund.", + "wait until _": "čakaj, dokler _", + "wardrobe": "", + "warp _": "", + "what's your name?": "Kako ti je ime?", + "when I am _": "Ko je _", + "when I receive _ _": "ko sprejmem _ _", + "when I start as a clone": "ko začnem kot klon", + "when _": "Ko je _", + "when _ clicked": "ko kliknemo na _", + "when _ is edited _": "", + "when _ key pressed _": "ko pritisnemo na tipko _ _", + "whirl": "", + "whitespace": "presledki", + "width": "", + "with data": "", + "with inputs": "z vhodi", + "word": "", + "world": "Svet", + "write _ size _": "", + "x": "x", + "x position": "položaj x", + "y": "y", + "y position": "položaj y", + "year": "leto", + "year:": "", + "your own": "svoj", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-sk.js b/elements/pl-snap/Snap/locale/lang-sk.js new file mode 100644 index 00000000..f47b7344 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-sk.js @@ -0,0 +1,1384 @@ +SnapTranslator.dict.sk = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) doľava", + "(0) up": "(0) hore", + "(1) sine": "(1) sínus", + "(180) down": "(180) dole", + "(2) square": "(2) štvorec", + "(3) sawtooth": "(3) pílka", + "(4) triangle": "(4) trojuholník", + "(90) right": "(90) doprava", + "(empty)": "(prázdny)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "O programe Snap", + "About...": "O programe...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Povoliť viac riadkový text pre blok", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "čokoľvek (nevyhodnotené)", + "Any type": "ľubovoľný", + "Apply": "Použiť", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Ste si istý, že chcete projekt zmazať?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Späť...", + "Backgrounds": "Pozadia", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Editor blokov", + "Blocks": "Bloky", + "Blocks category name:": "", + "Blurred shadows": "Mäkké tiene", + "Boolean": "boolean", + "Boolean (T/F)": "Boolean (P/N)", + "Boolean (unevaluated)": "Boolean (nevyhodnotené)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "šírka štetca", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Zrušiť", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Zachytiť chyby v skripte", + "Category color": "", + "Change Password": "", + "Change Password...": "Zmeniť heslo...", + "Change block": "Zmeniť blok", + "Clear backup": "", + "Clicking sound": "Zvuk kliknutia", + "Closed brush (free draw)": "Uzatvorený štetec (voľné kreslenie)", + "Cloud": "", + "Code mapping": "", + "Codification support": "Podpora kodifikácie", + "Colors and Crayons": "", + "Command": "Príkaz", + "Command (C-shape)": "Príkaz (C-tvar)", + "Command (inline)": "Príkaz (vnorený)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Definuj proporcie tvaru? (môžeš podržať shift klávesu)", + "Contents": "Obsah", + "Contributors": "Prispievatelia", + "Control": "Ovládanie", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Editor kostýmov", + "Costumes": "Kostýmy", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Vytvoriť vstup", + "Create variables": "", + "Create variables in program": "Vytvoriť premenné v programe", + "Credits...": "Prispievatelia...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "štandardný", + "Default Value:": "Výchozia hodnota:", + "Delete": "Zmazať", + "Delete Custom Block": "zmazať vlastný blok", + "Delete Project": "Zmazať projekt", + "Delete a variable": "Zmaž premennú", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Stiahnuť zdrojové kódy", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamické popisky vstupu", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Farba okraja (ľavý klik)", + "Edit input name": "Upraviť vstup", + "Edit label fragment": "Upraviť nápis", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Elipsa (shift: kruh)", + "Empty": "Prázdny", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Guma", + "Error": "", + "Examples": "Príklady", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Export blokov", + "Export blocks...": "Exportovať bloky...", + "Export project as plain text...": "Exportovať projekt ako čistý text...", + "Export project...": "Exportovať projekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "Exportovať zhrnutie...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "Vyplniť oblasť ybranou farbou", + "Fill color (right click)": "Vyplň farbou (pravý klik)", + "Filled Ellipse (shift: circle)": "Vyplnená elipsa (shift: kruh)", + "Filled Rectangle (shift: square)": "Vyplnený obdĺžnik (shift: štvorec)", + "First-Class Sprites": "", + "Flat design": "Plochý dizajn", + "Flat line ends": "Ploché konce čiar", + "For all Sprites": "Pre všetky objekty", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Ahoj!", + "Hello, World!": "", + "Help": "Nápoveda", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Importuj nový kostým z web kamery", + "Import blocks": "Importuj bolky", + "Import library": "Importovať knižnicu", + "Import sound": "", + "Import...": "Importovať...", + "Imported": "Importovaný", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Celé čísla s nekonečnou presnosťou, racionálne čísla, komplexné čísla", + "Inheritance support": "Podpora dedičnosti", + "Input Names:": "Premenné:", + "Input Slot Options": "", + "Input name": "Vstup", + "Input sliders": "Posuvníky", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Iterácia, kompozícia", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript funkcia ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Editacia klávesnicou", + "Kind of": "Druh", + "LEAP Motion controller": "", + "Language...": "Jazyk...", + "Libraries...": "Knižnice...", + "License": "Licencia", + "License...": "Licencia...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "čiara (shift: obmedzenie na 45°)", + "Line tool (shift: vertical/horizontal)": "čiara (shift: vertikálna/horizontálna)", + "List": "Zoznam", + "List utilities": "úpravy zoznamu", + "Lists": "Zoznamy", + "Live coding support": "", + "Loading": "Nahrávanie", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Prihlásiť...", + "Logout": "Odhlásiť", + "Long form input dialog": "Veľké formuláre", + "Looks": "Vzhľad", + "Make a block": "Vytvor blok", + "Make a variable": "Vytvor premennú", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "názov správy", + "Method Editor": "Editor Metód", + "Microphone": "Mikrofón", + "Microphone resolution...": "Rozlíšenie mikrofónu...", + "Modules...": "Moduly...", + "Motion": "Pohyb", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Viac vetvová podmienka (Switch)", + "Multiple inputs (value is list of inputs)": "Viac vstupov (hodnoty v zozname)", + "Nested auto-wrapping": "Vnorené automatické obopnutie", + "New": "Nový", + "New Category": "", + "New Project": "Nový projekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nie", + "November": "", + "Number": "číslo", + "OK": "", + "Object": "", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Otvoriť", + "Open Project": "Otevriť projekt", + "Open in Community Site": "Zobraziť stránku projektu", + "Open...": "Otvoriť...", + "Opening project...": "", + "Operators": "Operátory", + "Other": "Ostatné", + "Output text using speech synthesis.": "", + "Paint Editor": "Editor Farieb", + "Paint a new costume": "Nakresli nový kostým", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "Vyfarbi tvar (shift: sekundárna farba)", + "Paintbrush tool (free draw)": "štetec (kreslenie rukou)", + "Parallelization": "", + "Part of": "časť z", + "Parts": "časti", + "Password:": "", + "Pen": "Pero", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipeta (vyber farbu kdekoľvek)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Pipeta (vyber farbu kdekoľvek shift: sekundárna farba)", + "Pixels": "", + "Plain prototype labels": "Jednoduché nadpisy prototypov", + "Play": "spustiť", + "Play sound": "spustiť prehrávanie", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Ubezpeč sa prosím, že Tvoj prehlidač je aktualizovaný a kamera je spr8vne nakonfigurovaná. Niektoré prehliadače vyžadujú prísput ku Snap! cez HTTPS pre použitie kamery. Prosím prepíš \"http://\" časť adresy v prehliadači na \"https://\" a skús znovu.", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Podmienka", + "Prefer empty slot drops": "Preferovať prázdny slot pre pustenie", + "Prefer smooth animations": "Zapnúť plynulú animáciu", + "Privacy...": "", + "Project Notes": "Poznámky k projektu", + "Project URLs": "", + "Project notes...": "Poznámky k projektu...", + "Provide 100 selected colors": "100 vybraných farieb", + "Provide getters and setters for all GUI-controlled global settings": "Programové spracovanie GUI elementov", + "Publish": "Publikovať", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Nahraj nový zvuk", + "Recover": "Obnovenie", + "Rectangle (shift: square)": "Obdĺžnik (shift: štvorec)", + "Reference manual": "Referenčný manuál", + "Remove a category...": "", + "Remove unused blocks": "Odstrániť nepoužité bloky", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Nahradiť aktuálny projekt novým?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Funkcia", + "Request blocked": "", + "Resend Verification Email...": "Prepošli verifikačný email...", + "Resend verification email": "", + "Reset Password...": "Zmeniť heslo...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Podpora retina obrazovky", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Uložit", + "Save As...": "Uložiť ako...", + "Save Project": "Uložiť projekt", + "Save Project As...": "Uložiť projekt ako...", + "Save to disk": "Uložiť na disk", + "Saved!": "Uložené!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Meno skriptovanej premennej", + "Scripts": "Skripty", + "Select a costume from the media library": "Vybrať kostým z knižnice médií", + "Select a sound from the media library": "Vybrať nahrávku z knižnice médií", + "Select categories of additional blocks to add to this project.": "Pripojiť k projektu dodatočný výber tematicky zlúčených blokov.", + "Selection tool": "Výber", + "Sensing": "Vnímanie", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Nastaviť RGB alebo HSV hodnoty pera", + "Set the rotation center": "Nastaviť stred rotácie", + "Share": "Zdieľať", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Vytvoriť účet...", + "Single input.": "Jednoduchý vstup.", + "Single palette": "", + "Slider maximum value": "Maximálna hodnota posuvníku", + "Slider minimum value": "minimálna hodnota posuvníku", + "Snap! website": "Stránky Snap!", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Zvuk", + "Sound Recorder": "", + "Sounds": "Zvuky", + "Sprite": "", + "Sprite Nesting": "", + "Stage": "Scéna", + "Stage height": "Výška scény", + "Stage selected: no motion primitives": "Vybraná scéna:žiadne pohyblivé bloky", + "Stage size": "Veľkosť scény", + "Stage size...": "Veľkosť scény...", + "Stage width": "šírka scény", + "Stop": "zastaviť", + "Stop sound": "zastaviť prehrávanie", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "Elipsa (shift: kruh)", + "Stroked Rectangle (shift: square)": "Obdĺžnik (shift: štvorec)", + "Switch back to user mode": "prepnúť späť do uživateľského módu", + "Switch to dev mode": "prepnúť do vývojárského módu", + "Switch to vector editor?": "", + "Table lines": "Tabuľka s čiarami", + "Table support": "Podpora tabuliek", + "Table view": "tabuľka", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Text na slovo", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Vláknovo zabezpečené skripty", + "Title text": "Nadpis", + "Today": "Dnes", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Preklady", + "Translators...": "Prekladatelia", + "Turbo mode": "Turbo mód", + "Turtle": "korytnačka", + "Undelete sprites...": "", + "Unpublish": "Zrušiť publikovanie", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Zrušiť zdieľanie", + "Unshare Project": "", + "Untitled": "Nepomenovaný", + "Unused blocks...": "Nepoužité bloky...", + "Unverified account:": "", + "Up": "", + "Updating project list...": "Nahrávanie zoznamu projektov...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Vnútorná premenná viditeľná pre volanie", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Meno premennej", + "Variables": "Premenné", + "Variadic reporters": "Variadické funkcie", + "Vector": "", + "Vector Paint Editor": "Vektor Editor", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuálna klávesnica", + "Visible stepping": "Viditeľné krokovanie", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Prístup na webové služby (https)", + "Words, sentences": "Slová, vety", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "áno", + "Yesterday": "Včera", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Striedavé farby", + "Zoom blocks": "Veľkosť blokov", + "Zoom blocks...": "Veľkosť blokov...", + "_ at _": "_ pri _", + "_ combine _ using _": "_ kombinovať položky _ s _", + "_ contains _": "_ obsahuje _", + "_ effect": "_ -efekt", + "_ find first item _ in _": "_ nájsť prvú položku _ v _", + "_ in front of _": "_ na začiatok _", + "_ keep items _ from _": "_ uchovať položky _ z _", + "_ map _ over _": "_ použiť _ na _", + "_ mod _": "", + "_ of _": "_ z _", + "_ of block _": "", + "_ of costume _": "_ kostýmu _", + "_ of sound _": "_ zo zvuku _", + "_ of text _": "", + "_ to _": "_ ku _", + "__shout__go__": "kliknutie na zelenú vlajku", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "nový klon _", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "absolútna hodnota", + "acos": "acos", + "add _ to _": "pridať _ do _", + "add a new Turtle sprite": "pridať nový objekt korytnačky", + "add a new sprite": "pridať nový objekt", + "add comment": "pridať komentár", + "add comment here...": "pridať sem komentár...", + "agent": "", + "alert _": "Upozornenie: _", + "all": "všetko", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "všetko okrem prvej položky z _", + "all but this script": "všetko okrem tohoto skriptu", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "kotva", + "and": "a", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "odpoveď", + "any": "ktorýkoľvek", + "any key": "akákoľvek klávesa", + "any message": "akákoľvek správa", + "anything": "", + "append _": "", + "arrange scripts vertically": "zarovnať skripty vertikálne", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "opýtaj sa _ a čakaj", + "ask _ for _ _": "opýtaj _ pre _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "dozadu", + "balance": "vyváženie", + "big (2x)": "veľké (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Zmazaním tohoto bloku sa odstránia všetky jeho použitia. Naozaj chcete tento blok zmazať?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "bloky", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "okraj dolu", + "box": "", + "brightness": "jas", + "broadcast _ _": "poslať _ _", + "broadcast _ _ and wait": "poslať _ _ a čakať", + "brush": "", + "build": "vytvor si", + "but getting a": "", + "c": "c", + "call _ _": "zavolať _ _", + "call _ w/continuation": "zavolať _ s pokračovaním", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "možno otočiť", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "zaokrúhliť nahor", + "center": "stred", + "center x": "centrum x", + "center y": "centrum y", + "change _ by _": "zmeň _ o _", + "change _ effect by _": "zmeň efekt _ o _", + "change background _ by _": "zmeň pozadie _ o _", + "change balance by _": "zmeň vyváženie o _", + "change pen _ by _": "zmeň pero _ o _", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "zmeň hrúbku pera o _", + "change size by _": "zmeň veľkosť o _", + "change tempo by _": "zmeň tempo o _", + "change volume by _": "zmeň hlasitosť o _", + "change x by _": "zmeň x o _", + "change y by _": "zmeň y o _", + "check for alternative GUI design": "zaškrtnite pre alternatívny dizajn GUI", + "check for block to text mapping features": "", + "check for flat ends of lines": "zaškrtnite pre ploché konce čiar", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "Zaškrtnutím zvýši rozlíšenie s použitím dodatočných počítačových zdrojov", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "zaškrtnite pre plynulé, predvídateľné animácie naprieč počítačmi", + "check for sprite inheritance features": "zaškrtnite pre funkcie dedičnosti spritov", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "Zaškrtnutím vždy zobrazuje dátové typy vo vstupnom dialógu", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "zaškrtnite pre zákaz znovuvstúpenia do skriptu", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "Zaškrtnutie povolí animácie užívateľského rozhrania", + "check to enable alternating colors for nested blocks": "Zaškrtnutie zapne striedavé farby pre vložené bloky", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "Zaškrtnutie zapne dynamické popisky pre variaické vstupy", + "check to enable input sliders for entry fields": "zaškrtnutnie povolí použitie posuvníkov pre vstupné pole", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "zaškrtnutie povolí použitie virtuálnej klávesnice na mobilných zariadeniach", + "check to hide (+) symbols in block prototype labels": "zaškrtnite pre skrytie symbolov (+) v editore blokov", + "check to inherit from": "zaškrtnutím zapne dedenie z", + "check to prevent contents from being saved": "zaškrtnutie zabráni uloženiu obsahu", + "check to prioritize script execution": "Zaškrtnutie prioritizuje vykonávanie skriptov", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "zaškrtnutie zapne zvuk pricvaknutia bloku", + "check to turn on logging pen vectors": "zaškrtnite pre zapnutie logovanie vektorových pier", + "check to turn on visible stepping (slow)": "Zaškrtnutím zapne zobrazenie krokovania programu (pomalé)", + "check to use blurred drop shadows and highlights": "zaškrtni pre použitie mäkkých tieňov a svetiel", + "children": "potomkovia", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "Zrovnat", + "clear": "zmaž", + "clear graphic effects": "odstráň grafické efekty", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "klikni alebo pretiahni kríž pre presunutie centra otáčania", + "clicked": "na mňa kliknú", + "clone": "klonovať", + "clones": "klony", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "farba", + "color _ is touching _ ?": "farba _ je na farbe _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "skombinovať položky z _ s _", + "comic": "moaré", + "command": "blok príkazov", + "comment pic...": "poznámka k obrázku...", + "compile": "skompiluj", + "compile _": "kompilovať _", + "compile _ for _ args": "", + "confetti": "farebnosť", + "console log _": "výstup do konzoly: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "kostým", + "costume #": "kostým číslo", + "costume name": "", + "costumes": "kostýmy", + "costumes tab help": "Nahrajte obrázok odinakiaľ z webu alebo nahrajte súbor z Vášho počítača pretiahnutím sem.", + "could not connect to:": "", + "cr": "nový riadok", + "create a clone of _": "vytvoriť klon _", + "cross": "", + "crosshairs": "", + "current": "aktuálny", + "current _": "aktuálny _", + "current module versions:": "aktuálne verzie modulov:", + "current parent": "aktuálny rodič", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "kývajúce?", + "data": "", + "date": "dátum", + "day of week": "deň v týždni", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "zmazať", + "delete _": "", + "delete _ of _": "zmazať _ z _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "zmazať definíciu bloku", + "delete slot": "", + "delete this clone": "odstrániť klon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "všetky časti odpojiť", + "detach and put into the hand": "", + "detach from": "odpoj od", + "development mode": "Vývojový mód", + "development mode debugging primitives:": "vývojový mód ladenia primitív", + "development mode...": "", + "dimensions": "", + "direction": "smer", + "disable deep-Morphic context menus and show user-friendly ones": "zobrazovať jednoduché menu", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "vzdialenosť", + "distance to _": "", + "distribution": "", + "don't rotate": "neotáčať", + "down arrow": "šípka dole", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "preťahovateľný", + "draggable?": "potiahnuteľné?", + "dragging threshold": "", + "dropped": "ma upustia", + "duplicate": "kopírovať", + "duplicate block definition...": "skopíruj definíciu bloku...", + "duration": "trvanie", + "e": "e", + "e^": "e^", + "edge": "okraj", + "edit": "upraviť", + "edit rotation point only...": "", + "edit the costume's rotation center": "upraviť rotačný stred kostýmu", + "edit...": "upraviť...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "zobrazovať pokročilé menu", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportovať", + "export block definition...": "", + "export pen trails line segments as SVG": "exportovať ťahy perom ako SVG", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "", + "extract": "", + "f": "f", + "false": "nepravda", + "file": "", + "file menu import hint": "Načítať exportovaný projekt, knižnicu blokov, kostýmy alebo zvuky", + "fill": "vyplň", + "fill page...": "", + "filtered for _": "filtrovaný pre _", + "find blocks": "nájdi bloky", + "find blocks...": "", + "find first item _ in _": "nájsť prvú položku _ v _", + "find unused global custom blocks and remove their definitions": "nájsť nepoužité globálne bloky a odstrániť ich definície", + "fisheye": "rybie oko", + "flag": "", + "flash": "", + "flat line ends": "plochá čiara končí", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "zaokrúhliť nadol", + "footprints": "", + "for _ = _ to _ _": "pre _ = _ do _ _", + "for all sprites": "pre všetky objekty", + "for each _ in _ _": "pre každý _ z _ _", + "for this sprite only": "iba pre tento objekt", + "forever _": "stále opakuj _", + "frame": "", + "frames": "snímky", + "frequencies": "", + "frequency": "frekvencia", + "front": "dopredu", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "duch", + "giant (8x)": "gigantické (8x)", + "glide _ secs to x: _ y: _": "kĺž _ sekúnd na pozíciu x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "presuň na pozadie o _ úrovní", + "go to _": "choď na _", + "go to _ layer": "prejdi na vrstvu _", + "go to x: _ y: _": "choď na pozíciu x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "výška", + "hello": "ahoj", + "help": "nápoveda", + "help...": "nápoveda...", + "hide": "skryť", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "skry primitívy", + "hide variable _": "skry premennú _", + "high": "vysoká", + "hour": "hodina", + "http:// _": "", + "hue": "odtieň", + "huge (4x)": "obrovské (4x)", + "i": "i", + "identical to": "rovnaký jako", + "if _ _": "keď _ _", + "if _ _ else _": "keď _ _ inak _", + "if _ then _ else _": "ak _ potom _ inak _", + "if on edge, bounce": "ak narazíš na okraj, odraz sa", + "import a sound from your computer by dragging it into here": "Nahrajte zvuk z Vášho počítača pretiahnutím sem.", + "import without attempting to parse or format data": "importovať bez formátovania dát", + "import...": "Importovať...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "zdediť _", + "inherited": "zdedený", + "input list:": "vstupný list:", + "input names:": "premenné:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "vložiť _ na _ pozíciu v _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "je _ ?", + "is _ a _ ?": "je _ typu _ ?", + "is _ empty?": "je _ prázdny?", + "is _ identical to _ ?": "je _ rovnaký jako _ ?", + "is _ on?": "je _ nastavený?", + "is not a valid option": "", + "is read-only": "", + "item": "položka", + "item _ of _": "položka _ z _", + "items": "položky", + "j": "j", + "join _": "spoj _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "uchovať položky _ z _", + "key": "", + "key _ pressed?": "stlačená klávesa _ ?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Slovenčina", + "language_translator": "Peter Lukačovič", + "large": "veľký", + "last": "posledný", + "last changed": "", + "last_changed": "2019-12-10", + "launch _ _": "zahájiť _ _", + "left": "okraj vľavo", + "left arrow": "šípka doľava", + "length": "dĺžka", + "length of _": "dĺžka _", + "length:": "dĺžka:", + "let the World automatically adjust to browser resizing": "", + "letter": "hláska", + "letter _ of _": "písmeno _ z _", + "light (70)": "", + "lightness": "", + "line": "riadok", + "lines": "", + "list": "zoznam", + "list _": "zoznam _", + "list view...": "zobraziť zoznam...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "nahrať vektory", + "login": "", + "loop": "", + "low": "nízka", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "vytvoriť blok...", + "make a category...": "", + "make a copy and pick it up": "vytvoriť kópiu a držať ju", + "make a morph": "", + "make temporary and hide in the sprite corral": "premenit na dočasný a skryť ikonu", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "použiť _ na _", + "map _ to _ _": "", + "max": "maximálna", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "správa", + "microphone _": "Mikrofón _", + "middle": "", + "minimum": "", + "minute": "minúta", + "mirror video": "zrkadliť video", + "missing / unspecified extension": "", + "monstrous (10x)": "monštrózne (10x)", + "month": "mesiac", + "mosaic": "mozajka", + "motion": "pohyb", + "mouse down?": "stlačené tlačítko myši?", + "mouse position": "", + "mouse x": "súradnice myši x", + "mouse y": "súradnice myši y", + "mouse-departed": "zo mňa odíde myš", + "mouse-entered": "na mňa nabehne myš", + "mouse-pointer": "kurzor myši", + "move": "presunúť", + "move _ steps": "posuň sa o _ krokov", + "move all inside...": "", + "move...": "", + "my": "atribút", + "my _": "atribút _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "samého seba", + "n": "n", + "name": "meno", + "neg": "", + "negative": "negatív", + "neighbors": "susedia", + "neighbors ≠": "", + "new costume _ width _ height _": "nový kostým _ šírka _ výška _", + "new line": "", + "new sound _ rate _ Hz": "nový zvuk _ rýchlosť snímania _ Hz", + "new...": "Nový...", + "next": "", + "next costume": "ďalší kostým", + "none": "nič", + "normal": "normálny", + "normal (1x)": "normálne (1x)", + "normalScreen": "", + "normalStage": "", + "not": "nie", + "not _": "nie je _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "číslo", + "number of channels": "počet kanálov", + "numbers from _ to _": "čísla od _ do _", + "o": "o", + "object _": "objekt _", + "octagon": "", + "only duplicate this block": "kopírovať len tento blok", + "only face left/right": "iba vľavo/vpravo", + "only grab this block": "", + "open a new browser browser window with a summary of this project": "Otvoriť nové okno prehliadača so zhrnutím tohoto projektu", + "open a new window with a picture of all scripts": "otvoriť nové okno prehliadača s obrázkom všetkých skriptov", + "open a new window with a picture of the stage": "otvoriť nové okno s obrázkom na javisku", + "open a new window with a picture of this comment": "otvoriť nové oknons obrázkom tejto poznámky", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "otevriť nové okno s obrázkom tohoto skriptu", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "otvoriť v novom okne", + "open shared project from cloud...": "", + "options...": "", + "or": "alebo", + "or before": "", + "other clones": "iné klony", + "other scripts in sprite": "iné skripty v tomto objekte", + "other sprites": "iné objekty", + "p": "p", + "paint a new sprite": "nakresliť nový objekt", + "paintbucket": "", + "parameters": "", + "parent": "predok", + "parent...": "", + "parts": "časti", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "prilep na _", + "pause": "", + "pause all _": "zastav všetko _", + "pen": "", + "pen _": "pero _", + "pen down": "pero dole", + "pen down?": "pero nadol?", + "pen trails": "stopa pera", + "pen up": "pero nahor", + "pen vectors": "vektorové pero", + "pic...": "exportovať obrázok...", + "pick random _ to _": "zvoľ náhodné číslo od _ do _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "pivotný bod", + "pixel": "", + "pixelate": "pixeluj", + "pixels": "", + "play _ Hz for _ secs": "hraj _ Hz počas _ Sek.", + "play frequency _ Hz": "hraj frekvenciu _ Hz", + "play note _ for _ beats": "hraj tón _ pre _ taktov", + "play sound _": "hraj zvuk _", + "play sound _ at _ Hz": "hraj zvuk _ na _ Hz", + "play sound _ until done": "hraj zvuk _ a počkaj", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "zamier smerom _", + "point towards _": "zamier ku _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "podmienky", + "presentation (1.4x)": "prezentácia (1.4x)", + "pressed": "ma stlačia", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "R-G-B-A farby", + "random": "náhodný", + "random position": "náhodná pozícia", + "rank": "", + "raw data...": "surové dáta...", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "obnoviť", + "relabel...": "Zameniť blok za...", + "release": "uvoľniť", + "remove block variables...": "", + "rename": "premenovať", + "rename all blocks that access this variable": "premenovať všetky bloky, ktoré pristupujú na túto premennú", + "rename all...": "premenovať všetko...", + "rename background": "", + "rename costume": "premenovať kostým", + "rename only this reporter": "premenovať len tento blok", + "rename sound": "premenovať zvuk", + "rename...": "premenovať...", + "repeat _ _": "opakuj _ krát _", + "repeat until _ _": "opakuj pokiaľ nenastane _ _", + "replace item _ of _ with _": "nahraď položku _ v _ hodnotou _", + "report _": "vrátiť _", + "reporter": "blok funkcií", + "reporter didn't report": "", + "reset columns": "obnoviť šírku stĺpcov", + "reset timer": "vynulovať stopky", + "reshape _ to _": "", + "resize...": "", + "resolution": "rozlíšenie", + "rest for _ beats": "pauza _ dob(y)", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "okraj vpravo", + "right arrow": "šípka doprava", + "ring": "", + "ringify": "obaliť", + "robot": "", + "rotate": "rotuj", + "rotation style": "rotačný typ", + "rotation x": "rotácia x", + "rotation y": "rotácia y", + "round _": "zaokrúhli _", + "run _ _": "spustiť _ _", + "run _ w/continuation": "spustiť _ s pokračovaním", + "s": "s", + "sample morphs": "", + "sample rate": "vzokrovacia frekvencia", + "samples": "vzorka", + "saturation": "saturácia", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "uložiť dáta projektu ako XML do adresára Stiahnuté", + "saved.": "", + "say _": "hovor _", + "say _ for _ secs": "hovor _ nasledujúcich _ sekúnd", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "obrázok skriptu...", + "script variables _": "Vytvor skriptové premenné _", + "scripts": "Skripty", + "scripts pic...": "obrázok všetkých skriptov...", + "scroll frame": "", + "scrolled-down": "skrolovanie nadol", + "scrolled-up": "skrolovanie nahor", + "second": "sekunda", + "select": "vybrať", + "selection": "", + "self": "sám seba", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "nastav efekt _ na _", + "set _ of block _ to _": "", + "set _ to _": "nastaviť _ na _", + "set background _ to _": "nastav pozadie _ na _", + "set background color to _": "nastav pozadie na _", + "set balance to _": "nastav vyváženie na _", + "set instrument to _": "nastav nástroj na _", + "set pen _ to _": "nastav pero _ na _", + "set pen color to _": "nastaviť farbu pera na _", + "set pen shade to _": "", + "set pen size to _": "nastav hrúbku pera na _", + "set size to _ %": "zmeň veľkosť na _ %", + "set tempo to _ bpm": "nastav tempo na _ takty/Min.", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "nastaviť priesvitnosť na _", + "set volume to _ %": "nastav hlasitosť na _ %", + "set x to _": "nastav x na _", + "set y to _": "nastav y na _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Zaškrtnutím bude preferované prázdne miesto na umiestnenie", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "ukázať", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "Zobrazit všetko", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "Zobraziť definíciu vlastných blokov ako XML v novom okne prehliadača", + "show primitives": "zobraz primitívy", + "show project data as XML in a new browser window": "zobraziť dáta projektu ako xml XML v novom okne prehliadača", + "show table _": "", + "show the World's menu": "", + "show variable _": "ukáž premennú _", + "shown?": "zobrazený?", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "veľkosť", + "slider": "posuvník", + "slider max...": "maximum...", + "slider min...": "minimum...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "prichytiť", + "sorted": "", + "sound": "", + "sounds": "Zvuky", + "space": "medzerník", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "spektrum", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "rozdeľ _ pomocou _", + "sprite": "objekt", + "sprites": "objekty", + "sqrt": "odmocnina", + "square": "", + "stack size": "veľkosť zásobníku", + "stage": "javisko", + "stage image": "", + "stamp": "razítko", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "pripoj ku", + "stop _": "", + "stop all sounds": "vypni všetky zvuky", + "stop frequency": "zastav frekvenciu", + "stopped": "zastavený", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "Stiahnuť tento projekt do lokálneho priečinku (iba v prehliadačoch s podporou funkcionality)", + "stretch _ x: _ y: _ %": "roztiahni _ x: _ y: _ %", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "exportovať SVG...", + "switch to costume _": "obleč kostým _", + "switch to scene _ _": "", + "t": "t", + "tab": "tabulátor", + "table view...": "zobraziť tabuľku...", + "take a camera snapshot and import it as a new sprite": "pridať nový objekt pomocou kamery", + "tan": "tan", + "tell _ to _ _": "povedz _ _ robiť _", + "tempo": "", + "temporary?": "dočasný?", + "text": "", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "v tomto projekte sa nenachádzajú žiadne nepoužité globálne bloky", + "there are currently no vectorizable pen trail segments": "momentálne neexistujú ťahy perom ktoré by sa dali vektorizovať", + "thing": "vec", + "think _": "pomysli si _", + "think _ for _ secs": "pomysli si _ ďalších _ sekúnd", + "this _": "", + "this block": "tento blok", + "this project doesn't have any custom global blocks yet": "Tento projekt ešte nemá žiadne vlasnté globálne bloky", + "this script": "tento skript", + "time in milliseconds": "čas v milisekundách", + "timer": "stopky", + "tip": "", + "to": "", + "top": "okraj hore", + "touch screen settings": "", + "touching _ ?": "dotýka sa farby _ ?", + "transient": "dočasný", + "translations": "", + "translations...": "", + "translator_e-mail": "peter_lukacovic@outlook.com", + "transparency": "priehľadnosť", + "transparency...": "", + "trash is empty": "", + "true": "pravda", + "turbo mode": "turbo mód", + "turbo mode?": "", + "turn _ _ degrees": "otoč sa o _ _ stupňov", + "turn all pen trails and stamps into a new background for the stage": "všetky ťahy perom a razítka konvertovať do nového pozadia pre javisko", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "všetky ťahy perom a razátka konvertovať do nového kostýmu pre aktuálne vybraný sprite", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "Typ _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "odškrtnite pro predvolený dizajn GUI", + "uncheck for greater speed at variable frame rates": "odškrtnite pre vyššiu rýchlosť", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "Odškrtnutím zníži rozlíšenie pre šetrenie počítačovými zdrojmi", + "uncheck for round ends of lines": "odškrtnite pre zaguľatené konce čiar", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "odškrtnutím bude uprednostňované nahradenie celej podmienky", + "uncheck to allow script reentrance": "odškrtnite na povolenie znovuvstúpenia do skriptu", + "uncheck to always show (+) symbols in block prototype labels": "odškrtnite pre používanie symbolov (+) v editore blokov", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "Odškrtnutie zruší použitie striedavých farieb pre vložené bloky", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "Odškrtnutie zruší dynamické popisky pre variadické vstupy", + "uncheck to disable input sliders for entry fields": "odškrtnutie vypne použitie posuvníkov pre vstupné pole", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "odškrtnite pre vypnutie funkcií dedičnosti spritov", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "odškrtnutie zakáže podporu virtuálnej klávesnice na mobilných zariadeniach", + "uncheck to disinherit": "odškrtnutím odstráni dedenie", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "odškrtnutie spustí skript normálnou rýchlosťou", + "uncheck to save contents in the project": "odškrtnuie uloží obsah v projekte", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "odškrtnutie vypne zvuk pri pricvaknutí bloku", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "odškrtnutím vypne zobrazenie krokovania programu", + "uncheck to use solid drop shadows and highlights": "odškrtnutím sa použijú ostré tiene a svetlá", + "uncheck to use the input dialog in short form": "odškrtnite pre zjednodušený vstupný dialóg", + "uncompile": "odkompiluj", + "undo": "späť", + "undo the last block drop in this pane": "odvolať nastavenie posledného bloku", + "undrop": "naspäť", + "unicode _ as letter": "Unicode _ ako znak", + "unicode of _": "Unicode _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "zrušiť zabalenie", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "Bez názvu", + "unused": "", + "unused block(s) removed": "nepoužité blok(y) odstránené", + "up arrow": "šípka hore", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "použi klávesnicu pre zadávanie bloku", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "hodnota", + "variable": "", + "variables": "", + "video _ on _": "Video _ na _", + "video capture": "video záznam", + "volume": "hlasitosť", + "w": "w", + "wait _ secs": "čakaj _ sekúnd", + "wait until _": "čakaj pokiaľ nenastane _", + "wardrobe": "", + "warp _": "obal _", + "what's your name?": "Ako sa voláš?", + "when I am _": "keď _", + "when I receive _ _": "po prijatí správy _ _", + "when I start as a clone": "začať po naklonovaní", + "when _": "Keď _", + "when _ clicked": "Po kliknutí na _", + "when _ is edited _": "", + "when _ key pressed _": "po stlačení klávesy _ _", + "whirl": "špirála", + "whitespace": "medzera", + "width": "šírka", + "with data": "", + "with inputs": "s položkami", + "word": "slovo", + "world": "svet", + "write _ size _": "píš _ veľkosťou _", + "x": "x", + "x position": "pozícia x", + "y": "y", + "y position": "pozícia y", + "year": "rok", + "year:": "", + "your own": "svoje vlastné", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-sv.js b/elements/pl-snap/Snap/locale/lang-sv.js new file mode 100644 index 00000000..34c48a4c --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-sv.js @@ -0,0 +1,1398 @@ +SnapTranslator.dict.sv = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) vänster", + "(0) up": "(0) upp", + "(1) sine": "", + "(180) down": "(180) ned", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) höger", + "(empty)": "(tomt)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Om Snap", + "About...": "Om Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animationer", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Vilken som helst (oevaluerad)", + "Any type": "Valfri typ", + "Apply": "Verkställ", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Är du säker på att du vill radera", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Tillbaka...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blockredigerare", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "Suddade skuggor", + "Boolean": "boolean", + "Boolean (T/F)": "Boolean (S/F)", + "Boolean (unevaluated)": "Boolean (oevaluerad)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Pennstorlek", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "Avbryt", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "Ändra block", + "Clear backup": "", + "Clicking sound": "Klickljud", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "Stöd för textprogrammering", + "Colors and Crayons": "", + "Command": "Kommando", + "Command (C-shape)": "Kommando (C-Form)", + "Command (inline)": "Kommando (inline)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Behåll figurernas proportioner? (du kan också hålla skift nedtryckt)", + "Contents": "", + "Contributors": "Bidragsgivare", + "Control": "Kontroll", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Kostymredigerare", + "Costumes": "Kostymer", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Skapa indata-namn", + "Create variables": "", + "Create variables in program": "", + "Credits...": "Tack till...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Standard", + "Default Value:": "Standardvärde:", + "Delete": "Radera", + "Delete Custom Block": "Radera block", + "Delete Project": "Radera projekt", + "Delete a variable": "Radera variabel", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "Ladda ner källkoden", + "Dragging threshold...": "", + "Dynamic input labels": "Dynamiska namn för indata", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "Redigera indata-namn", + "Edit label fragment": "Redigera etikettdel", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "Tom", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Exportera block", + "Export blocks...": "Exportera block...", + "Export project as plain text ...": "Exportera projektet som vanlig text...", + "Export project as plain text...": "Exportera projektet som vanlig text...", + "Export project...": "Exportera projekt...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Platt utseende", + "Flat line ends": "Platta streckslut", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Hej!", + "Hello, World!": "", + "Help": "Hjälp", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "Importera block", + "Import library": "Importera bibliotek", + "Import sound": "", + "Import tools": "Importverktyg", + "Import tools...": "Importverktyg...", + "Import...": "Importera...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "Arv", + "Input Names:": "Indatanamn:", + "Input Slot Options": "", + "Input name": "Indata-namn", + "Input sliders": "Volymkontroller", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Upprepning, komposition", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Tangentbordsredigering", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "Språk...", + "Libraries...": "Bibliotek...", + "License": "Licens", + "License...": "Licens...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "Lista", + "List utilities": "Listverktyg", + "Lists": "Listor", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "Logga in...", + "Logout": "", + "Long form input dialog": "Komplett inmatningsfönster", + "Looks": "Utseende", + "Make a block": "Skapa nytt block", + "Make a variable": "Ny variabel", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Meddelandets namn", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "Moduler...", + "Motion": "Rörelse", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "Flera indata (värdet är en lista av indata)", + "Nested auto-wrapping": "", + "New": "Ny", + "New Category": "", + "New Project": "Nytt projekt", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Nej", + "November": "", + "Number": "Nummer", + "OK": "", + "Object": "", + "October": "", + "Ok": "", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Öppna projekt", + "Open in Community Site": "", + "Open...": "Öppna...", + "Opening project...": "", + "Operators": "Operatorer", + "Other": "Annat", + "Output text using speech synthesis.": "", + "Paint Editor": "Rita", + "Paint a new costume": "Rita en ny kostym", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "Penna", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "Vanliga prototypetiketter", + "Play": "Starta", + "Play sound": "Spela ljud", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Predikat", + "Prefer empty slot drops": "Föredra släpp på tomma utrymmen", + "Prefer smooth animations": "Jämna animeringar", + "Privacy...": "", + "Project Notes": "Annoteringar", + "Project URLs": "", + "Project notes...": "Annoteringar...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "Referensbok", + "Registrer deg...": "Registrera dig...", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Ersätt aktuella projektet med ett nytt?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "Nollställ lösenord...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Spara", + "Save As...": "Spara som...", + "Save Project": "", + "Save Project As...": "Spara projekt som...", + "Save to disk": "", + "Saved!": "Sparat!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Skriptvariabelnamn", + "Scripts": "Skript", + "Select a costume from the media library": "välj en kostym från mediabiblioteket", + "Select a sound from the media library": "välj ett ljud från mediabiblioteket", + "Select categories of additional blocks to add to this project.": "välj grupper av extrablock att lägga till i projektet", + "Selection tool": "", + "Sensing": "Känna av", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Registrera...", + "Single input.": "Enkel indata.", + "Single palette": "", + "Slider maximum value": "volymkontroll - högsta värde", + "Slider minimum value": "Volymkontroll - minsta värde", + "Snap! website": "Snap! webbsida", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Ljud", + "Sound Recorder": "", + "Sounds": "Ljud", + "Sprite": "", + "Sprite Nesting": "", + "Stage": "Scen", + "Stage height": "Scenhöjd", + "Stage selected: no motion primitives": "Scen vald: inga standard rörelserfinns", + "Stage size": "Scenstorlek", + "Stage size...": "Scenstorlek...", + "Stage width": "Scenbredd", + "Stop": "Stoppa", + "Stop sound": "Stoppa ljud", + "Streams (lazy lists)": "Strömmar (lata listor)", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Tillbaka till användarläge", + "Switch to dev mode": "Byt till utvecklarläge", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "Tabellstöd", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Trådsäkra skript", + "Title text": "Titel", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Översättningar", + "Translators...": "Översättare", + "Turbo mode": "Turboläge", + "Turtle": "Sköldpadda", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "Namnlös", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "Upvar - gör internal variabel synlig för anroparen", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Variabelnamn", + "Variables": "Variabler", + "Variadic reporters": "Variabla rapporterare", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuellt tangentbord", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "Ord, meningar", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "Zebrafärg", + "Zoom blocks": "Förstora blocken", + "Zoom blocks...": "Förstora blocken...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ innehåller _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "_ främst i _", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ av _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "cos-1", + "add _ to _": "lägg _ till _", + "add a new Sprite": "lägg till ny Sprite", + "add a new Turtle sprite": "lägg till en ny Sköldpadda-sprite", + "add a new sprite": "ny sprite", + "add comment": "lägg till kommentar", + "add comment here...": "lägg till kommentar här...", + "agent": "", + "alert _": "", + "all": "allt", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "allt utom första i _", + "all but this script": "alla förutom detta skript", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "ankare", + "and": "och", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "svar", + "any": "", + "any key": "", + "any message": "något meddelande", + "anything": "", + "append _": "", + "arrange scripts vertically": "organisera skript vertikalt", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "arc-1", + "ask _ and wait": "fråga _ och vänta", + "ask _ for _ _": "", + "atan": "tan-1", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "stor (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Ska detta block med alla dess instanser tas bort?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "block", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "ljusstyrka", + "broadcast _ _": "skicka meddelande _ _", + "broadcast _ _ and wait": "skicka meddelande _ _ och vänta", + "brush": "", + "build": "bygg", + "but getting a": "", + "c": "c", + "call _ _": "anropa _ med _", + "call _ w/continuation": "anropa _ och fortsätt", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "rotera", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "tak", + "center": "", + "center x": "mittpunkt x", + "center y": "mittpunkt y", + "change _ by _": "ändra _ med _", + "change _ effect by _": "ändra _ -effekt med _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "ändra pennfärg till _", + "change pen shade by _": "ändra pennstyrka med _", + "change pen size by _": "ändra penntjocklek med _", + "change size by _": "ändra storlek med _", + "change tempo by _": "ändra tempo med _", + "change volume by _": "", + "change x by _": "ändra x med _", + "change y by _": "ändra y med _", + "check for alternative GUI design": "kryssa för att aktivera ett alternativt utseende", + "check for block to text mapping features": "kryssa för att aktivera block-till-text funktioner", + "check for flat ends of lines": "kryssa för platta streckslut", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "kryssa för att aktivera stöd för redigering av listor i flera kolumner", + "check for smooth, predictable animations across computers": "kryssa för jämna animeringar på alla plattformar", + "check for sprite inheritance features": "kryssa för att aktivera stöd för arv mellan sprites", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "kryssa för att alltid visa alla typer i inmatningsfönstret", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "kryssa för att förbjuda skript att återtillträda", + "check to disallow script reentrancy": "kryssa för att förbjuda skript att återinträda", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "kryssa för att aktivera IDE-animationer", + "check to enable alternating colors for nested blocks": "kryssa för att växla blockfärger i nestlade block", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "kryssa för att aktivera dynamiska namn för indata med flera variabelfält", + "check to enable input sliders for entry fields": "kryssa för att aktivera volymkontroller för inmatningsfält", + "check to enable keyboard editing support": "kryssa för att aktivera tangentbordsredigering", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "kryssa för att aktivera stöd för virtuellt tangentbord på mobila enheter", + "check to hide (+) symbols in block prototype labels": "kryssa för att visa (+) symboler i blockprototypetiketter", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "kryssa för att prioritera skriptexekvering", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "kryssa för att aktivera klickljud", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "kryssa för att använda suddiga skuggor och belysningar", + "children": "barn", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "städa", + "clear": "rensa", + "clear graphic effects": "nollställ grafiska effekter", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "Klicka eller dra krysset för att markera mitten", + "clicked": "klickas på", + "clone": "", + "clones": "kloner", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "färgen _ rör _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "komisk", + "command": "kommando", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "konfetti", + "console log _": "skriv till konsoll: _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "kostym nr.", + "costume name": "kostymnamn", + "costumes": "", + "costumes tab help": "importera en bild från en annan webbsida eller från en fil på din dator genom att dra den hit", + "could not connect to:": "", + "cr": "retur", + "create a clone of _": "skapa klon av _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "_ just nu", + "current module versions:": "Modulversioner", + "current parent": "nuvarande förälder", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "hängande?", + "data": "", + "date": "datum", + "day of week": "veckodagen", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "radera", + "delete _": "", + "delete _ of _": "radera _ från _", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "radera blockdefinition...", + "delete slot": "", + "delete this clone": "radera klon", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "koppla bort alla delar", + "detach and put into the hand": "", + "detach from": "koppla bort", + "development mode": "utvecklareläge", + "development mode debugging primitives:": "utvecklarläge Debugging av block", + "development mode...": "", + "dimensions": "", + "direction": "riktning", + "disable deep-Morphic context menus and show user-friendly ones": "stäng av Morphic menyeroch visa användarvänliga istället", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "avstånd till _", + "distribution": "", + "don't rotate": "rotera inte", + "down arrow": "pil ned", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "flyttbar", + "draggable?": "", + "dragging threshold": "", + "dropped": "släpps ned", + "duplicate": "duplicera", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "kant", + "edit": "redigera", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "redigera...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "aktivera Morphic menyer och inspektorer, inte användarvänligt!", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "exportera", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "exportera...", + "extract": "", + "f": "f", + "false": "falskt", + "file": "", + "file menu import hint": "läser in ett exporterat projekt, ett bibliotek med block, en kostym, eller ett ljud", + "fill": "fyll", + "fill page...": "", + "filtered for _": "filtrera på _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "vänd ↔", + "flip ↕": "vänd ↕", + "floor": "golv", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "för alla sprites", + "for each _ in _ _": "", + "for this sprite only": "bara för denna sprite", + "forever _": "för alltid _", + "frame": "", + "frames": "ramar", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "spök", + "giant (8x)": "enorm (8x)", + "glide _ secs to x: _ y: _": "glid _ sek till x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "flytta _ lager bakåt", + "go to _": "gå till _", + "go to _ layer": "", + "go to front": "lägg överst", + "go to x: _ y: _": "gå till x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "större", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "hej", + "help": "hjälp", + "help...": "hjälp...", + "hide": "göm", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "göm primitiva", + "hide variable _": "göm variabel _", + "high": "", + "hjelp...": "hjälp...", + "hour": "timmen", + "http:// _": "", + "hue": "", + "huge (4x)": "jättestor (4x)", + "i": "i", + "identical to": "identisk med", + "if _ _": "om _ _", + "if _ _ else _": "om _ _ då _", + "if _ then _ else _": "", + "if on edge, bounce": "studsa om vid kanten", + "import a sound from your computer by dragging it into here": "importera en ljudfil från din dator genom att dra den hit", + "import without attempting to parse or format data": "", + "import...": "importera...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "indata lista:", + "input names:": "indatanamn:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "lägg in _ på plats _ i lista _", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ ?", + "is _ a _ ?": "_ är _ ?", + "is _ empty?": "", + "is _ identical to _ ?": "_ identisk med _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "element _ i _", + "items": "", + "j": "j", + "join _": "slå ihop _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "tangent _ nedtryckt?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "svenska", + "language_translator": "Erik A Olsson", + "large": "stor", + "last": "sista", + "last changed": "", + "last_changed": "2016-06-09", + "launch _ _": "starta _ med _", + "left": "", + "left arrow": "pil vänster", + "length": "", + "length of _": "längden av _", + "length:": "längd:", + "let the World automatically adjust to browser resizing": "", + "letter": "bokstav", + "letter _ of _": "bokstav _ av _", + "light (70)": "", + "lightness": "", + "line": "rad", + "lines": "", + "list": "lista", + "list _": "lista _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "ladda ner det officiella superblock biblioteket", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "skapa nytt block...", + "make a category...": "", + "make a copy and pick it up": "gör en kopia och plocka upp den", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "meddelande", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "minuten", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "gigantisk (10x)", + "month": "månaden", + "mosaic": "", + "motion": "", + "mouse down?": "musknapp nedtryckt?", + "mouse position": "", + "mouse x": "mus x-pos", + "mouse y": "mus y-pos", + "mouse-departed": "inte längre har muspekaren över mig", + "mouse-entered": "får muspekaren över mig", + "mouse-pointer": "muspekare", + "move": "flytta", + "move _ steps": "gå _ steg", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "attribut _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "mig själv", + "n": "n", + "name": "namn", + "neg": "", + "negative": "negativ", + "neighbors": "grannar", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "ny...", + "next": "", + "next costume": "nästa kostym", + "none": "ingenting", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "inte _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "nummer", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "duplicera endast detta block", + "only face left/right": "peka bara höger/vänster", + "only grab this block": "", + "open a new window with a picture of all scripts": "öppna ett nytt fönster med en bild på alla skript", + "open a new window with a picture of the stage": "öppna ett nytt fönster med en bild av scenen", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "öppna ett nytt fönster med en bild av detta skript", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "eller", + "or before": "", + "other clones": "andra kloner", + "other scripts in sprite": "andra skript i denna sprite", + "other sprites": "andra sprites", + "p": "p", + "paint a new sprite": "rita en ny sprite", + "paintbucket": "", + "parameters": "", + "parent": "föräldrar", + "parent...": "förälder...", + "parts": "delar", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "pausa alla _", + "pen": "", + "pen _": "", + "pen down": "penna ned", + "pen down?": "", + "pen trails": "pennspår", + "pen up": "penna upp", + "pen vectors": "", + "pic...": "bild...", + "pick random _ to _": "slumptal från _ till _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "spela ton _ i _ slag", + "play sound _": "spela ljud _", + "play sound _ at _ Hz": "", + "play sound _ until done": "spela ljud _ tills färdig", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "peka mot riktning _", + "point towards _": "peka mot _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "predikat", + "presentation (1.4x)": "", + "pressed": "trycks ned", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "vilken som helst", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "döp om...", + "release": "", + "remove block variables...": "", + "rename": "döp om", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "döp om kostymen", + "rename only this reporter": "", + "rename sound": "döp om ljud", + "rename...": "döp om...", + "repeat _ _": "upprepa _ gånger _", + "repeat until _ _": "upprepa tills _ _", + "replace item _ of _ with _": "ersätt element _ i _ med _", + "report _": "rapportera _", + "reporter": "funktionsblock", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "nollställ stoppur", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "pausa _ slag", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "pil höger", + "ring": "", + "ringify": "ring runt", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "avrunda _", + "run _ _": "kör _ med _", + "run _ w/continuation": "kör _ och fortsätt", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "säg _", + "say _ for _ secs": "säg _ i _ sek", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "skript bild...", + "script variables _": "skriptvariabel _", + "scripts": "", + "scripts pic...": "skriptbild...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "sekunden", + "select": "välj", + "selection": "", + "self": "mig själv", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "sätt _ -effekt til _", + "set _ of block _ to _": "", + "set _ to _": "sätt _ till _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "sätt pennfärg till _", + "set pen shade to _": "sätt pennstyrka till _", + "set pen size to _": "sätt penntjocklek til _", + "set size to _ %": "sätt storlek till _ %", + "set tempo to _ bpm": "sätt tempo till _ bpm", + "set this morph's alpha value": "", + "set turbo mode to _": "sätt turboläge till _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "sätt x till _", + "set y to _": "sätt y till _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "Inställningar föredra släpp på tomma utrymmen", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "visa", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "visa allt", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "visa globala anpassade blockdefinitioner som XML i ett nytt fönster", + "show primitives": "visa primitiva", + "show project data as XML in a new browser window": "visa projektdata som XML i ett ny fönster", + "show table _": "", + "show the World's menu": "", + "show variable _": "visa variabel _", + "shown?": "", + "shrink": "mindre", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "storlek", + "slider": "volymkontroll", + "slider max...": "volymkontroll max...", + "slider min...": "volymkontroll min...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "mellanslag", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "dela _ med tecken _", + "sprite": "", + "sprites": "", + "sqrt": "kvadratrot", + "square": "", + "stack size": "stack-storlek", + "stage": "scen", + "stage image": "", + "stamp": "stämpla", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "stoppa _", + "stop all _": "stoppa alla _", + "stop all sounds": "stoppa alla ljud", + "stop block": "stoppa block", + "stop frequency": "", + "stop script": "stoppa skript", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "byt till kostym _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "", + "temporary?": "", + "text": "", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "sak", + "think _": "tänk _", + "think _ for _ secs": "tänk _ i _ sek", + "this _": "", + "this block": "detta block", + "this project doesn't have any custom global blocks yet": "Detta projekt saknar egna globala block", + "this script": "detta skript", + "time in milliseconds": "tiden i millisekunder", + "timer": "stoppur", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "rör färgen _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "eolsson@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "sant", + "turbo mode": "", + "turbo mode?": "turboläge?", + "turn _ _ degrees": "vänd _ _ grader", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "typ _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "avmarkera för att byta till standardutseendet", + "uncheck for greater speed at variable frame rates": "avmarkera för högre fart vid variabel frame rate", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "avmarkera för avrundade streckslut", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "avmarkera för att tillåta placerade rappporterare att flytta ut andra", + "uncheck to allow script reentrance": "avmarkera för att tillåta skript att återtillträda", + "uncheck to allow script reentrancy": "avmarkera för att tillåta skript att återinträda", + "uncheck to always show (+) symbols in block prototype labels": "avmarkera för att visa (+) symboler i blockprototypetiketter", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "avmarkera för att stänga av IDE-animationer", + "uncheck to disable alternating colors for nested block": "avmarkera för att inaktivera växlade färger i nestlade block", + "uncheck to disable block to text mapping features": "avmarkera för att inaktivera block-till-text funktioner", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "avmarkera för att inaktivera dynamiska namn för indata med flera variabelfält", + "uncheck to disable input sliders for entry fields": "avmarkera för att inaktivera volymkontroller för inmatningsfält", + "uncheck to disable keyboard editing support": "avmarkera för att inaktivera tangentbordsredigering", + "uncheck to disable multi-column list views": "avmarkera för att inaktivera stöd för redigering av listor i flera kolumner", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "avmarkera för att inaktivera stöd för arv mellan sprites", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "avmarkera för att inaktivera stöd för virtuellt tangentbord på mobila enheter", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "avmarkera för att köra skript vid normal hastighet", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "avmarkera för att inaktivera klickljud", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "avmarkera för att använda ifyllda skuggor och belysningar", + "uncheck to use the input dialog in short form": "avmarkera för att visa lilla inmatningsfönstret", + "uncompile": "", + "undo": "ångra", + "undo the last block drop in this pane": "ångra sista blocksläppet i detta område", + "undrop": "ångra släpp", + "unicode _ as letter": "unicode _ som bokstav", + "unicode of _": "unicode av _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "radera ringen runt", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "namnlös", + "unused": "", + "unused block(s) removed": "", + "up arrow": "pil upp", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "vänta _ sek", + "wait until _": "vänta tills _", + "wardrobe": "", + "warp _": "snabbspola _", + "what's your name?": "vad heter du?", + "when I am _": "när jag _", + "when I am clicked": "när jag klickas på", + "when I receive _": "när jag tar emot meddelande _", + "when I receive _ _": "när jag tar emot _ _", + "when I start as a clone": "när jag startar som klon", + "when _": "när _", + "when _ clicked": "när _ klickas på", + "when _ is edited _": "", + "when _ key pressed": "när tangent _ trycks ned", + "when _ key pressed _": "när tangent _ trycks ned _", + "whirl": "", + "whitespace": "mellanslag", + "width": "", + "with data": "", + "with inputs": "med indata", + "word": "", + "world": "världen", + "write _ size _": "", + "x": "x", + "x position": "x-position", + "y": "y", + "y position": "y-position", + "year": "året", + "year:": "", + "your own": "dina egna", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ta.js b/elements/pl-snap/Snap/locale/lang-ta.js new file mode 100644 index 00000000..c536c7f7 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ta.js @@ -0,0 +1,1379 @@ +SnapTranslator.dict.ta = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "", + "(0) up": "", + "(1) sine": "", + "(180) down": "", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "", + "(empty)": "காலியாக", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "ஸ்னாப் பற்றி", + "About...": "பற்றி . . .", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "", + "Any type": "", + "Apply": "விண்ணப்பிக்கவும்", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "பின்புறம்..", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "", + "Boolean": "", + "Boolean (T/F)": "", + "Boolean (unevaluated)": "", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "கென்செல்", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "தொகுதி மாற்ற", + "Clear backup": "", + "Clicking sound": "", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "Command:", + "Command (C-shape)": "", + "Command (inline)": "", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "", + "Control": "கன்ட்ரொல்", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "ஆடை ஆசிரியர்", + "Costumes": "உடைகள்", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "", + "Create variables": "", + "Create variables in program": "", + "Credits...": "", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "", + "Delete": "", + "Delete Custom Block": "", + "Delete Project": "", + "Delete a variable": "வேரியபில் அழி", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "மூலத்தைப் பதிவிறக்குங்கள்", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "", + "Export blocks...": "Export Blocks...", + "Export project as plain text...": "திட்டத்தை எளிய உரையாக ஏற்றுமதி செய்க", + "Export project...": "ஏற்றுமதி திட்டம்...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "வணக்கம்!", + "Hello, World!": "", + "Help": "உதவ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "நூலகங்கள் நூலகங்கள்", + "Import sound": "", + "Import tools": "Tools laden", + "Import...": "இறக்குமதி...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "உள்ளீட்டு பெயர்கள்:", + "Input Slot Options": "", + "Input name": "", + "Input sliders": "Input Slider", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "மொழ...", + "Libraries...": "நூலகங்கள்...", + "License": "", + "License...": "", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "", + "Lists": "பட்டியல்", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "உள்நுழைய...", + "Logout": "", + "Long form input dialog": "", + "Looks": "தோற்றம்", + "Make a block": "ஒரு தொகுதி செய்யுங்கள்", + "Make a variable": "வேரியபில் செய்", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "செய்தி பெயர்", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "", + "Motion": "நகர்ச்ச", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "", + "Nested auto-wrapping": "", + "New": "புதிய புதிய பின்னணி", + "New Category": "", + "New Project": "புதிய திட்டம்", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "இல்ல", + "November": "", + "Number": "", + "OK": "சரி", + "Object": "", + "October": "", + "Ok": "சரி", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "திறந்த வேலை", + "Open in Community Site": "", + "Open...": "திறக்க...", + "Opening project...": "", + "Operators": "ஆபரேட்டர்கள்", + "Other": "மற்றொன்று", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "பேனா", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "தொடங்கு", + "Play sound": "ஒலியைத் தொடங்குங்கள்", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "", + "Prefer empty slot drops": "", + "Privacy...": "", + "Project Notes": "வேலை குறிப்புகள்", + "Project URLs": "", + "Project notes...": "திட்ட குறிப்பு ...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "தற்போதைய திட்டத்தை புதியதாக மாற்றவா?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "சேம", + "Save As...": "எனச் சேம...", + "Save Project": "", + "Save Project As...": "திட்டத்தை சேமிக்கவும்...", + "Save to disk": "", + "Saved!": "", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "ச்கிரிப்ட்ட மாறிழியின் பெயர்", + "Scripts": "லிபி", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "உணருதல்", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "பதிவுபெறுதல்...", + "Single input.": "", + "Single palette": "", + "Slider maximum value": "அதிகபட்ச ஸ்லைடு", + "Slider minimum value": "குறைந்தபட்ச ஸ்லைடு", + "Snap! website": "", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "ஒல", + "Sound Recorder": "", + "Sounds": "ஒலஒல", + "Sprite": "ஸ்ப்ரைட்", + "Sprite Nesting": "", + "Stage": "மேட", + "Stage height": "", + "Stage selected: no motion primitives": "நிலை தேர்ந்தெடுக்கப்பட்டது. மோஷன் பிளாக்ஸ் இல்லை", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "நிறுத்து", + "Stop sound": "ஒலியை நிறுத்துங்கள்", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "பயனர் பயன்முறைக்கு மாறவும்", + "Switch to dev mode": "தேவ் பயன்முறைக்கு மாறவும்", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "", + "Title text": "", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "", + "Translators...": "Translators", + "Turbo mode": "", + "Turtle": "", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "பெயரிடப்படாதது", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "மாறிழியின் பெயர்", + "Variables": "வேரியபில்கள்", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "ஆம்", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "", + "Zoom blocks": "", + "Zoom blocks...": "", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ மாட் _", + "_ of _": "_ ன் _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "", + "add a new Turtle sprite": "", + "add a new sprite": "புதிய மனிதனைச் சேர்க்கவும்", + "add comment": "", + "add comment here...": "add comment here", + "agent": "", + "alert _": "", + "all": "அனைத்தும்", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "", + "all but this script": "அனைத்தும் ஆனால் இந்த ஸ்கிரிப்ட்", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "மற்றும்", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "பதில்", + "any": "", + "any key": "", + "any message": "எந்த செய்தியும்", + "anything": "", + "append _": "", + "arrange scripts vertically": "", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ காத்திருக்க சொல்", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "தொகுதி", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "_ _ செலித்தி", + "broadcast _ _ and wait": "_ _ செலித்தி காத்திருக்கவும்", + "brush": "", + "build": "கட்ட", + "but getting a": "", + "c": "c", + "call _ _": "", + "call _ w/continuation": "", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "சுழற்ற முடியும்", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ _ அளவு மாற்றவும்", + "change _ effect by _": "", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "பேனா நிறத்தை _ அளவு மாற்றவும்", + "change pen shade by _": "பேனா ஷெடை _ அளவு மாற்றவும்", + "change pen size by _": "பேனா கன அளவை _ அளவு மாற்றவும்", + "change size by _": "கன அளவை _ அளவு மாற்றவும்", + "change tempo by _": "_ அளவு தாளத்தை மாற்றவும்", + "change volume by _": "", + "change x by _": "x _ அளவு மாற்றவும்", + "change y by _": "y _ அளவு மாற்றவும்", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "சுத்தம் செய்", + "clear": "அழ", + "clear graphic effects": "க்ராபிக்ஸ் எபெக்ட்டை அழித்து விடு", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "சுழற்சி மையத்தை நகர்த்த குறுக்கு நாற்காலிகள் கிளிக் செய்யவும் அல்லது இழுக்கவும்", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ கலர் _ யை தொடுகிரதா?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "உட #", + "costume name": "", + "costumes": "", + "costumes tab help": "மற்றொரு வலைப்பக்கத்திலிருந்து படத்தை எடுக்கவும் அல்லது கணினியிலிருந்து இங்கே கைவிடுவதன் மூலம்", + "could not connect to:": "", + "cr": "", + "create a clone of _": "குளோன் _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "current module versions", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "அழ", + "delete _": "", + "delete _ of _": "", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "Blockdefinition löschen", + "delete slot": "", + "delete this clone": "குளோனை நீக்கு", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "எல்லாம் பிரிக்கவும்", + "detach and put into the hand": "", + "detach from": "இருந்து பிரிக்கவும்", + "development mode": "டெவோலோப்மென்ட் பயன்முறை", + "development mode debugging primitives:": "", + "development mode...": "", + "dimensions": "", + "direction": "திச", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ வரை தூரம்", + "distribution": "", + "don't rotate": "சுழற்றாத", + "down arrow": "", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "இழுக்கக்கூடியது", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "நகல் செய்", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "", + "edit": "திருத்த", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "தொகு...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "ஏற்றுமதி", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "ஏற்றுமதி...", + "extract": "", + "f": "f", + "false": "தவறு", + "file": "", + "file menu import hint": "lädt ein exportiertes Projekt, eine Bibliothek mit Blöcken ein Kostüm oder einen Klang", + "fill": "", + "fill page...": "", + "filtered for _": "", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "எல்லா உருவங்களுக்கும்", + "for each _ in _ _": "", + "for this sprite only": "இந்த உருவங்களுக்கு", + "forever _": "எப்போதும் _", + "frame": "", + "frames": "", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "", + "global?": "", + "globe": "", + "go back _ layers": "_ அடுக்குகள் பின்னால் செல்லவும்", + "go to _": "_ க்கு செல்லவும்", + "go to _ layer": "", + "go to front": "முன் செல்லவும்", + "go to x: _ y: _": "x: _ y: _ க்கு செல்லவும்", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "வணக்கம்", + "help": "உதவி", + "help...": "உதவ...", + "hide": "மறைக்கவும்", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "hide primitive", + "hide variable _": "_ மாறி மறைக்கவும்", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "", + "i": "i", + "identical to": "ஒத்த", + "if _ _": "_ _ என்றால்", + "if _ _ else _": "_ என்றால் அல்லது _", + "if _ then _ else _": "", + "if on edge, bounce": "விளிம்பில் பவுன்ஸ்", + "import a sound from your computer by dragging it into here": "இங்கே இழுப்பதன் மூலம் கணினியிலிருந்து ஒரு ஒலியை இறக்குமதி செய்க", + "import without attempting to parse or format data": "", + "import...": "இறக்குமதி...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "உள்ளீட்டு பட்டியல்:", + "input names:": "உள்ளீட்டு பெயர்கள்:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "இது _ ?", + "is _ a _ ?": "இது _ ஒரு _ ?", + "is _ empty?": "", + "is _ identical to _ ?": "இது _ ஒத்த _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "", + "items": "", + "j": "j", + "join _": "சேர்க்கவும் _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ கீ அழுத்தி இருக்கிரதா", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Tamil", + "language_translator": "vinayakumar R, Barthdry", + "large": "பெரியது", + "last": "", + "last changed": "", + "last_changed": "2021-01-25", + "launch _ _": "", + "left": "", + "left arrow": "", + "length": "", + "length of _": "_ ன் நீளம்", + "length:": "நீளம்:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "_ வது எழுத்து , _ ன்", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "", + "list _": "பட்டியல் _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "das offizielle Modul mit mächtigen Blöcken laden", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "", + "make a category...": "", + "make a copy and pick it up": "", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "செய்தி", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "Ultra Giant (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "சுட்டி கீழே?", + "mouse position": "", + "mouse x": "மவுஸ் x", + "mouse y": "மவுஸ் y", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "", + "move": "நகர்த்து", + "move _ steps": "_ அடிகள் நகரவும்", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "நானே", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "புதியது...", + "next": "", + "next costume": "அடுத்த உட", + "none": "எதுவும் இல்லை", + "normal": "இயல்பான", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "இல்ல _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "", + "only face left/right": "வலது மற்றும் இடது முகம் மட்டுமே", + "only grab this block": "", + "open a new window with a picture of all scripts": "ein neues Browserfenster mit einem Bild aller Skripte öffnen", + "open a new window with a picture of the stage": "ein neues Browserfenster mit einem Bild der Bühne öffnen", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "ein neues Browserfenster mit einem Bild dieses Skripts öffnen", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "அல்லத", + "or before": "", + "other clones": "", + "other scripts in sprite": "ஸ்பிரிட்டில் பிற ஸ்கிரிப்ட்கள்", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "அனைத்தையும் இடைநிறுத்துங்கள் _", + "pen": "", + "pen _": "", + "pen down": "பேனா கீழே", + "pen down?": "", + "pen trails": "", + "pen up": "பேனா மேல", + "pen vectors": "", + "pic...": "ஏற்றுமதி மேடை...", + "pick random _ to _": "இளஞ்சிவப்பு சீரற்ற _ to _", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ ஸ்வரம் _ தாள தட்டு வாசிக்கவும்", + "play sound _": "_ ஒலிக்கவும்", + "play sound _ at _ Hz": "", + "play sound _ until done": "நிற்க்கும் வரை _ ஒலிக்கவும்", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ திசையை சுட்டிக்கட்டவும்", + "point towards _": "_ நோக்கி சுட்டிக்கட்டவும்", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "", + "presentation (1.4x)": "", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "மறுபெயரிடு", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "ஆடை மறுபெயரிடு", + "rename only this reporter": "", + "rename sound": "ஒலி மறுபெயரிடு", + "rename...": "மறுபெயரிடு...", + "repeat _ _": "திரும்பச்செய் _ _", + "repeat until _ _": "_ _ வரை திரும்பச்செய்", + "replace item _ of _ with _": "", + "report _": "அறிக்கை _", + "reporter": "", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "டைமெர் ரீசெட்", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "_ தாள தட்டு காத்திருக்கவும்", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "", + "ring": "", + "ringify": "வளையமாக ஆக்குங்கள்", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "", + "run _ _": "", + "run _ w/continuation": "", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ சொல்", + "say _ for _ secs": "_ விநாடிகள் _ சொல்", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "", + "script variables _": "ஸ்கிரிப்ட் மாறி _", + "scripts": "", + "scripts pic...": "Bild aller Scripte...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "தேர்ந்தெடுக்கவும்", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "", + "set _ of block _ to _": "", + "set _ to _": "_ _ ஆக்கவும்", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "பேனா நிரம் _ ஆக்கவும்", + "set pen shade to _": "பேனா ஷேட் _ ஆக்கவும்", + "set pen size to _": "பேனா கனம் _ ஆக்கவும்", + "set size to _ %": "கனம் _ % ஆக்கவும்", + "set tempo to _ bpm": "தாளம் _ bpm ஆக்கவும்", + "set this morph's alpha value": "", + "set turbo mode to _": "setze Turbomodus auf _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "x _ ஆக்கவும்", + "set y to _": "y _ ஆக்கவும்", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "காண்ப", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "அனைத்தையும் காட்டு", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "zeigt globale Benutzerblockdefinitionen als XML im Browser an", + "show primitives": "show primitive", + "show project data as XML in a new browser window": "", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ மாறி காண்பி", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "பரிமாணம்", + "slider": "ஸ்லைடர்", + "slider max...": "அதிகபட்ச ஸ்லைடு...", + "slider min...": "குறைந்தபட்ச ஸ்லைடு...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "", + "stack size": "", + "stage": "", + "stage image": "", + "stamp": "அச்சு", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "நிறுத்து _", + "stop all sounds": "எல்லா ஒலிகளையும் நிருத்த", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "_ உடைக்கு மாற்ற", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "தாளம்", + "temporary?": "", + "text": "", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "", + "think _": "_ யோச", + "think _ for _ secs": "_ விநாடிகள் _ யோச", + "this _": "", + "this block": "இது Block", + "this project doesn't have any custom global blocks yet": "", + "this script": "இந்த ச்கிரிப்ட்ட", + "time in milliseconds": "", + "timer": "டைமெர்", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "தொடுகிரதா _ ?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "vnkmr7620@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "சர", + "turbo mode": "", + "turbo mode?": "", + "turn _ _ degrees": "திரும்பவும் _ _ அளவு", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "வகை _", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "", + "uncheck to allow script reentrance": "", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "யூனிகோட் _ கடிதமாக", + "unicode of _": "யூனிகோட் _", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "வளையத்திலிருந்து உடைக்க", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "பெயர் இல்லாதது", + "unused": "", + "unused block(s) removed": "", + "up arrow": "", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ விநாடிகள் காத்திருக்கவும்", + "wait until _": "_ வரை காத்திருக்கவும்", + "wardrobe": "", + "warp _": "போரிடு _", + "what's your name?": "உங்கள் பெயர் என்ன ?", + "when I am _": "_ நான் சொடுக்கும் போது", + "when I receive _ _": "_ _ பெறுகையில்", + "when I start as a clone": "நான் குளோனைத் தொடங்கும்போது", + "when _": "", + "when _ clicked": "_ அழுத்தும்பொழுது", + "when _ is edited _": "", + "when _ key pressed _": "_ _ கீ அழுத்தும்பொழுது", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "உள்ளீட்டுடன்", + "word": "", + "world": "உலகம்", + "write _ size _": "", + "x": "x", + "x position": "x இடம்", + "y": "y", + "y position": "y இடம்", + "year": "", + "year:": "", + "your own": "உங்கள் சொந்தமானது", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-te.js b/elements/pl-snap/Snap/locale/lang-te.js new file mode 100644 index 00000000..2f854202 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-te.js @@ -0,0 +1,1385 @@ +SnapTranslator.dict.te = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "", + "(0) up": "", + "(1) sine": "", + "(180) down": "", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "", + "(empty)": "", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "", + "About...": "", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "ఆనిమేషన్ (సజీవత్వము)", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "", + "Any type": "", + "Apply": "", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "", + "Boolean": "", + "Boolean (T/F)": "", + "Boolean (unevaluated)": "", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "రద్", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "", + "Clear backup": "", + "Clicking sound": "", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "", + "Command (C-shape)": "", + "Command (inline)": "", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "", + "Control": "నియంత్రణ", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "", + "Costumes": "వేషధారణ", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "", + "Create variables": "", + "Create variables in program": "", + "Credits...": "", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "", + "Delete": "", + "Delete Custom Block": "", + "Delete Project": "", + "Delete a variable": "చరరాశిని తొలగించ", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "", + "Dragging threshold...": "", + "Dynamic input labels": "", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "", + "Edit label fragment": "", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "", + "Export blocks...": "", + "Export project as plain text...": "", + "Export project...": "", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "\"హలో!", + "Hello, World!": "", + "Help": "సహాయ", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "హమ్.మ్..", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "", + "Import library": "", + "Import sound": "", + "Import tools": "Tools laden", + "Import...": "దిగుమతి...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "", + "Input Slot Options": "", + "Input name": "", + "Input sliders": "", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "భాష...", + "Libraries...": "", + "License": "", + "License...": "", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "", + "Lists": "జాబితా", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "", + "Logout": "", + "Long form input dialog": "", + "Looks": "కనబడ", + "Make a block": "", + "Make a variable": "చరరాశిని కల్పించు", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "సందేశం పేర", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "", + "Motion": "చలన", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "", + "Nested auto-wrapping": "", + "New": "కొత్", + "New Category": "", + "New Project": "", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "లేద", + "November": "", + "Number": "", + "OK": "సరే", + "Object": "", + "October": "", + "Ok": "సరే", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "", + "Open Project": "Project öffnen", + "Open in Community Site": "", + "Open...": "తెరువ...", + "Opening project...": "", + "Operators": "చేసేవి", + "Other": "", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "పెన్", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "ఆడ", + "Play sound": "శబ్దం వాయించ", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "", + "Prefer empty slot drops": "", + "Prefer smooth animations": "Fixe Framerate", + "Privacy...": "", + "Project Notes": "\"ప్రాజెక్ట్ గమనికల", + "Project URLs": "", + "Project notes...": "రాజెక్ట్ గమనికల...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "సేవ్ చేయ", + "Save As...": "వదిలేయడానికి ముందు మార్పులను సేవ్ చేయ...", + "Save Project": "", + "Save Project As...": "", + "Save to disk": "", + "Saved!": "", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "ఆజ్ఞ", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "స్పర్శించుట", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "", + "Single input.": "", + "Single palette": "", + "Slider maximum value": "", + "Slider minimum value": "", + "Snap! website": "", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "శబ్దమ", + "Sound Recorder": "", + "Sounds": "శబ్దాల", + "Sprite": "రూపమ", + "Sprite Nesting": "", + "Stage": "వేదిక", + "Stage height": "", + "Stage selected: no motion primitives": "", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "ఆప", + "Stop sound": "", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "", + "Switch to dev mode": "", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "", + "Title text": "", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "", + "Translators...": "", + "Turbo mode": "", + "Turtle": "", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "చరరాశి పేరు ?", + "Variables": "చరరాశులు", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Virtuelle Tastatur", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "అవున", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "", + "Zoom blocks": "", + "Zoom blocks...": "", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ శేష _", + "_ of _": "_ లో _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "", + "add a new Turtle sprite": "", + "add a new sprite": "", + "add comment": "వ్యాఖ్యానించ", + "add comment here...": "", + "agent": "", + "alert _": "", + "all": "అన్", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "మరియ", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "సమాధాన", + "any": "", + "any key": "", + "any message": "ఏదైనా సందేశ", + "anything": "", + "append _": "", + "arrange scripts vertically": "", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ అడిగి, వేచియుండ", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "Helligeit", + "broadcast _ _": "ప్రసార _ _", + "broadcast _ _ and wait": "_ _ ని ప్రసారం చేసి, వేచివుండు", + "brush": "", + "build": "", + "but getting a": "", + "c": "c", + "call _ _": "", + "call _ w/continuation": "", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "తిరుగ గలద", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "_ మార్చడానికి _", + "change _ effect by _": "_ ప్రభావంతో _ మారున", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "పెన్ను రంగు _ కు మార్", + "change pen shade by _": "పెన్ను రంగు షేడ్ _ కు మార్", + "change pen size by _": "న్ను పరిమాణం మార్చేందుకు _", + "change size by _": "పరిమాణంను _ కి మార్", + "change tempo by _": "కదలికలోని తీవ్రతను _ మార్", + "change volume by _": "", + "change x by _": "x విలువ _ కి మార్", + "change y by _": "y విలువ _ కి మార్", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "einschalten, damit Animationen überall gleich laufen", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "", + "check to enable alternating colors for nested blocks": "", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "einschalten um die virtuelle Tastatur auf mobilen Geräten zu ermöglichen", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "శుభ్రం చేయ", + "clear": "తొలగించుట", + "clear graphic effects": "గ్రాఫిక్ ప్రయోజనాలు తొలగించుట", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "_ రంగు _ తాకుతుందా?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "వేషధారణ #", + "costume name": "", + "costumes": "", + "costumes tab help": "Bilder durch hereinziehen von einer anderen Webseite or vom Computer importieren", + "could not connect to:": "", + "cr": "", + "create a clone of _": "", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "తొలగించ", + "delete _": "", + "delete _ of _": "", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "Blockdefinition löschen", + "delete slot": "", + "delete this clone": "", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "", + "development mode debugging primitives:": "", + "development mode...": "", + "dimensions": "", + "direction": "దిక్", + "disable deep-Morphic context menus and show user-friendly ones": "", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "_ కు దూరం", + "distribution": "", + "don't rotate": "తిరుగవద్", + "down arrow": "", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "నకల", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "", + "edit": "సవరించ", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "సవరించ...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "ఎగుమతి", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "ఎగుమతి...", + "extract": "", + "f": "f", + "false": "తప్", + "file": "", + "file menu import hint": "lädt ein exportiertes Projekt, eine Bibliothek mit Blöcken ein Kostüm oder einen Klang", + "fill": "", + "fill page...": "", + "filtered for _": "", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "", + "for each _ in _ _": "", + "for this sprite only": "", + "forever _": "ఎప్పటికి _", + "frame": "", + "frames": "", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "", + "giant (8x)": "", + "glide _ secs to x: _ y: _": "_ సెకన్లకు x: _ y: _ జరుగున", + "global?": "", + "globe": "", + "go back _ layers": "_ లేయర్లు తిరిగి వెళ్ళుట", + "go to _": "_ కు వెళ్", + "go to _ layer": "", + "go to front": "ముందుకు వెళ్", + "go to x: _ y: _": "x: _ y: _ కు వెళ్", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "హలో", + "help": "సహాయ", + "help...": "సహాయ...", + "hide": "దాచిపెట్", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "Basisblöcke ausblenden", + "hide variable _": "_ చరరాశిని దాచు", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "", + "i": "i", + "identical to": "", + "if _ _": "ఒకవేళ _ _", + "if _ _ else _": "ఒకవేళ _ _ ఇంకా _", + "if _ then _ else _": "", + "if on edge, bounce": "అంచున ఉంటే, దూక", + "import a sound from your computer by dragging it into here": "Klänge durch hereinziehen importieren", + "import without attempting to parse or format data": "", + "import...": "", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "", + "input names:": "", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "", + "is _ a _ ?": "", + "is _ empty?": "", + "is _ identical to _ ?": "ist _ identisch mit _ ?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "", + "items": "", + "j": "j", + "join _": "కలుప _", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "_ కీ ఒత్తారా?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Telagu", + "language_translator": "vinayakumar R", + "large": "", + "last": "", + "last changed": "", + "last_changed": "2015-02-20", + "launch _ _": "", + "left": "", + "left arrow": "", + "length": "", + "length of _": "Länge von _", + "length:": "", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "", + "list _": "", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "das offizielle Modul mit mächtigen Blöcken laden", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "", + "make a category...": "", + "make a copy and pick it up": "", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "సందేశ", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "మౌస్ ఒత్తారా?", + "mouse position": "", + "mouse x": "మౌస్ x", + "mouse y": "మౌస్ y", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "", + "move": "జరుగ", + "move _ steps": "_ అడుగులు జరుగ", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "mich", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "", + "next": "", + "next costume": "తదుపరి వేషధారణ", + "none": "", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "లేద _", + "note": "", + "nothing": "", + "now connected.": "", + "number": "", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "", + "only face left/right": "ముఖం ఎడమ-కుడి వైపు మాత్రమే", + "only grab this block": "", + "open a new window with a picture of all scripts": "ein neues Browserfenster mit einem Bild aller Skripte öffnen", + "open a new window with a picture of the stage": "ein neues Browserfenster mit einem Bild der Bühne öffnen", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "ein neues Browserfenster mit einem Bild dieses Skripts öffnen", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "లేదా", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "పెన్ను క్రిందకి", + "pen down?": "", + "pen trails": "", + "pen up": "పెన్ను పైకి", + "pen vectors": "", + "pic...": "", + "pick random _ to _": "_ నుండి _ ను యాదృచ్ఛికంగా ఎంచుకోండి", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "_ సంజ్ఞను వాయించు _ బీట్స్ కోస", + "play sound _": "_ శబ్దం వాయించ", + "play sound _ at _ Hz": "", + "play sound _ until done": "_ ఆగువరకు శబ్దం వాయించ", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "బిందువు _ దిశలో", + "point towards _": "బిందువు _ వైపునక", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "", + "presentation (1.4x)": "", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "", + "release": "", + "remove block variables...": "", + "rename": "", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "", + "rename only this reporter": "", + "rename sound": "", + "rename...": "", + "repeat _ _": "_ _ పునరావృత", + "repeat until _ _": "_ _ పునరావృతం అయ్యేంతవరక", + "replace item _ of _ with _": "", + "report _": "", + "reporter": "", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "సమయసూచిని మళ్ళీ పెట్", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "", + "ring": "", + "ringify": "", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "_ గుండ్రమ", + "run _ _": "", + "run _ w/continuation": "", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "_ అని చెప్", + "say _ for _ secs": "_ సెకన్ల కోసం _ అని చెప్", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "", + "script variables _": "", + "scripts": "", + "scripts pic...": "Bild aller Scripte...", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "_ ప్రయోజనంతో _ పెట్", + "set _ of block _ to _": "", + "set _ to _": "_ లో _ ను పెట్", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "పెన్ను రంగును _ కు పెట్", + "set pen shade to _": "పెన్ను రంగు షేడ్ _ కు పెట్", + "set pen size to _": "పెన్ను పరిమాణం _ కు పెట్టు", + "set size to _ %": "_ % కు పరిమాణాన్ని పెట్", + "set tempo to _ bpm": "_ బి.పి.యం.కు కదలికలోని తీవ్రతను పెట్", + "set this morph's alpha value": "", + "set turbo mode to _": "setze Turbomodus auf _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "x విలువకు _ పెట్", + "set y to _": "y విలువకు _ పెట్", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "చూపించ", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "zeigt globale Benutzerblockdefinitionen als XML im Browser an", + "show primitives": "Basisblöcke anzeigen", + "show project data as XML in a new browser window": "", + "show table _": "", + "show the World's menu": "", + "show variable _": "చరరాశి _ ను చూప", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "", + "slider": "", + "slider max...": "", + "slider min...": "", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "", + "stack size": "", + "stage": "", + "stage image": "", + "stamp": "ముద్", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "నిలుపు _", + "stop all sounds": "అన్నీ శబ్దాలు నిలుప", + "stop frequency": "", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "వేషధారణ _ కు బదలాయించు", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "కదలికలోని తీవ్రత", + "temporary?": "", + "text": "", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "", + "think _": "_ ఆలోచించ", + "think _ for _ secs": "_ సెకన్ల కోసం _ ఆలోచించ", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "", + "this script": "ఈ ఆజ్", + "time in milliseconds": "", + "timer": "సమయసూచి", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "_ రంగును తాకుతుందా?", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "vnkmr7620@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "సత్", + "turbo mode": "", + "turbo mode?": "Turbomodus?", + "turn _ _ degrees": "", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "ausschalten, um Animationen dynamischer auszuführen", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "", + "uncheck to allow script reentrance": "", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "", + "uncheck to disable alternating colors for nested block": "", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "", + "uncheck to disable input sliders for entry fields": "", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "ausschalten um die virtuelle Tastatur auf mobilen Geräten zu sperren", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "", + "uncheck to use the input dialog in short form": "", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "", + "unicode of _": "", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "", + "unused": "", + "unused block(s) removed": "", + "up arrow": "", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "_ సెకన్లు వేచియుండ", + "wait until _": "_ వరకూ వేచియుండ", + "wardrobe": "", + "warp _": "", + "what's your name?": "నీ పేరు ఏమిటి?", + "when I am _": "", + "when I receive _ _": "_ _ నేను స్వీకరించినప్పుడు", + "when I start as a clone": "Wenn ich geklont werde", + "when _": "", + "when _ clicked": "_ ఒత్తినప్పుడ", + "when _ is edited _": "", + "when _ key pressed _": "_ _ కీ ఒత్తినప్పుడ", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "", + "word": "", + "world": "ప్రపంచం", + "write _ size _": "", + "x": "x", + "x position": "x స్థానం", + "y": "y", + "y position": "y స్థానం", + "year": "", + "year:": "", + "your own": "", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ti.js b/elements/pl-snap/Snap/locale/lang-ti.js new file mode 100644 index 00000000..67b53c52 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ti.js @@ -0,0 +1,931 @@ +SnapTranslator.dict.ti = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "' ኣብዚ መዳይ የለን", + "(-90) left": "(-90) ጸጋም", + "(0) up": "(0) ላዕሊ", + "(1) sine": "(1) ሳይን", + "(180) down": "(180) ታሕቲ", + "(2) square": "(2) ርቡዕ ኩርናዕ", + "(3) sawtooth": "(3) ስኒ መጋዝ", + "(4) triangle": "(4) ስሉስ ኩርናዕ", + "(90) right": "(90) የማን", + "(empty)": "(ጥራዩ)", + "About Snap": "ብዛዕባ ስናፕ", + "About...": "ብዛዕባ ስናፕ!...", + "Add scene...": "ዓውደ ፍጻመ ወስኽ...", + "Allow multi-line text input to a block": "ብዓል ብዙሕ መስመር ጽሕፍ ናብ ሕጡብ ምውሳኽ ኣኽእል", + "Animations": "ምንቅስቓሳት", + "Any (unevaluated)": "ኩሉ ዓይነት (ዘይተቐመረ)", + "Any type": "ኩሉ ዓይነት", + "Apply": "ተጠቀም", + "Are you sure you want to delete": "ብርግጽ ክትድምስስ ደሊኻ፧", + "Back...": "ተመለስ...", + "Backgrounds": "ድሕረ ባይታ", + "Backup failed. This cannot be undone, proceed anyway?": "መሐለውታ ምድላው ኣይሰርሐን። ብዘየገድስ ቀጽል፧", + "Block Editor": "ሰደቓ-ዕዮ ሕጡብ", + "Blocks": "ሕጡባት", + "Blocks category name:": "ስም ምድብ፦", + "Blurred shadows": "ደብዛዝ ጽላሎት", + "Boolean": "መንጠቕያ", + "Boolean (T/F)": "መንጠቕያ (ሓ/ጌ)", + "Boolean (unevaluated)": "መንጠቕያ (ዘይተቐመረ)", + "Bring back deleted sprites": "ዝተደምሰሱ ትንኩሊባት ምለስ", + "Brush size": "ዓቐን ኣስባስላ", + "Camera": "መስኣሊት", + "Cancel": "ሰርዝ", + "Catch errors in a script": "ኣተኣላልያ ጌጋታተ ኣብ መርሓ", + "Category color": "ሕብሪ ምድብ", + "Change Password...": "ቃለ-ምስጢር ቀይር...", + "Change block": "ሕጡብ ቀይር", + "Clicking sound": "ድምጺ ቃዕታ", + "Closed brush (free draw)": "ዕጹው፡ ምሉእ ቅርጺ (ናጻ ስኣል)", + "Codification support": "ናብ ኮደ ተርጎሚ", + "Command": "ትእዛዝ", + "Command (C-shape)": "ትእዛዝ (ር-ቅርጹ)", + "Command (inline)": "ትእዛዝ", + "Constrain proportions of shapes? (you can also hold shift)": "ምጣነ ቅርጽታት ሓሉ (መፍትሕ-ምቅይያር ብምጽቃጥ ውን ክፍጸም ይካኣል)", + "Contents": "ትሕዝቶ", + "Contributors": "ኣበርከቲ", + "Control": "መቆጻጸሪ", + "Costume Editor": "ሰደቓ-ዕዮ ልብሲ", + "Costumes": "ኣልባሳት", + "Create input name": "ኣታዊ ሰይም", + "Create variables in program": "ተቓያየርቲ ኣብ መርሓ ኣእቱ", + "Credits...": "ኣበርከቲ...", + "Default": "ውሁብ", + "Default Value:": "ውሁብ ዋጋ:", + "Delete": "ደምስስ", + "Delete Custom Block": "ሕጡብ ደምስስ", + "Delete Project": "ፕሮጀክት ደምስስ", + "Delete a variable": "ተቐያያሪ ደምስስ", + "Disable click-to-run": "ሕጡባት ምጥዋቕ ግታእ", + "Disable dragging data": "ምስሓብ ሰነድ ግታእ", + "Download source": "መበቆላዊ ኮድ ኣራግፍ", + "Dynamic input labels": "ተለወዋጢ ዕላመት ኣታዊ", + "Edge color (left click)": "ሕብሪ ደረት (ጸጋም ጠውቕ)", + "Edit input name": "ስም ኣታዊ ኣርም", + "Edit label fragment": "ዕላመት ኣርም", + "Ellipse (shift: circle)": "ኤሊፕስ (መፍትሕ-ምቅይያር፦ ዓንኬል)", + "Empty": "ባዶ", + "Eraser tool": "መደምሰስ", + "Error": "ጌጋ", + "Examples": "ኣብነታት", + "Export blocks": "ሕጡባት ናብ ደገ ልኣኽ", + "Export blocks...": "ሕጡባት ናብ ደገ ልኣኽ...", + "Export project as plain text...": "ፕሮጀክት ከም ተራ ጽሑፍ ናብ ደገ ልኣኽ...", + "Export project...": "ፕሮጀክት ናብ ደገ ልኣኽ...", + "Export summary...": "ጽማቝ ሓበሬታ ናብ ደገ ልኣኽ....", + "Extension blocks": "ተወሰኽቲ ሕጡባት", + "Fade blocks": "ሕጡባት ኣህስስ", + "Fade blocks...": "ሕጡባት ኣህስስ...", + "Fill a region": "ንዓውዲ ብዝመረጽካዮ ሕብሪ ቅባእ", + "Fill color (right click)": "ሕብሪ ማእከል (የማን ጠውቕ)", + "Filled Ellipse (shift: circle)": "ዝመልአ ኤሊፕስ (መፍትሕ-ምቅይያር፦ ዓንኬል)", + "Filled Rectangle (shift: square)": "ዝመልአ ርቡዕኩርናዕ (መፍትሕ-ምቅይያር፦ ትርብዒት)", + "Flat design": "ብሩህ ንድፊ", + "Flat line ends": "ትኽ ዝበለ መወዳእታ ሕንጻጽ", + "For all Sprites": "ንኩሉ ብሓባር", + "HSL pen color model": "HSL ዓይነት ሕብሪ", + "Hello!": "ከመዓልኪ!", + "Help": "ሓገዝ", + "Hide blocks in palette": "ናይ ጽላት ሕጡባት ከውል", + "Hide blocks...": "ሕጡባት ከውል...", + "Hmm...": "ኣሃ...", + "Hyper blocks support": "ንጡፋት ሕጡባት", + "Import a new costume from your webcam": "ሓድሽ ልብሲ ካብ መስኣሊት ኣእቱ", + "Import blocks": "ሕጡባት ካብ ደገ ጸዓን", + "Import library": "ኣሃዱ ጸዓን", + "Import...": "ኣእቱ...", + "Imported": "ኣትዩ", + "Infinite precision integers, exact rationals, complex": "ደረት ኣልቦ ትኽክል ምሉኣት ቁጽርታት, ትኽክል ተመቕራሒ ቁጽርታት, ሓሳባውያን ቁጽርታት", + "Inheritance support": "ዓይነታዊ ምውራስ", + "Input Names:": "ኣስማት ኣተውቲ፦", + "Input name": "ስም ኣታዊ", + "Input sliders": "ኣንሻታቲ ኣታዊ", + "Inside a custom block": "ኣብ ሓደ ዓሚላዊ ሕጡብ", + "Iteration, composition": "ምድግጋም, ምቛም", + "JavaScript extensions": "ተወሰኽቲ ጃቫስችሪፕት", + "JavaScript extensions for Snap! are turned off": "ተወሰኽቲ ጃቫስችሪፕት ናይ ስናፕ(Snap!) ካብ ንጥፈት ደው ኢሎም", + "JavaScript function ( _ ) { _ }": "ተግባር ጃቫስክሪፕት ( _ ) { _ }", + "Keyboard Editing": "መአረምታ ብሰሌዳ መፋትሕ", + "Kind of": "ዓይነት ናይ", + "LEAP Motion controller": "ሊፕ ተቖጻጻሪ ምንቅስቓስ (LEAP Motion Controller)", + "Language...": "ቋንቋ...", + "Libraries...": "ኣሃዱታት...", + "License": "ፍቓድ", + "License...": "ፍቓድ...", + "Line tool (shift: vertical/horizontal)": "ሕንጻጽ (መፍትሕ-ምቅይያር፦ ትኹል/ጋድም)", + "Line tool (መፍትሕ-ምቅይያር፦ constrain to 45º)": "ሕንጻጽ (Shift: ብዙሕ ዕጽፊ ናይ 45°)", + "List": "ዝርዝር", + "List utilities": "ኣገልግሎታት ዝርዝር", + "Lists": "ዝርዝራት", + "Loading": "እጻዓን ኣሎ", + "Log pen vectors": "ሕንጻጻት ብርዒ መዝገብ", + "Login...": "እቶ...", + "Logout": "ውጻእ", + "Long form input dialog": "ስፊሕ ቅጥዒ ኣታዊ", + "Looks": "ምስሊ", + "Make a block": "ሓድሽ ሕጡብ", + "Make a variable": "ሓድሽ ተቐያያሪ", + "Message name": "ስም መልእኽቲ", + "Method Editor": "ሰደቓ-ዕዮ ሜላ", + "Microphone": "ማይክሮፎን", + "Microphone resolution...": "ንጻረ ማይክሮፎን...", + "Modules...": "ክፍለ-ኣካላት...", + "Motion": "ምንቅስቓስ", + "Multi-branched conditional (switch)": "ብዙሕ ዝጨንፈሮም ኩነታውያን (Switch)", + "Multiple inputs (value is list of inputs)": "ብዙሓት ኣተውቲ (ከም ዝርዝር)", + "Nested auto-wrapping": "ዝተሳኹዐ ጥማር", + "New": "ሓድሽ", + "New Category": "ሓድሽ ምድብ", + "New Project": "ሓድሽ ፕሮጀክት", + "New category...": "ሓድሽ ምድብ...", + "New scene": "ሓድሽ ዓውደ ፍጻመ", + "No": "ኣይፋል", + "Number": "ኣሃዝ", + "OK": "ሕራይ", + "Object": "ውዱዕ", + "Ok": "ሕራይ", + "Open": "ክፈት", + "Open Project": "ፕሮጀክት ክፈት", + "Open in Community Site": "ገጽ ሓበሬታ ናይ ፕሮጀክት ክፈት", + "Open...": "ክፈት...", + "Operators": "ኣስራሕቲ", + "Other": "ተወሳኺ", + "Paint Editor": "ሰደቓ-ዕዮ ስእሊ", + "Paint a new costume": "ሓድሽ ልብሲ ሰኣል", + "Paint a shape (shift: secondary color)": "ንቕርጺ ሕብሪ ቅባእ (መፍትሕ-ምቅይያር፦ ካልኣውያን ሕብርታት)", + "Paintbrush tool (free draw)": "መስኣሊ ኣስባስላ (ናጻ ስኣል)", + "Part of": "ክፋል ናይ", + "Parts": "ክፋላት", + "Pen": "ብርዒ", + "Pipette tool (pick a color anywhere)": "መምጸይ (ብምጥዋቕ፡ ዝደለኻዮ ሕብሪ መሪጽካ ኣልዕል)", + "Plain prototype labels": "ተራ ዕላመት ቅድመ-መርኣያ", + "Play": "ኣቃልሕ", + "Play sound": "ድምጺ ኣቃልሕ", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "ባብ መርበብ ሓበሬታ እዋናዊ ሙኻኑን መስኣሊት ክምዝተስታኻኸልትን ኣረጋግጽ። ኣብ ግሊኡ ባባት መርበብ ሓበሬታ መስኣሊት ንምጥቃም፡ ስናፕ! ብ HTTPS ክኽፍት ኣለዎ። አዚ ንምግባር ን \"http://\" ክፋል ኣድራሻ መርበብ ሓበሬታ ብ \"https://\" ተክእ።", + "Predicate": "ኣረጋጋጺ", + "Prefer empty slot drops": "ባዶ ተሓዝ-ቦታ ሕረ", + "Project Notes": "መግለጺታት ፕሮጀክት", + "Project notes...": "መግለጺታት ፕሮጀክት...", + "Provide 100 selected colors": "100 ዝተመርጹ ሕብርታት", + "Provide getters and setters for all GUI-controlled global settings": "ባእታታት ባብ ተጠቃሚ (GUI) ብመርሓ ተቖጻጸር", + "Publish": "ዘርግሕ", + "Record a new sound": "ሓድሽ ድምጺ ቅረጽ", + "Recover": "ኣምለሰ", + "Rectangle (shift: square)": "ርቡዕኩርናዕ (መፍትሕ-ምቅይያር፦ ትርብዒት)", + "Reference manual": "መወከሲ መጽሓፍ", + "Remove a category...": "ምድብ እለይ...", + "Remove unused blocks": "ኣብ ጥቕሚ ዘይወዓሉ ሕጡባት እለይ", + "Replace the current project with a new one?": "ነዛ ፕሮጀክት ብሓዳሽ ፕሮጀክት ተክኣያ?", + "Reporter": "ተግባር", + "Request blocked": "ጻዊዒት ተዓጊቱ", + "Resend Verification Email...": "መረጋገጺ ኢ-መይል (ኤ-ድብዳበ) ከም ብሓደሽ ስደድ...", + "Reset Password...": "ቃለ-ምስጢር ናብ ፋልማይ ምለስ...", + "Retina display support": "ረቲና ጉልሒ ዓልባ-ምርኢት", + "Save": "ዓቅብ", + "Save As...": "ዓቅብ ኣብ...", + "Save Project": "ፕሮጀክት ዓቅብ", + "Save Project As...": "ፕሮጀክት ዓቅብ፡ ብስም...", + "Save to disk": "ዓቅብ ኣብ መኽዘን ጭብጥታት", + "Saved!": "ተዓቂቡ!", + "Scenes...": "ዓውደ ፍጻመታት...", + "Script variable name": "ናይ መርሓ ስም ተቐያያሪ", + "Scripts": "መርሓ", + "Select a costume from the media library": "ልብሲ ካብ ማዕከን ስእላዊ ሓበሬታ ምረጽ", + "Select a sound from the media library": "ድምጺ ካብ ማዕከን ድምጻዊ ሓበሬታ ምረጽ", + "Select categories of additional blocks to add to this project.": "ብቴማ ዝተጠርነፉ ሕጡባት መሪጽካ ናብ እዚ ፕሮጀክት ወስኽ", + "Selection tool": "ምረጽ", + "Sensing": "ምህዋስ", + "Set RGB or HSV pen color": "ሕብሪ ብርዒ ናብ RGB ወይ HSV ቀይር", + "Set the rotation center": "ማእከል ዙረት ኣንብር", + "Share": "ኣካፍል", + "Show buttons": "መላጉም ኣርኢ", + "Show categories": "ምድባት ኣርኢ", + "Signup...": "ተመዝገብ...", + "Single input.": "ንጽል ኣታዊ.", + "Single palette": "ንጽል ጽላት", + "Slider maximum value": "ላዕልዋይ ዋጋ ኣንሻታቲ", + "Slider minimum value": "ታሕተዋይ ዋጋ ኣንሻታቲ", + "Snap! website": "ስናፕ! መርበብ ሓበሬታ", + "Sound": "ድምጺ", + "Sound Recorder": "መቕረጺ ድምጺ", + "Sounds": "ድምጺ", + "Sprite": "ትንኩሊብ", + "Stage": "መድረኽ", + "Stage height": "ቁመት መድረኽ", + "Stage selected: no motion primitives": "መድረኽ ተመሪጹ፥ መባእታውይን ናይ ምንቅስቓስ ሕጡባት ኣይተረኽቡን", + "Stage size": "ዓቐን መድረኽ", + "Stage size...": "ዓቐን መድረኽ...", + "Stage width": "ጎድኒ መድረኽ", + "Stop": "ደው ኣብል", + "Stop sound": "ምቅላሕ ደው ኣብል", + "Stroked Ellipse (shift: circle)": "ኤሊፕስ (መፍትሕ-ምቅይያር፦ ዓንኬል)", + "Stroked Rectangle (shift: square)": "ርቡዕኩርናዕ (መፍትሕ-ምቅይያር፦ ትርብዒት)", + "Switch back to user mode": "ናብ መዳይ ተጠቃሚ ተመለስ", + "Switch to dev mode": "ናብ መዳይ ጠቢብ ቀይር", + "Table lines": "መስመራት ሰንጠረዥ", + "Table support": "ሰንጠረዥ ምጥቃም ኣኽእል", + "Table view": "ትርኢት ሰንጠረጅ", + "Ternary Boolean slots": "ኣተውቲ ስለስተ ትሕዝቶኡ መንጠቕያ (Boolean)", + "Text": "ፊደል", + "Text to speech": "ጽሑፍ ናብ ዘረባ", + "The question came up at": "እቲ ሕቶ ተላዒሉ ኣብ", + "Thread safe scripts": "ሰንስለታት-መስርሕ(Thread) ዝጻወሩ መርሓታት", + "Title text": "ኣርእስቲ", + "Today": "ሎሚ", + "Translations": "ትርጉማት", + "Translators...": "ተርጐምቲ", + "Turbo mode": "ፈጣን", + "Turtle": "ሓባሪ መኣዝን", + "Undelete sprites...": "ድምሰሳ ትንኩሊባት ሰርዝ...", + "Unpublish": "ምዝርግሕ ደው ኣብል", + "Unsaved Changes!": "ዘይተዓቀበ ለውጥታት!", + "Unshare": "ምክፋል ደው ኣብል", + "Untitled": "ኣርእስቲ ዘይተዋህቦ", + "Unused blocks...": "ኣብ ጥቕሚ ዘይወዓሉ ሕጡባት...", + "Updating project list...": "ዝርዝር ፕሮጀክታት እዝምን...", + "Upvar - make internal variable visible to caller": "ውሽጣውያን ተቐያየርቲ ኣብ ደገ (ንጸዋዒ) ከም ዝራኣዩ ግበር", + "Variable name": "ስም ተቐያያሪ", + "Variables": "ተቐያየርቲ", + "Variadic reporters": "ቫርያዳውያን (Variadic) ተግባራት", + "Vector": "መኣጠን", + "Vector Paint Editor": "ሰደቓ-ዕዮ ስእሊ መኣጠን", + "Visible stepping": "ዘገምታዊ መስርሕ መርሓ መደብ", + "Web Audio API is not supported in this browser": "እዚ ድምጺ መርበብ API በዚ ባብ መርበብ ሓበሬታ ኣይድገፈን እዩ", + "Web services access (https)": "ኣገልግሎታት መርበብ ሓበሬታ ምብጻሕ (https)", + "When _ is edited _": "_ ምስ ዝእረም _", + "Words, sentences": "ቃላት ፡ ምሉእ ሓሳባት", + "Yes": "እወ", + "Yesterday": "ትማሊ", + "Zebra coloring": "ሕብሪ ዘብራ", + "Zoom blocks": "ሕጡባት ኣጉልሕ", + "Zoom blocks...": "ሕጡባት ኣጉልሕ...", + "_ and _": "_ ምስ _", + "_ at _": "_ ኣብ _", + "_ combine _ using _": "_ ጸንብር ንኣባልት ናይ _ ምስ _", + "_ contains _": "_ አጠቓልል ን _", + "_ effect": "ተጽዕኖ _", + "_ find first item _ in _": "_ ቀዳማይ ኣባል ርኸብ፡ _ ኣብ _", + "_ in front of _": "_ ኣብ መጀመርታ ናይ _", + "_ keep items _ from _": "_ ኣባላት መሚኻ ኣትርፍ፡ _ ካብ _", + "_ map _ over _": "_ ኣተግብር _ ኣብ ልዕሊ _", + "_ mod _": "_ ተረፍ _", + "_ of _": "_ ናይ _", + "_ of block _": "_ ናይ ሕጡብ _", + "_ of costume _": "_ ናይ ልብሲ _", + "_ of sound _": "_ ናይ ድምጺ _", + "_ or _": "_ ወይ _", + "_ to _": "_ ናብ _", + "__shout__go__": "ቀጠልያ ባንዴራ ተጠዊቓ", + "a": "አ", + "a custom block definition is missing": "ዓሚላዊ ሕጡብ ኣይተዋደደን", + "a new clone of _": "ሓድሽ ቅዳሕ ናይ _", + "a variable of name '": "ተቐያያሪ ብስም '", + "abs": "ፍጹም ብዝሒ", + "acos": "ኣርክኮስይን", + "add _ to _": "ን _ ናብ _ መልእ", + "add a new Turtle sprite": "ሓድሽ ትንኩሊብ ወስኽ", + "add a new sprite": "ሓድሽ ትንኩሊብ ወስኽ", + "add comment": "መብርሂ ወስኽ", + "add comment here...": "ኣብዚ መብርሂ ወስኽ", + "alert _": "ሓብር፥ _", + "all": "ኩሉ", + "all but first of _": "ኵሉ ብዘይካ ቀዳማይ ናይ _", + "all but this script": "ኩሉ ብዘይካ እዛ መርሓ", + "all scenes": "ኩሉ ዓውደ ፍጻመ", + "anchor": "መልህቕ", + "and": "ምስ", + "and send": "እሞ ልኣኽ", + "answer": "መልሲ", + "any": "ዝኾነ", + "any key": "ዝኾነ መፍትሕ", + "any message": "ዝኾነ መልእኽቲ", + "anything": "ዝኾነ ነገር", + "append _": "ለቅብ _", + "arrange scripts vertically": "መርሓ ንትኹል ስራዕ", + "asin": "ኣርክስይን", + "ask _ and wait": "ሕተት _ እሞ ተጸበ", + "ask _ for _ _": "ን _ ሕተት _ _", + "atan": "ኣርክታንጀንት", + "b": "ብ", + "back": "ዳሕረዋይ", + "balance": "ሚዛን", + "big (2x)": "ዓቢ (2x)", + "block": "ሕጡብ", + "block deletion dialog text": "እዚ ሕጡብ ምስኩሎም ኣብነታቱ ብርግጽ ዶ ክድምሰስ፧", + "block variables...": "ተቓያየርቲ ናይ ሕጡብ...", + "block-solid (0)": "ልሙድ (0)", + "blockify": "ከም ሕጡብ", + "blocks": "ሕጡባት", + "blue": "ሰመያዊ", + "bottom": "ታሕተዋይ ደረት", + "brightness": "ድምቀት", + "broadcast _ _": "ፈንው _ _", + "broadcast _ _ and wait": "ፈንው _ _ እሞ ተጸበ", + "build": "ህነጽ", + "but getting a": "ዝተዋህበ ግን", + "c": "ች", + "call _ _": "_ ጸውዕ _", + "call _ w/continuation": "_ ጸውዕ ምስ መቐጸልታ", + "can only write text or numbers, not a": "ፊደላት ወይ ኣሃዛት ጥራይ እዩ ክጸሓፍ ዝፍቀድ፡ ሓደ ካብ ዘይፍቑዳት", + "can rotate": "ዝዘውር", + "cannot handle zero width or height": "ጎድኒ ወይ ቁመት ባዶ ክኾኑ የብሎምን", + "cannot operate on a deleted sprite": "ኣብ ዝተደምሰሰት ትንኩሊብ ዝኾነ ተግባራት ክፍጸም ኣይካኣልን እዩ", + "cannot send media, sprites or procedures to another scene": "ዝኾን ሓበሬታ፡ ውዱዕ ወይ መርሓ ናብ ካልእ ዓውደ ፍጻመ ምስዳድ ኣይተኻእለን", + "categories": "ምድባት", + "category": "ምድብ", + "ceiling": "ንላዕሊ ኣጸጋግዕ", + "center": "ማእከል", + "center x": "ማእከላይ ነጥቢ ሀ", + "center y": "ማእከላይ ነጥቢ ሰ", + "change _ by _": "_ ብ _ ለውጥ", + "change _ effect by _": "ተጽዕኖ ናይ _ ብ _ ቀይር", + "change background _ by _": "ናይ ድሕረባይታ _ ብ _ ቀይር", + "change balance by _": "ሚዛን ብ _ ቀይር", + "change pen _ by _": "ናይ ብርዒ _ ብ _ ቀይር", + "change pen size by _": "ርጉዲ ብርዒ ብ _ ቀይር", + "change size by _": "ዓቐን ብ _ ቀይር", + "change tempo by _": "ፍጥነት ህርመት ብ _ ቀይር", + "change volume by _": "ዓውታ ብ _ ቀይር", + "change x by _": "ሀ ብ _ ቀይር", + "change y by _": "ሰ ብ _ ቀይር", + "check for alternative GUI design": "ወልዕ፡ ንኣማራጺ ንድፊ ባብ ተጠቃሚ (GUI)", + "check for flat ends of lines": "ወልዕ፡ ንትኽ ዝበለ መወዳእታ ሕንጻጽ", + "check for higher resolution, uses more computing resources": "ወልዕ፡ ልዑል ጉልሒ ንምጥቃም፡ አዚ ብዙሕ ናይ ቅምራ ሓይሊ ይጠልብ", + "check to always show slot types in the input dialog": "ወልዕ፡ ዓይነት ሰነድ ኣብ ቅጥዒ ኣታዊ ንምርኣይ", + "check to disable directly running blocks by clicking on them": "ወልዕ፡ ሕጡባት ምስተጠወቑ ብቐጥታ ስራሕ ከምዘይጅምሩ ንምግባር", + "check to disallow script reentrance": "ወልዕ፡ ኣብ መፈጸምታ ዘይበጽሐ መስርሕ መርሓታት ካብ ምቕጻል ንምግታእ", + "check to enable IDE animations": "ወልዕ፡ ምንቅስቓሳት ስደቓ፡ዕዮ (IDE) ንምፍቃድ", + "check to enable alternating colors for nested blocks": "ወልዕ፡ ተለወዋጢ ሕብሪ ዝተሳኹዑ ሕጡባት", + "check to enable dynamic labels for variadic inputs": "ወልዕ፡ ንቫርያዳውያን (variadic) ኣትውቲ ተለወዋጢ ዕላመትታት ንምሃብ", + "check to enable input sliders for entry fields": "ወልዕ፡ ኣንሻታቲ ኣታዊ ኣብ ሳጹን ምዝገባ ንምጥቃም", + "check to enable using operators on lists and tables": "ወልዕ፡ ተግባራት ናይ ዝርዝራተን ሰንጠረጃትን ንምጥቃም", + "check to hide (+) symbols in block prototype labels": "ወልዕ፡ ንምልክት (+) ኣብ ዕላመት ሕጡባት ቅድመ-መርኣያ ክተርኢ", + "check to inherit from": "ወልዕ፡ ንኽትወርስ ካብ", + "check to prevent contents from being saved": "ኣጥፍእ፡ ምዕቃብ ትሕዝቶ ኣብ ውሽጢ ፕሮጀክት ንምግትእ", + "check to prioritize script execution": "ወልዕ፡ ፍጻመ መርሓ ንምቕዳም", + "check to show all blocks in a single palette": "ወልዕ፡ ኩሎም ሕጡባት ኣብ ንጽል ጽላት ንምርኣይ", + "check to show buttons in the palette": "ወልዕ፡ መላጉም ኣብ ጽላት ንምርኣይ", + "check to show category names in the palette": "ወልዕ፡ ኣስማት ምድባት ኣብ ጽላት ንምርኣይ", + "check to show extension primitives in the palette": "ወልዕ፡ ተወሰኽቲ ሕጡባት ኣብ ጽላት ንምርኣይ", + "check to support native JavaScript functions": "ወልዕ፡ ተግባራት ጃቫስክሪፕት ብቐጥታ ኣብ ስናፕ(Snap!) ንምጥቃም", + "check to switch pen colors and graphic effects to HSL": "ወልዕ፡ ሕብሪ ብርዒን ስእላዊ ተጽዕኖታት ናብ HSL ንምቕያር", + "check to turn block clicking sound on": "ወልዕ፡ ድምጺ ቃዕታ ንምቅላሕ", + "check to turn on logging pen vectors": "ወልዕ፡ ሕንጻጻት ብርዒ ንምምዝጋብ", + "check to turn on visible stepping (slow)": "ወልዕ፡ መስርሕ መርሓ ንምክትታል (ዘገምታዊ መስርሕ)", + "check to use blurred drop shadows and highlights": "ወልዕ፡ ደብዛዝ ጽላሎትን ብርሃንን ንምጥቃም", + "children": "ውሉዳት", + "clean up": "ኣጽሪ", + "clear": "ደምስስ", + "clear graphic effects": "ስእላዊ ተጽዕኖ እለይ", + "click or drag crosshairs to move the rotation center": "መስቀል-ዕላማ ጠውቕ ወይ ስሓብ ማእከል ዙረት ንምቕያር", + "clicked": "ምስ ተጠወቕኩ", + "clone": "ቅዳሕ", + "clones": "ቅዳሓት", + "color": "ሕብሪ", + "color _ is touching _ ?": "ሕብሪ _ ን _ ተተንኪፉ፧", + "columns": "ዓምድታት", + "combinations _": "ጽንባረታት _", + "combine _ using _": "ጸንብር ንኣባልት ናይ _ ምስ _", + "comic": "ውቁጥ", + "command": "ትእዛዝ", + "comment pic...": "ስእሊ መብርሂ...", + "compile": "ኣርንብ", + "compile _": "_ ኣርንብ", + "confetti": "ኮንፈቲ", + "console log _": "ኣብ ሰደቓ መዝግብ፥ _", + "continuations cannot be forked": "መቐጸልታታት በይኖም ክጅምሩ ኣይክእሉን እዮም", + "cos": "ኮስይን", + "costume": "ልብሲ", + "costume #": "ልብሲ ቁጽሪ", + "costume name": "ስም ልብሲ", + "costumes": "ኣልባሳት", + "costumes tab help": "ስእሊ ንምእታው፡ መዝገብ ስእሊ ካብ ኮምፒዩተር ወይ ካብ ገጻት መርበብ ሓበሬታ ናብዚ ሰሓብ", + "cr": "ሓድሽ መስመር", + "create a clone of _": "ናይ _ ቅዳሕ ኣዳሉ", + "current": "ህሉው", + "current _": "ህሉው _", + "current module versions:": "ህሉው ሕታማት ክፍለ-ኣካላት", + "current parent": "እዋናዊ ወላዲ", + "custom?": "ዓሚላዊ?", + "cut from _": "ካብ _ ቆሪጽካ እለ", + "d": "ድ", + "dangling?": "ዝተንጠልጠለ?", + "data": "ሓበሬታ", + "date": "ዕለት", + "day of week": "መዓልቲ", + "defaults": "ውህብቶታት", + "define _ _ _": "_ _ _ ኣቑም", + "definition": "መግለጺ", + "delete": "ደምስስ", + "delete _ of _": "_ ካብ _ ደምስስ", + "delete a category...": "ምድብ ደምስስ...", + "delete block _": "ሕጡብ _ ደምስስ", + "delete block definition...": "መምርሒ ሕጡብ ደምስስ...", + "delete slot": "ሳጹን ደምስስ", + "delete this clone": "ነዚ ቅዳሕ ደምስስ", + "delete variable": "ተቐያያሪ ድምስስ", + "demo (1.2x)": "መፈተኒ (1.2x)", + "detach all parts": "ኩሎም ኣባላት ፈላሊ", + "detach from": "ፍለ ካብ", + "development mode": "መዳይ ጠቢብ", + "development mode debugging primitives:": "መዳይ ጠቢብ መጸጸይ መባእታውይን ሕጡባት", + "dimensions": "ዓቐናት", + "direction": "ኣንፈት", + "disable deep-Morphic context menus and show user-friendly ones": "ሞርፊክ ደው ኣብል", + "disable dragging media and blocks out of watchers and balloons": "ወልዕ፡ ሰነዳትን ሕጡባትን ካብ ትቓያየርትን ዓፍራታት ዘረባን ስሒብካ ካብ ምውጻእ ምግታእ", + "distance": "ርሕቀት", + "don't rotate": "ዘይዘውር", + "down arrow": "ኲናት ንታሕቲ", + "download this script as an XML file": "ነዚ መርሓ ከም ሰነድ XML ኣራግፍ", + "draggable": "ዝስሓብ", + "draggable?": "ዝሰሓብ?", + "dropped": "ምስ ጠፋእኩ", + "duplicate": "ኣባዝሕ", + "duplicate block definition...": "መምርሒ ሕጡብ ኣባዝሕ...", + "duration": "ዕምሪ", + "e": "እ", + "e^": "e^", + "edge": "ደረት", + "edit": "ኣተዓራሪ", + "edit the costume's rotation center": "ማእከል ዙረት ናይ ልብሲ ኣርኢን ኣተዓራርን", + "edit...": "ኣተዓራሪ...", + "editables": "ኣተውቲ", + "elegant (90)": "ምዕሩግ (90)", + "enable Morphic context menus and inspectors, not user-friendly!": "ተግባራት ሞርፊክ ኣበራብር", + "enter": "ኣእቱ", + "exceeding maximum number of clones": "ዝለዓለ ፍቑድ ብዝሒ ቅዳሓት ተጣሒሱ", + "expecting": "ትጽቢት", + "expecting a": "ትጽቢት", + "expecting a finite number but getting Infinity or NaN": "ትጽቢት ታእላው ኣሃዝ ዝተዋህበ ግን ኢታእላው ኣሃዝ ወይ ኣሃዝ ዝይኮነ", + "export": "ናብ ደገ ልኣኽ", + "export block definition...": "መምርሒ ሕጡብ ናብ ደገ ልኣኽ...", + "export pen trails line segments as SVG": "ሕንጻጻት ኣብ ኣሰራት ብርዒ ከም SVG ናብ ደገ ልኣኽ", + "export script": "መርሓ ናብ ደገ ልኣኽ", + "export...": "ናብ ደገ ልኣኽ...", + "extract": "ኣውጽእ", + "f": "ፍ", + "false": "ጌጋ", + "file menu import hint": "ፕሮጀክት ካብ ደገ ጸዓን, እኩብ ሕጡባት, ልብሲ ወይ ድምጺ", + "fill": "ቅባእ", + "filtered for _": "ን _ ዝተመምየ", + "find blocks": "ሕጡባት ኣናዲ", + "find first item _ in _": "ቀዳማይ ኣባል ርኸብ፡ _ ኣብ _", + "find unused global custom blocks and remove their definitions": "ኣብ ጥቕሚ ዘይወዓሉ ሕጡባት ረኺብካ እለይ", + "fisheye": "ዓይኒ ዓሳ", + "flat line ends": "ትኽ ዝበለ መወዳእታ ሕንጻጽ", + "flatten": "ዘርዝር", + "floor": "ንታሕቲ ኣጸጋግዕ", + "for _ = _ to _ _": "ን _ = _ ክሳብ _ _", + "for all sprites": "ንኹለን ትንኩሊባት", + "for each _ in _ _": "ንነፍሲ-ወከፍ _ ኣብ _ _", + "for this sprite only": "ነዛ ትንኩሊብ ጥራይ", + "forever _": "ቀጻሊ ድገም _", + "frames": "መቓናት", + "frequency": "ድግግም", + "front": "ቀዳማይ", + "ftte tool (pick a color from anywhere shift: secondary color)": "መምጸይ ብምጥዋቕ፡ ዝደለኻዮ ሕብሪ መሪጽካ ኣልዕል (መፍትሕ-ምቅይያር፦ ካልኣውያን ሕብርታት)", + "g": "ግ", + "get blocks": "ሕጡባት ኣምጽእ", + "get data": "ሰነዳት ኣምጽእ", + "ghost": "ርእየት-ሓላፍ", + "giant (8x)": "ደርማስ (8x)", + "glide _ secs to x: _ y: _": "ን _ ካልኢት ናብ ነቑጣ ሀ: _ ሰ: _ ኣንሳፍፍ", + "global?": "ሓፈሻዊ?", + "go back _ layers": "_ ቀጸላ ንድሕሪት ተመለስ", + "go to _": "ናብ _ ኪድ", + "go to _ layer": "ናብ _ ቀጸላ ኪድ", + "go to x: _ y: _": "ናብ ነቑጣ ሀ: _ ሰ: _ ኪድ", + "green": "ቀጠልያ", + "h": "ህ", + "height": "ቁመት", + "hello": "ከመዓልኪ", + "help": "ሓገዝ", + "help...": "ሓገዝ...", + "hide": "ከውል", + "hide blocks...": "ሕጡባት ከውል...", + "hide variable _": "ተቐያያሪ _ ከውል", + "high": "ላዕሊ", + "hour": "ሰዓት", + "http:// _": "http:// _", + "hue": "ሕብሪ", + "huge (4x)": "ገዚፍ (4x)", + "i": "ኢ", + "if _ _": "እንተ _ _", + "if _ _ else _": "እንተ _ _ እንተዘይኮነ _", + "if _ then _ else _": "እንተ _ ሽዑ _ እንተዘይኮነ _", + "if on edge, bounce": "ደረት እንተ ተንኪፍካ፡ ተመለስ", + "import a sound from your computer by dragging it into here": "ድምጺ ንምእታው፡ መዝገብ ድምጺ ካብ ኮምፒዩተር ናብዚ ስሓብ", + "import without attempting to parse or format data": "ሓበሬታ ወይ ሰነድ ብዘይ ምቅይያር ካብ ደገ ኣእቱ", + "import...": "ካብ ደገ ኣእቱ...", + "in palette": "ኣብ ጽላት", + "including dependencies": "ምስ ኩሎም ኣብ ጥቕሚ ዘለው ሕጥባት", + "index": "ተርታ", + "index of _ in _": "ተርታ ናይ _ ኣብ _", + "inherit _": "ውረስ _", + "inherited": "ዝተወርሰ", + "input list:": "ዝርዝር ኣተውቲ፦", + "input names:": "ኣስማት ኣተውቲ፦", + "insert _ at _ of _": "_ ኣብ _ ናይ _ ኣእቱ", + "insert a slot": "ሳጹን ኣእቱ", + "insert a variable": "ተቐያያሪ ኣእቱ", + "is _ a _ ?": "_ _ ዶ እዩ፧", + "is _ empty?": "_ ባዶ ዶ እዩ?", + "is _ identical to _ ?": "_ ምስ _ ሓደ ዓይነት ዶ እዮም፧", + "is _ ?" : "_ ሓደ ዓይነት ዶ እዮም፧", + "identical to": "ምስ", + "is _ on?": "_ ዶ እዩ፧?", + "is not a valid option": "ብቑዕ ኣማራጺ ኣይኮነን", + "is read-only": "ክንበብ ጥራይ ዝኽእል", + "item": "ኣባል", + "item _ of _": "ኣባል _ ናይ _", + "items": "ባእታታት", + "j": "ጅ", + "join _": "ኣታሓሕዝ _", + "k": "ክ", + "keep items _ from _": "ኣባላት መሚኻ ኣትርፍ፡ _ ካብ _", + "key": "መፍትሕ", + "key _ pressed?": "መፍትሕ _ ተጸቒጡ፧", + "l": "ል", + "label": "ዕላመት", + "language_name": "ትግርኛ", + "language_translator": "ተስፋልደት ነጋሽ እያሱ, ሄራን ተወልደ ስዩም", + "large": "ዓቢ", + "last": "መወዳእታ", + "last_changed": "2023-05-29", + "launch _ _": "_ ጀምር _", + "left": "ጸጋማይ ደረት", + "left arrow": "ኲናት ንጸጋም", + "length": "ንውሓት", + "length of _": "ንውሓት ናይ ጽሕፈት _", + "length:": "ንውሓት:", + "letter": "ፊደል", + "letter _ of _": "_ ፊደል ናይ _", + "light (70)": "ፈኵስ (70)", + "lightness": "ብርሃንነት", + "line": "መስመር", + "lines": "መስመራት ጽሑፍ", + "list": "ዝርዝር", + "list _": "ዝርዝር _", + "list view...": "ትርኢት ዝርዝር...", + "ln": "ln", + "log pen vectors": "ሕንጻጻት ብርዒ መዝገብ", + "low": "ታሕቲ", + "m": "ም", + "make a block...": "ሓድሽ ሕጡብ ህነጽ...", + "make a category...": "ሓድሽ ምድብ ኣዳሉ...", + "make a copy and pick it up": "ቅዳሕ ንቕዳሕ ካኣ ሓዝ", + "make temporary and hide in the sprite corral": "ግዜያዊ ግበር ኣብመዕቆቢ ትንኩሊብ ድማ ሕባእ", + "map _ over _": "ኣተግብር _ ኣብ ልዕሊ _", + "max": "ዝለዓለ", + "maximum": "ዝለዓለ", + "medium (50)": "ማእከላይ (50)", + "menus": "ዝርዝራት", + "message": "መልእኽቲ", + "microphone _": "ማይክሮፎን _", + "minimum": "ዝተሓተ", + "minute": "ደቒቕ", + "mirror video": "ቪድዮ መረጼን", + "missing / unspecified extension": "ዝጎደለ / ዘይተወሰነ ተወሳኺ", + "monstrous (10x)": "ዓርሞሸሽ (10x)", + "month": "ወርሒ", + "mosaic": "ሞዛይክ", + "motion": "ምንቅስቓስ", + "mouse down?": "መጥልዕ ኣንጭዋ ተጸቒጡ፧", + "mouse position": "ነቑጣ ኣንጭዋ", + "mouse x": "ሀ ነቑጣ ኣንጭዋ", + "mouse y": "ሰ ነቑጣ ኣንጭዋ", + "mouse-departed": "ኣንጭዋ ምስ ዝፍንተተኒ", + "mouse-entered": "ኣንጭዋ ምስ ዝትንክፈኒ", + "mouse-pointer": "ኣመልካቲ-ኣንጭዋ", + "move": "ኣንቀሳቕስ", + "move _ steps": "_ ስጉምቲ ኪድ", + "my": "መለለዪ", + "my _": "መለለዪ _", + "my anchor": "መለለዪ መልህቕ", + "my dangling?": "መለለዪ ዝተንጠልጠለ?", + "my draggable?": "መለለዪ ዝሰሓብ?", + "my name": "መለለዪ ስም", + "my parent": "መለለዪ ወላዲ", + "my rotation style": "መለለዪ ዓይነት ዙረት", + "my rotation x": "መለለዪ ማእከል ዙረት ሀ", + "my rotation y": "መለለዪ ማእከል ዙረት ሰ", + "my temporary?": "መለለዪ ግዜያዊ?", + "myself": "ባዕለይ", + "n": "ን", + "name": "ስም", + "negative": "ኣሉታ ስእሊ", + "neighbors": "ጎረባብቲ", + "new costume _ width _ height _": "ሓድሽ ልብሲ _ ጎድኒ _ ቁመት _", + "new line": "ሓድሽ መስመር", + "new sound _ rate _ Hz": "ሓድሽ ድምጺ _ ብመጠን ህርመት _ ሀርጽ(Hz)", + "new...": "ሓድሽ...", + "next": "ቀዳሚ", + "next costume": "ቀጺላ ዘላ ልብሲ", + "none": "ዋላ ሓደ", + "normal": "ልሙድ", + "normal (1x)": "ልሙድ (1x)", + "not": "ኣሉታ", + "not _": "ኣሉታ _", + "note": "ቃና", + "nothing": "ዋላ ሓደ", + "number": "ኣሃዝ", + "number of channels": "ብዝሒ መስመራት", + "numbers from _ to _": "ኣሃዛት ካብ _ ናብ _", + "o": "ኦ", + "object _": "ውዱዕ _", + "only duplicate this block": "ነዛ ሕጡብ ጥራይ ኣባዝሕ", + "only face left/right": "ናብ የማን ወይ ናብ ጸጋም ጥራይ ዝዘወር", + "only grab this block": "ነዛ ሕጡብ ጥራይ ኣንቀሳቕስ", + "open in dialog...": "ኣብ ሓድሽ መስኮት ክፈት", + "or": "ወይ", + "other clones": "ካልኦት ቅዳሓት", + "other scripts in sprite": "ካልእ መርሓታት ኣብዚ ዉዱዕ", + "other sprites": "ካልእ ትንኩሊባት", + "p": "ፕ", + "paint a new sprite": "ሓድሽ ትንኩሊብ ስኣል", + "parent": "ወላዲ", + "parent...": "ወላዲ...", + "parts": "ክፋላት", + "paste on _": "ናብ _ ለጥፍ", + "pause all _": "ንኹሉ ኣዕርፍ _", + "pen _": "ብርዒ _", + "pen down": "ብርዒ ንታሕቲ", + "pen down?": "ብርዒ ታሕቲ፧", + "pen trails": "ኣሰራት ብርዒ", + "pen up": "ብርዒ ንላዕሊ", + "pen vectors": "ሕንጻጻት ብርዒ", + "pic...": "ስእሊ ናብ ደገ ልኣኽ...", + "pick random _ to _": "ናይ ሃውሪ ቁጽሪ ካብ _ ናብ _", + "pipe _ $arrowRight _": "ኣሕልፍ _ $arrowRight _", + "pivot": "መቐልስ", + "pixelate": "ዋህዮ ስእሊ", + "pixels": "ዋህዮ ስእሊ (ፒክሰል)", + "play _ Hz for _ secs": "_ ሀርጽ(Hz) ን _ ካልኢት ኣቃልሕ", + "play frequency _ Hz": "ድግግም _ ሀርጽ(Hz) ኣቃልሕ", + "play note _ for _ beats": "ንቃና _ ን _ ህርመት ኣቃልሕ", + "play sound _": "ንድምጺ _ ኣቃልሕ", + "play sound _ at _ Hz": "ንድምጺ _ ብ _ ሀርጽ(Hz) ኣቃልሕ", + "play sound _ until done": "ንድምጺ _ ክሳብ ትውዳእ ኣቃልሕ", + "point in direction _": "ኣንፈትካ ናብ _ ደረጃ ቀይር", + "point towards _": "ናብ _ ኣንፍት", + "position": "ነቑጣ", + "predicate": "ኣረጋጋጺ", + "presentation (1.4x)": "መርኣይ (1.4x)", + "pressed": "ምስ ተጸቐጥኩ", + "previous": "ሰዓቢ", + "product": "ርባሕ", + "q": "ቅ", + "r": "ር", + "r-g-b-a": "ቀ-ቀ-ሰ-ጋ (R-G-B-A) መጠናት ሕብሪ", + "random": "ሃውሪ", + "random position": "ናይ ሃውሪ ነቑጣ", + "rank": "ጽፍሒ", + "raw data...": "ጥረ ሓበሬታ...", + "ray length": "ቁመት ጩራ", + "receivers...": "ተቐባሊ...", + "recording": "ምዝጉብ-ድምጺ", + "red": "ቀይሕ", + "redrop": "ዳግም ኣንብር", + "relabel...": "ዕላመት ቀይር...", + "release": "ፍታሕ", + "rename": "ዳግም ሰይም", + "rename all blocks that access this variable": "ኩሎም ነዚ ተቓያያሪ ዝውከሱ ሕጡባት ዳግም ሰይም", + "rename all...": "ንኹሎም ዳግም ሰይም...", + "rename background": "ድሕረ ባይታ ዳግም ሰይም", + "rename costume": "ልብሲ ዳግም ሰይም", + "rename only this reporter": "ነዚ ሕጡብ ጥራይ ዳግም ሰይም", + "rename sound": "ድምጺ ዳግም ሰይም", + "rename...": "ዳግም ሰይም...", + "repeat _ _": "_ ግዜ ድገም _", + "repeat until _ _": "ክሳብ _ ድገም _", + "replace item _ of _ with _": "ንኣባል _ ናይ _ ብ _ ተክእ", + "report _": "ጸብጻብ ሃብ _", + "reporter": "ተግባር", + "reporter didn't report": "ጸብጻቢ ተግባር መልሲ ኣይሃበን", + "reset columns": "ግፍሒ ዓምዲታት ናብ ፈለማ ምለስ", + "reset timer": "ሰዓት ዓቐን ከም ብሓድሽ ጀምር", + "reshape _ to _": "ዳግም ስራዕ _ ብ _", + "resolution": "ንጻረ", + "rest for _ beats": "ምቅልሕ ን _ ህርመት ደው ኣብል", + "result pic...": "ስእሊ ውጽኢት...", + "reverse": "ግልባጥ", + "right": "የማናይ ደረት", + "right arrow": "ኲናት ንየማን", + "ring": "ቀለቤት", + "ringify": "ኣብ ቀለቤት ኣእቱ", + "rotate": "ኣዙር", + "rotation style": "ዓይነት ዙረት", + "rotation x": "ማእከል ዙረት ሀ", + "rotation y": "ማእከል ዙረት ሰ", + "round _": "_ ኣጸጋግዕ", + "run _ _": "_ ፈጽም _", + "run _ w/continuation": "_ ፈጽም ምስ መቐጸልታ", + "s": "ስ", + "sample rate": "መጠን ናሙና", + "samples": "ናሙና", + "saturation": "ቅጸት", + "save a picture of all scripts": "ስእሊ ናይ ኩሎም መርሓታት ዓቅብ", + "save a picture of both this script and its result": "ስእሊ ናይ እዚ መርሓን ውጽኢቱን ዓቅብ", + "save a picture of the stage": "ስእሊ ናይ መድረኽ ዓቅብ", + "save a picture of this comment": "ናይዚ መብርሂ ስእሊ ዓቅብ", + "save a picture of this script": "ስእሊ ናይ እዚ መርሓ ዓቅብ", + "save a summary of this project": "ናይ ፕሮጀክት ጽማቝ ሓበሬታ ዓቅብ", + "save global custom block definitions as XML": "ኩሎም ዓሚላውያን ሕጡባት ከም ሰነድ XML ዓቅብ", + "save project data as XML to your downloads folder": "ፕሮጀክት ከም ሰነድ XML ኣብ መኽዘን ዝተራገፈ ሰነዳት ናይ ባብ መርበብ ሓበሬታ ዓቅብ", + "say _": "_ በል", + "say _ for _ secs": "_ በል ን _ ካልኢት", + "scope": "ዓውዲ", + "script": "መርሓ", + "script pic...": "ስእሊ መርሓ...", + "script variables _": "ናይ መርሓ ተቐያያሪ _", + "scripts": "መርሓታት", + "scripts pic...": "ስእሊ ናይ መርሓ...", + "scrolled-down": "ንታሕቲ ምስ ዝጥቕለል", + "scrolled-up": "ንላዕሊ ምስ ዝጥቕለል", + "second": "ካልኢት", + "select": "ምረጽ", + "self": "ገዛእ-ርእሲ", + "senders...": "ሰዳዲ...", + "set _ effect to _": "ተጽዕኖ _ ናብ _ ቀይር", + "set _ of block _ to _": "_ ናይ ሕጡብ _ ናብ _ ቀይር", + "set _ to _": "_ ናብ _ ቀይር", + "set background _ to _": "ናይ ድሕረባይታ _ ናብ _ ቀይር", + "set background color to _": "ሕብሪ ድሕረባይታ ናብ _ ቀይር", + "set balance to _": "ሚዛን ናብ _ ቀይር", + "set instrument to _": "መሳርሒ ናብ _ ቀይር", + "set pen _ to _": "ናይ ብርዒ _ ናብ _ ቀይር", + "set pen color to _": "ሕብሪ ብርዒ ናብ _ ቀይር", + "set pen size to _": "ርጉዲ ብርዒ ናብ _ ቀይር", + "set size to _ %": "ዓቐን ናብ _ % ቀይር", + "set tempo to _ bpm": "ፍጥነት ህርመት ናብ _ ህርመት/ደቒቕ ቀይር", + "set video transparency to _": "ናይ ቪዲዮ ርእየት-ሓላፍ ናብ _ ቀይር", + "set volume to _ %": "ዓውታ ናብ _ % ቀይር", + "set x to _": "ሀ ናብ _ ቀይር", + "set y to _": "ሰ ናብ _ ቀይር", + "setting the rotation center requires a costume": "ማእከል ዙረት ምስ ልብሲ ጥራይ እዩ ክንበር ዝከኣል", + "settings menu prefer empty slots hint": "ወልዕ፡ ኣብ ምንባር ሕጡባት ባዶ ትሓዝቲ-ቦታ ንምሕራይ", + "several block definitions already match this label": "ከም እዚ ዕላመት ዘለወን ድሮ ብዙሓት ሕጡባት ተዋዲደን ኣለዋ", + "shimmering (80)": "ዘብለጭልጭ (80)", + "show": "ኣርኢ", + "show all": "ኩሉ ኣርኢ", + "show project data as XML in a new browser window": "ፕሮጀክት ከም XML ኣብ መስኮት ባብ መርበብ ሓበሬታ ኣርኢ", + "show variable _": "ተቐያያሪ _ ኣርኢ", + "shown?": "ተራእዩ፧", + "sin": "ሳይን", + "size": "ዓቐን", + "slider": "ኣንሻታቲ", + "slider max...": "ላዕልዋይ ዋጋ...", + "slider min...": "ታሕተዋይ ዋጋ...", + "slots": "ቃጽዖታት", + "snap": "ስእሊ", + "sounds": "ድምጺ", + "space": "ባዶ ቦታ", + "spectrum": "ዝርገሐ ድግግም", + "split _ by _": "_ ኣብ _ ፍለ", + "sprite": "ትንኩሊብ", + "sprites": "ትንኩሊባት", + "sqrt": "ሱር ትርብዒት", + "stack size": "ዓቐን ቅሚጦ", + "stage": "መድረኽ", + "stamp": "ሕተም", + "stick to": "ኣጥብቕ ኣብ", + "stop _": "_ ደው ኣብል", + "stop all sounds": "ኩሎም ድምጽታት ደው ኣብሎም", + "stop frequency": "ድግግም ደው ኣብል", + "stopped": "ደው ምስ ዝብል", + "store this project in the downloads folder (in supporting browsers)": "ነዛ ፕሮጀክት ኣራግፍ ኣብ ውሽጣዊ መኽዘን ዓቅብ (ብኩለን ባባት መርበብ ሓበሬታ ክይድገፍ ይኽእል)", + "stretch _ x: _ y: _ %": "_ ሀ: _ ሰ: _ % ምጠጥ", + "subtle (95)": "ደብዛዝ (95)", + "sum": "ድምር", + "svg...": "SVG ናብ ደገ ልኣኽ...", + "switch to costume _": "ልብሲ _ ቀይር", + "switch to scene _ _": "ናብ ዓውደ ፍጻመ _ ቀይር _", + "t": "ት", + "tab": "መፈላልጦ", + "table view...": "ትርኢት ሰንጠረጅ...", + "take a camera snapshot and import it as a new sprite": "ብመስኣሊት ዝተላዕለ ዉዱዕ ወስኽ", + "tan": "ታንጀንት", + "tell _ to _ _": "ን _ _ ንገር _", + "tempo": "ፍጥነት ህርመት", + "temporary?": "ግዜያዊ?", + "text": "ጽሑፍ", + "text-only (100)": "ጽሑፍ ጥራይ (100)", + "the predicate takes too long for a custom hat block": "እዛ ኣረጋጋጺት ተግባር ንዓሚላዊ ናይ ፍጻመ ሕጡብ ብዙሕ ግዜ ትወስድ ኣላ", + "there are currently no unused global custom blocks in this project": "እዚ ፕሮጀክት ኣብዚ ህሞት ኣብ ጥቕሚ ዘይወዓሉ ሕጡባት የብሉን", + "there are currently no vectorizable pen trail segments": "ሕጂ ናብ SVG ክቕየሩ ዝኽእሉ ኣሰራት ብርዒ የለዉን", + "thing": "ገለ ነገር", + "think _": "_ ብምባል ኣስተንትን", + "think _ for _ secs": "_ ብምባል ን _ ካልኢት ኣስተንትን", + "this _": "እዛ _", + "this block": "እዛ ሕጡብ", + "this project doesn't have any custom global blocks yet": "ኣብ'ዚ ፕሮጀክት ገና ሓፈሻውያን ሕጡባት የለውን", + "this script": "እዛ መርሓ", + "time in milliseconds": "ግዜ ብ ሚሊካልኢት", + "timer": "ሰዓት ዓቐን", + "to": "ናብ", + "top": "ላዕለዋይ ደረት", + "touching _ ?": "_ ተተንኪፉ፧", + "transient": "ግዜያዊ", + "translations...": "ትርጉማት...", + "translator_e-mail": "winna.programming@gmail.com", + "transparency": "ርእየት-ሓላፍ", + "transpose": "ለዋውጥ", + "trash is empty": "ዘንቢል ጉሓፍ ጥራዩ እዩ", + "true": "ቅኑዕ", + "turbo mode": "ፈጣን", + "turn _ _ degrees": "_ _ ደረጃ ዙር", + "turn all pen trails and stamps into a new background for the stage": "ኩሉ ኣሰራት ብርዒን ማሕተማትን ናብ ድሕረ ባይታ ናይ መድረኽ ቀይር", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "ካብ ኩሉ ኣሰራት ብርዒን ማሕተማትን ሓድሽ ልብሲ ነታ ተመሪጻ ዘላ ትንኩሊብ ሰንዕ", + "type": "ዓይነት", + "type of _": "ዓይነት ናይ _", + "u": "ኡ", + "unable to convert to": "ኣይክኣልን ምቕያር ናብ", + "unable to inherit (disabled or circular?)": "ክወርስ ኣይከኣለን (ዝጠፍአ ወይ ዓንኬላዊ?)", + "unable to nest (disabled or circular?)": "ክሳዃዕ ኣይከኣለን (ዝጠፍአ ወይ ዓንኬላዊ?)", + "uncheck for default GUI design": "ኣጥፍእ፡ ንልሙድ ንድፊ ባብ ተጠቃሚ (GUI)", + "uncheck for lower resolution, saves computing resources": "ኣጥፍእ፡ ብትሑት ጉልሒ ናይ ቅምራ ሓይሊ ንምዕቃብ", + "uncheck for round ends of lines": "ኣጥፍእ፡ ንዓንኬላዊ መወዳእታ ሕንጻጽ", + "uncheck to allow dropped reporters to kick out others": "ኣጥፍእ፡ ዝተነብሩ ሕጡባት ምልጋስ ንምኻል", + "uncheck to allow script reentrance": "ኣጥፍእ፡ ኣብ መፈጸምታ ዘይበጽሐ መስርሕ መርሓታት ምቕጻል ንምኽኣል", + "uncheck to always show (+) symbols in block prototype labels": "ኣጥፍእ፡ ንምልክት (+) ካብ ዕላመት ሕጡባት ቅድመ-መርኣያ ክትስውር", + "uncheck to disable IDE animations": "ኣጥፍእ፡ ምንቅስቓሳት ስደቓ-ዕዮ (IDE) ንምግታእ", + "uncheck to disable alternating colors for nested block": "ኣጥፍእ፡ ተለወዋጢ ሕብሪ ዝተሳኹዑ ሕጡባት", + "uncheck to disable dynamic labels for variadic inputs": "ኣጥፍእ፡ ንቫርያዳውያን (variadic) ኣትውቲ ተለወዋጢ ዕላመታት ንምኽልካል", + "uncheck to disable input sliders for entry fields": "ኣጥፍእ፡ ኣንሻታቲ ኣታዊ ካብ ሳጹን ምዝገባ ንምውጋድ", + "uncheck to disable support for native JavaScript functions": "ኣጥፍእ፡ ዝውታረ መበቆላውያን ተግባራት ጃቫስክሪፕት ንምውጋድ", + "uncheck to disable using operators on lists and tables": "ኣጥፍእ፡ ምጥቃም ተግባራት ናይ ዝርዝራተን ሰንጠረጃትን ንምግታእ", + "uncheck to disinherit": "ኣጥፍእ፡ ምውራስ ድው ንምባል", + "uncheck to drag media and blocks out of watchers and balloons": "ኣጥፍእ፡ ሰነዳትን ሕጡባትን ካብ ትቓያየርትን ዓፍራታት ዘረባን ስሒብካ ንምውጻእ", + "uncheck to enable directly running blocks by clicking on them": "ኣጥፍእ፡ ሕጡባት ምስተጠወቑ ብቐጥታ ስራሕ ከምዝጅምሩ ንምግባር", + "uncheck to hide buttons in the palette": "ኣጥፍእ፡ መላጉም ካብ ጽላት ንምኽዋል", + "uncheck to hide category names in the palette": "ኣጥፍእ፡ ኣስማት ምድባት ካብ ጽላት ንምኽዋል", + "uncheck to hide extension primitives in the palette": "ኣጥፍእ፡ ተወሰኽቲ ሕጡባት ካብ ጽላት ንምኽዋል", + "uncheck to run scripts at normal speed": "ኣጥፍእ፡ ፍጻመ መርሓ ናብ ንቡር ቅልጣፈ ንምምላስ", + "uncheck to save contents in the project": "ወልዕ፡ ትሕዝቶ ኣብ ውሽጢ ፕሮጀክት ንምዕቃብ", + "uncheck to show only the selected category's blocks": "ኣጥፍእ፡ ሕጡባት ናይ ዝተመርጸ ምድብ ጥራይ ንምርኣይ", + "uncheck to switch pen colors and graphic effects to HSV": "ኣጥፍእ፡ ሕብሪ ብርዒን ስእላዊ ተጽዕኖታት ናብ HSV ንምቕያር", + "uncheck to turn block clicking sound off": "ኣጥፍእ፡ ድምጺ ቃዕታ ንምውጋድ", + "uncheck to turn off logging pen vectors": "ኣጥፍእ፡ ምዝገባ ሕንጻጻት ብርዒ ደው ንምባል", + "uncheck to turn off visible stepping": "ኣጥፍእ፡ ዘገምታዊ መስርሕ መርሓ ደው ንምባል", + "uncheck to use solid drop shadows and highlights": "ኣጥፍእ፡ ድሙቐ ጽላሎትን ብርሃንን ንምጥቃም", + "uncheck to use the input dialog in short form": "ኣጥፍእ፡ ሓጺር ቅጥዒ ኣታዊ ንምጥቃም", + "uncompile": "ዝተኣርነበ ፍታሕ", + "undo": "ምለስ", + "undo the last block drop in this pane": "ኣብ መወዳእ ዝተንብረት ሕጡብ ኣልዕል", + "undrop": "ኣልዕል", + "unicode _ as letter": "ዩኒኮደ _ ብፊደል", + "unicode of _": "ዩኒኮደ ናይ _", + "unringify": "ካብ ቀለቤት ኣውጽእ", + "unsupported attribute": "መለለዪ ደገፍ የብሉን", + "unsupported data type": "ዘይተደገፈ ዓይነት ሓብሪታ", + "unsupported graphic effect": "ዘይተደገፈ ስእላዊ ተጽዕኖ", + "untitled": "ኣርእስቲ ዘይተዋህቦ", + "unused": "ኣብ ጥቕሚ ዘይወዓለ", + "unused block(s) removed": "ኣብ ጥቕሚ ዘይወዓሉ ሕጡባት ተኣልዮም", + "up arrow": "ኲናት ንላዕሊ", + "use the keyboard to enter blocks": "ሕጡባት ንምምባር ሰሌዳ መፋትሕ ተጠቀም", + "v": "ቭ", + "value": "ትሕዝቶ", + "variable": "ተቐያያሪ", + "variables": "ተቐያየርቲ", + "video _ on _": "ቪድዮ _ ኣብ _", + "video capture": "ቪድዮ ምቕራጽ", + "volume": "ዓውታ", + "w": "ው", + "wait _ secs": "_ ካልኢት ተጸበ", + "wait until _": "ክሳብ _ ተጸበ", + "warp _": "ፍጡን _", + "what's your name?": "መን እዩ ስምካ፧", + "when I am _": "ኣነ _", + "when I receive _ _": "ኣነ _ ምስ ዝቕበል _", + "when I start as a clone": "ከም ቅዳሕ እንተ ጀሚረ", + "when _": "_ ምስ ኮነ", + "when _ clicked": "_ ምስ ተጠወቐ", + "when _ key pressed _": "መፍትሕ _ ምስ ተጸቕጠ _", + "whirl": "ሕምብሊል", + "whitespace": "ባዶ ቦታ", + "width": "ጎድኒ", + "with data": "ምስ ሓበሬታ", + "with inputs": "ምስ ኣተውቲ", + "word": "ቃል", + "world": "ዓለም", + "write _ size _": "_ ብዓቐን _ ጽሓፍ", + "x": "ሽ", + "x position": "ነቑጣ ሀ", + "y": "ይ", + "y position": "ነቑጣ ሰ", + "year": "ዓመት", + "your own": "ናትካ", + "z": "ዝ" +} diff --git a/elements/pl-snap/Snap/locale/lang-tr.js b/elements/pl-snap/Snap/locale/lang-tr.js new file mode 100644 index 00000000..fdb4d4fb --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-tr.js @@ -0,0 +1,1385 @@ +SnapTranslator.dict.tr = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) sol", + "(0) up": "(0) yukarı", + "(1) sine": "", + "(180) down": "(180) aşağı", + "(2) square": "(2) Kare", + "(3) sawtooth": "(3) Testere", + "(4) triangle": "(4) Üçgen", + "(90) right": "(90) sağ", + "(empty)": "(boş)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "Snap hakkında", + "About...": "Snap Hakkında!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "Bloklara çok satırlı metin girişi sağla", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "Animasyonlar", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "Herhangi (değerlendirilmemiş)", + "Any type": "Herhangi bir tip", + "Apply": "Uygula", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "Silmek istediğinize emin misiniz?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "Geriye...", + "Backgrounds": "Arka Planlar", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "Blok Editörü", + "Blocks": "Bloklar", + "Blocks category name:": "", + "Blurred shadows": "Bulanmış gölgeler", + "Boolean": "Mantıksal", + "Boolean (T/F)": "Mantıksal (D/Y)", + "Boolean (unevaluated)": "Mantıksal (değerlendirilmemiş)", + "Bottom": "Alt", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "Fırça boyutu", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "İptal", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "Betikteki hataları bul", + "Category color": "", + "Change Password": "", + "Change Password...": "Şifre değiştir...", + "Change block": "Bloğu değiştir", + "Clear backup": "", + "Clicking sound": "Tıklama sesi", + "Closed brush (free draw)": "Kontoru kapanan dolu şekil (serbest çizme)", + "Cloud": "", + "Code mapping": "", + "Codification support": "Kodlama desteği", + "Colors and Crayons": "", + "Command": "Komut", + "Command (C-shape)": "Komut (C-şeklinde)", + "Command (inline)": "Komut (satıriçi)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "Şekillerin oranlarını sınırlama (Shift-Tuşu da yapar)", + "Contents": "İçerikler", + "Contributors": "Katkıda bulunanlar", + "Control": "Kontrol", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "Kostüm Editörü", + "Costumes": "Kostümler", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "Girdi adı oluştur", + "Create variables": "", + "Create variables in program": "Betiklerde değişken yarat", + "Credits...": "Katkıda bulunanlar...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "Varsayılan", + "Default Value:": "Varsayılan değer:", + "Delete": "Sil", + "Delete Custom Block": "Özel Blok Tanımlarını Sil", + "Delete Project": "Projeyi sil", + "Delete a variable": "Değişkeni sil", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "Aşağı", + "Download source": "Kaynak kodu indir", + "Dragging threshold...": "", + "Dynamic input labels": "Dinamik girdi etiketleri", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "Kenar rengi (sol tıkla)", + "Edit input name": "Girdi adını düzenle", + "Edit label fragment": "Etiketi düzenle", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "Elips (Shift: daire)", + "Empty": "Boş", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "Silgi", + "Error": "", + "Examples": "Örnekler", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "Blokları dışarı aktar", + "Export blocks...": "Blokları dışarı aktar...", + "Export project as plain text...": "Projeyi düz metin olarak dışarı aktar...", + "Export project...": "Projeyi dışarı aktar...", + "Export summary with drop-shadows...": "", + "Export summary...": "Dışarı aktarım özeti...", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "Blokları soluklaştır", + "Fade blocks...": "Blokları soluklaştır", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "alanı seçilmiş renkle doldur", + "Fill color (right click)": "Doldurma rengi (sağ tıkla)", + "Filled Ellipse (Shift: circle)": "dolu Elips (Shift: daire)", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (Shift: square)": "dolu Dikdörtgen (Shift: kare)", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "Sade tasarım", + "Flat line ends": "Düz çizgi bitimleri", + "For all Sprites": "Tüm kuklalar için", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "Merhaba!", + "Hello, World!": "", + "Help": "Yardım", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "", + "Hummingbird robotics": "", + "Hyper blocks support": "Hiper-Bloklar", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "Web kamerasından yeni bir kostüm aktar", + "Import blocks": "Blokları içeri aktar", + "Import library": "Kütüphaneyi içeri aktar", + "Import sound": "", + "Import...": "İçeri aktar...", + "Imported": "İçeri aktarıldı", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "Sonsuz hassasiyetli tam sayılar, kesin rasyonlar, karışık sayılar", + "Inheritance support": "Kalıtım desteği", + "Input Names:": "Girdi isimleri:", + "Input Slot Options": "", + "Input name": "Girdi Adı", + "Input sliders": "Girdi sürgüleri", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "Yineleme, kompozisyon", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "JavaScript fonksiyonu ( _ ) { _ }", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "Klavyeyle düzenleme", + "Kind of": "Tipi", + "LEAP Motion controller": "LEAP Motion denetleyicisi", + "Language...": "Dil...", + "Libraries...": "Kütüphaneler...", + "License": "Lisans", + "License...": "Lisans...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (Shift: vertical/horizontal)": "Çizgi (Shift: yatay/dikey)", + "Line tool (shift: constrain to 45º)": "Çizgi (Shift: 45° dereceli ayarlar)", + "Line tool (shift: vertical/horizontal)": "", + "List": "", + "List utilities": "liste yardımcı programları", + "Lists": "Listeler", + "Live coding support": "", + "Loading": "Yükleniyor", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "Kalem vektörleri kaydet", + "Login...": "Giriş yap...", + "Logout": "Çıkış yap", + "Long form input dialog": "girdi dialogları için uzun form", + "Looks": "Görünümler", + "Make a block": "Yeni bir blok oluştur", + "Make a variable": "Değişken oluştur", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "Mesaj adı", + "Method Editor": "Metod Editörü", + "Microphone": "", + "Microphone resolution...": "Mikrofon çözünürlüğü...", + "Modules...": "Modüller...", + "Motion": "Hareket", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "Çok dallı koşullu (switch)", + "Multiple inputs (value is list of inputs)": "Çoklu girdi (liste olarak)", + "Nested auto-wrapping": "İç içe automatik kaydırma", + "New": "Yeni", + "New Category": "", + "New Project": "Yeni proje", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "Hayır", + "November": "", + "Number": "Sayı", + "OK": "TAMAM", + "Object": "Nesne", + "October": "", + "Ok": "Tamam", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "Aç", + "Open Project": "Projec aç", + "Open in Community Site": "Proje sitesinde aç", + "Open...": "Aç...", + "Opening project...": "", + "Operators": "İşlemler", + "Other": "Diğerleri", + "Output text using speech synthesis.": "", + "Paint Editor": "Resim Editörü", + "Paint a new costume": "Yeni bir kostüm yap", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "alanı seçilmiş 1ci renkle doldur (Shift: 2ci renk)", + "Paintbrush tool (free draw)": "Fırça (serbest çizme)", + "Parallelization": "", + "Part of": "Parçası", + "Parts": "Parçalar", + "Password:": "", + "Pen": "Kalem", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "Pipet (herhangi bir yere tıklayıp oradaki rengi seçin)", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Pipet herhangi bir yere tıklayıp oradaki rengi seçin (Shift: 2ci renk)", + "Pixels": "", + "Plain prototype labels": "Sade prototip etiketleri", + "Play": "Çal", + "Play sound": "Sesi çal", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Lütfen web tarayıcınızın güncel olduğundan ve kameranızın uygun şekilde yapılandırıldığından emin olun. Bazı tarayıcılar ayrıca Snap! Kamerayı kullanmak için HTTPS öngörürler. Lütfen tarayıcınızın adresinin \"http: //\" bölümünü \"https: //\" ile değiştirin ve tekrar deneyin.", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "Karşılaştırma", + "Prefer empty slot drops": "Boş yer tutucuları atmayı tercih et", + "Prefer smooth animations": "Pürüzsüz animasyonu tercih et", + "Privacy...": "", + "Project Notes": "Proje Notları", + "Project URLs": "", + "Project notes...": "Proje notları...", + "Provide 100 selected colors": "100 seçili renk sağlayın", + "Provide getters and setters for all GUI-controlled global settings": "GUI kontrollü tüm global ayarlar için alıcılar ve ayarlayıcılar sağlayın", + "Publish": "Yayımla", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "Yeni bir ses kaydedin", + "Recover": "Kurtar", + "Rectangle (shift: square)": "Dikdörtgen (Shift: kare)", + "Reference manual": "Başvuru kitabı", + "Remove a category...": "", + "Remove unused blocks": "kullanılmayan blokları kaldırın", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "Şu an ki projeyi yenisiyle değiştirelim mi?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "Bildiren", + "Request blocked": "", + "Resend Verification Email...": "Doğrulama e-postasını tekrar gönder...", + "Resend verification email": "", + "Reset Password...": "Şifre yenile...", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "Retina ekran desteği", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "Kaydet", + "Save As...": "Farklı kaydet...", + "Save Project": "Projeyi kaydet", + "Save Project As...": "Projeyi farklı kaydet...", + "Save to disk": "Diske kaydet", + "Saved!": "Kaydedildi!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "Betik değişken adı", + "Scripts": "Betikler", + "Select a costume from the media library": "Medya kütüphanesinden bir kostüm seçin", + "Select a sound from the media library": "Medya kütüphanesinden bir ses seçin", + "Select categories of additional blocks to add to this project.": "Bu projeye eklemek için ek blok kategorileri seçin.", + "Selection tool": "Seçme Aracı", + "Sensing": "Algılama", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "Kalem rengini RGB veya HSV olarak ayarla", + "Set the rotation center": "Dönme noktasını ayarla", + "Share": "Paylaş", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "Kayıt ol...", + "Single input.": "Tek girdi.", + "Single palette": "", + "Slider maximum value": "Sürgünün en yüksek değeri", + "Slider minimum value": "Sürgünün en düşük değeri", + "Snap! website": "Snap! web sitesi", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "Ses", + "Sound Recorder": "", + "Sounds": "Sesler", + "Sprite": "Kukla", + "Sprite Nesting": "", + "Stage": "Sahne", + "Stage height": "Sahne yüksekliği", + "Stage selected: no motion primitives": "Seçili sahne: hareket temel blokları yok", + "Stage size": "Sahne boyutu", + "Stage size...": "Sahne boyutu...", + "Stage width": "Sahne genişliği", + "Stop": "Durdur", + "Stop sound": "Sesi durdur", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (Shift: circle)": "Konturlu Elips (Shift: daire)", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (Shift: square)": "Konturlu Dikdörtgen (Shift: kare)", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "Kullanıcı moduna geri dön", + "Switch to dev mode": "geliştirici moduna dön", + "Switch to vector editor?": "", + "Table lines": "Tablo çizgileri", + "Table support": "Tablo desteği", + "Table view": "Tablo görünümü", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "Üçlü Boole yer tutucuları", + "Text": "Metin", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "Metinden konuşmaya", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "Olay yinelemeyi yoksay", + "Title text": "Başlık", + "Today": "Bugün", + "Today,": "", + "Top": "Üst", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "Çeviriler", + "Translators...": "Çevirmenler...", + "Turbo mode": "Turbo Mod", + "Turtle": "Kaplumbağa", + "Undelete sprites...": "", + "Unpublish": "Yayımlama", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "Paylaşma", + "Unshare Project": "", + "Untitled": "Kayıtlanmamış", + "Unused blocks...": "kullanılmayan bloklar...", + "Unverified account:": "", + "Up": "Yukarı", + "Updating project list...": "Proje listesi güncelleniyor...", + "Uploading": "", + "Upvar - make internal variable visible to caller": "İç değişkeni çağırıcıya görünür kıl", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "Değişken adı", + "Variables": "Değişkenler", + "Variadic reporters": "Çok girdili bildirenler", + "Vector": "Vektör", + "Vector Paint Editor": "Vektör Resim Editörü", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "Sanal klavye", + "Visible stepping": "Adım adım yürütüm", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "Web servislerine ulaşım (https)", + "Words, sentences": "kelimeler, cümleler", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "Evet", + "Yesterday": "Dün", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "çizgili boyama", + "Zoom blocks": "Blokları büyült", + "Zoom blocks...": "Blokları büyült...", + "_ at _": "_ konumunda: _", + "_ combine _ using _": "", + "_ contains _": "_ _ i içeriyor mu?", + "_ effect": "_ etkisi", + "_ find first item _ in _": "", + "_ in front of _": "_ i _ listesinde en öne koy", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "", + "_ of _": "_ bunun: _", + "_ of block _": "", + "_ of costume _": "_ kostümünün: _", + "_ of sound _": "_ sesinin: _", + "_ of text _": "", + "_ to _": "_ buna: _", + "__shout__go__": "Yeşil bayrağa basıldı", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "_ yeni bir klonu", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "mutlakdeğer", + "acos": "acos", + "add _ to _": "_ i _ ye ekle", + "add a new Turtle sprite": "yeni bir kaplumbağa kukla ekle", + "add a new sprite": "yeni bir kukla ekle", + "add comment": "yorum ekle", + "add comment here...": "... buraya yorum ekle", + "agent": "", + "alert _": "uyarı: _", + "all": "tümünü", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ nin ilk elemanı hariç tümü", + "all but this script": "bu betik hariç diğerlerini", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "bağlı olduğum", + "and": "ve", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "cevap", + "any": "herhangi", + "any key": "herhangi bir tuş", + "any message": "herhangi bir mesaj", + "anything": "", + "append _": "ekle _", + "arrange scripts vertically": "betikleri dikey olarak düzenle", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "_ sor ve bekle", + "ask _ for _ _": "sor _ bunun cevabını _ _", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "arkaya", + "balance": "balans", + "big (2x)": "büyük (2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "Blok tanımları hakikaten silinsin mi?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "Blok olarak", + "blocks": "oluştur", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "Alt kenar", + "box": "", + "brightness": "parlaklık", + "broadcast _ _": "_ _ yayımla", + "broadcast _ _ and wait": "_ _ yayımla ve bekle", + "brush": "", + "build": "Kendi", + "but getting a": "", + "c": "c", + "call _ _": "çağır _ _", + "call _ w/continuation": "çağır _ (arta kalanlı)", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "dönebilir", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "yukarı yuvarla", + "center": "orta noktaya", + "center x": "merkez x", + "center y": "merkez y", + "change _ by _": "_ i _ değiştir", + "change _ effect by _": "_ etkisini _ değiştir", + "change background _ by _": "arka plan _ _ değiştir", + "change balance by _": "balansı _ değiştir", + "change pen _ by _": "Kalemin _ _ değiştir", + "change pen color by _": "", + "change pen shade by _": "", + "change pen size by _": "kalemin kalınlığını _ değiştir", + "change size by _": "boyutu _ değiştir", + "change tempo by _": "tempoyu _ değiştir", + "change volume by _": "ses seviyesini _ değiştir", + "change x by _": "x'i _ değiştir", + "change y by _": "y'i _ değiştir", + "check for alternative GUI design": "alternatif GUI tasarımı için seçin", + "check for block to text mapping features": "", + "check for flat ends of lines": "düz biten çizgiler için seçin", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "daha yüksek çözünürlük için kontrol edin daha fazla bilgi işlem kaynağını kullanır", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "bilgisayarlar arası düz,tahmin edilebilir animasyonlar için seçim yapın", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "girdi dialoglarında girdi tipinin görünmesi için seçim yapın", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "betiğe tekrar girişe izin vermemek için seçim yapın", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "IDE animasyonlarını aktifleştirmek için seçim yapın", + "check to enable alternating colors for nested blocks": "iç içe bloklarda değişmeli renkler için seçim yapın", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "farklı girdiler için dinamik etiketlemeyi etkinleştirmek için seçim yapın", + "check to enable input sliders for entry fields": "girdi alanlarındanki girdi sürgülerini aktifleştirmek için seçim yapın", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "işlemleri liste ve tablolara uygulamak için seçin", + "check to enable virtual keyboard support for mobile devices": "mobil araçlarin sanal klavye desteğini aktifleştirmek için seçim yapın", + "check to hide (+) symbols in block prototype labels": "prototip etiketinde (+) sembolünün gizlenmesi için seçim yapın", + "check to inherit from": "kalıt almak için seçin", + "check to prevent contents from being saved": "içeriğin projede kaydedilmemesi için seçin", + "check to prioritize script execution": "Betik çalışmasına öncelik vermek için seçim yapın", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "blok tıklama sesini açmak için seçim yapın", + "check to turn on logging pen vectors": "Kalem vektörleri kaydetmek için seçin", + "check to turn on visible stepping (slow)": "görünür adım adım yürütüm için seçin (yavaş)", + "check to use blurred drop shadows and highlights": "gölge ve parlaklıkları bulanık hale getirmek için seçim yapın", + "children": "alt öğem", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "temizle", + "clear": "temizle", + "clear graphic effects": "görsel etkileri temizle", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "dönme merkezini ayarlamak için resmi tıklayın veya artı ikonunu sürükleyin", + "clicked": "tıklandığı", + "clone": "klon yap", + "clones": "klonlarım", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "renk", + "color _ is touching _ ?": "_ rengi _ rengine değiyor mu?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "_ listesinin _ bildirenine uyanlarını birleştir", + "comic": "Moire-hareli", + "command": "komut", + "comment pic...": "Yorum resmi", + "compile": "derle", + "compile _": "derle _", + "compile _ for _ args": "", + "confetti": "konfeti", + "console log _": "log dosyasına yaz _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "kostüm", + "costume #": "kostüm #", + "costume name": "", + "costumes": "kostümlerim", + "costumes tab help": "bilgisayarınızdan bir resmi buraya sürükleyerek içeri aktarın", + "could not connect to:": "", + "cr": "satır başı", + "create a clone of _": "_ klonunu oluştur", + "cross": "", + "crosshairs": "", + "current": "şu anki", + "current _": "şu anki _", + "current module versions:": "Şu anki versiyonlar", + "current parent": "şimdiki üst öğe", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "serbest dönebilir?", + "data": "", + "date": "gün", + "day of week": "haftanın günü", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "sil", + "delete _": "", + "delete _ of _": "sil _ öğesini _ listesinin", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "blok tanımlarını sil...", + "delete slot": "", + "delete this clone": "bu klonu sil", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "", + "demo...": "", + "detach all parts": "tüm parçaları ayır", + "detach and put into the hand": "", + "detach from": "kukladan ayır:", + "development mode": "geliştirici modu", + "development mode debugging primitives:": "geliştirici modu hata ayıklama temel blokları", + "development mode...": "", + "dimensions": "", + "direction": "yön", + "disable deep-Morphic context menus and show user-friendly ones": "Morfik içerik menüsünü kapat ve kullanımı kolay olanları göster", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "mesafe", + "distance to _": "", + "distribution": "", + "don't rotate": "dönemez", + "down arrow": "aşağı ok", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "sürüklenebilir", + "draggable?": "sürüklenebilir ayarım?", + "dragging threshold": "", + "dropped": "bırakıldığı", + "duplicate": "kopyala", + "duplicate block definition...": "çifte blok tanımı...", + "duration": "süresi (sn)", + "e": "e", + "e^": "e^", + "edge": "kenara", + "edit": "düzenle", + "edit rotation point only...": "", + "edit the costume's rotation center": "kostümün dönme merkezini düzenle", + "edit...": "düzenle...", + "editables": "", + "elegant (90)": "zarif (90)", + "enable Morphic context menus and inspectors, not user-friendly!": "Morfik içerik menüsü ve gözlemleme etkinleştir kullanımı kolay değil", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "dışarı aktar", + "export block definition...": "Blok tanımlarını dışarı aktar", + "export pen trails line segments as SVG": "Kalem vektörlerini SVG olarak dışarı aktar", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "dışarı aktar...", + "extract": "", + "f": "f", + "false": "yanlış", + "file": "", + "file menu import hint": "Bilgisayarınızdaki bir projeyi, kütüphaneyi, blokları, kostümleri veya sesleri SNAP! a yükleyin", + "fill": "doldur", + "fill page...": "", + "filtered for _": "_ için filtrele", + "find blocks": "blokları bul", + "find blocks...": "", + "find first item _ in _": "_ karşılaştırmasına uyan _ listesinin ilk öğesi", + "find unused global custom blocks and remove their definitions": "kullanılmayan global özel blokları bulun ve tanımlarını kaldırın", + "fisheye": "balık gözü", + "flag": "", + "flash": "", + "flat line ends": "düz çizgi bitimleri", + "flatten": "", + "flip ↔": "yatay çevir ↔", + "flip ↕": "dikey çevir ↕", + "floor": "aşağı yuvarla", + "footprints": "", + "for _ = _ to _ _": "_ = _ den _ kadar tekrarla _", + "for all sprites": "tüm kuklalar için", + "for each _ in _ _": "tekrarla her _ için _ listesinin _", + "for this sprite only": "sadece bu kukla için", + "forever _": "sürekli tekrarla _", + "frame": "", + "frames": "kareler", + "frequencies": "", + "frequency": "frekans", + "front": "öne", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "şeffaflık", + "giant (8x)": "devasa (8x)", + "glide _ secs to x: _ y: _": "_ saniyede x: _ y: _ noktasına kay", + "global?": "", + "globe": "", + "go back _ layers": "_ katman arkaya git", + "go to _": "_ git", + "go to _ layer": "katman _ git", + "go to x: _ y: _": "x: _ y: _ git", + "gray scale palette": "", + "green": "", + "grow": "büyült", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "yüksekliği", + "hello": "merhaba", + "help": "yardım", + "help...": "yardım...", + "hide": "gizle", + "hide all...": "", + "hide blocks...": "", + "hide primitives": "temel blokları gizle", + "hide variable _": "_ değişkenini gizle", + "high": "yüksek", + "hour": "saat", + "http:// _": "", + "hue": "Renk tonu", + "huge (4x)": "kocaman (4x)", + "i": "i", + "identical to": "ile", + "if _ _": "eğer _ _", + "if _ _ else _": "eğer _ _ değilse _", + "if _ then _ else _": "eğer _ bunu yap _ değilse _", + "if on edge, bounce": "kenardaysan sek", + "import a sound from your computer by dragging it into here": "bilgisayarınızdan bir sesi buraya sürükleyerek içeri aktarın", + "import without attempting to parse or format data": "veriyi ayrıştırmaya veya biçimlendirmeye çalışmadan içe aktar", + "import...": "içeri aktar...", + "in palette": "", + "including dependencies": "tüm bağlılıklarla", + "index": "indeks", + "index of _ in _": "_ in _ deki yeri (indeksi)", + "inherit _": "kalıt al: _", + "inherited": "kalıtsal", + "input list:": "girdi listesi:", + "input names:": "girdi isimleri:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "ekle _ _ öğesine _ listesinin", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ özdeş mi?", + "is _ a _ ?": "_ bir _ mi?", + "is _ empty?": "_ listesi boş mu?", + "is _ identical to _ ?": "_ ile _ özdeş mi?", + "is _ on?": "_ seçimi ne?", + "is not a valid option": "", + "is read-only": "", + "item": "öğesi", + "item _ of _": "öğe _ _ listesinin", + "items": "öğeler", + "j": "j", + "join _": "_ birleştir", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "_ uyanlarını _ listesinden döndür", + "key": "", + "key _ pressed?": "_ tuşu basılı mı?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "Türkçe", + "language_translator": "Turgut Güneysu, Hakan Atas", + "large": "büyük", + "last": "son", + "last changed": "", + "last_changed": "2021-01-26", + "launch _ _": "başlat _ _", + "left": "Sol kenar", + "left arrow": "sol ok", + "length": "örnekleme sayısı", + "length of _": "_ nin uzunluğu", + "length:": "uzunluk:", + "let the World automatically adjust to browser resizing": "", + "letter": "harf", + "letter _ of _": "_ harfi bunun: _", + "light (70)": "hafif (70)", + "lightness": "", + "line": "satır", + "lines": "", + "list": "liste", + "list _": "liste _", + "list view...": "liste görünümü...", + "ln": "ln", + "location": "", + "lock": "", + "log pen vectors": "kalem vektörlerini kaydet", + "login": "", + "loop": "", + "low": "alçak", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "bir blok oluştur...", + "make a category...": "", + "make a copy and pick it up": "kopya oluştur ve onu al", + "make a morph": "", + "make temporary and hide in the sprite corral": "geçici yap ve kukla alanında gizle", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "_ bildireni _ listesine uygula", + "map _ to _ _": "", + "max": "maksimum", + "maximum": "", + "medium (50)": "orta (50)", + "menus": "", + "message": "mesaj", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "dakika", + "mirror video": "video yansı görüntü", + "missing / unspecified extension": "", + "monstrous (10x)": "çok büyük (10x)", + "month": "ay", + "mosaic": "mosayik", + "motion": "klipi", + "mouse down?": "fare basılı mı?", + "mouse position": "", + "mouse x": "Fare x-konumu", + "mouse y": "Fare y-konumu", + "mouse-departed": "fare gittiği", + "mouse-entered": "fare geldiği", + "mouse-pointer": "fare-imleci", + "move": "hareket et", + "move _ steps": "_ adım git", + "move all inside...": "", + "move...": "", + "my": "benim", + "my _": "benim _", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "kendimin", + "n": "n", + "name": "adı", + "neg": "", + "negative": "negatif", + "neighbors": "yakınımdakiler", + "neighbors ≠": "", + "new costume _ width _ height _": "yeni kostüm _ genişlik: _ yükseklik: _", + "new line": "yeni satır", + "new sound _ rate _ Hz": "yeni ses _ frekans _ Hz", + "new...": "yeni...", + "next": "", + "next costume": "sonraki kostüm", + "none": "hiçbiri", + "normal": "", + "normal (1x)": "", + "normalScreen": "", + "normalStage": "", + "not": "değil", + "not _": "_ değil", + "note": "", + "nothing": "", + "now connected.": "", + "number": "sayı", + "number of channels": "kanal sayısı", + "numbers from _ to _": "_ - _ arası sayılar", + "o": "o", + "object _": "_ nesnesi", + "octagon": "", + "only duplicate this block": "sadece bu bloğun kopyasını oluştur", + "only face left/right": "sadece sağa/sola bakabilir", + "only grab this block": "", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "yeni pencerede aç", + "open shared project from cloud...": "", + "options...": "", + "or": "veya", + "or before": "", + "other clones": "öteki klonlar", + "other scripts in sprite": "bu kuklanın diğer betikleri", + "other sprites": "öteki kuklalar", + "p": "p", + "paint a new sprite": "yeni bir kukla resmi yap", + "paintbucket": "", + "parameters": "", + "parent": "üst öğem", + "parent...": "üst öğe...", + "parts": "parçalarım", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "_ ye yapıştır", + "pause": "", + "pause all _": "tümünü beklet _", + "pen": "", + "pen _": "kalemin _", + "pen down": "kalemi bastır", + "pen down?": "kalem basılı mı?", + "pen trails": "kalem izleri", + "pen up": "kalemi kaldır", + "pen vectors": "kalem vektörleri (izleri)", + "pic...": "resimler...", + "pick random _ to _": "_ ile _ arasında rastgele sayı", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "dönme noktası", + "pixel": "", + "pixelate": "pikselle", + "pixels": "pikseller", + "play _ Hz for _ secs": "_ Hz frekansı _ sn çal", + "play frequency _ Hz": "_ Hz frekansı çal", + "play note _ for _ beats": "_ notasını _ vuruş çal", + "play sound _": "_ sesini çal", + "play sound _ at _ Hz": "_ sesini _ Hz de çal", + "play sound _ until done": "_ sesini bitene kadar çal", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "_ yönüne dön", + "point towards _": "_ doğru dön", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "karşılaştırma", + "presentation (1.4x)": "sunum (1.4x)", + "pressed": "basıldığı", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "rastgele", + "random position": "rastgele konuma", + "rank": "", + "raw data...": "işlenmemiş veri...", + "ray length": "", + "read-only": "", + "receivers...": "Alıcılar...", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "yine bırak", + "relabel...": "yeniden adlandır...", + "release": "geçici klon ol", + "remove block variables...": "", + "rename": "yeniden adlandır", + "rename all blocks that access this variable": "bu değişkeni kullanan tüm blokların adını değiştir", + "rename all...": "tümünün adını değiştir...", + "rename background": "", + "rename costume": "Köstümü yeniden adlandır", + "rename only this reporter": "yalnız bu bildirenin adını değiştir", + "rename sound": "sesi yeniden adlandır", + "rename...": "yeniden adlandır...", + "repeat _ _": "_ kere tekrarla _", + "repeat until _ _": "_ olana kadar tekrarla _", + "replace item _ of _ with _": "değiştir _ öğesini _ listesinin _ ile", + "report _": "bildir _", + "reporter": "bildiren", + "reporter didn't report": "", + "reset columns": "sütunları sıfırla", + "reset timer": "zamanlayıcıyı sıfırla", + "reshape _ to _": "", + "resize...": "", + "resolution": "çözünürlük", + "rest for _ beats": "_ vuruş sus", + "restore display": "", + "result pic...": "sonucuyla...", + "reverse": "", + "right": "Sağ kenar", + "right arrow": "sağ ok", + "ring": "", + "ringify": "ringify - veri yap", + "robot": "", + "rotate": "Dön", + "rotation style": "dönme tipi", + "rotation x": "dönme x", + "rotation y": "dönme y", + "round _": "_ yuvarla", + "run _ _": "çalıştır _ _", + "run _ w/continuation": "çalıştır _ (arta kalanlı)", + "s": "s", + "sample morphs": "", + "sample rate": "örnekleme hızı", + "samples": "örneklemeler", + "saturation": "doygunluk", + "save _ as costume named _": "", + "save a picture of all scripts": "tüm betiklerin resmini kaydet", + "save a picture of both this script and its result": "bu betiğin ve sonucunun resmini kaydet", + "save a picture of the stage": "Sahnenin resmini kaydet", + "save a picture of this comment": "Bu yorumun resmini kaydet", + "save a picture of this script": "Bu betiğin resmini kaydet", + "save a summary of this project": "bu projenin bir özetini kaydedin", + "save global custom block definitions as XML": "", + "save global custom block definitions as XML in a new browser window": "global özel blok tanımlarını XML olarak indirme klasörünüze kaydedin", + "save project data as XML to your downloads folder": "proje verilerini indirme klasörünüze XML olarak kaydedin", + "saved.": "", + "say _": "_ de", + "say _ for _ secs": "_ de _ saniye", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "betik resmi...", + "script variables _": "betik değişkenleri: _", + "scripts": "betiklerim", + "scripts pic...": "betik resimleri...", + "scroll frame": "", + "scrolled-down": "aşağı kaydırıldığı", + "scrolled-up": "yukarı kaydırıldığı", + "second": "saniye", + "select": "seç", + "selection": "", + "self": "kendim", + "send _ to _": "_ mesajını _ yolla", + "senders...": "Yollayıcılar...", + "sensor demo": "", + "set _ effect to _": "_ etkisini _ yap", + "set _ of block _ to _": "", + "set _ to _": "_ ayarını _ yap", + "set background _ to _": "arka plan _ _ yap", + "set background color to _": "arka plan rengini _ yap", + "set balance to _": "balansı _ yap", + "set instrument to _": "enstrümanı _ yap", + "set pen _ to _": "Kalemin _ _ yap", + "set pen color to _": "kalemin rengini _ yap", + "set pen shade to _": "", + "set pen size to _": "kalemin kalınlığını _ yap", + "set size to _ %": "boyutu % _ yap", + "set tempo to _ bpm": "tempoyu _ yap", + "set this morph's alpha value": "", + "set turbo mode to _": "", + "set video transparency to _": "video saydamlığını _ yap", + "set volume to _ %": "ses seviyesini _ % yap", + "set x to _": "x'i _ yap", + "set y to _": "y'i _ yap", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "boş yer tutucuları için menü ayarları", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "parlak (80)", + "show": "göster", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "hepsini göster", + "show all...": "", + "show primitives": "temel blokları göster", + "show project data as XML in a new browser window": "Proje verilerini XML olarak yeni bir pencerede göster", + "show table _": "", + "show the World's menu": "", + "show variable _": "_ değişkenini göster", + "shown?": "görünüyor mu?", + "shrink": "ufalt", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "boyut", + "slider": "sürgü", + "slider max...": "sürgü en yüksek...", + "slider min...": "sürgü en düşük...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "karesi", + "sorted": "", + "sound": "", + "sounds": "seslerim", + "space": "boşluk", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "spektrum", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "_ ayır _ e göre", + "sprite": "kukla", + "sprites": "kuklalar", + "sqrt": "karekök", + "square": "", + "stack size": "yığıt boyutu", + "stage": "sahnem", + "stage image": "", + "stamp": "damgala", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "kuklaya bağla", + "stop _": "durdur _", + "stop all sounds": "tüm sesleri durdur", + "stop frequency": "frekans çalmayı durdur", + "stopped": "durdurulduğu", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "bu projeyi indirilenler klasörüne kaydet (destekleyen tarayıcılarda)", + "stretch _ x: _ y: _ %": "esnet _ x: _ y: _ %", + "string": "", + "subtle (95)": "hafif (95)", + "sum": "", + "svg...": "SVG olarak...", + "switch to costume _": "kostümü _ yap", + "switch to scene _ _": "", + "t": "t", + "tab": "sekme", + "table view...": "tablo görünümü...", + "take a camera snapshot and import it as a new sprite": "bir kamera görüntüsü al ve onu yeni bir kukla olarak ekle", + "tan": "tan", + "tell _ to _ _": "söyle _ bunu yapsın _ _", + "tempo": "", + "temporary?": "geçici?", + "text": "metin", + "text-only (100)": "metin (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "şu anda bu projede kullanılmamış özel blok yok", + "there are currently no vectorizable pen trail segments": "Şu anda vektörize edilecek kalem izleri yok", + "thing": "şey", + "think _": "_ diye düşün", + "think _ for _ secs": "_ diye düşün _ saniye", + "this _": "", + "this block": "bu bloğu", + "this project doesn't have any custom global blocks yet": "bu proje henüz herhangi bir özel genel blok içermiyor", + "this script": "bu betiği", + "time in milliseconds": "milisaniye", + "timer": "zamanlayıcı", + "tip": "", + "to": "", + "top": "Üst kenar", + "touch screen settings": "", + "touching _ ?": "_ rengine değiyor mu?", + "transient": "geçici", + "translations": "", + "translations...": "", + "translator_e-mail": "tguneysu@msn.com", + "transparency": "saydamlık", + "transparency...": "", + "trash is empty": "", + "true": "doğru", + "turbo mode": "turbo mod", + "turbo mode?": "", + "turn _ _ degrees": "_ yönünde _ derece dön", + "turn all pen trails and stamps into a new background for the stage": "tüm kalem izlerini ve damgaları sahne için yeni bir arka plana dönüştür", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "tüm kalem izlerini ve damgaları şimdiki kukla için yeni bir kostüme dönüştür", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ tipi", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "varsayılan GUI tasarımı için seçimi kaldırın", + "uncheck for greater speed at variable frame rates": "Değişken kare hızlarında daha yüksek hız için işareti kaldırın", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "düşük çözünürlük için işareti kaldırın, bilgi işlem kaynaklarını korur", + "uncheck for round ends of lines": "yuvarlak biten çizgiler için seçimi kaldırın", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "kullanılmayan bildirenlerin başkalarını atmaları için işareti kaldır", + "uncheck to allow script reentrance": "betiğe tekrar girişe izin vermek için seçimi kaldırın", + "uncheck to always show (+) symbols in block prototype labels": "prototip etiketinde (+) sembolünün görünmesi için seçimi kaldırın", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "IDE animasyonları etkisizliştirmek için seçimi kaldırın", + "uncheck to disable alternating colors for nested block": "iç içe bloklarda değişmeli renkleri kaldırmak için seçimi kaldırın", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "farklı girdiler için dinamik etiketlemeyi kaldırmak için seçimi kaldırın", + "uncheck to disable input sliders for entry fields": "girdi alanlarındanki girdi sürgülerini etkisizleştirmek için seçimi kaldırın", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "işlemleri liste ve tablolara uygulamamak için işareti kaldırın", + "uncheck to disable virtual keyboard support for mobile devices": "mobil araçlar için sanal klavye desteğini kaldırmak için seçimi kaldırın", + "uncheck to disinherit": "kalıt almamak için işareti kaldırın", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "betiklerin normal hızla çalışması için seçimi kaldırın", + "uncheck to save contents in the project": "içeriğin projede kaydedilmesi için işareti kaldırın", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "blok tıklama sesini kapatmak için seçimi kaldırın", + "uncheck to turn off logging pen vectors": "Kalem vektörleri kaydetmemek için işareti kaldırın", + "uncheck to turn off visible stepping": "görünür adım adım yürütümü kapatmak için işareti kaldır", + "uncheck to use solid drop shadows and highlights": "katı gölge ve parlaklık kullanmak için seçimi kaldırın", + "uncheck to use the input dialog in short form": "girdi dialoglarını kısa form olarak kullanmak için seçimi kaldırın", + "uncompile": "derlemeyi geri al", + "undo": "geri al", + "undo the last block drop in this pane": "alana bıraktığın son bloğu geri al", + "undrop": "Geri al", + "unicode _ as letter": "_ unicode değerinin harfi", + "unicode of _": "_ harfinin unicode değeri", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "unringify - veri yapma", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "kaydedilmemiş", + "unused": "", + "unused block(s) removed": "kullanılmayan bloklar kaldırıldı", + "up arrow": "yukarı ok", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "blokları klavyeden gir", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "değer", + "variable": "", + "variables": "", + "video _ on _": "Video _ bunun: _", + "video capture": "video kaydetme", + "volume": "ses seviyesi", + "w": "w", + "wait _ secs": "_ sn bekle", + "wait until _": "_ olana kadar bekle", + "wardrobe": "", + "warp _": "", + "what's your name?": "adınız ne?", + "when I am _": "kukla _ zaman", + "when I receive _ _": "_ haberi gelince _", + "when I start as a clone": "Klon olarak başladığımda", + "when _": "_ olunca", + "when _ clicked": "_ tıklanınca", + "when _ is edited _": "", + "when _ key pressed _": "_ tuşuna basılınca _", + "whirl": "fırıldat", + "whitespace": "harf olmayan", + "width": "genişliği", + "with data": "", + "with inputs": "girdi ile", + "word": "kelime", + "world": "dünya", + "write _ size _": "_ yaz _ boyutunda", + "x": "x", + "x position": "x-konumu", + "y": "y", + "y position": "y-konumu", + "year": "yıl", + "year:": "", + "your own": "bloklarını", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-ua.js b/elements/pl-snap/Snap/locale/lang-ua.js new file mode 100644 index 00000000..b46b40f8 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-ua.js @@ -0,0 +1,1393 @@ +SnapTranslator.dict.ua = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "' не існує в цьому контексті", + "(-90) left": "(-90) вліво", + "(0) up": "(0) ввгору", + "(1) sine": "(1) синус (sine)", + "(180) down": "(180) вниз", + "(2) square": "(2) квадрат (square)", + "(3) sawtooth": "(3) пила (sawtooth)", + "(4) triangle": "(4) трикутник (triangle)", + "(90) right": "(90) вправо", + "(empty)": "(порожньо)", + "(in a new window)": "(в новому вікні)", + "(no matches)": "(немає збігів)", + "(temporary)": "(тимчасовий)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "Варіант типу даних списку, у якому кожен елемент списку не обчислюється, доки він не знадобиться, тож ви можете створювати списки з мільйона елементів, насправді не займаючи весь цей час чи пам’ять, або навіть списки нескінченного розміру. (Блок, який звіти про всі прості числа включені як приклад.) Перегляньте SICP 3.5 для підручника.", + "APL primitives": "примітиви APL", + "About Snap": "Про Snap", + "About...": "Про програму", + "Account created.": "Обліковий запис створено.", + "Add interactive maps to projects": "Додати інтерактивні карти до проектів", + "Add scene...": "Додати сцену...", + "Adds features from the APL language supporting hyperblocks.": "Додає функції з мови APL, що підтримують гіперблоки.", + "Allow multi-line text input to a block": "Дозволити введення багаторядкового тексту в блок", + "An e-mail with your password has been sent to the address provided": "На вказану адресу надіслано електронний лист із вашим паролем", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "Розширена версія блоку URL-адрес, яка дозволяє POST, PUT і DELETE, а також запити GET, дозволяє використовувати захищений протокол HTTPS і надає контроль над заголовками тощо. Також аналізує дані JSON", + "Analyze data for frequency distribution": "Аналізуйте дані для розподілу частот", + "Analyze, manipulate and generate sound samples.": "Аналізуйте, маніпулюйте та створюйте звукові зразки.", + "Animation": "Анімація", + "Animations": "Aнимації", + "Another custom block with this name exists.": "Існує ще один настроюваний блок із таким ім’ям", + "Any (unevaluated)": "Будь-який (невизначений)", + "Any type": "Будь-якийтип", + "Apply": "Застосувати", + "April": "Квітень", + "Are you sure you want to continue?": "Ви впевнені, що бажаєте продовжити?", + "Are you sure you want to delete": "Ви впевнені, що бажаєте видалити?", + "Are you sure you want to publish": "Ви впевнені, що хочете опублікувати?", + "Are you sure you want to replace": "Ви впевнені, що хочете замінити", + "Are you sure you want to share": "Ви впевнені, що хочете поширити?", + "Are you sure you want to unpublish": "Ви впевнені, що хочете скасувати публікацію?", + "Are you sure you want to unshare": "Ви впевнені, що хочете скасувати поширення", + "Audio Comp": "Audio Comp", + "August": "Серпень", + "Back...": "Повернутися...", + "Backgrounds": "Фони", + "Backgrounds...": "Тло...", + "Backup failed. This cannot be undone, proceed anyway?": "Помилка резервного копіювання. Цю дію неможливо скасувати. Усе одно продовжити?", + "Bar charts": "Стовпчасті діаграми", + "Bignums, rationals, complex #s": "Великі, раціональні, комплексні числа #s", + "Birth date:": "Дата народження", + "Bitmap": "Растрове зображення", + "Block Editor": "Редактор Блоків", + "Block variable name": "Імʼя змінної блоку", + "Blocks": "Блоки", + "Blocks category name:": "Назва категорії блоків", + "Blurred shadows": "Контрастність тіні", + "Boolean": "бульовий", + "Boolean (T/F)": "Бульовий (Т/Н)", + "Boolean (unevaluated)": "Бульовий (невизначений)", + "Bottom": "Нижній", + "Bring back deleted sprites": "Повернути видалені спрайти", + "Browser": "Браузер", + "Brush size": "Розмір пера", + "Cache Inputs": "Кеш входи", + "Camera": "Камера", + "Camera not supported": "Камера не підтримується", + "Camera support": "Підтримка камери", + "Cancel": "Відмінити", + "Case sensitivity": "Чутливість до регістру", + "Catch errors": "Відстежити помилки", + "Catch errors in a script": "Відстежити помилки в скрипті", + "Category color": "Колір категорії", + "Change Password": "Змінити пароль", + "Change Password...": "Змінити пароль...", + "Change block": "Замінити блок", + "Clear backup": "Очистити резервну копію", + "Clicking sound": "Звук кліку", + "Closed brush (free draw)": "Закритий пензель (вільний малюнок)", + "Cloud": "Хмара", + "Code mapping": "Відображення коду", + "Codification support": "Підтримка кодифікації блоків", + "Colors and Crayons": "Кольори та олівці", + "Command": "Команда", + "Command (C-shape)": "Команда (С-форма)", + "Command (inline)": "Команда (вбудована)", + "Computer": "Компʼютер", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "Підключення до апаратних розширень через Web Serial API (потрібен Chromium, Chrome або Edge)", + "Constrain proportions of shapes? (you can also hold shift)": "Зберігати пропорції фігур (коло, квадрат)? можна використати Shift", + "Contents": "Зміст", + "Contributors": "Учасники", + "Control": "Керування", + "Control the Hummingbird robotics kit processor": "Керуйте процесором комплекту робототехніки Hummingbird", + "Convert to bitmap?": "Перетворити на растрове зображення?", + "Costume Editor": "Редактор образів", + "Costumes": "Образи", + "Crayons": "Олівці", + "Create and manage global/sprite/script variables in a script": "Створення глобальних/спрайтових/скриптових змінних у сценарії та керування ними", + "Create input name": "Створити імʼя вхідних даних", + "Create variables": "Створити змінні", + "Create variables in program": "Створення змінних у програмі", + "Credits...": "Співробітники...", + "Custom Block Translations": "Спеціальні переклади блоків", + "Database": "База даних", + "December": "Грудень", + "Default": "За замовчуванням", + "Default Value:": "Значення за замовчуванням:", + "Delete": "Видалити", + "Delete Custom Block": "Видалити Користувацький Блок", + "Delete Project": "Видалити Проєкт", + "Delete a variable": "Видалити змінну", + "Disable click-to-run": "Вимкнути click-to-run", + "Disable dragging data": "Вимкнути перетягування даних", + "Down": "Вниз", + "Download source": "Завантажити джерельний код", + "Dragging threshold...": "Перетягування порогу...", + "Dynamic input labels": "Використання динамічних позначок", + "E-mail address of parent or guardian:": "Адреса електронної пошти батьків або опікуна:", + "E-mail address:": "Адреса електронної пошти:", + "ERROR: INVALID PASSWORD": "ПОМИЛКА: НЕПРАВИЛЬНИЙ ПАРОЛЬ", + "EXPERIMENTAL! check to enable live custom control structures": "ЕКСПЕРИМЕНТАЛЬНО! поставте прапорець, щоб увімкнути власні структури керування", + "EXPERIMENTAL! check to enable support for compiling": "ЕКСПЕРИМЕНТАЛЬНО! позначте, щоб увімкнути підтримку компіляції", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "ЕКСПЕРИМЕНТАЛЬНО! оптимізувати операції зворотного читання Canvas2D за допомогою атрибута \"willReadFrequently\" за рахунок сповільнення відтворення в деяких веб-браузерах", + "EXPERIMENTAL! uncheck to disable live custom control structures": "ЕКСПЕРИМЕНТАЛЬНО! зніміть прапорець, щоб вимкнути власні структури керування", + "EXPERIMENTAL! uncheck to disable live support for compiling": "ЕКСПЕРИМЕНТАЛЬНО! зніміть прапорець, щоб вимкнути підтримку для компіляції", + "Edge color (left click)": "Колір краю (клікніть лівою кнопкою миші)", + "Edit input name": "Редагувати імʼя вхідних даних", + "Edit label fragment": "Редагувати фрагмнт позначення", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "Закон Айзенберга: усе, що можна зробити за допомогою графічного інтерфейсу користувача, має бути можливим за допомогою мови програмування, і навпаки.", + "Ellipse (shift: circle)": "Еліпс ( Shift: коло)", + "Empty": "Порожньо", + "Enable command drops in all rings": "Увімкнути командні перепади в усіх кільцях", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "Введіть код, який відповідає визначенню блоку. Виберіть власні офіційні назви параметрів (ігноруючи ті, що відображені)", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "Введіть код, який відповідає визначенню блоку. Використовуйте формальні назви параметрів, як показано, і для посилання на згенерований текстовий код тіла визначення", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "Введіть код, який відповідає операції блоку (зазвичай це один виклик функції). Використовуйте <#n> для посилання на фактичні аргументи, як показано.", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "Введіть по одному варіанту на рядок. За бажанням використовуйте \"=\" як роздільник ключ/значення, наприклад answer=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "Введіть один переклад на рядок. Використовуйте двокрапку (\":\") як роздільник мови/спец. та підкреслення (\"_\") як заповнювач для введення, наприклад: en:say _ for _ secs", + "Eraser tool": "Гумка", + "Error": "Помилка", + "Error expecting list but getting nothing": "Помилка не вказано список", + "Examples": "Приклади", + "Execute on slider change": "Виконати при зміні слайдера", + "Export Project As...": "Експортувати проєкт як...", + "Export all scripts as pic...": "Експортувати всі скрипти як зображення...", + "Export blocks": "Експортувати блоки", + "Export blocks...": "Експортувати блоки...", + "Export project as plain text...": "Експортувати проєкт як текстовий файл...", + "Export project...": "Експортувати проєкт...", + "Export summary with drop-shadows...": "Експортувати підсумок із тінями...", + "Export summary...": "Експортована інформація...", + "Extension blocks": "Розширювальні блоки", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "Витягувати підрядки рядка різними способами. Загалом, введення тексту допускає лише один рядок. Блок MULTILINE приймає багаторядкове введення тексту і може використовуватися в слотах введення тексту інших блоків.", + "Fade blocks": "Прозорість блоків", + "Fade blocks...": "Прозорість блоків...", + "February": "Лютий", + "Fetching project from the cloud...": "Отримання проекту з хмари...", + "Fill a region": "Заливка", + "Fill color (right click)": "Колір заливки (клацніть правою кнопкою миші)", + "Filled Ellipse (shift: circle)": "Зафарбований еліпс (shift: круг)", + "Filled Rectangle (shift: square)": "Зафарбований прямокутник (shift: квадрат)", + "First-Class Sprites": "Спрайти першого класу", + "Flat design": "Плаский дизайн", + "Flat line ends": "Прямокутні кінці ліній", + "For all Sprites": "Для усіх спрайтів", + "Frequency Distribution Analysis": "Аналіз розподілу частот", + "Generate costumes from letters or words of text.": "Генерування костюмів з букв та слів", + "Getters and setters": "Гетери та сетери", + "Glide, grow and rotate using easing functions.": "Ковзайте, збільшуйте та обертайте за допомогою функцій полегшення.", + "HSL pen color model": "Кольорова модель пера HSL", + "Header mapping": "Відображення заголовка", + "Hello!": "Привіт!", + "Hello, World!": "Привіт Світ!", + "Help": "Довідка", + "Hide blocks in palette": "Приховати блоки в палітрі", + "Hide blocks...": "Приховати блоки", + "Hmm...": "Хмм...", + "Hummingbird robotics": "Робототехніка Hummingbird", + "Hyper blocks support": "Підтримка гіперблоків", + "I have read and agree to the Terms of Service": "Я прочитав і погоджуюся з умовами використання", + "If you cannot find that email, please check your spam folder.": "Якщо ви не можете знайти цей електронний лист, будь ласка, перевірте папку зі спамом.", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "Якщо ви все одно не можете його знайти, скористайтеся опцією \"Повторно надіслати електронний лист із підтвердженням...\" у меню хмари.", + "Import": "Імпортувати", + "Import a new costume from your webcam": "Створити образ із фото з веб-камери", + "Import blocks": "Імпортувати блоки", + "Import library": "Завантаження бібліотек", + "Import sound": "Імпортувати звук", + "Import tools": "Імпортувати сервісні засоби", + "Import...": "Імпортувати...", + "Imported": "Імпортовано", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "Включає колишні бібліотеки олівців і наборів RGB. Реалізує світлі відтінки (більше помаранчевого, менше зеленого, додає коричневий) і лінійну шкалу кольорів, включаючи градації сірого та відтінки на основі світлих відтінків.", + "Infinite precision integers, exact rationals, complex": "Цілі числа нескінченної точності, точні раціональні, комплексні", + "Inheritance support": "Підтримка наслідування", + "Input Names:": "Імена Вхідних Даних:", + "Input Slot Options": "Параметри вхідного слота", + "Input name": "Імʼя вхідних даних", + "Input sliders": "Використання слайдерів", + "Inside a custom block": "Всередині користувацького блоку", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "Взаємодія з пристроями MicroBlocks через Wi-Fi. Потрібно, щоб пристрій мав TFT-дисплей, дві кнопки та можливість Wi-Fi, а також завантажений проект Signada MicroBlocks. Citilab ED1 і низка плат M5Stack є одними з пристроїв, які працюють з Signada", + "Iteration, composition": "Ітерація, композиція", + "JIT compiler support": "Підтримка компілятора JIT", + "January": "Січень", + "JavaScript extensions": "розширення JavaScript", + "JavaScript extensions for Snap! are turned off": "Розширення JavaScript для Snap! вимкнені", + "JavaScript function ( _ ) { _ }": "функція JavaScript ( _ ) { _ }", + "July": "Липень", + "June": "Червень", + "Just the crayons, without the rest of the colors library. Fast and simple.": "Лише кольорові олівці без решти бібліотеки кольорів. Швидко і просто.", + "Keyboard Editing": "Редагування з клавіатури", + "Kind of": "Титу", + "LEAP Motion controller": "Контролер руху LEAP", + "Language...": "Мова...", + "Libraries...": "Бібліотеки...", + "License": "Ліцензія", + "License...": "Ліцензія...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "Як \"switch\" у C-подібних мовах або \"cond\" у Lisp. Дякую Натану Дінсмору за винайдення ідеї окремого блоку для кожної гілки!", + "Line tool (shift: constrain to 45º)": "Інструмент «Лінія» (Shift: обмеженно до 45º)", + "Line tool (shift: vertical/horizontal)": "Лінія (shift: вертикальна/горизонтальна)", + "List": "Список", + "List utilities": "Список утиліт", + "Lists": "Списки", + "Live coding support": "Підтримка кодування в реальному часі", + "Loading": "Завантаження", + "Local Block(s) in Global Definition": "Локальні блоки в глобальному визначенні", + "Log pen vectors": "Запис малюнків олівцем у вектор", + "Login...": "Увійти...", + "Logout": "Вийти...", + "Long form input dialog": "Розширена форма діалогу введення", + "Looks": "Вигляд", + "Make a block": "Створити новий блок", + "Make a variable": "Створити змінну", + "Manipulate costumes pixel-wise.": "Керуйте костюмами піксельно.", + "March": "Березень", + "May": "Травень", + "Message name": "назва повідомлення", + "Method Editor": "Редактор методів", + "Microphone": "Мікрофон", + "Microphone resolution...": "Якість запису мікрофону", + "Modules...": "Модулі...", + "Motion": "Рух", + "Multi-branched conditional": "Мультирозгалуджені умови", + "Multi-branched conditional (switch)": "Мультирозгалуджені умови(перемикач)", + "Multiple inputs (value is list of inputs)": "Багаторазове ввдення (список)", + "Nested auto-wrapping": "Вкладене автоперенесення", + "New": "Новий проєкт", + "New Category": "Нова категорія", + "New Project": "Новий Проєкт", + "New category...": "Нова категорія...", + "New password:": "Новий пароль:", + "New scene": "Нова сцена", + "No": "Ні", + "November": "Листопад", + "Number": "Число", + "OK": "ОК", + "Object": "Обʼєкт", + "October": "Жовтень", + "Ok": "Ок", + "Old password:": "Старий пароль:", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "Одна з головних ідей у Logo, яку вони залишили позачергово, полягає в уявленні про структурований текст у слова та речення, а не просто рядок символів. Ця бібліотека повертає цю ідею", + "Open": "Відкрити", + "Open Project": "Відкрити Проєкт", + "Open in Community Site": "Відкрити на сайті спільноти", + "Open...": "Відкрити...", + "Opening Costumes...": "Завантаження образів...", + "Opening project...": "Відкриття проекту...", + "Operators": "Оператори", + "Other": "Інше", + "Output text using speech synthesis.": "Виведення тексту за допомогою синтезу мовлення.", + "Paint Editor": "Графічний редактор", + "Paint a new costume": "Намалювати новий образ", + "Paint a shape (shift: edge color)": "Зафарбуйте фігуру (Shift: колір краю)", + "Paint a shape (shift: secondary color)": "Зафарбувати фігуру (Shift: додатковий колір)", + "Paintbrush tool (free draw)": "Пензлик (довільне малювання)", + "Parallelization": "Розпаралелювання", + "Part of": "Частина", + "Parts": "Частини", + "Password:": "Пароль:", + "Pen": "Олівець", + "Persist linked sublist IDs": "Зберігати пов’язані ID підсписків", + "Persistent key-value storage across Snap! sessions in the same browser": "Постійне зберігання ключ-значення в Snap! сесій в одному браузері", + "Pipette tool (pick a color anywhere)": "Вибір кольору (взяти колір кліком на будь-яку точку)", + "Pipette tool (pick a color from anywhere shift: fill color)": "Інструмент «Піпетка» (вибір кольору з будь-якого місця: колір заливки)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "Інструмент «Піпетка» (вибір кольору з будь-якого місця: вторинний колір)", + "Pixels": "Пікселі", + "Plain prototype labels": "Прості заголовки блоків", + "Play": "Відтворити", + "Play sound": "Відтворити звук", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "Будь ласка перевірте оновлення вашого браузера до останньої версії і чи Ваша камера правильно сконфігурована. деякі браузери потребують протокола HTTPS для доступу Snap до камери. Спробуйте змінити \"http://\" в рядку адреси Вашого браузера на \"https://\" і спробуйте ще раз.", + "Please use the verification link that was sent to your email address when you signed up.": "Скористайтеся посиланням для підтвердження, яке було надіслано на вашу електронну адресу під час реєстрації.", + "Polygon": "Багатокутник", + "Predicate": "Предикат", + "Prefer empty slot drops": "Використання порожніх комірок введення", + "Privacy...": "Конфіденційність...", + "Project Notes": "Проєктні нотатки", + "Project URLs": "URL-адреси проекту", + "Project notes...": "Проєктні нотатки...", + "Provide 100 selected colors": "Надайте 100 вибраних кольорів", + "Provide getters and setters for all GUI-controlled global settings": "Надайте засоби отримання та встановлення для всіх глобальних параметрів, керованих графічним інтерфейсом користувача", + "Publish": "Опублікувати", + "Publish Project": "Опублікувати проєкт", + "Rasterize SVGs": "Перевести SVG у растр", + "Record a new sound": "Записати новий звук", + "Recover": "Відновити", + "Rectangle (shift: square)": "Прямокутник (shift: квадрат)", + "Reference manual": "Інструкція користувача", + "Remove a category...": "Вилучити категорію...", + "Remove unused blocks": "Видалити невикористані блоки", + "Repeat Password:": "Повторити пароль", + "Repeat new password:": "Повторити новий пароль", + "Replace Project": "Замінити проєкт", + "Replace the current project with a new one?": "Замінити даний проєкт на новий?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "Повідомляйте про положення рук із контролера руху LEAP (leapmotion.com).", + "Reporter": "Генератор значень", + "Request blocked": "Запит заблоковано", + "Resend Verification Email...": "Повтор надсилання підтвердження електронною поштою ..", + "Resend verification email": "Відправити лист з підтвердженням", + "Reset Password...": "Скинути пароль...", + "Reset password": "Скинути пароль", + "Restore unsaved project": "Відновити незбережений проект", + "Retina display support": "Підтримка Retina display", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "Запустіть сценарій; якщо сталася помилка, замість того, щоб зупинити сценарій із червоним ореолом, запустіть інший сценарій, щоб обробити помилку. Також містить блок, який викликає помилку з повідомленням, наданим як вхід. Також містить блок для створення змінну сценарію та надайте їй значення.", + "Run several scripts in parallel and wait until all are done.": "Запустіть кілька сценаріїв паралельно та зачекайте, поки всі будуть виконані", + "SVG costumes are not yet fully supported in every browser": "Костюми SVG ще не повністю підтримуються в усіх браузерах", + "Same Named Blocks": "Одноіменні блоки", + "Save": "Зберегти", + "Save As...": "Зберегти як...", + "Save Project": "Зберегти Проєкт", + "Save Project As...": "Зберегти Проєкт Як...", + "Save project": "Збереження проєкту", + "Save to disk": "Зберегти на диск", + "Saved!": "Збережено!", + "Saving project to the cloud...": "Зберегти проєкт у хмару...", + "Scenes...": "Сцени...", + "Script variable name": "Ім'я змінної скрипта", + "Scripts": "Скрипти", + "Select a costume from the media library": "Додати образ з бібліотеки", + "Select a sound from the media library": "Добдати звук з бібліотеки", + "Select categories of additional blocks to add to this project.": "обрати додаткові бібліотеки блоків для добавання в проект", + "Selection tool": "Інструмент виділення", + "Sensing": "Датчики", + "September": "Вересень", + "Serial Ports": "Послідовні порти", + "Service:": "Сервіс", + "Set RGB or HSV pen color": "Встановіть колір пера RGB або HSV", + "Set the rotation center": "Встановлення центру обертання", + "Share": "Поширити", + "Share Project": "Поширити проєкт", + "Show buttons": "Показати кнопки", + "Show categories": "Показати категорії", + "Sign in": "Увійти", + "Sign up": "Зареєструватися", + "Signada (Network remote control)": "Signada (мережевий дистанційний контроль)", + "Signup": "Запам'ятати", + "Signup...": "Запам`ятати...", + "Single input.": "Одноразове введення.", + "Single palette": "Одна палітра", + "Slider maximum value": "Слайдер - max значення", + "Slider minimum value": "Слайдер - min значення", + "Snap! website": "Веб-сайт програми Snap!", + "Snap!Cloud": "Snap!Хмара", + "Some standard functions on lists (reverse, sort, etc.)": "Деякі стандартні функції для списків (перевертання, сортування тощо)", + "Sound": "Звук", + "Sound Recorder": "Запис звуку", + "Sounds": "Звуки", + "Sprite": "Спрайт", + "Sprite Nesting": "Вкладення спрайтів", + "Stage": "Сцена", + "Stage height": "Висота сцени", + "Stage selected: no motion primitives": "Обрана сцена: відсутні блоки руху", + "Stage size": "Розмір сцени", + "Stage size...": "Розмір сцени...", + "Stage width": "Ширина сцени", + "Stop": "Стоп", + "Stop sound": "Зупинити звук", + "Streams (lazy lists)": "Потоки (ліниві списки)", + "Strings, Multi-line input": "Рядки, багаторядковий ввід", + "Stroked Ellipse (shift: circle)": "Еліпс (shift: коло)", + "Stroked Rectangle (shift: square)": "Прямокутник (shift: квадрат)", + "Switch back to user mode": "Повернутись в режим користувача", + "Switch to dev mode": "перейти в режим розробки", + "Switch to vector editor?": "Перейти до векторного редактора?", + "Table lines": "межі таблиць", + "Table support": "Підтримка таблиць", + "Table view": "Табличний вигляд", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "Умови використання...", + "Ternary Boolean slots": "Тернарні булеві слоти", + "Text": "Tекст", + "Text Costumes": "Текстові костюми", + "Text to Speech": "Текст в мовлення", + "Text to speech": "Текст в мовлення", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "Повна схема числової вежі. \"USE BIGNUMS \", щоб увімкнути.", + "The question came up at": "Питання виникло в", + "This global block definition contains one or more local custom blocks which must be removed first.": "Це глобальне визначення блоку містить один або кілька локальних спеціальних блоків, які потрібно спочатку видалити.", + "This will convert your vector objects into bitmaps,": "Це перетворить ваші векторні об’єкти на растрові зображення,", + "This will erase your current drawing.": "Це призведе до видалення вашого поточного малюнка.", + "Thread safe scripts": "Захищенність скрипту в багатопоточному режимі", + "Title text": "Заголовок тексту", + "Today": "Сьогодні", + "Today,": "Сьогодні,", + "Top": "Верх", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "Традиційні конструкції циклу (while, until тощо) плюс Lisp \"named let\" (узагальнення FOR) плюс функціональна ітерація (повторний виклик функції) і композиція функції.", + "Translations": "Переклади", + "Translators...": "Перекладачі", + "Turbo mode": "Режим Турбо", + "Turtle": "Вказівник", + "Undelete sprites...": "Відновити спрайти...", + "Unpublish": "Скасувати публікацію", + "Unpublish Project": "Скасувати публікацію проєкту", + "Unsaved Changes!": "Не зберігати зміни", + "Unshare": "Не поширювати", + "Unshare Project": "Не поширювати проєкт", + "Untitled": "Без заголовку", + "Unused blocks...": "Невикористовувані блоки...", + "Unverified account:": "Непідтверджений обліковий запис:", + "Up": "Вгору", + "Updating project list...": "Оновлення списку проектів...", + "Uploading": "Завантаження", + "Upvar - make internal variable visible to caller": "Створити внутрішню змінну видимою ззовні", + "Use CPU for graphics": "Використати процесор для графіки", + "User name must be four characters or longer": "Ім'я користувача має містити не менше чотирьох символів", + "User name:": "Ім'я користувача", + "Variable name": "Імʼя змінної", + "Variables": "Величини", + "Variadic reporters": "Різноманітні репортери", + "Vector": "Вектор", + "Vector Paint Editor": "Редактор векторних зображень", + "Versions of +, x, AND, and OR that take more than two inputs.": "Версії +, x, AND та OR, які потребують більше двох вводів.", + "Virtual keyboard": "Віртуальная клавіатура", + "Visible stepping": "Відображення кроків виконання", + "Web Audio API is not supported in this browser": "Web Audio API не підтримується в цьому браузері", + "Web services access (https)": "Доступ до веб-служб (https)", + "Words, sentences": "Слова, речення", + "World Map": "Карта світу", + "World...": "Світ...", + "Would you like to replace it?": "Чи хотіли б ви його замінити?", + "Yes": "Так", + "Yesterday": "Вчора", + "Yesterday,": "Вчора,", + "You are not logged in": "Ви не ввійшли в систему", + "You are now logged in, and your account is enabled for three days.": "Тепер ви ввійшли, і ваш обліковий запис активовано на три дні.", + "You have": "Ви маєте", + "Zebra coloring": "Використання альтернативних кольорів", + "Zoom blocks": "більшити розмір блоків", + "Zoom blocks...": "Збільшити розмір блоків...", + "_ at _": "_ в _", + "_ combine _ using _": "_ комбінувати _ за допомогою _", + "_ contains _": "_ вміщує _", + "_ effect": "ефект _", + "_ find first item _ in _": "_знайти перший елемент _ у _", + "_ in front of _": "_ попереду _", + "_ keep items _ from _": "_утримати елементи_від_", + "_ map _ over _": "_ карта _ над _", + "_ mod _": "_ остача від ділення _", + "_ of _": "_ у _", + "_ of block _": "_ блоку _", + "_ of costume _": "_ образу _", + "_ of sound _": "_ звуку _", + "_ of text _": "_ тексту _", + "_ to _": "_ до _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "відсутнє користувальницьке визначення блоку", + "a new clone of _": "новий клон _", + "a variable of name '": "змінна імені '", + "about morphic.js...": "про morphic.js...", + "abs": "по модулю", + "acos": "acos", + "add _ to _": "додати _ до _", + "add a new Turtle sprite": "створити новий Базовий спрайт", + "add a new sprite": "Додати новый спрайт", + "add comment": "додати коментар", + "add comment here...": "додати коментар сюди...", + "agent": "агент", + "alert _": "Попередження _", + "all": "все", + "all <": "все <", + "all =": "все =", + "all >": "все >", + "all but first of _": "всі окрім першого з _", + "all but this script": "всіх, окрім мене", + "all identical": "всі ідентичні", + "all scenes": "всі сцени", + "all ≤": "все ≤", + "all ≥": "все ≥", + "alpha value:": "значення альфа:", + "anchor": "якір", + "and": "та", + "and send": "і відправити", + "and you will not be able to convert them back into vector drawings.": "і ви не зможете перетворити їх назад у векторні малюнки.", + "animation demo": "демонстрація анімації", + "answer": "відповідь", + "any": "будь-який", + "any key": "будь-яка клавіша", + "any message": "будь-яке повідомлення", + "anything": "будь-що", + "append _": "додати _", + "arrange scripts vertically": "вертикальне розміщення скриптів", + "arrowDown": "стрілка вниз", + "arrowDownOutline": "контур стрілка вниз", + "arrowLeft": "стрілка вліво", + "arrowLeftOutline": "контур стрілка вліво", + "arrowRight": "стрілка вправо", + "arrowRightOutline": "контур стрілка вправо", + "arrowUp": "стрілка вгору", + "arrowUpOutline": "контур стрілка вгору", + "asin": "asin", + "ask _ and wait": "запитати _ і чекати", + "ask _ for _ _": "запитати у _ інформацію _ _", + "atan": "atan", + "attach...": "attach...", + "b": "b", + "back": "позаду", + "balance": "баланс", + "big (2x)": "збільшити (2x)", + "bigger menu fonts and sliders": "більші шрифти меню та повзунки", + "bins": "", + "block": "блок", + "block deletion dialog text": "Ви впевнені, що бажаєте видалити цей блок?", + "block variables": "змінні блоку", + "block variables...": "змінні блоку...", + "block-solid (0)": "твердий блок (0)", + "blockify": "блокувати", + "blocks": "блоки", + "blue": "блакитний", + "blurred shadows...": "розмиті тіні...", + "blurry shades, use for new browsers": "розмиті відтінки, використовуйте для нових браузерів", + "bottom": "нижній", + "box": "коробка", + "brightness": "яскравість", + "broadcast _ _": "надіслати _ _", + "broadcast _ _ and wait": "надіслати _ _ і чекати", + "brush": "пензель", + "build": "будувати", + "but getting a": "але отримання a", + "c": "c", + "call _ _": "викликати _ _", + "call _ w/continuation": "викликати _ з продовженням", + "caller": "абонент", + "camera": "камера", + "can only write text or numbers, not a": "може писати лише текст або цифри, не a", + "can rotate": "з обертанням", + "cannot handle zero width or height": "не може працювати з нульовою шириною або висотою", + "cannot operate on a deleted sprite": "не може працювати з видаленим спрайтом", + "cannot send media, sprites or procedures to another scene": "не може надсилати медіа, спрайти чи процедури на іншу сцену", + "case sensitivity": "чутливість до регістру", + "categories": "категорії", + "category": "категорія", + "ceiling": "округлення до більшого", + "center": "центр", + "center x": "x центр спрайту", + "center y": "y центр спрайту", + "change _ by _": "змінити _ на _", + "change _ effect by _": "змінити ефект _ на _", + "change background _ by _": "змінити фон _ на _", + "change balance by _": "змінити баланс на _", + "change pen _ by _": "змінити властивість _ на _", + "change pen color by _": "змінити колір олівця на _", + "change pen shade by _": "змінити яскравість олівця на _", + "change pen size by _": "змінити розмір олівця на _", + "change size by _": "змінити розмір на _ %", + "change tempo by _": "змінити темп на _", + "change volume by _": "змінити гучність на _", + "change x by _": "змінити х на _", + "change y by _": "змінити y на _", + "check for alternative GUI design": "увімкніть для використання альтернативного дизайну", + "check for block to text mapping features": "увімкніть, щоб додати блоки трансляції в текст на іншу мову програмування", + "check for flat ends of lines": "увімкніть, щоб не закруглювати кінці мальованих ліній", + "check for higher contrast table views": "увімкніть, для збільшення контрасту меж таблиці у вікні", + "check for higher resolution, uses more computing resources": "увімкніть, для збільшення роздільної здатності збільшує навантаження на ресурси ПК", + "check for multi-column list view support": "вимкніть, щоб не відображати список як таблицю", + "check for sprite inheritance features": "увімкніть, щоб задіяти наслідування властивостей спрайтів", + "check to allow empty Boolean slots": "перевірте, щоб дозволити порожні логічні слоти", + "check to always show slot types in the input dialog": "увімкніть,щоб вказати тип комірок в діалозі введення", + "check to cache inputs boosts recursion": "перевірка для кешування вхідних даних посилює рекурсію", + "check to disable directly running blocks by clicking on them": "позначте, щоб вимкнути безпосередньо запущені блоки, клацнувши їх", + "check to disallow script reentrance": "увімкніть, щоб заборонити повторний вхід в скрипт", + "check to distinguish upper- and lowercase when comparing texts": "перевірте, щоб розрізняти великі та малі літери під час порівняння текстів", + "check to enable IDE animations": "увімкніть, для використання IDE aнимації", + "check to enable alternating colors for nested blocks": "увімкніть, щоб для використання кольорів для вкладених блоків", + "check to enable auto-wrapping inside nested block stacks": "поставте прапорець, щоб увімкнути автоматичне обгортання всередині стеків вкладених блоків", + "check to enable camera support": "позначте, щоб увімкнути підтримку камери", + "check to enable dropping commands in all rings": "позначте, щоб увімкнути скидання команд у всіх кільцях", + "check to enable dynamic labels for variadic inputs": "увімкніть,для використання динамічних позначень при введенні зі змінним числом аргументів", + "check to enable input sliders for entry fields": "увімкніть, щоб використати слайдери при заповненні полів введеня", + "check to enable keyboard editing support": "увімкніть, щоб отримати можливість програмування з клавіатури (Shift+Клік на блок)", + "check to enable project data in URLs": "позначте, щоб увімкнути дані проекту в URL", + "check to enable saving linked sublist identities": "поставте прапорець, щоб увімкнути збереження ідентифікаторів пов’язаних підсписків", + "check to enable sprite composition": "позначте, щоб увімкнути композицію спрайтів", + "check to enable support for first-class sprite": "позначте, щоб увімкнути підтримку спрайту першого класу", + "check to enable using operators on lists and tables": "позначте, щоб увімкнути використання операторів у списках і таблицях", + "check to enable virtual keyboard support for mobile devices": "увімкніть, для використання віртуальної клавіатури для мобільних пристоїв", + "check to hide (+) symbols in block prototype labels": "увімкніть, щоб не відображати (+) під час редагування заголовка", + "check to inherit from": "увімкніть для успадкування від", + "check to prevent contents from being saved": "поставте прапорець, щоб запобігти збереженню вмісту", + "check to prioritize script execution": "увімкніть, для прискорення виконання скрипту", + "check to rasterize SVGs on import": "позначте, щоб растеризувати SVG під час імпорту", + "check to run the edited script when moving the slider": "позначте, щоб запускати відредагований сценарій під час переміщення повзунка", + "check to show all blocks in a single palette": "позначте, щоб усі блоки відображалися в одній палітрі", + "check to show buttons in the palette": "позначте, щоб відобразити кнопки на палітрі", + "check to show category names in the palette": "позначте, щоб відображати назви категорій у палітрі", + "check to show extension primitives in the palette": "позначте, щоб відображати примітиви розширення в палітрі", + "check to show in palette": "позначте, щоб відобразити на палітрі", + "check to support native JavaScript functions": "позначте для підтримки власних функцій JavaScript", + "check to switch pen colors and graphic effects to HSL": "позначте, щоб переключити кольори пера та графічні ефекти на HSL", + "check to turn block clicking sound on": "увімкніть,щоб використовувати звук кліку блок", + "check to turn on logging pen vectors": "увімкніть, щоб записати молюнки олівцем у вектор", + "check to turn on visible stepping (slow)": "увімкніть, для відображення кроків виконання скрипту (повільно)", + "check to use blurred drop shadows and highlights": "увімкніть для використання розмитих тіней та освітлення", + "children": "нащадок", + "choose another color for this morph": "вибрати інший колір для цієї морфи", + "choose the World's background color": "вибрати колір тла світу", + "circle": "коло", + "circle box": "кругла коробка", + "circleSolid": "суцільне коло", + "clean up": "упорядкувати", + "clear": "очистити", + "clear graphic effects": "очистити графічні ефекти", + "clear undrop queue": "очистити чергу скасування", + "click or drag crosshairs to move the rotation center": "клікніть на перехрестя для переміщення центра повороту", + "clicked": "клікнуть", + "clone": "клонувати", + "clones": "клони", + "closedBrush": "закрити пензель", + "cloud": "хмара", + "cloud unavailable without a web server.": "хмара недоступна без веб-сервера.", + "cloudGradient": "хмарний градієнт", + "cloudOutline": "контур хмари", + "code": "код", + "code mapping...": "відображення коду...", + "code of _": "код _", + "collection": "колекція", + "color": "колір", + "color _ is touching _ ?": "колір _ торкається _ ?", + "color palette": "палітра кольорів", + "color picker": "вибір кольору", + "color...": "колір...", + "color:": "колір:", + "columns": "стовпці", + "combinations _": "комбінації _", + "combine _ using _": "поєднати елементи _ із _", + "comic": "комікс", + "command": "команда", + "comment pic...": "коментар зображення...", + "compile": "компілювати", + "compile _": "компілювати _", + "compile _ for _ args": "компілювати _ для _ аргументів", + "confetti": "конфетті", + "console log _": "консоль-реєстрація _", + "continuation": "продовження", + "continuations cannot be forked": "продовження не можуть розгалужуватися", + "cos": "cos", + "costume": "образ", + "costume #": "образ №", + "costume name": "Імʼя образу", + "costumes": "образи", + "costumes tab help": "Перенесіть образ спрайту з ПК", + "could not connect to:": "не вдалося підключитися до", + "cr": "кінцям рядків", + "create a clone of _": "клонувати _", + "cross": "перетин", + "crosshairs": "приціл", + "current": "поточний", + "current _": "поточний _", + "current module versions:": "поточні версії модулів", + "current parent": "джерело спрайта", + "custom?": "обрати?", + "cut from _": "вирізати з _", + "d": "d", + "dangling?": "підвішений?", + "data": "дані", + "date": "день", + "day of week": "день тижня", + "days left": "днів залишилось", + "days left.": "днів залишилось.", + "defaults": "за замовчуванням", + "define _ _ _": "визначити _ _ _", + "definition": "визначення", + "delete": "видалити", + "delete _": "видалити _", + "delete _ of _": "вилучити _ з _", + "delete a category...": "видалити категорію...", + "delete block _": "видалити блок _", + "delete block definition...": "видалити визначення блока", + "delete slot": "видалити слот", + "delete this clone": "видалити клон", + "delete variable": "видалити змінну", + "delimiter": "роздільник", + "demo (1.2x)": "демо (1.2x)", + "demo...": "демо...", + "detach all parts": "від'єднайте всі частини", + "detach and put into the hand": "від'єднати і покласти в руку", + "detach from": "від'єднатися від", + "development mode": "версія в розробці", + "development mode debugging primitives:": "Режим розробки налагодження примітивів:", + "development mode...": "режим розробки...", + "dimensions": "розміри", + "direction": "напрямок", + "disable deep-Morphic context menus and show user-friendly ones": "вимкнути deep-Morphic контекстне меню", + "disable developers' context menus": "вимкнути контекстне меню розробників", + "disable dragging media and blocks out of watchers and balloons": "вимкнути перетягування медіафайлів і блокування спостерігачів і виносок", + "disconnected.": "відключений.", + "distance": "відстань", + "distance to _": "відстань до _", + "distribution": "дистрибуція", + "don't rotate": "без обертання", + "down arrow": "стрілка вниз", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "завантажте та збережіть із коротким описом цього проекту з тінями на всіх зображеннях. не підтримується всіма браузерами", + "download script": "завантажити скрипт", + "download this script as an XML file": "завантажте цей скрипт як файл XML", + "draggable": "рухомий", + "draggable?": "відчутний?", + "dragging threshold": "перетягування порога", + "dropped": "кинуть", + "duplicate": "дублювати", + "duplicate block definition...": "повторюване визначення блоку...", + "duration": "тривалість", + "e": "e", + "e^": "e^", + "edge": "межа", + "edit": "редагувати", + "edit rotation point only...": "редагувати лише точку повороту...", + "edit the costume's rotation center": "вказати центр обертання для образу", + "edit...": "редагувати...", + "editables": "редаговані", + "elegant (90)": "витончений (90)", + "empty? _": "порожній? _", + "enable Morphic context menus and inspectors, not user-friendly!": "ввімкнути Morphic контекстне меню", + "enter": "введіть", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "вхід у режим розробки. Перелов помилок вимкнено, використовуйте веб-консоль браузера, щоб переглянути повідомлення про помилки", + "entering user mode": "вхід в режим користувача", + "eraser": "гумка", + "exceeding maximum number of clones": "перевищення максимальної кількості клонів", + "expecting": "очікуючи", + "expecting a": "очікуючи", + "expecting a finite number but getting Infinity or NaN": "очікування кінцевого числа, але отримання нескінченності або NaN", + "experimental - under construction": "експериментальна можливість - в розробці", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "експериментально! зробіть цього репортера швидким і безперервним. УВАГА: помилки в кільці можуть перервати ваш сеанс Snap!", + "export": "експорт", + "export block definition...": "експорт визначення блоку...", + "export pen trails line segments as SVG": "експортувати відрізки ліній у форматі SVG", + "export project as cloud data...": "експортувати проект як хмарні дані...", + "export project media only...": "експортувати лише мультимедійні файли проекту...", + "export project without media...": "експорт проекту без мультимедіа...", + "export script": "експортувати скрипт", + "export...": "експорт...", + "extract": "витягти", + "f": "f", + "false": "false", + "file": "файл", + "file menu import hint": "завантажити експортований проєкт або бібліотеку блоків, маску чи звук", + "fill": "заливка", + "fill page...": "заповнити сторінку...", + "filtered for _": "фільтрація для _", + "find blocks": "знайти блоки", + "find blocks...": "Знайти блоки...", + "find first item _ in _": "знайти перший елемент _ в _", + "find unused global custom blocks and remove their definitions": "пошук і видалення невикористовуваних блоків", + "fisheye": "рибʼяче око", + "flag": "прапорець", + "flash": "спалах", + "flat line ends": "прямокутні кінці ліній", + "flatten": "розплющити", + "flip ↔": "віддзеркалити ↔", + "flip ↕": "віддзеркалити ↕", + "floor": "округлення до меншого", + "footprints": "сліди", + "for _ = _ to _ _": "для _ = _ до _ _", + "for all sprites": "для всіх спрайтів", + "for each _ in _ _": "для кожного _ в _ _", + "for this sprite only": "тільки для поточного спрайту", + "forever _": "завжди _", + "frame": "кадр", + "frames": "кадри", + "frequencies": "частоти", + "frequency": "частота", + "front": "попереду", + "fullScreen": "поний екран", + "g": "g", + "gears": "шестерні", + "get blocks": "отримати блоки", + "get data": "отримати дані", + "ghost": "прозорість", + "giant (8x)": "збільшити (8x)", + "glide _ secs to x: _ y: _": "ковзати _ сек до x _ y _", + "global?": "глобальний?", + "globe": "глобус", + "go back _ layers": "стати позаду _ рівнів", + "go to _": "перемістити в _", + "go to _ layer": "стати _ всіх рівнів", + "go to front": "стати попереду всіх", + "go to x: _ y: _": "перемістити в x _ y _", + "gray scale palette": "палітра відтінків сірого", + "green": "зелений:", + "grow": "збільшити", + "h": "h", + "handle": "обробити", + "header": "заголовок", + "header mapping...": "зіставлення заголовків...", + "height": "висота", + "hello": "Привіт", + "help": "Довідка", + "help...": "довідка...", + "hide": "сховати", + "hide all...": "сховати все...", + "hide blocks...": "приховати блоки...", + "hide primitives": "приховати стандартні блоки", + "hide variable _": "сховати змінну _", + "high": "висока", + "hour": "годин", + "http:// _": "http:// _", + "hue": "відтінок", + "huge (4x)": "збільшити (4x)", + "i": "i", + "identical to": "тотожно", + "if _ _": "якщо _ _", + "if _ _ else _": "якщо _ то _ інакше _", + "if _ then _ else _": "якщо _ то _ інакше _", + "if on edge, bounce": "якщо на межі, відбити", + "import a sound from your computer by dragging it into here": "Перенесіть звуковий файл з вашого ПК", + "import without attempting to parse or format data": "імпортувати без спроб аналізу чи форматування даних", + "import...": "імпорт...", + "in palette": "в палітрі", + "including dependencies": "включаючи залежності", + "index": "індекс", + "index of _ in _": "індекс _ у _", + "inherit _": "переймати _", + "inherited": "успадковані", + "input list:": "вхідний список:", + "input names:": "імена вхідних даних:", + "input(s), but getting": "введення", + "inputs": "введення", + "insert _ at _ of _": "встав. _ в позицію _ в _", + "insert a slot": "вставте слот", + "insert a variable": "вставити змінну", + "inspect...": "оглядати...", + "is _ ?": "_ ?", + "is _ a _ ?": "_ це _ ?", + "is _ empty?": "чи _ порожнє?", + "is _ identical to _ ?": "_ тотожно _ ?", + "is _ on?": "чи _ ввімкнено?", + "is not a valid option": "не є дійсним варіантом", + "is read-only": "лише для читання", + "item": "елемент", + "item _ of _": "елемент _ з _", + "items": "елементи", + "j": "j", + "join _": "зʼєднати _", + "jukebox": "музичний автомат", + "k": "k", + "keep all submorphs within and visible": "тримати всі субморфи всередині та видимими", + "keep items _ from _": "утримати елемент _ з _", + "key": "клавіша", + "key _ pressed?": "клавішу _ натиснуто?", + "keyboard": "клавіатура", + "keyboardFilled": "клавіатуру заповнено", + "l": "l", + "label": "напис", + "language_name": "Українська", + "language_translator": "Serhiy Kryzhanovsky", + "large": "збільшений", + "last": "останній", + "last changed": "остання зміна", + "last_changed": "2024-01-19", + "launch _ _": "запустити _ _", + "left": "вліво", + "left arrow": "стрілка вліво", + "length": "довжина", + "length of _": "довжина _", + "length:": "довжина:", + "let the World automatically adjust to browser resizing": "нехай світ автоматично пристосовується до зміни розміру браузера", + "letter": "літерам", + "letter _ of _": "_ літера слова _", + "light (70)": "світло (70)", + "lightness": "освітлення", + "line": "рядкам", + "lines": "лінії", + "list": "список", + "list _": "список _", + "list view...": "відобразити як список...", + "ln": "ln", + "load the official library of powerful blocks": "завантажити службову бібліотеку блоків", + "location": "розташування", + "lock": "блокування", + "log pen vectors": "", + "login": "логін", + "loop": "цикл", + "low": "низька", + "lower case": "", + "m": "m", + "magnifierOutline": "контур лупи", + "magnifyingGlass": "збільшувальне скло", + "make a block...": "створити новий блок...", + "make a category...": "створити категорію...", + "make a copy and pick it up": "копіювати та запамʼятати", + "make a morph": "створити морф", + "make temporary and hide in the sprite corral": "зробити тимчасовим та сховати окремий спрайт", + "make this morph movable": "зробити цей морф рухомим", + "make this morph unmovable": "зробити цей морф нерухомим", + "map String to code _": "зіставити рядок із кодом _", + "map _ of _ to code _": "карта _ з _ на код _", + "map _ over _": "встановити _ над _", + "map _ to _ _": "карта _ до _ _", + "max": "максимальна", + "maximum": "максимум", + "medium (50)": "середній (50)", + "menus": "меню", + "message": "повідомлення", + "microphone _": "мікрофон _", + "middle": "посередині", + "minimum": "мінімум", + "minute": "хвилин", + "mirror video": "дзеркальне відео", + "missing / unspecified extension": "", + "monstrous (10x)": "жахливий (10x)", + "month": "місяць", + "mosaic": "мозаїка", + "motion": "рух", + "mouse down?": "мишку натиснуто?", + "mouse position": "позиція мишки", + "mouse x": "мишка x", + "mouse y": "мишка y", + "mouse-departed": "залишить курсор", + "mouse-entered": "торкнеться курсор", + "mouse-pointer": "курсор мишки", + "move": "перемістити", + "move _ steps": "перемістити на _ кроків", + "move all inside...": "переміщувати все всередині...", + "move...": "рух...", + "my": "мій", + "my _": "атрибут _", + "my anchor": "мій якір", + "my dangling?": "мій бовтається?", + "my draggable?": "мій перетягуваний?", + "my name": "моє ім'я", + "my parent": "мій батько", + "my rotation style": "мій стиль обертання", + "my rotation x": "моє обертання x", + "my rotation y": "моє обертання y", + "my temporary?": "моя тимчасовість?", + "myself": "з мене", + "n": "n", + "name": "Імʼя", + "neg": "негатив", + "negative": "негатив", + "neighbors": "сусіди", + "neighbors ≠": "сусіди ≠", + "new costume _ width _ height _": "новий образ _ ширина _ висота _", + "new line": "нова лінія", + "new sound _ rate _ Hz": "новий звук _ як _ Hz", + "new...": "новий...", + "next": "наступний", + "next costume": "наступний образ", + "none": "нічого", + "normal": "стандартний", + "normal (1x)": "звичайний(1x)", + "normalScreen": "звчайний екран", + "normalStage": "звичайна стадія", + "not": "не", + "not _": "не _", + "note": "нота", + "nothing": "нічого", + "now connected": "зʼєднання встановлено", + "now connected.": "зʼєднання встановлено.", + "number": "число", + "number of channels": "номер каналу", + "numbers from _ to _": "числа від _ до _", + "o": "o", + "object _": "обʼєкт _", + "octagon": "восьмикутник", + "only duplicate this block": "дублювати лише даний блок", + "only face left/right": "обертання ліво/право", + "only grab this block": "захопіть лише цей блок", + "open a new browser browser window with a summary of this project": "відобразити проєктні дані як XML в новому вікні браузера", + "open a new window with a picture of all scripts": "перетворити всі скрипти аркуша на зображення", + "open a new window with a picture of the stage": "перетворити вид сцени на зображення", + "open a new window with a picture of this morph": "відкрити нове вікно із зображенням цього морфа", + "open a new window with a picture of this script": "відкрити зображення скрипту у новому вікні", + "open a window on all properties": "відкрити вікно всіх властивостей", + "open in another dialog...": "відкрити в іншому вікні...", + "open in dialog...": "відкрити у окремому вікні...", + "open shared project from cloud...": "відкрити спільний проект із хмари...", + "options...": "опції...", + "or": "або", + "or before": "або раніше", + "other clones": "інші клони", + "other scripts in sprite": "всі інші мої скрипти", + "other sprites": "інші спрайти", + "p": "p", + "paint a new sprite": "малювати новий спрайт", + "paintbucket": "відро фарби", + "parameters": "параметри", + "parent": "джерело", + "parent...": "джерело...", + "parts": "частини", + "password has been changed.": "пароль змінено.", + "password must be six characters or longer": "пароль має містити шість символів або більше", + "passwords do not match": "паролі не збігаються", + "paste on _": "вставити на _", + "pause": "пауза", + "pause all _": "пауза для всіх _", + "pen": "олівець", + "pen _": "олівець _", + "pen down": "опустити олівець", + "pen down?": "олівець опущено?", + "pen trails": "лінія олівця", + "pen up": "підняти олівець", + "pen vectors": "векторне пер", + "pic...": "зображення...", + "pick random _ to _": "випадкове значення від _ до _", + "pick up": "забрати", + "pipe _ $arrowRight _": "труба _ $arrowRight _", + "pipette": "піпетка", + "pitch": "подача", + "pivot": "центр обертання", + "pixel": "піксель", + "pixelate": "пікселізація", + "pixels": "пікселі", + "play _ Hz for _ secs": "відтворити _ Гц протягом _ секунд", + "play frequency _ Hz": "відтворити частоту _ Hz", + "play note _ for _ beats": "грати ноту _ _ тактів", + "play sound _": "грати звук _", + "play sound _ at _ Hz": "грати звук _ як _ Hz", + "play sound _ until done": "грати звук _ до завершення", + "please agree to the TOS": "погодьтеся з TOS", + "please fill out this field": "будь ласка, заповніть це поле", + "please provide a valid email address": "надайте дійсну електронну адресу", + "point in direction _": "повернути у напрямку _", + "point towards _": "слідувати за _", + "pointRight": "точка Праворуч", + "polygon": "багатокутник", + "position": "позиція", + "poster": "постер", + "predicate": "предікат", + "presentation (1.4x)": "презентація (1,4x)", + "pressed": "натиснуть", + "previous": "попередній", + "processes": "процеси", + "product": "продукт", + "published.": "опубліковано.", + "publishing project...": "опублікований проєкт...", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "випадкове значення", + "random position": "випадкова позиція", + "rank": "ранг", + "raw data...": "необроблені дані...", + "ray length": "довжина променя", + "read-only": "лише для читання", + "receivers...": "приймачі...", + "recording": "запис", + "rectangle": "прямокутник", + "rectangleSolid": "суцільний прямокутник", + "red": "червоний", + "redo the last undone block drop in this pane": "повторити відмінену дію з блоком", + "redraw the screen once": "перемалювати екран один раз", + "redrop": "повернути", + "relabel...": "перепозначити...", + "release": "звільнити", + "remove block variables...": "видалити змінні блоку", + "rename": "перейменувати", + "rename all blocks that access this variable": "перейменувати всі блоки, які мають доступ до цієї змінної", + "rename all...": "перейменувати все...", + "rename background": "перейменувати фон", + "rename costume": "перейменувати образ", + "rename only this reporter": "перейменувати лише цього репортера", + "rename sound": "перейменувати звук", + "rename...": "перейменувати...", + "repeat _ _": "повторити _ _", + "repeat until _ _": "повторити поки не _ _", + "replace item _ of _ with _": "замінити елемент _ в _ на _", + "report _": "результат _", + "reporter": "генератор значень", + "reporter didn't report": "репортер не повідомив", + "reset columns": "скинути стовпці", + "reset timer": "скинути таймер", + "reshape _ to _": "змінити форму _ на _", + "resize...": "змінити розмір...", + "resolution": "якість", + "rest for _ beats": "пауза _ тактів", + "restore display": "відновити дисплей", + "result pic...": "результат фото...", + "reverse": "зворотний", + "right": "вправо", + "right arrow": "стрілка вправо", + "ring": "кільце", + "ringify": "обвести", + "robot": "робот", + "rotate": "обертання", + "rotation style": "стиль обертання", + "rotation x": "зміщення за x", + "rotation y": "зміщення за y", + "round _": "округлити _", + "run _ _": "виконати _ _", + "run _ w/continuation": "виконати _ з продовженням", + "s": "s", + "sample morphs": "зразки морфів", + "sample rate": "частота семплування", + "samples": "семпли", + "saturation": "насиченість", + "save _ as costume named _": "зберегти _ як костюм під назвою _", + "save a picture of all scripts": "зберегти зображення всіх сценаріїв", + "save a picture of both this script and its result": "збережіть зображення цього сценарію та його результату", + "save a picture of the stage": "зберегти зображення сцени", + "save a picture of this comment": "збережіть зображення цього коментаря", + "save a picture of this script": "збережіть зображення цього скрипту", + "save a summary of this project": "зберегти резюме цього проекту", + "save global custom block definitions as XML": "зберегти глобальні настроювані визначення блоків як XML", + "save project data as XML to your downloads folder": "зберегти і завантажити проєкт як XML", + "saved.": "збережено.", + "sawtooth": "пила (sawtooth)", + "say _": "говорити _", + "say _ for _ secs": "говорити _ _ сек", + "scope": "обсяг", + "screenshot": "скріншот", + "screenshot...": "скріншот...", + "script": "скрипт", + "script pic with result...": "зображення скрипту з результатом...", + "script pic...": "зображення скрипту...", + "script variables _": "змінні скрипту _", + "scripts": "скрипти", + "scripts pic...": "перетворити скрипт на зображення...", + "scroll frame": "прогорнути кадр", + "scrolled-down": "прокручування вниз", + "scrolled-up": "прокручування ввгору", + "second": "секунд", + "select": "виділити", + "selection": "вибір", + "self": "я", + "send _ to _": "відправити _", + "senders...": "відправники...", + "sensor demo": "демонстрація датчика", + "set _ effect to _": "встановити ефект _ в _", + "set _ of block _ to _": "набір _ блоку _ до _", + "set _ to _": "надати _ значення _", + "set background _ to _": "встановити фон _ на _", + "set background color to _": "встановити колір фону на _", + "set balance to _": "встановити баланс у _", + "set instrument to _": "задати інструмент _", + "set pen _ to _": "встановити властивість _ як _", + "set pen color to _": "колір олівця _", + "set pen shade to _": "задати яскравість олівця _", + "set pen size to _": "задати розмір олівця _", + "set size to _ %": "встановити розмір в _ %", + "set tempo to _ bpm": "встановити темп в _ уд/хв", + "set this morph's alpha value": "встановити значення альфа-версії цього морфу", + "set turbo mode to _": "встановити турбо-режим _", + "set video transparency to _": "встановити прозорість відео в _", + "set volume to _ %": "встановити гучність як _ %", + "set x to _": "задати значення х _", + "set y to _": "задати значення y _", + "setting the rotation center requires a costume": "встановлення центру обертання вимагає костюма", + "settings menu prefer empty slots hint": "увімкніть, щоб генерувати значення лише в порожніх клітинках", + "several block definitions already match this label": "кілька визначень блоків уже відповідають цій мітці", + "shared.": "поширено.", + "sharing project...": "поширення проєкту...", + "sharp drop shadows use for old browsers": "використання різких тіней для старих браузерів", + "sharp shadows...": "різкі тіні...", + "shimmering (80)": "мерехтливий (80)", + "show": "показати", + "show a handle which can be dragged to change this morph's extent": "показати дескриптор, який можна перетягнути, щоб змінити ступінь цієї трансформації", + "show a handle which can be dragged to move this morph": "показати маркер, який можна перетягнути, щоб перемістити цей морф", + "show a picture of all scripts and block definitions": "показати зображення всіх скриптів і визначень блоків", + "show all": "показати все", + "show all...": "показати все...", + "show global custom block definitions as XML in a new browser window": "відобразити визначення глобальних користувацьких блоків як XML в новому вікні браузера", + "show primitives": "показати стандартні блоки", + "show project data as XML in a new browser window": "показати дані проекту як XML у новому вікні браузера", + "show table _": "показати таблицю _", + "show the World's menu": "показати меню світу", + "show variable _": "показати змінну _", + "shown?": "показати?", + "shrink": "зменшити", + "shuffled": "перетасувався", + "signals": "сигнали", + "sin": "sin", + "sine": "синус (sine)", + "size": "розмір", + "slider": "слайдер", + "slider max...": "слайдер max...", + "slider min...": "слайдер min...", + "slots": "слоти", + "smallStage": "мала сцена", + "smaller menu fonts and sliders": "менші шрифти меню та повзунки", + "snap": "знімок", + "sorted": "сортування", + "sound": "звук", + "sounds": "звуки", + "space": "пропуск", + "specify the distance the hand has to move before it picks up an object": "вказати відстань, на яку має рухатися рука, перш ніж вона візьме предмет", + "spectrum": "спектр частот", + "speech bubble": "спливаюча підказка", + "speechBubble": "спливаюча підказка", + "speechBubbleOutline": "контур спливаючої підказки", + "split _ by _": "розділити _ по _", + "sprite": "спрайт", + "sprites": "спрайти", + "sqrt": "квадратний корінь", + "square": "квадрат (square)", + "stack size": "размір стека", + "stage": "сцена", + "stage image": "сценічний образ", + "stamp": "штамп", + "standard settings": "стандартні налаштування", + "stay signed in on this computer until logging out": "залишайтеся в системі на цьому комп’ютері, доки не вийдете", + "stepForward": "крок вперед", + "stick this morph to another one": "прикріпити цей морф до іншого", + "stick to": "дотримуватися", + "stop _": "стоп _", + "stop all sounds": "зупинити всі звуки", + "stop frequency": "зупитнити відтворнення частоти", + "stopped": "зупинка", + "storage": "зберігання", + "store this project in the downloads folder (in supporting browsers)": "зберегти цей проект у папці завантажень (у підтримуваних браузерах)", + "stretch _ x: _ y: _ %": "розтягнути _ x: _ y: _ %", + "string": "рядок", + "subtle (95)": "тонкий (95)", + "sum": "sum", + "svg...": "svg...", + "switch to costume _": "змінити образ на _", + "switch to scene _ _": "перейти до сцени _ _", + "t": "t", + "tab": "табуляторам", + "table view...": "відобразити як таблицю...", + "take a camera snapshot and import it as a new sprite": "створити фото камерою та використати зображення як новий спрайт", + "tan": "tan", + "tell _ to _ _": "передати _ команди _ _", + "tempo": "темп", + "temporary?": "тимчасовий?", + "text": "текст", + "text-only (100)": "лише текст (100)", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "що-небудь", + "think _": "подумати _", + "think _ for _ secs": "подумати _ _ сек", + "this _": "цей _", + "this block": "цей блок", + "this project doesn't have any custom global blocks yet": "У проєкта відсутні глобальні користувацькі блоки", + "this script": "цей скрипт", + "time in milliseconds": "час в мілісекундах", + "timer": "таймер", + "tip": "на кінці", + "to": "", + "top": "згори", + "touch screen settings": "налаштування сенсорного екрана", + "touching _ ?": "доторкається _ ?", + "transient": "перехідний", + "translations": "переклади", + "translations...": "переклади...", + "translator_e-mail": "kseryj@gmail.com", + "transparency": "прозорість", + "transparency...": "прозорість...", + "trash is empty": "кошик порожній", + "triangle": "трикутник (triangle)", + "true": "true", + "turbo mode": "режим турбо", + "turbo mode?": "режим турбо?", + "turn _ _ degrees": "поворот _ на _ градусів", + "turn all pen trails and stamps into a new background for the stage": "перетворити всі сліди пера та штампи на новий фон для сцени", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "перетворити всі сліди пера та штампи на новий костюм для поточного вибраного спрайту", + "turn pen trails into new background...": "перетворити сліди пера на новий фон...", + "turn pen trails into new costume...": "перетворити сліди пера на новий костюм...", + "turnBack": "повернути назад", + "turnForward": "повернути вперед", + "turnLeft": "наліво", + "turnRight": "направо", + "turtle": "черепаха", + "turtleOutline": "контур черепахи", + "type": "тип", + "type of _": "тип _", + "u": "u", + "unable to convert to": "неможливо перетворити на", + "unable to inherit (disabled or circular?)": "неможливо успадкувати (вимкнено чи циклічно?)", + "unable to nest (disabled or circular?)": "неможливе вкладення (вимкнено чи кругове?)", + "uncheck for default GUI design": "вимкніть для переходу до стандартного дизайну", + "uncheck for less contrast multi-column list views": "вимкніть, щоб зменшити контраст меж таблиці у вікні", + "uncheck for lower resolution, saves computing resources": "вимкніть для зменшення роздільної здатності зменшує навантаження на ресурси ПК", + "uncheck for round ends of lines": "вимкніть, для закруглення кінців мальованих ліній", + "uncheck for smooth scaling of vector costumes": "вимкніть для плавного масштабування векторних костюмів", + "uncheck to allow dropped reporters to kick out others": "вимкніть, щоб мати змогу генерувати значення в зайнятих комірках", + "uncheck to allow script reentrance": "вимкніть, щоб дозволити повторний вхід в скрипт", + "uncheck to always show (+) symbols in block prototype labels": "вимкніть, щоб відображати (+) під час редагування заголовка", + "uncheck to confine auto-wrapping to top-level block stacks": "вимкніть, щоб обмежити автоматичне обгортання стеками блоків верхнього рівня", + "uncheck to disable IDE animations": "вимкніть, щоб не використовувати IDE aнимацію", + "uncheck to disable alternating colors for nested block": "вимкніть, для відміни використання кольорів для вкладених блоків", + "uncheck to disable block to text mapping features": "вимкніть, щоб прибрати блоки трансляції в текст на іншу мову програмування", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "вимкніть щоб не використовувати динамічні позначення при введенні зі змінним числом аргументів", + "uncheck to disable input sliders for entry fields": "вимкніть, щоб не використовувати слайдери при заповненні полів введення", + "uncheck to disable keyboard editing support": "вимкніть, щоб програмувати без використання", + "uncheck to disable multi-column list views": "вимкніть для відображення списку як таблицю", + "uncheck to disable project data in URLs": "вимкніть, щоб вимкнути підтримку камери", + "uncheck to disable saving linked sublist identities": "вимкніть, щоб вимкнути збереження ідентифікаторів пов’язаних підсписків", + "uncheck to disable sprite composition": "вимкніть, щоб вимкнути композицію спрайтів", + "uncheck to disable sprite inheritance features": "вимкніть, щоб відмінити наслідування властивостей спрайтів", + "uncheck to disable support for first-class sprites": "вимкніть, щоб вимкнути підтримку спрайтів першого класу", + "uncheck to disable support for native JavaScript functions": "вимкніть, щоб вимкнути підтримку власних функцій JavaScript", + "uncheck to disable using operators on lists and tables": "вимкніть, щоб вимкнути використання операторів у списках і таблицях", + "uncheck to disable virtual keyboard support for mobile devices": "вимкніть, щоб не використовувати віртуальну клавіатуру для мобільних пристоїв", + "uncheck to disinherit": "вимкніть, щоб позбавити спадщини", + "uncheck to drag media and blocks out of watchers and balloons": "вимкніть, щоб перетягнути медіа та блоки з спостерігачів і повітряних куль", + "uncheck to drag media, and blocks out of watchers and balloons": "вимкніть, щоб перетягнути медіафайли та заблокувати спостерігачів і виноски", + "uncheck to enable directly running blocks by clicking on them": "зніміть прапорець, щоб увімкнути безпосередньо запущені блоки, клацнувши їх", + "uncheck to hide buttons in the palette": "вимкніть, щоб приховати кнопки на палітрі", + "uncheck to hide category names in the palette": "вимкніть, щоб приховати назви категорій у палітрі", + "uncheck to hide extension primitives in the palette": "вимкніть, щоб приховати примітиви розширення в палітрі", + "uncheck to hide in palette": "вимкніть, щоб сховати в палітрі", + "uncheck to ignore upper- and lowercase when comparing texts": "вимкніть, щоб ігнорувати великі та малі літери під час порівняння текстів", + "uncheck to limit Boolean slots to true / false": "вимкніть, щоб обмежити логічні слоти значеннями true/false", + "uncheck to run scripts at normal speed": "вимкніть, для виконанная скрипту з нормальною швидкістю", + "uncheck to save contents in the project": "вимкніть, щоб зберегти вміст у проекті", + "uncheck to show only the selected category's blocks": "вимкніть, щоб відображати лише блоки вибраної категорії", + "uncheck to stop caching inputs (for debugging the evaluator)": "вимкніть, щоб припинити кешування введених даних (для налагодження оцінювача)", + "uncheck to suppress running scripts when moving the slider": "вимкніть, щоб блокувати запущені сценарії під час переміщення повзунка", + "uncheck to switch pen colors and graphic effects to HSV": "вимкніть, щоб переключити кольори пера та графічні ефекти на HSV", + "uncheck to turn block clicking sound off": "вимкніть, щоб відключити звук кліку на блок", + "uncheck to turn off logging pen vectors": "вимкніть, щоб припинити заппис малюнків олівцем у вектор", + "uncheck to turn off visible stepping": "вимкніть, щоб не відображати кроки виконання скрипту", + "uncheck to use solid drop shadows and highlights": "вимкніть для використання суцільних тіней та освітлення", + "uncheck to use the input dialog in short form": "вимкніть, для використання короткої форми діалогу введення", + "uncompile": "декомпілювати", + "undo": "відмінити", + "undo the last block drop in this pane": "відмінити останню дію з блоком", + "undrop": "відмінити", + "unicode _ as letter": "літера з Unicode _", + "unicode of _": "Unicode літери _", + "unlock": "розблокувати", + "unpublished.": "неопублікований.", + "unpublishing project...": "скасування публікації проекту...", + "unringify": "прибрати обведення", + "unshared.": "не поширювати", + "unsharing project...": "не поширювати проєкт...", + "unsupported attribute": "непідтримуваний атрибут", + "unsupported data type": "непідтримуваний тип даних", + "unsupported graphic effect": "непідтримуваний графічний ефект", + "untitled": "Без назви", + "unused": "невикористаний", + "unused block(s) removed": "видалено виневикористані блоки", + "up arrow": "стрілка вгору", + "upper case": "верхній регістр", + "url...": "url...", + "use the keyboard to enter blocks": "використати клавіатуру для роботи з блоками", + "user features...": "функції користувача...", + "user mode...": "режим користувача...", + "v": "v", + "value": "значення", + "variable": "змінна", + "variables": "змінні", + "video _ on _": "відео _ на _", + "video capture": "відеозапис", + "volume": "гучність", + "w": "w", + "wait _ secs": "чекати _ сек.", + "wait until _": "чекати до _", + "wardrobe": "гардероб", + "warp _": "відразу _", + "what's your name?": "Як твоє імʼя?", + "when I am _": "коли мене _", + "when I receive _ _": "коли я отримаю _ _", + "when I start as a clone": "Коли я починаю як клон", + "when _": "коли _", + "when _ clicked": "коли натиснуто _", + "when _ is edited _": "коли _ редагується _", + "when _ key pressed _": "коли натиснуто клавішу _ _", + "whirl": "вихор", + "whitespace": "пробілом", + "width": "ширина", + "with data": "з даними", + "with inputs": "разом з вхідними даними", + "word": "словам", + "world": "світ", + "write _ size _": "написати _ розмір _", + "x": "x", + "x position": "значення x", + "y": "y", + "y position": "значення y", + "year": "рік", + "year:": "рік:", + "your own": "ваш", + "z": "z" +} diff --git a/elements/pl-snap/Snap/locale/lang-zh_CN.js b/elements/pl-snap/Snap/locale/lang-zh_CN.js new file mode 100644 index 00000000..0f7b012d --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-zh_CN.js @@ -0,0 +1,1472 @@ +SnapTranslator.dict.zh_CN = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "360° dial": "360° 刻度盘", + "' does not exist in this context": "”这个变量", + "(-90) left": "左(-90)", + "(0) up": "上(0)", + "(1) sine": "(1)正弦", + "(180) down": "下(180)", + "(2) square": "(2)平方", + "(3) sawtooth": "(3)锯齿波", + "(4) triangle": "(4)三角波", + "(90) right": "右(90)", + "(empty)": "(空)", + "(in a new window)": "(打开新窗口)", + "(no matches)": "(无匹配项)", + "(none)": "(无)", + "(temporary)": "(临时)", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "这是一种列表数据类型的变体,在这种类型中,每个列表项只有在需要时才会被计算,因此您可以构建百万项列表而不会真正占用那么多时间或内存,甚至可以构建无限大小的列表. (一个报告所有质数的块被包含为一个示例.) 请参阅SICP 3.5进行教程.", + "APL primitives": "APL原语", + "About Snap": "关于 Snap", + "About...": "关于Snap!...", + "Account created.": "账户已创建.", + "Add interactive maps to projects": "向项目中添加交互式地图", + "Add scene...": "添加场景...", + "Adds features from the APL language supporting hyperblocks.": "添加支持超级块的APL语言功能.", + "Allow multi-line text input to a block": "允许在块中输入多行文本", + "An e-mail with a link to reset your password has been sent to the address provided": "重设密码的网址已发往你的电子邮件地址", + "An e-mail with your password has been sent to the address provided": "您的密码已发送到所提供的电子邮件地址", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "URL块的扩展版本,允许POST、PUT和DELETE以及GET请求,允许使用安全的HTTPS协议,并允许控制头部等.还可以解析JSON数据.", + "Analyze data for frequency distribution": "分析频率分布数据", + "Analyze, manipulate and generate sound samples.": "分析、操纵和生成声音样本.", + "Animation": "动画", + "Animations": "动画", + "Another custom block with this name exists.": "存在另一个具有此名称的自定义块.", + "Any\n(unevaluated)": "任意\n(不计算)", + "Any type": "任一类型", + "Apply": "应用", + "April": "四月", + "Are you sure you want to continue?": "您确定要继续吗?", + "Are you sure you want to delete": "你确定要删除", + "Are you sure you want to publish": "确定让其他人看到项目", + "Are you sure you want to replace": "您确定要替换吗", + "Are you sure you want to share": "您确定要共享吗", + "Are you sure you want to unpublish": "确定不让其他人看到项目", + "Are you sure you want to unshare": "您确定要取消共享吗", + "Audio Comp": "音频组件", + "August": "八月", + "Back...": "返回...", + "Backgrounds": "背景", + "Backup failed. This cannot be undone, proceed anyway?": "备份失败.这不能撤销,还要继续吗?", + "Bar charts": "条形图", + "Bignums, rationals, complex #s": "大数、有理数、复数", + "Birth date": "出生日期", + "Bitmap": "位图", + "Block Editor": "积木编辑器", + "Block variable name": "积木变量名字", + "Blocks": "积木", + "Blocks category name": "块类别名称", + "Blurred shadows": "半透明阴影", + "Boolean": "布尔", + "Boolean (T/F)": "布尔(真/假)", + "Boolean\n(unevaluated)": "布尔\n(不计算)", + "Bottom": "底部", + "Bring back deleted sprites": "恢复已删除的精灵", + "Browser": "浏览器", + "Brush size": "画笔粗细", + "Cache Inputs": "缓存输入数据", + "Camera": "相机", + "Camera not supported": "不支持相机", + "Camera support": "支持摄像头支持", + "Cancel": "取消", + "Case sensitivity": "区分大小写", + "Catch errors": "捕获错误", + "Catch errors in a script": "在脚本中捕获错误", + "Category color": "类别颜色", + "Change Password": "修改密码", + "Change Password...": "修改密码...", + "Change block": "修改积木", + "Clear backup": "清除备份", + "Clicking sound": "点击音效", + "Closed brush (free draw)": "闭合画笔(自由绘画)", + "Cloud": "云端", + "Code mapping": "对应的调用代码", + "Code mapping -": "对应的代码 -", + "Code mapping - String <#1>": "对应的代码 - 字符串 <#1>", + "Code mapping - list contents <#1>": "对应的代码 - 列表内容 <#1>", + "Code mapping - list item <#1>": "对应的代码 - 列表项", + "Code mapping - list item delimiter": "对应的代码 - 列表项分隔符", + "Codification support": "转换成代码", + "Colors and Crayons": "颜色和蜡笔", + "Command": "命令", + "Command (C-shape)": "命令(C型)", + "Command\n(C-shape)": "命令\n(C型)", + "Command (inline)": "命令(嵌入)", + "Command\n(inline)": "命令\n(嵌入)", + "Computer": "计算机", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "通过Web Serial API连接到硬件扩展(需要Chromium、Chrome或Edge)", + "Constrain proportions of shapes? \n(you can also hold shift)": "只画正方形/圆形/垂直或水平线 \n(相当于按住shift键)", + "Contents": "内容", + "Contributors": "贡献者:", + "Control": "控制", + "Control the Hummingbird robotics kit processor": "控制Hummingbird机器人套件处理器", + "Convert to bitmap?": "转换为位图?", + "Costume Editor": "造型编辑器", + "Costumes": "造型", + "Crayons": "蜡笔", + "Create and manage global/sprite/script variables in a script": "在脚本中创建和管理全局/精灵/脚本变量", + "Create input name": "创建输入项", + "Create variables": "创建变量", + "Create variables in program": "在程序中创建变量", + "Credits...": "光荣榜...", + "Custom Block Translations": "自定义块翻译", + "Database": "数据库", + "December": "十二月", + "Default": "默认", + "Default Value:": "默认值", + "Delete": "删除", + "Delete Custom Block": "删除自制积木", + "Delete Project": "删除项目", + "Delete a variable": "删除变量", + "Disable click-to-run": "禁止点击积木直接运行", + "Disable dragging data": "禁止拖拽数据", + "Down": "下", + "Download source": "下载源代码", + "Dragging threshold...": "拖放最小距离...", + "Dynamic input labels": "动态输入标记", + "Dynamic sprite rendering": "动态精灵渲染", + "E-mail address of parent or guardian": "家长或监护人的电子邮件地址", + "E-mail address": "电子邮件地址", + "ERROR: INVALID PASSWORD": "错误: 无效的密码", + "EXPERIMENTAL! check to enable\n live custom control structures": "实验性功能!勾选以启用实时自定义控制结构", + "EXPERIMENTAL! check to enable\nsupport for compiling": "实验性功能!勾选以启用编译支持", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers":"实验性!使用 'willReadFrequently' 属性来优化 Canvas2D 读取操作,但可能会降低某些网页浏览器的渲染速度", + "EXPERIMENTAL! uncheck to disable live\ncustom control structures": "实验性功能!取消勾选以禁用实时自定义控制结构", + "EXPERIMENTAL! uncheck to disable live\nsupport for compiling": "实验性功能!取消勾选以禁用实时编译支持", + "Edge color (left click)": "边缘颜色(左键点击)", + "Edit input name": "编辑输入项", + "Edit label fragment": "编辑标签片段", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "艾森伯格定律:任何可以通过图形用户界面完成的事情都应该能够通过编程语言完成,反之亦然。", + "Ellipse (shift: circle)": "椭圆(shift: 正圆)", + "Empty": "空白", + "Enable command drops in all rings": "在所有环中启用命令下拉菜单", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "输入积木对应的定义/实现部分代码. 使用自己选择的形参名字(忽略上图所示的形参名).", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "输入积木对应的定义/实现部分代码. 使用上图所示的形参名,使用来引用积木的定义.", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "输入积木对应的调用代码. 用<#n>来引用上图所示的实参.", + "Enter one option per line.\nOptionally use \"=\" as key/value delimiter and {} for submenus. e.g.\n the answer=42": "每行一个选项.可使用\"=\"作为键和值的分隔符.例如: answer=42", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "每行输入一个翻译。使用冒号(\":\")作为语言/规范分隔符,下划线 (\"_\") 作为占位符代替输入,例如:en:say _ for _ secs", + "Enter one option per line.": "每行一个选项.", + "Eraser tool": "橡皮", + "Error": "错误", + "Examples": "例子", + "Execute on slider change": "游标改变时运行脚本", + "Export Project As...": "把项目导出到...", + "Export all scripts as pic...": "把所有脚本导出为图片...", + "Export blocks": "导出积木", + "Export blocks...": "导出积木...", + "Export project as plain text...": "用文字格式导出项目...", + "Export project...": "导出项目...", + "Export summary with drop-shadows...": "以HTML格式导出项目(带阴影)...", + "Export summary...": "以HTML格式导出项目", + "Exported!": "导出好了!", + "Extension blocks": "第三方扩展块", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "通过多种方式提取字符串的子字符串.通常情况下,文本输入只允许一行.MULTILINE块接受多行文本输入,并可以用于其他块的文本输入插槽.", + "Fade blocks": "淡出块", + "Fade blocks...": "积木边框隐身...", + "February": "二月", + "Fetching project from the cloud...": "从云端下载下项目...", + "Fill a region": "涂满一个区域", + "Fill color (right click)": "填充颜色(右键点击)", + "Filled Ellipse (shift: circle)": "实心椭圆 (shift: 圆)", + "Filled Rectangle (shift: square)": "实心矩形 (shift: 正方形)", + "First-Class Sprites": "高等角色", + "Flat design": "扁平外观", + "Flat line ends": "平头线条", + "For all Sprites": "对所有角色", + "Frequency Distribution Analysis": "频率分布分析", + "Generate costumes from letters or words of text.": "从文本的字母或单词生成造型。", + "Generate puzzle": "生成拼图", + "Getters and setters": "获取器和设置器", + "Glide, grow and rotate using easing functions.": "使用缓动函数进行滑动、放大和旋转。", + "HSL pen color model": "画笔HSL颜色模式", + "Header mapping": "对应的定义代码", + "Hello!": "你好!", + "Hello, World!": "你好,世界!", + "Help": "帮助", + "Hide blocks in palette": "在调色板中隐藏块", + "Hide blocks...": "隐藏积木...", + "Hmm...": "嗯......", + "Hummingbird robotics": "蜂鸟机器人技术", + "Hyper blocks support": "支持超级运算积木", + "I have read and agree\nto the Terms of Service": "我已阅读并同意《服务条款》", + "If you cannot find that email, please check your spam folder.": "如果您找不到那封电子邮件,请检查您的垃圾邮件文件夹。", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "如果您仍然找不到,请使用云菜单中的“重新发送验证电子邮件...”选项。", + "Import": "导入", + "Import a new costume from your webcam": "从网络摄像头导入新造型", + "Import blocks": "导入积木", + "Import library": "导入积木库", + "Import sound": "导入音频", + "Import tools": "导入工具", + "Import...": "导入...", + "Imported": "已导入", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "整合了以前的蜡笔和RGB库。实现了公平的色调(更多的橙色,更少的绿色,添加了棕色),以及包括灰度和基于公平色调的阴影在内的线性颜色刻度。", + "Infinite precision integers, exact rationals, complex": "无限精度整数,精确有理数,复数", + "Inheritance support": "支持继承", + "Input Names": "输入多个项", + "Input Slot Options": "输入项选项", + "Input name": "输入项", + "Input sliders": "使用游标", + "Inside a custom block": "在自定义块中", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "通过WiFi与MicroBlocks设备进行交互。需要设备具备TFT显示屏、两个按钮和WiFi功能,以及加载了Signada MicroBlocks项目。Citilab ED1和一些M5Stack开发板是与Signada兼容的设备之一。", + "Iteration, composition": "迭代,组合", + "JIT compiler support": "JIT 编译器支持", + "January": "一月", + "JavaScript extensions": "JavaScript扩展", + "JavaScript extensions for Snap! are turned off": "Snap! 的 JavaScript 扩展被关闭", + "JavaScript function ( _ ) { _ }": "", + "July": "七月", + "June": "六月", + "Just the crayons, without the rest of the colors library. Fast and simple.": "只有蜡笔,没有其余的颜色库。快速而简单。", + "Keyboard Editing": "键盘编辑", + "Kind of": "类型:", + "LEAP Motion controller": "飞行运动控制器", + "Language...": "语言...", + "Libraries...": "积木库...", + "License": "许可协议", + "License...": "许可...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "类似于C语言中的\"switch\"或Lisp中的\"cond\"。感谢Nathan Dinsmore发明了为每个分支创建单独块的想法!", + "Line tool (shift: constrain to 45º)": "线条工具(按住Shift键:限制到45度角)", + "Line tool (shift: vertical/horizontal)": "直线 (shift: 垂直或水平)", + "List": "列表", + "List utilities": "列表工具", + "Lists": "列表", + "Live coding support": "动态编程支持", + "Loading": "正在加载", + "Local Block(s) in Global Definition": "全局定义中的本地块", + "Log pen vectors": "记录笔矢量", + "Login...": "登录...", + "Logout": "登出", + "Long form input dialog": "长格式输入对话框", + "Looks": "外观", + "Make a block": "创建一个块", + "Make a variable": "创建一个变量", + "Manipulate costumes pixel-wise.": "逐像素操作造型", + "March": "三月", + "May": "五月", + "Messages": "消息", + "Message name": "消息名称", + "Method Editor": "方法编辑器", + "Microphone": "麦克风", + "Microphone resolution...": "麦克风分辨率...", + "Modules...": "模块...", + "Motion": "运动", + "Multi-branched conditional": "多分支条件", + "Multi-branched conditional (switch)": "多分支条件(切换)", + "multi-line":"多行", + "Multiple inputs (value is list of inputs)": "输入多个值(列表)", + "Nested auto-wrapping": "嵌套自动换行", + "New": "新建", + "New Category": "新建类别", + "New Project": "新建项目", + "New category...": "新建积木类别...", + "New password": "新密码", + "New scene": "新建场景", + "No": "否", + "Notes": "项目说明...", + "Notes...": "项目说明...", + "November": "十一月", + "Number": "数字", + "OK": "确定", + "Object": "对象", + "October": "十月", + "Ok": "确定", + "Old password": "旧密码", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "在Logo中的一个重要概念,而在Scratch中没有包括的是将文本视为由单词和句子结构组成,而不仅仅是字符的字符串。这个库重新引入了这个概念。", + "Open": "打开", + "Open Project": "打开项目", + "Open in Community Site": "在社区网站中打开", + "Open...": "打开...", + "Opening project...": "正在打开项目...", + "Operators": "运算", + "Other": "其他", + "Output text using speech synthesis.": "使用语音合成输出文本。", + "Paint Editor": "画板", + "Paint a new costume": "画一个新造型", + "Paint a shape (shift: edge color)": "绘制一个形状(按住Shift键:设置边缘颜色)", + "Paint a shape (shift: secondary color)": "绘制一个形状(按住Shift键:使用辅助颜色)", + "Paintbrush tool (free draw)": "画笔(鼠标作画)", + "Parallelization": "平行化", + "Part of": "属于:", + "Parts": "组件", + "Password:": "密码:", + "Pen": "画笔", + "Persist linked sublist IDs": "保存子列表ID", + "Persistent key-value storage across Snap! sessions in the same browser": "在同一浏览器中跨Snap!会话保持持久化的键值存储,这是关于在Snap!编程环境中实现在不同会话之间保持数据持久性的描述。", + "Pipette tool (pick a color anywhere)": "滴管 (从屏幕上选一个颜色)", + "Pipette tool (pick a color from anywhere shift: fill color)": "滴管工具(从任何地方取色,按Shift键:填充颜色)", + "Pipette tool (pick a color from anywhere shift: secondary color)": "选色器工具(shift:从任何地方选择颜色)", + "Pixels": "像素", + "Plain prototype labels": "普通原型标签", + "Play": "播放", + "Play sound": "播放声音", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "请确保您的网页浏览器是最新的,并且您的摄像头已正确配置。一些浏览器还要求您通过HTTPS访问Snap!以使用摄像头。请将浏览器地址栏中的“http://”部分替换为“https://”,然后再试一次。", + "Please use the verification link that was sent to your email address when you signed up.": "请使用您在注册时发送到您电子邮件地址的验证链接。", + "Polygon": "多边形", + "Predicate": "谓语", + "Prefer empty slot drops": "只放空白项", + "Prefer smooth animations": "动画尽可能平滑", + "Privacy...": "隐私政策...", + "Project Notes": "项目备注", + "Project URLs": "项目网址", + "Project notes...": "项目注释...", + "Provide 100 selected colors": "提供100种可选颜色", + "Provide getters and setters for all GUI-controlled global settings": "为所有 GUI 控制的全局设置提供 getter 和 setter", + "Publish": "发布", + "Publish Project": "发布项目", + "Rasterize SVGs": "SVG点阵化", + "Record a new sound": "录制新声音", + "Recover": "恢复", + "Rectangle (shift: square)": "长方形(shift: 正方形)", + "Reference manual": "参考手册", + "Remove a category...": "删除积木类别...", + "Remove unused blocks": "删除没用到的积木", + "Repeat Password:": "重复密码:", + "Repeat new password:": "重复一遍新密码:", + "Replace Project": "替换项目", + "Replace the current project with a new one?": "你要放弃正在编辑的项目,重新开始吗?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "从 LEAP Motion 控制器 (leapmotion.com) 报告手部位置.", + "Reporter": "报告", + "Request blocked": "请求被阻止", + "Resend Verification Email...": "重新发送验证邮件...", + "Resend verification email": "重新发送验证邮件...", + "Reset Password": "重设密码", + "Reset Password...": "重设密码...", + "Reset password": "重设密码", + "Restore unsaved project": "恢复未保存的项目", + "Retina display support": "视网膜显示支持", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "运行脚本;如果发生错误,不要用红色光环停止脚本,而是运行另一个脚本来处理错误.还包括一个块,用于通过作为输入给出的消息来导致错误.还包括一个用于创建脚本变量并为其赋值的块.", + "Run several scripts in parallel and wait until all are done.": "并行运行多个脚本并等待所有脚本完成.", + "SVG costumes are not yet fully supported in every browser": "SVG 格式尚未在所有浏览器中得到完全支持", + "Same Named Blocks": "同名块", + "Save": "保存", + "Save As...": "另存为...", + "Save Project": "保存项目", + "Save Project As...": "项目另存为...", + "Save to disk": "保存到磁盘", + "Saved!": "已保存!", + "Saving project to the cloud...": "把项目保存到云端...", + "Scenes...": "场景...", + "Script variable name": "脚本变量名", + "Scripts": "脚本", + "Select a costume from the media library": "从媒体库中挑选一个造型", + "Select a sound from the media library": "从媒体库中挑选一个声音", + "Select categories of additional blocks to add to this project.": "挑选更多积木,添加到项目中.", + "Selection tool": "选择工具", + "Sensing": "探测", + "September": "九月", + "Serial Ports": "串行端口", + "Service": "服务", + "Set RGB or HSV pen color": "设置RGB或HSV画笔颜色", + "Set the rotation center": "设置旋转中心", + "Share": "分享", + "Share Project": "分享项目", + "Show buttons": "显示按钮", + "Show categories": "显示分类", + "Sign in": "登录", + "Sign up": "注册", + "Signada (Network remote control)": "Signada(网络远程控制)", + "Signup": "注册", + "Signup...": "注册...", + "Single input.": "输入单个值.", + "Single palette": "单一积木面板", + "Slider maximum value": "游标的最大值", + "Slider minimum value": "游标的最小值", + "Snap! website": "官方网站", + "Snap!Cloud": "Snap!云端", + "Some standard functions on lists (reverse, sort, etc.)": "一些列表上的标准函数(反转、排序等)", + "Sound": "声音", + "Sound Recorder": "录音机", + "Sounds": "声音", + "Sprite": "角色", + "Sprite Nesting": "角色组合", + "Stage": "舞台", + "Stage height": "舞台高度", + "Stage selected: no motion primitives": "选中了舞台: 舞台不能使用运动积木", + "Stage size": "舞台大小", + "Stage size...": "舞台大小...", + "Stage width": "舞台宽度", + "Stop": "停止", + "Stop sound": "停止声音", + "Streams (lazy lists)": "流(惰性列表)", + "Strings, Multi-line input": "字符串,多行输入", + "Stroked Ellipse (shift: circle)": "椭圆 (shift: 圆)", + "Stroked Rectangle (shift: square)": "矩形框 (shift: 正方形)", + "Switch back to user mode": "回到用户模式", + "Switch to dev mode": "切换到开发者模式", + "Switch to vector editor?": "切换到矢量编辑器?", + "Table lines": "表格线", + "Table support": "使用表格功能", + "Table view": "查看表格", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "接受一个表格(通常来自CSV数据集)作为输入,并报告按指定列号中的字段分组的表格摘要。剩下的三个输入仅在字段值为数字时才会被使用,此时可以将它们分成不同的区间(例如,十年、百年等)。这三个输入用于指定感兴趣的最小值和最大值,最重要的是区间的宽度(例如,十年的宽度为10,百年的宽度为100)。如果字段不是数字类型,请将这三个输入留空或设置为零。在这种情况下,字段的每个字符串值都将被视为单独的区间,并按字母顺序排序。该块会报告一个包含三列的新表格。第一列包含区间名称或最小数字。第二列包含一个非负整数,表示输入表格中有多少记录属于这个区间。第三列是一个子表格,包含原始表格中属于该区间的实际记录。如果您的区间不是固定宽度的,或者您想要根据多个字段的某种函数进行分组,请加载\"Frequency Distribution Analysis\"库。", + "Terms of Service...": "服务条款...", + "Ternary Boolean slots": "三元布尔槽", + "Text": "文本", + "Text Costumes": "文本样式", + "Text to Speech": "文本转语音", + "Text to speech": "文本转语音", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "完整的Scheme数值塔。使用 \"USE BIGNUMS \" 来启用。", + "The question came up at": "问题出现在以下地方:", + "This global block definition contains one or more local custom blocks which must be removed first.": "这个全局块定义包含一个或多个本地自定义块,必须首先删除这些本地块。", + "This will convert your vector objects into bitmaps,": "这将把您的矢量对象转换为位图。", + "This will erase your current drawing.": "这将擦除您当前的绘图。", + "Thread safe scripts": "线程安全的脚本", + "Title text": "标题文本", + "Today": "今天", + "Today,": "今天,", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "传统的循环结构(如while、until等),加上Lisp中的\"named let\"(FOR的一般化),再加上函数迭代(反复调用一个函数)和函数组合。", + "Translations": "翻译者", + "Translators...": "翻译者...", + "Turbo mode": "加速模式", + "Turtle": "海龟", + "Undelete sprites...": "恢复已删除的角色", + "Unpublish": "取消发布", + "Unpublish Project": "取消发布项目", + "Unsaved Changes!": "未保存的更改!", + "Unshare": "不分享", + "Unshare Project": "不分享项目", + "Untitled": "无标题", + "Unused blocks...": "没用到的积木...", + "Unverified account:": "未验证的账户:", + "Up": "", + "Updating project list...": "正在更新项目列表...", + "Uploading": "上传中", + "Upvar - make internal variable visible to caller": "回传变量 - 让调用者可以使用这个变量", + "Use CPU for graphics": "使用CPU绘制图形", + "User name must be four characters or longer": "用户名不能少于4个字符", + "User name:": "用户名:", + "Variable name": "变量名", + "Variables": "变量", + "Variadic reporters": "可变参数的报表", + "Vector": "矢量", + "Vector Paint Editor": "矢量绘图编辑器", + "Versions of +, x, AND, and OR that take more than two inputs.": "+, x, AND, 和 OR 运算符可以接受超过两个的输入。", + "Virtual keyboard": "虚拟键盘", + "Visible stepping": "可视化单步运行", + "Web Audio API is not supported in this browser": "Web Audio API 目前不支持这个浏览器", + "Web services access (https)": "网络服务访问(https)", + "Words, sentences": "单词,句子", + "World Map": "世界地图", + "World...": "世界...", + "Would you like to replace it?": "您是否要替换它?", + "Yes": "是", + "Yesterday": "昨天", + "Yesterday,": "昨天,", + "You are not logged in": "你还没有登录", + "You are now logged in, and your account is enabled for three days.": "您已经登录,并且您的账户将开启三天。", + "You have": "您有", + "Zebra coloring": "积木颜色相间", + "Zoom blocks": "缩放块", + "Zoom blocks...": "缩放块...", + "_ at _": "_ 于 _", + "_ combine _ using _": "_ 结合 _ 使用 _", + "_ contains _": "_ 含有 _", + "_ effect": "_ 效果", + "_ find first item _ in _": "_ 查找第一个 _ 位于 _", + "_ in front of _": "_ 放在 _ 前面", + "_ keep items _ from _": "_ 保留 _ 不在 _", + "_ map _ over _": "_ 映射 _ 在 _", + "_ mod _": "_ 除以 _ 的余数", + "_ of _": "取 _ 于 _", + "_ of block _": "_ 自积木 _", + "_ of costume _": "取 _ 于 _", + "_ of sound _": "取 _ 于声音 _", + "_ of text _": "_ 的 文本 _", + "_ to _": "_ 到 _", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "自定义块定义丢失", + "a new clone of _": "_ 的一个新克隆", + "a variable of name '": "这个上下文中不存在“", + "about morphic.js...": "关于morphic.js...", + "abs": "绝对值", + "acos": "反余弦", + "add _ to _": "把 _ 放到 _ 后面", + "add a new Turtle sprite": "添加一个海龟角色", + "add a new sprite": "添加角色", + "add comment": "添加说明", + "add comment here...": "在这里添加说明...", + "add property...": "增加属性...", + "agent": "代理", + "alert _": "警告: _", + "align center": "居中", + "align left": "靠左", + "align right": "靠右", + "all": "全部", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ 第一项以外", + "all but this script": "所有其他脚本", + "all identical": "全部相同", + "all scenes": "所有场景", + "all ≤": "", + "all ≥": "", + "alpha value:": "透明度:", + "anchor": "组合母体", + "and": "且", + "and send": "并发送", + "and you will not be able to convert them back into vector drawings.": "并且你不能把它们转换回矢量图形。", + "animation demo": "动画演示", + "answer": "回答", + "any": "任意", + "any key": "任意键", + "any message": "任何消息", + "anything": "任意元素", + "append _": "追加合并 _", + "arrange scripts vertically": "垂直排列脚本", + "arrowDown": "向下箭头", + "arrowDownOutline": "向下箭头轮廓", + "arrowLeft": "向左箭头", + "arrowLeftOutline": "向左箭头轮廓", + "arrowRight": "向右箭头", + "arrowRightOutline": "向右箭头轮廓", + "arrowUp": "向上箭头", + "arrowUpOutline": "向上箭头轮廓", + "asin": "反正弦", + "ask _ and wait": "询问 _ 并等待", + "ask _ for _ _": "请求 _ 返回 _ _", + "at": "于", + "atan": "反正切", + "attach...": "连接到...", + "attributes": "属性", + "auto line wrap off...": "不自动折行", + "auto line wrap on...": "自动折行", + "b": "b", + "back": "底", + "balance": "声音平衡", + "big (2x)": "大(2倍)", + "bigger menu fonts and sliders": "使用大号菜单字体和游标", + "bins": "容器", + "block": "块", + "block deletion dialog text": "你确实要删除所有这种自制积木和它的定义吗?", + "block variables": "块变量", + "block variables...": "积木变量...", + "block-solid (0)": "块-实心(0)", + "blockify": "以块形式", + "blocks": "块", + "blue": "蓝色", + "blurred shadows...": "模糊的阴影...", + "blurry shades, use for new browsers": "对新浏览器 使用模糊的阴影", + "bold": "粗体", + "border color...": "边框颜色...", + "border width...": "边框粗细...", + "bottom": "底部", + "box": "圆角框", + "brightness": "亮度", + "broadcast _ _": "广播 _ _", + "broadcast _ _ and wait": "广播 _ _ 并等待", + "brush": "笔刷", + "build": "构建", + "but getting a": "但获得一个", + "c": "c", + "call _ _": "调用 _ _", + "call _ w/continuation": "带延续调用 _", + "caller": "调用者", + "camera": "摄像机", + "can only write text or numbers, not a": "只能写文本或数字,不是", + "can rotate": "可以旋转", + "cannot handle zero width or height": "无法处理零宽或高", + "cannot operate on a deleted sprite": "无法对已删除的精灵进行操作", + "cannot send media, sprites or procedures to another scene": "无法将媒体、精灵或过程发送到另一个场景", + "case sensitivity": "大小写敏感", + "categories": "类别", + "category": "类别", + "ceiling": "向上取整", + "center": "舞台中心", + "center x": "中心点x坐标", + "center y": "中心点y坐标", + "change _ by _": "把 _ 增加 _", + "change _ effect by _": "把 _ 效果增加 _", + "change background _ by _": "把背景的 _ 增加 _", + "change balance by _": "把声音平衡增加 _", + "change pen _ by _": "把画笔的 _ 增加 _", + "change pen color by _": "把画笔的颜色值增加 _", + "change pen shade by _": "把画笔的色度增加 _", + "change pen size by _": "把画笔的大小增加 _", + "change size by _": "把角色的大小增加 _", + "change tempo by _": "把节奏加快 _", + "change volume by _": "把音量增加 _", + "change x by _": "把x坐标增加 _", + "change y by _": "把y坐标增加 _", + "character": "字符", + "check for alternative\nGUI design": "使用扁平风格的用户界面", + "check for block\nto text mapping features": "打开积木转文字的功能", + "check for flat ends of lines": "线条的端点是平的", + "check for higher contrast\ntable views": "深色表格线", + "check for higher resolution, uses more computing resources": "使用更多计算资源", + "check for multi-column\nlist view support": "使用多栏(如2维)列表", + "check for smooth, predictable animations across computers": "平滑地显示动画 (牺牲播放速度)", + "check for sprite\ninheritance features": "角色可以继承", + "check to allow\nempty Boolean slots": "允许空布尔值", + "check to always show slot\ntypes in the input dialog": "在输入项对话框里显示类型说明", + "check to cache inputs boosts recursion": "缓存输入数据 递归速度更快", + "check to cache\nsprite renderings":"选中以缓存精灵渲染", + "check to enable auto-wrapping\ninside nested block stacks":"选中以启用嵌套块堆栈内的自动换行", + "check to disable\ndirectly running blocks\nby clicking on them": "勾选后禁止点击积木直接运行", + "check to disallow\nscript reentrance": "不允许脚本重入", + "check to distinguish upper- and\n lowercase when comparing texts": "大小写敏感", + "check to enable\nIDE animations": "显示编辑器动画效果", + "check to enable alternating\ncolors for nested blocks": "使用深浅相间的颜色 显示嵌套的同类积木", + "check to enable\nauto-wrapping inside nested block stacks": "嵌套的积木可以自动换行", + "check to enable\ncamera support": "使用摄像机", + "check to enable\ndropping commands in all rings": "允许在所有环内拖动命令", + "check to enable dynamic\nlabels for variadic inputs": "可变输入项使用动态标记", + "check to enable\ninput sliders for\nentry fields": "使用游标修改输入字段", + "check to enable\nkeyboard editing support": "使用键盘编辑", + "check to enable\nproject data in URLs": "网址携带项目数据", + "check to enable\nsaving linked sublist identities": "保存子列表的ID", + "check to enable\nsprite composition": "允许角色组合", + "check to enable support\n for first-class sprite": "使用高等角色", + "check to enable using operators on lists and tables": "勾选以启用作用于列表和表格的超级运算符", + "check to enable virtual keyboard support for mobile devices": "使用移动设备的虚拟键盘", + "check to hide (+) symbols\nin block prototype labels": "不在积木设计图上显示(+)号", + "check to inherit from": "继承于", + "check to prevent contents from being saved": "不保存变量内容", + "check to prioritize\nscript execution": "勾选加速脚本运行", + "check to rasterize\nSVGs on import": "导入SVG时把它点阵化", + "check to run\nthe edited script\nwhen moving the slider": "滑动游标时运行改变的脚本", + "check to show all blocks in a single palette": "勾选之后所有的积木会在同一个积木面板(类别)里显示", + "check to show buttons\nin the palette": "显示面板上的按钮", + "check to show\ncategory names\nin the palette": "显示面板上的类别名称", + "check to show extension primitives in the palette": "显示扩展块", + "check to show in palette": "显示在面板里", + "check to support native JavaScript functions": "勾选启用JS扩展函数", + "check to switch pen colors and\ngraphic effects to HSL": "勾选后更改画笔颜色为HSL模式", + "check to turn\nblock clicking\nsound on": "点击积木发出声音", + "check to turn on\nlogging pen vectors": "勾选以开始记录画笔矢量", + "check to turn on\n visible stepping (slow)": "勾选以开始显示每一步的执行", + "check to use blurred drop\nshadows and highlights": "使用透明的阴影和加亮", + "children": "子角色", + "choose another color for this morph": "指定morph的颜色", + "choose the World's background color": "选择World的背景颜色", + "circle": "圆形", + "circle box": "圆头框", + "circleSolid": "实心圆形", + "clean up": "整理", + "clear": "清空", + "clear graphic effects": "清除图形效果", + "clear undrop queue": "清除未删除队列", + "click or drag crosshairs to move the rotation center": "点击或拖动十字准线来移动旋转中心", + "clicked": "点击", + "clone": "克隆", + "clones": "克隆", + "close": "关闭", + "closedBrush": "关闭画笔", + "cloud": "云", + "cloud unavailable without a web server.": "云服务需要一个web服务器", + "cloudGradient": "云渐变", + "cloudOutline": "云轮廓", + "code": "调用代码", + "code delimiter mapping...": "列表项分隔符对应的代码...", + "code item mapping...": "列表项对应的代码...", + "code list mapping...": "列表对应的代码...", + "code mapping...": "对应的调用代码...", + "code of _": "_ 的代码", + "code string mapping...": "字符串对应的代码...", + "collection": "集合", + "color": "颜色", + "color _ is touching _ ?": "颜色 _ 碰到颜色 _ ?", + "color palette": "彩色调色板", + "color picker": "颜色选择器", + "color...": "颜色...", + "color:": "颜色:", + "columns": "行列转置", + "combinations _": "组合 _", + "combine _ using _": "合并 _ 方法为 _", + "comic": "漫画", + "command": "命令", + "comment pic...": "展示图片...", + "compile": "编译", + "compile _": "编译 _", + "compile _ for _ args": "编译 _ 方法为 _ 参数", + "confetti": "彩纸", + "console log _": "控制台日志 _", + "continuation": "延续", + "continuations cannot be forked": "延续不能被分叉", + "corner size...": "圆角大小...", + "cos": "余弦", + "costume": "造型", + "costume #": "造型编号", + "costume name": "造型名称", + "costumes": "造型", + "costumes tab help": "把网页或电脑中的图片拖到这里,可以添加一个造型", + "could not connect to:": "无法连接到:", + "cr": "回车", + "create a clone of _": "克隆一个 _", + "cross": "十字", + "crosshairs": "十字准星", + "current": "当前造型", + "current _": "当前的 _", + "current module versions:": "目前模块的版本:", + "current parent": "目前的母角色", + "custom?": "是自定义积木?", + "cut from _": "从 _ 剪切", + "d": "d", + "dangling?": "是否悬垂?", + "data": "数据", + "date": "日期", + "day of week": "星期几", + "days left": "剩余天数", + "days left.":"剩余天数。", + "defaults": "默认", + "define _ _ _": "定义 _ _ _", + "definition": "定义", + "delete": "删除", + "delete _": "删除 _", + "delete _ of _": "删除第 _ 项 _", + "delete a category...": "删除一个类别...", + "delete block": "删除块", + "delete block _": "删除块 _", + "delete block definition...": "删除积木定义...", + "delete slot": "删除槽", + "delete this clone": "删除此克隆", + "delete variable": "删除变量", + "delimiter": "分隔符", + "demo (1.2x)": "演示 (1.2倍)", + "demo...": "演示...", + "detach all parts": "所有组件脱离", + "detach and put into the hand": "脱离并放入手部", + "detach from": "脱离", + "development mode": "开发模式", + "development mode debugging primitives:": "开发模式 调试积木:", + "development mode...": "开发者模式...", + "dimensions": "维度", + "direction": "方向", + "disable deep-Morphic context menus and show user-friendly ones": "禁用Morphic快捷菜单 显示正常的用户界面", + "disable developers' context menus": "禁用开发者快捷菜单", + "disable dragging media\nand blocks out of\nwatchers and balloons": "禁用拖动媒体和块从监视器和气球", + "disattach and put into the hand": "断开连接拿起morph", + "disconnected.": "已经从云端登出.", + "distance": "距离", + "distance to _": "到 _ 的距离", + "distribution": "分布", + "don't rotate": "不能旋转", + "down arrow": "↓", + "download and save\nwith a summary of this project\nwith drop-shadows on all pictures.\nnot supported by all browsers": "下载并保存此项目,带有所有图片的阴影。 不是所有浏览器都支持", + "download script": "下载脚本", + "download this script as an XML file": "下载此脚本作为XML文件", + "draggable": "允许拖动", + "draggable?": "是否可拖动?", + "dragging threshold": "拖动阈值", + "dropped": "放下", + "duplicate": "复制", + "duplicate block definition...": "复制积木定义...", + "duration": "持续时间", + "e": "e", + "e^": "e^", + "each item": "每一项", + "edge": "边缘", + "edit": "编辑", + "edit rotation point only...": "修改旋转中心点...", + "edit the costume's rotation center": "编辑角色的旋转中心", + "edit...": "编辑...", + "editables": "可编辑的", + "elegant (90)": "优雅的(90)", + "else if _ _": "否则 如果 _ _", + "enable Morphic context menus and inspectors, not user-friendly!": "启用Morphic快捷菜单和查看器 对用户不友好", + "enable automatic line wrapping": "打开自动折行功能", + "enter": "进入", + "entering development mode.\n\nerror catching is turned off,\nuse the browser\'s web console\nto see error messages.": "进入开发模式. 错误捕捉已关闭,请使用 浏览器控制台查看错误消息.", + "entering user mode": "进入用户模式", + "eraser": "橡皮擦", + "exceeding maximum number of clones": "超过克隆的最大数量", + "expecting": "此处要求填写", + "expecting a": "期望一个", + "expecting a finite number but getting Infinity or NaN": "期望获得有限数值,但获得了无穷大或NaN", + "experimental - under construction": "实验性 - 尚未完成", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "实验性!使这个报告器快速和不可中断。注意:环中的错误可能会破坏您的Snap!会话!", + "export": "导出", + "export block definition...": "导出自定义块", + "export pen trails line segments as SVG": "导出画笔轨迹线段为SVG", + "export project as cloud data...": "把项目以云端数据格式导出...", + "export project media only...": "仅导出项目中的媒体文件...", + "export project without media...": "导出项目,不含媒体...", + "export script": "导出脚本", + "export...": "导出...", + "extract": "提取", + "f": "f", + "false": "假", + "file": "文件", + "file menu import hint": "从本地电脑导入", + "fill": "填充", + "fill page...": "填满页面...", + "filtered for _": "用 _ 过滤造型", + "find blocks": "查找块", + "find blocks...": "查找块...", + "find first item _ in _": "满足条件 _ 的第一个数据,来源 _", + "find unused global custom blocks\nand remove their definitions": "查找没用到的全局自制积木, 删除它们的定义", + "fisheye": "鱼眼", + "flag": "旗帜", + "flash": "闪现", + "flat line ends": "平头线条", + "flatten": "一维化", + "flip ↔": "↔ 翻", + "flip ↕": "↕ 翻", + "floor": "向下取整", + "font size...": "字体大小...", + "footprints": "足迹", + "for _ = _ to _ _": "重复执行 因子 _ 从 _ 到 _ _", + "for all sprites": "给所有角色用", + "for each _ in _ _": "逐个执行 _ 来自 _ _", + "for this sprite only": "仅对此角色", + "forever _": "重复执行 _", + "frame": "框架", + "frames": "帧", + "frequencies": "频率", + "frequency": "频率", + "front": "顶", + "fullScreen": "全屏", + "g": "g", + "gears": "齿轮", + "get blocks": "获取块", + "get data": "获取数据", + "ghost": "透明", + "giant (8x)": "巨大 (8x)", + "glide _ secs to x: _ y: _": "在 _ 秒钟内滑到 x: _ y: _", + "global?": "是全局积木?", + "globe": "地球", + "go back _ layers": "下移 _ 层", + "go to _": "移到 _", + "go to _ layer": "移至 _ 层", + "go to x: _ y: _": "移到 x: _ y: _", + "gray scale palette": "灰度调色板", + "green": "绿色", + "grow": "增大", + "h": "h", + "handle": "把手", + "header": "定义代码", + "header mapping...": "头部映射...", + "height": "高度", + "hello": "你好", + "help": "帮助", + "help...": "帮助...", + "here...": "此窗口...", + "hide": "隐藏", + "hide all...": "全部隐藏...", + "hide blanks": "隐藏空格", + "hide blocks...": "隐藏块", + "hide characters": "隐藏字符", + "hide primitives": "隐藏基本块", + "hide variable _": "隐藏变量 _", + "high": "高", + "hour": "小时", + "http:// _": "", + "hue": "色调", + "huge (4x)": "超大 (4x)", + "i": "i", + "identical to": "与", + "if _ _": "如果 _ _", + "if _ _ _": "如果 _ _ _", + "if _ _ else _": "如果 _ _ 否则 _", + "if _ then _ else _": "如果 _ 返回 _ 否则 _", + "if on edge, bounce": "如果碰到边缘就反弹", + "import a sound from your computer\nby dragging it into here": "把电脑中的声音文件拖到这里,\n可以添加一个声音", + "import without attempting to parse or format data": "导入数据而不尝试解析或格式化数据", + "import...": "导入...", + "in new inspector...": "新窗口...", + "in palette": "在调色板中", + "including dependencies": "包括依赖项", + "index": "索引", + "index of _ in _": "_ 在 _ 中的索引", + "inherit _": "继承 _", + "inherited": "继承的", + "input list:": "输入列表:", + "input names:": "输入项:", + "input(s), but getting": "个输入项,但实际得到输入项个数是", + "inputs": "输入项", + "insert _ at _ of _": "把 _ 插入到第 _ 项 _", + "insert a slot": "插入一个容器", + "insert a variable": "插入一个变量", + "inspect...": "查看...", + "is _ ?": "_ 是相同的?", + "is _ a _ ?": "_ 的类型是 _ 吗?", + "is _ empty?": "_ 为空?", + "is _ identical to _ ?": "_ 与 _ 是相同的?", + "is _ on?": "_ 已启用?", + "is not a valid option": "不是合法选项", + "is read-only": "是只读的", + "italic": "斜体", + "item": "项", + "item _ of _": "第 _ 项 _", + "items": "项", + "j": "j", + "join _": "把 _ 连起来", + "jukebox": "全部声音", + "k": "k", + "keep all submorphs within and visible": "围入所有子morph 全部可见", + "keep items _ from _": "保留满足条件 _ 的数据,来源 _", + "key": "键", + "key _ pressed?": "按下了 _ 键?", + "keyboard": "键盘", + "keyboardFilled": "键盘填充", + "l": "l", + "label": "标签", + "language_name": "简体中文", + "language_translator": "五百刀/邓江华/孟锡峰/曹儒林/moodykeke", + "large": "大型", + "last": "最后一个", + "last changed": "最后修改", + "last_changed": "2023-11-15", + "launch _ _": "启动 _ _", + "left": "左", + "left arrow": "←", + "length": "长度", + "length of _": "_ 的长度", + "length:": "长度:", + "let the World automatically adjust to browser resizing": "让Wolrd随浏览器改变大小", + "let the World automatically adjust to browser resizings": "让Wolrd随浏览器改变大小", + "letter": "字母", + "letter _ of _": "第 _ 个字符在文字 _ 中", + "light (70)": "浅色 (70)", + "lightness": "亮度", + "line": "行", + "lines": "行", + "list": "列表", + "list _": "列表 _", + "list view...": "列表视图...", + "ln": "", + "load the official library of powerful blocks": "载入强大的官方积木库", + "location": "位置", + "lock": "锁定", + "log pen vectors": "记录画笔矢量", + "login": "登录", + "loop": "循环", + "low": "低", + "lower case": "小写", + "m": "m", + "magnifierOutline": "放大镜轮廓", + "magnifyingGlass": "放大镜", + "make a block...": "制作新积木...", + "make a category...": "创建一个分类...", + "make a copy and pick it up": "复制并抓起这个积木", + "make a morph": "创建morph", + "make temporary and hide in the sprite corral": "创建临时对象并隐藏在角色围栏中", + "make this morph movable": "可以移动morph", + "make this morph unmovable": "固定morph不可移动", + "map String to code _": "把字符串转成代码 _", + "map _ of _ to code _": "把 _ 的 _ 转成代码 _", + "map _ over _": "映射 _ ,来源 _", + "map _ to _ _": "把 _ 转换成 _ _", + "mark own": "标记自有属性", + "max": "最大", + "maximum": "最大值", + "medium (50)": "中等 (50)", + "menu": "菜单", + "menus": "菜单", + "messages": "消息", + "methods": "方法", + "microphone _": "麦克风 _", + "middle": "中间", + "minimum": "最小值", + "minute": "分钟", + "mirror video": "视频镜像", + "missing / unspecified extension": "缺少/未指定的扩展名", + "monstrous (10x)": "最大 (10x)", + "month": "月份", + "mosaic": "马赛克", + "motion": "动作", + "mouse down?": "按下了鼠标?", + "mouse position": "鼠标坐标", + "mouse x": "鼠标的x坐标", + "mouse y": "鼠标的y坐标", + "mouse-departed": "鼠标离开", + "mouse-entered": "鼠标碰到", + "mouse-pointer": "鼠标指针", + "move": "移动", + "move _ steps": "移动 _ 步", + "move all inside...": "全部围住...", + "move...": "移动...", + "my": "我的", + "my _": "我的 _", + "my anchor": "我的锚点", + "my dangling?": "我的悬挂?", + "my draggable?": "我的可拖动?", + "my name": "我的名字", + "my parent": "我的父级", + "my rotation style": "我的旋转方式", + "my rotation x": "我的X轴旋转", + "my rotation y": "我的y轴旋转", + "my temporary?": "我的临时?", + "myself": "自己", + "n": "n", + "name": "名字", + "neg": "取反", + "negative": "底片", + "neighbors": "邻居", + "neighbors ≠": "邻居 ≠", + "new costume _ width _ height _": "创建造型 _ 宽度 _ 高度 _", + "new line": "换行", + "new property name:": "新属性名:", + "new sound _ rate _ Hz": "创建声音 _ 频率 _ Hz", + "new...": "新建...", + "next": "下一个", + "next costume": "下一个造型", + "none": "无", + "normal": "标准", + "normal (1x)": "标准 (1x)", + "normal style": "直体", + "normal weight": "正常粗细", + "normalScreen": "普通屏幕", + "normalStage": "标准舞台", + "not": "不成立", + "not _": "_ 不成立", + "note": "音符", + "nothing": "", + "now connected.": "已经登录到云端.", + "number": "数字", + "number of channels": "通道数", + "numbers from _ to _": "从 _ 到 _ 的数字", + "o": "o", + "objects": "对象", + "object _": "对象 _", + "octagon": "八边形", + "only duplicate this block": "复制单个积木", + "only face left/right": "只能水平翻转", + "only grab this block": "仅抓取此块", + "open a new browser browser window with a summary of this project": "打开新窗口,展示这个项目", + "open a new browser browser window with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "打开新窗口,使用带有阴影的图形 展示这个项目 (只有部分浏览器可以)", + "open a new window with a picture of all scripts": "打开一个新窗口,展示所有脚本的图片", + "open a new window with a picture of both this script and its result": "打开一个新窗口, 显示这个脚本和运行结果的图片", + "open a new window with a picture of the stage": "打开一个新窗口,显示舞台的图片", + "open a new window with a picture of this comment": "打开新窗口,展示这条说明的图片", + "open a new window with a picture of this morph": "打开新窗口 展示这个morph的图片", + "open a new window with a picture of this script": "打开一个新窗口, 显示这个脚本的图片", + "open a window on all properties": "打开新的窗口 显示所有属性", + "open in another dialog...": "在另一个对话框中查看...", + "open in dialog...": "在对话框中查看...", + "open shared project from cloud...": "打开共享在云端的项目...", + "options...": "选项...", + "options": "选项", + "or": "或", + "or before": "或更早", + "other clones": "其他克隆", + "other scripts in sprite": "角色中的其他脚本", + "other sprites": "其他角色", + "p": "p", + "paint a new sprite": "画一个新角色", + "paintbucket": "填充工具", + "parameters": "参数", + "parent": "母角色", + "parent...": "母角色...", + "parent:": "母角色:", + "parts": "组件", + "password has been changed.": "密码改好了.", + "password must be six characters or longer": "密码不能少于6个字符", + "passwords do not match": "两次填写的密码不一致", + "paste on _": "拼贴在 _ 上", + "pause": "暂停", + "pause all _": "暂停所有的 _", + "pen": "画笔", + "pen _": "画笔的 _", + "pen down": "落笔", + "pen down?": "画笔已落下?", + "pen is down?": "画笔已落下?", + "pen trails": "画笔轨迹", + "pen up": "抬笔", + "pen vectors": "画笔矢量", + "piano keyboard": "钢琴键盘", + "pic...": "展示图片...", + "pick random _ to _": "在 _ 到 _ 间随机选一个数", + "pick up": "抓起", + "pipe _ $arrowRight _": "管道 _ $arrowRight _", + "pipette": "吸管", + "pitch": "音调", + "pivot": "支点", + "pixel": "像素", + "pixelate": "像素化", + "pixels": "像素", + "play _ Hz for _ secs": "演奏频率 _ 赫兹 _ 秒", + "play frequency _ Hz": "演奏频率 _ 赫兹", + "play note _ for _ beats": "弹奏音符 _ 持续 _ 拍", + "play sound _": "播放声音 _", + "play sound _ at _ Hz": "播放声音 _ 于频率 _ 赫兹", + "play sound _ until done": "播放声音 _ 直到播放完毕", + "please agree to the TOS": "请同意《服务条款》", + "please fill out this field": "请填写这里", + "please provide a valid email address": "请填写有效的电子邮件地址", + "point in direction _": "面向 _ 度", + "point towards _": "面向 _", + "pointRight": "向右", + "polygon": "多边形", + "position": "坐标", + "poster": "海报", + "predicate": "判断", + "presentation (1.4x)": "幻灯片 (1.4x)", + "pressed": "按下", + "previous": "上一个", + "processes": "进程数量", + "product": "乘积", + "property name:": "属性名:", + "published.": "已发布。", + "publishing project...": "正在发布项目...", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "任意", + "random position": "任意位置", + "rank": "维数", + "raw data...": "原始数据...", + "ray length": "光线长度", + "read-only": "只读", + "receivers...": "接收器...", + "recording": "录音...", + "rectangle": "矩形", + "rectangleSolid": "实心矩形", + "red": "红色", + "redo the last undone block drop in this pane": "在此面板中重做最后一次撤销的块放置", + "redraw the screen once": "重画屏幕", + "redrop": "重新放置", + "relabel...": "更换...", + "release": "发布", + "remove block variables...": "删除积木变量...", + "remove...": "删除...", + "rename": "重命名", + "rename all blocks that access this variable": "重命名所有访问此变量的块", + "rename all...": "重命名所有...", + "rename background": "重命名背景", + "rename costume": "重命名造型", + "rename only this reporter": "仅重命名此报告器", + "rename sound": "重命名声音", + "rename...": "改名为...", + "repeat _ _": "重复执行 _ 次 _", + "repeat until _ _": "重复执行直到 _ _", + "replace item _ of _ with _": "把第 _ 项 _ 替换为 _", + "report _": "报告 _", + "reporter": "记录", + "reporter didn't report": "报告器未报告", + "reset columns": "重置列", + "reset timer": "计时器归零", + "reshape _ to _": "重构列表 _ 为 _", + "resize...": "改变大小...", + "resolution": "分辨率", + "rest for _ beats": "停止 _ 拍", + "restore display": "恢复显示", + "result pic...": "结果图片...", + "reverse": "倒序", + "right": "右边", + "right arrow": "→", + "ring": "环", + "ringify": "环形化", + "robot": "机器人", + "rotate": "旋转", + "rotation style": "旋转样式", + "rotation x": "旋转点x坐标", + "rotation y": "旋转点y坐标", + "round _": "把 _ 四舍五入", + "run _ _": "运行 _ _", + "run _ w/continuation": "带延续运行 _", + "s": "s", + "sample morphs": "各种morph示例", + "sample rate": "样本频率", + "samples": "样本数据", + "sans-serif": "无衬线字体", + "saturation": "饱和", + "save": "保存", + "save _ as costume named _": "把 _ 保存为造型,命名为 _", + "save a picture\nof all scripts": "保存所有脚本的图片", + "save a picture\nof both this script and its result": "保存这个脚本及其结果的图片", + "save a picture\nof the stage": "保存舞台的图片", + "save a picture\nof this comment": "保存这条评论的图片", + "save a picture\nof this script": "保存这个脚本的图片", + "save a summary\nof this project": "保存这个项目的摘要", + "save global custom block\ndefinitions as XML": "将全局自定义块定义保存为XML格式", + "save project data as XML\nto your downloads folder": "把项目数据以XML格式 保存到下载文件夹", + "saved.": "项目已保存.", + "say _": "说 _", + "say _ for _ secs": "说 _ _ 秒", + "scope": "作用域", + "screenshot": "屏幕截图", + "screenshot...": "屏幕截图...", + "script": "脚本", + "script pic with result...": "带结果的脚本图片...", + "script pic...": "脚本图片...", + "script variables _": "脚本变量 _", + "scripts": "脚本", + "scripts pic...": "脚本图片...", + "scroll frame": "可滚动框架", + "scrolled-down": "向下滚动滚轮", + "scrolled-up": "向上滚动滚轮", + "second": "秒钟", + "select": "选择", + "selection": "选择", + "self": "本身", + "send _ to _": "发送消息 _ 给 _", + "senders...": "发送者...", + "sensor demo": "传感器演示", + "serif": "衬线字体", + "set _ effect to _": "把 _ 效果设定为 _", + "set _ of block _ to _": "把 _ 块的 _ 设定为 _", + "set _ to _": "设置 _ 为 _", + "set background _ to _": "把背景的 _ 设定为 _", + "set background color to _": "把背景色设置为 _", + "set balance to _": "设置声音平衡为 _", + "set instrument to _": "将乐器设定为 _", + "set pen _ to _": "把画笔的 _ 设定为 _", + "set pen color to _": "把画笔的颜色值设定为 _", + "set pen shade to _": "把画笔的色度设定为 _", + "set pen size to _": "把画笔的大小设定为 _", + "set size to _ %": "把角色的大小设定为 _ %", + "set tempo to _ bpm": "把节奏设定为 _", + "set the border's line color": "设置边框线条颜色", + "set the border's line size": "设置边框线条尺寸", + "set the corner's radius": "设置圆角半径", + "set this String's font point size": "设置字符串的字体点数", + "set this morph's alpha value": "设置morph的alpha通道值", + "set turbo mode to _": "设置加速模式为 _", + "set video transparency to _": "把视频透明度设置为 _", + "set volume to _ %": "把音量设定为 _ %", + "set x to _": "把x坐标设定为 _", + "set y to _": "把y坐标设定为 _", + "setting the rotation center requires a costume": "设定旋转中心需要一个角色", + "settings menu prefer empty slots hint": "“报告积木”优先 放在没有积木的输入项上", + "several block definitions already match this label": "多个积木定义已经匹配到这个标签", + "shared.": "项目已分享给其他人.", + "sharing project...": "正在分享项目...", + "sharp drop shadows use for old browsers": "对老旧浏览器 使用锐利的阴影", + "sharp shadows...": "锐利的阴影...", + "shimmering (80)": "闪烁(80)", + "show": "显示", + "show a handle which can be dragged to change this morph's extent": "显示一个把手, 拖动可改变morph大小", + "show a handle which can be dragged to move this morph": "显示一个把手, 拖动可移动这个morph", + "show a picture of all scripts\nand block definitions": "把所有脚本展示成一张图片", + "show all": "显示全部", + "show all...": "显示全部...", + "show blanks": "显示空格", + "show characters": "显示字符", + "show global custom block definitions as XML in a new browser window": "打开新窗口,以XML格式展示全局自制积木", + "show primitives": "显示基本块", + "show project data as XML in a new browser window": "打开新窗口,展示项目的XML数据", + "show table _": "显示表格 _", + "show the World's menu": "显示World菜单", + "show variable _": "显示变量 _", + "show...": "显示...", + "shown?": "已显示?", + "shrink": "减小", + "shuffled": "已洗牌", + "sign": "符号", + "signals": "信号", + "sin": "正弦", + "size": "大小", + "slider": "游标", + "slider max...": "滑块最大值...", + "slider min...": "滑块最小值...", + "slots": "插槽", + "smallStage": "小舞台", + "smaller menu fonts and sliders": "使用小号菜单字体和游标", + "snap": "快照", + "sorted": "已排序", + "sound": "声音", + "sounds": "声音", + "space": "空格", + "spec": "描述", + "spec...": "描述...", + "special":"特殊的", + "specify the distance the hand has to move\nbefore it picks up an object": "要抓起东西 鼠标需要移动的最小距离", + "spectrum": "声谱", + "speech bubble": "对话气泡", + "speechBubble": "对话框", + "speechBubbleOutline": "对话框轮廓", + "split _ by _": "把 _ 按 _ 分开", + "sprite": "角色", + "sprites": "角色", + "sqrt": "平方根", + "square": "正方形", + "stack size": "堆栈大小", + "stage": "舞台", + "stage image": "舞台图片", + "stamp": "图章", + "standard settings": "适合普通屏幕", + "stay signed in on this computer until logging out": "保持登录,直到登出", + "static":"静态的", + "stepForward": "向前一步", + "stick this morph to another one": "连接到另外一个morph", + "stick to": "粘附到", + "stop _": "停止 _", + "stop all sounds": "停止所有声音", + "stop frequency": "停止演奏频率", + "stopped": "停止", + "storage": "存储", + "store this project in the downloads folder (in supporting browsers)": "保存到下载文件夹 (部分浏览器支持)", + "stretch _ x: _ y: _ %": "拉伸 _ 比例 x: _ y: _ %", + "string": "字符串", + "subtle (95)": "微妙(95)", + "sum": "求和", + "svg...": "svg...", + "switch to costume _": "换成 _ 造型", + "switch to scene _ _": "切换至场景 _ _", + "t": "t", + "tab": "制表符", + "table view...": "展示为表格...", + "take a camera snapshot and import it as a new sprite": "用摄像头拍摄一个新角色", + "tan": "正切", + "tell _ to _ _": "命令 _ 运行 _ _", + "tempo": "节奏", + "temporary?": "属性为临时?", + "text": "文字", + "text-only (100)": "仅文本(100)", + "the predicate takes too long for a custom hat block": "谓词对于自定义帽子块来说需要太长时间", + "there are currently no unused global custom blocks in this project": "这个项目里目前没有 没用到的全局自制积木", + "there are currently no vectorizable pen trail segments": "目前没有可以矢量化的笔迹段", + "thing": "东西", + "think _": "思考 _", + "think _ for _ secs": "思考 _ _ 秒", + "this _": "这个 _", + "this block": "这个块", + "this project doesn't have any custom global blocks yet": "这个项目没有包含全局性的自制积木", + "this script": "这个脚本", + "time in milliseconds": "毫秒", + "timer": "计时器", + "tip": "尖端", + "to": "到", + "top": "顶部", + "touch screen settings": "适合触摸屏", + "touching _ ?": "碰到 _ ?", + "transient": "不记录", + "translations": "翻译", + "translations...": "翻译...", + "translator_e-mail": "ubertao@qq.com/djh@rhjxx.cn/simon@snapontop.org", + "transparency": "透明度", + "transparency...": "透明度...", + "trash is empty": "垃圾箱为空", + "true": "真", + "turbo mode": "加速模式", + "turbo mode?": "启动了加速模式?", + "turn _ _ degrees": "旋转 _ _ 度", + "turn all pen trails and stamps into a new background for the stage": "将所有笔迹和印章转换为舞台的新背景", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "把所有笔迹和图章变成当前选中角色的一个新造型", + "turn automatic line wrapping off": "关闭自动折行功能", + "turn pen trails into new background...": "将笔迹转换为新背景...", + "turn pen trails into new costume...": "把笔迹变成新造型...", + "turnBack": "向后转", + "turnForward": "向前转", + "turnLeft": "向左转", + "turnRight": "向右转", + "turtle": "海龟", + "turtleOutline": "海龟轮廓", + "type": "类型", + "type of _": "_ 的类型", + "u": "u", + "un-mark own": "取消自有属性标记", + "unable to convert to": "无法转换为", + "unable to inherit (disabled or circular?)": "无法继承(禁用还是循环?)", + "unable to nest (disabled or circular?)": "无法嵌套(禁用还是循环?)", + "uncheck for default\nGUI design": "使用默认的用户界面", + "uncheck for greater speed at variable frame rates": "改变帧率保证播放速度 (牺牲平滑程度)", + "uncheck for less contrast\nmulti-column list views": "浅色表格线", + "uncheck for lower resolution, saves computing resources": "取消选中较低的分辨率,节省计算资源", + "uncheck for round ends of lines": "线条的端点是圆的", + "uncheck for smooth\nscaling of vector costumes": "矢量造型平滑缩放", + "uncheck to allow dropped\nreporters to kick out others": "“报告积木”可以 替换输入项上已有的积木", + "uncheck to allow\nscript reentrance": "允许脚本重入", + "uncheck to always show (+) symbols\nin block prototype labels": "在积木设计图上显示(+)号", + "uncheck to confine auto-wrapping\nto top-level block stacks": "取消选中以限制自动换行到顶层块堆栈", + "uncheck to disable\nIDE animations": "不显示编辑器动画效果", + "uncheck to disable alternating\ncolors for nested block": "使用同样的颜色 显示嵌套的同类积木", + "uncheck to disable\nblock to text mapping features": "关闭积木转文字的功能", + "uncheck to disable\ncamera support": "取消选中以禁用相机支持", + "uncheck to disable\ndropping commands in reporter rings": "取消选中以禁用报告器环中的删除命令", + "uncheck to disable dynamic\nlabels for variadic inputs": "可变输入项不使用动态标记", + "uncheck to disable\ninput sliders for\nentry fields": "不使用游标修改输入字段", + "uncheck to disable\nkeyboard editing support": "不使用键盘编辑", + "uncheck to disable\nmulti-column list views": "不使用多栏(如2维)列表", + "uncheck to disable\nproject data in URLs": "网址不携带项目数据", + "uncheck to disable\nsaving linked sublist identities": "不保存子列表的ID", + "uncheck to disable\nsprite composition": "不允许角色组合", + "uncheck to disable\nsprite inheritance features": "角色不可以继承", + "uncheck to disable support\nfor first-class sprites": "不使用高等角色", + "uncheck to disable\nsupport for\nnative JavaScript functions": "取消勾选以禁用JS扩展函数", + "uncheck to disable\nusing operators on lists and tables": "取消勾选以禁用作用于列表和表格的超级运算符", + "uncheck to disable\nvirtual keyboard support for mobile devices": "不使用移动设备的虚拟键盘", + "uncheck to disinherit": "取消勾选以继承", + "uncheck to drag media\nand blocks out of\nwatchers and balloons": "取消勾选以拖动媒体和积木从监视器和气球", + "uncheck to enable\ndirectly running blocks\nby clicking on them": "取消勾选后可以点击积木直接运行", + "uncheck to hide buttons\nin the palette": "取消勾选后隐藏积木面板上的按钮", + "uncheck to hide\ncategory names\nin the palette": "取消勾选后隐藏积木面板上的分类名称", + "uncheck to hide extension primitives in the palette": "隐藏扩展块", + "uncheck to hide in palette": "取消勾选后隐藏积木面板上的积木", + "uncheck to ignore upper- and\n lowercase when comparing texts": "取消勾选后忽略大小写", + "uncheck to limit\nBoolean slots to true / false": "取消勾选后布尔变量只能为真或假", + "uncheck to render\nsprites dynamically":"取消选中以动态渲染精灵", + "uncheck to run scripts\nat normal speed": "取消勾选以正常速度运行脚本", + "uncheck to save contents in the project": "取消勾选把变量内容保存在项目里", + "uncheck to show only the selected category\'s blocks": "取消勾选后积木会分别显示在其归属的积木面板(类别)中", + "uncheck to stop caching inputs (for debugging the evaluator)": "不缓存输入数据 (以便调试求值过程)", + "uncheck to suppress\nrunning scripts\nwhen moving the slider": "取消勾选后滑动游标时运行脚本", + "uncheck to switch pen colors]\nand graphic effects to HSV": "取消勾选后更改画笔颜色为HSV模式", + "uncheck to turn\nblock clicking\nsound off": "点击积木时不发出声音", + "uncheck to turn off\nlogging pen vectors": "取消勾选以停止记录画笔矢量", + "uncheck to turn off\nvisible stepping": "取消勾选以停止显示步进", + "uncheck to use solid drop\nshadows and highlights": "使用不透明的阴影和加亮", + "uncheck to use the input\ndialog in short form": "显示简洁的输入项对话框", + "uncompile": "取消编译", + "undo": "撤销", + "undo the last block drop in this pane": "收回刚刚放下的积木", + "undrop": "收回积木", + "unicode _ as letter": "Unicode码为 _ 的字符", + "unicode of _": "字符 _ 的Unicode码", + "unlock": "解锁", + "unpublished.": "未发布的项目.", + "unpublishing project...": "正在取消项目发布...", + "unringify": "取消环形化", + "unshared.": "其他人已看不到项目.", + "unsharing project...": "正在取消项目分享...", + "unsupported attribute": "不支持的属性", + "unsupported data type": "不支持的类型", + "unsupported graphic effect": "不支持的图形效果", + "untitled": "无标题", + "unused": "未使用", + "unused block(s) removed": "删掉了没用到的积木", + "up arrow": "↑", + "upper case": "大写", + "url...": "网址...", + "use the keyboard to enter blocks": "使用键盘快捷键输入积木", + "user features...": "用户菜单...", + "user mode...": "用户模式...", + "v": "v", + "value": "值", + "variable": "变量", + "variables": "变量", + "video _ on _": "视频 _ 对 _", + "video capture": "视频捕捉", + "volume": "音量", + "w": "w", + "wait _ secs": "等待 _ 秒", + "wait until _": "直到 _ 前都等待", + "wardrobe": "全部造型", + "warp _": "一步完成 _", + "what's your name?": "你的名字?", + "when I am _": "当 _ 我", + "when I receive _ _": "当接收到 _ _", + "when I start as a clone": "当我作为克隆体启动时", + "when _": "当 _", + "when _ clicked": "当 _ 被点击", + "when _ is edited _": "当 _ 被编辑时 _", + "when _ key pressed _": "当按下 _ 键 _", + "whirl": "旋转", + "whitespace": "空符", + "width": "宽度", + "with data": "带数据", + "with inputs": "带有输入", + "word": "单词", + "world": "世界", + "write _ size _": "写字 _ 字号 _", + "x": "x", + "x position": "x坐标", + "y": "y", + "y position": "y坐标", + "year": "年份", + "year:": "年:", + "your own": "你自己", + "Your account is still unverified.\nPlease use the verification link that\nwas sent to your email address when you\nsigned up.\n\nIf you cannot find that email, please\ncheck your spam folder. If you still\ncannot find it, please use the \"Resend\nVerification Email...\" option in the cloud\nmenu.":"您的账户仍未验证。\n请使用您注册时发送到您的电子邮件地址的验证链接。\n\n如果您找不到该电子邮件,请检查您的垃圾邮件文件夹。如果仍然找不到,请在云菜单中使用“重新发送验证电子邮件...”选项。", + "z": "z" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/locale/lang-zh_TW.js b/elements/pl-snap/Snap/locale/lang-zh_TW.js new file mode 100644 index 00000000..d9b8fa40 --- /dev/null +++ b/elements/pl-snap/Snap/locale/lang-zh_TW.js @@ -0,0 +1,1389 @@ +SnapTranslator.dict.zh_TW = { + "0": "0", + "1": "1", + "2": "2", + "3": "3", + "4": "4", + "5": "5", + "6": "6", + "7": "7", + "8": "8", + "9": "9", + "' does not exist in this context": "", + "(-90) left": "(-90) 左", + "(0) up": "(0) 上", + "(1) sine": "", + "(180) down": "(180) 下", + "(180) right": "(180) 右", + "(2) square": "", + "(3) sawtooth": "", + "(4) triangle": "", + "(90) right": "(90) 右", + "(empty)": "(空)", + "(in a new window)": "", + "(no matches)": "", + "(temporary)": "", + "A variation on the list data type in which each list item isn't computed until it's needed, so you can construct million-item lists without really taking up all that time or memory, or even infinite-sized lists. (A block that reports all the prime numbers is included as an example.) See SICP 3.5 for a tutorial.": "", + "APL primitives": "", + "About Snap": "關於 Snap", + "About...": "關於Snap!...", + "Account created.": "", + "Add interactive maps to projects": "", + "Add scene...": "", + "Adds features from the APL language supporting hyperblocks.": "", + "Allow multi-line text input to a block": "", + "An e-mail with your password has been sent to the address provided": "", + "An extended version of the URL block that allows POST, PUT, and DELETE as well as GET requests, allows using the secure HTTPS protocol, and gives control over headers, etc. Also parses JSON data.": "", + "Analyze data for frequency distribution": "", + "Analyze, manipulate and generate sound samples.": "", + "Animation": "", + "Animations": "動畫", + "Another custom block with this name exists.": "", + "Any (unevaluated)": "任意(未評價)", + "Any type": "所有類型", + "Apply": "應用", + "April": "", + "Are you sure you want to continue?": "", + "Are you sure you want to delete": "確定要刪除嗎?", + "Are you sure you want to publish": "", + "Are you sure you want to replace": "", + "Are you sure you want to share": "", + "Are you sure you want to unpublish": "", + "Are you sure you want to unshare": "", + "Audio Comp": "", + "August": "", + "Back...": "返回...", + "Backgrounds": "", + "Backup failed. This cannot be undone, proceed anyway?": "", + "Bar charts": "", + "Bignums, rationals, complex #s": "", + "Birth date:": "", + "Bitmap": "", + "Block Editor": "程式塊編輯器", + "Blocks": "", + "Blocks category name:": "", + "Blurred shadows": "半透明陰影", + "Boolean": "布林值", + "Boolean (T/F)": "布林值(是/否)", + "Boolean (unevaluated)": "布林(評價)", + "Bottom": "", + "Bring back deleted sprites": "", + "Browser": "", + "Brush size": "", + "Cache Inputs": "", + "Camera": "", + "Camera not supported": "", + "Camera support": "", + "Cancel": "取消", + "Case sensitivity": "", + "Catch errors": "", + "Catch errors in a script": "", + "Category color": "", + "Change Password": "", + "Change Password...": "", + "Change block": "修改程式塊", + "Clear backup": "", + "Clicking sound": "點擊聲音", + "Closed brush (free draw)": "", + "Cloud": "", + "Code mapping": "", + "Codification support": "", + "Colors and Crayons": "", + "Command": "命令", + "Command (C-shape)": "命令(C型)", + "Command (inline)": "命令(內置)", + "Computer": "", + "Connect to hardware extensions through the Web Serial API (Chromium, Chrome or Edge required)": "", + "Constrain proportions of shapes? (you can also hold shift)": "", + "Contents": "", + "Contributors": "貢獻者:", + "Control": "控制", + "Control the Hummingbird robotics kit processor": "", + "Convert to bitmap?": "", + "Costume Editor": "造型編輯器", + "Costumes": "造型", + "Crayons": "", + "Create and manage global/sprite/script variables in a script": "", + "Create input name": "創建參數名", + "Create variables": "", + "Create variables in program": "", + "Credits...": "光榮榜...", + "Custom Block Translations": "", + "Database": "", + "December": "", + "Default": "", + "Default Value:": "預設值:", + "Delete": "刪除", + "Delete Custom Block": "刪除自定義程式塊", + "Delete Project": "刪除項目", + "Delete a variable": "刪除變數", + "Disable click-to-run": "", + "Disable dragging data": "", + "Down": "", + "Download source": "下載源碼", + "Dragging threshold...": "", + "Dynamic input labels": "動態輸入標籤", + "E-mail address of parent or guardian:": "", + "E-mail address:": "", + "ERROR: INVALID PASSWORD": "", + "EXPERIMENTAL! check to enable live custom control structures": "", + "EXPERIMENTAL! check to enable support for compiling": "", + "EXPERIMENTAL! optimize Canvas2D readback operations using the \"willReadFrequently\" attribute at the expense of slowing down rendering in some web browsers": "", + "EXPERIMENTAL! uncheck to disable live custom control structures": "", + "EXPERIMENTAL! uncheck to disable live support for compiling": "", + "Edge color (left click)": "", + "Edit input name": "編輯參數名", + "Edit label fragment": "編輯標籤片段", + "Eisenberg's Law: Anything that can be done from the GUI should be doable from the programming language, and vice versa.": "", + "Ellipse (shift: circle)": "", + "Empty": "", + "Enable command drops in all rings": "", + "Enter code that corresponds to the block's definition. Choose your own formal parameter names (ignoring the ones shown).": "", + "Enter code that corresponds to the block's definition. Use the formal parameter names as shown and to reference the definition body's generated text code.": "", + "Enter code that corresponds to the block's operation (usually a single function invocation). Use <#n> to reference actual arguments as shown.": "", + "Enter one option per line.Optionally use \"=\" as key/value delimiter e.g. the answer=42": "", + "Enter one translation per line. use colon (\":\") as lang/spec delimiter and underscore (\"_\") as placeholder for an input, e.g.: en:say _ for _ secs": "", + "Eraser tool": "", + "Error": "", + "Examples": "", + "Execute on slider change": "", + "Export Project As...": "", + "Export all scripts as pic...": "", + "Export blocks": "導出程式塊", + "Export blocks...": "輸出程式塊...", + "Export project as plain text...": "純文本格式導出專案...", + "Export project...": "導出項目...", + "Export summary with drop-shadows...": "", + "Export summary...": "", + "Extension blocks": "", + "Extract substrings of a string in various ways. In general, text inputs allow only a single line. The MULTILINE block accepts multi-line text input and can be used in text input slots of other blocks.": "", + "Fade blocks": "", + "Fade blocks...": "", + "February": "", + "Fetching project from the cloud...": "", + "Fill a region": "", + "Fill color (right click)": "", + "Filled Ellipse (shift: circle)": "", + "Filled Rectangle (shift: square)": "", + "First-Class Sprites": "", + "Flat design": "", + "Flat line ends": "", + "For all Sprites": "", + "Frequency Distribution Analysis": "", + "Generate costumes from letters or words of text.": "", + "Getters and setters": "", + "Glide, grow and rotate using easing functions.": "", + "HSL pen color model": "", + "Header mapping": "", + "Hello!": "你好!", + "Hello, World!": "", + "Help": "説明", + "Hide blocks in palette": "", + "Hide blocks...": "", + "Hmm...": "嗯...", + "Hummingbird robotics": "", + "Hyper blocks support": "", + "I have read and agree to the Terms of Service": "", + "If you cannot find that email, please check your spam folder.": "", + "If you still cannot find it, please use the \"Resend Verification Email...\" option in the cloud menu.": "", + "Import": "", + "Import a new costume from your webcam": "", + "Import blocks": "導入程式塊", + "Import library": "", + "Import sound": "", + "Import tools": "導入工具包", + "Import...": "導入...", + "Imported": "", + "Incorporates the former crayon and set RGB libraries. Implements fair hues (more orange, less green, adds brown) and a linear color scale including grayscale and fair-hue-based shades.": "", + "Infinite precision integers, exact rationals, complex": "", + "Inheritance support": "", + "Input Names:": "參數名:", + "Input Slot Options": "", + "Input name": "參數名", + "Input sliders": "輸入滑塊", + "Inside a custom block": "", + "Interact with MicroBlocks devices via WiFi. Requires the device to have a TFT display, two buttons and WiFi capability, as well as the Signada MicroBlocks project loaded. The Citilab ED1 and a bunch of the M5Stack boards are some of the devices that work with Signada.": "", + "Iteration, composition": "", + "JIT compiler support": "", + "January": "", + "JavaScript extensions": "", + "JavaScript extensions for Snap! are turned off": "", + "JavaScript function ( _ ) { _ }": "", + "July": "", + "June": "", + "Just the crayons, without the rest of the colors library. Fast and simple.": "", + "Keyboard Editing": "", + "Kind of": "", + "LEAP Motion controller": "", + "Language...": "語言選擇...", + "Libraries...": "", + "License": "版權", + "License...": "許可...", + "Like \"switch\" in C-like languages or \"cond\" in Lisp. Thanks to Nathan Dinsmore for inventing the idea of a separate block for each branch!": "", + "Line tool (shift: constrain to 45º)": "", + "Line tool (shift: vertical/horizontal)": "", + "List": "鏈表", + "List utilities": "", + "Lists": "鏈表", + "Live coding support": "", + "Loading": "", + "Local Block(s) in Global Definition": "", + "Log pen vectors": "", + "Login...": "登錄...", + "Logout": "", + "Long form input dialog": "長形式輸入對話方塊", + "Looks": "外觀", + "Make a block": "新建程式塊", + "Make a variable": "新建變數", + "Manipulate costumes pixel-wise.": "", + "March": "", + "May": "", + "Message name": "資訊名稱", + "Method Editor": "", + "Microphone": "", + "Microphone resolution...": "", + "Modules...": "模組...", + "Motion": "動作", + "Multi-branched conditional": "", + "Multi-branched conditional (switch)": "", + "Multiple inputs (value is list of inputs)": "多行輸入(值為參數列表)", + "Nested auto-wrapping": "", + "New": "新建", + "New Category": "", + "New Project": "新建項目", + "New category...": "", + "New password:": "", + "New scene": "", + "No": "否", + "November": "", + "Number": "數字", + "OK": "確定", + "Object": "對象", + "October": "", + "Ok": "確定", + "Old password:": "", + "One of the big ideas in Logo that they left out of Scratch is thinking of text as structured into words and sentences, rather than just a string of characters. This library brings back that idea.": "", + "Open": "打開", + "Open Project": "打開專案", + "Open Projekt": "打開項目", + "Open in Community Site": "", + "Open...": "打開...", + "Opening project...": "", + "Operators": "運算", + "Other": "其他", + "Output text using speech synthesis.": "", + "Paint Editor": "", + "Paint a new costume": "", + "Paint a shape (shift: edge color)": "", + "Paint a shape (shift: secondary color)": "", + "Paintbrush tool (free draw)": "", + "Parallelization": "", + "Part of": "", + "Parts": "", + "Password:": "", + "Pen": "畫筆", + "Persist linked sublist IDs": "", + "Persistent key-value storage across Snap! sessions in the same browser": "", + "Pipette tool (pick a color anywhere)": "", + "Pipette tool (pick a color from anywhere shift: fill color)": "", + "Pipette tool (pick a color from anywhere shift: secondary color)": "", + "Pixels": "", + "Plain prototype labels": "", + "Play": "播放", + "Play sound": "播放聲音", + "Please make sure your web browser is up to date and your camera is properly configured. Some browsers also require you to access Snap! through HTTPS to use the camera. Plase replace the \"http://\" part of the address in your browser by \"https://\" and try again.": "", + "Please use the verification link that was sent to your email address when you signed up.": "", + "Polygon": "", + "Predicate": "謂語", + "Prefer empty slot drops": "喜歡減少空槽", + "Prefer smooth animations": "不流暢的動畫", + "Privacy...": "", + "Project Notes": "項目注釋", + "Project URLs": "", + "Project notes...": "專案說明...", + "Provide 100 selected colors": "", + "Provide getters and setters for all GUI-controlled global settings": "", + "Publish": "", + "Publish Project": "", + "Rasterize SVGs": "", + "Record a new sound": "", + "Recover": "", + "Rectangle (shift: square)": "", + "Reference manual": "參考手冊", + "Remove a category...": "", + "Remove unused blocks": "", + "Repeat Password:": "", + "Repeat new password:": "", + "Replace Project": "", + "Replace the current project with a new one?": "你要取消當前編輯的專案,重新建立專案嗎?", + "Report hand positions from LEAP Motion controller (leapmotion.com).": "", + "Reporter": "記錄", + "Request blocked": "", + "Resend Verification Email...": "", + "Resend verification email": "", + "Reset Password...": "", + "Reset password": "", + "Restore unsaved project": "", + "Retina display support": "", + "Run a script; if an error happens, instead of stopping the script with a red halo, run another script to handle the error. Also includes a block to cause an error with a message given as input. Also includes a block to create a script variable and give it a value.": "", + "Run several scripts in parallel and wait until all are done.": "", + "SVG costumes are not yet fully supported in every browser": "", + "Same Named Blocks": "", + "Save": "存", + "Save As...": "另存為...", + "Save Project": "", + "Save Project As...": "項目另存為...", + "Save to disk": "", + "Saved!": "已保存!", + "Saving project to the cloud...": "", + "Scenes...": "", + "Script variable name": "", + "Scripts": "腳本", + "Select a costume from the media library": "", + "Select a sound from the media library": "", + "Select categories of additional blocks to add to this project.": "", + "Selection tool": "", + "Sensing": "偵測", + "September": "", + "Serial Ports": "", + "Service:": "", + "Set RGB or HSV pen color": "", + "Set the rotation center": "", + "Share": "", + "Share Project": "", + "Show buttons": "", + "Show categories": "", + "Sign in": "", + "Sign up": "", + "Signada (Network remote control)": "", + "Signup": "", + "Signup...": "註冊...", + "Single input.": "單一參數.", + "Single palette": "", + "Slider maximum value": "滑塊的最大值", + "Slider minimum value": "滑塊的最小值", + "Snap! website": "官方網站", + "Snap!Cloud": "", + "Some standard functions on lists (reverse, sort, etc.)": "", + "Sound": "聲音", + "Sound Recorder": "", + "Sounds": "聲音", + "Sprite": "角色", + "Sprite Nesting": "", + "Stage": "舞臺", + "Stage height": "", + "Stage selected: no motion primitives": "舞臺選擇: 沒有動作程式語言", + "Stage size": "", + "Stage size...": "", + "Stage width": "", + "Stop": "停止", + "Stop sound": "停止聲音", + "Streams (lazy lists)": "", + "Strings, Multi-line input": "", + "Stroked Ellipse (shift: circle)": "", + "Stroked Rectangle (shift: square)": "", + "Switch back to user mode": "切換到使用者模式", + "Switch to dev mode": "切換到開發人員模式", + "Switch to vector editor?": "", + "Table lines": "", + "Table support": "", + "Table view": "", + "Takes a table (typically from a CSV data set) as input and reports a summary of the table grouped by the field in the specified column number. The remaining three inputs are used only if the field values are numbers, in which case they can be grouped into buckets (e.g., decades, centuries, etc.). Those three inputs specify the smallest and largest values of interest and, most importantly, the width of a bucket (10 for decades, 100 for centuries). If the field isn't numeric, leave these three inputs empty or set them to zero. In that case, each string value of the field is its own bucket, and they appear sorted alphabetically. The block reports a new table with three columns. The first column contains the bucket name or smallest number. The second column contains a nonnegative integer that says how many records in the input table fall into this bucket. The third column is a subtable containing the actual records from the original table that fall into the bucket. If your buckets aren't of constant width, or you want to group by some function of more than one field, load the \"Frequency Distribution Analysis\" library instead.": "", + "Terms of Service...": "", + "Ternary Boolean slots": "", + "Text": "文本", + "Text Costumes": "", + "Text to Speech": "", + "Text to speech": "", + "The full Scheme numeric tower. \"USE BIGNUMS \" to enable.": "", + "The question came up at": "", + "This global block definition contains one or more local custom blocks which must be removed first.": "", + "This will convert your vector objects into bitmaps,": "", + "This will erase your current drawing.": "", + "Thread safe scripts": "線程安全的腳本", + "Title text": "標題文本", + "Today": "", + "Today,": "", + "Top": "", + "Traditional loop constructs (while, until, etc.) plus the Lisp \"named let\" (a generalization of FOR) plus functional iteration (repeated invocation of a function) and function composition.": "", + "Translations": "翻譯者", + "Translators...": "翻譯者", + "Turbo mode": "Turbo模式", + "Turtle": "海龜", + "Undelete sprites...": "", + "Unpublish": "", + "Unpublish Project": "", + "Unsaved Changes!": "", + "Unshare": "", + "Unshare Project": "", + "Untitled": "無標題", + "Unused blocks...": "", + "Unverified account:": "", + "Up": "", + "Updating project list...": "", + "Uploading": "", + "Upvar - make internal variable visible to caller": "上傳變數 - 使內部變數對調用者可見", + "Use CPU for graphics": "", + "User name must be four characters or longer": "", + "User name:": "", + "Variable name": "變數名", + "Variables": "變數", + "Variadic reporters": "", + "Vector": "", + "Vector Paint Editor": "", + "Versions of +, x, AND, and OR that take more than two inputs.": "", + "Virtual keyboard": "虛擬鍵盤", + "Visible stepping": "", + "Web Audio API is not supported in this browser": "", + "Web services access (https)": "", + "Words, sentences": "", + "World Map": "", + "World...": "", + "Would you like to replace it?": "", + "Yes": "是", + "Yesterday": "", + "Yesterday,": "", + "You are not logged in": "", + "You are now logged in, and your account is enabled for three days.": "", + "You have": "", + "Zebra coloring": "斑馬著色", + "Zoom blocks": "放大程式塊", + "Zoom blocks...": "放大程式塊...", + "_ at _": "", + "_ combine _ using _": "", + "_ contains _": "_ 包含 _", + "_ effect": "", + "_ find first item _ in _": "", + "_ in front of _": "設定 _ 為 _ 第一項", + "_ keep items _ from _": "", + "_ map _ over _": "", + "_ mod _": "_ 除以 _ 的餘數", + "_ of _": "_ _", + "_ of block _": "", + "_ of costume _": "", + "_ of sound _": "", + "_ of text _": "", + "_ to _": "", + "__shout__go__": "", + "a": "a", + "a custom block definition is missing": "", + "a new clone of _": "", + "a variable of name '": "", + "about morphic.js...": "", + "abs": "", + "acos": "acos", + "add _ to _": "將 _ 加入 _", + "add a new Turtle sprite": "", + "add a new sprite": "新增角色", + "add comment": "添加注釋", + "add comment here...": "在這裏添加注釋...", + "agent": "", + "alert _": "警告: _", + "all": "全部", + "all <": "", + "all =": "", + "all >": "", + "all but first of _": "_ 中除第一項之外內容", + "all but this script": "", + "all identical": "", + "all scenes": "", + "all ≤": "", + "all ≥": "", + "alpha value:": "", + "anchor": "", + "and": "且", + "and send": "", + "and you will not be able to convert them back into vector drawings.": "", + "animation demo": "", + "answer": "回答", + "any": "", + "any key": "", + "any message": "", + "anything": "", + "append _": "", + "arrange scripts vertically": "整理腳本,垂直排列", + "arrowDown": "", + "arrowDownOutline": "", + "arrowLeft": "", + "arrowLeftOutline": "", + "arrowRight": "", + "arrowRightOutline": "", + "arrowUp": "", + "arrowUpOutline": "", + "asin": "asin", + "ask _ and wait": "詢問 _ 並等待", + "ask _ for _ _": "", + "atan": "atan", + "attach...": "", + "b": "b", + "back": "", + "balance": "", + "big (2x)": "大(2x)", + "bigger menu fonts and sliders": "", + "bins": "", + "block": "", + "block deletion dialog text": "你確定要刪除自定義程式塊及所有實例嗎?", + "block variables": "", + "block variables...": "", + "block-solid (0)": "", + "blockify": "", + "blocks": "程式塊", + "blue": "", + "blurred shadows...": "", + "blurry shades, use for new browsers": "", + "bottom": "", + "box": "", + "brightness": "", + "broadcast _ _": "廣播 _ _", + "broadcast _ _ and wait": "廣播 _ _ 並等待", + "brush": "", + "build": "建立", + "but getting a": "", + "c": "c", + "call _ _": "調用 _ _", + "call _ w/continuation": "持續調用 _", + "caller": "", + "camera": "", + "can only write text or numbers, not a": "", + "can rotate": "可以旋轉", + "cannot handle zero width or height": "", + "cannot operate on a deleted sprite": "", + "cannot send media, sprites or procedures to another scene": "", + "case sensitivity": "", + "categories": "", + "category": "", + "ceiling": "", + "center": "", + "center x": "", + "center y": "", + "change _ by _": "增加變數 _ 的值 _", + "change _ effect by _": "將 _ 特效增加 _", + "change background _ by _": "", + "change balance by _": "", + "change pen _ by _": "", + "change pen color by _": "增加畫筆顏色值 _", + "change pen shade by _": "增加畫筆色度 _", + "change pen size by _": "增加畫筆粗細 _", + "change size by _": "增加角色的大小 _", + "change tempo by _": "加快節奏 _", + "change volume by _": "", + "change x by _": "增加 x 座標 _", + "change y by _": "增加 y 座標 _", + "check for alternative GUI design": "", + "check for block to text mapping features": "", + "check for flat ends of lines": "", + "check for higher contrast table views": "", + "check for higher resolution, uses more computing resources": "", + "check for multi-column list view support": "", + "check for smooth, predictable animations across computers": "檢查是否平滑,可預見的多台電腦動畫", + "check for sprite inheritance features": "", + "check to allow empty Boolean slots": "", + "check to always show slot types in the input dialog": "檢查顯示插槽在輸入對話方塊中的類型", + "check to cache inputs boosts recursion": "", + "check to disable directly running blocks by clicking on them": "", + "check to disallow script reentrance": "檢查 不允許腳本重新載入", + "check to distinguish upper- and lowercase when comparing texts": "", + "check to enable IDE animations": "檢查啟用IDE動畫", + "check to enable alternating colors for nested blocks": "檢測 使嵌套塊的顏色交換", + "check to enable auto-wrapping inside nested block stacks": "", + "check to enable camera support": "", + "check to enable dropping commands in all rings": "", + "check to enable dynamic labels for variadic inputs": "", + "check to enable input sliders for entry fields": "檢查 使用輸入滑塊、輸入欄位", + "check to enable keyboard editing support": "", + "check to enable project data in URLs": "", + "check to enable saving linked sublist identities": "", + "check to enable sprite composition": "", + "check to enable support for first-class sprite": "", + "check to enable using operators on lists and tables": "", + "check to enable virtual keyboard support for mobile devices": "檢查 使用虛擬鍵、可移動設備", + "check to hide (+) symbols in block prototype labels": "", + "check to inherit from": "", + "check to prevent contents from being saved": "", + "check to prioritize script execution": "檢查的優先執行腳本順序", + "check to rasterize SVGs on import": "", + "check to run the edited script when moving the slider": "", + "check to show all blocks in a single palette": "", + "check to show buttons in the palette": "", + "check to show category names in the palette": "", + "check to show extension primitives in the palette": "", + "check to show in palette": "", + "check to support native JavaScript functions": "", + "check to switch pen colors and graphic effects to HSL": "", + "check to turn block clicking sound on": "檢查 關閉點擊程式塊的聲音", + "check to turn on logging pen vectors": "", + "check to turn on visible stepping (slow)": "", + "check to use blurred drop shadows and highlights": "檢測 降低陰影和高亮的模糊度", + "children": "", + "choose another color for this morph": "", + "choose the World's background color": "", + "circle": "", + "circle box": "", + "circleSolid": "", + "clean up": "清除", + "clear": "清除所有畫筆", + "clear graphic effects": "清除所有圖形特效", + "clear undrop queue": "", + "click or drag crosshairs to move the rotation center": "點擊或拖動十字准線,設置旋轉中心", + "clicked": "", + "clone": "", + "clones": "", + "closedBrush": "", + "cloud": "", + "cloud unavailable without a web server.": "", + "cloudGradient": "", + "cloudOutline": "", + "code": "", + "code mapping...": "", + "code of _": "", + "collection": "", + "color": "", + "color _ is touching _ ?": "顏色 _ 碰到了顏色 _ ?", + "color palette": "", + "color picker": "", + "color...": "", + "color:": "", + "columns": "", + "combinations _": "", + "combine _ using _": "", + "comic": "", + "command": "命令", + "comment pic...": "", + "compile": "", + "compile _": "", + "compile _ for _ args": "", + "confetti": "", + "console log _": "控制臺日誌 _", + "continuation": "", + "continuations cannot be forked": "", + "cos": "cos", + "costume": "", + "costume #": "造型編號", + "costume name": "", + "costumes": "", + "costumes tab help": "造型選卡幫助 要使用另外網站上的圖片或電腦中的圖像只需拖到圖像到這裏即可", + "could not connect to:": "", + "cr": "", + "create a clone of _": "複製 _", + "cross": "", + "crosshairs": "", + "current": "", + "current _": "", + "current module versions:": "目前模組版本:", + "current parent": "", + "custom?": "", + "cut from _": "", + "d": "d", + "dangling?": "", + "data": "", + "date": "", + "day of week": "", + "days left": "", + "days left.": "", + "defaults": "", + "define _ _ _": "", + "definition": "", + "delete": "刪除", + "delete _": "", + "delete _ of _": "刪除 _ 第 _ 項", + "delete a category...": "", + "delete block _": "", + "delete block definition...": "刪除自定義程式塊", + "delete slot": "", + "delete this clone": "刪除這個複製", + "delete variable": "", + "delimiter": "", + "demo (1.2x)": "演示 (1.2x)", + "demo...": "", + "detach all parts": "", + "detach and put into the hand": "", + "detach from": "", + "development mode": "開發模式", + "development mode debugging primitives:": "開發模式 調式程式語言:", + "development mode...": "", + "dimensions": "", + "direction": "方向", + "disable deep-Morphic context menus and show user-friendly ones": "停用 變形語式 快顯功能表 與非 友好使用者介面", + "disable developers' context menus": "", + "disable dragging media and blocks out of watchers and balloons": "", + "disconnected.": "", + "distance": "", + "distance to _": "到 _ 的距離", + "distribution": "", + "don't rotate": "不能旋轉", + "down arrow": "下移鍵", + "download and save with a summary of this project with drop-shadows on all pictures. not supported by all browsers": "", + "download script": "", + "download this script as an XML file": "", + "draggable": "可拖動", + "draggable?": "", + "dragging threshold": "", + "dropped": "", + "duplicate": "複製", + "duplicate block definition...": "", + "duration": "", + "e": "e", + "e^": "e^", + "edge": "邊緣", + "edit": "編輯", + "edit rotation point only...": "", + "edit the costume's rotation center": "", + "edit...": "編輯...", + "editables": "", + "elegant (90)": "", + "enable Morphic context menus and inspectors, not user-friendly!": "啟用 正常語式 快顯功能表 與非檢查 友好使用者介面", + "enter": "", + "entering development mode. error catching is turned off, use the browser's web console to see error messages.": "", + "entering user mode": "", + "eraser": "", + "exceeding maximum number of clones": "", + "expecting": "", + "expecting a": "", + "expecting a finite number but getting Infinity or NaN": "", + "experimental - under construction": "", + "experimental! make this reporter fast and uninterruptable CAUTION: Errors in the ring can break your Snap! session!": "", + "export": "導出", + "export block definition...": "", + "export pen trails line segments as SVG": "", + "export project as cloud data...": "", + "export project media only...": "", + "export project without media...": "", + "export script": "", + "export...": "導出...", + "extract": "", + "f": "f", + "false": "不成立", + "file": "", + "file menu import hint": "當你拖動到系統,注意查看檢查報告 要注意檢查報告為空 有一些流覽器不支持這一功能", + "fill": "", + "fill page...": "", + "filtered for _": "選擇顏色 _", + "find blocks": "", + "find blocks...": "", + "find first item _ in _": "", + "find unused global custom blocks and remove their definitions": "", + "fisheye": "", + "flag": "", + "flash": "", + "flat line ends": "", + "flatten": "", + "flip ↔": "", + "flip ↕": "", + "floor": "", + "footprints": "", + "for _ = _ to _ _": "", + "for all sprites": "對所有的角色", + "for each _ in _ _": "", + "for this sprite only": "只對這個角色", + "forever _": "重複執行 _", + "frame": "", + "frames": "框架", + "frequencies": "", + "frequency": "", + "front": "", + "fullScreen": "", + "g": "g", + "gears": "", + "get blocks": "", + "get data": "", + "ghost": "鬼影", + "giant (8x)": "巨人型 (8x)", + "glide _ secs to x: _ y: _": "_ 秒內,移到 x: _ y: _", + "global?": "", + "globe": "", + "go back _ layers": "下移 _ 層", + "go to _": "移到 _", + "go to _ layer": "", + "go to front": "移至最上層", + "go to x: _ y: _": "移到 x: _ y: _", + "gray scale palette": "", + "green": "", + "grow": "", + "h": "h", + "handle": "", + "header": "", + "header mapping...": "", + "height": "", + "hello": "歡迎", + "help": "説明", + "help...": "説明...", + "hide": "隱藏", + "hide all...": "", + "hide blocks...": "", + "hide variable _": "隱藏變數 _", + "high": "", + "hour": "", + "http:// _": "", + "hue": "", + "huge (4x)": "超大型 (4x)", + "i": "i", + "identical to": "與", + "if _ _": "如果 _ _", + "if _ _ else _": "如果 _ _ 否則 _", + "if _ then _ else _": "", + "if on edge, bounce": "碰到邊緣就反彈", + "import a sound from your computer by dragging it into here": "從電腦中導入音效檔案 只需拖動音效檔案到這裏即可", + "import without attempting to parse or format data": "", + "import...": "導入...", + "in palette": "", + "including dependencies": "", + "index": "", + "index of _ in _": "", + "inherit _": "", + "inherited": "", + "input list:": "輸入列表:", + "input names:": "參數名:", + "input(s), but getting": "", + "inputs": "", + "insert _ at _ of _": "插入 _ 到第 _ 項在 _ 中", + "insert a slot": "", + "insert a variable": "", + "inspect...": "", + "is _ ?": "_ 相同嗎?", + "is _ a _ ?": "_ 是 _ 類型?", + "is _ empty?": "", + "is _ identical to _ ?": "_ 與 _ 相同嗎?", + "is _ on?": "", + "is not a valid option": "", + "is read-only": "", + "item": "", + "item _ of _": "第 _ 項在 _ 中", + "items": "", + "j": "j", + "join _": "將 _ 加入到", + "jukebox": "", + "k": "k", + "keep all submorphs within and visible": "", + "keep items _ from _": "", + "key": "", + "key _ pressed?": "按鍵 _ 是否按下?", + "keyboard": "", + "keyboardFilled": "", + "l": "l", + "label": "", + "language_name": "繁體中文", + "language_translator": "cch", + "large": "大型", + "last": "最後", + "last changed": "", + "last_changed": "2013-8-14", + "launch _ _": "啟動 _ _", + "left": "", + "left arrow": "左移鍵", + "length": "", + "length of _": "_ 的長度", + "length:": "長度:", + "let the World automatically adjust to browser resizing": "", + "letter": "", + "letter _ of _": "第 _ 位元在文字 _ 中", + "light (70)": "", + "lightness": "", + "line": "", + "lines": "", + "list": "表列", + "list _": "表列 _", + "list view...": "", + "ln": "ln", + "load the official library of powerful blocks": "載入官方庫和強大的程式塊", + "location": "", + "lock": "", + "log pen vectors": "", + "login": "", + "loop": "", + "low": "", + "lower case": "", + "m": "m", + "magnifierOutline": "", + "magnifyingGlass": "", + "make a block...": "創建程式塊...", + "make a category...": "", + "make a copy and pick it up": "創建一個副本並抓起", + "make a morph": "", + "make temporary and hide in the sprite corral": "", + "make this morph movable": "", + "make this morph unmovable": "", + "map String to code _": "", + "map _ of _ to code _": "", + "map _ over _": "", + "map _ to _ _": "", + "max": "", + "maximum": "", + "medium (50)": "", + "menus": "", + "message": "", + "microphone _": "", + "middle": "", + "minimum": "", + "minute": "", + "mirror video": "", + "missing / unspecified extension": "", + "monstrous (10x)": "無敵型 (10x)", + "month": "", + "mosaic": "", + "motion": "", + "mouse down?": "按下滑鼠?", + "mouse position": "", + "mouse x": "滑鼠的 x 座標", + "mouse y": "滑鼠的 y 座標", + "mouse-departed": "", + "mouse-entered": "", + "mouse-pointer": "滑鼠指標", + "move": "", + "move _ steps": "移動 _ 歩", + "move all inside...": "", + "move...": "", + "my": "", + "my _": "", + "my anchor": "", + "my dangling?": "", + "my draggable?": "", + "my name": "", + "my parent": "", + "my rotation style": "", + "my rotation x": "", + "my rotation y": "", + "my temporary?": "", + "myself": "自身", + "n": "n", + "name": "", + "neg": "", + "negative": "", + "neighbors": "", + "neighbors ≠": "", + "new costume _ width _ height _": "", + "new line": "", + "new sound _ rate _ Hz": "", + "new...": "新增...", + "next": "", + "next costume": "下一個造型", + "none": "無", + "normal": "標準", + "normal (1x)": "標準 (1x)", + "normalScreen": "", + "normalStage": "", + "not": "", + "not _": "_ 不成立", + "note": "", + "nothing": "", + "now connected.": "", + "number": "數字", + "number of channels": "", + "numbers from _ to _": "", + "o": "o", + "object _": "", + "octagon": "", + "only duplicate this block": "只複製此塊", + "only face left/right": "只能左右翻轉", + "only grab this block": "", + "open a new window with a picture of the stage": "打開一張圖片舞臺的新視窗,", + "open a new window with a picture of this morph": "", + "open a new window with a picture of this script": "新流覽視窗中打開腳本的圖片", + "open a window on all properties": "", + "open in another dialog...": "", + "open in dialog...": "", + "open shared project from cloud...": "", + "options...": "", + "or": "或", + "or before": "", + "other clones": "", + "other scripts in sprite": "", + "other sprites": "", + "p": "p", + "paint a new sprite": "", + "paintbucket": "", + "parameters": "", + "parent": "", + "parent...": "", + "parts": "", + "password has been changed.": "", + "password must be six characters or longer": "", + "passwords do not match": "", + "paste on _": "", + "pause": "", + "pause all _": "", + "pen": "", + "pen _": "", + "pen down": "落筆", + "pen down?": "", + "pen trails": "畫筆軌跡", + "pen up": "抬筆", + "pen vectors": "", + "pic...": "導出圖像...", + "pick random _ to _": "隨機在 _ 到 _ 間選一個數", + "pick up": "", + "pipe _ $arrowRight _": "", + "pipette": "", + "pitch": "", + "pivot": "", + "pixel": "", + "pixelate": "", + "pixels": "", + "play _ Hz for _ secs": "", + "play frequency _ Hz": "", + "play note _ for _ beats": "彈奏 _ _ 拍", + "play sound _": "播放聲音 _", + "play sound _ at _ Hz": "", + "play sound _ until done": "播放聲音 _ 直到播放完畢", + "please agree to the TOS": "", + "please fill out this field": "", + "please provide a valid email address": "", + "point in direction _": "面向 _ 度", + "point towards _": "面向 _", + "pointRight": "", + "polygon": "", + "position": "", + "poster": "", + "predicate": "謂語", + "presentation (1.4x)": "演示文稿 (1.4x)", + "pressed": "", + "previous": "", + "processes": "", + "product": "", + "published.": "", + "publishing project...": "", + "q": "q", + "r": "r", + "r-g-b-a": "", + "random": "任意", + "random position": "", + "rank": "", + "raw data...": "", + "ray length": "", + "read-only": "", + "receivers...": "", + "recording": "", + "rectangle": "", + "rectangleSolid": "", + "red": "", + "redo the last undone block drop in this pane": "", + "redraw the screen once": "", + "redrop": "", + "relabel...": "重新標記...", + "release": "", + "remove block variables...": "", + "rename": "重命名", + "rename all blocks that access this variable": "", + "rename all...": "", + "rename background": "", + "rename costume": "重命名造型", + "rename only this reporter": "", + "rename sound": "重命名聲音", + "rename...": "重命名為...", + "repeat _ _": "重複執行 _ _", + "repeat until _ _": "重複執行直到 _ _", + "replace item _ of _ with _": "替換第 _ 項在 _ 中為 _", + "report _": "報告 _", + "reporter": "記錄", + "reporter didn't report": "", + "reset columns": "", + "reset timer": "計時器歸零", + "reshape _ to _": "", + "resize...": "", + "resolution": "", + "rest for _ beats": "停止 _ 秒", + "restore display": "", + "result pic...": "", + "reverse": "", + "right": "", + "right arrow": "右移鍵", + "ring": "", + "ringify": "環", + "robot": "", + "rotate": "", + "rotation style": "", + "rotation x": "", + "rotation y": "", + "round _": "將 _ 四捨五入", + "run _": "持續執行 _", + "run _ _": "行 _ _", + "run _ w/continuation": "", + "s": "s", + "sample morphs": "", + "sample rate": "", + "samples": "", + "saturation": "", + "save _ as costume named _": "", + "save a picture of all scripts": "", + "save a picture of both this script and its result": "", + "save a picture of the stage": "", + "save a picture of this comment": "", + "save a picture of this script": "", + "save a summary of this project": "", + "save global custom block definitions as XML": "", + "save project data as XML to your downloads folder": "", + "saved.": "", + "say _": "說 _", + "say _ for _ secs": "說 _ _ 秒", + "scope": "", + "screenshot": "", + "screenshot...": "", + "script": "", + "script pic with result...": "", + "script pic...": "將腳本存為圖像...", + "script variables _": "腳本變數 _", + "scripts": "", + "scripts pic...": "", + "scroll frame": "", + "scrolled-down": "", + "scrolled-up": "", + "second": "", + "select": "選擇", + "selection": "", + "self": "", + "send _ to _": "", + "senders...": "", + "sensor demo": "", + "set _ effect to _": "將 _ 特效設定為 _", + "set _ of block _ to _": "", + "set _ to _": "設定變數 _ 的值為 _", + "set background _ to _": "", + "set background color to _": "", + "set balance to _": "", + "set instrument to _": "", + "set pen _ to _": "", + "set pen color to _": "設定畫筆顏色為 _", + "set pen shade to _": "設定畫筆色度為 _", + "set pen size to _": "設定畫筆的粗細為 _", + "set size to _ %": "設定角色的大小為 _", + "set tempo to _ bpm": "設定節奏為 _", + "set this morph's alpha value": "", + "set turbo mode to _": "設置 Turbo 模式 _", + "set video transparency to _": "", + "set volume to _ %": "", + "set x to _": "設定 x 座標為 _", + "set y to _": "設定 y 座標為 _", + "setting the rotation center requires a costume": "", + "settings menu prefer empty slots hint": "喜歡空槽設置菜單", + "several block definitions already match this label": "", + "shared.": "", + "sharing project...": "", + "sharp drop shadows use for old browsers": "", + "sharp shadows...": "", + "shimmering (80)": "", + "show": "顯示", + "show a handle which can be dragged to change this morph's extent": "", + "show a handle which can be dragged to move this morph": "", + "show a picture of all scripts and block definitions": "", + "show all": "顯示所有", + "show all...": "", + "show global custom block definitions as XML in a new browser window": "新瀏覽視窗以XML格式顯示全局自定義程式塊", + "show project data as XML in a new browser window": "新瀏覽視窗以XML格式顯示專案", + "show table _": "", + "show the World's menu": "", + "show variable _": "顯示變數 _", + "shown?": "", + "shrink": "", + "shuffled": "", + "signals": "", + "sin": "sin", + "size": "大小", + "slider": "滑塊", + "slider max...": "滑塊的最大值...", + "slider min...": "滑塊的最小值...", + "slots": "", + "smallStage": "", + "smaller menu fonts and sliders": "", + "snap": "", + "sorted": "", + "sound": "", + "sounds": "", + "space": "空白鍵", + "specify the distance the hand has to move before it picks up an object": "", + "spectrum": "", + "speech bubble": "", + "speechBubble": "", + "speechBubbleOutline": "", + "split _ by _": "", + "sprite": "", + "sprites": "", + "sqrt": "", + "square": "", + "stack size": "堆疊大小", + "stage": "", + "stage image": "", + "stamp": "圖章", + "standard settings": "", + "stay signed in on this computer until logging out": "", + "stepForward": "", + "stick this morph to another one": "", + "stick to": "", + "stop _": "", + "stop all _": "全部停止 _", + "stop all sounds": "停止所有聲音", + "stop block": "停止程式塊", + "stop frequency": "", + "stop script": "停止腳本", + "stopped": "", + "storage": "", + "store this project in the downloads folder (in supporting browsers)": "", + "stretch _ x: _ y: _ %": "", + "string": "", + "subtle (95)": "", + "sum": "", + "svg...": "", + "switch to costume _": "切換到造型 _", + "switch to scene _ _": "", + "t": "t", + "tab": "", + "table view...": "", + "take a camera snapshot and import it as a new sprite": "", + "tan": "tan", + "tell _ to _ _": "", + "tempo": "節奏", + "temporary?": "", + "text": "文字", + "text-only (100)": "", + "the predicate takes too long for a custom hat block": "", + "there are currently no unused global custom blocks in this project": "", + "there are currently no vectorizable pen trail segments": "", + "thing": "事項", + "think _": "思考 _", + "think _ for _ secs": "思考 _ _ 秒", + "this _": "", + "this block": "", + "this project doesn't have any custom global blocks yet": "這個項目沒有包含全局性的自定義程式塊", + "this script": "", + "time in milliseconds": "", + "timer": "計時器", + "tip": "", + "to": "", + "top": "", + "touch screen settings": "", + "touching _ ?": "碰到顏色 _", + "transient": "", + "translations": "", + "translations...": "", + "translator_e-mail": "cchuang2009@gmail.com", + "transparency": "", + "transparency...": "", + "trash is empty": "", + "true": "成立", + "turbo mode": "", + "turbo mode?": "Turbo模式", + "turn _ _ degrees": "順時鐘旋轉 _ _ 度", + "turn all pen trails and stamps into a new background for the stage": "", + "turn all pen trails and stamps into a new costume for the currently selected sprite": "", + "turn pen trails into new background...": "", + "turn pen trails into new costume...": "", + "turnBack": "", + "turnForward": "", + "turnLeft": "", + "turnRight": "", + "turtle": "", + "turtleOutline": "", + "type": "", + "type of _": "_ 類型", + "u": "u", + "unable to convert to": "", + "unable to inherit (disabled or circular?)": "", + "unable to nest (disabled or circular?)": "", + "uncheck for default GUI design": "", + "uncheck for greater speed at variable frame rates": "取消選中在可變幀頻更快的速度", + "uncheck for less contrast multi-column list views": "", + "uncheck for lower resolution, saves computing resources": "", + "uncheck for round ends of lines": "", + "uncheck for smooth scaling of vector costumes": "", + "uncheck to allow dropped reporters to kick out others": "取消選中 允許下降報告並取消其他報告", + "uncheck to allow script reentrance": "取消選中 允許腳本重新載入", + "uncheck to always show (+) symbols in block prototype labels": "", + "uncheck to confine auto-wrapping to top-level block stacks": "", + "uncheck to disable IDE animations": "取消選中禁用IDE動畫", + "uncheck to disable alternating colors for nested block": "取消選中 使嵌套塊的顏色交換", + "uncheck to disable block to text mapping features": "", + "uncheck to disable camera support": "", + "uncheck to disable dropping commands in reporter rings": "", + "uncheck to disable dynamic labels for variadic inputs": "取消選中要禁用動態可變參數輸入標籤", + "uncheck to disable input sliders for entry fields": "取消選中 禁用輸入滑塊、輸入欄位", + "uncheck to disable keyboard editing support": "", + "uncheck to disable multi-column list views": "", + "uncheck to disable project data in URLs": "", + "uncheck to disable saving linked sublist identities": "", + "uncheck to disable sprite composition": "", + "uncheck to disable sprite inheritance features": "", + "uncheck to disable support for first-class sprites": "", + "uncheck to disable support for native JavaScript functions": "", + "uncheck to disable using operators on lists and tables": "", + "uncheck to disable virtual keyboard support for mobile devices": "取消選中 禁用虛擬鍵盤、可移動設備", + "uncheck to disinherit": "", + "uncheck to drag media and blocks out of watchers and balloons": "", + "uncheck to drag media, and blocks out of watchers and balloons": "", + "uncheck to enable directly running blocks by clicking on them": "", + "uncheck to hide buttons in the palette": "", + "uncheck to hide category names in the palette": "", + "uncheck to hide extension primitives in the palette": "", + "uncheck to hide in palette": "", + "uncheck to ignore upper- and lowercase when comparing texts": "", + "uncheck to limit Boolean slots to true / false": "", + "uncheck to run scripts at normal speed": "取消選中正常速度運行腳本", + "uncheck to save contents in the project": "", + "uncheck to show only the selected category's blocks": "", + "uncheck to stop caching inputs (for debugging the evaluator)": "", + "uncheck to suppress running scripts when moving the slider": "", + "uncheck to switch pen colors and graphic effects to HSV": "", + "uncheck to turn block clicking sound off": "取消選中 關閉點擊程式塊的聲音", + "uncheck to turn off logging pen vectors": "", + "uncheck to turn off visible stepping": "", + "uncheck to use solid drop shadows and highlights": "取消選中 降低陰影和高亮的清晰度", + "uncheck to use the input dialog in short form": "取消選擇 輸入窗並顯示簡潔對話方塊", + "uncompile": "", + "undo": "", + "undo the last block drop in this pane": "", + "undrop": "", + "unicode _ as letter": "Unicode編碼值為 _ 的字元", + "unicode of _": "字元 _ 的Unicode編碼值", + "unlock": "", + "unpublished.": "", + "unpublishing project...": "", + "unringify": "刪除環", + "unshared.": "", + "unsharing project...": "", + "unsupported attribute": "", + "unsupported data type": "", + "unsupported graphic effect": "", + "untitled": "無標題", + "unused": "", + "unused block(s) removed": "", + "up arrow": "上移鍵", + "upper case": "", + "url...": "", + "use the keyboard to enter blocks": "", + "user features...": "", + "user mode...": "", + "v": "v", + "value": "", + "variable": "", + "variables": "", + "video _ on _": "", + "video capture": "", + "volume": "", + "w": "w", + "wait _ secs": "等待 _ 秒", + "wait until _": "直到 _ 前都等待闐", + "wardrobe": "", + "warp _": "直接運行 _", + "what's your name?": "你的名字?", + "when I am _": "當角色被點擊 _", + "when I receive _ _": "當接收到 _ _", + "when I start as a clone": "以複製身份開始", + "when _": "", + "when _ clicked": "當 _ 被點擊", + "when _ is edited _": "", + "when _ key pressed _": "當按下 _ _", + "whirl": "", + "whitespace": "", + "width": "", + "with data": "", + "with inputs": "參數", + "word": "", + "world": "光臨", + "write _ size _": "", + "x": "x", + "x position": "x 座標", + "y": "y", + "y position": "y 座標", + "year": "", + "year:": "", + "your own": "你自己", + "z": "z", + "檢查啟用動態可變參數輸入標籤": "marcar para habilitar etiquetas dinámicas para entradas varidic" +} \ No newline at end of file diff --git a/elements/pl-snap/Snap/manifest.json b/elements/pl-snap/Snap/manifest.json new file mode 100644 index 00000000..a37185c4 --- /dev/null +++ b/elements/pl-snap/Snap/manifest.json @@ -0,0 +1,51 @@ +{ + "name": "Snap!", + "short_name": "Snap!", + "icons": [{ + "src": "img/snap-icon-72.png", + "sizes": "72x72", + "type": "image/png" + }, { + "src": "img/snap-icon-96.png", + "sizes": "96x96", + "type": "image/png" + }, { + "src": "img/snap-icon-120.png", + "sizes": "120x120", + "type": "image/png" + }, { + "src": "img/snap-icon-128.png", + "sizes": "128x128", + "type": "image/png" + }, { + "src": "img/snap-icon-144.png", + "sizes": "144x144", + "type": "image/png" + }, { + "src": "img/snap-icon-152.png", + "sizes": "152x152", + "type": "image/png" + }, { + "src": "img/snap-icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, { + "src": "img/snap-icon-256.png", + "sizes": "256x256", + "type": "image/png" + }, { + "src": "img/snap-icon-384.png", + "sizes": "384x384", + "type": "image/png" + }, { + "src": "img/snap-icon-512.png", + "sizes": "512x512", + "type": "image/png" + }], + "lang": "en-US", + "start_url": "./snap.html", + "display": "standalone", + "background_color": "white", + "theme_color": "white" +} diff --git a/elements/pl-snap/Snap/pyret/inline.html b/elements/pl-snap/Snap/pyret/inline.html new file mode 100644 index 00000000..fb8d2574 --- /dev/null +++ b/elements/pl-snap/Snap/pyret/inline.html @@ -0,0 +1,163 @@ + + + + Using Snap! On Your Page + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Using Snap! On Your Page

+

Did you now you can embed and configure Snap! on your own web page + directly without having to use an iFrame?

+

This way you can have the Snap! editor be part of your web IDE + and offer visual block based scripting for your textual programming + language.

+

You can also inline parts of Snap! such as a reduced palette with a + limited number of customized blocks and a little scripting area without + any sprites or media assets for exercises and Parsons problems + inside a larger narrative, such as an hour-of-code.

+ + + +
+ + + + + + + + +
+ + + + +

This page is a work-in-progress to explore how we can use Snap! as + an alternative / secondary block based scripting editor for the + Pyret programming language + in the fabulous Bootstrap + curriculum (be sure to check it out if haven't already!).

+

If you see this page it's very likey that it doesn't yet do anything + or that it isn't even operational and throws a bazillion errors. We use + it together with our friends over at Bootstrap to internally try stuff + as we're testing some wild ideas. So please don't yet inquire about + details and don't yet report any bugs you might encounter.

+

Instead, stay tuned for some exciting updates down the road!

+

-Jens

+ + diff --git a/elements/pl-snap/Snap/pyret/transpile.xml b/elements/pl-snap/Snap/pyret/transpile.xml new file mode 100644 index 00000000..a366a0ce --- /dev/null +++ b/elements/pl-snap/Snap/pyret/transpile.xml @@ -0,0 +1 @@ +This project features a FizzBuzz script and a recursive factorial block that you can run and debug inside Snap! and also compile into various text-based programming languages: * JavaScript * Smalltalk * Python * C Enjoy! -Jensdata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAiVJREFUeF7t0sEJACAAAzHdf+gKLnGfdIHCkbttxxSIClwAo/JufwEAQUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrf+QOC496obByqTwAAAABJRU5ErkJggg==This project features a FizzBuzz script and a recursive factorial block that you can run and debug inside Snap! and also compile into various text-based programming languages: * JavaScript * Smalltalk * Python * C Enjoy! -Jens forward turn turnLeft setHeading doFaceTowards gotoXY doGotoObject doGlide changeXPosition setXPosition changeYPosition setYPosition bounceOffEdge xPosition yPosition direction doSwitchToCostume doWearNextCostume getCostumeIdx doThinkFor doThink changeEffect setEffect clearEffects changeScale setScale getScale show hide goToLayer goBack playSound doPlaySoundUntilDone doStopAllSounds doRest doPlayNote doChangeTempo doSetTempo getTempo clear down up setColor changePenColorDimension setPenColorDimension changeSize setSize doStamp reportTouchingObject reportTouchingColor reportColorIsTouchingColor colorFiltered reportStackSize reportFrameCount doAsk reportLastAnswer getLastAnswer reportMouseX reportMouseY reportMouseDown reportKeyPressed reportRelationTo doResetTimer reportTimer getTimer reportAttributeOf reportURL reportGlobalFlag doSetGlobalFlag reportCONS reportCDR reportListContainsItem doDeleteFromList doInsertInList doReplaceInList reifyReporter reifyPredicate reportRound reportMonadic reportRandom reportLetter reportUnicode reportIsA reportVariadicIsIdentical receiveGo receiveKey receiveInteraction receiveMessage doBroadcast doBroadcastAndWait getLastMessage doWarp doWait doWaitUntil doForever doRepeat doUntil doStopThis fork evaluate doCallCC reportCallCC receiveOnClone createClone removeClone getPosition reportGetImageAttribute reportNewCostumeStretched reportNewCostume getEffect reportShown doPlaySoundAtRate reportGetSoundAttribute reportNewSoundFromSamples doSetInstrument changeVolume setVolume getVolume changePan setPan getPan playFreq stopFreq getPenDown getPenAttribute floodFill write reportPenTrailsAsCostume doPasteOn doCutFrom receiveCondition reportIfElse doTellTo reportAskFor newClone doPauseAll doSwitchToScene doDefineBlock doDeleteBlock doSetBlockAttribute reportBlockAttribute reportEnvironment reportMousePosition reportAspect reportDate reportGet reportObject reportAudio reportVideo doSetVideoTransparency reportVariadicSum reportVariadicProduct reportPower reportTextSplit reportUnicodeAsLetter doDeleteAttr reportNumbers reportListIndex reportListIsEmpty reportMap reportKeep reportFindFirst reportCombine doForEach reportConcatenatedLists reportReshape reportCrossproduct doMapCodeOrHeader doMapValueCode doMapListCode reportMappedCode doRun reportPipe doHideVar reifyScript reportJoinWords receiveUserEdit reportJSFunction doIf reportVariadicLessThan reportVariadicEquals reportVariadicGreaterThan reportVariadicAnd reportVariadicOr"<#1>",,print <#1>print <#1>if <#1>: <#2>if <#1>: <#2> else: <#3>(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> == <#2>)(<#1> > <#2>)(<#1> & <#2>)(<#1> | <#2>)(!<#1>)TrueFalse(<#1>, <#2>)(<#1>.length)<#1> = <#2><#1> += 1print <#1>#variables <#1>[<#1>]len(<#1>)<#2>[<#1> - 1]<#2>.append(<#1>)return <#1>(<#1> + <#2>)(<#1> * <#2>)<#1>len(<#1>)for <#1> in range(<#2>, <#3>): <#4>
while <#1>: <#2>
[]
isinstance(<#1>, (int, long, float, complex))5
<#1>
str(<#1>)5
console.log(<#1>);console.log(<#1>);<#1>if (<#1>) { <#2> }if (<#1>) { <#2> } else { <#3> }return <#1>;while (<#1>) { <#2> }for (var <#1> = <#2>; <#1> <= <#3>; <#1> += 1) { <#4> }(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> === <#2>)(<#1> > <#2>)(<#1> && <#2>)(<#1> || <#2>)(!<#1>)true<#1>helloWorld(<#1> + <#2>)world(<#1>.length)5(typeof <#1> === 'number')5(<#1>.toString())5function fact(n) { <body> }5fact(<#1>)7function fib(n) { <body> }7fib(<#1>)<#1> = <#2>;<#1> += 1;console.log(<#1>);var <#1>;[<#1>][](<#1>.length)1<#2>[<#1> - 1]<#2>.push(<#1>);
Transcript show: <#1>; cr.Transcript show: <#1>; cr.<#1><#1> ifTrue: [ <#2>].<#1> ifTrue: [ <#2>] ifFalse: [ <#3>].<#1>[<#1>] whileTrue: [ <#2>].(<#2> to: <#3>) do: [:<#1> | <#4>].(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> \\ <#2>)(<#1> < <#2>)(<#1> = <#2>)(<#1> > <#2>)(<#1> and: [<#2>])(<#1> or: [<#2>])(<#1> not)true<#1>helloWorld(<#1>, <#2>)world(<#1> size)5(<#1> isNumber)5(<#1> printString)5| fact | fact := [:n| <body>].5(fact value: <#1>)7| fib | fib := [:n | <body>].7(fib value: <#1>)<#1> := <#2>.<#1> := <#1> + 1.Transcript show: <#1>; cr.| <#1> |#(<#1>)(OrderedCollection new)(<#1> size)1(<#2> at: <#1>)<#2> add: <#1>.
print(<#1>)print(<#1>)<#1>if <#1>: <#2>if <#1>: <#2> else: <#3>return <#1>while <#1>: <#2> for <#1> in range(<#2>, <#3>): <#4>(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> == <#2>)(<#1> > <#2>)(<#1> & <#2>)(<#1> | <#2>)(!<#1>)true<#1>helloWorld(<#1> + <#2>)world(<#1>.length)5isinstance(<#1>, (int, long, float, complex))5str(<#1>)5def fact(n): <body>5fact(<#1>)7def fib(n): <body>7fib(<#1>)<#1> = <#2><#1> += 1print <#1>#variables <#1>[<#1>][]len(<#1>)1<#2>[<#1> - 1]<#2>.append(<#1>)
printf(<#1>); printf("\n");printf(<#1>); printf("\n");#include <stdio.h> int main() { <#1> return(0); }if <#1> { <#2> }if <#1> { <#2> } else { <#3> }return <#1>;while <#1> { <#2> }int <#1>; for (<#1> = <#2>; <#1> <= <#3>; <#1>++) { <#4> }(<#1> + <#2>)(<#1> - <#2>)(<#1> * <#2>)(<#1> / <#2>)(<#1> % <#2>)(<#1> < <#2>)(<#1> == <#2>)(<#1> > <#2>)(<#1> && <#2>)(<#1> || <#2>)(!<#1>)5"%d", <#1>5int fact(int n) { <body> }5fact(<#1>)7int fib(int n) { <body> }7fib(<#1>)<#1> = <#2>;<#1>++;int <#1>;
(<#1> + <#2>)helloWorld
def fact(n): <body>
fact(<#1>)5
def fib(n): <body>
fib(<#1>)7
(<#1> + <#2>)
(<#1> * <#2>)
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==
\ No newline at end of file diff --git a/elements/pl-snap/Snap/snap.html b/elements/pl-snap/Snap/snap.html new file mode 100644 index 00000000..ab3df0aa --- /dev/null +++ b/elements/pl-snap/Snap/snap.html @@ -0,0 +1,69 @@ + + + + Snap! Build Your Own Blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/elements/pl-snap/Snap/src/FileSaver.min.js b/elements/pl-snap/Snap/src/FileSaver.min.js new file mode 100644 index 00000000..9a1e397f --- /dev/null +++ b/elements/pl-snap/Snap/src/FileSaver.min.js @@ -0,0 +1,2 @@ +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ +var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,a=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},i=/constructor/i.test(e.HTMLElement)||e.safari,f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},s="application/octet-stream",d=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,d)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(a){u(a)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,d){if(!d){t=p(t)}var v=this,w=t.type,m=w===s,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&i)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;a(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define("FileSaver.js",function(){return saveAs})} diff --git a/elements/pl-snap/Snap/src/api.js b/elements/pl-snap/Snap/src/api.js new file mode 100644 index 00000000..0c04e15b --- /dev/null +++ b/elements/pl-snap/Snap/src/api.js @@ -0,0 +1,358 @@ +/* + + api.js + + programmatically interact with a Snap! project + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs gui.js, lists.js, objects.js, threads.js and morphic.js + + + documentation + ------------- + along with this file you should have received a copy of the Snap! API + documentation. If not, see + https://github.com/jmoenig/Snap/blob/master/API.md + or https://snap.berkeley.edu/snap/API.md + +*/ + +/*global modules, IDE_Morph, isString, Map, List, Project, detect, isSnapObject, +VariableFrame*/ + +/*jshint esversion: 11*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.api = '2024-February-22'; + +// IDE_Morph external communication API +/* + programmatically trigger scripts from outside of Snap! + add message listeners to Snap! broadcasts and access + global variables +*/ + +IDE_Morph.prototype.getScenes = function () { + // return an array of all scenenames + return this.scenes.itemsArray().map(each => each.name); +}; + +IDE_Morph.prototype.getCurrentScene = function () { + // return the name of the currently active scene + return this.scene.name; +}; + +IDE_Morph.prototype.switchTo = function (sceneName) { + var scene = detect(this.scenes.itemsArray(), scn => scn.name === sceneName); + if (scene === null) { + throw new Error('cannot find scene ' + sceneName); + } + this.switchToScene(scene); +}; + +IDE_Morph.prototype.isRunning = function () { + // return true if the active scene is currently running a script + return this.stage.threads.processes.length > 0; +}; + +IDE_Morph.prototype.stop = function () { + // stop all currently running processes in the active scene + // no matter what, without firing a stop event + var stage = this.stage; + stage.keysPressed = {}; + stage.threads.stopAll(); + stage.stopAllActiveSounds(); + stage.children.forEach(morph => { + if (morph.stopTalking) { + morph.stopTalking(); + } + }); + stage.removeAllClones(); + stage.stopProjection(); + this.controlBar.pauseButton.refresh(); +}; + +IDE_Morph.prototype.broadcast = function(message, callback, payload) { + // same as using the broadcast block - launch all scripts + // in the current project reacting to the specified message, + // if a callback is supplied wait for all processes to terminate + // then call the callback, same as using the "broadcast and wait" block + + var rcvrs = this.sprites.contents.concat(this.stage), + myself = this, + procs = []; + + payload = payload ?? ''; + + function wait() { + if (procs.some(any => any.isRunning())) { + return; + } + if (callback instanceof Function) { + myself.onNextStep = function () { + callback(); + callback = null; + }; + } + } + + if (!isString(message)) { + throw new Error('message must be a String'); + } + this.stage.lastMessage = message; + rcvrs.forEach(morph => { + if (isSnapObject(morph)) { + morph.allHatBlocksFor(message).forEach(block => { + var varName, varFrame, choice; + if (block.selector === 'receiveMessage') { + varName = block.inputs()[1].evaluate()[0]; + if (varName) { + varFrame = new VariableFrame(); + choice = block.inputs()[0].evaluate(); + if (choice instanceof Array && + choice[0].indexOf('any') === 0) { + varFrame.addVar( + varName, + payload !== '' ? + new List([message, payload]) + : message + ); + } else { + varFrame.addVar(varName, payload); + } + } + procs.push(this.stage.threads.startProcess( + block, + morph, + this.stage.isThreadSafe, + // commented out for now to enable tail recursion: + // || // make "any msg" threadsafe + // block.inputs()[0].evaluate() instanceof Array, + null, // exportResult (bool) + callback instanceof Function ? wait : null, + null, // isClicked + null, // rightAway + null, // atomic + varFrame + )); + } else { + procs.push(this.stage.threads.startProcess( + block, + morph, + this.stage.isThreadSafe + )); + } + }); + } + }); + (this.stage.messageCallbacks[''] || []).forEach( + callback => callback(message) + ); + (this.stage.messageCallbacks[message] || []).forEach( + callback => callback() + ); +}; + +IDE_Morph.prototype.addMessageListenerForAll = function (callback) { + // associate a monadic callback with all broadcasts. + // whenever a message is broadcast the callback is called + // with the current message as argument + this.addMessageListener('', callback); +}; + +IDE_Morph.prototype.addMessageListener = function (message, callback) { + // associate a callback function with a broadcast message, + // whenever the message is broadcast, the callback is executed, + // you can add multiple callbacks to a message, they will be + // executed in the order you added them. + // Note: ssociating a callback with an empty string attaches the + // callback to "any" message, taking the actual message as argument + var funcs; + if (!isString(message)) { + throw new Error('message must be a String'); + } + funcs = this.stage.messageCallbacks[message]; + if (funcs instanceof Array) { + funcs.push(callback); + } else { + this.stage.messageCallbacks[message] = [callback]; + } +}; + +IDE_Morph.prototype.getMessages = function () { + // return an array of all broadcast messages in the current project + var allNames = [], + dict = new Map(); + this.sprites.contents.concat(this.stage).forEach(sprite => { + allNames = allNames.concat(sprite.allMessageNames()); + }); + allNames.forEach(name => dict.set(name)); + return Array.from(dict.keys()); +}; + +IDE_Morph.prototype.getVarNames = function () { + // return an array of all global variable names + return this.stage.globalVariables().names(); +}; + +IDE_Morph.prototype.getVar = function (name) { + // return the value of the global variable indicated by name + // raise an error if no global variable of that name exists + return this.stage.globalVariables().getVar(name); +}; + +IDE_Morph.prototype.setVar = function (name, value) { + // set the value of the global variable indicated by name to the given value + // raise an error if no global variable of that name exists + this.stage.globalVariables().setVar(name, value); +}; + +IDE_Morph.prototype.newList = function (array) { + // return a new Snap list the shape of the given array, if any + // nested array will not be automatically converted to nested lists + return new List(array); +}; + +IDE_Morph.prototype.getProjectXML = function () { + return this.serializer.serialize(new Project(this.scenes, this.scene)); +}; + +IDE_Morph.prototype.loadProjectXML = function (projectXML) { + // load the project encoded as xml-String, no questions asked + // terminate animations and scheduled ops + this.onNextStep = null; + this.world().animations = []; + this.openProjectString(projectXML); +}; + +IDE_Morph.prototype.getSpriteScriptsXML = function (name) { + // return the scripts of the sprite identified by name or the currently + // edited sprite as xml-String stripped of all dependenies, i.e. without + // custom block definitions or data (variables) + return this.spriteNamed(name).scriptsOnlyXML(); +}; + +IDE_Morph.prototype.loadSpriteScriptsXML = function (scriptsXML) { + // load the scripts encoded as xml-String and replace the scripts of the + // specified sprite or stage with them, no questions asked. + // Note: No dependency handling is expected, i.e. the xml-String is + // meant to be stripped of all dependenies, i.e. without + // custom block definitions or data (variables) + return this.spriteNamed(name).synchScriptsFrom(scriptsXML); +}; + +IDE_Morph.prototype.flashSpriteScripts = function (fromLOC, toLOC, name, clr) { + // highlight the blocks of the scripts of the sprite indicated by name or + // the current sprite or stage if none that correspond to the portion of the + // text between the start- and end lines when using the current codification + // mapping. + // Optionally a string of comma-separated "r,g,b[,a]" values can be passed + // in to specify a specific highlight color, where each color component is + // a number between 0 and 255 and alpha is a fraction between 0 and 1. + // If none is supplied the default flash color is used. + var scripts = this.spriteNamed(name).scripts; + scripts.unflash(); + scripts.flashLOC(fromLOC, toLOC, clr); +}; + +IDE_Morph.prototype.flashSpriteScriptAt = function (charIdx, name, clr) { + // highlight the innermost block of the scripts of the sprite indicated by + // name or the current sprite or stage if none that corresponds to the index + // of the text given the current codification mapping. + // Optionally a string of comma-separated "r,g,b[,a]" values can be passed + // in to specify a specific highlight color, where each color component is + // a number between 0 and 255 and alpha is a fraction between 0 and 1. + // If none is supplied the default flash color is used. + var scripts = this.spriteNamed(name).scripts; + scripts.unflash(); + scripts.flashCodeIdx(charIdx, clr); +}; + +IDE_Morph.prototype.unflashSpriteScripts = function (name) { + // un-highlight the scripts of the sprite indicated by name or the current + // sprite or stage if none + this.spriteNamed(name).scripts.unflash(); +}; + +IDE_Morph.prototype.flashSpriteScriptOutlineAt = function ( + charIdx, + name, + clr, + border +) { + // highlight the outline of the innermost block of the scripts of the sprite + // indicated by name or the current sprite or stage if none that corresponds + // to the index of the text given the current codification mapping. + // Optionally a string of comma-separated "r,g,b[,a]" values can be passed + // in to specify a specific highlight color, where each color component is + // a number between 0 and 255 and alpha is a fraction between 0 and 1. + // If none is supplied the default flash color is used. + // Also optionally a border width of pixels can be specified + var scripts = this.spriteNamed(name).scripts; + // scripts.unflash(); + scripts.flashOutlineCodeIdx(charIdx, clr, border); +}; + +IDE_Morph.prototype.unflashSpriteScriptsOutline = function (name) { + // un-highlight the script outlines of the sprite indicated by name or the + // current sprite or stage if none + this.spriteNamed(name).scripts.unflashOutline(); +}; + +IDE_Morph.prototype.showScriptBalloonAt = function (contents, charIdx, name) { + // popup a balloon at the innermost block of the scripts of the sprite + // indicated by name or the current sprite or stage if none that corresponds + // to the index of the text given the current codification mapping, and + // display the given contents, which can be a string, number, costume, + // morph, canvas, list, table etc. (anything first-class in Snap!) + var scripts = this.spriteNamed(name).scripts; + // scripts.unflash(); + // scripts.flashCodeIdx(charIdx, contents); + scripts.balloonCodeIdx(charIdx, contents); +}; + +IDE_Morph.prototype.closePopUps = function () { + // remove all pop-up menus and balloons, if any + this.world().hand.destroyTemporaries(); +}; + +IDE_Morph.prototype.unsavedChanges = function () { + return this.hasUnsavedEdits(); +}; + +IDE_Morph.prototype.resetUnsavedChanges = function () { + return this.recordSavedChanges(); +}; + +IDE_Morph.prototype.setTranslation = function (countryCode, callback) { + // switch to the specified language (format ISO 639-1 code) and + // optionally run a callback afterwards, e.g. to broadcast an event + // note the language setting does not overwrite the user's own setting + // that's stored in the browser this way, so that the next time the user + // opens Snap their own language setting again takes effect. + this.loadNewProject = false; + this.setLanguage(countryCode, callback, true); // don't save +}; diff --git a/elements/pl-snap/Snap/src/blocks.js b/elements/pl-snap/Snap/src/blocks.js new file mode 100644 index 00000000..e1b714c5 --- /dev/null +++ b/elements/pl-snap/Snap/src/blocks.js @@ -0,0 +1,16616 @@ +/* + + blocks.js + + a programming construction kit + based on morphic.js + inspired by Scratch + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js, symbols.js and widgets.js + + + hierarchy + --------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + Morph* + ArrowMorph + BlockHighlightMorph + ScriptsMorph + SyntaxElementMorph + ArgMorph + ArgLabelMorph + BooleanSlotMorph + ColorSlotMorph + CommandSlotMorph + CSlotMorph + RingCommandSlotMorph + FunctionSlotMorph + ReporterSlotMorph + RingReporterSlotMorph + InputSlotMorph + TextSlotMorph + MultiArgMorph + TemplateSlotMorph + BlockMorph + CommandBlockMorph + HatBlockMorph + ReporterBlockMorph + RingMorph + BoxMorph* + CommentMorph + ScriptFocusMorph + StringMorph* + BlockLabelMorph + InputSlotStringMorph + InputSlotTextMorph + SymbolMorph* + BlockSymbolMorph + + * from morphic.js + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + SyntaxElementMorph + BlockLabelMorph + BlockSymbolMorph + BlockMorph + CommandBlockMorph + HatBlockMorph + ReporterBlockMorph + RingMorph + ScriptsMorph + ArgMorph + CommandSlotMorph + RingCommandSlotMorph + CSlotMorph + InputSlotMorph + InputSlotStringMorph + InputSlotTextMorph + BooleanSlotMorph + ArrowMorph + TextSlotMorph + ColorSlotMorph + TemplateSlotMorph + BlockHighlightMorph + MultiArgMorph + ArgLabelMorph + FunctionSlotMorph + ReporterSlotMorph + RingReporterSlotMorph + CommentMorph + + + structure of syntax elements + ---------------------------- + the structure of syntax elements is identical with their morphic + tree. There are, however, accessor methods to get (only) the + parts which are relevant for evaluation wherever appropriate. + + In Scratch/BYOB every sprite and the stage has its own "blocks bin", + an instance of ScriptsMorph (we're going to name it differently in + Snap, probably just "scripts"). + + At the top most level blocks are assembled into stacks in ScriptsMorph + instances. A ScriptsMorph contains nothing but blocks, therefore + every child of a ScriptsMorph is expected to be a block. + + Each block contains: + + selector - indicating the name of the function it triggers, + + Its arguments are first evaluated and then passed along as the + selector is called. Arguments can be either instances of ArgMorph + or ReporterBlockMorph. The getter method for a block's arguments is + + inputs() - gets an array of arg morphs and/or reporter blocks + + in addition to inputs, command blocks also know their + + nextBlock() - gets the block attached to the receiver's bottom + + and the block they're attached to - if any: Their parent. + + please also refer to the high-level comment at the beginning of each + constructor for further details. +*/ + +/*global Array, BoxMorph, +Color, ColorPaletteMorph, FrameMorph, Function, HandleMorph, Math, MenuMorph, +Morph, MorphicPreferences, Object, ScrollFrameMorph, ShadowMorph, ZERO, Sound, +String, StringMorph, TextMorph, contains, degrees, detect, PianoMenuMorph, nop, +document, getDocumentPositionOf, isNaN, isString, newCanvas, parseFloat, isNil, +radians, useBlurredShadows, SpeechBubbleMorph, modules, StageMorph, SymbolMorph, +fontHeight, TableFrameMorph, SpriteMorph, Context, ListWatcherMorph, Rectangle, +DialogBoxMorph, BlockInputFragmentMorph, PrototypeHatBlockMorph, WHITE, BLACK, +Costume, IDE_Morph, BlockDialogMorph, BlockEditorMorph, localize, CLEAR, Point, +isSnapObject, PushButtonMorph, SpriteIconMorph, Process, AlignmentMorph, List, +ToggleButtonMorph, DialMorph, SnapExtensions, CostumeIconMorph, SoundIconMorph, +SVG_Costume, embedMetadataPNG, ThreadManager, snapEquals*/ + +/*jshint esversion: 11*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.blocks = '2024-February-20'; + +var SyntaxElementMorph; +var BlockMorph; +var BlockLabelMorph; +var BlockSymbolMorph; +var CommandBlockMorph; +var ReporterBlockMorph; +var ScriptsMorph; +var ArgMorph; +var CommandSlotMorph; +var CSlotMorph; +var InputSlotMorph; +var InputSlotStringMorph; +var InputSlotTextMorph; +var BooleanSlotMorph; +var ArrowMorph; +var ColorSlotMorph; +var HatBlockMorph; +var BlockHighlightMorph; +var MultiArgMorph; +var TemplateSlotMorph; +var FunctionSlotMorph; +var ReporterSlotMorph; +var RingMorph; +var RingCommandSlotMorph; +var RingReporterSlotMorph; +var CommentMorph; +var ArgLabelMorph; +var TextSlotMorph; +var ScriptFocusMorph; + +// SyntaxElementMorph ////////////////////////////////////////////////// + +// I am the ancestor of all blocks and input slots + +// SyntaxElementMorph inherits from Morph: + +SyntaxElementMorph.prototype = new Morph(); +SyntaxElementMorph.prototype.constructor = SyntaxElementMorph; +SyntaxElementMorph.uber = Morph.prototype; + +// SyntaxElementMorph preferences settings: + +/* + the following settings govern the appearance of all syntax elements + (blocks and slots) where applicable: + + outline: + + corner - radius of command block rounding + rounding - radius of reporter block rounding + edge - width of 3D-ish shading box + hatHeight - additional top space for hat blocks + hatWidth - minimum width for hat blocks + rfBorder - pixel width of reification border (grey outline) + minWidth - minimum width for any syntax element's contents + + jigsaw shape: + + inset - distance from indentation to left edge + dent - width of indentation bottom + + paddings: + + bottomPadding - adds to the width of the bottom most c-slot + cSlotPadding - adds to the width of the open "C" in c-slots + typeInPadding - adds pixels between text and edge in input slots + labelPadding - adds left/right pixels to block labels + + label: + + labelFontName - specific font family name + labelFontStyle - generic font family name, cascaded + fontSize - duh + embossing - offset for embossing effect + labelWidth - column width, used for word wrapping + labelWordWrap - if true labels can break after each word + dynamicInputLabels - if true inputs can have dynamic labels + + snapping: + + feedbackMinHeight - height of white line for command block snaps + minSnapDistance - threshold when commands start snapping + reporterDropFeedbackPadding - increases reporter drop feedback + + color gradients: + + contrast - 3D-ish shading gradient contrast + labelContrast - 3D-ish label shading contrast + activeHighlight - for stack highlighting when active + errorHighlight - for error highlighting + activeBlur - shadow for blurred activeHighlight + activeBorder - unblurred activeHighlight + rfColor - for reified outlines and slot backgrounds +*/ + +SyntaxElementMorph.prototype.contrast = 65; + +SyntaxElementMorph.prototype.setScale = function (num) { + var scale = Math.min(Math.max(num, 1), 25); + this.scale = scale; + this.corner = 3 * scale; + this.rounding = 9 * scale; + this.edge = scale; + this.flatEdge = scale * 0.5; + this.jag = 5 * scale; + this.inset = 6 * scale; + this.hatHeight = 12 * scale; + this.hatWidth = 70 * scale; + this.rfBorder = 3 * scale; + this.minWidth = 0; + this.dent = 8 * scale; + this.bottomPadding = 3 * scale; + this.cSlotPadding = 4 * scale; + this.typeInPadding = scale; + this.labelPadding = 4 * scale; + this.labelFontName = 'Verdana'; + this.labelFontStyle = 'sans-serif'; + this.fontSize = 10 * scale; + this.embossing = new Point( + -1 * Math.max(scale / 2, 1), + -1 * Math.max(scale / 2, 1) + ); + this.labelWidth = 450 * scale; + this.labelWordWrap = true; + this.dynamicInputLabels = true; + this.feedbackMinHeight = 5; + this.minSnapDistance = 20; + this.reporterDropFeedbackPadding = 10 * scale; + this.labelContrast = 25; + this.activeHighlight = new Color(153, 255, 213); + this.errorHighlight = new Color(173, 15, 0); + this.activeBlur = 20; + this.activeBorder = 4; + this.rfColor = new Color(120, 120, 120); +}; + +SyntaxElementMorph.prototype.setScale(1); +SyntaxElementMorph.prototype.isCachingInputs = false; +SyntaxElementMorph.prototype.alpha = 1; + +// SyntaxElementMorph label part specs: + +SyntaxElementMorph.prototype.labelParts = { + /* + Input slots + + type: 'input' + tags: 'numeric alphanum read-only unevaluated landscape static' + menu: dictionary or selector + react: selector + value: string, number or Array for localized strings / constants + */ + '%s': { + type: 'input' + }, + '%n': { + type: 'input', + tags: 'numeric' + }, + '%txt': { + type: 'input', + tags: 'landscape' + }, + '%anyUE': { + type: 'input', + tags: 'unevaluated' + }, + '%dir': { + type: 'input', + tags: 'numeric', + menu: { + '§_dir': null, + '(90) right' : 90, + '(-90) left' : -90, + '(0) up' : 0, + '(180) down' : 180, + 'random' : ['random'] + } + }, + '%note': { + type: 'input', + tags: 'numeric', + menu: 'pianoKeyboardMenu' + }, + '%inst': { + type: 'input', + tags: 'numeric', + menu: { + '(1) sine' : 1, + '(2) square' : 2, + '(3) sawtooth' : 3, + '(4) triangle' : 4 + } + }, + '%prim': { + type: 'input', + tags: 'read-only static', + menu: 'primitivesMenu' + }, + '%audio': { + type: 'input', + tags: 'read-only static', + menu: 'audioMenu' + }, + '%aa': { // audio attributes + type: 'input', + tags: 'read-only static', + menu: { + 'name' : ['name'], + 'duration' : ['duration'], + 'length' : ['length'], + 'number of channels' : ['number of channels'], + 'sample rate' : ['sample rate'], + 'samples' : ['samples'] + } + }, + '%img': { // image attributes + type: 'input', + tags: 'read-only static', + menu: { + 'name' : ['name'], + 'width' : ['width'], + 'height' : ['height'], + 'pixels' : ['pixels'] + } + }, + '%imgsource': { + type: 'input', + tags: 'read-only', + menu: { + 'pen trails': ['pen trails'], + 'stage image': ['stage image'] + } + }, + '%rate': { + type: 'input', + tags: 'numeric', + menu: { + '22.05 kHz' : 22050, + '44.1 kHz' : 44100, + '48 kHz' : 48000, + '88.2 kHz' : 88200, + '96 kHz' : 96000 + } + }, + '%interaction': { + type: 'input', + tags: 'read-only static', + menu: { + 'clicked' : ['clicked'], + 'pressed' : ['pressed'], + 'dropped' : ['dropped'], + 'mouse-entered' : ['mouse-entered'], + 'mouse-departed' : ['mouse-departed'], + 'scrolled-up' : ['scrolled-up'], + 'scrolled-down' : ['scrolled-down'], + 'stopped' : ['stopped'] + } + }, + '%dates': { + type: 'input', + tags: 'read-only static', + menu: { + 'year' : ['year'], + 'month' : ['month'], + 'date' : ['date'], + 'day of week' : ['day of week'], + 'hour' : ['hour'], + 'minute' : ['minute'], + 'second' : ['second'], + 'time in milliseconds' : ['time in milliseconds'] + } + }, + '%delim': { + type: 'input', + menu: { + 'letter' : ['letter'], + 'word' : ['word'], + 'line' : ['line'], + 'tab' : ['tab'], + 'cr' : ['cr'], + 'csv' : ['csv'], + 'json' : ['json'], + '~' : null, + 'blocks' : ['blocks'] + /* + 'csv records' : ['csv records'], + 'csv fields' : ['csv fields'] + */ + } + }, + '%ida': { + type: 'input', + tags: 'alphanum', + menu: { + '1' : 1, + last : ['last'], + '~' : null, + all : ['all'] + } + }, + '%idx': { + type: 'input', + tags: 'alphanum', + menu: { + '1' : 1, + last : ['last'], + random : ['random'] + } + }, + '%ix': { + type: 'input', + tags: 'numeric', + menu: { + '1' : 1, + last : ['last'], + random : ['random'] + } + }, + '%la': { + type: 'input', + tags: 'read-only static', + menu: { + 'length' : ['length'], + // 'size' : ['size'], + 'rank' : ['rank'], + 'dimensions' : ['dimensions'], + 'flatten' : ['flatten'], + 'columns' : ['columns'], + // 'transpose' : ['transpose'], + 'uniques' : ['uniques'], + 'distribution' : ['distribution'], + 'sorted' : ['sorted'], + 'shuffled' : ['shuffled'], + 'reverse' : ['reverse'], + '~' : null, + 'text' : ['text'], + 'lines' : ['lines'], + 'csv' : ['csv'], + 'json' : ['json'] + } + }, + '%ta': { + type: 'input', + tags: 'read-only static', + menu: { + 'length' : ['length'], + 'lower case' : ['lower case'], + 'upper case' : ['upper case'] + } + }, + '%mlfunc': { + type: 'input', + tags: 'read-only static', + menu: { + 'append' : ['append'], + 'cross product' : ['cross product'] + } + }, + '%dim': { + type: 'input', + tags: 'numeric', + menu: { + current : ['current'] + } + }, + '%rel': { + type: 'input', + tags: 'read-only', + menu: { + 'distance' : ['distance'], + 'direction' : ['direction'], + 'ray length' : ['ray length'] + } + }, + '%loc': { + type: 'input', + tags: 'read-only', + menu: 'locationMenu' + }, + '%rcv': { + type: 'input', + tags: 'read-only', + menu: 'receiversMenu', + value: ['all'] + }, + '%spr': { + type: 'input', + tags: 'read-only', + menu: 'objectsMenu' + }, + '%self': { + type: 'input', + tags: 'read-only', + menu: 'objectsMenuWithSelf' + }, + '%edit' : { + type: 'input', + tags: 'read-only', + menu: 'userEditMenu', + value: ['anything'] + }, + '%col': { // collision detection + type: 'input', + tags: 'read-only', + menu: 'collidablesMenu' + }, + '%dst': { // distance measuring + type: 'input', + tags: 'read-only', + menu: 'distancesMenu' + }, + '%cln': { // clones + type: 'input', + tags: 'read-only', + menu: 'clonablesMenu' + }, + '%get': { // sprites, parts, specimen, clones + type: 'input', + tags: 'read-only static', + menu: 'gettablesMenu' + }, + '%cst': { + type: 'input', + tags: 'read-only', + menu: 'costumesMenu' + }, + '%eff': { + type: 'input', + tags: 'read-only static', + menu: { + color: ['color'], + saturation: ['saturation'], + brightness : ['brightness'], + ghost: ['ghost'], + fisheye: ['fisheye'], + whirl: ['whirl'], + pixelate: ['pixelate'], + mosaic: ['mosaic'], + negative : ['negative'] + // duplicate: ['duplicate'], + // comic: ['comic'], + // confetti: ['confetti'] + } + }, + '%env': { + type: 'input', + tags: 'read-only static', + menu: { + script: ['script'], + caller: ['caller'], + continuation: ['continuation'], + '~' : null, + inputs : ['inputs'] + } + }, + '%snd': { + type: 'input', + tags: 'read-only', + menu: 'soundsMenu' + }, + '%key': { + type: 'input', + tags: 'read-only', + menu: 'keysMenu' + }, + '%keyHat': { + type: 'input', + tags: 'read-only static', + menu: 'keysMenu', + react: 'updateEventUpvar' + }, + '%msg': { + type: 'input', + tags: 'read-only', + menu: 'messagesMenu' + }, + '%msgHat': { + type: 'input', + tags: 'read-only static', + menu: 'messagesReceivedMenu' + }, + '%msgSend': { + type: 'input', + menu: 'eventsMenu' + }, + '%att': { + type: 'input', + tags: 'read-only', + menu: 'attributesMenu' + }, + '%fun': { + type: 'input', + tags: 'read-only static', + menu: { + abs : ['abs'], + // '\u2212' : ['\u2212'], // minus-sign + neg : ['neg'], + sign : ['sign'], + ceiling : ['ceiling'], + floor : ['floor'], + sqrt : ['sqrt'], + sin : ['sin'], + cos : ['cos'], + tan : ['tan'], + asin : ['asin'], + acos : ['acos'], + atan : ['atan'], + ln : ['ln'], + log : ['log'], + lg : ['lg'], + 'e^' : ['e^'], + '10^' : ['10^'], + '2^' : ['2^'], + id: ['id'] + } + }, + '%layer': { + type: 'input', + tags: 'read-only static', + menu: { + front : ['front'], + back : ['back'] + } + }, + '%clrdim': { + type: 'input', + tags: 'read-only static', + menu: { + hue : ['hue'], + saturation : ['saturation'], + brightness : ['brightness'], + transparency : ['transparency'], + '~' : null, + 'r-g-b(-a)' : ['r-g-b(-a)'] + } + }, + '%pen': { + type: 'input', + tags: 'read-only static', + menu: { + size : ['size'], + hue : ['hue'], + saturation : ['saturation'], + brightness : ['brightness'], + transparency : ['transparency'], + '~' : null, + 'r-g-b-a' : ['r-g-b-a'] + } + }, + '%asp': { // aspect + type: 'input', + tags: 'read-only static', + menu: { + hue : ['hue'], + saturation : ['saturation'], + brightness : ['brightness'], + transparency : ['transparency'], + 'r-g-b-a' : ['r-g-b-a'], + '~' : null, + sprites : ['sprites'], + } + }, + '%txtfun': { + type: 'input', + tags: 'read-only static', + menu: { + 'encode URI' : ['encode URI'], + 'decode URI' : ['decode URI'], + 'encode URI component' : ['encode URI component'], + 'decode URI component' : ['decode URI component'], + 'XML escape' : ['XML escape'], + 'XML unescape' : ['XML unescape'], + 'JS escape' : ['JS escape'], + 'hex sha512 hash' : ['hex sha512 hash'] + } + }, + '%stopChoices': { + type: 'input', + tags: 'read-only static', + menu: { + 'all' : ['all'], + 'all scenes' : ['all scenes'], + 'this script' : ['this script'], + 'this block' : ['this block'], + 'all but this script' : ['all but this script'], + 'other scripts in sprite' : ['other scripts in sprite'] + } + }, + '%setting': { + type: 'input', + tags: 'read-only static', + menu: { + 'turbo mode' : ['turbo mode'], + 'case sensitivity' : ['case sensitivity'], + 'flat line ends' : ['flat line ends'], + 'log pen vectors' : ['log pen vectors'], + 'video capture' : ['video capture'], + 'mirror video' : ['mirror video'] + } + }, + '%typ': { + type: 'input', + tags: 'read-only static', + menu: 'typesMenu' + }, + '%mapValue': { + type: 'input', + tags: 'read-only static', + menu: { + String : ['String'], + Number : ['Number'], + 'true' : ['true'], + 'false' : ['false'] + } + }, + '%var': { + type: 'input', + tags: 'read-only static', + menu: 'getVarNamesDict' + }, + '%shd': { + type: 'input', + tags: 'read-only', + menu: 'shadowedVariablesMenu' + }, + + // code mapping + + '%codeKind': { + type: 'input', + tags: 'read-only', + menu: { + code : ['code'], + header : ['header'] + } + }, + '%codeListPart': { + type: 'input', + tags: 'read-only', + menu: { + 'list' : ['list'], + 'item' : ['item'], + 'delimiter' : ['delimiter'] + } + }, + '%codeListKind': { + type: 'input', + tags: 'read-only', + menu: { + 'collection' : ['collection'], + 'variables' : ['variables'], + 'parameters' : ['parameters'] + } + }, + '%scn': { + type: 'input', + tags: 'read-only', + menu: 'scenesMenu' + }, + + // video + + '%vid': { + type: 'input', + tags: 'read-only static', + menu: { + 'snap': ['snap'], + 'motion': ['motion'], + 'direction': ['direction'] + } + }, + + // block + + '%block': { + type: 'input', + tags: 'read-only static', + menu: { + 'label': ['label'], + 'definition': ['definition'], + 'comment': ['comment'], + 'category': ['category'], + 'custom?': ['custom?'], + 'global?': ['global?'], + 'type': ['type'], + 'scope': ['scope'], + 'slots': ['slots'], + '~' : null, + 'defaults': ['defaults'], + 'menus' : ['menus'], + 'editables' : ['editables'], + 'replaceables' : ['replaceables'], + 'separators' : ['separators'], + 'translations' : ['translations'] + } + }, + '%byob': { + type: 'input', + tags: 'read-only static', + menu: { + 'label': ['label'], + 'definition': ['definition'], + 'comment': ['comment'], + 'category': ['category'], + 'type': ['type'], + 'scope': ['scope'], + 'slots': ['slots'], + '~' : null, + 'defaults': ['defaults'], + 'menus' : ['menus'], + 'editables' : ['editables'], + 'replaceables' : ['replaceables'], + 'separators' : ['separators'], + 'translations' : ['translations'] + } + }, + + /* + type: 'text entry' + tags: 'monospace' + */ + '%mlt': { + type: 'text entry', + }, + '%code': { + type: 'text entry', + tags: 'monospace' + }, + + /* + type: 'boolean' + tags: 'unevaluated static' + */ + '%b': { + type: 'boolean' + }, + '%boolUE': { + type: 'boolean', + tags: 'unevaluated' + }, + '%bool': { + type: 'boolean', + tags: 'static' + }, + + /* + type: 'slot' + kind: 'object', '' + */ + '%obj': { + type: 'slot', + kind: 'object' + }, + '%l': { + type: 'slot', + kind: 'list' + }, + + /* + type: 'symbol' + name: string + color: a color, default is WHITE + scale: float (factor of fontSize) default is 1 + tags: 'static fading protected' (protected = no zebra coloring) + */ + '%turtle': { + type: 'symbol', + name: 'turtle', + scale: 1.2 + }, + '%turtleOutline': { + type: 'symbol', + name: 'turtleOutline', + tags: 'protected' + }, + '%clockwise': { + type: 'symbol', + name: 'turnRight', + scale: 1.5 + }, + '%counterclockwise': { + type: 'symbol', + name: 'turnLeft', + scale: 1.5 + }, + '%greenflag': { + type: 'symbol', + name: 'flag', + color: new Color(0, 200, 0), + scale: 1.5, + tags: 'protected' + }, + '%blitz': { + type: 'symbol', + name: 'flash' + }, + '%list': { + type: 'symbol', + name: 'list' + }, + '%pause': { + type: 'symbol', + name: 'pause', + color: new Color(255, 220, 0), + tags: 'protected' + }, + '%loopArrow': { + type: 'symbol', + name: 'loop', + scale: 0.7, + tags: 'fading' + }, + + /* + type: 'c' + tags: 'loop static lambda' + spec: a spec string + */ + '%c': { + type: 'c', + tags: 'static' + }, + '%cs': { + type: 'c', + }, + '%ca': { + type: 'c', + tags: 'loop' + }, + '%cl': { + type: 'c', + tags: 'static lambda' + }, + '%cla': { + type: 'c', + tags: 'static lambda loop' + }, + '%loop': { + type: 'c', + tags: 'static loop' + }, + + /* + type: 'command slot' // currently unused, retained for compatibility + */ + '%cmd': { + type: 'command slot' + }, + + /* + type: 'ring' + tags: 'static' + selector: 'reifyScript', 'reifyReporter', 'reifyPredicate' + spec: a spec string + */ + '%cmdRing': { + type: 'ring', + selector: 'reifyScript', + spec: '%rc %ringparms' + }, + '%repRing': { + type: 'ring', + tags: 'static', + selector: 'reifyReporter', + spec: '%rr %ringparms' + }, + '%predRing': { + type: 'ring', + tags: 'static', + selector: 'reifyPredicate', + spec: '%rp %ringparms' + }, + + /* + type: 'ring slot' + tags: 'static', + kind: 'command', 'reporter', 'predicate' + + */ + '%rc': { + type: 'ring slot', + tags: 'static', + kind: 'command' + }, + '%rr': { + type: 'ring slot', + tags: 'static', + kind: 'reporter' + }, + '%rp': { + type: 'ring slot', + tags: 'static', + kind: 'predicate' + }, + + /* + type: 'template' + label: string + */ + '%t': { + type: 'template', + label: '\xa0' // non-breaking space, appears blank + }, + '%upvar': { + type: 'template', + label: '\xa0' // non-breaking space, appears blank + }, + + // other single types + '%clr': { + type: 'color', + tags: 'static' + }, + '%br': { + type: 'break' + }, + '%inputName': { + type: 'variable', + }, + + // specialized variadic inputs + /* + type: 'multi' + slots: a slot spec string + label: (optional) + infix: (optional) + collapse: (optional) alternative label to "Input list" + tags: 'widget' // doesn't count as "empty" slot implicit parameter + min: (optional) number of minimum inputs) or zero + max: (optional) number of maximum inputs) or zero + defaults: (optional) number of visible slots to begin with or zero + dflt: (optional) array with default value(s) + group: (optional) a block spec describing a group of inputs with labels + */ + '%inputs': { + type: 'multi', + slots: '%s', + label: 'with inputs', + tags: 'widget' + }, + '%send': { + type: 'multi', + slots: ['%msgSend', '%s'], + label: ['and send', 'with data'], + tags: 'static widget', + max: 2 + }, + '%receive': { + type: 'multi', + slots: ['%rcv', '%s'], + label: ['to', 'with data'], + tags: 'static widget', + max: 2 + }, + '%scriptVars': { + type: 'multi', + slots: '%t', + tags: 'widget', + min: 1 + }, + '%blockVars': { + type: 'multi', + slots: '%t', + label: 'block variables', + tags: 'widget' + }, + '%message': { + type: 'multi', + slots: '%t', + tags: 'widget', + max: 1 + }, + '%keyName': { + type: 'multi', + slots: '%t', + tags: 'widget', + max: 1 + }, + '%parms': { + type: 'multi', + slots: '%t', + label: 'Input Names:', + tags: 'widget' + }, + '%ringparms': { + type: 'multi', + slots: '%t', + label: 'input names:' + }, + '%words': { + type: 'multi', + slots: '%s', + defaults: 2 + }, + '%lists': { + type: 'multi', + slots: '%l', + defaults: 2 + }, + '%nums': { + type: 'multi', + slots: '%n', + defaults: 2 + }, + '%exp': { + type: 'multi', + slots: '%s', + defaults: 1, + tags: 'static widget' + }, + '%sum': { + type: 'multi', + slots: '%n', + min: 2, + infix: '+', + collapse: 'sum' + }, + '%product': { + type: 'multi', + slots: '%n', + min: 2, + infix: '\u00D7', + collapse: 'product' + }, + '%min': { + type: 'multi', + slots: '%n', + min: 2, + infix: 'min', + collapse: 'minimum' + }, + '%max': { + type: 'multi', + slots: '%n', + min: 2, + infix: 'max', + collapse: 'maximum' + }, + '%all': { + type: 'multi', + slots: '%b', + min: 2, + infix: 'and', + collapse: 'all' + }, + '%any': { + type: 'multi', + slots: '%b', + min: 2, + infix: 'or', + collapse: 'any' + }, + '%all<': { + type: 'multi', + slots: '%s', + min: 2, + infix: '<', + collapse: 'all <' + }, + '%all>': { + type: 'multi', + slots: '%s', + min: 2, + infix: '>', + collapse: 'all >' + }, + '%all<=': { + type: 'multi', + slots: '%s', + min: 2, + infix: '\u2264', + collapse: 'all \u2264' + }, + '%all>=': { + type: 'multi', + slots: '%s', + min: 2, + infix: '\u2265', + collapse: 'all \u2265' + }, + '%all=': { + type: 'multi', + slots: '%s', + min: 2, + infix: '=', + collapse: 'all =' + }, + '%all!=': { + type: 'multi', + slots: '%s', + min: 2, + infix: '\u2260', + collapse: 'neighbors \u2260' + }, + '%all==': { + type: 'multi', + slots: '%s', + min: 2, + infix: 'identical to', + collapse: 'all identical' + }, + '%elseif': { + type: 'multi', + group: 'else if %b %cs', + dflt: [true, null], + tags: 'static widget' + } +}; + +// SyntaxElementMorph instance creation: + +function SyntaxElementMorph() { + this.init(); +} + +SyntaxElementMorph.prototype.init = function () { + this.cachedClr = null; + this.cachedClrBright = null; + this.cachedClrDark = null; + this.cachedNormalColor = null; // for single-stepping + this.isStatic = false; // if true, I cannot be exchanged + + SyntaxElementMorph.uber.init.call(this); + + this.defaults = []; + this.cachedInputs = null; + delete this.alpha; +}; + +// SyntaxElementMorph accessing: + +SyntaxElementMorph.prototype.parts = function () { + // answer my non-crontrol submorphs + var nb = null; + if (this.nextBlock) { // if I am a CommandBlock or a HatBlock + nb = this.nextBlock(); + } + return this.children.filter(child => + (child !== nb) && + !(child instanceof ShadowMorph) && + !(child instanceof BlockHighlightMorph) + ); +}; + +SyntaxElementMorph.prototype.inputs = function () { + // answer my arguments and nested reporters + if (isNil(this.cachedInputs) || !this.isCachingInputs) { + this.cachedInputs = this.parts().filter(part => + part instanceof SyntaxElementMorph + ); + } + // this.debugCachedInputs(); + return this.cachedInputs; +}; + +SyntaxElementMorph.prototype.debugCachedInputs = function () { + // private - only used for manually debugging inputs caching + var realInputs, i; + if (!isNil(this.cachedInputs)) { + realInputs = this.parts().filter(part => + part instanceof SyntaxElementMorph + ); + } + if (this.cachedInputs.length !== realInputs.length) { + throw new Error('cached inputs size do not match: ' + + this.constructor.name); + } + for (i = 0; i < realInputs.length; i += 1) { + if (this.cachedInputs[i] !== realInputs[i]) { + throw new Error('cached input does not match: ' + + this.constructor.name + + ' #' + + i + + ' ' + + this.cachedInputs[i].constructor.name + + ' != ' + + realInputs[i].constructor.name); + } + } +}; + +SyntaxElementMorph.prototype.allInputs = function () { + // answer arguments and nested reporters of all children + return this.allChildren().slice(0).reverse().filter(child => + (child instanceof ArgMorph) || + (child instanceof ReporterBlockMorph && + child !== this) + ); +}; + +SyntaxElementMorph.prototype.allEmptySlots = function () { + // answer empty input slots of all children excluding myself, + // but omit those in nested rings (lambdas) and JS-Function primitives. + // Used by the evaluator when binding implicit formal parameters + // to empty input slots + var empty = []; + if (!(this instanceof RingMorph) && + // disregard custom C-slots, because they should be treated as + // rings. Commented out for now... + // !(this instanceof CSlotMorph && !this.isStatic) && + (this.selector !== 'reportJSFunction')) { + this.children.forEach(morph => { + if (morph.isEmptySlot && morph.isEmptySlot()) { + empty.push(morph); + } else if (morph.allEmptySlots) { + empty = empty.concat(morph.allEmptySlots()); + } + }); + } + return empty; +}; + +SyntaxElementMorph.prototype.tagExitBlocks = function (stopTag, isCommand) { + // tag 'report' and 'stop this block' blocks of all children including + // myself, with either a stopTag (for "stop" blocks) or an indicator of + // being inside a command block definition, but omit those in nested + // rings (lambdas. Used by the evaluator when entering a procedure + if (this.selector === 'doReport') { + this.partOfCustomCommand = isCommand; + } else if (this.selector === 'doStopThis') { + this.exitTag = stopTag; + } else { + if (!(this instanceof RingMorph)) { + this.children.forEach(morph => { + if (morph.tagExitBlocks) { + morph.tagExitBlocks(stopTag, isCommand); + } + }); + } + } +}; + +SyntaxElementMorph.prototype.replaceInput = function (oldArg, newArg) { + var scripts = this.parentThatIsA(ScriptsMorph), + replacement = newArg, + idx = this.children.indexOf(oldArg), + i = 0; + + // try to find the ArgLabel embedding the newArg, + // used for the undrop() feature + if (idx === -1 && newArg instanceof MultiArgMorph) { + this.children.forEach(morph => { + if (morph instanceof ArgLabelMorph && + morph.argMorph() === oldArg + ) { + idx = i; + } + i += 1; + }); + } + + if (oldArg.cachedSlotSpec) {oldArg.cachedSlotSpec = null; } + if (newArg.cachedSlotSpec) {newArg.cachedSlotSpec = null; } + + this.changed(); + if (newArg.parent) { + newArg.parent.removeChild(newArg); + } + if (oldArg instanceof MultiArgMorph) { + oldArg.inputs().forEach(inp => // preserve nested reporters + oldArg.replaceInput(inp, new InputSlotMorph()) + ); + if ((this.dynamicInputLabels || oldArg.collapse) && + newArg instanceof ReporterBlockMorph) { + replacement = new ArgLabelMorph(newArg, oldArg.collapse); + } + } + replacement.parent = this; + this.children[idx] = replacement; + if (oldArg instanceof ReporterBlockMorph && scripts && + !oldArg.isPrototype + ) { + if (!(oldArg instanceof RingMorph) + || (oldArg instanceof RingMorph && oldArg.contents())) { + scripts.add(oldArg); + oldArg.moveBy(replacement.extent()); + oldArg.fixBlockColor(); + } + } + if (replacement instanceof MultiArgMorph + || replacement instanceof ArgLabelMorph + || replacement.constructor === CommandSlotMorph) { + replacement.fixLayout(); + if (this.fixLabelColor) { // special case for variadic continuations + this.fixLabelColor(); + } + } else { + this.fixLayout(); + } + this.cachedInputs = null; +}; + +SyntaxElementMorph.prototype.revertToDefaultInput = function (arg, noValues) { + var deflt = this.revertToEmptyInput(arg), + inp = this.inputs().indexOf(deflt), + def; + if (noValues || inp < 0) { + return deflt; + } + if (this instanceof BlockMorph) { + if (this.isCustomBlock) { + def = this.isGlobal ? this.definition + : this.scriptTarget().getMethod(this.blockSpec); + if (!noValues && + (deflt instanceof InputSlotMorph || + deflt instanceof BooleanSlotMorph) + ) { + deflt.setContents( + def.defaultValueOfInputIdx(inp) + ); + } + } + } + if (deflt instanceof MultiArgMorph && !inp) { + // first - and only - input is variadic + deflt.setContents(this.defaults); + deflt.defaults = this.defaults; + } else if (!isNil(this.defaults[inp])) { + deflt.setContents(this.defaults[inp]); + if (deflt instanceof MultiArgMorph) { + deflt.defaults = this.defaults[inp]; + } + } + return deflt; +}; + +SyntaxElementMorph.prototype.revertToEmptyInput = function (arg) { + var idx = this.parts().indexOf(arg), + inp = this.inputs().indexOf(arg), + deflt = new InputSlotMorph(), + rcvr, def; + + if (idx !== -1) { + if (this instanceof BlockMorph) { + deflt = this.labelPart(this.parseSpec(this.blockSpec)[idx]); + if (this.isCustomBlock) { + if (this.isGlobal) { + def = this.definition; + } else { + rcvr = this.scriptTarget(true); + if (rcvr) { + def = rcvr.getMethod(this.blockSpec); + } + } + if (def) { + if (deflt instanceof InputSlotMorph) { + deflt.setChoices.apply( + deflt, + def.inputOptionsOfIdx(inp) + ); + } else if (deflt instanceof MultiArgMorph) { + deflt.setInfix(def.separatorOfInputIdx(inp)); + } + } + } + } else if (this instanceof MultiArgMorph) { + deflt = this.labelPart(this.slotSpecFor(inp)); + } else if (this instanceof ReporterSlotMorph) { + deflt = this.emptySlot(); + } + } + if (deflt.icon || deflt instanceof BooleanSlotMorph) { + deflt.fixLayout(); + } + this.replaceInput(arg, deflt); + if (deflt instanceof MultiArgMorph) { + deflt.refresh(); + } else if (deflt instanceof RingMorph) { + deflt.fixBlockColor(); + } + this.cachedInputs = null; + return deflt; +}; + +SyntaxElementMorph.prototype.isLocked = function () { + // answer true if I can be exchanged by a dropped reporter + return this.isStatic; +}; + +// SyntaxElementMorph enumerating: + +SyntaxElementMorph.prototype.topBlock = function () { + if (this.parent && this.parent.topBlock) { + return this.parent.topBlock(); + } + return this; +}; + +// SyntaxElementMorph reachable variables + +SyntaxElementMorph.prototype.getVarNamesDict = function () { + var block = this.parentThatIsA(BlockMorph), + rcvr, + tempVars = [], + dict; + + if (!block) { + return {}; + } + rcvr = block.scriptTarget(); + block.allParents().forEach(morph => { + var proto; + if (morph instanceof BlockEditorMorph) { + proto = morph.body.contents.children.find(child => + child instanceof PrototypeHatBlockMorph); + if (proto) { + morph = proto; + } + } + if (morph instanceof PrototypeHatBlockMorph) { + tempVars.push.apply( + tempVars, + morph.variableNames() + ); + tempVars.push.apply( + tempVars, + morph.inputs()[0].inputFragmentNames() + ); + } else if (morph instanceof BlockMorph) { + morph.inputs().forEach(inp => { + inp.allChildren().forEach(child => { + if (child instanceof TemplateSlotMorph) { + tempVars.push(child.contents()); + } else if (child instanceof MultiArgMorph) { + child.children.forEach(m => { + if (m instanceof TemplateSlotMorph) { + tempVars.push(m.contents()); + } + }); + } + }); + }); + } + }); + if (rcvr) { + dict = rcvr.variables.allNamesDict(); + tempVars.forEach(name => + dict[name] = name + ); + if (block.selector === 'doSetVar') { + // add settable object attributes + dict['~'] = null; + dict.my = [{// wrap the submenu into a 1-item array to translate it + 'anchor' : ['my anchor'], + 'parent' : ['my parent'], + 'name' : ['my name'], + 'temporary?' : ['my temporary?'], + 'dangling?' : ['my dangling?'], + 'draggable?' : ['my draggable?'], + 'rotation style' : ['my rotation style'], + 'rotation x' : ['my rotation x'], + 'rotation y' : ['my rotation y'] + }]; + if (this.world().currentKey === 16) { // shift + dict.my[0]['~'] = null; // don't forget we're inside an array... + dict.my[0]['microphone modifier'] = ['microphone modifier']; + } + } + return dict; + } + return {}; +}; + +// SyntaxElementMorph copy-on-write support: + +SyntaxElementMorph.prototype.selectForEdit = function () { + var scripts = this.parentThatIsA(ScriptsMorph), + ide = this.parentThatIsA(IDE_Morph), + rcvr = ide ? ide.currentSprite : null, + selected; + if (scripts && rcvr && rcvr.inheritsAttribute('scripts')) { + // copy on write: + this.selectionID = true; + rcvr.shadowAttribute('scripts'); + selected = detect( + rcvr.scripts.allChildren(), + m => m.selectionID + ); + delete this.selectionID; + delete selected.selectionID; + return selected; + } + return this; +}; + +// SyntaxElementMorph drag & drop: + +SyntaxElementMorph.prototype.reactToGrabOf = function (grabbedMorph) { + var topBlock = this.topBlock(), + affected; + if (grabbedMorph instanceof CommandBlockMorph) { + affected = this.parentThatIsA(CommandSlotMorph, ReporterSlotMorph); + if (affected) { + affected.fixLayout(); + } + } + if (topBlock) { + topBlock.allComments().forEach(comment => + comment.align(topBlock) + ); + if (topBlock.getHighlight()) { + topBlock.addHighlight(topBlock.removeHighlight()); + } + } +}; + +// SyntaxElementMorph 3D - border color rendering: + +SyntaxElementMorph.prototype.bright = function () { + return this.color.lighter(this.contrast).toString(); +}; + +SyntaxElementMorph.prototype.dark = function () { + return this.color.darker(this.contrast).toString(); +}; + +// SyntaxElementMorph color changing: + +SyntaxElementMorph.prototype.setColor = function (aColor) { + var block; + if (aColor) { + if (!this.color.eq(aColor)) { + block = this.parentThatIsA(BlockMorph); + this.color = aColor; + this.children.forEach(morph => { + if (block && (morph instanceof StringMorph || + morph instanceof SymbolMorph)) { + morph.shadowColor = block.color.darker( + block.labelContrast + ); + morph.rerender(); + } else if (morph instanceof CommandSlotMorph) { + morph.setColor(aColor); + } + }); + if (block) {block.fixLabelColor(); } + this.rerender(); + } + } +}; + +SyntaxElementMorph.prototype.setLabelColor = function ( + textColor, + shadowColor, + shadowOffset +) { + this.children.forEach(morph => { + if (morph instanceof StringMorph && !morph.isProtectedLabel) { + morph.shadowOffset = shadowOffset || morph.shadowOffset; + morph.shadowColor = shadowColor || morph.shadowColor; + morph.setColor(textColor); + } else if (morph instanceof MultiArgMorph + || morph instanceof ArgLabelMorph + || (morph instanceof SymbolMorph && !morph.isProtectedLabel) + || (morph instanceof InputSlotMorph + && morph.isReadOnly)) { + morph.setLabelColor(textColor, shadowColor, shadowOffset); + } else if (morph.isLoop) { // C-shaped slot with loop arrow symbol + morph.loop().setLabelColor(textColor, shadowColor, shadowOffset); + } + }); +}; + +SyntaxElementMorph.prototype.flash = function (aColor) { + if (!this.cachedNormalColor) { + this.cachedNormalColor = this.color; + this.setColor(aColor || this.activeHighlight); + } +}; + +SyntaxElementMorph.prototype.unflash = function () { + if (this.cachedNormalColor) { + var clr = this.cachedNormalColor; + this.cachedNormalColor = null; + this.setColor(clr); + } +}; + +SyntaxElementMorph.prototype.doWithAlpha = function (alpha, callback) { + var current = SyntaxElementMorph.prototype.alpha, + result; + SyntaxElementMorph.prototype.alpha = alpha; + result = callback(); + SyntaxElementMorph.prototype.alpha = current; + return result; +}; + +// SyntaxElementMorph zebra coloring + +SyntaxElementMorph.prototype.fixBlockColor = function ( + nearestBlock, + isForced +) { + this.children.forEach(morph => { + if (morph instanceof SyntaxElementMorph) { + morph.fixBlockColor(nearestBlock, isForced); + } + }); +}; + +// SyntaxElementMorph label parts: + +SyntaxElementMorph.prototype.labelPart = function (spec) { + var part, info, tokens, cnts, i; + if (spec[0] === '%' && + spec.length > 1 && + (this.selector !== 'reportGetVar' || + (spec === '%turtleOutline' && this.isObjInputFragment()))) { + + // check for variable multi-arg-slot: + if ((spec.length > 5) && (spec.slice(0, 5) === '%mult')) { + part = new MultiArgMorph(spec.slice(5)); + part.addInput(); + return part; + } + + // single-arg and specialized multi-arg slots: + + // look up the spec + info = this.labelParts[spec]; + if (!info) { + throw new Error('label part spec not found: "' + spec + '"'); + } + + // create the morph + switch (info.type) { + case 'input': + part = new InputSlotMorph(null, null, info.menu); + part.onSetContents = info.react || null; + break; + case 'text entry': + part = new TextSlotMorph(); + break; + case 'slot': + part = new ArgMorph(info.kind); + break; + case 'boolean': + part = new BooleanSlotMorph(); + break; + case 'symbol': + part = new BlockSymbolMorph(info.name); + part.size = this.fontSize * (info.scale || 1); + part.color = info.color || WHITE; + part.shadowColor = this.color.darker(this.labelContrast); + part.shadowOffset = MorphicPreferences.isFlat ? + ZERO : this.embossing; + part.fixLayout(); + break; + case 'c': + part = new CSlotMorph(); + break; + case 'command slot': + part = new CommandSlotMorph(); + break; + case 'ring': + part = new RingMorph(); + part.color = SpriteMorph.prototype.blockColor.other; + part.selector = info.selector; + part.setSpec(info.spec); + part.isDraggable = true; + break; + case 'ring slot': + switch (info.kind) { + case 'command': + part = new RingCommandSlotMorph(); + break; + case 'reporter': + part = new RingReporterSlotMorph(); + break; + case 'predicate': + part = new RingReporterSlotMorph(true); + break; + default: + throw new Error('unknown ring kind: "' + info.kind + '"'); + } + break; + case 'template': + part = new TemplateSlotMorph(info.label); + break; + case 'color': + part = new ColorSlotMorph(); + break; + case 'break': + part = new Morph(); + part.setExtent(ZERO); + part.isBlockLabelBreak = true; + part.getSpec = () => '%br'; + break; + case 'variable': + part = new TemplateSlotMorph(info.label); + part = new ReporterBlockMorph(); + part.category = 'variables'; + part.color = SpriteMorph.prototype.blockColor.variables; + part.setSpec(localize('Input name')); + break; + case 'multi': + part = new MultiArgMorph( + info.slots, + info.label, + info.min || 0, + spec, + null, null, null, null, null, + info.infix, + info.collapse, + info.dflt, + info.group + ); + part.maxInputs = info.max; + for (i = 0; i < info.defaults || 0; i += 1) { + part.addInput(); + } + break; + default: + throw new Error('unknown label part type: "' + info.type + '"'); + } + + // apply the tags + // --------------- + // input: numeric, alphanum, read-only, unevaluated, landscape, static + // text entry: monospace + // boolean: unevaluated, static + // symbol: static, fading, protected + // c: loop, static, lambda + // command slot: (none) + // ring: static + // ring slot: static + // template: (none) + // color: static + // break: (none) + // variable: (none) + // multi: widget + + if (info.tags) { + info.tags.split(' ').forEach(tag => { + if (tag) { + switch (tag) { + case 'numeric': + part.isNumeric = true; + break; + case 'alphanum': + part.isNumeric = true; + part.isAlphanumeric = true; + break; + case 'read-only': + part.isReadOnly = true; + if (!MorphicPreferences.isFlat) { + // addjust initial dimensions + cnts = part.contents(); + cnts.shadowOffset = new Point(1, 1); + cnts.fixLayout(); + } + break; + case 'unevaluated': + part.isUnevaluated = true; + break; + case 'static': + part.isStatic = true; + break; + case 'landscape': + part.minWidth = part.height() * 1.7; + break; + case 'monospace': + part.contents().fontName = 'monospace'; + part.contents().fontStyle = 'monospace'; + break; + case 'fading': + part.isFading = true; + break; + case 'protected': + part.isProtectedLabel = true; + break; + case 'loop': + part.isLoop = true; + part.add(this.labelPart('%loopArrow')); + break; + case 'lambda': + part.isLambda = true; + break; + case 'widget': + part.canBeEmpty = false; + break; + default: + throw new Error( + 'unknown label part tag: "' + tag + '"' + ); + } + } + }); + part.fixLayout(); + } + + // apply the default value + // ----------------------- + // only for input slots and Boolean inputs, + // and only for rare exceptions where we cannot + // specify the default values in the block specs, + // e.g. for expandable "reeiver" slots in "broadcast" + + if (!isNil(info.value)) { + part.setContents(info.value); + } + + } else if (spec[0] === '$' && + spec.length > 1 && + this.selector !== 'reportGetVar') { + + // allow GUI symbols as label icons + // usage: $symbolName[-size-r-g-b], size and color values are optional + // If there isn't a symbol under that name, it just styles whatever is + // after "$", so you can add unicode icons to your blocks, for example + // ☺️ + tokens = spec.slice(1).split('-'); + if (!contains(SymbolMorph.prototype.names, tokens[0])) { + part = new StringMorph(tokens[0]); + part.fontName = this.labelFontName; + part.fontStyle = this.labelFontStyle; + part.fontSize = this.fontSize * (+tokens[1] || 1); + } else { + part = new BlockSymbolMorph(tokens[0]); + part.size = this.fontSize * (+tokens[1] || 1.2); + } + part.color = new Color( + +tokens[2] === 0 ? 0 : +tokens[2] || 255, + +tokens[3] === 0 ? 0 : +tokens[3] || 255, + +tokens[4] === 0 ? 0 : +tokens[4] || 255 + ); + part.isProtectedLabel = tokens.length > 2; // zebra colors + part.shadowColor = this.color.darker(this.labelContrast); + part.shadowOffset = MorphicPreferences.isFlat ? + ZERO : this.embossing; + part.fixLayout(); + } else { + part = new BlockLabelMorph( + spec, // text + this.fontSize, // fontSize + this.labelFontStyle, // fontStyle + true, // bold + false, // italic + false, // isNumeric + MorphicPreferences.isFlat ? + ZERO : this.embossing, // shadowOffset + this.color.darker(this.labelContrast), // shadowColor + WHITE, // color + this.labelFontName // fontName + ); + + } + return part; +}; + +SyntaxElementMorph.prototype.isObjInputFragment = function () { + // private - for displaying a symbol in a variable block template + return (this.selector === 'reportGetVar') && + (this.getSlotSpec() === '%t') && + (this.parent.fragment.type === '%obj'); +}; + +// SyntaxElementMorph layout: + +SyntaxElementMorph.prototype.fixLayout = function () { + var nb, + parts = this.parts(), + pos = this.position(), + x = 0, + y, + lineHeight = 0, + maxX = 0, + blockWidth = this.minWidth, + blockHeight, + l = [], + lines = [], + space = this.isPrototype ? + 1 : Math.floor(fontHeight(this.fontSize) / 3), + ico = this instanceof BlockMorph && this.hasLocationPin() ? + this.methodIconExtent().x + space : 0, + bottomCorrection, + rightCorrection = 0, + rightMost, + hasLoopCSlot = false, + hasLoopArrow = false; + + if ((this instanceof MultiArgMorph) && (this.slotSpec !== '%cs')) { + blockWidth += this.arrows().width(); + } else if (this instanceof ReporterBlockMorph) { + blockWidth += (this.rounding * 2) + (this.edge * 2); + } else { + blockWidth += (this.corner * 4) + + (this.edge * 2) + + (this.inset * 3) + + this.dent; + } + + if (this.nextBlock) { + nb = this.nextBlock(); + } + + // determine lines + parts.forEach(part => { + if ((part instanceof CSlotMorph) || + (part instanceof MultiArgMorph && part.slotSpec.includes('%cs')) + ) { + if (l.length > 0) { + lines.push(l); + lines.push([part]); + l = []; + x = 0; + } else { + lines.push([part]); + } + } else if (this.isVertical() && !(part instanceof FrameMorph)) { + // variadic ring-inputs are arranged vertically + // except the arrows for expanding and collapsing them + if (l.length > 0) { + lines.push(l); + } + if (part.isVisible) { // ignore hidden collapse labels + l = [part]; + x = part.fullBounds().width() + space; + } + } else { + if (part.isVisible) { + x += part.fullBounds().width() + space; + } + if ((x > this.labelWidth) || part.isBlockLabelBreak) { + if (l.length > 0) { + lines.push(l); + l = []; + x = part.fullBounds().width() + space; + } + } + l.push(part); + if (part.isBlockLabelBreak) { + x = 0; + } + } + }); + if (l.length > 0) { + lines.push(l); + } + + // distribute parts on lines + if (this instanceof CommandBlockMorph) { + y = this.top() + this.corner + this.edge; + if (this instanceof HatBlockMorph) { + y += this.hatHeight; + } + } else if (this instanceof ReporterBlockMorph) { + y = this.top() + (this.edge * 2); + } else if (this instanceof MultiArgMorph + || this instanceof ArgLabelMorph) { + y = this.top(); + if (this.slotSpec === '%cs' && this.inputs().length > 0) { + y -= this.rounding; + } + } + lines.forEach(line => { + if (hasLoopCSlot) { + hasLoopArrow = true; + hasLoopCSlot = false; + } + x = this.left() + ico + this.edge + this.labelPadding; + if (this instanceof RingMorph) { + x = this.left() + space; //this.labelPadding; + } else if (this.isPredicate) { + x = this.left() + ico + this.rounding; + } else if (this instanceof MultiArgMorph || + this instanceof ArgLabelMorph + ) { + x = this.left(); + } + y += lineHeight; + lineHeight = 0; + line.forEach(part => { + if (part.isLoop) { + hasLoopCSlot = true; + } + if (part instanceof CSlotMorph) { + x -= this.labelPadding; + if (this.isPredicate) { + x = this.left() + ico + this.rounding; + } + part.setColor(this.color); + part.setPosition(new Point(x, y)); + lineHeight = part.height(); + } else if (part instanceof MultiArgMorph && + (part.slotSpec.includes('%cs')) + ) { + if (this.isPredicate) { + x += this.corner; + } + part.setPosition(new Point(x, y)); + lineHeight = part.height(); + maxX = Math.max( + maxX, + Math.max(...part.children.filter(each => + each.isVisible && + !(each instanceof CSlotMorph) + ).map(each => each.right())) + ); + } else { + part.setPosition(new Point(x, y)); + if (!part.isBlockLabelBreak) { + if (part.slotSpec === '%c' || part.slotSpec === '%loop') { + x += part.width(); + } else if (part.isVisible) { + x += part.fullBounds().width() + space; + } + } + maxX = Math.max(maxX, x); + lineHeight = Math.max( + lineHeight, + part instanceof StringMorph ? + part.rawHeight() : part.height() + ); + } + }); + + // adjust label row below a loop-arrow C-slot to accomodate the loop icon + if (hasLoopArrow) { + x += this.fontSize * 1.5; + maxX = Math.max(maxX, x); + hasLoopArrow = false; + } + + // center parts vertically on each line: + line.forEach(part => { + part.moveBy(new Point( + 0, + Math.floor((lineHeight - part.height()) / 2) + )); + }); + }); + + // determine my height: + y += lineHeight; + if (this.children.some(any => any instanceof CSlotMorph)) { + bottomCorrection = this.bottomPadding; + rightMost = this.inputs()[this.inputs().length - 1]; + if (rightMost instanceof MultiArgMorph) { + bottomCorrection = -this.bottomPadding; + if (rightMost.slotSpec.includes('%cs')) { + if (rightMost.inputs().length) { + bottomCorrection -= this.bottomPadding; + } else { + bottomCorrection += this.bottomPadding / 4; + } + } + } + if (this instanceof ReporterBlockMorph && !this.isPredicate) { + bottomCorrection = Math.max( + this.bottomPadding, + this.rounding - this.bottomPadding + ); + } + y += bottomCorrection; + } + if (this instanceof CommandBlockMorph) { + blockHeight = y - this.top() + (this.corner * 2); + } else if (this instanceof ReporterBlockMorph) { + blockHeight = y - this.top() + (this.edge * 2); + } else if (this instanceof MultiArgMorph + || this instanceof ArgLabelMorph) { + blockHeight = y - this.top(); + } + + // determine my width: + if (this.isPredicate) { + blockWidth = Math.max( + blockWidth, + maxX - this.left() + this.rounding + ); + rightCorrection = space; + } else if ((this instanceof MultiArgMorph && this.slotSpec !== '%cs') + || this instanceof ArgLabelMorph) { + blockWidth = Math.max( + blockWidth, + maxX - this.left() - space + ); + } else { + blockWidth = Math.max( + blockWidth, + maxX - this.left() + this.labelPadding - this.edge + ); + rightCorrection = space; + } + + // adjust right padding if rightmost input has arrows + rightMost = parts[parts.length - 1]; + if (rightMost instanceof MultiArgMorph && rightMost.isVisible && + (lines.length === 1)) { + blockWidth -= rightCorrection; + } + + // adjust width to hat width + if (this instanceof HatBlockMorph) { + blockWidth = Math.max(blockWidth, this.hatWidth * 1.5); + } + + // set my extent (silently, because we'll redraw later anyway): + this.bounds.setWidth(blockWidth); + this.bounds.setHeight(blockHeight); + + // adjust CSlots and collect holes + this.holes = []; + parts.forEach(part => { + var adjustMultiWidth = 0; + if (part instanceof CSlotMorph || + (part.slotSpec && part.slotSpec.includes('%cs')) + ) { + if (this.isPredicate) { + part.bounds.setWidth( + blockWidth - + ico - + this.rounding - + this.inset - + this.corner + ); + adjustMultiWidth = this.corner; + } else { + part.bounds.setWidth(blockWidth - this.edge - ico); + adjustMultiWidth = this.corner + this.edge; + } + if (part.fixLoopLayout) { + part.fixLoopLayout(); + } + } + if (part instanceof MultiArgMorph && part.slotSpec.includes('%cs')) { + part.inputs().filter(each => + each instanceof CSlotMorph + ).forEach(slot => + slot.bounds.setWidth( + part.right() - slot.left() - adjustMultiWidth + ) + ); + } + part.fixHolesLayout(); + this.holes.push.apply( + this.holes, + part.holes.map( hole => + hole.translateBy(part.position().subtract(pos)) + ) + ); + }); + + // position next block: + if (nb) { + nb.setPosition( + new Point( + this.left(), + this.bottom() - (this.corner) + ) + ); + } + + // find out if one of my parents needs to be fixed + if (this instanceof BlockMorph && this.parent && this.parent.fixLayout) { + this.parent.fixLayout(); + this.parent.changed(); + if (this.parent instanceof SyntaxElementMorph) { + return; + } + } + + this.fixHighlight(); +}; + +SyntaxElementMorph.prototype.fixHighlight = function () { + var top = this.topBlock(); + if (top.getHighlight && top.getHighlight()) { + top.addHighlight(top.removeHighlight()); + } +}; + +SyntaxElementMorph.prototype.methodIconExtent = function () { + // answer the span of the icon for the "local method" indicator + var ico = this.fontSize * 1.2; + return this.hasLocationPin() ? new Point(ico * 0.66, ico) + : new Point(0, 0); +}; + +SyntaxElementMorph.prototype.isVertical = function () { + // control layout rule of variadic inputs, default is false + return false; +}; + +// SyntaxElementMorph evaluating: + +SyntaxElementMorph.prototype.evaluate = function () { + // responsibility of my children, default is to answer null + return null; +}; + +SyntaxElementMorph.prototype.isEmptySlot = function () { + // responsibility of my children, default is to answer false + return false; +}; + +// SyntaxElementMorph speech bubble feedback: + +SyntaxElementMorph.prototype.showBubble = function (value, exportPic, target) { + var bubble, + txt, + img, + morphToShow, + isClickable = true, + ide = this.parentThatIsA(IDE_Morph) || target.parentThatIsA(IDE_Morph), + anchor = this, + pos = this.rightCenter().add(new Point(2, 0)), + sf = this.parentThatIsA(ScrollFrameMorph), + wrrld = this.world() || target.world(); + + if ((value === undefined) || !wrrld) { + return null; + } + if (value instanceof ListWatcherMorph) { + morphToShow = value; + morphToShow.update(true); + morphToShow.step = value.update; + morphToShow.isDraggable = false; + morphToShow.expand(this.parentThatIsA(ScrollFrameMorph).extent()); + isClickable = true; + } else if (value instanceof TableFrameMorph) { + morphToShow = value; + morphToShow.isDraggable = false; + morphToShow.expand(this.parentThatIsA(ScrollFrameMorph).extent()); + isClickable = true; + } else if (value instanceof Morph) { + if (isSnapObject(value)) { + img = value.thumbnail(new Point(40, 40)); + morphToShow = new Morph(); + morphToShow.isCachingImage = true; + morphToShow.bounds.setWidth(img.width); + morphToShow.bounds.setHeight(img.height); + morphToShow.cachedImage = img; + morphToShow.version = value.version; + morphToShow.step = function () { + if (this.version !== value.version) { + img = value.thumbnail(new Point(40, 40)); + this.cachedImage = img; + this.version = value.version; + this.changed(); + } + }; + } else { + img = value.fullImage(); + morphToShow = new Morph(); + morphToShow.isCachingImage = true; + morphToShow.bounds.setWidth(img.width); + morphToShow.bounds.setHeight(img.height); + morphToShow.cachedImage = img; + } + } else if (value instanceof Costume) { + img = value.thumbnail(new Point(40, 40)); + morphToShow = new Morph(); + morphToShow = new Morph(); + morphToShow.isCachingImage = true; + morphToShow.bounds.setWidth(img.width); + morphToShow.bounds.setHeight(img.height); + morphToShow.cachedImage = img; + + // support costumes to be dragged out of result bubbles: + morphToShow.isDraggable = !SpriteMorph.prototype.disableDraggingData; + + morphToShow.selectForEdit = function () { + var cst = value.copy(), + icon, + prepare; + + cst.name = ide.currentSprite.newCostumeName(cst.name); + icon = new CostumeIconMorph(cst); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + icon.setCenter(this.center()); + return icon; + }; + + // support exporting costumes directly from result bubbles: + morphToShow.userMenu = function () { + var menu = new MenuMorph(this); + menu.addItem( + 'export', + () => { + if (value instanceof SVG_Costume) { + // don't show SVG costumes in a new tab (shows text) + ide.saveFileAs( + value.contents.src, + 'text/svg', + value.name + ); + } else { // rasterized Costume + ide.saveCanvasAs(value.contents, value.name); + } + } + ); + return menu; + }; + + } else if (value instanceof Sound) { + morphToShow = new SymbolMorph('notes', 30); + + // support sounds to be dragged out of result bubbles: + morphToShow.isDraggable = !SpriteMorph.prototype.disableDraggingData; + + morphToShow.selectForEdit = function () { + var snd = value.copy(), + icon, + prepare; + + snd.name = ide.currentSprite.newSoundName(snd.name); + icon = new SoundIconMorph(snd); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + icon.setCenter(this.center()); + return icon; + }; + + // support exporting sounds directly from result bubbles: + morphToShow.userMenu = function () { + var menu = new MenuMorph(this); + menu.addItem( + 'export', + () => ide.saveAudioAs(value.audio, value.name) + ); + return menu; + }; + + } else if (value instanceof Context) { + img = value.image(); + morphToShow = new Morph(); + morphToShow.isCachingImage = true; + morphToShow.bounds.setWidth(img.width); + morphToShow.bounds.setHeight(img.height); + morphToShow.cachedImage = img; + morphToShow.version = value.version; + morphToShow.step = function () { + if (this.version !== value.version) { + img = value.image(); + this.cachedImage = img; + this.version = value.version; + this.changed(); + } + }; + + // support blocks to be dragged out of result bubbles: + morphToShow.isDraggable = !SpriteMorph.prototype.disableDraggingData; + + morphToShow.selectForEdit = function () { + var script = value.toUserBlock(), + prepare = script.prepareToBeGrabbed; + + script.prepareToBeGrabbed = function (hand) { + prepare.call(this, hand); + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + script.setPosition(this.position()); + return script; + }; + } else if (typeof value === 'boolean') { + morphToShow = SpriteMorph.prototype.booleanMorph.call( + null, + value + ); + } else if (isString(value)) { + txt = value.length > 500 ? value.slice(0, 500) + '...' : value; + morphToShow = new TextMorph( + txt, + this.fontSize + ); + + // support exporting text / numbers directly from result bubbles: + morphToShow.userMenu = function () { + var menu = new MenuMorph(this); + menu.addItem( + 'export', + () => ide.saveFileAs( + value, + 'text/plain;charset=utf-8', + localize('data') + ) + ); + return menu; + }; + + } else if (value === null) { + morphToShow = new TextMorph( + '', + this.fontSize + ); + } else if (value === 0) { + morphToShow = new TextMorph( + '0', + this.fontSize + ); + } else if (value.toString) { + return this.showBubble( + value.toString(), + exportPic, + target + ); + } + if (ide && (ide.currentSprite !== target)) { + if (target instanceof StageMorph) { + anchor = ide.corral.stageIcon; + } else if (target) { + if (target.isTemporary) { + target = detect( + target.allExemplars(), + each => !each.isTemporary + ); + } + anchor = detect( + ide.corral.frame.contents.children, + icon => icon.object === target + ); + } else { + target = ide; + } + pos = anchor.center(); + } + bubble = new SpeechBubbleMorph( + morphToShow, + null, + Math.max(this.rounding - 2, 6), + 0 + ); + bubble.popUp( + wrrld, + pos, + isClickable + ); + if (exportPic) { + this.exportPictureWithResult(bubble); + } + if (anchor instanceof SpriteIconMorph) { + bubble.keepWithin(ide.corral); + } else if (sf) { + bubble.keepWithin(sf); + } +}; + +SyntaxElementMorph.prototype.exportPictureWithResult = function (aBubble) { + var ide = this.parentThatIsA(IDE_Morph) || + this.parentThatIsA(BlockEditorMorph).target.parentThatIsA( + IDE_Morph + ), + scr = this.fullImage(), + bub = aBubble.fullImage(), + taller = Math.max(0, bub.height - scr.height), + pic = newCanvas(new Point( + scr.width + bub.width + 2, + scr.height + taller + )), + ctx = pic.getContext('2d'); + ctx.drawImage(scr, 0, pic.height - scr.height); + ctx.drawImage(bub, scr.width + 2, 0); + // request to open pic in new window. + + ide.saveFileAs( + embedMetadataPNG(pic, this.toXMLString()), + 'image/png', + (ide.getProjectName() || localize('untitled')) + ' ' + + localize('script pic') + ); +}; + +// SyntaxElementMorph code mapping + +/* + code mapping lets you use blocks to generate arbitrary text-based + source code that can be exported and compiled / embedded elsewhere, + it's not part of Snap's evaluator and not needed for Snap itself +*/ + +SyntaxElementMorph.prototype.mappedCode = function (definitions) { + var result = this.evaluate(); + if (result instanceof BlockMorph) { + return result.mappedCode(definitions); + } + return result; +}; + +SyntaxElementMorph.prototype.elementsAtLOC = function (definitions) { + // return an Array indicating which syntax elements are codified at which + // line of textual code applying the current mapping + var result = this.evaluate(); + if (result instanceof BlockMorph) { + return result.elementsAtLOC(definitions); + } + return [[this]]; +}; + +// BlockLabelMorph /////////////////////////////////////////////// + +/* + I am a piece of single-line text written on a block. I serve as a + container for sharing typographic attributes among my instances +*/ + +// BlockLabelMorph inherits from StringMorph: + +BlockLabelMorph.prototype = new StringMorph(); +BlockLabelMorph.prototype.constructor = BlockLabelMorph; +BlockLabelMorph.uber = StringMorph.prototype; + +function BlockLabelMorph( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName +) { + this.init( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName + ); +} + +BlockLabelMorph.prototype.getRenderColor = function () { + var block = this.parentThatIsA(BlockMorph); + if (MorphicPreferences.isFlat) { + return !block || block.alpha > 0.5 ? this.color + : block.color.solid().darker(Math.max(block.alpha * 200, 0.1)); + } + return !block || block.alpha > 0.5 ? this.color + : block.color.solid().lighter(Math.max(block.alpha * 200, 0.1)); + +}; + +BlockLabelMorph.prototype.getShadowRenderColor = function () { + var block = this.parentThatIsA(BlockMorph); + return (block && block.alpha > 0.5) ? + this.shadowColor + : CLEAR; +}; + +// BlockSymbolMorph ////////////////////////////////////////////////////////// + +/* + I am a pictogram written on a block. I serve as a + container for sharing typographic attributes among my instances. + NOTE: I have an additional attribute ".isFading" that governs + my behavior when fading out the blocks I'm embedded in +*/ + +// BlockSymbolMorph inherits from SymbolMorph: + +BlockSymbolMorph.prototype = new SymbolMorph(); +BlockSymbolMorph.prototype.constructor = BlockSymbolMorph; +BlockSymbolMorph.uber = SymbolMorph.prototype; + +function BlockSymbolMorph(name, size, color, shadowOffset, shadowColor) { + this.init(name, size, color, shadowOffset, shadowColor); +} + +BlockSymbolMorph.prototype.getRenderColor = function () { + var block = this.parentThatIsA(BlockMorph); + if (MorphicPreferences.isFlat) { + if (this.isFading) { + return this.color.mixed(block.alpha, WHITE); + } + if (this.color.eq(WHITE)) { + return block.alpha > 0.5 ? this.color + : block.color.solid().darker(Math.max(block.alpha * 200, 0.1)); + } + if (this.color.eq(BLACK)) { + return block.alpha > 0.5 ? this.color + : block.color.solid().darker(Math.max(block.alpha * 200, 0.1)); + } + return this.color; + } + if (this.isFading) { + return this.color.mixed( + block.alpha, + SpriteMorph.prototype.paletteColor + ); + } + if (this.color.eq(BLACK)) { + return block.alpha > 0.5 ? this.color + : block.color.solid().lighter(Math.max(block.alpha * 200, 0.1)); + } + if (this.color.eq(WHITE)) { + return block.alpha > 0.5 ? this.color + : block.color.solid().lighter(Math.max(block.alpha * 200, 0.1)); + } + return this.color; +}; + +BlockSymbolMorph.prototype.getShadowRenderColor = + BlockLabelMorph.prototype.getShadowRenderColor; + +// BlockMorph ////////////////////////////////////////////////////////// + +/* + I am an abstraction of all blocks (commands, reporters, hats). + + Aside from the visual settings inherited from Morph and + SyntaxElementMorph my most important attributes and public + accessors are: + + selector - (string) name of method to be triggered + scriptTarget() - answer the object (sprite) to which I apply + inputs() - answer an array with my arg slots and nested reporters + defaults - an optional Array containing default input values + topBlock() - answer the top block of the stack I'm attached to + blockSpec - a formalized description of my label parts + setSpec() - force me to change my label structure + evaluate() - answer the result of my evaluation + isUnevaluated() - answer whether I am part of a special form + + Zebra coloring provides a mechanism to alternate brightness of nested, + same colored blocks (of the same category). The deviation of alternating + brightness is set in the preferences setting: + + zebraContrast - percentage of brightness deviation + + attribute. If the attribute is set to zero, zebra coloring is turned + off. If it is a positive number, nested blocks will be colored in + a brighter shade of the same hue and the label color (for texts) + alternates between white and black. If the attribute is set to a negative + number, nested blocks are colored in a darker shade of the same hue + with no alternating label colors. + + Note: Some of these methods are inherited from SyntaxElementMorph + for technical reasons, because they are shared among Block and + MultiArgMorph (e.g. topBlock()). + + blockSpec is a formatted string consisting of plain words and + reserved words starting with the percent character (%), which + represent the following pre-defined input slots and/or label + features: + + arity: single + + %br - user-forced line break + %s - white rectangular type-in slot ("string-type") + %txt - white rectangular type-in slot ("text-type") + %mlt - white rectangular type-in slot ("multi-line-text-type") + %code - white rectangular type-in slot, monospaced font + %n - white roundish type-in slot ("numerical") + %dir - white roundish type-in slot with drop-down for directions + %inst - white roundish type-in slot with drop-down for instruments + %ida - white roundish type-in slot with drop-down for list indices + %idx - white roundish type-in slot for indices incl. "random" + %dim - white roundish type-in slot for dimensinos incl. "current" + %obj - specially drawn slot for object reporters + %rel - chameleon colored rectangular drop-down for relation options + %spr - chameleon colored rectangular drop-down for object-names + %col - chameleon colored rectangular drop-down for collidables + %dst - chameleon colored rectangular drop-down for distances + %cst - chameleon colored rectangular drop-down for costume-names + %eff - chameleon colored rectangular drop-down for graphic effects + %snd - chameleon colored rectangular drop-down for sound names + %key - chameleon colored rectangular drop-down for keyboard keys + %msg - chameleon colored rectangular drop-down for messages + %att - chameleon colored rectangular drop-down for attributes + %fun - chameleon colored rectangular drop-down for math functions + %typ - chameleon colored rectangular drop-down for data types + %var - chameleon colored rectangular drop-down for variable names + %shd - Chameleon colored rectuangular drop-down for shadowed var names + %b - chameleon colored hexagonal slot (for predicates) + %bool - chameleon colored hexagonal slot (for predicates), static + %l - list icon + %c - C-shaped command slot, special form for primitives + %loop - C-shaped with loop arrow, special form for certain primitives + %ca - C-shaped with loop arrow, for custom blocks + %cs - C-shaped, auto-reifying, accepts reporter drops + %cl - C-shaped, auto-reifying, rejects reporters + %cla - C-shaped with loop arrows, auto-reifying, rejects reporters + %clr - interactive color slot + %t - inline variable reporter template + %anyUE - white rectangular type-in slot, unevaluated if replaced + %boolUE - chameleon colored hexagonal slot, unevaluated if replaced + %f - round function slot, unevaluated if replaced, + %r - round reporter slot + %p - hexagonal predicate slot + %vid - chameleon colored rectangular drop-down for video modes + %scn - chameleon colored rectangular drop-down for scene names + + rings: + + %cmdRing - command slotted ring with %ringparms + %repRing - round slotted ringn with %ringparms + %predRing - diamond slotted ring with %ringparms + + arity: multiple + + %mult%x - where %x stands for any of the above single inputs + %inputs - for an additional text label 'with inputs' + %words - for an expandable list of default 2 (used in JOIN) + %lists - for an expandable list of default 2 lists (CONCAT) + %exp - for a static expandable list of minimum 0 (used in LIST) + %scriptVars - for an expandable list of variable reporter templates + %parms - for an expandable list of formal parameters + %ringparms - the same for use inside Rings + + special form: upvar + + %upvar - same as %t (inline variable reporter template) + + special form: input name + + %inputName - variable blob (used in input type dialog) + + examples: + + 'if %b %c else %c' - creates Scratch's If/Else block + 'set pen color to %clr' - creates Scratch's Pen color block + 'list %mult%s' - creates BYOB's list reporter block + 'call %n %inputs' - creates BYOB's Call block + 'the script %parms %c' - creates BYOB's THE SCRIPT block +*/ + +// BlockMorph inherits from SyntaxElementMorph: + +BlockMorph.prototype = new SyntaxElementMorph(); +BlockMorph.prototype.constructor = BlockMorph; +BlockMorph.uber = SyntaxElementMorph.prototype; + +// BlockMorph preferences settings: + +BlockMorph.prototype.isCachingInputs = true; +BlockMorph.prototype.zebraContrast = 40; // alternating color brightness + +// BlockMorph sound feedback: + +BlockMorph.prototype.snapSound = null; + +BlockMorph.prototype.toggleSnapSound = function () { + if (this.snapSound !== null) { + this.snapSound = null; + } else { + BlockMorph.prototype.snapSound = document.createElement('audio'); + BlockMorph.prototype.snapSound.src = 'src/click.wav'; + } + CommentMorph.prototype.snapSound = BlockMorph.prototype.snapSound; +}; + +// BlockMorph instance creation: + +function BlockMorph() { + this.init(); +} + +BlockMorph.prototype.init = function () { + this.selector = null; // name of method to be triggered + this.blockSpec = ''; // formal description of label and arguments + this.comment = null; // optional "sticky" comment morph + + // not to be persisted: + this.instantiationSpec = null; // spec to set upon fullCopy() of template + this.category = null; // for zebra coloring (non persistent) + this.isCorpse = false; // marked for deletion fom a custom block definition + + BlockMorph.uber.init.call(this); + this.color = new Color(102, 102, 102); + this.cachedInputs = null; +}; + +BlockMorph.prototype.scriptTarget = function (noError) { + // answer the sprite or stage that this block acts on, + // if the user clicks on it. + // NOTE: since scripts can be shared by more than a single sprite + // this method only gives the desired result within the context of + // the user actively clicking on a block inside the IDE + // there is no direct relationship between a block and a sprite. + var scripts = this.parentThatIsA(ScriptsMorph), + ide, dlg; + if (scripts) { + return scripts.scriptTarget(); + } + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + return ide.currentSprite; + } + dlg = this.parentThatIsA(DialogBoxMorph); + if (dlg) { + if (isSnapObject(dlg.target)) { + return dlg.target; + } + if (dlg.target instanceof IDE_Morph) { + return dlg.target.currentSprite; + } + } + if (noError) {return null; } + throw new Error('script target cannot be found for orphaned block'); +}; + +BlockMorph.prototype.toString = function () { + return 'a ' + + (this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]) + + ' ("' + + this.blockSpec.slice(0, 30) + '...")'; +}; + +// BlockMorph spec: + +BlockMorph.prototype.parseSpec = function (spec) { + var result = [], + words, + word = ''; + + words = isString(spec) ? spec.split(' ') : []; + if (words.length === 0) { + words = [spec]; + } + if (this.labelWordWrap) { + return words; + } + + function addWord(w) { + if ((w[0] === '%') && (w.length > 1)) { + if (word !== '') { + result.push(word); + word = ''; + } + result.push(w); + } else { + if (word !== '') { + word += ' ' + w; + } else { + word = w; + } + } + } + + words.forEach(each => addWord(each)); + if (word !== '') { + result.push(word); + } + return result; +}; + +BlockMorph.prototype.setSpec = function (spec, definition) { + var part, + inputIdx = -1; + + if (!spec) {return; } + this.parts().forEach(part => + part.destroy() + ); + if (this.isPrototype) { + this.add(this.placeHolder()); + } + this.parseSpec(spec).forEach((word, idx, arr) => { + if (word[0] === '%' && (word !== '%br')) { + inputIdx += 1; + } + part = this.labelPart(word); + if (isNil(part)) { + // console.log('could not create label part', word); + return; + } + this.add(part); + if (!(part instanceof CommandSlotMorph || + part instanceof StringMorph)) { + part.fixLayout(); + part.rerender(); + } + if (part instanceof RingMorph) { + part.fixBlockColor(); + } + if (part instanceof MultiArgMorph || + part.constructor === CommandSlotMorph || + part.constructor === RingCommandSlotMorph) { + part.fixLayout(); + } + if (this.isPrototype) { + this.add(this.placeHolder()); + } + if (this.isCustomBlock) { + if (part instanceof InputSlotMorph) { + part.setChoices.apply( + part, + (definition || this.definition).inputOptionsOfIdx(inputIdx) + ); + } + if (part instanceof ArgMorph && + !(part instanceof TemplateSlotMorph)) { + part.isStatic = (definition + || this.definition).isIrreplaceableInputIdx(inputIdx); + part.canBeEmpty = !part.isStatic; + } + } + }); + this.blockSpec = spec; + this.fixLayout(); + this.rerender(); + this.cachedInputs = null; +}; + +BlockMorph.prototype.userSetSpec = function (spec) { + var tb = this.topBlock(), + old = this.abstractBlockSpec(); + tb.fullChanged(); + this.setSpec(spec); + tb.fullChanged(); + tb.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'label', + old, + this.abstractBlockSpec() + ); +}; + +BlockMorph.prototype.buildSpec = function () { + // create my blockSpec from my parts - for demo purposes only + this.blockSpec = ''; + this.parts().forEach(part => { + if (part instanceof StringMorph) { + this.blockSpec += part.text; + } else if (part instanceof ArgMorph) { + this.blockSpec += part.getSpec(); + } else if (part.isBlockLabelBreak) { + this.blockSpec += part.getSpec(); + } else { + this.blockSpec += '[undefined]'; + } + this.blockSpec += ' '; + }); + this.blockSpec = this.blockSpec.trim(); +}; + +BlockMorph.prototype.rebuild = function (contrast) { + // rebuild my label fragments, for use in ToggleElementMorphs + this.setSpec(this.blockSpec); + if (contrast) { + this.inputs().forEach(input => { + if (input instanceof ReporterBlockMorph) { + input.setColor(input.color.lighter(contrast)); + input.setSpec(input.blockSpec); + } + }); + } +}; + +BlockMorph.prototype.abstractBlockSpec = function () { + // answer the semantic block spec substituting each input + // with an underscore. Used as "name" of the Block. + return this.parseSpec(this.blockSpec).map(str => + (str.length > 1 && (str[0]) === '%') ? '_' : str + ).join(' '); +}; + +BlockMorph.prototype.localizeBlockSpec = function (spec) { + // answer the translated block spec where the translation itself + // is in the form of an abstract spec, i.e. with padded underscores + // in place for percent-sign prefixed slot specs. + var slotSpecs = [], + slotCount = -1, + abstractSpec, + translation; + + abstractSpec = this.parseSpec(spec).map(str => { + if (str.length > 1 && (str[0]) === '%') { + slotSpecs.push(str); + return '_'; + } + return str; + }).join(' '); + + // make sure to also remove any explicit slot specs from the translation + translation = this.parseSpec(localize(abstractSpec)).map(str => + (str.length > 1 && (str[0]) === '%') ? '_' : str + ).join(' '); + + // replace abstract slot placeholders in the translation with their + // concrete specs from the original block spec + return translation.split(' ').map(word => { + if (word === '_') { + slotCount += 1; + return slotSpecs[slotCount] || ''; + } + return word; + }).join(' '); +}; + +// BlockMorph menu: + +BlockMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this), + world = this.world(), + myself = this, + hasLine = false, + proc = this.activeProcess(), + top = this.topBlock(), + vNames = proc && proc.context && proc.context.outerContext ? + proc.context.outerContext.variables.names() : [], + slot, + mult, + alternatives, + compiledAlternatives, + field, + rcvr; + + function addOption(label, toggle, test, onHint, offHint) { + menu.addItem( + [ + test ? new SymbolMorph( + 'checkedBox', + MorphicPreferences.menuFontSize * 0.75 + ) : new SymbolMorph( + 'rectangle', + MorphicPreferences.menuFontSize * 0.75 + ), + localize(label) + ], + toggle, + test ? onHint : offHint + ); + } + + function renameVar() { + var blck = myself.fullCopy(), + frag = myself.parent instanceof BlockInputFragmentMorph ? + myself.parent.fragment + : null; + blck.addShadow(); + + new DialogBoxMorph( + myself, + frag ? + newName => { + myself.userSetSpec(newName); + myself.instantiationSpec = newName; + myself.parent.fragment.labelString = newName; + } + : myself.userSetSpec, + myself + ).prompt( + "Variable name", + frag ? + frag.labelString + : myself.blockSpec, + world, + blck.doWithAlpha(1, () => blck.fullImage()), // pic + InputSlotMorph.prototype.getVarNamesDict.call(myself) + ); + } + + menu.addItem( + "help...", + 'showHelp' + ); + if (this.isTemplate) { + if (this.parent instanceof SyntaxElementMorph) { // in-line + if (this.selector === 'reportGetVar') { // script var definition + menu.addLine(); + menu.addItem( + 'rename...', + renameVar, + 'rename only\nthis reporter' + ); + menu.addItem( + 'rename all...', + 'refactorInlineTemplate', + 'rename all blocks that\naccess this variable' + ); + if (this.parent.parent instanceof MultiArgMorph && + this.parentThatIsA(ScriptsMorph)) { + // offer to insert / delete a variable slot + slot = this.parent; + mult = slot.parent; + menu.addLine(); + if (!mult.maxInputs || + (mult.inputs().length < mult.maxInputs)) { + if (!mult.is3ArgRingInHOF() || + mult.inputs().length < 3) { + menu.addItem( + 'insert a variable', + () => mult.insertNewInputBefore( + slot, + localize('variable') + ) + ); + } + } + if (mult.inputs().length > mult.minInputs) { + menu.addItem( + 'delete variable', + () => mult.deleteSlot(slot) + ); + } + } + } + } else { // in palette + if (this.selector === 'reportGetVar') { + rcvr = this.scriptTarget(); + if (this.isInheritedVariable(false)) { // fully inherited + addOption( + 'inherited', + () => rcvr.toggleInheritedVariable(this.blockSpec), + true, + 'uncheck to\ndisinherit', + null + ); + } else { // not inherited + if (this.isInheritedVariable(true)) { // shadowed + addOption( + 'inherited', + () => rcvr.toggleInheritedVariable( + this.blockSpec + ), + false, + null, + localize('check to inherit\nfrom') + + ' ' + rcvr.exemplar.name + ); + } + addOption( + 'transient', + 'toggleTransientVariable', + this.isTransientVariable(), + 'uncheck to save contents\nin the project', + 'check to prevent contents\nfrom being saved' + ); + menu.addLine(); + menu.addItem( + 'rename...', + 'refactorPaletteTemplate', + 'rename only\nthis reporter' + ); + menu.addItem( + 'rename all...', + () => this.refactorPaletteTemplate(true), // everywhere + 'rename all blocks that\naccess this variable' + ); + menu.addLine(); + menu.addItem( + 'delete', + () => rcvr.deleteVariable( + this.instantiationSpec || this.blockSpec, + !this.isLocalVarTemplate) + ); + } + } + + // allow toggling inheritable attributes + if (StageMorph.prototype.enableInheritance) { + rcvr = this.scriptTarget(); + field = { + xPosition: 'x position', + yPosition: 'y position', + direction: 'direction', + getScale: 'size', + getCostumeIdx: 'costume #', + getVolume: 'volume', + getPan: 'balance', + reportShown: 'shown?', + getPenDown: 'pen down?' + }[this.selector]; + if (field && rcvr && rcvr.exemplar) { + menu.addLine(); + addOption( + 'inherited', + () => rcvr.toggleInheritanceForAttribute(field), + rcvr.inheritsAttribute(field), + 'uncheck to\ndisinherit', + localize('check to inherit\nfrom') + + ' ' + rcvr.exemplar.name + ); + } + } + + if (StageMorph.prototype.enableCodeMapping) { + menu.addLine(); + menu.addItem( + 'header mapping...', + 'mapToHeader' + ); + menu.addItem( + 'code mapping...', + 'mapToCode' + ); + } + } + return menu; + } + menu.addLine(); + if (this.selector === 'reportGetVar') { + menu.addItem( + 'rename...', + renameVar, + 'rename only\nthis reporter' + ); + } else if (this.isCustomBlock && this.alternatives) { + alternatives = this.alternatives(); + if (alternatives.length > 0) { + menu.addItem( + 'relabel...', + () => this.relabel(alternatives) + ); + } + } else { + alternatives = (SpriteMorph.prototype.blockAlternatives[ + this.selector] || []).filter(sel => + StageMorph.prototype.hiddenPrimitives[sel] !== true); + if (alternatives.length > 0) { + menu.addItem( + 'relabel...', + () => this.relabel(alternatives) + ); + } + } + + // direct relabelling: + // - JIT-compile HOFs - experimental + // - vector pen trails + if ( + contains( + ['reportMap', 'reportKeep', 'reportFindFirst', 'reportCombine'], + this.selector + ) + ) { + compiledAlternatives = { + reportMap : 'reportAtomicMap', + reportKeep : 'reportAtomicKeep', + reportFindFirst: 'reportAtomicFindFirst', + reportCombine : 'reportAtomicCombine' + }; + menu.addItem( + 'compile', + () => this.setSelector(compiledAlternatives[this.selector]), + 'experimental!\nmake this reporter fast and uninterruptable\n' + + 'CAUTION: Errors in the ring\ncan break your Snap! session!' + ); + } else if ( + contains( + [ + 'reportAtomicMap', + 'reportAtomicKeep', + 'reportAtomicFindFirst', + 'reportAtomicCombine' + ], + this.selector + ) + ) { + compiledAlternatives = { + reportAtomicMap : 'reportMap', + reportAtomicKeep : 'reportKeep', + reportAtomicFindFirst: 'reportFindFirst', + reportAtomicCombine : 'reportCombine' + }; + menu.addItem( + 'uncompile', + () => this.setSelector(compiledAlternatives[this.selector]) + ); + } else if ( + contains( + ['reportPenTrailsAsCostume', 'reportPentrailsAsSVG'], + this.selector + ) + ) { + alternatives = { + reportPenTrailsAsCostume : 'reportPentrailsAsSVG', + reportPentrailsAsSVG : 'reportPenTrailsAsCostume' + }; + menu.addItem( + localize( + SpriteMorph.prototype.blocks[ + alternatives[this.selector] + ].spec + ), + () => { + this.setSelector(alternatives[this.selector]); + this.changed(); + } + ); + } + + menu.addItem( + "duplicate", + () => { + var dup = this.fullCopy(), + ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph); + dup.pickUp(world); + // register the drop-origin, so the block can + // slide back to its former situation if dropped + // somewhere where it gets rejected + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (ide) { + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + + this.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'duplicate', + this.abstractBlockSpec() + ); + } + }, + 'make a copy\nand pick it up' + ); + if (this instanceof CommandBlockMorph && this.nextBlock()) { + menu.addItem( + (proc ? this.fullCopy() : this).thumbnail(0.5, 60), + () => { + var cpy = this.fullCopy(), + nb = cpy.nextBlock(), + ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph); + if (nb) {nb.destroy(); } + cpy.pickUp(world); + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (ide) { + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + }, + 'only duplicate this block' + ); + menu.addItem( + 'extract', + 'userExtractJustThis', + 'only grab this block' + ); + } + menu.addItem( + "delete", + 'userDestroy' + ); + if (isNil(this.comment)) { + menu.addItem( + "add comment", + () => { + var comment = new CommentMorph(); + this.comment = comment; + comment.block = this; + comment.layoutChanged(); + + // Simulate drag/drop for better undo/redo behavior + var scripts = this.parentThatIsA(ScriptsMorph), + ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph); + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (ide) { + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + scripts.clearDropInfo(); + scripts.lastDropTarget = { element: this }; + scripts.lastDroppedBlock = comment; + scripts.recordDrop(world.hand.grabOrigin); + } + ); + } + menu.addLine(); + menu.addItem( + "script pic...", + () => { + var ide = this.parentThatIsA(IDE_Morph) || + this.parentThatIsA(BlockEditorMorph).target.parentThatIsA( + IDE_Morph), + xml = top instanceof PrototypeHatBlockMorph ? + ide.blocksLibraryXML( + [top.definition].concat( + top.definition.collectDependencies( + [], + [], + top.scriptTarget() + ) + ), + null, + true + ) + : top.toXMLString(); + ide.saveFileAs( + embedMetadataPNG(top.scriptPic(), xml), + 'image/png', + (ide.getProjectName() || localize('untitled')) + ' ' + + localize('script pic') + ); + }, + 'save a picture\nof this script' + ); + if (top instanceof ReporterBlockMorph || + (!(top instanceof PrototypeHatBlockMorph) && + top.allChildren().some((any) => any.selector === 'doReport')) + ) { + if (!ThreadManager.prototype.disableClickToRun) { + menu.addItem( + "result pic...", + () => top.exportResultPic(), + 'save a picture of both\nthis script and its result' + ); + } + } + if (top instanceof PrototypeHatBlockMorph) { + menu.addItem( + "export...", + () => top.exportBlockDefinition(), + 'including dependencies' + ); + } else { + menu.addItem( + 'export script', + () => top.exportScript(), + 'download this script\nas an XML file' + ); + } + if (proc) { + if (vNames.length) { + menu.addLine(); + vNames.forEach(vn => + menu.addItem( + vn + '...', + () => proc.doShowVar(vn) + ) + ); + } + proc.homeContext.variables.names().forEach(vn => { + if (!contains(vNames, vn)) { + menu.addItem( + vn + '...', + () => proc.doShowVar(vn) + ); + } + }); + return menu; + } + if (this.parent.parentThatIsA(RingMorph)) { + menu.addLine(); + menu.addItem("unringify", 'unringify'); + if (this instanceof ReporterBlockMorph || + (!(top instanceof HatBlockMorph))) { + menu.addItem("ringify", 'ringify'); + } + return menu; + } + if (contains( + ['doBroadcast', 'doBroadcastAndWait', 'receiveMessage', + 'receiveOnClone', 'receiveGo'], + this.selector + )) { + hasLine = true; + menu.addLine(); + menu.addItem( + (this.selector.indexOf('receive') === 0 ? + "senders..." : "receivers..."), + 'showMessageUsers' + ); + } + if (this.parent instanceof ReporterSlotMorph + || (this.parent instanceof CommandSlotMorph) + || (this instanceof HatBlockMorph) + || (this instanceof CommandBlockMorph + && (top instanceof HatBlockMorph))) { + return menu; + } + if (!hasLine) {menu.addLine(); } + rcvr = rcvr || this.scriptTarget(true); + if (rcvr && !rcvr.parentThatIsA(IDE_Morph).config.noRingify) { + menu.addItem("ringify", 'ringify'); + } + if (StageMorph.prototype.enableCodeMapping) { + menu.addLine(); + menu.addItem( + 'header mapping...', + 'mapToHeader' + ); + menu.addItem( + 'code mapping...', + 'mapToCode' + ); + } + return menu; +}; + +BlockMorph.prototype.showMessageUsers = function () { + // for blocks that send, broadcast or receive a message + var ide = this.parentThatIsA(IDE_Morph) || + this.parentThatIsA(BlockEditorMorph) + .target.parentThatIsA(IDE_Morph), + users = this.messageUsers(); + + ide.corral.frame.contents.children.concat(ide.corral.stageIcon).forEach( + icon => { + if (users.includes(icon.object)) { + icon.flash(); + } + } + ); +}; + + +BlockMorph.prototype.messageUsers = function () { + // for the following selectors: + // ['doBroadcast', 'doBroadcastAndWait', + // 'receiveMessage', 'receiveOnClone', 'receiveGo'] + + var ide = this.parentThatIsA(IDE_Morph) || + this.parentThatIsA(BlockEditorMorph) + .target.parentThatIsA(IDE_Morph), + isSender = this.selector.indexOf('doBroadcast') === 0, + isReceiver = this.selector.indexOf('receive') === 0, + getter = isReceiver ? 'allSendersOf' : 'allHatBlocksFor', + inputs = this.inputs(), + message, receiverSlot, receiverName, knownSenders; + + if (this.selector === 'receiveGo') { + message = '__shout__go__'; + } else if (this.selector === 'receiveOnClone') { + message = '__clone__init__'; + } else if (inputs[0] instanceof InputSlotMorph) { + message = inputs[0].evaluate(); + if (isSender && message instanceof Array) { + message = message[0]; + } + } + + if (isSender) { + receiverSlot = inputs[1].inputs()[0]; + if (receiverSlot instanceof InputSlotMorph) { + receiverName = receiverSlot.evaluate(); + if (receiverName instanceof Array) { // ['all'] + receiverName = null; + } + } + } else if (isReceiver) { + receiverName = this.scriptTarget().name; + } + + if (message !== '') { + if (isReceiver) { + knownSenders = ide.stage.globalBlocksSending(message, receiverName); + } + + return ide.sprites.asArray().concat([ide.stage]).filter(sprite => + sprite[getter](message, receiverName, knownSenders).length + ); + } + return []; +}; + + +BlockMorph.prototype.isSending = function (message, receiverName, known = []) { + if (typeof message === 'number') { + message = message.toString(); + } + return this.allChildren().some(morph => { + var inputs, event, receiverSlot, eventReceiver; + if (morph.isCustomBlock && + morph.isGlobal && + contains(known, morph.definition) + ) { + return true; + } + if (morph.selector && morph.selector.indexOf('doBroadcast') === 0) { + inputs = morph.inputs(); + event = inputs[0].evaluate(); + if (event instanceof Array) { + event = event[0]; + } + receiverSlot = inputs[1].inputs()[0]; + if (receiverSlot instanceof InputSlotMorph) { + eventReceiver = receiverSlot.evaluate(); + if (eventReceiver instanceof Array) { // ['all'] + eventReceiver = null; + } + } + return (!eventReceiver || (receiverName === eventReceiver)) && + ((event === message) || + (message instanceof Array && + message[0] === 'any message' && + event !== '__shout__go__')); + } + return false; + }); +}; + +BlockMorph.prototype.developersMenu = function () { + var menu = BlockMorph.uber.developersMenu.call(this); + menu.addLine(); + menu.addItem("delete block", 'deleteBlock'); + menu.addItem( + "spec...", + () => new DialogBoxMorph( + this, + this.userSetSpec, + this + ).prompt( + menu.title + '\nspec', + this.blockSpec, + this.world() + ) + ); + return menu; +}; + +BlockMorph.prototype.isChangeableTo = function (type) { + // answer whether it's safe to change my type, e.g. from command to + // reporter or from global to sprite-local. + // valid types "command", "reporter" and "predicate". + // + // a block is considered "changeable" if + // ------------------------------------- + // * it's a command & the target type isn't also a command & doesn't have a + // next block & is unattached (e.g. the only expression inside a context). + // + // * it's a reporter or a predicate & the target type is a command & is + // unattached (e.g. the only expression inside a function context). + // + // * it's a reporter or a predicate & the target type is also a reporter or + // a predicate the type can always be changed + + var typ = this.type(); + if (typ === type) {return true; } + if (typ === 'command' || type === 'command') { + return this.isUnattached(); + } + return true; +}; + +BlockMorph.prototype.type = function () { + // private + return this instanceof CommandBlockMorph ? 'command' + : (this.isPredicate ? 'predicate' : 'reporter'); +}; + +BlockMorph.prototype.isUnattached = function () { + // private + return ((this.nextBlock && !this.nextBlock()) || !this.nextBlock) && + !(this.parent instanceof SyntaxElementMorph) && + !(this.parent instanceof ScriptsMorph); +}; + +BlockMorph.prototype.isInheritedVariable = function (shadowedOnly) { + // private - only for variable getter template inside the palette + if (this.isTemplate && + (this.selector === 'reportGetVar') && + (this.parent instanceof FrameMorph)) { + return contains( + this.scriptTarget().inheritedVariableNames(shadowedOnly), + this.blockSpec + ); + } + return false; +}; + +BlockMorph.prototype.isTransientVariable = function () { + // private - only for variable getter template inside the palette + var varFrame = this.scriptTarget().variables.silentFind(this.blockSpec); + return varFrame ? varFrame.vars[this.blockSpec].isTransient : false; +}; + +BlockMorph.prototype.toggleTransientVariable = function () { + // private - only for variable getter template inside the palette + var varFrame = this.scriptTarget().variables.silentFind(this.blockSpec); + if (!varFrame) {return; } + varFrame.vars[this.blockSpec].isTransient = + !(varFrame.vars[this.blockSpec].isTransient); +}; + +BlockMorph.prototype.deleteBlock = function () { + // delete just this one block, keep inputs and next block around + var scripts = this.parentThatIsA(ScriptsMorph), + nb = this.nextBlock ? this.nextBlock() : null, + tobefixed, + isindef; + if (scripts) { + if (nb) { + scripts.add(nb); + } + this.inputs().forEach(inp => { + if (inp instanceof BlockMorph) { + scripts.add(inp); + } + }); + } + if (this instanceof ReporterBlockMorph && + ((this.parent instanceof BlockMorph) + || (this.parent instanceof MultiArgMorph) + || (this.parent instanceof ReporterSlotMorph))) { + this.parent.revertToDefaultInput(this); + } else { // CommandBlockMorph + if (this.parent && this.parent.fixLayout) { + tobefixed = this.parentThatIsA(ArgMorph); + } else { // must be in a custom block definition + isindef = true; + } + } + this.destroy(); + if (isindef) { + /* + since the definition's body still points to this block + even after it has been destroyed, mark it to be deleted + later. + */ + this.isCorpse = true; + } + if (tobefixed) { + tobefixed.fixLayout(); + } +}; + +BlockMorph.prototype.ringify = function () { + // wrap a Ring around me + var ring, top, center, + target = this.selectForEdit(); // copy-on-edit + if (target !== this) { + return this.ringify.call(target); + } + ring = new RingMorph(); + top = this.topBlock(); + center = top.fullBounds().center(); + if (this.parent === null) {return null; } + top.fullChanged(); + if (this.parent instanceof SyntaxElementMorph) { + if (this instanceof ReporterBlockMorph) { + this.parent.replaceInput(this, ring, true); // don't vanish + ring.embed(this, null, true); // don't vanish + } else if (top) { // command + if (top instanceof HatBlockMorph) { + return; + } + top.parent.add(ring); + ring.embed(top); + ring.setCenter(center); + } + } else { + this.parent.add(ring); + ring.embed(this); + ring.setCenter(center); + } + this.fixBlockColor(null, true); + top.fullChanged(); + this.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'ringify', + this.abstractBlockSpec() + ); +}; + +BlockMorph.prototype.unringify = function () { + // remove a Ring around me, if any + var ring, top, center, scripts, block, + target = this.selectForEdit(); // copy-on-edit + if (target !== this) { + return this.unringify.call(target); + } + ring = this.parent.parentThatIsA(RingMorph); + top = this.topBlock(); + scripts = this.parentThatIsA(ScriptsMorph); + if (ring === null) {return null; } + block = ring.contents(); + center = ring.center(); + + top.fullChanged(); + if (ring.parent instanceof SyntaxElementMorph) { + if (block instanceof ReporterBlockMorph) { + ring.parent.replaceInput(ring, block); + } else if (scripts) { + scripts.add(block); + block.setFullCenter(center); + block.moveBy(20); + ring.parent.revertToDefaultInput(ring); + } + } else { + ring.parent.add(block); + block.setFullCenter(center); + ring.destroy(); + } + this.fixBlockColor(null, true); + top.fullChanged(); + this.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'unringify', + this.abstractBlockSpec() + ); +}; + +BlockMorph.prototype.relabel = function (alternativeSelectors) { + // morph one block into another trying to keep the inputs in place + // alternative Selector can either be a string representing + // a block selector or a 2-item array containing a string and + // an integer offset for restoring inputs + var menu, oldInputs, + target = this.selectForEdit(); // copy-on-edit + if (target !== this) { + return this.relabel.call(target, alternativeSelectors); + } + menu = new MenuMorph(this); + oldInputs = this.inputs(); + alternativeSelectors.forEach(alternative => { + var block, selector, offset; + if (alternative instanceof Array) { + selector = alternative[0]; + offset = -alternative[1]; + } else { + selector = alternative; + offset = 0; + } + block = SpriteMorph.prototype.blockForSelector(selector, true); + block.restoreInputs(oldInputs, offset); + block.fixBlockColor(null, true); + block.addShadow(new Point(3, 3)); + menu.addItem( + block.doWithAlpha(1, () => block.fullImage()), + () => { + var old = this.abstractBlockSpec(); + this.setSelector(selector, -offset); + this.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'relabel', + old, + this.abstractBlockSpec() + ); + } + ); + }); + menu.popup(this.world(), this.bottomLeft().subtract(new Point( + 8, + this instanceof CommandBlockMorph ? this.corner : 0 + ))); +}; + + +BlockMorph.prototype.setSelector = function (aSelector, inputOffset = 0) { + // private - used only for relabel() + // input offset is optional and can be used to shift the inputs + // to be restored + var oldInputs = this.inputs(), + scripts = this.parentThatIsA(ScriptsMorph), + surplus, + info, + slots, + i; + info = SpriteMorph.prototype.blocks[aSelector]; + this.setCategory(info.category); + this.selector = aSelector; + this.setSpec(this.localizeBlockSpec(info.spec)); + this.defaults = info.defaults || []; + + // restore default values + slots = this.inputs(); + if (slots[0] instanceof MultiArgMorph) { + slots[0].setContents(this.defaults); + slots[0].defaults = this.defaults; + } else { + for (i = 0; i < this.defaults.length; i += 1) { + if (this.defaults[i] !== null && slots[i].setContents) { + slots[i].setContents(this.defaults[i]); + } + } + } + + // restore previous inputs + surplus = this.restoreInputs(oldInputs, -inputOffset); + this.fixLabelColor(); + this.fixLayout(); + + // place surplus blocks on scipts + if (scripts && surplus.length) { + surplus.forEach(blk => { + blk.moveBy(10); + scripts.add(blk); + }); + } +}; + +BlockMorph.prototype.restoreInputs = function (oldInputs, offset = 0) { + // private - used only for relabel() + // try to restore my previous inputs when my spec has been changed + // return an Array of left-over blocks, if any + // optional offset parameter allows for shifting the range + // of inputs to be restored + var old, nb, i, src, trg, + element = this, + inputs = this.inputs(), + leftOver = []; + + function preserveBlocksIn(slot) { + if (slot instanceof ReporterBlockMorph) { + leftOver.push(slot); + } else if (slot instanceof CommandSlotMorph) { + nb = slot.nestedBlock(); + if (nb) { + leftOver.push(nb); + } + } else if (slot instanceof MultiArgMorph) { + slot.inputs().forEach(inp => { + if (inp instanceof ReporterBlockMorph) { + leftOver.push(inp); + } else if (inp instanceof CommandSlotMorph) { + nb = inp.nestedBlock(); + if (nb) { + leftOver.push(nb); + } + } + }); + } + } + + // gather leading surplus blocks + for (i = 0; i < offset; i += 1) { + preserveBlocksIn(oldInputs[i]); + } + + // special cases for relabelling to / from single variadic infix reporters + src = oldInputs[0]; + trg = inputs[0]; + + // 1. + // both blocks have exactly one variadic slot, with the same slot spec but + // different infixes, and not nessesarily matching numbers of expanded + // slots. + if (oldInputs.length === 1 && + (inputs.length === 1) && + src instanceof MultiArgMorph && + trg instanceof MultiArgMorph && + src.slotSpec === trg.slotSpec && + (src.infix !== trg.infix) + ) { + element = trg; + oldInputs = src.inputs(); + while(element.inputs().length < oldInputs.length) { + element.addInput(); + } + inputs = element.inputs(); + } + + // 2. + // this block has a single variadic infix slot which will hold all of the + // old block inputs. + else if (oldInputs.length && + (inputs.length === 1) && + trg instanceof MultiArgMorph && + !(src instanceof MultiArgMorph) && + !(src instanceof ArgLabelMorph) + ) { + element = trg; + inputs = element.inputs(); + } + + // 3. + // the old inputs are a single variadic infix slot whose inputs will be + // distributed over this blocks non-variadic slots + else if (oldInputs.length === 1 && + inputs.length && + src instanceof MultiArgMorph && + !(trg instanceof MultiArgMorph) + ) { + oldInputs = src.inputs(); + } + + // restore matching inputs in their original order + inputs.forEach(inp => { + old = oldInputs[offset]; + if (old instanceof ArgLabelMorph) { + old = old.argMorph(); + } + if (old instanceof RingMorph) { + if (old.contents()) { + element.replaceInput(inp, old.fullCopy()); + } + // otherwise ignore the empty ring + } else if (old instanceof ReporterBlockMorph) { + if (inp instanceof TemplateSlotMorph || inp.isStatic) { + leftOver.push(old); + } else { + element.replaceInput(inp, old.fullCopy()); + } + } else if (old && inp instanceof InputSlotMorph) { + // original - turns empty numberslots to 0: + // inp.setContents(old.evaluate()); + // "fix" may be wrong b/c constants + if (old.contents) { + inp.setContents(old.contents().text); + if (old.constant) { + inp.constant = old.constant; + } + } + } else if (old instanceof CSlotMorph && inp instanceof CSlotMorph) { + nb = old.nestedBlock(); + if (nb) { + inp.nestedBlock(nb.fullCopy()); + } + } else if (old instanceof MultiArgMorph && + inp instanceof MultiArgMorph && + (old.slotSpec === inp.slotSpec) && + old.infix === inp.infix) { + element.replaceInput(inp, old.fullCopy()); + } else { + preserveBlocksIn(old); + } + offset += 1; + }); + + // gather trailing surplus blocks + for (offset; offset < oldInputs.length; offset += 1) { + preserveBlocksIn(oldInputs[offset]); + } + element.cachedInputs = null; + this.cachedInputs = null; + return leftOver; +}; + +// BlockMorph helpscreens + +BlockMorph.prototype.showHelp = function () { + var myself = this, + ide = this.parentThatIsA(IDE_Morph), + pic = new Image(), + dlg, + help, + def, + comment, + block, + spec, + ctx; + + if (this.isCustomBlock) { + if (this.isGlobal) { + spec = this.definition.helpSpec(); + } else { + spec = this.scriptTarget().getMethod(this.blockSpec).helpSpec(); + } + } else { + spec = this.selector; + } + + if (!ide) { + dlg = this.parentThatIsA(DialogBoxMorph); + if (dlg && isSnapObject(dlg.target)) { + ide = dlg.target.parentThatIsA(IDE_Morph); + } + } + + pic.onload = function () { + help = newCanvas(new Point(pic.width, pic.height), true); // nonRetina + ctx = help.getContext('2d'); + ctx.drawImage(pic, 0, 0); + new DialogBoxMorph().inform( + 'Help', + null, + myself.world(), + help + ); + }; + + if (this.isCustomBlock) { + def = this.isGlobal ? this.definition + : this.scriptTarget().getMethod(this.blockSpec); + comment = def.comment; + if (comment) { + block = def.blockInstance(); + block.refreshDefaults(def); + comment = comment.fullCopy(); + comment.contents.parse(); + help = ''; + comment.contents.lines.forEach(line => + help = help + '\n' + line + ); + new DialogBoxMorph().inform( + 'Help', + help.substr(1), + myself.world(), + block.doWithAlpha( + 1, + () => { + block.addShadow(); + return block.fullImage(); + } + ) + ); + return; + } + } + pic.src = ide.resourceURL('help', spec + '.png'); +}; + +// BlockMorph exporting picture with result bubble + +BlockMorph.prototype.exportResultPic = function () { + var top = this.topBlock(), + receiver = top.scriptTarget(), + stage; + if (top !== this) {return; } + if (receiver) { + stage = receiver.parentThatIsA(StageMorph); + if (stage) { + stage.threads.stopProcess(top); + stage.threads.startProcess(top, receiver, false, true); + } + } +}; + +// BlockMorph exporting a script + +BlockMorph.prototype.exportScript = function () { + // assumes this is the script's top block + var ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph), + xml; + + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (!ide) { + return; + } + + xml = this.toXMLString(); + if (xml) { + ide.saveXMLAs( + xml, + this.selector + ' script', + false + ); + } +}; + +BlockMorph.prototype.toXMLString = function (receiver) { + // answer an xml string representation of this block and all the + // following ones attached to it, including all dependencies. + // specifying a receiver sprite is optional for cases where + // the receiver sprite is not the currently edited one inside the IDE + var ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph), + isReporter = this instanceof ReporterBlockMorph, + varNames = [], + dependencies, + localVarNames, + globalData, + localData; + + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (!ide) { + return; + } + + // collect custom block definitions referenced in this script: + dependencies = this.dependencies(false, receiver); // both global and local + + // collect variables referenced by included custom block definitions: + dependencies.forEach(def => + def.dataDependencies().forEach(name => { + if (!varNames.includes(name)) { + varNames.push(name); + } + }) + ); + localData = (receiver || ide.currentSprite).variables.fork(varNames); + localVarNames = localData.names(true); // include hidden + varNames = varNames.filter(name => !localVarNames.includes(name)); + globalData = ide.globalVariables.fork(varNames); + + return '' : '') + + ''; +}; + +BlockMorph.prototype.dependencies = function (onlyGlobal, receiver) { + // answer an array containing all custom block definitions referenced + // by this and the following blocks, optional parameter to constrain + // to global definitions. + // specifying a receiver sprite is optional for cases where + // the receiver sprite is not the currently edited one inside the IDE + // if a receiver is not specified this method can only be called from + // within the IDE because it needs to be able to determine the scriptTarget + var dependencies = [], + rcvr = onlyGlobal ? null : (receiver || this.scriptTarget()); + this.forAllChildren(morph => { + var def; + if (morph.isCustomBlock) { + if (!onlyGlobal || (onlyGlobal && morph.isGlobal)) { + def = morph.isGlobal ? morph.definition + : rcvr.getMethod(morph.semanticSpec); + [def].concat(def.collectDependencies([], [], rcvr)).forEach( + fun => { + if (!contains(dependencies, fun)) { + dependencies.push(fun); + } + } + ); + } + } + }); + return dependencies; +}; + +// BlockMorph syntax analysis + +BlockMorph.prototype.components = function (parameterNames = []) { + if (this instanceof ReporterBlockMorph) { + return this.syntaxTree(parameterNames); + } + var seq = new List(this.blockSequence()).map((block, i) => + block.syntaxTree(i < 1 ? parameterNames : []) + ); + return seq.length() === 1 ? seq.at(1) : seq; +}; + +BlockMorph.prototype.syntaxTree = function (parameterNames) { + var expr = this.fullCopy(), + nb = expr.nextBlock ? expr.nextBlock() : null, + inputs, parts; + if (nb) { + nb.destroy(); + } + expr.fixBlockColor(null, true); + inputs = expr.inputs(); + parts = new List([expr.reify()]); + inputs.forEach(inp => { + var val; + if (inp instanceof BlockMorph) { + if (inp instanceof RingMorph && inp.isEmptySlot()) { + parts.add(); + return; + } + parts.add(inp.components()); + expr.revertToEmptyInput(inp); + } else if (inp.isEmptySlot()) { + parts.add(); + } else if (inp instanceof MultiArgMorph) { + if (!inp.inputs().length) { + parts.add(); + } + inp.inputs().forEach((slot, i) => { + var entry; + if (slot instanceof BlockMorph) { + if (slot instanceof RingMorph && slot.isEmptySlot()) { + parts.add(); + return; + } + parts.add(slot.components()); + } else if (slot.isEmptySlot()) { + parts.add(); + } else { + entry = slot.evaluate(); + parts.add(entry instanceof BlockMorph ? + entry.components() : entry); + } + inp.revertToEmptyInput(slot); + }); + } else if (inp instanceof ArgLabelMorph) { + parts.add(inp.argMorph().components()); + expr.revertToEmptyInput(inp).collapseAll(); + } else { + val = inp.evaluate(); + if (val instanceof Array) { + val = '[' + val + ']'; + } + if (inp instanceof ColorSlotMorph) { + val = val.toString(); + } + parts.add(val instanceof BlockMorph ? val.components() : val); + expr.revertToEmptyInput(inp, true); + } + }); + parts.at(1).updateEmptySlots(); + if (expr.selector === 'reportGetVar') { + parts.add(expr.blockSpec); + expr.setSpec('\xa0'); // non-breaking space, appears blank + } + parameterNames.forEach(name => parts.add(name)); + return parts; +}; + +BlockMorph.prototype.equalTo = function (other) { + // private - only to be called from a Context + return this.constructor.name === other.constructor.name && + this.selector === other.selector && + this.blockSpec === other.blockSpec; +}; + +BlockMorph.prototype.copyWithInputs = function (inputs) { + // private - only to be called from a Context + var cpy = this.fullCopy(), + slots = cpy.inputs(), + dta = inputs.itemsArray().map(inp => + inp instanceof Context ? inp.expression : inp + ), + count = 0, + dflt; + + function isOption(data) { + return isString(data) && + data.length > 2 && + data[0] === '[' && + data[data.length - 1] === ']'; + } + + if (dta.length === 0) { + return cpy.reify(); + } + if (cpy.selector === 'reportGetVar' && ( + (dta.length === 1) || (cpy.blockSpec === '\xa0' && dta.length > 1)) + ) { + cpy.setSpec(dta[0]); + return cpy.reify(dta.slice(1)); + } + + // restore input slots + slots.forEach(slt => { + if (slt instanceof BlockMorph) { + dflt = cpy.revertToEmptyInput(slt); + if (dflt instanceof MultiArgMorph) { + dflt.collapseAll(); + } + } else if (slt instanceof MultiArgMorph) { + slt.inputs().forEach(entry => { + if (entry instanceof BlockMorph) { + slt.revertToEmptyInput(entry); + } + }); + } + }); + + // distribute inputs among the slots + slots = cpy.inputs(); + slots.forEach((slot) => { + var inp, i, cnt; + if (slot instanceof MultiArgMorph && dta[count] instanceof List) { + // let the list's first item control the arity of the polyadic slot + // fill with the following items in the list + inp = dta[count]; + if (inp.length() === 0) { + nop(); // ignore, i.e. leave slot as is + } else { + slot.collapseAll(); + for (i = 1; i <= inp.at(1); i += 1) { + cnt = inp.at(i + 1); + if (cnt instanceof List) { + cnt = Process.prototype.assemble(cnt); + } + if (cnt instanceof Context) { + slot.replaceInput( + slot.addInput(), + cnt.expression.fullCopy() + ); + } else { + slot.addInput(cnt); + } + } + } + count += 1; + } else if (slot instanceof MultiArgMorph && slot.inputs().length) { + // fill the visible slots of the polyadic input as if they were + // permanent inputs each + slot.inputs().forEach(entry => { + inp = dta[count]; + if (inp instanceof BlockMorph) { + if (inp instanceof CommandBlockMorph && entry.nestedBlock) { + entry.nestedBlock(inp); + } else if (inp instanceof ReporterBlockMorph && + (!entry.isStatic || entry instanceof RingMorph)) { + slot.replaceInput(entry, inp); + } + } else { + if (inp instanceof List && inp.length() === 0) { + nop(); // ignore, i.e. leave slot as is + } else if (entry instanceof InputSlotMorph || + entry instanceof TemplateSlotMorph || + entry instanceof BooleanSlotMorph) { + entry.setContents(inp); + } + } + count += 1; + }); + } else { + // fill the visible slot, treat collapsed variadic slots as single + // input (to be replaced by a reporter), + // skip in case the join value is an empty list + inp = dta[count]; + if (inp === undefined) {return; } + if (inp instanceof BlockMorph) { + if (inp instanceof CommandBlockMorph && slot.nestedBlock) { + slot.nestedBlock(inp); + } else if (inp instanceof ReporterBlockMorph && + (!slot.isStatic || slot instanceof RingMorph)) { + cpy.replaceInput(slot, inp); + } else if (inp instanceof ReporterBlockMorph && + slot.nestedBlock) { + slot.nestedBlock(inp); + } + } else { + if (inp instanceof List && inp.length() === 0) { + nop(); // ignore, i.e. leave slot as is + } else if (slot instanceof ColorSlotMorph) { + slot.setColor(Color.fromString(inp)); + } else if (slot instanceof InputSlotMorph) { + slot.setContents(isOption(inp) ? [inp.slice(1, -1)] : inp); + } else if (slot instanceof TemplateSlotMorph || + slot instanceof BooleanSlotMorph) { + slot.setContents(inp); + } + } + count += 1; + } + }); + + // create a function to return + return cpy.reify(dta.slice(count)); +}; + +BlockMorph.prototype.copyWithNext = function (next, parameterNames) { + var expr = this.fullCopy(), + top; + if (this instanceof ReporterBlockMorph) { + return expr.reify(); + } + top = next.fullCopy().topBlock(); + if (top instanceof CommandBlockMorph) { + expr.bottomBlock().nextBlock(top); + } + return expr.reify(parameterNames); +}; + +BlockMorph.prototype.reify = function (inputNames, comment) { + // private - assumes that I've already been deep copied + var context = new Context(); + context.expression = this; + context.inputs = inputNames || []; + context.emptySlots = this.markEmptySlots(); + context.comment = comment || this.comment?.text(); + return context; +}; + +BlockMorph.prototype.markEmptySlots = function () { + // private - mark all empty slots with an identifier + // and return the count + var count = 0; + + this.allInputs().forEach(input => + delete input.bindingID + ); + this.allEmptySlots().forEach(slot => { + count += 1; + if (slot instanceof MultiArgMorph) { + slot.bindingID = Symbol.for('arguments'); + } else { + slot.bindingID = count; + } + }); + return count; +}; + +// BlockMorph code mapping + +/* + code mapping lets you use blocks to generate arbitrary text-based + source code that can be exported and compiled / embedded elsewhere, + it's not part of Snap's evaluator and not needed for Snap itself +*/ + +BlockMorph.prototype.mapToHeader = function () { + // open a dialog box letting the user map header code via the GUI + var key = this.selector.substr(0, 5) === 'reify' ? + 'reify' : this.selector, + block = this.codeDefinitionHeader(), + help, + pic; + block.addShadow(new Point(3, 3)); + pic = block.doWithAlpha(1, () => block.fullImage()); + if (this.isCustomBlock) { + help = 'Enter code that corresponds to the block\'s definition. ' + + 'Use the formal parameter\nnames as shown and to ' + + 'reference the definition body\'s generated text code.'; + } else { + help = 'Enter code that corresponds to the block\'s definition. ' + + 'Choose your own\nformal parameter names (ignoring the ones ' + + 'shown).'; + } + new DialogBoxMorph( + this, + code => { + if (key === 'evaluateCustomBlock') { + this.definition.codeHeader = code; + } else { + StageMorph.prototype.codeHeaders[key] = code; + } + }, + this + ).promptCode( + 'Header mapping', + key === 'evaluateCustomBlock' ? this.definition.codeHeader || '' + : StageMorph.prototype.codeHeaders[key] || '', + this.world(), + pic, + help + ); +}; + +BlockMorph.prototype.mapToCode = function () { + // open a dialog box letting the user map code via the GUI + var key = this.selector.substr(0, 5) === 'reify' ? + 'reify' : this.selector, + block = this.codeMappingHeader(), + pic; + block.addShadow(new Point(3, 3)); + pic = block.doWithAlpha(1, () => block.fullImage()); + new DialogBoxMorph( + this, + code => { + if (key === 'evaluateCustomBlock') { + this.definition.codeMapping = code; + } else { + StageMorph.prototype.codeMappings[key] = code; + } + }, + this + ).promptCode( + 'Code mapping', + key === 'evaluateCustomBlock' ? this.definition.codeMapping || '' + : StageMorph.prototype.codeMappings[key] || '', + this.world(), + pic, + 'Enter code that corresponds to the block\'s operation ' + + '(usually a single\nfunction invocation). Use <#n> to ' + + 'reference actual arguments as shown.' + ); +}; + +BlockMorph.prototype.mapHeader = function (aString, key) { + // primitive for programatically mapping header code + var sel = key || this.selector.substr(0, 5) === 'reify' ? + 'reify' : this.selector; + if (aString) { + if (this.isCustomBlock) { + this.definition.codeHeader = aString; + } else { + StageMorph.prototype.codeHeaders[sel] = aString; + } + } +}; + +BlockMorph.prototype.mapCode = function (aString, key) { + // primitive for programatically mapping code + var sel = key || this.selector.substr(0, 5) === 'reify' ? + 'reify' : this.selector; + if (aString) { + if (this.isCustomBlock) { + this.definition.codeMapping = aString; + } else { + StageMorph.prototype.codeMappings[sel] = aString; + } + } +}; + +BlockMorph.prototype.mappedCode = function (definitions) { + var key = this.selector.substr(0, 5) === 'reify' ? + 'reify' : this.selector, + code, + codeLines, + count = 1, + header, + headers, + headerLines, + body, + bodyLines, + defKey = this.isCustomBlock ? this.definition.spec : key, + defs = definitions || {}, + parts = []; + code = key === 'reportGetVar' ? this.blockSpec + : this.isCustomBlock ? this.definition.codeMapping || '' + : StageMorph.prototype.codeMappings[key] || ''; + + // map header + if (key !== 'reportGetVar' && !defs.hasOwnProperty(defKey)) { + defs[defKey] = null; // create the property for recursive definitions + if (this.isCustomBlock) { + header = this.definition.codeHeader || ''; + if (header.indexOf(' { + var prefix = '', + indent; + if (headerLine.trimLeft().indexOf(''), + bodyLines.join('\n' + prefix) + ); + headerLines[idx] = headerLines[idx].replace( + new RegExp('', 'g'), + bodyLines.join('\n') + ); + }); + header = headerLines.join('\n'); + } + defs[defKey] = header; + } else { + defs[defKey] = StageMorph.prototype.codeHeaders[defKey]; + } + } + + codeLines = code.split('\n'); + this.inputs().forEach(input => { + var mapped = input.mappedCode(defs); + if (isNil(mapped)) {mapped = ''; } + parts.push(mapped.toString()); + }); + parts.forEach(part => { + var partLines = part.split('\n'), + placeHolder = '<#' + count + '>', + rx = new RegExp(placeHolder, 'g'); + codeLines.forEach((codeLine, idx) => { + var prefix = '', + indent; + if (codeLine.trimLeft().indexOf(placeHolder) === 0) { + indent = codeLine.indexOf(placeHolder); + prefix = codeLine.slice(0, indent); + } + codeLines[idx] = codeLine.replace( + new RegExp(placeHolder), + partLines.join('\n' + prefix) + ); + codeLines[idx] = codeLines[idx].replace(rx, partLines.join('\n')); + }); + count += 1; + }); + code = codeLines.join('\n'); + if (this.nextBlock && this.nextBlock()) { // Command + code += ('\n' + this.nextBlock().mappedCode(defs)); + } + if (!definitions) { // top-level, add headers + headers = []; + Object.keys(defs).forEach(each => { + if (defs[each]) { + headers.push(defs[each]); + } + }); + if (headers.length) { + return headers.join('\n\n') + + '\n\n' + + code; + } + } + return code; +}; + +BlockMorph.prototype.codeDefinitionHeader = function () { + var block = this.isCustomBlock ? new PrototypeHatBlockMorph(this.definition) + : SpriteMorph.prototype.blockForSelector(this.selector), + hat = new HatBlockMorph(), + count = 1; + + if (this.isCustomBlock) {return block; } + block.inputs().forEach(input => { + var part = new TemplateSlotMorph('#' + count); + block.replaceInput(input, part); + count += 1; + }); + block.isPrototype = true; + hat.setCategory("control"); + hat.setSpec('%s'); + hat.replaceInput(hat.inputs()[0], block); + if (this.category === 'control') { + hat.alternateBlockColor(); + } + return hat; +}; + +BlockMorph.prototype.codeMappingHeader = function () { + var block = this.isCustomBlock ? this.definition.blockInstance() + : SpriteMorph.prototype.blockForSelector(this.selector), + hat = new HatBlockMorph(), + count = 1; + + block.inputs().forEach(input => { + var part = new TemplateSlotMorph('<#' + count + '>'); + block.replaceInput(input, part); + count += 1; + }); + block.isPrototype = true; + hat.setCategory("control"); + hat.setSpec('%s'); + hat.replaceInput(hat.inputs()[0], block); + if (this.category === 'control') { + hat.alternateBlockColor(); + } + return hat; +}; + +BlockMorph.prototype.elementsAtLOC = function (definitions) { + // return an Array indicating which syntax elements are codified at which + // line of textual code applying the current mapping + var key = this.selector.substr(0, 5) === 'reify' ? + 'reify' : this.selector, + code, + codeLines, + count = 1, + headers, + defs = definitions || {}, + elementLOC, + partsLOC = [], + insertionIdx, + i; + + code = key === 'reportGetVar' ? this.blockSpec + : this.isCustomBlock ? this.definition.codeMapping || '' + : StageMorph.prototype.codeMappings[key] || ''; + + codeLines = code.split('\n'); + elementLOC = codeLines.map(() => [this]); + partsLOC = this.inputs().map(inp => inp.elementsAtLOC(defs) || []); + insertionIdx = 0; + + partsLOC.forEach((partElements, partIdx) => { + var placeHolder = '<#' + count + '>', + rx = new RegExp(placeHolder, 'g'); + + codeLines.forEach((codeLine, i) => { + // for every match on each codeline splice in the corresponding + // elements in the partsLOC + // add the elements of the first partsLOC item to he codelines, + // insert the following ones afterwards + var matches = (codeLine.match(rx) || []).length; + if (matches) { + // merge the first line with the current code line's elements + (partElements.shift() || []).forEach(each => + elementLOC[i + insertionIdx].unshift(each) + ); + + // insert the following lines behind the current code line + partElements.forEach(each => { + insertionIdx += 1; + elementLOC.splice(i + insertionIdx, 0, each); + }); + } + }); + count += 1; + }); + + if (this.nextBlock && this.nextBlock()) { // Command + elementLOC.push.apply(elementLOC, this.nextBlock().elementsAtLOC()); + } + + // prerix with empty lines in case of headers: + if (!definitions) { // top-level, add headers + headers = this.mappedCode().split('\n').length - elementLOC.length; + if (headers) { + for (i = 0; i < headers; i += 1) { + elementLOC.unshift([]); + } + } + } + return elementLOC; +}; + +// Variable refactoring + +BlockMorph.prototype.refactorPaletteTemplate = function (everywhere) { + // Rename all occurrences of the variable this block is holding, + // taking care of its lexical scope depending whether the template + // is marked as sprite-local or global. + + var oldName = this.instantiationSpec || this.blockSpec, + cpy = this.fullCopy(), + myself = this; + + function renameTo(newName) { + newName = newName.trim(); + if (newName === '') {return; } + // rename the following blocks in the lexical scope + if (myself.scriptTarget().renameVariable( + oldName, + newName, + !myself.isLocalVarTemplate, + everywhere + )) { + // rename the template + myself.changed(); + myself.setSpec(newName); + myself.fixLabelColor(); + myself.changed(); + } + } + + cpy.addShadow(); + new DialogBoxMorph(this, renameTo, this).prompt( + 'Variable name', + oldName, + this.world(), + cpy.doWithAlpha(1, () => cpy.fullImage()), // pic + InputSlotMorph.prototype.getVarNamesDict.call(this) + ); +}; + +BlockMorph.prototype.refactorInlineTemplate = function () { + // Rename all occurrences of the variable this block is holding, + // taking care of its lexical scope within this script. + // Assuming this block to be in inline-template that defines + // a local script variable (in a template slot), either + // as upvar, ring parameter or part of a primitive that + // uses template slots for defining local variables, such as + // the "script variables" block itself. + + var oldName = this.instantiationSpec || this.blockSpec, + cpy = this.fullCopy(), + myself = this; + + function renameTo(newName) { + // rename the template + myself.changed(); + myself.setSpec(newName); + myself.instantiationSpec = newName; + if (myself.parent instanceof BlockInputFragmentMorph) { + myself.parent.fragment.labelString = newName; + } + myself.fixLabelColor(); + myself.changed(); + // rename the following blocks in the lexical scope + myself.refactorVariable(oldName, newName, true); + } + + cpy.addShadow(); + new DialogBoxMorph(this, renameTo, this).prompt( + 'Variable name', + oldName, + this.world(), + cpy.doWithAlpha(1, () => cpy.fullImage()), // pic + InputSlotMorph.prototype.getVarNamesDict.call(this) + ); +}; + +BlockMorph.prototype.refactorVariable = function (name, newName, afterThis) { + // rename all variable references to a given name within this script's + // lexical scope to a new one. + // Optional Boolean "afterThis" switch indicates whether the very first + // - i.e. - this block should be ignored, because it is the template from + // which refactoring happens. + + function rebind(block) { + if (block.selector === 'reportGetVar') { + block.changed(); + block.setSpec(newName); + block.fixLabelColor(); + block.changed(); + } else { + block.inputs().forEach(inp => { + if (inp.choices === 'getVarNamesDict' && + inp.evaluate() === name) { + inp.setContents(newName); + } + }); + } + } + + this.scopeFor(name, afterThis).flat().forEach(block => rebind(block)); +}; + +// BlockMorph thumbnail and script pic + +BlockMorph.prototype.thumbnail = function (scale, clipWidth) { + var nb = this.nextBlock(), + fadeout = 12, + ext, + trgt, + ctx, + gradient; + + if (nb) {nb.isVisible = false; } + ext = this.fullBounds().extent(); + trgt = newCanvas(new Point( + clipWidth ? Math.min(ext.x * scale, clipWidth) : ext.x * scale, + ext.y * scale + )); + ctx = trgt.getContext('2d'); + ctx.scale(scale, scale); + ctx.drawImage(this.fullImage(), 0, 0); + // draw fade-out + if (clipWidth && ext.x * scale > clipWidth) { + gradient = ctx.createLinearGradient( + trgt.width / scale - fadeout, + 0, + trgt.width / scale, + 0 + ); + gradient.addColorStop(0, 'transparent'); + gradient.addColorStop(1, 'black'); + ctx.globalCompositeOperation = 'destination-out'; + ctx.fillStyle = gradient; + ctx.fillRect( + trgt.width / scale - fadeout, + 0, + trgt.width / scale, + trgt.height / scale + ); + } + if (nb) {nb.isVisible = true; } + return trgt; +}; + +BlockMorph.prototype.scriptPic = function () { + // answer a canvas image that also includes comments + var scr = this.fullImage(), + fb = this.stackFullBounds(), + pic = newCanvas(fb.extent()), + ctx = pic.getContext('2d'); + + this.allComments().forEach(comment => + ctx.drawImage( + comment.fullImage(), + comment.fullBounds().left() - fb.left(), + comment.top() - fb.top() + ) + ); + ctx.drawImage(scr, 0, 0); + return pic; +}; + +BlockMorph.prototype.fullImage = function () { + // answer a canvas image meant for (semi-) transparent blocks + // that lets the background shine through + var src, solid, pic, ctx; + + if (this.alpha === 1) { + return BlockMorph.uber.fullImage.call(this); + } + this.forAllChildren(m => { + if (m instanceof BlockMorph) { + m.mouseLeaveBounds(); + } + }); + src = BlockMorph.uber.fullImage.call(this); + solid = this.doWithAlpha(1, () => BlockMorph.uber.fullImage.call(this)); + pic = newCanvas(this.fullBounds().extent()); + ctx = pic.getContext('2d'); + ctx.fillStyle = ScriptsMorph.prototype.getRenderColor().toString(); + ctx.fillRect(0, 0, pic.width, pic.height); + ctx.globalCompositeOperation = 'destination-in'; + ctx.drawImage(solid, 0, 0); + ctx.globalCompositeOperation = 'source-over'; + ctx.drawImage(src, 0, 0); + return pic; +}; + +BlockMorph.prototype.clearAlpha = function () { + this.forAllChildren(m => { + if (m instanceof BlockMorph) { + delete m.alpha; + } + }); +}; + +// BlockMorph drawing + +BlockMorph.prototype.render = function (ctx) { + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + + if (MorphicPreferences.isFlat) { + // draw the outline + ctx.fillStyle = this.cachedClrDark; + ctx.beginPath(); + this.outlinePath(ctx, 0); + ctx.closePath(); + ctx.fill(); + + // draw the inner filled shaped + ctx.fillStyle = this.cachedClr; + ctx.beginPath(); + this.outlinePath(ctx, this.flatEdge); + ctx.closePath(); + ctx.fill(); + } else { + // draw the flat shape + ctx.fillStyle = this.cachedClr; + ctx.beginPath(); + this.outlinePath(ctx, 0); + ctx.closePath(); + ctx.fill(); + + // add 3D-Effect: + this.drawEdges(ctx); + } + + // draw location pin icon if applicable + if (this.hasLocationPin()) { + this.drawMethodIcon(ctx); + } +}; + +BlockMorph.prototype.drawMethodIcon = function (ctx) { + var ext = this.methodIconExtent(), + w = ext.x, + h = ext.y, + r = w / 2, + x = this.edge + this.labelPadding, + y = this.edge, + isNormal = + this.color === SpriteMorph.prototype.blockColorFor(this.category); + + if (this.isPredicate) { + x = this.rounding; + } + if (this instanceof CommandBlockMorph) { + y += this.corner; + } + ctx.fillStyle = isNormal ? this.cachedClrBright : this.cachedClrDark; + + // pin + ctx.beginPath(); + ctx.arc(x + r, y + r, r, radians(-210), radians(30), false); + ctx.lineTo(x + r, y + h); + ctx.closePath(); + ctx.fill(); + + // hole + ctx.fillStyle = this.cachedClr; + ctx.beginPath(); + ctx.arc(x + r, y + r, r * 0.4, radians(0), radians(360), false); + ctx.closePath(); + ctx.fill(); +}; + +BlockMorph.prototype.cSlots = function () { + var result = []; + this.parts().forEach(part => { + if (part instanceof CSlotMorph) { + result.push(part); + } else if (part instanceof MultiArgMorph) { + part.parts().forEach(slot => { + if (slot instanceof CSlotMorph) { + result.push(slot); + } + }); + } + }); + return result; +}; + +BlockMorph.prototype.hasLocationPin = function () { + return (this.isCustomBlock && !this.isGlobal) || this.isLocalVarTemplate; +}; + +// BlockMorph highlighting + +BlockMorph.prototype.addHighlight = function (oldHighlight) { + var isHidden = !this.isVisible, + highlight; + + if (isHidden) {this.show(); } + if (SyntaxElementMorph.prototype.alpha < 1) { + this.clearAlpha(); + } + highlight = this.highlight( + oldHighlight ? oldHighlight.color : this.activeHighlight, + this.activeBlur, + this.activeBorder + ); + this.addBack(highlight); + this.fullChanged(); + if (isHidden) {this.hide(); } + return highlight; +}; + +BlockMorph.prototype.addErrorHighlight = function () { + var isHidden = !this.isVisible, + highlight; + + if (isHidden) {this.show(); } + this.removeHighlight(); + highlight = this.highlight( + this.errorHighlight, + this.activeBlur, + this.activeBorder + ); + this.addBack(highlight); + this.fullChanged(); + if (isHidden) {this.hide(); } + return highlight; +}; + +BlockMorph.prototype.removeHighlight = function () { + var highlight = this.getHighlight(); + if (highlight !== null) { + this.fullChanged(); + this.removeChild(highlight); + } + return highlight; +}; + +BlockMorph.prototype.toggleHighlight = function () { + if (this.getHighlight()) { + this.removeHighlight(); + } else { + this.addHighlight(); + } +}; + +BlockMorph.prototype.highlight = function (color, blur, border) { + var highlight = new BlockHighlightMorph(), + fb = this.fullBounds(), + edge = useBlurredShadows && !MorphicPreferences.isFlat ? + blur : border; + highlight.bounds.setExtent(fb.extent().add(edge * 2)); + highlight.holes = [highlight.bounds]; // make the highlight untouchable + highlight.color = color; + highlight.cachedImage = useBlurredShadows && !MorphicPreferences.isFlat ? + this.highlightImageBlurred(color, blur) + : this.highlightImage(color, border); + highlight.setPosition(fb.origin.subtract(new Point(edge, edge))); + return highlight; +}; + +BlockMorph.prototype.highlightImage = function (color, border) { + var fb, img, hi, ctx, out; + fb = this.fullBounds().extent(); + this.doWithAlpha(1, () => img = this.fullImage()); + + hi = newCanvas(fb.add(border * 2)); + ctx = hi.getContext('2d'); + + ctx.drawImage(img, 0, 0); + ctx.drawImage(img, border, 0); + ctx.drawImage(img, border * 2, 0); + ctx.drawImage(img, border * 2, border); + ctx.drawImage(img, border * 2, border * 2); + ctx.drawImage(img, border, border * 2); + ctx.drawImage(img, 0, border * 2); + ctx.drawImage(img, 0, border); + + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage(img, border, border); + + out = newCanvas(fb.add(border * 2)); + ctx = out.getContext('2d'); + ctx.drawImage(hi, 0, 0); + ctx.globalCompositeOperation = 'source-atop'; + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, out.width, out.height); + + return out; +}; + +BlockMorph.prototype.highlightImageBlurred = function (color, blur) { + var fb, img, hi, ctx; + fb = this.fullBounds().extent(); + this.doWithAlpha(1, () => img = this.fullImage()); + + hi = newCanvas(fb.add(blur * 2)); + ctx = hi.getContext('2d'); + ctx.shadowBlur = blur; + ctx.shadowColor = color.toString(); + ctx.drawImage(img, blur, blur); + + ctx.shadowBlur = 0; + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage(img, blur, blur); + return hi; +}; + +BlockMorph.prototype.getHighlight = function () { + var highlights; + highlights = this.children.slice(0).reverse().filter(child => + child instanceof BlockHighlightMorph + ); + if (highlights.length !== 0) { + return highlights[0]; + } + return null; +}; + +BlockMorph.prototype.flashOutline = function (color, border) { + this.removeHighlight(); + this.addBack(this.outline(color, border)); + this.fullChanged(); +}; + +BlockMorph.prototype.outline = function (color, border) { + var highlight = new BlockHighlightMorph(), + fb = this.fullBounds(), + edge = border; + highlight.bounds.setExtent(fb.extent().add(edge * 2)); + highlight.color = color; + highlight.cachedImage = this.highlightImage(color, border); + highlight.setPosition(fb.origin.subtract(new Point(edge, edge))); + return highlight; +}; + +// BlockMorph zebra coloring + +BlockMorph.prototype.fixBlockColor = function (nearestBlock, isForced) { + var nearest = nearestBlock, + clr, + cslot; + + if (!this.zebraContrast && !isForced) { + return; + } + if (!this.zebraContrast && isForced) { + return this.forceNormalColoring(true); + } + + if (!nearest) { + if (this.parent) { + if (this.isPrototype) { + nearest = null; // this.parent; // the PrototypeHatBlockMorph + } else if (this instanceof ReporterBlockMorph) { + nearest = this.parent.parentThatIsA(BlockMorph); + } else { // command + cslot = this.parentThatIsA(CommandSlotMorph, ReporterSlotMorph); + if (cslot) { + nearest = cslot.parentThatIsA(BlockMorph); + } + } + } + } + if (!nearest) { // top block + clr = SpriteMorph.prototype.blockColorFor(this.category); + if (!this.color.eq(clr)) { + this.alternateBlockColor(); + } + } else if (nearest.category === this.category) { + if (nearest.color.eq(this.color)) { + this.alternateBlockColor(); + } + } else if (this.category && !this.color.eq( + SpriteMorph.prototype.blockColorFor(this.category) + )) { + this.alternateBlockColor(); + } + if (isForced) { + this.fixChildrensBlockColor(true); + } +}; + +BlockMorph.prototype.forceNormalColoring = function () { + var clr = SpriteMorph.prototype.blockColorFor(this.category); + this.setColor(clr); + this.setLabelColor( + WHITE, + clr.darker(this.labelContrast), + MorphicPreferences.isFlat ? ZERO : this.embossing + ); + this.fixChildrensBlockColor(true); +}; + +BlockMorph.prototype.alternateBlockColor = function () { + var clr = SpriteMorph.prototype.blockColorFor(this.category); + + if (this.color.eq(clr)) { + this.setColor( + this.zebraContrast < 0 ? clr.darker(Math.abs(this.zebraContrast)) + : clr.lighter(this.zebraContrast), + this.hasLabels() // silently + ); + } else { + this.setColor(clr, this.hasLabels()); // silently + } + this.fixLabelColor(); + this.fixChildrensBlockColor(true); // has issues if not forced +}; + +BlockMorph.prototype.ghost = function () { + this.setColor( + SpriteMorph.prototype.blockColorFor(this.category).lighter(35) + ); +}; + +BlockMorph.prototype.fixLabelColor = function () { + if (this.zebraContrast > 0 && this.category) { + var clr = SpriteMorph.prototype.blockColorFor(this.category); + if (this.color.eq(clr)) { + this.setLabelColor( + WHITE, + clr.darker(this.labelContrast), + MorphicPreferences.isFlat ? null : this.embossing + ); + } else { + this.setLabelColor( + BLACK, + clr.lighter(this.zebraContrast) + .lighter(this.labelContrast * 2), + MorphicPreferences.isFlat ? null : this.embossing.neg() + ); + } + } +}; + +BlockMorph.prototype.fixChildrensBlockColor = function (isForced) { + this.children.forEach(morph => { + if (morph instanceof CommandBlockMorph) { + morph.fixBlockColor(null, isForced); + } else if (morph instanceof SyntaxElementMorph) { + morph.fixBlockColor(this, isForced); + if (morph instanceof BooleanSlotMorph) { + morph.fixLayout(); + } + } + }); +}; + +BlockMorph.prototype.setCategory = function (aString) { + this.category = aString; + this.fixBlockColor(); +}; + +BlockMorph.prototype.hasLabels = function () { + return this.children.some(any => any instanceof StringMorph); +}; + +// BlockMorph copying + +BlockMorph.prototype.fullCopy = function () { + var ans = BlockMorph.uber.fullCopy.call(this); + ans.removeHighlight(); + ans.isDraggable = true; + if (this.instantiationSpec) { + ans.setSpec(this.instantiationSpec); + } + ans.allChildren().filter(block => { + if (block instanceof SyntaxElementMorph) { + block.cachedInputs = null; + if (block.isCustomBlock) { + block.initializeVariables(); + } + } + return !isNil(block.comment); + }).forEach(block => { + var cmnt = block.comment.fullCopy(); + block.comment = cmnt; + cmnt.block = block; + }); + ans.cachedInputs = null; + return ans; +}; + +BlockMorph.prototype.reactToTemplateCopy = function () { + if (this.isLocalVarTemplate) { + this.isLocalVarTemplate = null; + this.fixLayout(); + } + this.forceNormalColoring(); +}; + +BlockMorph.prototype.hasBlockVars = function () { + return this.anyChild(any => + any.isCustomBlock && + any.isGlobal && + any.definition.variableNames.length + ); +}; + +BlockMorph.prototype.pickUp = function (wrrld) { + // used when duplicating and grabbing a block via its context menu + // position the duplicate's top-left corner at the mouse pointer + var world = wrrld || this.world(); + this.setPosition(world.hand.position().subtract(this.rounding)); + world.hand.grab(this); +}; + +// BlockMorph events + +BlockMorph.prototype.mouseClickLeft = function () { + var top = this.topBlock(), + receiver = top.scriptTarget(), + shiftClicked = this.world().currentKey === 16, + stage; + if (shiftClicked && !this.isTemplate) { + return this.selectForEdit().focus(); // enable copy-on-edit + } + if (top instanceof PrototypeHatBlockMorph) { + return; // top.mouseClickLeft(); + } + if (receiver) { + stage = receiver.parentThatIsA(StageMorph); + if (stage) { + stage.threads.toggleProcess(top, receiver); + } + } +}; + +BlockMorph.prototype.focus = function () { + var scripts = this.parentThatIsA(ScriptsMorph), + world = this.world(), + focus; + if (!scripts || !ScriptsMorph.prototype.enableKeyboard) {return; } + if (scripts.focus) {scripts.focus.stopEditing(); } + world.stopEditing(); + focus = new ScriptFocusMorph(scripts, this); + scripts.focus = focus; + focus.getFocus(world); + if (this instanceof HatBlockMorph) { + focus.nextCommand(); + } +}; + +BlockMorph.prototype.activeProcess = function () { + var top = this.topBlock(), + receiver = top.scriptTarget(), + stage; + if (top instanceof PrototypeHatBlockMorph) { + return null; + } + if (receiver) { + stage = receiver.parentThatIsA(StageMorph); + if (stage) { + return stage.threads.findProcess(top, receiver); + } + } + return null; +}; + +BlockMorph.prototype.mouseEnterBounds = function (dragged) { + var rcvr, vName, dec; + + if (dragged && !MorphicPreferences.isTouchDevice) {return; } + + // slightly increase my opacity if block-fading is active + if (this.alpha < 1) { + this.alpha = Math.min(this.alpha + 0.2, 1); + this.rerender(); + } + + if (Process.prototype.enableSingleStepping) { + // highlight senders and receivers of message / broadcast blocks + if (contains( + ['doBroadcast', 'doBroadcastAndWait', 'receiveMessage', + 'receiveOnClone', 'receiveGo'], + this.selector + )) { + this.showMessageUsers(); + } + + // highlight the lexical scope of a variable declaration when visible + // stepping is turned on in the IDE. + // Only applies to variable getters that serve as variable declarations + // either in the blocks palette or in a template slot (upvar etc.) + if (this.selector === 'reportGetVar' && + this.isTemplate && + !(this.parent instanceof SyntaxElementMorph) + ) { + rcvr = this.scriptTarget(); + rcvr.flashScope( + this.instantiationSpec || this.blockSpec, + !this.isLocalVarTemplate + ); + } else { + // highlight the variable declaration this block is referring to, + // if it happens to be a variable accessor + vName = this.getVarName(); + if (vName) { + dec = this.rewind().find(elem => + elem.selector === 'reportGetVar' && + elem.isTemplate && + (elem.instantiationSpec || elem.blockSpec) === vName + ); + if (dec) { + dec.flash(this.activeHighlight.darker()); + } else { + rcvr = this.scriptTarget(); + if (!rcvr.variables.allNames().includes(vName)) { + this.flash(new Color(255, 50, 50)); + } + } + } + } + } +}; + +BlockMorph.prototype.mouseLeaveBounds = function (dragged) { + var rcvr, vName, dec; + + if (SyntaxElementMorph.prototype.alpha < 1) { + delete this.alpha; + this.rerender(); + } + + if (Process.prototype.enableSingleStepping && + (!dragged || MorphicPreferences.isTouchDevice) + ) { + // highlight the lexical scope of a variable declaration when visible + // stepping is turned on in the IDE. + if (this.selector === 'reportGetVar' && + this.isTemplate && + !(this.parent instanceof SyntaxElementMorph) + ) { + rcvr = this.scriptTarget(); + rcvr.unflashScope( + this.instantiationSpec || this.blockSpec, + !this.isLocalVarTemplate + ); + } else { + vName = this.getVarName(); + if (vName) { + dec = this.rewind().find( + elem => elem.selector === 'reportGetVar' && + elem.isTemplate && + (elem.instantiationSpec || elem.blockSpec) === vName + ); + (dec || this).unflash(); + } + } + } +}; + +BlockMorph.prototype.mouseDownLeft = function (pos) { + if (Process.prototype.enableSingleStepping) { + // un-highhlight any scope-visualization + // before possible picking me up + this.mouseLeaveBounds(); + } +}; + +// BlockMorph dragging and dropping + +BlockMorph.prototype.rootForGrab = function () { + return this; +}; + +/* + for demo purposes, allows you to drop arg morphs onto + blocks and forces a layout update. This section has + no relevance in end user mode. +*/ + +BlockMorph.prototype.wantsDropOf = function (aMorph) { + // override the inherited method + return (aMorph instanceof ArgMorph + || aMorph instanceof StringMorph + || aMorph instanceof TextMorph + ) && !this.isTemplate; +}; + +BlockMorph.prototype.reactToDropOf = function (droppedMorph) { + droppedMorph.isDraggable = false; + droppedMorph.fixLayout(); + this.fixLayout(); + this.buildSpec(); +}; + +BlockMorph.prototype.situation = function () { + // answer a dictionary specifying where I am right now, so + // I can slide back to it if I'm dropped somewhere else + // NOTE: We can also add more key-value pairs to the situation + // dictionary to support non-standard modes of user-interaction, + // such as extracting single commands from within a stack + // see recordDrop() and userExtractJustThis() + if (!(this.parent instanceof TemplateSlotMorph)) { + var scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + return { + origin: scripts, + position: this.position().subtract(scripts.position()) + }; + } + } + return BlockMorph.uber.situation.call(this); +}; + +// BlockMorph sticky comments + +BlockMorph.prototype.prepareToBeGrabbed = function (hand) { + var wrld = hand ? hand.world : this.world(), + trgt = this.scriptTarget(true); + + this.allInputs().forEach(input => + delete input.bindingID + ); + this.allComments().forEach(comment => + comment.startFollowing(this, wrld) + ); + + if (trgt) { + trgt.recordUserEdit( + 'scripts', + 'block', + 'grab', + this.abstractBlockSpec() + ); + } +}; + +BlockMorph.prototype.justDropped = function () { + var trgt = this.scriptTarget(true); + delete this.alpha; + this.allComments().forEach(comment => + comment.stopFollowing() + ); + + if (trgt) { + trgt.recordUserEdit( + 'scripts', + 'block', + 'drop', + this.abstractBlockSpec() + ); + } +}; + +BlockMorph.prototype.allComments = function () { + return this.allChildren().filter(block => + !isNil(block.comment) + ).map(block => + block.comment + ); +}; + +BlockMorph.prototype.destroy = function (justThis) { + // private - use IDE_Morph.removeBlock() to first stop all my processes + if (justThis) { + if (!isNil(this.comment)) { + this.comment.destroy(); + } + } else { + this.allComments().forEach(comment => + comment.destroy() + ); + } + BlockMorph.uber.destroy.call(this); +}; + +BlockMorph.prototype.stackHeight = function () { + var fb = this.fullBounds(), + commentsBottom = Math.max(this.allComments().map(comment => + comment.bottom() + )) || this.bottom(); + return Math.max(fb.bottom(), commentsBottom) - fb.top(); +}; + +BlockMorph.prototype.stackFullBounds = function () { + var fb = this.fullBounds(); + this.allComments().forEach(comment => + fb.mergeWith(comment.bounds) + ); + return fb; +}; + +BlockMorph.prototype.stackWidth = function () { + var fb = this.fullBounds(), + commentsRight = Math.max(this.allComments().map(comment => + comment.right() + )) || this.right(); + return Math.max(fb.right(), commentsRight) - fb.left(); +}; + +BlockMorph.prototype.snap = function () { + var top = this.topBlock(), + receiver, + stage, + ide; + top.allComments().forEach(comment => + comment.align(top) + ); + // fix highlights, if any + if (this.getHighlight() && (this !== top)) { + this.removeHighlight(); + } + if (top.getHighlight()) { + top.addHighlight(top.removeHighlight()); + } + // register generic hat blocks + if (this.selector === 'receiveCondition') { + receiver = top.scriptTarget(); + if (receiver) { + stage = receiver.parentThatIsA(StageMorph); + if (stage) { + stage.enableCustomHatBlocks = true; + stage.threads.pauseCustomHatBlocks = false; + ide = stage.parentThatIsA(IDE_Morph); + if (ide) { + ide.controlBar.stopButton.refresh(); + } + } + } + } +}; + +// BlockMorph lexical variable scope analysis + +BlockMorph.prototype.scopeFor = function (varName, afterThis) { + // return an array of blocks within my lexical scope that access + // the given variable name. + // Optional Boolean "afterThis" switch indicates whether the very first + // - i.e. - this block should be ignored, because it is the template whose + // scope is being determined. + + return this.fullScopeFor(varName, afterThis).filter(elem => + elem instanceof BlockMorph && elem.isVariableAccessorFor(varName) + ); +}; + +BlockMorph.prototype.isVariableAccessorFor = function (varName) { + // private + if (this.selector === 'reportGetVar') { + return this.blockSpec === varName; + } + return this.inputs().some(any => + any.choices === 'getVarNamesDict' && + any.evaluate() === varName + ); +}; + +BlockMorph.prototype.fullScopeFor = function (varName, afterThis) { + // return an array of syntax elements within my lexical scope that can + // access the given variable name. + // Optional Boolean "afterThis" switch indicates whether the very first + // - i.e. - this block should be ignored, because it is the template whose + // scope is being determined. + + function select(opsArray) { + var end = opsArray.findIndex(e => + e instanceof TemplateSlotMorph && e.contents() === varName), + scope = [], + i, elem; + if (end < 0) {end = opsArray.length; } + for (i = 0; i < end; i += 1) { + elem = opsArray[i]; + if (elem instanceof Array) { + scope.push(select(elem)); + } else { + scope.push(elem); + } + } + return scope; + } + + return select(this.unwind().slice(afterThis ? 1 : 0)).flat(Infinity); +}; + +// BlockMorph op-sequence analysis + +BlockMorph.prototype.unwind = function () { + // return an array of blocks and input slots (roughly) mimicking my + // sequence of operations, i.e. inside-out & left-to-right. + // Lambda expressions branch off as array elements. + + var inp = this.inputs(), + current = this, + nxt; + if (inp.length) { + return inp[0].unwind(); + } + if (this.nextBlock && !this.isPrototype) { // command + nxt = this.nextBlock(); + if (nxt) { + return [this].concat(nxt.unwind()); + } + // find the nearest enclosing C-slot or Ring + current = this.parentThatIsA(CommandSlotMorph, RingMorph); + if (!current || !current.isStatic || current instanceof RingMorph) { + return [this]; + } + } + if (this.parent instanceof TemplateSlotMorph) { + current = this.parent; + } + // reporter or multi-arg + if (current.parent instanceof MultiArgMorph || + current.parent instanceof BlockMorph) { + nxt = current.parent; + } else if (current.parent instanceof ArgMorph) { + nxt = current.parent.parentThatIsA(BlockMorph); + current = current.parent; + } + if (nxt) { + return [this].concat(nxt.unwindAfter(current)); + } + return [this]; +}; + +BlockMorph.prototype.unwindAfter = function (element) { + // private + var idx = this.inputs().indexOf(element), + current = this, + nxt; + if (idx === this.inputs().length - 1) { // end of block + if (this.nextBlock && !this.isPrototype) { // command + nxt = this.nextBlock(); + if (nxt) { + return [this].concat(nxt.unwind()); + } + // find the nearest enclosing C-slot or Ring + current = this.parentThatIsA(CommandSlotMorph, RingMorph); + if (!current || !current.isStatic || current instanceof RingMorph) { + return [this]; + } + } + // reporter, multi-arg or embedded prototype + if (this.parent instanceof TemplateSlotMorph) { + current = this.parent; + } + // reporter or multi-arg + if (current.parent instanceof MultiArgMorph || + current.parent instanceof BlockMorph) { + nxt = current.parent; + } else if (current.parent instanceof ArgMorph) { + nxt = current.parent.parentThatIsA(BlockMorph); + current = current.parent; + } + if (nxt) { + return [this].concat(nxt.unwindAfter(current)); + } + return [this]; + } + return this.inputs()[idx + 1].unwind(); +}; + +BlockMorph.prototype.rewind = function (scriptOnly = false) { + // return an array of blocks and inputs roughly mimicking the visible + // sequence of operations leading up to this block. Used to trace + // variable accessors back to their nearest variable declaration within + // lexical scope. + // scriptOnly is optional, if set to scanning stops at the script's + // top block, excluding sprite-local and global variable declarations + + var current = this, + trace = [], + declarations, + ide; + + function log(block) { + if (trace.includes(block)) {return; } + trace.push(block); + block.inputs().slice(0).reverse().forEach(elem => { + var nested; + if (elem instanceof MultiArgMorph) { + trace.push(elem); + elem.inputs().slice(0).reverse().forEach(inp => { + if (inp instanceof TemplateSlotMorph) { + trace.push(inp.template()); + } else if (inp instanceof BlockMorph) { + if (!(inp instanceof RingMorph)) { + log(inp); + } + } else if (inp instanceof CommandSlotMorph) { + if (inp.isStatic) { + nested = inp.nestedBlock(); + if (nested) { + nested.blockSequence().forEach(cmd => log(cmd)); + } + } + } else { + trace.push(inp); + } + }); + } else if (elem instanceof TemplateSlotMorph) { + trace.push(elem.template()); + } else if (elem instanceof BlockMorph) { + if (!(elem instanceof RingMorph)) { + log(elem); + } + } else if (elem instanceof CommandSlotMorph) { + if (elem.isStatic) { + nested = elem.nestedBlock(); + if (nested) { + nested.blockSequence().forEach(cmd => log(cmd)); + } + } + } else { + trace.push(elem); + } + }); + } + + while (current instanceof BlockMorph) { + log(current); + current = current.parent?.parentThatIsA(BlockMorph); + } + + if (!scriptOnly) { + ide = this.scriptTarget().parentThatIsA(IDE_Morph); + if (ide) { + declarations = ide.palette.contents.children.filter(morph => + morph instanceof BlockMorph && morph.selector === 'reportGetVar' + ).reverse(); + declarations.forEach(block => trace.push(block)); + } + } + + return trace; +}; + + BlockMorph.prototype.getVarName = function () { + // return the name of the (first) variable accessed by this block or null + // if it doesn't access any variable. + var slot, name; + if (this.isTemplate) {return null; } + if (this.selector === 'reportGetVar') { + return this.blockSpec || null; + } + slot = this.inputs().find(elem => elem.choices === 'getVarNamesDict'); + if (slot) { + name = slot.evaluate(); + if (name instanceof Array) {return null; } + return name || null; + } + return null; + }; + +// CommandBlockMorph /////////////////////////////////////////////////// + +/* + I am a stackable jigsaw-shaped block. + + I inherit from BlockMorph adding the following most important + public accessors: + + nextBlock() - set / get the block attached to my bottom + bottomBlock() - answer the bottom block of my stack + blockSequence() - answer an array of blocks starting with myself + + and the following "lexical awareness" indicators: + + partOfCustomCommand - temporary bool set by the evaluator + exitTag - temporary string or number set by the evaluator +*/ + +// CommandBlockMorph inherits from BlockMorph: + +CommandBlockMorph.prototype = new BlockMorph(); +CommandBlockMorph.prototype.constructor = CommandBlockMorph; +CommandBlockMorph.uber = BlockMorph.prototype; + +// CommandBlockMorph instance creation: + +function CommandBlockMorph() { + this.init(); +} + +CommandBlockMorph.prototype.init = function () { + CommandBlockMorph.uber.init.call(this); + + this.bounds.setExtent(new Point(60, 24).multiplyBy(this.scale)); + this.fixLayout(); + this.rerender(); + + this.partOfCustomCommand = false; + this.exitTag = null; +}; + +// CommandBlockMorph enumerating: + +CommandBlockMorph.prototype.blockSequence = function () { + var sequence = [this], + nb = this.nextBlock(); + while (nb) { + sequence.push(nb); + nb = nb.nextBlock(); + } + return sequence; +}; + +CommandBlockMorph.prototype.bottomBlock = function () { + // topBlock() also exists - inherited from SyntaxElementMorph + if (this.nextBlock()) { + return this.nextBlock().bottomBlock(); + } + return this; +}; + +CommandBlockMorph.prototype.nextBlock = function (block) { + // set / get the block attached to my bottom + if (block) { + var nb = this.nextBlock(), + affected = this.parentThatIsA(CommandSlotMorph, ReporterSlotMorph); + this.add(block); + if (nb) { + block.bottomBlock().nextBlock(nb); + } + block.setPosition( + new Point( + this.left(), + this.bottom() - (this.corner) + ) + ); + if (affected) { + affected.fixLayout(); + } + } else { + return detect( + this.children, + child => child instanceof CommandBlockMorph && !child.isPrototype + ); + } +}; + +// CommandBlockMorph attach targets: + +CommandBlockMorph.prototype.topAttachPoint = function () { + return new Point( + this.dentCenter(), + this.top() + ); +}; + +CommandBlockMorph.prototype.bottomAttachPoint = function () { + return new Point( + this.dentCenter(), + this.bottom() + ); +}; + +CommandBlockMorph.prototype.wrapAttachPoint = function () { + var cslot = detect( // could be a method making uses of caching... + this.inputs(), // ... although these already are cached + each => each instanceof CSlotMorph + ); + if (cslot && !cslot.nestedBlock()) { + return new Point( + cslot.left() + (cslot.inset * 2) + cslot.corner, + cslot.top() + (cslot.corner * 2) + ); + } + return null; +}; + +CommandBlockMorph.prototype.dentLeft = function () { + return this.left() + + this.corner + + this.inset; +}; + +CommandBlockMorph.prototype.dentCenter = function () { + return this.dentLeft() + + this.corner + + (this.dent * 0.5); +}; + +CommandBlockMorph.prototype.attachTargets = function () { + var answer = [], + tp; + if (!(this instanceof HatBlockMorph)) { + tp = this.topAttachPoint(); + if (!(this.parent instanceof SyntaxElementMorph)) { + answer.push({ + point: tp, + element: this, + loc: 'top', + type: 'block' + }); + } + if (ScriptsMorph.prototype.enableNestedAutoWrapping || + !this.parentThatIsA(CommandSlotMorph)) { + answer.push({ + point: tp, + element: this, + loc: 'wrap', + type: 'block' + }); + } + } + if (!this.isStop()) { + answer.push({ + point: this.bottomAttachPoint(), + element: this, + loc: 'bottom', + type: 'block' + }); + } + return answer; +}; + +CommandBlockMorph.prototype.allAttachTargets = function (newParent) { + var target = newParent || this.parent, + answer = [], + topBlocks; + + if (this instanceof HatBlockMorph && newParent.rejectsHats) { + return answer; + } + topBlocks = target.children.filter(child => + (child !== this) && + child instanceof SyntaxElementMorph && + !child.isTemplate + ); + topBlocks.forEach(block => + block.forAllChildren(child => { + if (child.attachTargets) { + child.attachTargets().forEach(at => + answer.push(at) + ); + } + }) + ); + return answer; +}; + +CommandBlockMorph.prototype.closestAttachTarget = function (newParent) { + var target = newParent || this.parent, + bottomBlock = this.bottomBlock(), + answer = null, + thresh = Math.max( + this.corner * 2 + this.dent, + this.minSnapDistance + ), + dist, + ref = [], + minDist = 1000, + wrap; + + if (!(this instanceof HatBlockMorph)) { + ref.push( + { + point: this.topAttachPoint(), + loc: 'top' + } + ); + wrap = this.wrapAttachPoint(); + if (wrap) { + ref.push( + { + point: wrap, + loc: 'wrap' + } + ); + } + } + if (!bottomBlock.isStop()) { + ref.push( + { + point: bottomBlock.bottomAttachPoint(), + loc: 'bottom' + } + ); + } + this.allAttachTargets(target).forEach(eachTarget => + ref.forEach(eachRef => { + // match: either both locs are 'wrap' or both are different, + // none being 'wrap' (can this be expressed any better?) + if ((eachRef.loc === 'wrap' && (eachTarget.loc === 'wrap')) || + ((eachRef.loc !== eachTarget.loc) && + (eachRef.loc !== 'wrap') && (eachTarget.loc !== 'wrap')) + ) { + dist = eachRef.point.distanceTo(eachTarget.point); + if ((dist < thresh) && (dist < minDist)) { + minDist = dist; + answer = eachTarget; + } + } + }) + ); + return answer; +}; + +CommandBlockMorph.prototype.snap = function (hand) { + var target = this.closestAttachTarget(), + scripts = this.parentThatIsA(ScriptsMorph), + before, + next, + offsetY, + cslot, + affected; + + scripts.clearDropInfo(); + scripts.lastDroppedBlock = this; + if (target === null) { + this.fixBlockColor(); + CommandBlockMorph.uber.snap.call(this); // align stuck comments + if (hand) { + scripts.recordDrop(hand.grabOrigin); + } + return; + } + scripts.lastDropTarget = target; + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'snap', + this.abstractBlockSpec() + ); + if (target.loc === 'bottom') { + if (target.type === 'slot') { + this.removeHighlight(); + scripts.lastNextBlock = target.element.nestedBlock(); + target.element.nestedBlock(this); + } else { + scripts.lastNextBlock = target.element.nextBlock(); + target.element.nextBlock(this); + } + if (this.isStop()) { + next = this.nextBlock(); + if (next) { + scripts.add(next); + next.moveBy(this.extent().floorDivideBy(2)); + affected = this.parentThatIsA( + CommandSlotMorph, + ReporterSlotMorph + ); + if (affected) { + affected.fixLayout(); + } + } + } + } else if (target.loc === 'top') { + target.element.removeHighlight(); + offsetY = this.bottomBlock().bottom() - this.bottom(); + this.setBottom(target.element.top() + this.corner - offsetY); + this.setLeft(target.element.left()); + this.bottomBlock().nextBlock(target.element); + } else if (target.loc === 'wrap') { + cslot = detect( // this should be a method making use of caching + this.inputs(), // these are already cached, so maybe it's okay + each => each instanceof CSlotMorph + ); + // assume the cslot is (still) empty, was checked determining the target + before = (target.element.parent); + scripts.lastWrapParent = before; + + // adjust position of wrapping block + this.moveBy(target.point.subtract(cslot.slotAttachPoint())); + + // wrap c-slot around target + cslot.nestedBlock(target.element); + if (before instanceof CommandBlockMorph) { + before.nextBlock(this); + } else if (before instanceof CommandSlotMorph) { + before.nestedBlock(this); + } else if (before instanceof RingReporterSlotMorph) { + before.add(this); + before.fixLayout(); + } + + // fix zebra coloring. + // this could probably be generalized into the fixBlockColor mechanism + target.element.blockSequence().forEach(cmd => + cmd.fixBlockColor() + ); + } + this.fixBlockColor(); + CommandBlockMorph.uber.snap.call(this); // align stuck comments + if (hand) { + scripts.recordDrop(hand.grabOrigin); + } + if (this.snapSound) { + this.snapSound.play(); + } +}; + +CommandBlockMorph.prototype.prepareToBeGrabbed = function (handMorph) { + // check whether the shift-key is held down and if I can be "extracted" + if (handMorph && handMorph.world.currentKey === 16 && this.nextBlock()) { + this.extract(); // NOTE: no infinite recursion, because extract() + // doesn't call this again with a hand + handMorph.grabOrigin.action = 'extract'; // ??? + return; + } + + var oldPos = this.position(); + + if (this.parent instanceof RingReporterSlotMorph) { + this.parent.revertToDefaultInput(this); + this.setPosition(oldPos); + } + CommandBlockMorph.uber.prepareToBeGrabbed.call(this, handMorph); +}; + +CommandBlockMorph.prototype.isStop = function () { + var choice; + if (this.selector === 'doStopThis') { // this could be cached... + choice = this.inputs()[0].evaluate(); + return choice instanceof Array && choice[0].length < 12; + } + return ([ + 'doForever', + 'doReport', + 'removeClone', + 'doSwitchToScene' + ].indexOf(this.selector) > -1); +}; + +// CommandBlockMorph deleting + +CommandBlockMorph.prototype.userDestroy = function () { + var target = this.selectForEdit(), // enable copy-on-edit + rcvr = this.scriptTarget(true); + + if (target !== this) { + return this.userDestroy.call(target); + } + if (this.nextBlock()) { + this.userDestroyJustThis(); + return; + } + + var scripts = this.parentThatIsA(ScriptsMorph), + ide = this.parentThatIsA(IDE_Morph), + parent = this.parentThatIsA(SyntaxElementMorph), + cslot = this.parentThatIsA(CSlotMorph); + + // for undrop / redrop + if (scripts) { + scripts.clearDropInfo(); + scripts.lastDroppedBlock = this; + scripts.recordDrop(this.situation()); + scripts.dropRecord.action = 'delete'; + } + + this.prepareToBeGrabbed(); // fix outer ring reporter slot + + if (ide) { + // also stop all active processes hatted by this block + ide.removeBlock(this); + } else { + this.destroy(); + } + if (cslot) { + cslot.fixLayout(); + } + if (parent) { + parent.reactToGrabOf(this); // fix highlight + } + + if (rcvr) { + rcvr.recordUserEdit( + 'scripts', + 'block', + 'delete', + this.abstractBlockSpec() + ); + } +}; + +CommandBlockMorph.prototype.userDestroyJustThis = function () { + // delete just this one block, reattach next block to the previous one, + var scripts = this.parentThatIsA(ScriptsMorph), + nb = this.nextBlock(), + trgt = this.scriptTarget(true); + + // for undrop / redrop + if (scripts) { + scripts.clearDropInfo(); + scripts.lastDroppedBlock = this; + scripts.recordDrop(this.situation()); + scripts.dropRecord.lastNextBlock = nb; + scripts.dropRecord.action = 'delete'; + } + + this.extract(); + + if (trgt) { + trgt.recordUserEdit( + 'scripts', + 'block', + 'delete', + this.abstractBlockSpec() + ); + } +}; + +CommandBlockMorph.prototype.userExtractJustThis = function () { + // extract just this one block, reattach next block to the previous one, + var situation = this.situation(); + situation.action = "extract"; // record how this block was retrieved + this.extract(); + this.pickUp(situation.origin.world()); + this.parent.grabOrigin = situation; +}; + +CommandBlockMorph.prototype.extract = function () { + // private: extract just this one block + // reattach next block to the previous one, + var scripts = this.parentThatIsA(ScriptsMorph), + ide = this.parentThatIsA(IDE_Morph), + cs = this.parentThatIsA(CommandSlotMorph, RingReporterSlotMorph), + pb, + nb = this.nextBlock(), + above, + parent = this.parentThatIsA(SyntaxElementMorph), + cslot = this.parentThatIsA(CSlotMorph, RingReporterSlotMorph), + trgt = this.scriptTarget(true); + + + this.topBlock().fullChanged(); + if (this.parent) { + pb = this.parent.parentThatIsA(CommandBlockMorph); + } + if (pb && (pb.nextBlock() === this)) { + above = pb; + } else if (cs && (cs.nestedBlock() === this)) { + above = cs; + this.prepareToBeGrabbed(); // restore ring reporter slot, if any + } + if (trgt) { + trgt.recordUserEdit( + 'scripts', + 'block', + 'extract', + this.abstractBlockSpec() + ); + } + if (ide) { + // also stop all active processes hatted by this block + ide.removeBlock(this, true); // just this block + } else { + this.destroy(true); // just this block + } + if (nb) { + if (above instanceof CommandSlotMorph || + above instanceof RingReporterSlotMorph + ) { + above.nestedBlock(nb); + } else if (above instanceof CommandBlockMorph) { + above.nextBlock(nb); + } else { + scripts.add(nb); + } + } else if (cslot) { + cslot.fixLayout(); + } + if (parent) { + parent.reactToGrabOf(this); // fix highlight + } +}; + +// CommandBlockMorph drawing: + +CommandBlockMorph.prototype.outlinePath = function(ctx, inset) { + var indent = this.corner * 2 + this.inset, + bottom = this.height() - this.corner, + bottomCorner = this.height() - this.corner * 2, + radius = Math.max(this.corner - inset, 0), + pos = this.position(); + + // top left: + ctx.arc( + this.corner, + this.corner, + radius, + radians(-180), + radians(-90), + false + ); + + // top dent: + ctx.lineTo(this.corner + this.inset, inset); + ctx.lineTo(indent, this.corner + inset); + ctx.lineTo(indent + this.dent, this.corner + inset); + ctx.lineTo(this.corner * 3 + this.inset + this.dent, inset); + ctx.lineTo(this.width() - this.corner, inset); + + // top right: + ctx.arc( + this.width() - this.corner, + this.corner, + radius, + radians(-90), + radians(-0), + false + ); + + // C-Slots + this.cSlots().forEach(slot => { + slot.outlinePath(ctx, inset, slot.position().subtract(pos)); + }); + + // bottom right: + ctx.arc( + this.width() - this.corner, + bottomCorner, + radius, + radians(0), + radians(90), + false + ); + + if (!this.isStop()) { + ctx.lineTo(this.width() - this.corner, bottom - inset); + ctx.lineTo(this.corner * 3 + this.inset + this.dent, bottom - inset); + ctx.lineTo(indent + this.dent, bottom + this.corner - inset); + ctx.lineTo(indent, bottom + this.corner - inset); + ctx.lineTo(this.corner + this.inset, bottom - inset); + } + + // bottom left: + ctx.arc( + this.corner, + bottomCorner, + radius, + radians(90), + radians(180), + false + ); +}; + +CommandBlockMorph.prototype.drawEdges = function (ctx) { + this.drawTopDentEdge(ctx, 0, 0); + this.drawBottomDentEdge(ctx, 0, this.height() - this.corner); + this.drawLeftEdge(ctx); + this.drawRightEdge(ctx); + this.drawTopLeftEdge(ctx); + this.drawBottomRightEdge(ctx); +}; + +CommandBlockMorph.prototype.drawTopDentEdge = function (ctx, x, y) { + var shift = this.edge * 0.5, + indent = x + this.corner * 2 + this.inset, + upperGradient, + lowerGradient, + leftGradient, + lgx; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + upperGradient = ctx.createLinearGradient( + 0, + y, + 0, + y + this.edge + ); + upperGradient.addColorStop(0, this.cachedClrBright); + upperGradient.addColorStop(1, this.cachedClr); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo(this.corner, y + shift); + ctx.lineTo(x + this.corner + this.inset, y + shift); + ctx.stroke(); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo( + x + this.corner * 3 + this.inset + this.dent + shift, + y + shift + ); + ctx.lineTo(this.width() - this.corner, y + shift); + ctx.stroke(); + + lgx = x + this.corner + this.inset; + leftGradient = ctx.createLinearGradient( + lgx - this.edge, + y + this.edge, + lgx, + y + ); + leftGradient.addColorStop(0, this.cachedClr); + leftGradient.addColorStop(1, this.cachedClrBright); + + ctx.strokeStyle = leftGradient; + ctx.beginPath(); + ctx.moveTo(x + this.corner + this.inset, y + shift); + ctx.lineTo(indent, y + this.corner + shift); + ctx.stroke(); + + lowerGradient = ctx.createLinearGradient( + 0, + y + this.corner, + 0, + y + this.corner + this.edge + ); + lowerGradient.addColorStop(0, this.cachedClrBright); + lowerGradient.addColorStop(1, this.cachedClr); + + ctx.strokeStyle = lowerGradient; + ctx.beginPath(); + ctx.moveTo(indent, y + this.corner + shift); + ctx.lineTo(indent + this.dent, y + this.corner + shift); + ctx.stroke(); +}; + +CommandBlockMorph.prototype.drawBottomDentEdge = function (ctx, x, y) { + var shift = this.edge * 0.5, + indent = x + this.corner * 2 + this.inset, + upperGradient, + lowerGradient, + rightGradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + upperGradient = ctx.createLinearGradient( + 0, + y - this.edge, + 0, + y + ); + upperGradient.addColorStop(0, this.cachedClr); + upperGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo(this.corner, y - shift); + if (this.isStop()) { + ctx.lineTo(this.width() - this.corner, y - shift); + } else { + ctx.lineTo(x + this.corner + this.inset - shift, y - shift); + } + ctx.stroke(); + + if (this.isStop()) { // draw straight bottom edge + return null; + } + + lowerGradient = ctx.createLinearGradient( + 0, + y + this.corner - this.edge, + 0, + y + this.corner + ); + lowerGradient.addColorStop(0, this.cachedClr); + lowerGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = lowerGradient; + ctx.beginPath(); + ctx.moveTo(indent + shift, y + this.corner - shift); + ctx.lineTo(indent + this.dent, y + this.corner - shift); + ctx.stroke(); + + rightGradient = ctx.createLinearGradient( + x + indent + this.dent - this.edge, + y + this.corner - this.edge, + x + indent + this.dent, + y + this.corner + ); + rightGradient.addColorStop(0, this.cachedClr); + rightGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = rightGradient; + ctx.beginPath(); + ctx.moveTo(x + indent + this.dent, y + this.corner - shift); + ctx.lineTo( + x + this.corner * 3 + this.inset + this.dent, + y - shift + ); + ctx.stroke(); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo( + x + this.corner * 3 + this.inset + this.dent, + y - shift + ); + ctx.lineTo(this.width() - this.corner, y - shift); + ctx.stroke(); +}; + +CommandBlockMorph.prototype.drawFlatBottomDentEdge = function (ctx) { + if (!this.isStop()) { + ctx.fillStyle = this.color.darker(this.contrast / 2).toString(); + ctx.beginPath(); + this.drawDent(ctx, 0, this.height() - this.corner); + ctx.closePath(); + ctx.fill(); + } +}; + +CommandBlockMorph.prototype.drawLeftEdge = function (ctx) { + var shift = this.edge * 0.5, + gradient = ctx.createLinearGradient(0, 0, this.edge, 0); + + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, this.corner); + ctx.lineTo(shift, this.height() - this.corner * 2 - shift); + ctx.stroke(); +}; + +CommandBlockMorph.prototype.drawRightEdge = function (ctx) { + var shift = this.edge * 0.5, + cslots = this.cSlots(), + top = this.top(), + x = this.width(), + y, + gradient; + + gradient = ctx.createLinearGradient(x - this.edge, 0, x, 0); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + ctx.strokeStyle = gradient; + + if (cslots.length) { + ctx.beginPath(); + ctx.moveTo(x - shift, this.corner + shift); + cslots.forEach(slot => { + y = slot.top() - top; + ctx.lineTo(x - shift, y); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(x - shift, y + slot.height()); + }); + } else { + ctx.beginPath(); + ctx.moveTo(x - shift, this.corner + shift); + } + ctx.lineTo(x - shift, this.height() - this.corner * 2); + ctx.stroke(); +}; + +CommandBlockMorph.prototype.drawTopLeftEdge = function (ctx) { + var shift = this.edge * 0.5, + gradient; + + gradient = ctx.createRadialGradient( + this.corner, + this.corner, + this.corner, + this.corner, + this.corner, + this.corner - this.edge + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.arc( + this.corner, + this.corner, + this.corner - shift, + radians(-180), + radians(-90), + false + ); + ctx.stroke(); +}; + +CommandBlockMorph.prototype.drawBottomRightEdge = function (ctx) { + var shift = this.edge * 0.5, + x = this.width() - this.corner, + y = this.height() - this.corner * 2, + gradient; + + gradient = ctx.createRadialGradient( + x, + y, + this.corner, + x, + y, + this.corner - this.edge + ); + gradient.addColorStop(0, this.cachedClrDark); + gradient.addColorStop(1, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.arc( + x, + y, + this.corner - shift, + radians(90), + radians(0), + true + ); + ctx.stroke(); +}; + +// HatBlockMorph /////////////////////////////////////////////////////// + +/* + I am a script's top most block. I can attach command blocks at my + bottom, but not on top. + +*/ + +// HatBlockMorph inherits from CommandBlockMorph: + +HatBlockMorph.prototype = new CommandBlockMorph(); +HatBlockMorph.prototype.constructor = HatBlockMorph; +HatBlockMorph.uber = CommandBlockMorph.prototype; + +// HatBlockMorph instance creation: + +function HatBlockMorph() { + this.init(); +} + +HatBlockMorph.prototype.init = function () { + HatBlockMorph.uber.init.call(this); + this.bounds.setExtent(new Point(120, 36).multiplyBy(this.scale)); + this.fixLayout(); + this.rerender(); +}; + +// HatBlockMorph enumerating: + +HatBlockMorph.prototype.blockSequence = function () { + // override my inherited method so that I am not part of my sequence + var result = HatBlockMorph.uber.blockSequence.call(this); + result.shift(); + return result; +}; + +// HatBlockMorph syntax analysis + +HatBlockMorph.prototype.reify = function () { + // private - assumes that I've already been deep copied + var nb = this.nextBlock(), + cmt = this.comment?.text(), + ctx; + if (!nb) { + ctx = new Context(); + ctx.comment = cmt; + return ctx; + } + return nb.reify(null, cmt); +}; + +// HatBlockMorph drawing: + +HatBlockMorph.prototype.outlinePath = function(ctx, inset) { + var indent = this.corner * 2 + this.inset, + bottom = this.height() - this.corner, + bottomCorner = this.height() - this.corner * 2, + radius = Math.max(this.corner - inset, 0), + s = this.hatWidth, + h = this.hatHeight, + r = ((4 * h * h) + (s * s)) / (8 * h), + a = degrees(4 * Math.atan(2 * h / s)), + sa = a / 2, + sp = Math.min(s * 1.7, this.width() - this.corner); + + // top arc: + ctx.moveTo(inset, h + this.corner); + ctx.arc( + s / 2, + r, + r, + radians(-sa - 90), + radians(-90), + false + ); + ctx.bezierCurveTo( + s, + 0, + s, + h, + sp, + h + ); + + // top right: + ctx.arc( + this.width() - this.corner, + h + this.corner, + radius, + radians(-90), + radians(-0), + false + ); + + // bottom right: + ctx.arc( + this.width() - this.corner, + bottomCorner, + radius, + radians(0), + radians(90), + false + ); + + if (!this.isStop()) { + ctx.lineTo(this.width() - this.corner, bottom - inset); + ctx.lineTo(this.corner * 3 + this.inset + this.dent, bottom - inset); + ctx.lineTo(indent + this.dent, bottom + this.corner - inset); + ctx.lineTo(indent, bottom + this.corner - inset); + ctx.lineTo(this.corner + this.inset, bottom - inset); + } + + // bottom left: + ctx.arc( + this.corner, + bottomCorner, + radius, + radians(90), + radians(180), + false + ); +}; + +HatBlockMorph.prototype.drawLeftEdge = function (ctx) { + var shift = this.edge * 0.5, + gradient = ctx.createLinearGradient(0, 0, this.edge, 0); + + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, this.hatHeight + shift); + ctx.lineTo(shift, this.height() - this.corner * 2 - shift); + ctx.stroke(); +}; + +HatBlockMorph.prototype.drawRightEdge = function (ctx) { + var shift = this.edge * 0.5, + x = this.width(), + gradient; + + gradient = ctx.createLinearGradient(x - this.edge, 0, x, 0); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(x - shift, this.corner + this.hatHeight + shift); + ctx.lineTo(x - shift, this.height() - this.corner * 2); + ctx.stroke(); +}; + +HatBlockMorph.prototype.drawTopDentEdge = nop; + +HatBlockMorph.prototype.drawTopLeftEdge = function (ctx) { + var shift = this.edge * 0.5, + s = this.hatWidth, + h = this.hatHeight, + r = ((4 * h * h) + (s * s)) / (8 * h), + a = degrees(4 * Math.atan(2 * h / s)), + sa = a / 2, + sp = Math.min(s * 1.7, this.width() - this.corner), + gradient; + + gradient = ctx.createRadialGradient( + s / 2, + r, + r - this.edge, + s / 2, + r, + r + ); + gradient.addColorStop(1, this.cachedClrBright); + gradient.addColorStop(0, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + Math.round(s / 2), + r, + r - shift, + radians(-sa - 90), + radians(-90), + false + ); + ctx.moveTo(s / 2, shift); + ctx.bezierCurveTo( + s, + shift, + s, + h + shift, + sp, + h + shift + ); + ctx.lineTo(this.width() - this.corner, h + shift); + ctx.stroke(); +}; + +// ReporterBlockMorph ////////////////////////////////////////////////// + +/* + I am a block with a return value, either round-ish or diamond shaped + I inherit all my important accessors from BlockMorph +*/ + +// ReporterBlockMorph inherits from BlockMorph: + +ReporterBlockMorph.prototype = new BlockMorph(); +ReporterBlockMorph.prototype.constructor = ReporterBlockMorph; +ReporterBlockMorph.uber = BlockMorph.prototype; + +// ReporterBlockMorph instance creation: + +function ReporterBlockMorph(isPredicate) { + this.init(isPredicate); +} + +ReporterBlockMorph.prototype.init = function (isPredicate) { + ReporterBlockMorph.uber.init.call(this); + this.isPredicate = isPredicate || false; + + this.bounds.setExtent(new Point(50, 22).multiplyBy(this.scale)); + this.fixLayout(); + this.rerender(); + + this.cachedSlotSpec = null; // don't serialize + this.isLocalVarTemplate = null; // don't serialize +}; + +// ReporterBlockMorph drag & drop: + +ReporterBlockMorph.prototype.snap = function (hand) { + // passing the hand is optional (for when blocks are dragged & dropped) + var scripts = this.parent, + nb, + target; + + this.cachedSlotSpec = null; + if (!(scripts instanceof ScriptsMorph)) { + return null; + } + + scripts.clearDropInfo(); + scripts.lastDroppedBlock = this; + + target = scripts.closestInput(this, hand); + if (target !== null) { + scripts.lastReplacedInput = target; + scripts.lastDropTarget = target.parent; + if (target instanceof MultiArgMorph) { + scripts.lastPreservedBlocks = target.inputs(); + scripts.lastReplacedInput = target.fullCopy(); + } else if (target instanceof CommandSlotMorph) { + scripts.lastReplacedInput = target; + nb = target.nestedBlock(); + if (nb) { + nb = nb.fullCopy(); + scripts.add(nb); + nb.moveBy(nb.extent()); + nb.fixBlockColor(); + scripts.lastPreservedBlocks = [nb]; + } + } + target.parent.replaceInput(target, this); + if (this.snapSound) { + this.snapSound.play(); + } + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'snap', + this.abstractBlockSpec() + ); + } + this.fixBlockColor(); + ReporterBlockMorph.uber.snap.call(this); + if (hand) { + scripts.recordDrop(hand.grabOrigin); + } +}; + +ReporterBlockMorph.prototype.prepareToBeGrabbed = function (handMorph) { + var oldPos = this.position(); + + if ((this.parent instanceof BlockMorph) + || (this.parent instanceof MultiArgMorph) + || (this.parent instanceof ReporterSlotMorph)) { + this.parent.revertToDefaultInput(this); + this.setPosition(oldPos); + } + ReporterBlockMorph.uber.prepareToBeGrabbed.call(this, handMorph); + if (handMorph) { + handMorph.alpha = this.alpha < 1 ? 1 : 0.85; + } + this.cachedSlotSpec = null; +}; + +// ReporterBlockMorph enumerating + +ReporterBlockMorph.prototype.blockSequence = function () { + // reporters don't have a sequence, answer myself + return this; +}; + +// ReporterBlockMorph evaluating + +ReporterBlockMorph.prototype.isUnevaluated = function () { + // answer whether my parent block's slot is designated to be of an + // 'unevaluated' kind, denoting a spedial form + var spec = this.getSlotSpec(); + return spec === '%anyUE' || + spec === '%boolUE' || + spec === '%f'; +}; + +ReporterBlockMorph.prototype.isLocked = function () { + // answer true if I can be exchanged by a dropped reporter + return this.isStatic || (this.getSlotSpec() === '%t'); +}; + +ReporterBlockMorph.prototype.getSlotSpec = function () { + // answer the spec of the slot I'm in, if any + // cached for performance + if (!this.cachedSlotSpec) { + this.cachedSlotSpec = this.determineSlotSpec(); + /* + } else { + // debug slot spec caching + var real = this.determineSlotSpec(); + if (real !== this.cachedSlotSpec) { + throw new Error( + 'cached slot spec ' + + this.cachedSlotSpec + + ' does not match: ' + + real + ); + } + */ + } + return this.cachedSlotSpec; +}; + +ReporterBlockMorph.prototype.determineSlotSpec = function () { + // private - answer the spec of the slot I'm in, if any + var parts, idx; + if (this.parent instanceof BlockMorph) { + parts = this.parent.parts().filter(part => + !(part instanceof BlockHighlightMorph) + ); + idx = parts.indexOf(this); + if (idx !== -1) { + if (this.parent.blockSpec) { + return this.parseSpec(this.parent.blockSpec)[idx]; + } + } + } + if (this.parent instanceof MultiArgMorph) { + return this.parent.slotSpec; + } + if (this.parent instanceof TemplateSlotMorph) { + return this.parent.getSpec(); + } + return ''; +}; + +// ReporterBlockMorph events + +ReporterBlockMorph.prototype.mouseClickLeft = function (pos) { + var label; + if (this.parent instanceof BlockInputFragmentMorph) { + return this.parent.mouseClickLeft(); + } + if (this.parent instanceof TemplateSlotMorph) { + if (this.parent.parent && this.parent.parent.parent && + this.parent.parent.parent instanceof RingMorph) { + label = "Input name"; + } else if (this.parent.parent.elementSpec === '%blockVars') { + label = "Block variable name"; + } else { + label = "Script variable name"; + } + new DialogBoxMorph( + this, + this.userSetSpec, + this + ).prompt( + label, + this.blockSpec, + this.world() + ); + } else { + ReporterBlockMorph.uber.mouseClickLeft.call(this, pos); + } +}; + +// ReporterBlockMorph deleting + +ReporterBlockMorph.prototype.userDestroy = function () { + // make sure to restore default slot of parent block + var target = this.selectForEdit(), // enable copy-on-edit + rcvr = this.scriptTarget(true); + if (target !== this) { + return this.userDestroy.call(target); + } + + // for undrop / redrop + var scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + scripts.clearDropInfo(); + scripts.lastDroppedBlock = this; + scripts.recordDrop(this.situation()); + scripts.dropRecord.action = 'delete'; + } + + this.topBlock().fullChanged(); + this.prepareToBeGrabbed(this.world().hand); + this.destroy(); + + if (rcvr) { + rcvr.recordUserEdit( + 'scripts', + 'block', + 'delete', + this.abstractBlockSpec() + ); + } +}; + +// ReporterBlockMorph drawing: + +ReporterBlockMorph.prototype.outlinePath = function (ctx, inset) { + if (this.isPredicate) { + this.outlinePathDiamond(ctx, inset); + } else { + this.outlinePathOval(ctx, inset); + } +}; + +ReporterBlockMorph.prototype.outlinePathOval = function (ctx, inset) { + // draw the 'flat' shape + var h = this.height(), + r = Math.min(this.rounding, h / 2), + radius = Math.max(r - inset, 0), + w = this.width(), + pos = this.position(); + + // top left: + ctx.arc( + r, + r, + radius, + radians(-180), + radians(-90), + false + ); + + // top right: + ctx.arc( + w - r, + r, + radius, + radians(-90), + radians(-0), + false + ); + + // C-Slots + this.cSlots().forEach(slot => { + slot.outlinePath(ctx, inset, slot.position().subtract(pos)); + }); + + // bottom right: + ctx.arc( + w - r, + h - r, + radius, + radians(0), + radians(90), + false + ); + + // bottom left: + ctx.arc( + r, + h - r, + radius, + radians(90), + radians(180), + false + ); + + ctx.lineTo(r - radius, r); // close the path so we can clip it for rings +}; + +ReporterBlockMorph.prototype.outlinePathDiamond = function (ctx, inset) { + // draw the 'flat' shape: + var w = this.width(), + h = this.height(), + h2 = Math.floor(h / 2), + r = this.rounding, + right = w - r, + pos = this.position(), + cslots = this.cSlots(); + + ctx.moveTo(inset, h2); + ctx.lineTo(r, inset); + ctx.lineTo(right - inset, inset); + + if (cslots.length) { + this.cSlots().forEach(slot => { + slot.outlinePath(ctx, inset, slot.position().subtract(pos)); + }); + } else { + ctx.lineTo(w - inset, h2); + } + + ctx.lineTo(right - inset, h - inset); + ctx.lineTo(r, h - inset); +}; + +ReporterBlockMorph.prototype.drawEdges = function (ctx) { + if (this.isPredicate) { + this.drawEdgesDiamond(ctx); + } else { + this.drawEdgesOval(ctx); + } +}; + +ReporterBlockMorph.prototype.drawEdgesOval = function (ctx) { + // add 3D-Effect + var h = this.height(), + r = Math.max(Math.min(this.rounding, h / 2), this.edge), + w = this.width(), + shift = this.edge / 2, + y, + top = this.top(), + cslots = this.cSlots(), + gradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // half-tone edges + // bottem left corner + gradient = ctx.createRadialGradient( + r, + h - r, + r - this.edge, + r, + h - r, + r + this.edge + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + r, + h - r, + r - shift, + radians(90), + radians(180), + false + ); + ctx.stroke(); + + // top right corner + gradient = ctx.createRadialGradient( + w - r, + r, + r - this.edge, + w - r, + r, + r + this.edge + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + w - r, + r, + r - shift, + radians(-90), + radians(0), + false + ); + ctx.stroke(); + + // normal gradient edges + + // top edge: straight line + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r - shift, shift); + ctx.lineTo(w - r + shift, shift); + ctx.stroke(); + + // top edge: left corner + gradient = ctx.createRadialGradient( + r, + r, + r - this.edge, + r, + r, + r + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + r, + r, + r - shift, + radians(180), + radians(270), + false + ); + ctx.stroke(); + + // bottom edge: right corner + gradient = ctx.createRadialGradient( + w - r, + h - r, + r - this.edge, + w - r, + h - r, + r + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + w - r, + h - r, + r - shift, + radians(0), + radians(90), + false + ); + ctx.stroke(); + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r - shift, h - shift); + ctx.lineTo(w - r + shift, h - shift); + ctx.stroke(); + + // left edge: straight vertical line + gradient = ctx.createLinearGradient(0, 0, this.edge, 0); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, r); + ctx.lineTo(shift, h - r); + ctx.stroke(); + + // right edge: straight vertical line + gradient = ctx.createLinearGradient(w - this.edge, 0, w, 0); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + + if (cslots.length) { + ctx.beginPath(); + ctx.moveTo(w - shift, r + shift); + cslots.forEach(slot => { + y = slot.top() - top; + ctx.lineTo(w - shift, y); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(w - shift, y + slot.height()); + }); + } else { + ctx.beginPath(); + ctx.moveTo(w - shift, r + shift); + } + + ctx.lineTo(w - shift, h - r); + ctx.stroke(); +}; + +ReporterBlockMorph.prototype.drawEdgesDiamond = function (ctx) { + // add 3D-Effec + var w = this.width(), + h = this.height(), + h2 = Math.floor(h / 2), + r = this.rounding, + shift = this.edge / 2, + cslots = this.cSlots(), + top = this.top(), + y, + gradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // half-tone edges + // bottom left corner + gradient = ctx.createLinearGradient( + -r, + 0, + r, + 0 + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, h2); + ctx.lineTo(r, h - shift); + ctx.closePath(); + ctx.stroke(); + + // normal gradient edges + // top edge: left corner + gradient = ctx.createLinearGradient( + 0, + 0, + r, + 0 + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, h2); + ctx.lineTo(r, shift); + ctx.closePath(); + ctx.stroke(); + + // top edge: straight line + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r, shift); + + // right edge + if (cslots.length) { + // end of top edge + ctx.lineTo(w - r - shift, shift); + ctx.closePath(); + ctx.stroke(); + + // right vertical edge + gradient = ctx.createLinearGradient(w - r - this.edge, 0, w - r, 0); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(w - r - shift, this.edge + shift); + cslots.forEach(slot => { + y = slot.top() - top; + ctx.lineTo(w - r - shift, y); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(w - r - shift, y + slot.height()); + }); + ctx.lineTo(w - r - shift, h - shift); + ctx.stroke(); + } else { + // end of top edge + ctx.lineTo(w - r, shift); + ctx.closePath(); + ctx.stroke(); + + // top diagonal slope right + gradient = ctx.createLinearGradient( + w - r, + 0, + w + r, + 0 + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - shift, h2); + ctx.lineTo(w - r, shift); + ctx.closePath(); + ctx.stroke(); + + // bottom diagonal slope right + gradient = ctx.createLinearGradient( + w - r, + 0, + w, + 0 + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - r, h - shift); + ctx.lineTo(w - shift, h2); + ctx.closePath(); + ctx.stroke(); + } + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r + shift, h - shift); + ctx.lineTo(w - r - shift, h - shift); + ctx.closePath(); + ctx.stroke(); +}; + +// RingMorph ///////////////////////////////////////////////////////////// + +/* + I am a reporter block which reifies its contents, my outer shape is + always roundish (never diamond) +*/ + +// RingMorph inherits from ReporterBlockMorph: + +RingMorph.prototype = new ReporterBlockMorph(); +RingMorph.prototype.constructor = RingMorph; +RingMorph.uber = ReporterBlockMorph.prototype; + +// RingMorph preferences settings: + +RingMorph.prototype.isCachingInputs = false; +// RingMorph.prototype.edge = 2; +// RingMorph.prototype.rounding = 9; +// RingMorph.prototype.alpha = 0.8; +// RingMorph.prototype.contrast = 85; + +// RingMorph instance creation: + +function RingMorph() { + this.init(); +} + +RingMorph.prototype.init = function () { + RingMorph.uber.init.call(this); + this.category = 'other'; + this.contrast = RingMorph.prototype.contrast; + this.setExtent(new Point(200, 80)); +}; + +// RingMorph drawing + +RingMorph.prototype.render = function (ctx) { + var slot = this.inputs()[0], + pos = this.position(); + + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + + if (MorphicPreferences.isFlat) { + // draw the outer filled shape + // draw the outline + ctx.fillStyle = this.cachedClrDark; + ctx.beginPath(); + this.outlinePath(ctx, 0); + + // render the hole: + slot.outlinePath(ctx, slot.position().subtract(pos)); + + // ctx.closePath(); + ctx.clip('evenodd'); + ctx.fillRect(0, 0, this.width(), this.height()); + + // draw the inner filled shaped + // draw the outline + ctx.fillStyle = this.cachedClr; + ctx.beginPath(); + this.outlinePath(ctx, this.flatEdge); + + // render the hole: + slot.outlinePath(ctx, slot.position().subtract(pos)); + + // ctx.closePath(); + ctx.clip('evenodd'); + ctx.fillRect(0, 0, this.width(), this.height()); + } else { + // draw the flat shape + // draw the outline + ctx.fillStyle = this.cachedClr; + ctx.beginPath(); + this.outlinePath(ctx, 0); + + // render the hole: + slot.outlinePath(ctx, slot.position().subtract(pos)); + + // ctx.closePath(); + ctx.clip('evenodd'); + ctx.fillRect(0, 0, this.width(), this.height()); + + // add 3D-Effect: + this.drawEdges(ctx); + } +}; + +// RingMorph dragging and dropping + +RingMorph.prototype.rootForGrab = function () { + if (this.isDraggable) { + return this; + } + return BlockMorph.uber.rootForGrab.call(this); +}; + +// RingMorph ops - Note: these assume certain layouts defined elsewhere - + +RingMorph.prototype.embed = function (aBlock, inputNames, noVanish) { + var slot; + + // set my color + this.color = SpriteMorph.prototype.blockColor.other; + this.isDraggable = true; + + // set my type, selector, and nested block: + if (aBlock instanceof CommandBlockMorph) { + this.isStatic = false; + this.setSpec('%rc %ringparms'); + this.selector = 'reifyScript'; + slot = this.parts()[0]; + slot.nestedBlock(aBlock); + } else if (aBlock.isPredicate) { + this.isStatic = true; + this.setSpec('%rp %ringparms'); + this.selector = 'reifyPredicate'; + slot = this.parts()[0]; + slot.replaceInput(slot.contents(), aBlock); + } else if (aBlock instanceof BooleanSlotMorph) { + this.isStatic = false; + this.setSpec('%rp %ringparms'); + this.selector = 'reifyPredicate'; + slot = this.parts()[0]; + slot.replaceInput(slot.contents(), aBlock); + } else { // reporter or input slot) + this.isStatic = false; + this.setSpec('%rr %ringparms'); + this.selector = 'reifyReporter'; + slot = this.parts()[0]; + slot.replaceInput(slot.contents(), aBlock, noVanish); + } + + // set my inputs, if any + slot = this.parts()[1]; + if (inputNames) { + inputNames.forEach(name => + slot.addInput(name) + ); + } + + // ensure zebra coloring + this.fixBlockColor(null, true); +}; + +RingMorph.prototype.vanishForSimilar = function () { + // let me disappear if I am nesting a variable getter or Ring + // but only if I'm not already inside another ring + var slot = this.parts()[0], + block = slot.nestedBlock(); + + if (!block) {return null; } + if (!(this.parent instanceof SyntaxElementMorph)) {return null; } + if (this.parent instanceof RingReporterSlotMorph + || (this.parent instanceof RingCommandSlotMorph)) { + return null; + } + if ((block.selector === 'reportGetVar' && + !contains(this.inputNames(), block.blockSpec)) || + // block.selector === 'reportListItem' || + block.selector === 'reportJSFunction' || + block.selector === 'reportAttributeOf' || + block.selector === 'reportCompiled' || + block.selector === 'reportThisContext' || + (block instanceof RingMorph) + ) { + this.parent.replaceInput(this, block); + } +}; + +RingMorph.prototype.contents = function () { + return this.parts()[0].nestedBlock(); +}; + +RingMorph.prototype.inputNames = function () { + return this.parts()[1].evaluate(); +}; + +RingMorph.prototype.dataType = function () { + switch (this.selector) { + case 'reifyScript': + return 'command'; + case 'reifyPredicate': + return 'predicate'; + default: + return 'reporter'; + } +}; + +RingMorph.prototype.isEmptySlot = function () { + return this.contents() === null && + (this.getSlotSpec().indexOf('Ring') > 0); +}; + +// RingMorph zebra coloring + +RingMorph.prototype.fixBlockColor = function (nearest, isForced) { + var slot = this.parts()[0]; + RingMorph.uber.fixBlockColor.call(this, nearest, isForced); + slot.fixLayout(); +}; + +// RingMorph menu + +RingMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + if (this.parent instanceof MultiArgMorph && + this.parentThatIsA(ScriptsMorph) + ) { + if (!this.parent.maxInputs || + (this.parent.inputs().length < this.parent.maxInputs) + ) { + menu.addItem( + 'insert a slot', + () => this.parent.insertNewInputBefore(this) + ); + } + if (this.isEmptySlot() && + this.parent.inputs().length > this.parent.minInputs + ) { + menu.addItem( + 'delete slot', + () => this.parent.deleteSlot(this) + ); + } + return menu; + } + return RingMorph.uber.userMenu.call(this); +}; + +// RingMorph op-sequence analysis + +RingMorph.prototype.unwind = function () { + var nested = this.contents(), + parms = this.inputs()[1].inputs(), + nxt = this.parent instanceof MultiArgMorph ? this.parent + : this.parent.parentThatIsA(BlockMorph); + if (nested) { + return [parms.concat(nested.unwind()).concat([this])] + .concat(nxt ? nxt.unwindAfter(this) : []); + } + return [parms].concat([this]).concat(nxt ? nxt.unwindAfter(this) : []); +}; + +RingMorph.prototype.unwindAfter = function (elem) { + var nested; + if (elem === this.inputs()[1]) { + nested = this.contents(); + if (nested) { + return nested.unwind(); + } + } + return []; +}; + +// ScriptsMorph //////////////////////////////////////////////////////// + +/* + I give feedback about possible drop targets and am in charge + of actually snapping blocks together. + + My children are the top blocks of scripts. + + I store a back-pointer to my owner, i.e. the object (sprite) + to whom my scripts apply. +*/ + +// ScriptsMorph inherits from FrameMorph: + +ScriptsMorph.prototype = new FrameMorph(); +ScriptsMorph.prototype.constructor = ScriptsMorph; +ScriptsMorph.uber = FrameMorph.prototype; + +// ScriptsMorph preference settings + +ScriptsMorph.prototype.cleanUpMargin = 20; +ScriptsMorph.prototype.cleanUpSpacing = 15; +ScriptsMorph.prototype.isPreferringEmptySlots = true; +ScriptsMorph.prototype.enableKeyboard = true; +ScriptsMorph.prototype.enableNestedAutoWrapping = true; +ScriptsMorph.prototype.feedbackColor = WHITE; + +// ScriptsMorph instance creation: + +function ScriptsMorph() { + this.init(); +} + +ScriptsMorph.prototype.init = function () { + this.feedbackMorph = new BoxMorph(); + this.rejectsHats = false; + + // "undrop" attributes: + this.lastDroppedBlock = null; + this.lastReplacedInput = null; + this.lastDropTarget = null; + this.lastPreservedBlocks = null; + this.lastNextBlock = null; + this.lastWrapParent = null; + + // keyboard editing support: + this.focus = null; + + ScriptsMorph.uber.init.call(this); + this.setColor(new Color(70, 70, 70)); + + // initialize "undrop" queue + this.isAnimating = false; + this.dropRecord = null; + this.recordDrop(); +}; + +// ScriptsMorph deep copying: + +ScriptsMorph.prototype.fullCopy = function () { + var cpy = new ScriptsMorph(), + pos = this.position(), + child; + if (this.focus) { + this.focus.stopEditing(); + } + this.children.forEach(morph => { + if (!morph.block) { // omit anchored comments + child = morph.fullCopy(); + cpy.add(child); + child.setPosition(morph.position().subtract(pos)); + if (child instanceof BlockMorph) { + child.allComments().forEach(comment => + comment.align(child) + ); + } + } + }); + cpy.adjustBounds(); + return cpy; +}; + +// ScriptsMorph rendering: + +ScriptsMorph.prototype.render = function (aContext) { + aContext.fillStyle = this.getRenderColor().toString(); + aContext.fillRect(0, 0, this.width(), this.height()); + if (this.cachedTexture) { + this.renderCachedTexture(aContext); + } else if (this.texture) { + this.renderTexture(this.texture, aContext); + } +}; + +ScriptsMorph.prototype.getRenderColor = function () { + if (MorphicPreferences.isFlat || + SyntaxElementMorph.prototype.alpha > 0.85) { + return this.color; + } + return this.color.mixed( + Math.max(SyntaxElementMorph.prototype.alpha - 0.15, 0), + SpriteMorph.prototype.paletteColor + ); +}; + +ScriptsMorph.prototype.renderCachedTexture = function (ctx) { + // support blocks-to-text slider + if (SyntaxElementMorph.prototype.alpha > 0.8) { + ScriptsMorph.uber.renderCachedTexture.call(this, ctx); + } +}; + +// ScriptsMorph stepping: + +ScriptsMorph.prototype.step = function () { + var world = this.world(), + hand = world.hand, + block; + + if (this.feedbackMorph.parent) { + this.feedbackMorph.destroy(); + this.feedbackMorph.parent = null; + } + if (this.focus && (!world.keyboardFocus || + world.keyboardFocus instanceof StageMorph)) { + this.focus.getFocus(world); + } + if (hand.children.length === 0) { + return null; + } + if (!this.bounds.containsPoint(hand.bounds.origin)) { + return null; + } + block = hand.children[0]; + if (!(block instanceof BlockMorph) && !(block instanceof CommentMorph)) { + return null; + } + if (!contains(hand.morphAtPointer().allParents(), this)) { + return null; + } + if (block instanceof CommentMorph) { + this.showCommentDropFeedback(block, hand); + } else if (block instanceof ReporterBlockMorph) { + this.showReporterDropFeedback(block, hand); + } else { + this.showCommandDropFeedback(block); + } +}; + +ScriptsMorph.prototype.showReporterDropFeedback = function (block, hand) { + var target = this.closestInput(block, hand); + + if (target === null) { + return null; + } + this.feedbackMorph.edge = SyntaxElementMorph.prototype.rounding; + this.feedbackMorph.border = Math.max( + SyntaxElementMorph.prototype.edge, + 3 + ); + if (target instanceof MultiArgMorph) { + this.feedbackMorph.color = + SpriteMorph.prototype.blockColor.lists.copy(); + this.feedbackMorph.borderColor = + SpriteMorph.prototype.blockColor.lists; + target = target.arrows(); + } else { + this.feedbackMorph.color = this.feedbackColor.copy(); + this.feedbackMorph.borderColor = this.feedbackColor; + } + this.feedbackMorph.bounds = target.fullBounds() + .expandBy(Math.max( + block.edge * 2, + block.reporterDropFeedbackPadding + )); + this.feedbackMorph.color.a = 0.5; + this.feedbackMorph.rerender(); + this.add(this.feedbackMorph); +}; + +ScriptsMorph.prototype.showCommandDropFeedback = function (block) { + var y, target; + + target = block.closestAttachTarget(this); + if (!target) { + return null; + } + if (target.loc === 'wrap') { + this.showCSlotWrapFeedback(block, target.element); + return; + } + this.add(this.feedbackMorph); + this.feedbackMorph.border = 0; + this.feedbackMorph.edge = 0; + this.feedbackMorph.alpha = 1; + this.feedbackMorph.bounds.setWidth(target.element.width()); + this.feedbackMorph.bounds.setHeight(Math.max( + SyntaxElementMorph.prototype.corner, + SyntaxElementMorph.prototype.feedbackMinHeight + ) + ); + this.feedbackMorph.color = this.feedbackColor; + y = target.point.y; + if (target.loc === 'bottom') { + if (target.type === 'block') { + if (target.element.nextBlock()) { + y -= SyntaxElementMorph.prototype.corner; + } + } else if (target.type === 'slot') { + if (target.element.nestedBlock()) { + y -= SyntaxElementMorph.prototype.corner; + } + } + } + this.feedbackMorph.setPosition(new Point( + target.element.left(), + y + )); +}; + +ScriptsMorph.prototype.showCommentDropFeedback = function (comment, hand) { + var target = this.closestBlock(comment, hand); + if (!target) { + return null; + } + + this.feedbackMorph.bounds = target.bounds + .expandBy(Math.max( + BlockMorph.prototype.edge * 2, + BlockMorph.prototype.reporterDropFeedbackPadding + )); + this.feedbackMorph.edge = SyntaxElementMorph.prototype.rounding; + this.feedbackMorph.border = Math.max( + SyntaxElementMorph.prototype.edge, + 3 + ); + this.add(this.feedbackMorph); + this.feedbackMorph.color = comment.color.copy(); + this.feedbackMorph.color.a = 0.25; + this.feedbackMorph.borderColor = comment.titleBar.color; + this.feedbackMorph.rerender(); +}; + +ScriptsMorph.prototype.showCSlotWrapFeedback = function (srcBlock, trgBlock) { + var clr; + this.feedbackMorph.bounds = trgBlock.fullBounds() + .expandBy(BlockMorph.prototype.corner); + this.feedbackMorph.edge = SyntaxElementMorph.prototype.corner; + this.feedbackMorph.border = Math.max( + SyntaxElementMorph.prototype.edge, + 3 + ); + this.add(this.feedbackMorph); + clr = srcBlock.color.lighter(40); + this.feedbackMorph.color = clr.copy(); + this.feedbackMorph.color.a = 0.1; + this.feedbackMorph.borderColor = clr; + this.feedbackMorph.rerender(); +}; + +ScriptsMorph.prototype.closestInput = function (reporter, hand) { + // passing the hand is optional (when dragging reporters) + var fb = reporter.fullBoundsNoShadow(), + stacks = this.children.filter(child => + (child instanceof BlockMorph) && + (child.fullBounds().intersects(fb)) + ), + blackList = reporter.allInputs(), + handPos, + target, + all; + + all = []; + stacks.forEach(stack => + all = all.concat(stack.allInputs()) + ); + if (all.length === 0) {return null; } + + function touchingVariadicArrowsIfAny(inp, point) { + if (inp instanceof MultiArgMorph) { + if (point) { + return inp.arrows().bounds.containsPoint(point); + } + return inp.arrows().bounds.intersects(fb); + } + return true; + } + + if (this.isPreferringEmptySlots) { + if (hand) { + handPos = hand.position(); + target = detect( + all, + input => (input instanceof InputSlotMorph || + (input instanceof ArgMorph && + !(input instanceof CommandSlotMorph) && + !(input instanceof MultiArgMorph) + ) || + (input instanceof RingMorph && !input.contents()) || + input.isEmptySlot() + ) && + !input.isLocked() && + input.bounds.containsPoint(handPos) && + !contains(blackList, input) + ); + if (target) { + return target; + } + } + target = detect( + all, + input => (input instanceof InputSlotMorph || + input instanceof ArgMorph || + (input instanceof RingMorph && !input.contents()) || + input.isEmptySlot() + ) && + !input.isLocked() && + input.bounds.intersects(fb) && + !contains(blackList, input) && + touchingVariadicArrowsIfAny(input, handPos) + ); + if (target) { + return target; + } + } + + if (hand) { + handPos = hand.position(); + target = detect( + all, + input => (input !== reporter) && + !input.isLocked() && + input.bounds.containsPoint(handPos) && + !(input.parent instanceof PrototypeHatBlockMorph) && + !contains(blackList, input) && + touchingVariadicArrowsIfAny(input, handPos) + ); + if (target) { + return target; + } + } + return detect( + all, + input => (input !== reporter) && + !input.isLocked() && + input.fullBounds().intersects(fb) && + !(input.parent instanceof PrototypeHatBlockMorph) && + !contains(blackList, input) && + touchingVariadicArrowsIfAny(input) + ); +}; + +ScriptsMorph.prototype.closestBlock = function (comment, hand) { + // passing the hand is optional (when dragging comments) + var fb = comment.bounds, + stacks = this.children.filter(child => + (child instanceof BlockMorph) && + (child.fullBounds().intersects(fb)) + ), + handPos, + target, + all; + + all = []; + stacks.forEach(stack => { + all = all.concat(stack.allChildren().slice(0).reverse().filter( + child => child instanceof BlockMorph && !child.isTemplate + )); + }); + if (all.length === 0) {return null; } + + if (hand) { + handPos = hand.position(); + target = detect( + all, + block => !block.comment && + !block.isPrototype && + block.bounds.containsPoint(handPos) + ); + if (target) { + return target; + } + } + return detect( + all, + block => !block.comment && + !block.isPrototype && + block.bounds.intersects(fb) + ); +}; + +// ScriptsMorph user menu + +ScriptsMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this), + ide = this.parentThatIsA(IDE_Morph), + shiftClicked = this.world().currentKey === 16, + blockEditor, + obj = this.scriptTarget(), + hasUndropQueue, + stage = obj.parentThatIsA(StageMorph); + + function addOption(label, toggle, test, onHint, offHint) { + menu.addItem( + [ + test ? new SymbolMorph( + 'checkedBox', + MorphicPreferences.menuFontSize * 0.75 + ) : new SymbolMorph( + 'rectangle', + MorphicPreferences.menuFontSize * 0.75 + ), + localize(label) + ], + toggle, + test ? onHint : offHint + ); + } + + if (!ide) { + blockEditor = this.parentThatIsA(BlockEditorMorph); + if (blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + } + + if (this.dropRecord) { + if (this.dropRecord.lastRecord) { + hasUndropQueue = true; + menu.addPair( + [ + new SymbolMorph( + 'turnBack', + MorphicPreferences.menuFontSize + ), + localize('undrop') + ], + 'undrop', + '^Z', + 'undo the last\nblock drop\nin this pane' + ); + } + if (this.dropRecord.nextRecord) { + hasUndropQueue = true; + menu.addPair( + [ + new SymbolMorph( + 'turnForward', + MorphicPreferences.menuFontSize + ), + localize('redrop') + ], + 'redrop', + '^Y', + 'redo the last undone\nblock drop\nin this pane' + ); + } + if (hasUndropQueue) { + if (shiftClicked) { + menu.addItem( + "clear undrop queue", + () => { + this.dropRecord = null; + this.clearDropInfo(); + this.recordDrop(); + }, + 'forget recorded block drops\non this pane', + new Color(100, 0, 0) + ); + } + menu.addLine(); + } + } + + menu.addItem('clean up', 'cleanUp', 'arrange scripts\nvertically'); + menu.addItem('add comment', 'addComment'); + menu.addItem( + 'scripts pic...', + 'exportScriptsPicture', + 'save a picture\nof all scripts' + ); + if (ide) { + menu.addLine(); + if (!blockEditor && obj.exemplar) { + addOption( + 'inherited', + () => obj.toggleInheritanceForAttribute('scripts'), + obj.inheritsAttribute('scripts'), + 'uncheck to\ndisinherit', + localize('check to inherit\nfrom') + + ' ' + obj.exemplar.name + ); + } + if (!ide.config.noOwnBlocks) { + menu.addItem( + 'make a block...', + () => new BlockDialogMorph( + null, + definition => { + if (definition.spec !== '') { + if (definition.isGlobal) { + stage.globalBlocks.push(definition); + } else { + obj.customBlocks.push(definition); + } + ide.flushPaletteCache(); + ide.refreshPalette(); + new BlockEditorMorph(definition, obj).popUp(); + } + }, + this + ).prompt( + 'Make a block', + null, + this.world() + ) + ); + } + } + return menu; +}; + +// ScriptsMorph user menu features: + +ScriptsMorph.prototype.cleanUp = function () { + var target = this.selectForEdit(), // enable copy-on-edit + origin = target.topLeft(), + y = target.cleanUpMargin; + target.children.sort((a, b) => + // make sure the prototype hat block always stays on top + a instanceof PrototypeHatBlockMorph ? 0 : a.top() - b.top() + ).forEach(child => { + if (child instanceof CommentMorph && child.block) { + return; // skip anchored comments + } + child.setPosition(origin.add(new Point(target.cleanUpMargin, y))); + if (child instanceof BlockMorph) { + child.allComments().forEach(comment => + comment.align(child, true) // ignore layer + ); + } + y += child.stackHeight() + target.cleanUpSpacing; + }); + if (target.parent) { + target.setPosition(target.parent.topLeft()); + } + target.adjustBounds(); +}; + +ScriptsMorph.prototype.exportScriptsPicture = function () { + var pic = this.scriptsPicture(), + ide = this.world().children[0], + xml = this.scriptsXML(); + + if (pic) { + if (xml) { + ide.saveFileAs( + embedMetadataPNG(pic, xml), + 'image/png', + (ide.getProjectName() || localize('untitled')) + ' ' + + localize('script pic') + ); + } else { + ide.saveCanvasAs( + pic, + (ide.getProjectName() || localize('untitled')) + ' ' + + localize('script pic') + ); + } + } +}; + +ScriptsMorph.prototype.scriptsPicture = function () { + // private - answer a canvas containing the pictures of all scripts + var boundingBox, pic, ctx; + if (this.children.length === 0) {return; } + boundingBox = this.children[0].fullBounds(); + this.children.forEach(child => { + if (child.isVisible) { + boundingBox = boundingBox.merge(child.fullBounds()); + } + }); + pic = newCanvas(boundingBox.extent()); + ctx = pic.getContext('2d'); + this.children.forEach(child => { + var pos = child.fullBounds().origin; + if (child.isVisible) { + ctx.drawImage( + child.fullImage(), + pos.x - boundingBox.origin.x, + pos.y - boundingBox.origin.y + ); + } + }); + return pic; +}; + +ScriptsMorph.prototype.scriptsXML = function () { + // private - answer a container (usually sprite) for all scripts + var blockEditor = this.parentThatIsA(BlockEditorMorph), + ide = this.world().children[0], + scripts = this.children.filter(m => m instanceof BlockMorph), + target; + if (blockEditor) { + return ide.blocksLibraryXML( + [blockEditor.definition].concat( + blockEditor.definition.collectDependencies( + [], + [], + blockEditor.target + ) + ), + null, + true + ); + } + if (scripts.length === 1) { + return scripts[0].toXMLString(); + } + target = this.scriptTarget(); + if (isSnapObject(target)) { + return target.toXMLString(); + } + return null; +}; + +ScriptsMorph.prototype.addComment = function () { + var ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph), + world = this.world(); + new CommentMorph().pickUp(world); + // register the drop-origin, so the element can + // slide back to its former situation if dropped + // somewhere where it gets rejected + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (ide) { + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } +}; + +// ScriptsMorph undrop / redrop + +ScriptsMorph.prototype.undrop = function () { + if (this.isAnimating) {return; } + if (!this.dropRecord || !this.dropRecord.lastRecord) {return; } + if (!this.dropRecord.situation) { + this.dropRecord.situation = + this.dropRecord.lastDroppedBlock.situation(); + } + this.isAnimating = true; + this.dropRecord.lastDroppedBlock.slideBackTo( + this.dropRecord.lastOrigin, + null, + this.recoverLastDrop(), + () => { + this.updateToolbar(); + this.isAnimating = false; + } + ); + this.dropRecord = this.dropRecord.lastRecord; +}; + +ScriptsMorph.prototype.redrop = function () { + if (this.isAnimating) {return; } + if (!this.dropRecord || !this.dropRecord.nextRecord) {return; } + this.dropRecord = this.dropRecord.nextRecord; + if (this.dropRecord.action === 'delete') { + this.recoverLastDrop(true); + this.dropRecord.lastDroppedBlock.destroy(); + this.updateToolbar(); + } else { + this.isAnimating = true; + if (this.dropRecord.action === 'extract') { + this.dropRecord.lastDroppedBlock.extract(); + } + this.dropRecord.lastDroppedBlock.slideBackTo( + this.dropRecord.situation, + null, + this.recoverLastDrop(true), + () => { + this.updateToolbar(); + this.isAnimating = false; + } + ); + } +}; + +ScriptsMorph.prototype.recoverLastDrop = function (forRedrop) { + // retrieve the block last touched by the user and answer a function + // to be called after the animation that moves it back right before + // dropping it into its former situation + var rec = this.dropRecord, + dropped, + onBeforeDrop, + parent; + + if (!rec || !rec.lastDroppedBlock) { + throw new Error('nothing to undrop'); + } + dropped = rec.lastDroppedBlock; + parent = dropped.parent; + if (dropped instanceof CommandBlockMorph) { + if (rec.lastNextBlock) { + if (rec.action === 'delete') { + if (forRedrop) { + this.add(rec.lastNextBlock); + } + } else { + this.add(rec.lastNextBlock); + } + } + if (rec.lastDropTarget) { + if (rec.lastDropTarget.loc === 'bottom') { + if (rec.lastDropTarget.type === 'slot') { + if (rec.lastNextBlock) { + rec.lastDropTarget.element.nestedBlock( + rec.lastNextBlock + ); + } + } else { // 'block' + if (rec.lastNextBlock) { + rec.lastDropTarget.element.nextBlock( + rec.lastNextBlock + ); + } + } + } else if (rec.lastDropTarget.loc === 'top') { + this.add(rec.lastDropTarget.element); + } else if (rec.lastDropTarget.loc === 'wrap') { + var cslot = detect( // could be cached... + rec.lastDroppedBlock.inputs(), // ...although these are + each => each instanceof CSlotMorph + ); + if (rec.lastWrapParent instanceof CommandBlockMorph) { + if (forRedrop) { + onBeforeDrop = () => + cslot.nestedBlock(rec.lastDropTarget.element); + } else { + rec.lastWrapParent.nextBlock( + rec.lastDropTarget.element + ); + } + } else if (rec.lastWrapParent instanceof CommandSlotMorph) { + if (forRedrop) { + onBeforeDrop = () => + cslot.nestedBlock(rec.lastDropTarget.element); + } else { + rec.lastWrapParent.nestedBlock( + rec.lastDropTarget.element + ); + } + } else { + this.add(rec.lastDropTarget.element); + } + + // fix zebra coloring. + // this could be generalized into the fixBlockColor mechanism + rec.lastDropTarget.element.blockSequence().forEach(cmd => + cmd.fixBlockColor() + ); + cslot.fixLayout(); + } + } + } else if (dropped instanceof ReporterBlockMorph) { + if (rec.lastDropTarget) { + if (forRedrop) { + rec.lastDropTarget.replaceInput( + rec.lastReplacedInput, + rec.lastDroppedBlock + ); + } else { + rec.lastDropTarget.replaceInput( + rec.lastDroppedBlock, + rec.lastReplacedInput + ); + } + rec.lastDropTarget.fixBlockColor(null, true); + if (rec.lastPreservedBlocks) { + rec.lastPreservedBlocks.forEach(morph => + morph.destroy() + ); + } + } + } else if (dropped instanceof CommentMorph) { + if (forRedrop && rec.lastDropTarget) { + onBeforeDrop = () => { + rec.lastDropTarget.element.comment = dropped; + dropped.block = rec.lastDropTarget.element; + dropped.align(); + }; + } + } else { + throw new Error('unsupported action for ' + dropped); + } + this.clearDropInfo(); + dropped.prepareToBeGrabbed(this.world().hand); + if (dropped instanceof CommentMorph) { + dropped.removeShadow(); + } + this.add(dropped); + parent.reactToGrabOf(dropped); + if (dropped instanceof ReporterBlockMorph && parent instanceof BlockMorph) { + parent.changed(); + } + if (rec.action === 'delete') { + if (forRedrop && rec.lastNextBlock) { + if (parent instanceof CommandBlockMorph) { + parent.nextBlock(rec.lastNextBlock); + } else if (parent instanceof CommandSlotMorph) { + parent.nestedBlock(rec.lastNextBlock); + } + } + + // animate "undelete" + if (!forRedrop) { + dropped.moveBy(new Point(-100, -20)); + } + } + return onBeforeDrop; +}; + +ScriptsMorph.prototype.clearDropInfo = function () { + this.lastDroppedBlock = null; + this.lastReplacedInput = null; + this.lastDropTarget = null; + this.lastPreservedBlocks = null; + this.lastNextBlock = null; + this.lastWrapParent = null; +}; + +ScriptsMorph.prototype.recordDrop = function (lastGrabOrigin) { + // support for "undrop" / "redrop" + var record = { + lastDroppedBlock: this.lastDroppedBlock, + lastReplacedInput: this.lastReplacedInput, + lastDropTarget: this.lastDropTarget, + lastPreservedBlocks: this.lastPreservedBlocks, + lastNextBlock: this.lastNextBlock, + lastWrapParent: this.lastWrapParent, + lastOrigin: lastGrabOrigin, + + // for special gestures, e.g. deleting or extracting single commands: + action: lastGrabOrigin ? lastGrabOrigin.action || null : null, + + situation: null, + lastRecord: this.dropRecord, + nextRecord: null + }; + if (this.dropRecord) { + this.dropRecord.nextRecord = record; + } + this.dropRecord = record; + this.updateToolbar(); +}; + +ScriptsMorph.prototype.addToolbar = function () { + var toolBar = new AlignmentMorph(), + shade = new Color(140, 140, 140); + + toolBar.respectHiddens = true; + toolBar.undoButton = new PushButtonMorph( + this, + "undrop", + new SymbolMorph("turnBack", 12) + ); + toolBar.undoButton.alpha = 0.2; + toolBar.undoButton.padding = 4; + // toolBar.undoButton.hint = 'undo the last\nblock drop\nin this pane'; + toolBar.undoButton.labelShadowColor = shade; + toolBar.undoButton.edge = 0; + toolBar.undoButton.fixLayout(); + toolBar.add(toolBar.undoButton); + + toolBar.redoButton = new PushButtonMorph( + this, + "redrop", + new SymbolMorph("turnForward", 12) + ); + toolBar.redoButton.alpha = 0.2; + toolBar.redoButton.padding = 4; + // toolBar.redoButton.hint = 'redo the last undone\nblock drop\nin this pane'; + toolBar.redoButton.labelShadowColor = shade; + toolBar.redoButton.edge = 0; + toolBar.redoButton.fixLayout(); + toolBar.add(toolBar.redoButton); + + toolBar.keyboardButton = new ToggleButtonMorph( + null, // colors + this, // target + "toggleKeyboardEntry", + [ + new SymbolMorph('keyboard', 12), + new SymbolMorph('keyboardFilled', 12) + ], + () => !isNil(this.focus) // query + ); + toolBar.keyboardButton.alpha = 0.2; + toolBar.keyboardButton.padding = 4; + toolBar.keyboardButton.edge = 0; + toolBar.keyboardButton.hint = 'use the keyboard\nto enter blocks'; + //toolBar.keyboardButton.pressColor = new Color(40, 40, 40); + toolBar.keyboardButton.labelShadowColor = shade; + toolBar.keyboardButton.fixLayout(); + toolBar.add(toolBar.keyboardButton); + + return toolBar; +}; + +ScriptsMorph.prototype.updateToolbar = function () { + var sf = this.parentThatIsA(ScrollFrameMorph); + if (!sf) {return; } + if (!sf.toolBar) { + sf.toolBar = this.addToolbar(); + sf.add(sf.toolBar); + } + if (this.enableKeyboard) { + sf.toolBar.keyboardButton.show(); + sf.toolBar.keyboardButton.refresh(); + } else { + sf.toolBar.keyboardButton.hide(); + } + if (this.dropRecord) { + if (this.dropRecord.lastRecord) { + if (!sf.toolBar.undoButton.isVisible) { + sf.toolBar.undoButton.show(); + } + } else { + if (sf.toolBar.undoButton.isVisible) { + sf.toolBar.undoButton.hide(); + } + } + if (this.dropRecord.nextRecord) { + if (!sf.toolBar.redoButton.isVisible) { + sf.toolBar.redoButton.show(); + sf.toolBar.undoButton.mouseLeave(); + } + } else { + if (sf.toolBar.redoButton.isVisible) { + sf.toolBar.redoButton.hide(); + } + } + } + if (detect( + sf.toolBar.children, + each => each.isVisible + )) { + sf.toolBar.fixLayout(); + sf.adjustToolBar(); + } +}; + +// ScriptsMorph sorting blocks and comments + +ScriptsMorph.prototype.sortedElements = function () { + // return all scripts and unattached comments + var scripts = this.children.filter(each => + each instanceof CommentMorph ? !each.block : true + ); + scripts.sort((a, b) => + // make sure the prototype hat block always stays on top + a instanceof PrototypeHatBlockMorph ? 0 : a.top() - b.top() + ); + return scripts; +}; + +// ScriptsMorph blocks layout fix + +ScriptsMorph.prototype.fixMultiArgs = function () { + this.forAllChildren(morph => { + if (morph instanceof MultiArgMorph) { + morph.fixLayout(); + } + }); +}; + +// ScriptsMorph drag & drop: + +ScriptsMorph.prototype.wantsDropOf = function (aMorph) { + // override the inherited method + if (aMorph instanceof HatBlockMorph) { + return !this.rejectsHats; + } + return aMorph instanceof SyntaxElementMorph || + aMorph instanceof CommentMorph; +}; + +ScriptsMorph.prototype.reactToDropOf = function (droppedMorph, hand) { + if (droppedMorph instanceof BlockMorph || + droppedMorph instanceof CommentMorph) { + droppedMorph.snap(hand); + } + this.adjustBounds(); +}; + +// ScriptsMorph events + +ScriptsMorph.prototype.mouseClickLeft = function (pos) { + var shiftClicked = this.world().currentKey === 16; + if (shiftClicked) { + return this.edit(pos); + } + if (this.focus) {this.focus.stopEditing(); } +}; + +ScriptsMorph.prototype.selectForEdit = function () { + var ide = this.parentThatIsA(IDE_Morph), + rcvr = ide ? ide.currentSprite : null; + if (rcvr && rcvr.inheritsAttribute('scripts')) { + // copy on write: + this.feedbackMorph.destroy(); + rcvr.shadowAttribute('scripts'); + return rcvr.scripts; + } + return this; +}; + +ScriptsMorph.prototype.droppedImage = function (aCanvas, name, embeddedData) { + var ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph); + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (!ide) {return; } + ide.droppedImage(aCanvas, name, embeddedData, 'scripts'); +}; + +// ScriptsMorph keyboard support + +ScriptsMorph.prototype.edit = function (pos) { + var target, + world = this.world(); + if (this.focus) {this.focus.stopEditing(); } + world.stopEditing(); + if (!ScriptsMorph.prototype.enableKeyboard) {return; } + target = this.selectForEdit(); // enable copy-on-edit + target.focus = new ScriptFocusMorph(target, target, pos); + target.focus.getFocus(world); +}; + +ScriptsMorph.prototype.toggleKeyboardEntry = function () { + // when the user clicks the keyboard button in the toolbar + var target, sorted, + world = this.world(); + if (this.focus) { + this.focus.stopEditing(); + return; + } + world.stopEditing(); + if (!ScriptsMorph.prototype.enableKeyboard) {return; } + target = this.selectForEdit(); // enable copy-on-edit + target.focus = new ScriptFocusMorph(target, target, target.position()); + target.focus.getFocus(world); + sorted = target.focus.sortedScripts(); + if (sorted.length) { + target.focus.element = sorted[0]; + if (target.focus.element instanceof HatBlockMorph) { + target.focus.nextCommand(); + } + } else { + target.focus.moveBy(new Point(50, 50)); + } + target.focus.fixLayout(); +}; + +// ScriptsMorph context - scripts target + +ScriptsMorph.prototype.scriptTarget = function () { + // answer the sprite or stage that this script editor acts on, + // if the user clicks on a block. + // NOTE: since scripts can be shared by more than a single sprite + // this method only gives the desired result within the context of + // the user actively clicking on a block inside the IDE + // there is no direct relationship between a block or a scripts editor + // and a sprite. + var editor = this.parentThatIsA(IDE_Morph); + if (editor) { + return editor.currentSprite; + } + editor = this.parentThatIsA(BlockEditorMorph); + if (editor) { + return editor.target; + } + throw new Error('script target cannot be found for orphaned scripts'); +}; + +// ScriptsMorph - codification + +ScriptsMorph.prototype.elementsAtLOC = function () { + // return an Array indicating which syntax elements are codified at which + // line of textual code applying the current mapping + var scripts = this.sortedElements().filter(each => + each instanceof BlockMorph).map(block => block.elementsAtLOC()), + loc = []; + + scripts.forEach(scr => { + scr.forEach(line => loc.push(line)); + loc.push([]); + }); + + return loc; +}; + +ScriptsMorph.prototype.blockAtIdx = function (idx) { + // return the innermost block corresponding to the character index given + // at the textual code applying the current mapping + var elements = this.sortedElements().filter(each => + each instanceof BlockMorph), + scripts = elements.map(each => each.mappedCode()), + code = (scripts.length ? scripts : ['']).reduce((a, b) => + a + '\n\n' + b), + ln = code.substr(0, idx).split('\n').length, + loc = this.elementsAtLOC()[ln - 1], + tuples = [], + match, i; + + function discover(index) { + return tuples.find(tuple => + code.slice(index).replace(/\s+/g, '').startsWith(tuple[0]) + ); + } + + loc.forEach(morph => { + if (morph instanceof BlockMorph) { + tuples.push([ + morph.mappedCode().replace(/\s+/g, ''), + morph + ]); + } + }); + + for (i = idx; i >= 0; i -= 1) { + match = discover(i); + if (match && match[1].mappedCode().length > (idx - i)) { + return match[1]; + } + } + + return null; +}; + +ScriptsMorph.prototype.flashLOC = function (start, end = start, color = null) { + // highlight all syntax elements located in the textual code indicated + // by start and end line numbers. End is optional, as is a color string of + // the form "r,g,b[,a]". + var loc = this.elementsAtLOC(), + clr = color ? Color.fromString(color) : null, + flash = (idx) => loc[idx - 1].forEach(elem => elem.flash(clr)), + i; + this.unflash(); + for (i = start; i <= end; i += 1) { + flash(i); + } +}; + +ScriptsMorph.prototype.flashCodeIdx = function (idx, color = null) { + // highlight the innermost block located in the textual code indicated + // by the given character index. Optional color string, form "r,g,b[,a]". + var block = this.blockAtIdx(idx); + this.unflash(); + if (block) { + block.flash(color ? Color.fromString(color) : null); + } +}; + +ScriptsMorph.prototype.unflash = function () { + this.forAllChildren(each => { + if (each instanceof SyntaxElementMorph && each.unflash) { + each.unflash(); + } + if (each instanceof BlockMorph) { + each.removeHighlight(); + } + }); + +}; + +ScriptsMorph.prototype.flashOutlineCodeIdx = function ( + idx, + color = null, +border = 3) { + // highlight the innermost block located in the textual code indicated + // by the given character index. Optional color string, form "r,g,b[,a]". + var block = this.blockAtIdx(idx); + this.unflashOutline(); + if (block) { + block.flashOutline(color ? Color.fromString(color) : null, border); + } +}; + +ScriptsMorph.prototype.unflashOutline = function () { + this.forAllChildren(each => { + if (each instanceof BlockMorph) { + each.removeHighlight(); + } + }); + +}; + +ScriptsMorph.prototype.balloonCodeIdx = function (idx, contents) { + // highlight the innermost block located in the textual code indicated + // by the given character index. Optional color string, form "r,g,b[,a]". + var block = this.blockAtIdx(idx); + if (block) { + block.showBubble(contents); + } +}; + +// ArgMorph ////////////////////////////////////////////////////////// + +/* + I am a syntax element and the ancestor of all block inputs. + I am present in block labels. + Usually I am just a receptacle for inherited methods and attributes, + however, if my 'type' attribute is set to one of the following + values, I act as an iconic slot myself: + + 'list' - a list symbol + 'object' - a turtle symbol +*/ + +// ArgMorph inherits from SyntaxElementMorph: + +ArgMorph.prototype = new SyntaxElementMorph(); +ArgMorph.prototype.constructor = ArgMorph; +ArgMorph.uber = SyntaxElementMorph.prototype; + +// ArgMorph instance creation: + +function ArgMorph(type) { + this.init(type); +} + +ArgMorph.prototype.init = function (type) { + this.type = type || null; + this.icon = null; + ArgMorph.uber.init.call(this); + this.color = new Color(0, 17, 173); + this.createIcon(); + if (type === 'list') { + this.alpha = 1; + } +}; + +// ArgMorph preferences settings: + +ArgMorph.prototype.executeOnSliderEdit = false; + +// ArgMorph events: + +ArgMorph.prototype.reactToSliderEdit = function () { +/* + directly execute the stack of blocks I'm part of if my + "executeOnSliderEdit" setting is turned on, obeying the stage's + thread safety setting. This feature allows for "Bret Victor" style + interactive coding. +*/ + var block, top, receiver, stage; + if (!this.executeOnSliderEdit) {return; } + block = this.parentThatIsA(BlockMorph); + if (block) { + top = block.topBlock(); + receiver = top.scriptTarget(); + if (top instanceof PrototypeHatBlockMorph) { + return; + } + if (receiver) { + stage = receiver.parentThatIsA(StageMorph); + if (stage && (stage.isThreadSafe || + Process.prototype.enableSingleStepping)) { + stage.threads.startProcess(top, receiver, stage.isThreadSafe); + } else { + top.mouseClickLeft(); + } + } + } +}; + +// ArgMorph drag & drop: for demo puposes only + +ArgMorph.prototype.justDropped = function () { + if (!(this instanceof CommandSlotMorph)) { + this.fixLayout(); + this.rerender(); + } +}; + +// ArgMorph spec extrapolation (for demo purposes) + +ArgMorph.prototype.getSpec = function () { + return this.type === 'list' ? '%l' : '%s'; // default +}; + +// ArgMorph menu + +ArgMorph.prototype.userMenu = function () { + var sm = this.slotMenu(), + menu; + if (!sm && !(this.parent instanceof MultiArgMorph)) { + return this.parent.userMenu(); + } + menu = sm || new MenuMorph(this); + if (this.parent instanceof MultiArgMorph && + this.parentThatIsA(ScriptsMorph) && + !(this.parent.slotSpec instanceof Array) + ) { + if (!this.parent.maxInputs || + (this.parent.inputs().length < this.parent.maxInputs) + ) { + menu.addItem( + 'insert a slot', + () => this.parent.insertNewInputBefore(this) + ); + } + if (this.parent.inputs().length > this.parent.minInputs) { + menu.addItem( + 'delete slot', + () => this.parent.deleteSlot(this) + ); + } + } + return menu; +}; + +ArgMorph.prototype.slotMenu = function () { + // subclass responsibility + return null; +}; + +// ArgMorph drawing + +ArgMorph.prototype.createIcon = function () { + switch (this.type) { + case 'list': + this.icon = this.labelPart('%list'); + this.add(this.icon); + break; + case 'object': + this.icon = this.labelPart('%turtle'); + this.add(this.icon); + break; + default: + nop(); // no icon + } +}; + +ArgMorph.prototype.fixLayout = function () { + if (this.icon) { + this.icon.setPosition(this.position()); + this.bounds.setExtent(this.icon.extent()); + } else { + ArgMorph.uber.fixLayout.call(this); + } +}; + +ArgMorph.prototype.render = function (ctx) { + // make sure my icon's shadow color matches my block's color + var block; + if (this.icon) { + block = this.parentThatIsA(BlockMorph); + if (block) { + this.icon.shadowColor = block.color.darker(this.labelContrast); + } + switch (this.type) { + case 'list': + this.color = new Color(255, 140, 0); // list color + break; + default: + return; // don't draw anything except the icon + } + } + ArgMorph.uber.render.call(this, ctx); +}; + +// ArgMorph evaluation + +ArgMorph.prototype.evaluate = function () { + return this.type === 'list' ? new List() : null; +}; + +ArgMorph.prototype.isEmptySlot = function () { + return this.type !== null; +}; + +// ArgMorph op-sequence analysis + +ArgMorph.prototype.unwind = function () { + var nxt = this.parent instanceof MultiArgMorph ? this.parent + : this.parentThatIsA(BlockMorph); + return [this].concat(nxt.unwindAfter(this)); +}; + +// CommandSlotMorph //////////////////////////////////////////////////// + +/* + I am a CommandBlock-shaped input slot. I can nest command blocks + and also accept reporters (containing reified scripts). + + my most important accessor is + + nestedBlock() - answer the command block I encompass, if any + + My command spec is %cmd + + evaluate() returns my nested block or null +*/ + +// CommandSlotMorph inherits from ArgMorph: + +CommandSlotMorph.prototype = new ArgMorph(); +CommandSlotMorph.prototype.constructor = CommandSlotMorph; +CommandSlotMorph.uber = ArgMorph.prototype; + +// CommandSlotMorph instance creation: + +function CommandSlotMorph() { + this.init(); +} + +CommandSlotMorph.prototype.init = function () { + CommandSlotMorph.uber.init.call(this); + this.color = new Color(0, 17, 173); + this.setExtent( + new Point(230, this.corner * 4 + this.cSlotPadding) + ); +}; + +CommandSlotMorph.prototype.getSpec = function () { + return '%cmd'; +}; + +// CommandSlotMorph enumerating: + +CommandSlotMorph.prototype.topBlock = function () { + if (this.parent.topBlock) { + return this.parent.topBlock(); + } + return this.nestedBlock(); +}; + +// CommandSlotMorph nesting: + +CommandSlotMorph.prototype.nestedBlock = function (block) { + if (block) { + var nb = this.nestedBlock(); + this.add(block); + if (nb) { + block.bottomBlock().nextBlock(nb); + } + this.fixLayout(); + } else { + return detect( + this.children, + child => child instanceof CommandBlockMorph + ); + } +}; + +// CommandSlotMorph attach targets: + +CommandSlotMorph.prototype.slotAttachPoint = function () { + return new Point( + this.dentCenter(), + this.top() + this.corner * 2 + ); +}; + +CommandSlotMorph.prototype.dentLeft = function () { + return this.left() + + this.corner + + this.inset * 2; +}; + +CommandSlotMorph.prototype.dentCenter = function () { + return this.dentLeft() + + this.corner + + (this.dent * 0.5); +}; + +CommandSlotMorph.prototype.attachTargets = function () { + var answer = []; + answer.push({ + point: this.slotAttachPoint(), + element: this, + loc: 'bottom', + type: 'slot' + }); + return answer; +}; + +// CommandSlotMorph layout: + +CommandSlotMorph.prototype.fixLayout = function () { + var nb = this.nestedBlock(); + if (this.parent) { + if (!this.color.eq(this.parent.color)) { + this.setColor(this.parent.color); + } + } + if (nb) { + nb.setPosition( + new Point( + this.left() + this.edge + this.rfBorder, + this.top() + this.edge + this.rfBorder + ) + ); + this.bounds.setWidth(nb.fullBounds().width() + + (this.edge + this.rfBorder) * 2 + ); + this.bounds.setHeight(nb.fullBounds().height() + + this.edge + (this.rfBorder * 2) - (this.corner - this.edge) + ); + } else { + this.bounds.setHeight(this.corner * 4); + this.bounds.setWidth( + this.corner * 4 + + this.inset + + this.dent + ); + } + if (this.parent && this.parent.fixLayout) { + this.parent.fixLayout(); + } +}; + +// CommandSlotMorph evaluating: + +CommandSlotMorph.prototype.evaluate = function () { + return this.nestedBlock(); +}; + +CommandSlotMorph.prototype.isEmptySlot = function () { + return !this.isStatic && (this.nestedBlock() === null); +}; + +// CommandSlotMorph context menu ops + +CommandSlotMorph.prototype.attach = function () { + // for context menu demo and testing purposes + // override inherited version to adjust new owner's layout + var choices = this.overlappedMorphs(), + menu = new MenuMorph(this, 'choose new parent:'); + + choices.forEach(each => + menu.addItem( + each.toString().slice(0, 50), + () => { + each.add(this); + this.isDraggable = false; + if (each.fixLayout) { + each.fixLayout(); + } + } + ) + ); + if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +// CommandSlotMorph op-sequence analysis + +CommandSlotMorph.prototype.unwind = function () { + var nested = this.nestedBlock(), + nxt = this.parent instanceof MultiArgMorph ? this.parent + : this.parentThatIsA(BlockMorph); + if (nested) { + if (this.isStatic) { + return nested.unwind().concat(nxt.unwindAfter(this)); + } + return [nested.unwind()].concat(nxt.unwindAfter(this)); + } + return nxt.unwindAfter(this); +}; + +// CommandSlotMorph drawing: + +CommandSlotMorph.prototype.render = function (ctx) { + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + ctx.fillStyle = this.cachedClr; + ctx.fillRect(0, 0, this.width(), this.height()); + + // draw the 'flat' shape: + ctx.fillStyle = this.rfColor.toString(); + this.drawFlat(ctx); + + if (MorphicPreferences.isFlat) {return; } + + // add 3D-Effect: + this.drawEdges(ctx); +}; + +CommandSlotMorph.prototype.drawFlat = function (ctx) { + var isFilled = this.nestedBlock() !== null, + ins = (isFilled ? this.inset : this.inset / 2), + dent = (isFilled ? this.dent : this.dent / 2), + indent = this.corner * 2 + ins, + edge = this.edge, + rf = (isFilled ? this.rfBorder : 0), + y = this.height() - this.corner - edge; + + ctx.beginPath(); + + // top left: + ctx.arc( + this.corner + edge, + this.corner + edge, + this.corner, + radians(-180), + radians(-90), + false + ); + + // dent: + ctx.lineTo(this.corner + ins + edge + rf * 2, edge); + ctx.lineTo(indent + edge + rf * 2, this.corner + edge); + ctx.lineTo( + indent + edge + rf * 2 + (dent - rf * 2), + this.corner + edge + ); + ctx.lineTo( + indent + edge + rf * 2 + (dent - rf * 2) + this.corner, + edge + ); + ctx.lineTo(this.width() - this.corner - edge, edge); + + // top right: + ctx.arc( + this.width() - this.corner - edge, + this.corner + edge, + this.corner, + radians(-90), + radians(-0), + false + ); + + // bottom right: + ctx.arc( + this.width() - this.corner - edge, + y, + this.corner, + radians(0), + radians(90), + false + ); + + // bottom left: + ctx.arc( + this.corner + edge, + y, + this.corner, + radians(90), + radians(180), + false + ); + + ctx.closePath(); + ctx.fill(); + +}; + +CommandSlotMorph.prototype.drawEdges = function (ctx) { + var isFilled = this.nestedBlock() !== null, + ins = (isFilled ? this.inset : this.inset / 2), + dent = (isFilled ? this.dent : this.dent / 2), + indent = this.corner * 2 + ins, + edge = this.edge, + rf = (isFilled ? this.rfBorder : 0), + shift = this.edge * 0.5, + gradient, + upperGradient, + lowerGradient, + rightGradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + + // bright: + // bottom horizontal line + gradient = ctx.createLinearGradient( + 0, + this.height(), + 0, + this.height() - this.edge + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrBright); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.corner + edge, this.height() - shift); + ctx.lineTo( + this.width() - this.corner - edge, + this.height() - shift + ); + ctx.stroke(); + + // bottom right corner + gradient = ctx.createRadialGradient( + this.width() - (this.corner + edge), + this.height() - (this.corner + edge), + this.corner, + this.width() - (this.corner + edge), + this.height() - (this.corner + edge), + this.corner + edge + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + this.width() - (this.corner + edge), + this.height() - (this.corner + edge), + this.corner + shift, + radians(0), + radians(90), + false + ); + ctx.stroke(); + + // right vertical line + gradient = ctx.createLinearGradient( + this.width(), + 0, + this.width() - this.edge, + 0 + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrBright); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo( + this.width() - shift, + this.height() - this.corner - this.edge + ); + ctx.lineTo(this.width() - shift, edge + this.corner); + ctx.stroke(); + + if (useBlurredShadows) { + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.rfColor.darker(80).toString(); + } + + // left vertical side + gradient = ctx.createLinearGradient( + 0, + 0, + edge, + 0 + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, edge + this.corner); + ctx.lineTo(shift, this.height() - edge - this.corner); + ctx.stroke(); + + // upper left corner + gradient = ctx.createRadialGradient( + this.corner + edge, + this.corner + edge, + this.corner, + this.corner + edge, + this.corner + edge, + this.corner + edge + ); + gradient.addColorStop(0, this.cachedClrDark); + gradient.addColorStop(1, this.cachedClr); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + this.corner + edge, + this.corner + edge, + this.corner + shift, + radians(-180), + radians(-90), + false + ); + ctx.stroke(); + + // upper edge (left side) + upperGradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + upperGradient.addColorStop(0, this.cachedClr); + upperGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo(this.corner + edge, shift); + ctx.lineTo( + this.corner + ins + edge + rf * 2 - shift, + shift + ); + ctx.stroke(); + + // dent bottom + lowerGradient = ctx.createLinearGradient( + 0, + this.corner, + 0, + this.corner + edge + ); + lowerGradient.addColorStop(0, this.cachedClr); + lowerGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = lowerGradient; + ctx.beginPath(); + ctx.moveTo(indent + edge + rf * 2 + shift, this.corner + shift); + ctx.lineTo( + indent + edge + rf * 2 + (dent - rf * 2), + this.corner + shift + ); + ctx.stroke(); + + // dent right edge + rightGradient = ctx.createLinearGradient( + indent + edge + rf * 2 + (dent - rf * 2) - shift, + this.corner, + indent + edge + rf * 2 + (dent - rf * 2) + shift * 0.7, + this.corner + shift + shift * 0.7 + ); + rightGradient.addColorStop(0, this.cachedClr); + rightGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = rightGradient; + ctx.beginPath(); + ctx.moveTo( + indent + edge + rf * 2 + (dent - rf * 2), + this.corner + shift + ); + ctx.lineTo( + indent + edge + rf * 2 + (dent - rf * 2) + this.corner, + shift + ); + ctx.stroke(); + + // upper edge (right side) + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo( + indent + edge + rf * 2 + (dent - rf * 2) + this.corner, + shift + ); + ctx.lineTo(this.width() - this.corner - edge, shift); + ctx.stroke(); +}; + +// RingCommandSlotMorph /////////////////////////////////////////////////// + +/* + I am a CommandBlock-shaped input slot for use in RingMorphs. + I can only nest command blocks, not reporters. + + My command spec is %rc + + evaluate() returns my nested block or null + (inherited from CommandSlotMorph) +*/ + +// RingCommandSlotMorph inherits from CommandSlotMorph: + +RingCommandSlotMorph.prototype = new CommandSlotMorph(); +RingCommandSlotMorph.prototype.constructor = RingCommandSlotMorph; +RingCommandSlotMorph.uber = CommandSlotMorph.prototype; + +// RingCommandSlotMorph preferences settings + +RingCommandSlotMorph.prototype.rfBorder = 0; +RingCommandSlotMorph.prototype.edge = RingMorph.prototype.edge; + +// RingCommandSlotMorph instance creation: + +function RingCommandSlotMorph() { + this.init(); +} + +RingCommandSlotMorph.prototype.init = function () { + RingCommandSlotMorph.uber.init.call(this); + this.color = new Color(0, 17, 173); + this.contrast = RingMorph.prototype.contrast; +}; + +RingCommandSlotMorph.prototype.getSpec = function () { + return '%rc'; +}; + +// RingCommandSlotMorph drawing: + +RingCommandSlotMorph.prototype.render = function (ctx) { + if (MorphicPreferences.isFlat) {return; } + + // init + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + ctx.fillStyle = this.cachedClr; + + // only add 3D-Effect here, rendering of the flat shape happens at the + // encompassing block level + this.drawEdges(ctx); +}; + +RingCommandSlotMorph.prototype.outlinePath = function (ctx, offset) { + var ox = offset.x, + oy = offset.y, + isFilled = this.nestedBlock() !== null, + ins = (isFilled ? this.inset : this.inset / 2), + dent = (isFilled ? this.dent : this.dent / 2), + indent = this.corner * 2 + ins, + edge = this.edge, + w = this.width(), + h = this.height(), + rf = (isFilled ? this.rfBorder : 0), + y = h - this.corner - edge; + + // top left: + ctx.arc( + this.corner + edge + ox, + this.corner + edge + oy, + this.corner, + radians(-180), + radians(-90), + false + ); + + // dent: + ctx.lineTo(this.corner + ins + edge + rf * 2 + ox, edge + oy); + ctx.lineTo(indent + edge + rf * 2 + ox, this.corner + edge + oy); + ctx.lineTo( + indent + edge + rf * 2 + (dent - rf * 2) + ox, + this.corner + edge + oy + ); + ctx.lineTo( + indent + edge + rf * 2 + (dent - rf * 2) + this.corner + ox, + edge + oy + ); + ctx.lineTo(this.width() - this.corner - edge + ox, edge + oy); + + // top right: + ctx.arc( + w - this.corner - edge + ox, + this.corner + edge + oy, + this.corner, + radians(-90), + radians(-0), + false + ); + + // bottom right: + ctx.arc( + this.width() - this.corner - edge + ox, + y + oy, + this.corner, + radians(0), + radians(90), + false + ); + + // bottom left: + ctx.arc( + this.corner + edge + ox, + y + oy, + this.corner, + radians(90), + radians(180), + false + ); + + // close the path, so we can clip it: + ctx.lineTo( + this.corner + edge + ox - this.corner, // this needs to be adjusted + this.corner + edge + oy + ); + +}; + +// CSlotMorph //////////////////////////////////////////////////// + +/* + I am a C-shaped input slot. I can nest command blocks and also accept + reporters (containing reified scripts). + + my most important accessor is + + nestedBlock() - the command block I encompass, if any (inherited) + + My command spec is %c + + evaluate() returns my nested block or null +*/ + +// CSlotMorph inherits from CommandSlotMorph: + +CSlotMorph.prototype = new CommandSlotMorph(); +CSlotMorph.prototype.constructor = CSlotMorph; +CSlotMorph.uber = CommandSlotMorph.prototype; + +// CSlotMorph instance creation: + +function CSlotMorph() { + this.init(); +} + +CSlotMorph.prototype.init = function () { + CommandSlotMorph.uber.init.call(this); + this.isLambda = false; // see Process.prototype.evaluateInput + this.isLoop = false; // has a loop arrow symbol + this.color = new Color(0, 17, 173); + this.setExtent(new Point(230, this.corner * 4 + this.cSlotPadding)); +}; + +CSlotMorph.prototype.getSpec = function () { + return this.isLoop? '%loop' : '%c'; +}; + +CSlotMorph.prototype.mappedCode = function (definitions) { + var code = StageMorph.prototype.codeMappings.reify || '<#1>', + codeLines = code.split('\n'), + nested = this.nestedBlock(), + part = nested ? nested.mappedCode(definitions) : '', + partLines = (part.toString()).split('\n'), + rx = new RegExp('<#1>', 'g'); + + codeLines.forEach((codeLine, idx) => { + var prefix = '', + indent; + if (codeLine.trimLeft().indexOf('<#1>') === 0) { + indent = codeLine.indexOf('<#1>'); + prefix = codeLine.slice(0, indent); + } + codeLines[idx] = codeLine.replace( + new RegExp('<#1>'), + partLines.join('\n' + prefix) + ); + codeLines[idx] = codeLines[idx].replace(rx, partLines.join('\n')); + }); + + return codeLines.join('\n'); +}; + +CSlotMorph.prototype.elementsAtLOC = function (definitions) { + // return an Array indicating which syntax elements are codified at which + // line of textual code applying the current mapping + var code = StageMorph.prototype.codeMappings.reify || '<#1>', + codeLines = code.split('\n'), + nested = this.nestedBlock(), + rx = new RegExp('<#1>', 'g'), + elementLOC = codeLines.map(() => [this]), + partElements = nested instanceof SyntaxElementMorph ? + nested.elementsAtLOC(definitions) : [], + insertionIdx = 0; + + codeLines.forEach((codeLine, i) => { + var matches = (codeLine.match(rx) || []).length; + if (matches) { + // merge the first line with the current code line's elements + (partElements.shift() || []).forEach(each => + elementLOC[i + insertionIdx].unshift(each) + ); + + // insert the following lines behind the current code line + partElements.forEach(each => { + insertionIdx += 1; + elementLOC.splice(i + insertionIdx, 0, each); + }); + } + }); + return elementLOC; +}; + +// CSlotMorph layout: + +CSlotMorph.prototype.fixLayout = function () { + var nb = this.nestedBlock(); + if (nb) { + nb.setPosition( + new Point( + this.left() + this.inset, + this.top() + this.corner + ) + ); + this.bounds.setHeight(nb.fullBounds().height() + this.corner); + this.bounds. setWidth( + nb.fullBounds().width() + (this.cSlotPadding * 2) + ); + } else { + this.bounds.setHeight(this.corner * 4 + this.cSlotPadding); // default + this.bounds.setWidth( + this.corner * 4 + + (this.inset * 2) + + this.dent + + (this.cSlotPadding * 2) + ); + } + + if (this.parent && this.parent.fixLayout) { + this.parent.fixLayout(); + } +}; + +CSlotMorph.prototype.fixLoopLayout = function () { + var loop; + if (this.isLoop) { + loop = this.loop(); + if (loop) { + loop.setRight(this.right() - this.corner); + loop.setBottom(this.bottom() + this.cSlotPadding + this.edge); + } + } +}; + +CSlotMorph.prototype.loop = function () { + if (this.isLoop) { + return detect( + this.children, + child => child instanceof SymbolMorph + ); + } + return null; +}; + +CSlotMorph.prototype.fixHolesLayout = function () { + this.holes = [ + new Rectangle( + this.inset, + this.corner, + this.width(), + this.height() - this.corner + ) + ]; +}; + +CSlotMorph.prototype.isLocked = function () { + return this.isStatic || this.parent instanceof MultiArgMorph; +}; + +// CSlotMorph drawing: + +CSlotMorph.prototype.render = function (ctx) { + if (MorphicPreferences.isFlat) {return; } + + // init + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + ctx.fillStyle = this.cachedClr; + + // only add 3D-Effect here, rendering of the flat shape happens at the + // encompassing block level + this.drawTopRightEdge(ctx); + this.drawTopEdge(ctx, this.inset, this.corner); + this.drawTopLeftEdge(ctx); + this.drawBottomEdge(ctx); + this.drawRightEdge(ctx); +}; + +CSlotMorph.prototype.outlinePath = function (ctx, inset, offset) { + var ox = offset.x, + oy = offset.y, + radius = Math.max(this.corner - inset, 0); + + // top corner: + ctx.lineTo(this.width() + ox - inset, oy); + + // top right: + ctx.arc( + this.width() - this.corner + ox, + oy, + radius, + radians(90), + radians(0), + true + ); + + // jigsaw shape: + ctx.lineTo( + this.width() - this.corner + ox, + this.corner + oy - inset + ); + ctx.lineTo( + (this.inset * 2) + (this.corner * 3) + this.dent + ox, + this.corner + oy - inset + ); + ctx.lineTo( + (this.inset * 2) + (this.corner * 2) + this.dent + ox, + this.corner * 2 + oy - inset + ); + ctx.lineTo( + (this.inset * 2) + (this.corner * 2) + ox, + this.corner * 2 + oy - inset + ); + ctx.lineTo( + (this.inset * 2) + this.corner + ox, + this.corner + oy - inset + ); + ctx.lineTo( + this.inset + this.corner + ox, + this.corner + oy - inset + ); + ctx.arc( + this.inset + this.corner + ox, + this.corner * 2 + oy, + this.corner + inset, + radians(270), + radians(180), + true + ); + + // bottom: + ctx.lineTo( + this.inset + ox - inset, + this.height() - (this.corner * 2) + oy + ); + ctx.arc( + this.inset + this.corner + ox, + this.height() - (this.corner * 2) + oy, + this.corner + inset, + radians(180), + radians(90), + true + ); + ctx.lineTo( + this.width() - this.corner + ox, + this.height() - this.corner + oy + inset + ); + ctx.arc( + this.width() - this.corner + ox, + this.height() + oy, + radius, + radians(-90), + radians(-0), + false + ); +}; + +CSlotMorph.prototype.drawTopRightEdge = function (ctx) { + var shift = this.edge * 0.5, + x = this.width() - this.corner, + y = 0, + gradient; + + gradient = ctx.createRadialGradient( + x, + y, + this.corner, + x, + y, + this.corner - this.edge + ); + gradient.addColorStop(0, this.cachedClrDark); + gradient.addColorStop(1, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.arc( + x, + y, + this.corner - shift, + radians(90), + radians(0), + true + ); + ctx.stroke(); +}; + +CSlotMorph.prototype.drawTopEdge = function (ctx, x, y) { + var shift = this.edge * 0.5, + indent = x + this.corner * 2 + this.inset, + upperGradient, + lowerGradient, + rightGradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + upperGradient = ctx.createLinearGradient( + 0, + y - this.edge, + 0, + y + ); + upperGradient.addColorStop(0, this.cachedClr); + upperGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo(x + this.corner, y - shift); + ctx.lineTo(x + this.corner + this.inset - shift, y - shift); + ctx.stroke(); + + lowerGradient = ctx.createLinearGradient( + 0, + y + this.corner - this.edge, + 0, + y + this.corner + ); + lowerGradient.addColorStop(0, this.cachedClr); + lowerGradient.addColorStop(1, this.cachedClrDark); + + ctx.strokeStyle = lowerGradient; + ctx.beginPath(); + ctx.moveTo(indent + shift, y + this.corner - shift); + ctx.lineTo(indent + this.dent, y + this.corner - shift); + ctx.stroke(); + + rightGradient = ctx.createLinearGradient( + (x + this.inset + (this.corner * 2) + this.dent) - shift, + (y + this.corner - shift) - shift, + (x + this.inset + (this.corner * 2) + this.dent) + (shift * 0.7), + (y + this.corner - shift) + (shift * 0.7) + ); + rightGradient.addColorStop(0, this.cachedClr); + rightGradient.addColorStop(1, this.cachedClrDark); + + + ctx.strokeStyle = rightGradient; + ctx.beginPath(); + ctx.moveTo( + x + this.inset + (this.corner * 2) + this.dent, + y + this.corner - shift + ); + ctx.lineTo( + x + this.corner * 3 + this.inset + this.dent, + y - shift + ); + ctx.stroke(); + + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.moveTo( + x + this.corner * 3 + this.inset + this.dent, + y - shift + ); + ctx.lineTo(this.width() - this.corner, y - shift); + ctx.stroke(); +}; + +CSlotMorph.prototype.drawTopLeftEdge = function (ctx) { + var shift = this.edge * 0.5, + gradient; + + gradient = ctx.createRadialGradient( + this.corner + this.inset, + this.corner * 2, + this.corner, + this.corner + this.inset, + this.corner * 2, + this.corner + this.edge + ); + gradient.addColorStop(0, this.cachedClrDark); + gradient.addColorStop(1, this.cachedClr); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.arc( + this.corner + this.inset, + this.corner * 2, + this.corner + shift, + radians(-180), + radians(-90), + false + ); + ctx.stroke(); +}; + +CSlotMorph.prototype.drawRightEdge = function (ctx) { + var shift = this.edge * 0.5, + x = this.inset, + gradient; + + gradient = ctx.createLinearGradient(x - this.edge, 0, x, 0); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(x - shift, this.corner * 2); + ctx.lineTo(x - shift, this.height() - this.corner * 2); + ctx.stroke(); +}; + +CSlotMorph.prototype.drawBottomEdge = function (ctx) { + var shift = this.edge * 0.5, + gradient, + upperGradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + upperGradient = ctx.createRadialGradient( + this.corner + this.inset, + this.height() - (this.corner * 2), + this.corner, /*- this.edge*/ // uncomment for half-tone + this.corner + this.inset, + this.height() - (this.corner * 2), + this.corner + this.edge + ); + upperGradient.addColorStop(0, this.cachedClrBright); + upperGradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = upperGradient; + ctx.beginPath(); + ctx.arc( + this.corner + this.inset, + this.height() - (this.corner * 2), + this.corner + shift, + radians(180), + radians(90), + true + ); + ctx.stroke(); + + gradient = ctx.createLinearGradient( + 0, + this.height() - this.corner, + 0, + this.height() - this.corner + this.edge + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo( + this.inset + this.corner, + this.height() - this.corner + shift + ); + ctx.lineTo( + this.width() - this.corner, + this.height() - this.corner + shift + ); + + ctx.stroke(); +}; + +// InputSlotMorph ////////////////////////////////////////////////////// + +/* + I am an editable text input slot. I can be either rectangular or + rounded, and can have an optional drop-down menu. If I'm set to + read-only I must have a drop-down menu and will assume a darker + shade of my parent's color. + + my most important public attributes and accessors are: + + setContents(str/float) - display the argument (string or float) + contents().text - get the displayed string + choices - a key/value list for my optional drop-down + isReadOnly - governs whether I am editable or not + isNumeric - governs my outer shape (round or rect) + + my block specs are: + + %s - string input, rectangular + %n - numerical input, semi-circular vertical edges + %anyUE - any unevaluated + + evaluate() returns my displayed string, cast to float if I'm numerical + + there are also a number of specialized drop-down menu presets, refer + to BlockMorph for details. +*/ + +// InputSlotMorph inherits from ArgMorph: + +InputSlotMorph.prototype = new ArgMorph(); +InputSlotMorph.prototype.constructor = InputSlotMorph; +InputSlotMorph.uber = ArgMorph.prototype; + +// InputSlotMorph instance creation: + +function InputSlotMorph(text, isNumeric, choiceDict, isReadOnly) { + this.init(text, isNumeric, choiceDict, isReadOnly); +} + +InputSlotMorph.prototype.init = function ( + text, + isNumeric, + choiceDict, + isReadOnly +) { + var contents = new InputSlotStringMorph(''), + arrow = new ArrowMorph( + 'down', + 0, + Math.max(Math.floor(this.fontSize / 6), 1), + BLACK, + true + ); + + contents.fontSize = this.fontSize; + contents.isShowingBlanks = true; + + this.selectedBlock = null; + this.symbol = null; + + this.isUnevaluated = false; + this.choices = choiceDict || null; // object, function or selector + this.oldContentsExtent = contents.extent(); + this.isNumeric = isNumeric || false; + this.isAlphanumeric = false; // temporary override for allowing text + this.isReadOnly = isReadOnly || false; + this.minWidth = 0; // can be chaged for text-type inputs ("landscape") + this.constant = null; + this.onSetContents = null; + + InputSlotMorph.uber.init.call(this, null, true); + this.color = WHITE; + this.add(contents); + this.add(arrow); + contents.isEditable = true; + contents.isDraggable = false; + contents.enableSelecting(); + this.setContents(text); +}; + +// InputSlotMorph accessing: + +InputSlotMorph.prototype.getSpec = function () { + if (this.isNumeric) { + return '%n'; + } + return '%s'; // default +}; + +InputSlotMorph.prototype.contents = function () { + return detect( + this.children, + child => child instanceof StringMorph + ); +}; + +InputSlotMorph.prototype.arrow = function () { + return detect( + this.children, + child => child instanceof ArrowMorph + ); +}; + +InputSlotMorph.prototype.setContents = function (data) { + // data can be a String, Float, or "wish" Block + var cnts = this.contents(), + dta = data, + isConstant = dta instanceof Array, + block; + + if (this.selectedBlock) { + this.selectedBlock = null; + } + if (this.symbol) { + this.symbol.destroy(); + this.symbol = null; + } + + if (isConstant) { + // migrate old "any" constants + if (dta[0] === 'any') { + dta[0] = 'random'; + } + if (dta[0] === '__shout__go__') { + this.symbol = this.labelPart('%greenflag'); + this.add(this.symbol); + dta = ''; + } else { + dta = localize(dta[0]); + cnts.isItalic = !this.isReadOnly; + } + } else if (dta instanceof BlockMorph) { + this.selectedBlock = dta; + dta = ''; // make sure the contents text emptied + } else { + cnts.isItalic = false; + /* + // assume dta is a localizable choice if it's a key in my choices + if (!isNil(this.choices) && this.choices[dta] instanceof Array) { + return this.setContents(this.choices[dta]); + } + */ + } + cnts.text = dta; + if (isNil(dta)) { + cnts.text = ''; + } else if (dta.toString) { + cnts.text = dta.toString(); + } + if (this.isReadOnly && !MorphicPreferences.isFlat) { + cnts.shadowOffset = new Point(1, 1); // correct initial dimensions + } + cnts.fixLayout(); + + // remember the constant, if any + this.constant = isConstant ? data : null; + + // adjust to zebra coloring: + if (this.isReadOnly) { + block = this.parentThatIsA(BlockMorph); // could be inside a multi-arg + if (block) { + block.fixLabelColor(); + } + } + + // run onSetContents if any + if (this.onSetContents) { + this[this.onSetContents](data); + } +}; + +InputSlotMorph.prototype.userSetContents = function (aStringOrFloat) { + // enable copy-on-edit for inherited scripts + var block = this.parentThatIsA(BlockMorph), + trgt = block.scriptTarget(true); + this.selectForEdit().setContents(aStringOrFloat); + if (trgt && !block.isTemplate) { + trgt.recordUserEdit( + 'scripts', + 'input slot', + 'set', + block.abstractBlockSpec(), + aStringOrFloat + ); + } +}; + +// InputSlotMorph drop-down menu: + +InputSlotMorph.prototype.dropDownMenu = function (enableKeyboard) { + var menu = this.menuFromDict(this.choices, null, enableKeyboard); + if (!menu) { // has already happened + return; + } + if (menu.items.length > 0) { + if (enableKeyboard) { + menu.popup(this.world(), this.bottomLeft()); + menu.getFocus(); + } else { + menu.popUpAtHand(this.world()); + } + } +}; + +InputSlotMorph.prototype.menuFromDict = function ( + choices, + noEmptyOption, + enableKeyboard) +{ + var key, dial, flag, + myself = this, + selector, + block = this.parentThatIsA(BlockMorph), + trgt = block.scriptTarget(true), + menu = new MenuMorph( + this.userSetContents, + null, + this, + this.fontSize + ); + + function update(num) { + myself.setContents(num); + myself.reactToSliderEdit(); + if (trgt && !block.isTemplate) { + trgt.recordUserEdit( + 'scripts', + 'input slot', + 'set choice', + block.abstractBlockSpec(), + num + ); + } + } + + function getImg(block) { + return () => block.fullImage(); + } + + if (choices instanceof Function) { + if (!Process.prototype.enableJS) { + menu.addItem('JavaScript extensions for Snap!\nare turned off'); + return menu; + } + choices = choices.call(this); + } else if (isString(choices)) { + if (choices.indexOf('ext_') === 0) { + selector = choices.slice(4); + choices = SnapExtensions.menus.get(selector); + if (choices) { + choices = choices.call(this); + } else { + menu.addItem('cannot find extension menu "' + selector + '"'); + return menu; + } + } else { + choices = this[choices](); + } + if (!choices) { // menu has already happened + return; + } + } + if (!noEmptyOption) { + menu.addItem(' ', null); + } + for (key in choices) { + if (Object.prototype.hasOwnProperty.call(choices, key)) { + if (key[0] === '~') { + menu.addLine(); + } else if (key.indexOf('§_def') === 0) { + menu.addItem( + this.doWithAlpha(1, getImg(choices[key])), + choices[key] + ); + } else if (key.indexOf('§_dir') === 0) { + dial = new DialMorph(); + dial.rootForGrab = function () {return this; }; + dial.target = this; + dial.action = update; + dial.fillColor = this.parent.color; + dial.setRadius(this.fontSize * 3); + dial.setValue(+this.evaluate(), false, true); + menu.addLine(); + menu.items.push(dial); + menu.addLine(); + } else if (key.indexOf('§_') === 0) { + // prefixing a key with '§_' only makes the menu item + // appear when the user holds down the shift-key + // use with care because mobile devices might only + // have a "soft" keyboard that isn't always there + if (this.world().currentKey === 16) { // shift + menu.addItem( + key.slice(2), + choices[key], + null, // hint + null, // color + null, // bold + true, // italic + null, // doubleClickAction + null, // shortcut + !(choices[key] instanceof Array) && + typeof choices[key] !== 'function' // verbatim? + ); + } + } else if (key === '__shout__go__') { + // show the green flag symbol + flag = new SymbolMorph('flag'); + flag.size = this.fontSize * 1.5; + flag.setColor(new Color(0, 200, 0)); + flag.fixLayout(); + menu.addItem(flag, ['__shout__go__']); + } else if (choices[key] instanceof Object && + !(choices[key] instanceof Array) && + (typeof choices[key] !== 'function')) { + menu.addMenu( + key, + this.menuFromDict(choices[key],true), + null, // indicator + true // verbatim? - don't translate + ); + } else if (choices[key] instanceof Array && + choices[key][0] instanceof Object && + typeof choices[key][0] !== 'function') { + menu.addMenu( + key, + this.menuFromDict(choices[key][0],true), + null, // indicator + false // verbatim? - do translate, if inside an array + ); + } else { + menu.addItem( + key, + choices[key], + null, // hint + null, // color + null, // bold + null, // italic + null, // doubleClickAction + null, // shortcut + !(choices[key] instanceof Array) && + typeof choices[key] !== 'function' && + typeof(choices[key]) !== 'number' // verbatim? + ); + } + } + } + return menu; +}; + +// InputSlotMorph special drop-down menus: +// Note each function returning a drop-down menu +// must accept a Boolean parameter enabling its +// access for searching + +InputSlotMorph.prototype.keysMenu = function () { + return { + 'any key' : ['any key'], + 'up arrow': ['up arrow'], + 'down arrow': ['down arrow'], + 'right arrow': ['right arrow'], + 'left arrow': ['left arrow'], + enter: ['enter'], + space : ['space'], + '+' : ['+'], + '-' : ['-'], + a : ['a'], + b : ['b'], + c : ['c'], + d : ['d'], + e : ['e'], + f : ['f'], + g : ['g'], + h : ['h'], + i : ['i'], + j : ['j'], + k : ['k'], + l : ['l'], + m : ['m'], + n : ['n'], + o : ['o'], + p : ['p'], + q : ['q'], + r : ['r'], + s : ['s'], + t : ['t'], + u : ['u'], + v : ['v'], + w : ['w'], + x : ['x'], + y : ['y'], + z : ['z'], + '0' : ['0'], + '1' : ['1'], + '2' : ['2'], + '3' : ['3'], + '4' : ['4'], + '5' : ['5'], + '6' : ['6'], + '7' : ['7'], + '8' : ['8'], + '9' : ['9'] + }; +}; + +InputSlotMorph.prototype.messagesMenu = function (searching) { + if (searching) {return {}; } + + var dict = {}, + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(), + stage = rcvr.parentThatIsA(StageMorph), + allNames = []; + + stage.children.concat(stage).forEach(morph => { + if (isSnapObject(morph)) { + morph.allMessageNames().forEach(msg => { + if (!allNames.some(m => snapEquals(m, msg))) { + allNames.push(msg); + } + }); + } + }); + allNames.sort().forEach(name => + dict[name] = name + ); + dict.__shout__go__ = ['__shout__go__']; + if (allNames.length > 0) { + dict['~'] = null; + } + dict['new...'] = () => + new DialogBoxMorph( + this, + this.setContents, + this + ).prompt( + 'Message name', + null, + this.world() + ); + return dict; +}; + +InputSlotMorph.prototype.messagesReceivedMenu = function (searching) { + var dict = { + '__shout__go__': ['__shout__go__'], + 'any message': ['any message'] + }, + rcvr, + stage, + allNames; + + if (searching) {return dict; } + + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(); + stage = rcvr.parentThatIsA(StageMorph); + allNames = []; + + stage.children.concat(stage).forEach(morph => { + if (isSnapObject(morph)) { + allNames = allNames.concat(morph.allMessageNames()); + } + }); + allNames.sort().forEach(name => { + if (name !== '__shout__go__') { + dict[name] = name; + } + }); + dict['~'] = null; + dict['new...'] = () => + new DialogBoxMorph( + this, + this.setContents, + this + ).prompt( + 'Message name', + null, + this.world() + ); + return dict; +}; + +InputSlotMorph.prototype.eventsMenu = function (searching) { + if (searching) {return {}; } + return {__shout__go__: ['__shout__go__']}; +}; + +InputSlotMorph.prototype.primitivesMenu = function () { + var dict = {}, + allNames = Array.from(SnapExtensions.primitives.keys()); + + allNames.sort().forEach(name => + dict[name] = name + ); + return dict; +}; + +InputSlotMorph.prototype.collidablesMenu = function (searching) { + var dict = { + 'mouse-pointer' : ['mouse-pointer'], + edge : ['edge'], + 'pen trails' : ['pen trails'] + }, + rcvr, + stage, + allNames; + + if (searching) {return dict; } + + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(); + stage = rcvr.parentThatIsA(StageMorph); + allNames = []; + + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary) { + if (morph.name !== rcvr.name && + !allNames.some(n => snapEquals(n, morph.name)) + ) { + allNames.push(morph.name); + } + } + }); + if (allNames.length > 0) { + dict['~'] = null; + allNames.forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.locationMenu = function (searching) { + var dict = { + 'mouse-pointer' : ['mouse-pointer'], + 'myself' : ['myself'] + }, + rcvr, + stage, + allNames = []; + + if (searching) {return dict; } + + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(); + stage = rcvr.parentThatIsA(StageMorph); + allNames = []; + + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary) { + if (morph.name !== rcvr.name && + !allNames.some(n => snapEquals(n, morph.name)) + ) { + allNames.push(morph.name); + } + } + }); + if (allNames.length > 0) { + dict['~'] = null; + allNames.forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.distancesMenu = function (searching) { + if (searching) { + return { + 'mouse-pointer': ['mouse-pointer'], + center: ['center'] + }; + } + + var block = this.parentThatIsA(BlockMorph), + dict = {}, + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(), + stage = rcvr.parentThatIsA(StageMorph), + allNames = []; + + if (block && (block.selector !== 'reportRelationTo')) { + dict['random position'] = ['random position']; + } + dict['mouse-pointer'] = ['mouse-pointer']; + dict.center = ['center']; + + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary) { + if (morph.name !== rcvr.name && + !allNames.some(n => snapEquals(n, morph.name)) + ) { + allNames.push(morph.name); + } + } + }); + if (allNames.length > 0) { + dict['~'] = null; + allNames.forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.clonablesMenu = function (searching) { + if (searching) {return {}; } + + var dict = {}, + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(), + stage = rcvr.parentThatIsA(StageMorph), + allNames = []; + + if (rcvr instanceof SpriteMorph) { + dict.myself = ['myself']; + } + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary) { + if (!allNames.some(n => snapEquals(n, morph.name))) { + allNames.push(morph.name); + } + } + }); + if (allNames.length > 0) { + dict['~'] = null; + allNames.forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.objectsMenuWithSelf = function (searching) { + if (searching) {return {}; } + return this.objectsMenu(false, true); +}; + +InputSlotMorph.prototype.objectsMenu = function (searching, includeMyself) { + if (searching) {return {}; } + + var rcvr = this.parentThatIsA(BlockMorph).scriptTarget(), + stage = rcvr.parentThatIsA(StageMorph), + dict = {}, + allNames = []; + + if (includeMyself) { + dict.myself = ['myself']; + } + dict[stage.name] = stage.name; + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary) { + if (!allNames.some(n => snapEquals(n, morph.name))) { + allNames.push(morph.name); + } + } + }); + if (allNames.length > 0) { + dict['~'] = null; + allNames.forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.receiversMenu = function (searching) { + var dict = {all: ['all']}, + rcvr, + stage; + + if (searching) {return dict; } + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(); + stage = rcvr.parentThatIsA(StageMorph); + dict['~'] = null; + dict[stage.name] = stage.name; + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary) { + if (!Object.keys(dict).some(k => snapEquals(k, morph.name))) { + dict[morph.name] = morph.name; + } + } + }); + return dict; +}; + +InputSlotMorph.prototype.userEditMenu = function (searching) { + var dict = {'anything': ['anything']}, + rcvr, + stage; + + if (searching) {return dict; } + rcvr = this.parentThatIsA(BlockMorph).scriptTarget(); + stage = rcvr.parentThatIsA(StageMorph); + dict['~'] = null; + dict[stage.name] = stage.name; + stage.children.forEach(morph => { + if (morph instanceof SpriteMorph && !morph.isTemporary && + !Object.keys(dict).some(k => snapEquals(k, morph.name)) + ) { + dict[morph.name] = morph.name; + } + }); + return dict; +}; + +InputSlotMorph.prototype.typesMenu = function () { + var dict = { + number : ['number'], + text : ['text'], + Boolean : ['Boolean'], + list : ['list'] + }; + if (SpriteMorph.prototype.enableFirstClass) { + dict.sprite = ['sprite']; + dict.stage = ['stage']; + } + dict.costume = ['costume']; + dict.sound = ['sound']; + dict.command = ['command']; + dict.reporter = ['reporter']; + dict.predicate = ['predicate']; + dict['~'] = null; + // the following entries are collective types and thus not unique: + if (SpriteMorph.prototype.enableFirstClass) { + dict.agent = ['agent']; + } + dict.script = ['script']; + return dict; +}; + +InputSlotMorph.prototype.gettablesMenu = function () { + var dict = {}, + nest = SpriteMorph.prototype.enableNesting, + oop = StageMorph.prototype.enableInheritance; + + dict.neighbors = ['neighbors']; + dict.self = ['self']; + dict['other sprites'] = ['other sprites']; + dict.clones = ['clones']; + dict['other clones'] = ['other clones']; + if (nest) { + dict.parts = ['parts']; + dict.anchor = ['anchor']; + } + dict.stage = ['stage']; + if (oop) { + dict.children = ['children']; + dict.parent = ['parent']; + dict['temporary?'] = ['temporary?']; + } + dict.name = ['name']; + dict.scripts = ['scripts']; + dict.solutions = ['solutions']; + dict.costume = ['costume']; + dict.costumes = ['costumes']; + dict.sounds = ['sounds']; + dict.blocks = ['blocks']; + dict.categories = ['categories']; + dict['dangling?'] = ['dangling?']; + dict['draggable?'] = ['draggable?']; + dict.width = ['width']; + dict.height = ['height']; + dict.left = ['left']; + dict.right = ['right']; + dict.top = ['top']; + dict.bottom = ['bottom']; + dict['rotation style'] = ['rotation style']; + dict['rotation x'] = ['rotation x']; + dict['rotation y'] = ['rotation y']; + dict['center x'] = ['center x']; + dict['center y'] = ['center y']; + return dict; +}; + +InputSlotMorph.prototype.attributesMenu = function (searching) { + var dict = { + 'position' : ['position'], + 'x position' : ['x position'], + 'y position' : ['y position'], + 'direction' : ['direction'], + 'costume #' : ['costume #'], + 'costume name' : ['costume name'], + 'size' : ['size'], + 'extent' : ['extent'], + 'width': ['width'], + 'height': ['height'], + 'left' : ['left'], + 'right' : ['right'], + 'top' : ['top'], + 'bottom' : ['bottom'], + 'volume' : ['volume'], + 'balance' : ['balance'] + }, + block, + objName, + rcvr, + stage, + obj, + varNames; + + if (searching) {return dict; } + + block = this.parentThatIsA(BlockMorph); + objName = block.inputs()[1].evaluate(); + rcvr = block.scriptTarget(); + stage = rcvr.parentThatIsA(StageMorph); + varNames = []; + + if (objName === stage.name) { + obj = stage; + } else { + obj = detect( + stage.children, + morph => morph.name === objName + ); + } + if (obj instanceof StageMorph) { + dict = { + 'costume #' : ['costume #'], + 'costume name' : ['costume name'], + 'volume' : ['volume'], + 'balance' : ['balance'], + 'extent' : ['extent'], + 'width': ['width'], + 'height': ['height'], + 'left' : ['left'], + 'right' : ['right'], + 'top' : ['top'], + 'bottom' : ['bottom'] + }; + } + dict['~'] = null; + dict.variables = ['variables']; + if (obj) { + varNames = obj.variables.names(); + if (varNames.length > 0) { + varNames.forEach(name => + dict[name] = name + ); + } + obj.allBlocks(true).forEach((def, i) => + dict['§_def' + i] = def.blockInstance(true) // include translations + ); + } + return dict; +}; + +InputSlotMorph.prototype.costumesMenu = function (searching) { + if (searching) {return {}; } + + var block = this.parentThatIsA(BlockMorph), + rcvr = block.scriptTarget(), + dict, + allNames = []; + if (rcvr instanceof SpriteMorph) { + dict = {Turtle : ['Turtle']}; + } else { // stage + dict = {Empty : ['Empty']}; + } + if (block.selector !== 'doSwitchToCostume') { + dict.current = ['current']; + } + rcvr.costumes.asArray().forEach(costume => { + if (!allNames.some(n => snapEquals(n, costume.name))) { + allNames.push(costume.name); + } + }); + if (allNames.length > 0) { + dict['~'] = null; + allNames.forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.soundsMenu = function (searching) { + if (searching) {return {}; } + + var rcvr = this.parentThatIsA(BlockMorph).scriptTarget(), + allNames = [], + dict = {}; + + rcvr.sounds.asArray().forEach(sound => { + if (!allNames.some(n => snapEquals(n, sound.name))) { + allNames.push(sound.name); + } + }); + if (allNames.length > 0) { + allNames.sort().forEach(name => + dict[name] = name + ); + } + return dict; +}; + +InputSlotMorph.prototype.shadowedVariablesMenu = function (searching) { + if (searching) {return {}; } + + var block = this.parentThatIsA(BlockMorph), + vars, + attribs, + rcvr, + dict = {}; + + if (!block) {return dict; } + rcvr = block.scriptTarget(); + if (this.parentThatIsA(RingMorph) || + this.topBlock().selector === 'receiveOnClone') { + // show own local vars and attributes, because this is likely to be + // inside TELL, ASK or OF or when initializing a new clone + vars = rcvr.variables.names(); + vars.forEach(name => + dict[name] = name + ); + attribs = rcvr.attributes; + /* + if (vars.length && attribs.length) { + dict['~'] = null; // add line + } + */ + attribs.forEach(name => + dict[name] = [name] + ); + } else if (rcvr && rcvr.exemplar) { + // only show shadowed vars and attributes + vars = rcvr.inheritedVariableNames(true); + vars.forEach(name => + dict[name] = name + ); + attribs = rcvr.shadowedAttributes(); + /* + if (vars.length && attribs.length) { + dict['~'] = null; // add line + } + */ + attribs.forEach(name => + dict[name] = [name] + ); + } + return dict; +}; + +InputSlotMorph.prototype.pianoKeyboardMenu = function (searching) { + if (searching) {return {}; } + + var menu, block, instrument; + block = this.parentThatIsA(BlockMorph); + if (block) { + instrument = block.scriptTarget().instrument; + } + menu = new PianoMenuMorph( + this.setContents, + this, + this.fontSize, + instrument + ); + menu.popup(this.world(), new Point( + this.right() - (menu.width() / 2), + this.bottom() + )); + menu.selectKey(+this.evaluate()); +}; + +InputSlotMorph.prototype.directionDialMenu = function (searching) { + if (searching) {return {}; } + return {'§_dir': null}; +}; + +InputSlotMorph.prototype.audioMenu = function (searching) { + var dict = { + 'volume' : ['volume'], + 'note' : ['note'], + 'frequency' : ['frequency'], + 'samples' : ['samples'], + 'sample rate' : ['sample rate'], + 'spectrum' : ['spectrum'], + 'resolution' : ['resolution'] + }; + if (searching) {return dict; } + + if (this.world().currentKey === 16) { // shift + dict['~'] = null; + dict.modifier = ['modifier']; + dict.output = ['output']; + } + return dict; +}; + +InputSlotMorph.prototype.scenesMenu = function (searching) { + var dict = {}, + ide, scenes; + if (!searching) { + ide = this.parentThatIsA(IDE_Morph) || + this.parentThatIsA(BlockEditorMorph) + .target.parentThatIsA(IDE_Morph); + scenes = ide.scenes; + if (scenes.length() > 1) { + scenes.itemsArray().forEach(scn => { + if (scn.name) { + dict[scn.name] = scn.name; + } + }); + } + } + dict['~'] = null; + dict.next = ['next']; + dict.previous = ['previous']; + // dict['1 '] = 1; // trailing space needed to prevent undesired sorting + // dict.last = ['last']; + dict.random = ['random']; + return dict; +}; + +InputSlotMorph.prototype.setChoices = function (dict, readonly) { + // externally specify choices and read-only status, + // used for custom blocks + var cnts = this.contents(); + this.choices = dict; + this.isReadOnly = readonly || false; + if (this.parent instanceof BlockMorph) { + this.parent.fixLabelColor(); + if (!readonly) { + cnts.shadowOffset = ZERO; + cnts.shadowColor = null; + cnts.setColor(BLACK); + } + } + this.fixLayout(); +}; + +// InputSlotMorph layout: + +InputSlotMorph.prototype.fixLayout = function () { + var width, height, arrowWidth, + contents = this.contents(), + arrow = this.arrow(), + tp = this.topBlock(); + + contents.isNumeric = this.isNumeric && !this.isAlphanumeric; + contents.isEditable = (!this.isReadOnly); + if (this.isReadOnly) { + contents.disableSelecting(); + contents.color = WHITE; + } else { + contents.enableSelecting(); + contents.color = BLACK; + } + + if (this.choices) { + arrow.setSize(fontHeight(this.fontSize)); + arrow.show(); + } else { + arrow.hide(); + } + arrowWidth = arrow.isVisible ? arrow.width() : 0; + + // determine slot dimensions + if (this.selectedBlock) { // a "wish" in the OF-block's left slot + height = this.selectedBlock.height() + this.edge * 2; + width = this.selectedBlock.width() + + arrowWidth + + this.edge * 2 + + this.typeInPadding * 2; + } else if (this.symbol) { + this.symbol.fixLayout(); + this.symbol.setPosition(this.position().add(this.edge * 2)); + height = this.symbol.height() + this.edge * 4; + width = this.symbol.width() + + arrowWidth + + this.edge * 4 + + this.typeInPadding * 2; + } else { + height = contents.height() + this.edge * 2; // + this.typeInPadding * 2 + if (this.isNumeric) { + width = contents.width() + + Math.floor(arrowWidth * 0.5) + + height + + this.typeInPadding * 2; + } else { + width = Math.max( + contents.width() + + arrowWidth + + this.edge * 2 + + this.typeInPadding * 2, + contents.rawHeight ? // single vs. multi-line contents + contents.rawHeight() + arrowWidth + : fontHeight(contents.fontSize) / 1.3 + + arrowWidth, + this.minWidth // for text-type slots + ); + } + } + this.bounds.setExtent(new Point(width, height)); + + if (this.isNumeric) { + contents.setPosition(new Point( + Math.floor(height / 2), + this.edge + ).add(new Point(this.typeInPadding, 0)).add(this.position())); + } else { + contents.setPosition(new Point( + this.edge, + this.edge + ).add(new Point(this.typeInPadding, 0)).add(this.position())); + } + + if (arrow.isVisible) { + arrow.setPosition(new Point( + this.right() - arrowWidth - this.edge, + contents.top() - arrowWidth / 8 + )); + } + + if (this.parent && this.parent.fixLayout) { + tp.fullChanged(); + this.parent.fixLayout(); + tp.fullChanged(); + } +}; + +// InputSlotMorph events: + +InputSlotMorph.prototype.mouseDownLeft = function (pos) { + if (this.isReadOnly || this.symbol || + this.arrow().bounds.containsPoint(pos)) { + this.escalateEvent('mouseDownLeft', pos); + } else { + this.selectForEdit().contents().edit(); + } +}; + +InputSlotMorph.prototype.mouseClickLeft = function (pos) { + if (this.arrow().bounds.containsPoint(pos)) { + this.dropDownMenu(); + } else if (this.isReadOnly || this.symbol) { + this.dropDownMenu(); + } else { + this.contents().edit(); + } +}; + +InputSlotMorph.prototype.reactToKeystroke = function () { + var cnts; + if (this.constant) { + cnts = this.contents(); + this.constant = null; + cnts.isItalic = false; + cnts.rerender(); + } +}; + +InputSlotMorph.prototype.reactToEdit = function () { + var block = this.parentThatIsA(BlockMorph), + trgt = block.scriptTarget(true); + this.contents().clearSelection(); + if (trgt && !block.isTemplate) { + trgt.recordUserEdit( + 'scripts', + 'input slot', + 'edit', + block.abstractBlockSpec(), + this.evaluate() + ); + } +}; + +InputSlotMorph.prototype.freshTextEdit = function (aStringOrTextMorph) { + this.onNextStep = () => aStringOrTextMorph.selectAll(); +}; + +// InputSlotMorph menu: + +InputSlotMorph.prototype.slotMenu = function () { + var menu; + if (StageMorph.prototype.enableCodeMapping) { + menu = new MenuMorph(this); + if (this.isNumeric) { + menu.addItem( + 'code number mapping...', + 'mapNumberToCode' + ); + } else { + menu.addItem( + 'code string mapping...', + 'mapStringToCode' + ); + } + return menu; + } + return null; +}; + +// InputSlotMorph reacting to user choices + +/* + if selecting an option from a dropdown menu might affect the visibility + or contents of another input slot, the methods in this section can + offer functionality that can be specified externally by setting + the "onSetContents" property to the name of the according method +*/ + +InputSlotMorph.prototype.updateEventUpvar = function (data) { + // assumes a second multi-arg input slot to my right that is + // either shown or hidden and collapsed based on whether + // "any ..." is selected as choice. + + var trg = this.parent.inputs()[1]; + if (data instanceof Array && data[0].indexOf('any') === 0) { + trg.show(); + } else { + trg.removeInput(); + trg.hide(); + } + this.parent.fixLayout(); +}; + + +// InputSlotMorph code mapping + +/* + code mapping lets you use blocks to generate arbitrary text-based + source code that can be exported and compiled / embedded elsewhere, + it's not part of Snap's evaluator and not needed for Snap itself +*/ + +InputSlotMorph.prototype.mapStringToCode = function () { + // private - open a dialog box letting the user map code via the GUI + new DialogBoxMorph( + this, + code => StageMorph.prototype.codeMappings.string = code, + this + ).promptCode( + 'Code mapping - String <#1>', + StageMorph.prototype.codeMappings.string || '', + this.world() + ); +}; + +InputSlotMorph.prototype.mapNumberToCode = function () { + // private - open a dialog box letting the user map code via the GUI + new DialogBoxMorph( + this, + code => StageMorph.prototype.codeMappings.number = code, + this + ).promptCode( + 'Code mapping - Number <#1>', + StageMorph.prototype.codeMappings.number || '', + this.world() + ); +}; + +InputSlotMorph.prototype.mappedCode = function () { + var block = this.parentThatIsA(BlockMorph), + val = this.evaluate(), + code; + + if (this.isNumeric) { + code = StageMorph.prototype.codeMappings.number || '<#1>'; + return code.replace(/<#1>/g, val); + } + if (!isNaN(+val)) {return val; } + if (!isString(val)) {return val; } + if (block && contains( + ['doSetVar', 'doChangeVar', 'doShowVar', 'doHideVar'], + block.selector + )) { + return val; + } + code = StageMorph.prototype.codeMappings.string || '<#1>'; + return code.replace(/<#1>/g, val); +}; + +// InputSlotMorph evaluating: + +InputSlotMorph.prototype.evaluate = function () { +/* + answer my contents, which can be a "wish", i.e. a block that refers to + another sprite's local method, or a text string. If I am numerical convert + that string to a number. If the conversion fails answer the string + (e.g. for special choices like 'random', 'all' or 'last') otherwise + the numerical value. +*/ + var num, contents; + + if (this.selectedBlock) { + return this.selectedBlock; + } + if (this.symbol) { + if (this.symbol.name === 'flag') { + return ['__shout__go__']; + } + return ''; + } + if (this.constant) { + return this.constant; + } + contents = this.contents(); + if (this.isNumeric) { + num = parseFloat(contents.text || '0'); + if (!isNaN(num)) { + return num; + } + } + return contents.text; +}; + +InputSlotMorph.prototype.isEmptySlot = function () { + return this.contents().text === '' && !this.selectedBlock && !this.symbol; +}; + +// InputSlotMorph single-stepping: + +InputSlotMorph.prototype.flash = function (aColor) { + // don't redraw the label b/c zebra coloring + if (!this.cachedNormalColor) { + this.cachedNormalColor = this.color; + this.color = aColor || this.activeHighlight; + this.rerender(); + } +}; + +InputSlotMorph.prototype.unflash = function () { + // don't redraw the label b/c zebra coloring + if (this.cachedNormalColor) { + var clr = this.cachedNormalColor; + this.cachedNormalColor = null; + this.color = clr; + this.rerender(); + } +}; + +// InputSlotMorph drawing: + +InputSlotMorph.prototype.render = function (ctx) { + var borderColor, r; + + // initialize my surface property + if (this.cachedNormalColor) { // if flashing + borderColor = this.color; + } else if (this.parent) { + borderColor = this.parent.color; + } else { + borderColor = new Color(120, 120, 120); + } + ctx.fillStyle = this.color.toString(); + if (this.isReadOnly && !this.cachedNormalColor) { // unless flashing + ctx.fillStyle = borderColor.darker().toString(); + } + + // cache my border colors + this.cachedClr = borderColor.toString(); + this.cachedClrBright = borderColor.lighter(this.contrast) + .toString(); + this.cachedClrDark = borderColor.darker(this.contrast).toString(); + + if (!this.isNumeric) { + ctx.fillRect( + this.edge, + this.edge, + this.width() - this.edge * 2, + this.height() - this.edge * 2 + ); + if (!MorphicPreferences.isFlat) { + this.drawRectBorder(ctx); + } + } else { + r = Math.max((this.height() - (this.edge * 2)) / 2, 0); + ctx.beginPath(); + ctx.arc( + r + this.edge, + r + this.edge, + r, + radians(90), + radians(-90), + false + ); + ctx.arc( + this.width() - r - this.edge, + r + this.edge, + r, + radians(-90), + radians(90), + false + ); + ctx.closePath(); + ctx.fill(); + if (!MorphicPreferences.isFlat) { + this.drawRoundBorder(ctx); + } + } + + // draw my "wish" block, if any + if (this.selectedBlock) { + ctx.drawImage( + this.doWithAlpha(1, () => this.selectedBlock.fullImage()), + this.edge + this.typeInPadding, + this.edge + ); + } +}; + +InputSlotMorph.prototype.drawRectBorder = function (ctx) { + var shift = this.edge * 0.5, + gradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + if (useBlurredShadows) { + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.edge, shift); + ctx.lineTo(this.width() - this.edge - shift, shift); + ctx.stroke(); + + ctx.shadowOffsetY = 0; + + gradient = ctx.createLinearGradient( + 0, + 0, + this.edge, + 0 + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, this.edge); + ctx.lineTo(shift, this.height() - this.edge - shift); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + gradient = ctx.createLinearGradient( + 0, + this.height() - this.edge, + 0, + this.height() + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.edge, this.height() - shift); + ctx.lineTo(this.width() - this.edge, this.height() - shift); + ctx.stroke(); + + gradient = ctx.createLinearGradient( + this.width() - this.edge, + 0, + this.width(), + 0 + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.width() - shift, this.edge); + ctx.lineTo(this.width() - shift, this.height() - this.edge); + ctx.stroke(); + +}; + +InputSlotMorph.prototype.drawRoundBorder = function (ctx) { + var shift = this.edge * 0.5, + r = Math.max((this.height() - (this.edge * 2)) / 2, 0), + start, + end, + gradient; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // straight top edge: + start = r + this.edge; + end = this.width() - r - this.edge; + if (end > start) { + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + + ctx.moveTo(start, shift); + ctx.lineTo(end, shift); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + } + + // straight bottom edge: + gradient = ctx.createLinearGradient( + 0, + this.height() - this.edge, + 0, + this.height() + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r + this.edge, this.height() - shift); + ctx.lineTo(this.width() - r - this.edge, this.height() - shift); + ctx.stroke(); + + r = Math.max(this.height() / 2, this.edge); + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + // top edge: left corner + gradient = ctx.createRadialGradient( + r, + r, + r - this.edge, + r, + r, + r + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + r, + r, + r - shift, + radians(180), + radians(270), + false + ); + + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // bottom edge: right corner + gradient = ctx.createRadialGradient( + this.width() - r, + r, + r - this.edge, + this.width() - r, + r, + r + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + this.width() - r, + r, + r - shift, + radians(0), + radians(90), + false + ); + ctx.stroke(); +}; + +// InputSlotStringMorph /////////////////////////////////////////////// + +/* + I am a piece of single-line text inside an input slot block. I serve as a + container for sharing typographic attributes among my instances +*/ + +// InputSlotStringMorph inherits from StringMorph: + +InputSlotStringMorph.prototype = new StringMorph(); +InputSlotStringMorph.prototype.constructor = InputSlotStringMorph; +InputSlotStringMorph.uber = StringMorph.prototype; + +function InputSlotStringMorph( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName +) { + this.init( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName + ); +} + +InputSlotStringMorph.prototype.getRenderColor = function () { + if (MorphicPreferences.isFlat) { + if (this.isEditable) { + return this.color; + } + return this.parent.alpha > 0.5 ? this.color : BLACK; + } + return this.parent.alpha > 0.25 ? this.color : WHITE; +}; + +InputSlotStringMorph.prototype.getShadowRenderColor = function () { + return this.parent.alpha > 0.25 ? this.shadowColor : CLEAR; +}; + +// InputSlotTextMorph /////////////////////////////////////////////// + +/* + I am a piece of multi-line text inside an input slot block. I serve as a + container for sharing typographic attributes among my instances +*/ + +// InputSlotTextMorph inherits from TextMorph: + +InputSlotTextMorph.prototype = new TextMorph(); +InputSlotTextMorph.prototype.constructor = InputSlotTextMorph; +InputSlotTextMorph.uber = StringMorph.prototype; + +function InputSlotTextMorph( + text, + fontSize, + fontStyle, + bold, + italic, + alignment, + width, + fontName, + shadowOffset, + shadowColor +) { + this.init(text, + fontSize, + fontStyle, + bold, + italic, + alignment, + width, + fontName, + shadowOffset, + shadowColor); +} + +InputSlotTextMorph.prototype.getRenderColor = + InputSlotStringMorph.prototype.getRenderColor; + +InputSlotTextMorph.prototype.getShadowRenderColor = + InputSlotStringMorph.prototype.getShadowRenderColor; + +// TemplateSlotMorph /////////////////////////////////////////////////// + +/* + I am a reporter block template sitting on a pedestal. + My block spec is + + %t - template + + evaluate returns the embedded reporter template's label string +*/ + +// TemplateSlotMorph inherits from ArgMorph: + +TemplateSlotMorph.prototype = new ArgMorph(); +TemplateSlotMorph.prototype.constructor = TemplateSlotMorph; +TemplateSlotMorph.uber = ArgMorph.prototype; + +// TemplateSlotMorph instance creation: + +function TemplateSlotMorph(name) { + this.init(name); +} + +TemplateSlotMorph.prototype.init = function (name) { + var template = new ReporterBlockMorph(); + this.labelString = name || ''; + template.isDraggable = false; + template.isTemplate = true; + if (modules.objects !== undefined) { + template.color = SpriteMorph.prototype.blockColor.variables; + template.category = 'variables'; + } else { + template.color = new Color(243, 118, 29); + template.category = null; + } + template.setSpec(this.labelString); + template.selector = 'reportGetVar'; + TemplateSlotMorph.uber.init.call(this); + this.add(template); + this.fixLayout(); + this.isDraggable = false; + this.isStatic = true; // I cannot be exchanged +}; + +// TemplateSlotMorph accessing: + +TemplateSlotMorph.prototype.getSpec = function () { + return '%t'; +}; + +TemplateSlotMorph.prototype.template = function () { + return this.children[0]; +}; + +TemplateSlotMorph.prototype.contents = function () { + return this.template().blockSpec; +}; + +TemplateSlotMorph.prototype.setContents = function (aString) { + var tmp = this.template(); + tmp.setSpec(aString instanceof Array? localize(aString[0]) : aString); + tmp.fixBlockColor(); // fix zebra coloring + tmp.fixLabelColor(); +}; + +// TemplateSlotMorph evaluating: + +TemplateSlotMorph.prototype.evaluate = function () { + return this.contents(); +}; + +// TemplateSlotMorph layout: + +TemplateSlotMorph.prototype.fixLayout = function () { + var template = this.template(); + this.bounds.setExtent(template.extent().add(this.edge * 2 + 2)); + template.setPosition(this.position().add(this.edge + 1)); + if (this.parent) { + if (this.parent.fixLayout) { + this.parent.fixLayout(); + } + } +}; + +// TemplateSlotMorph drop behavior: + +TemplateSlotMorph.prototype.wantsDropOf = function (aMorph) { + return aMorph.selector === 'reportGetVar'; +}; + +TemplateSlotMorph.prototype.reactToDropOf = function (droppedMorph) { + if (droppedMorph.selector === 'reportGetVar') { + droppedMorph.destroy(); + } +}; + +// TemplateSlotMorph visualizing scope: + +TemplateSlotMorph.prototype.mouseEnter = function () { + if (Process.prototype.enableSingleStepping) { + this.flashScope(); + } +}; + +TemplateSlotMorph.prototype.mouseLeave = function () { + if (Process.prototype.enableSingleStepping) { + this.unflashScope(); + } +}; + +TemplateSlotMorph.prototype.flashScope = function () { + var tmp = this.template(), + scope = tmp.fullScopeFor(tmp.blockSpec, true), + clr = this.activeHighlight.darker(); + scope.forEach(elem => elem.flash(clr)); +}; + +TemplateSlotMorph.prototype.unflashScope = function () { + var tmp = this.template(), + scope = tmp.fullScopeFor(tmp.blockSpec, true); + scope.forEach(elem => elem.unflash()); +}; + +// TemplateSlotMorph drawing: + +TemplateSlotMorph.prototype.render = function (ctx) { + if (this.parent instanceof Morph) { + this.color = this.parent.color.copy(); + } + BlockMorph.prototype.render.call(this, ctx); +}; + +TemplateSlotMorph.prototype.outlinePath = + ReporterBlockMorph.prototype.outlinePathOval; + +TemplateSlotMorph.prototype.outlinePath = + ReporterBlockMorph.prototype.outlinePathOval; + +TemplateSlotMorph.prototype.drawEdges = ReporterBlockMorph + .prototype.drawEdgesOval; + +TemplateSlotMorph.prototype.hasLocationPin = function () { + return false; +}; + +TemplateSlotMorph.prototype.cSlots = function () { + return []; +}; + +// TemplateSlotMorph single-stepping + +TemplateSlotMorph.prototype.flash = function (aColor) { + this.template().flash(aColor); +}; + +TemplateSlotMorph.prototype.unflash = function () { + this.template().unflash(); +}; + +// BooleanSlotMorph //////////////////////////////////////////////////// + +/* + I am a diamond-shaped argument slot. + My block spec is + + %b - Boolean + %boolUE - Boolean unevaluated + + I can be directly edited. When the user clicks on me I toggle + between , and values. + + evaluate() returns my value. + + my most important public attributes and accessors are: + + value - user editable contents (Boolean or null) + setContents(Boolean/null) - display the argument (Boolean or null) +*/ + +// BooleanSlotMorph inherits from ArgMorph: + +BooleanSlotMorph.prototype = new ArgMorph(); +BooleanSlotMorph.prototype.constructor = BooleanSlotMorph; +BooleanSlotMorph.uber = ArgMorph.prototype; + +// BooleanSlotMorph preferences settings + +BooleanSlotMorph.prototype.isTernary = false; + +// BooleanSlotMorph instance creation: + +function BooleanSlotMorph(initialValue) { + this.init(initialValue); +} + +BooleanSlotMorph.prototype.init = function (initialValue) { + this.value = (typeof initialValue === 'boolean') ? initialValue : null; + this.isUnevaluated = false; + this.progress = 0; // for animation state, not persisted + BooleanSlotMorph.uber.init.call(this); + this.alpha = 1; + this.fixLayout(); +}; + +BooleanSlotMorph.prototype.getSpec = function () { + return this.isUnevaluated ? '%boolUE' : '%b'; +}; + +// BooleanSlotMorph accessing: + +BooleanSlotMorph.prototype.evaluate = function () { + return this.value; +}; + +BooleanSlotMorph.prototype.isEmptySlot = function () { + return this.value === null; +}; + +BooleanSlotMorph.prototype.isBinary = function () { + return !this.isTernary && + isNil(this.parentThatIsA(RingMorph)) && + !isNil(this.parentThatIsA(ScriptsMorph)); +}; + +BooleanSlotMorph.prototype.setContents = function (boolOrNull) { + this.value = (typeof boolOrNull === 'boolean') ? boolOrNull : null; + this.rerender(); +}; + +BooleanSlotMorph.prototype.toggleValue = function () { + var target = this.selectForEdit(), + block = this.parentThatIsA(BlockMorph), + sprite, + ide; + if (target !== this) { + return this.toggleValue.call(target); + } + this.value = this.nextValue(); + if (block) { + sprite = block.scriptTarget(); + if (!block.isTemplate) { + sprite.recordUserEdit( + 'scripts', + 'boolean slot', + 'toggle', + block.abstractBlockSpec(), + this.value + ); + } + ide = sprite.parentThatIsA(IDE_Morph); + if (ide && !ide.isAnimating) { + this.rerender(); + return; + } + } + this.progress = 3; + this.rerender(); + this.nextSteps ([ + () => { + this.progress = 2; + this.rerender(); + }, + () => { + this.progress = 1; + this.rerender(); + }, + () => { + this.progress = 0; + this.rerender(); + }, + ]); +}; + +BooleanSlotMorph.prototype.nextValue = function () { + if (this.isStatic || this.isBinary()) { + return !this.value; + } + switch (this.value) { + case true: + return false; + case false: + return null; + default: + return true; + } +}; + +// BooleanSlotMorph events: + +BooleanSlotMorph.prototype.mouseClickLeft = function () { + this.toggleValue(); + if (isNil(this.value)) {return; } + this.reactToSliderEdit(); +}; + +BooleanSlotMorph.prototype.mouseEnter = function () { + if (this.isStatic) {return; } + if (this.nextValue() === null) { + this.progress = -1; // 'fade' + } else { + this.progress = 1; + } + this.rerender(); +}; + +BooleanSlotMorph.prototype.mouseLeave = function () { + if (this.isStatic) {return; } + this.progress = 0; + this.rerender(); +}; + +// BooleanSlotMorph menu: + +BooleanSlotMorph.prototype.slotMenu = function () { + var menu; + if (StageMorph.prototype.enableCodeMapping) { + menu = new MenuMorph(this); + if (this.evaluate() === true) { + menu.addItem( + 'code true mapping...', + 'mapTrueToCode' + ); + } else { + menu.addItem( + 'code false mapping...', + 'mapFalseToCode' + ); + } + return menu; + } + return null; +}; + +// BooleanSlotMorph code mapping + +/* + code mapping lets you use blocks to generate arbitrary text-based + source code that can be exported and compiled / embedded elsewhere, + it's not part of Snap's evaluator and not needed for Snap itself +*/ + +BooleanSlotMorph.prototype.mapTrueToCode = function () { + // private - open a dialog box letting the user map code via the GUI + new DialogBoxMorph( + this, + code => StageMorph.prototype.codeMappings['true'] = code, + this + ).promptCode( + 'Code mapping - true', + StageMorph.prototype.codeMappings['true'] || 'true', + this.world() + ); +}; + +BooleanSlotMorph.prototype.mapFalseToCode = function () { + // private - open a dialog box letting the user map code via the GUI + new DialogBoxMorph( + this, + code => StageMorph.prototype.codeMappings['false'] = code, + this + ).promptCode( + 'Code mapping - false', + StageMorph.prototype.codeMappings['false'] || 'false', + this.world() + ); +}; + +BooleanSlotMorph.prototype.mappedCode = function () { + if (this.evaluate() === true) { + return StageMorph.prototype.codeMappings.boolTrue || 'true'; + } + return StageMorph.prototype.codeMappings.boolFalse || 'false'; +}; + +// BooleanSlotMorph layout: + +BooleanSlotMorph.prototype.fixLayout = function () { + // determine my extent + var text, h; + if (this.isStatic) { + text = this.textLabelExtent(); + h = text.y + (this.edge * 3); + this.bounds.setWidth(text.x + (h * 1.5) + (this.edge * 2)); + this.bounds.setHeight(h); + } else { + this.bounds.setWidth((this.fontSize + this.edge * 2) * 2); + this.bounds.setHeight(this.fontSize + this.edge * 2); + } +}; + +// BooleanSlotMorph drawing: + +BooleanSlotMorph.prototype.render = function (ctx) { + if (!(this.cachedNormalColor)) { // unless flashing + this.color = this.parent ? + this.parent.color : new Color(200, 200, 200); + } + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + this.drawDiamond(ctx, this.progress); + this.drawLabel(ctx); + this.drawKnob(ctx, this.progress); +}; + +BooleanSlotMorph.prototype.drawDiamond = function (ctx, progress) { + var w = this.width(), + h = this.height(), + r = h / 2, + w2 = w / 2, + shift = this.edge / 2, + gradient; + + // draw the 'flat' shape: + if (this.cachedNormalColor) { // if flashing + ctx.fillStyle = this.color.toString(); + } else if (progress < 0 ) { // 'fade' + ctx.fillStyle = this.color.darker(25).toString(); + } else { + switch (this.value) { + case true: + ctx.fillStyle = 'rgb(0, 200, 0)'; + break; + case false: + ctx.fillStyle = 'rgb(200, 0, 0)'; + break; + default: + ctx.fillStyle = this.color.darker(25).toString(); + } + } + + if (progress > 0 && !this.isEmptySlot()) { + // left half: + ctx.fillStyle = 'rgb(0, 200, 0)'; + ctx.beginPath(); + ctx.moveTo(0, r); + ctx.lineTo(r, 0); + ctx.lineTo(w2, 0); + ctx.lineTo(w2, h); + ctx.lineTo(r, h); + ctx.closePath(); + ctx.fill(); + + // right half: + ctx.fillStyle = 'rgb(200, 0, 0)'; + ctx.beginPath(); + ctx.moveTo(w2, 0); + ctx.lineTo(w - r, 0); + ctx.lineTo(w, r); + ctx.lineTo(w - r, h); + ctx.lineTo(w2, h); + ctx.closePath(); + ctx.fill(); + } else { + ctx.beginPath(); + ctx.moveTo(0, r); + ctx.lineTo(r, 0); + ctx.lineTo(w - r, 0); + ctx.lineTo(w, r); + ctx.lineTo(w - r, h); + ctx.lineTo(r, h); + ctx.closePath(); + ctx.fill(); + } + + if (MorphicPreferences.isFlat) {return; } + + // add 3D-Effect: + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowBlur = shift; + ctx.shadowColor = 'black'; + } + + // top edge: left corner + gradient = ctx.createLinearGradient( + 0, + r, + this.edge * 0.6, + r + (this.edge * 0.6) + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, r); + ctx.lineTo(r, shift); + ctx.closePath(); + ctx.stroke(); + + // top edge: straight line + if (useBlurredShadows) { + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + } + + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r, shift); + ctx.lineTo(w - r, shift); + ctx.closePath(); + ctx.stroke(); + + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // bottom edge: right corner + gradient = ctx.createLinearGradient( + w - r - (this.edge * 0.6), + h - (this.edge * 0.6), + w - r, + h + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - r, h - shift); + ctx.lineTo(w - shift, r); + ctx.closePath(); + ctx.stroke(); + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r, h - shift); + ctx.lineTo(w - r - shift, h - shift); + ctx.closePath(); + ctx.stroke(); +}; + +BooleanSlotMorph.prototype.drawLabel = function (ctx) { + var w = this.width(), + r = this.height() / 2 - this.edge, + r2 = r / 2, + shift = this.edge / 2, + text, + x, + y = this.height() / 2; + + if (this.isEmptySlot() || this.progress < 0) { + return; + } + + if (this.isStatic) { // draw the full text label + text = this.textLabelExtent(); + y = this.height() - (this.height() - text.y) / 2; + if (this.value) { + x = this.height() / 2; + } else { + x = this.width() - (this.height() / 2) - text.x; + } + ctx.save(); + if (!MorphicPreferences.isFlat && useBlurredShadows) { + ctx.shadowOffsetX = -shift; + ctx.shadowOffsetY = -shift; + ctx.shadowBlur = shift; + ctx.shadowColor = this.value ? 'rgb(0, 100, 0)' : 'rgb(100, 0, 0)'; + } + ctx.font = new StringMorph(null, this.fontSize, null, true).font(); + ctx.textAlign = 'left'; + ctx.textBaseline = 'bottom'; + ctx.fillStyle = 'rgb(255, 255, 255'; + ctx.fillText( + localize(this.value ? 'true' : 'false'), + x, + y + ); + ctx.restore(); + return; + } + + // "tick:" + x = r + (this.edge * 2) + shift; + if (!MorphicPreferences.isFlat && useBlurredShadows) { + ctx.shadowOffsetX = -shift; + ctx.shadowOffsetY = -shift; + ctx.shadowBlur = shift; + ctx.shadowColor = 'rgb(0, 100, 0)'; + } + ctx.strokeStyle = 'white'; + ctx.lineWidth = this.edge + shift; + ctx.lineCap = 'round'; + ctx.lineJoin = 'miter'; + ctx.beginPath(); + ctx.moveTo(x - r2, y); + ctx.lineTo(x, y + r2); + ctx.lineTo(x + r2, r2 + this.edge); + ctx.stroke(); + + // "cross:" + x = w - y - (this.edge * 2); + if (!MorphicPreferences.isFlat && useBlurredShadows) { + ctx.shadowOffsetX = -shift; + ctx.shadowOffsetY = -shift; + ctx.shadowBlur = shift; + ctx.shadowColor = 'rgb(100, 0, 0)'; + } + ctx.strokeStyle = 'white'; + ctx.lineWidth = this.edge; + ctx.lineCap = 'butt'; + ctx.beginPath(); + ctx.moveTo(x - r2, y - r2); + ctx.lineTo(x + r2, y + r2); + ctx.moveTo(x - r2, y + r2); + ctx.lineTo(x + r2, y - r2); + ctx.stroke(); +}; + +BooleanSlotMorph.prototype.drawKnob = function (ctx, progress) { + var w = this.width(), + r = this.height() / 2, + shift = this.edge / 2, + slideStep = (this.width() - this.height()) / 4 * + Math.max(0, (progress || 0)), + gradient, + x, + y = r, + outline = PushButtonMorph.prototype.outline / 2, + outlineColor = PushButtonMorph.prototype.outlineColor, + color = PushButtonMorph.prototype.color, + contrast = PushButtonMorph.prototype.contrast, + topColor = color.lighter(contrast), + bottomColor = color.darker(contrast); + + // draw the 'flat' shape: + switch (this.value) { + case false: + x = r + slideStep; + if (!MorphicPreferences.isFlat && useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = shift; + ctx.shadowColor = 'black'; + } + if (progress < 0) { + ctx.globalAlpha = 0.6; + } + break; + case true: + x = w - r - slideStep; + if (!MorphicPreferences.isFlat) { + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + } + break; + default: + if (!progress) {return; } + x = r; + if (!MorphicPreferences.isFlat && useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = shift; + ctx.shadowColor = 'black'; + } + ctx.globalAlpha = 0.6; + } + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.arc(x, y, r, radians(0), radians(360)); + ctx.closePath(); + ctx.fill(); + + if (MorphicPreferences.isFlat) { + ctx.globalAlpha = 1; + return; + } + + // add 3D-Effect + // outline: + ctx.shadowOffsetX = 0; + ctx.shadowBlur = 0; + ctx.shadowColor = 'black'; + ctx.lineWidth = outline; + ctx.strokeStyle = outlineColor.toString(); + ctx.beginPath(); + ctx.arc(x, y, r - (outline / 2), radians(0), radians(360)); + ctx.stroke(); + + if (r < outline + this.edge) { + return; + } + + // top-left: + gradient = ctx.createRadialGradient( + x, + y, + r - outline - this.edge, + x, + y, + r - outline + ); + gradient.addColorStop(1, topColor.toString()); + gradient.addColorStop(0, color.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.arc( + x, + y, + r - outline - this.edge / 2, + radians(180), + radians(270), + false + ); + ctx.stroke(); + + // bottom-right: + gradient = ctx.createRadialGradient( + x, + y, + r - outline - this.edge, + x, + y, + r - outline + ); + gradient.addColorStop(1, bottomColor.toString()); + gradient.addColorStop(0, color.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.arc( + x, + y, + r - outline - this.edge / 2, + radians(0), + radians(90), + false + ); + ctx.stroke(); + ctx.globalAlpha = 1; +}; + +BooleanSlotMorph.prototype.textLabelExtent = function () { + var t, f; + t = new StringMorph( + localize('true'), + this.fontSize, + null, + true // bold + ); + f = new StringMorph( + localize('false'), + this.fontSize, + null, + true // bold + ); + return new Point(Math.max(t.width(), f.width()), t.height()); +}; + +// ArrowMorph ////////////////////////////////////////////////////////// + +/* + I am a triangular arrow shape, for use in drop-down menus etc. + My orientation is governed by my 'direction' property, which can be + 'down', 'up', 'left' or 'right'. +*/ + +// ArrowMorph inherits from Morph: + +ArrowMorph.prototype = new Morph(); +ArrowMorph.prototype.constructor = ArrowMorph; +ArrowMorph.uber = Morph.prototype; + +// ArrowMorph instance creation: + +function ArrowMorph(direction, size, padding, color, isBlockLabel) { + this.init(direction, size, padding, color, isBlockLabel); +} + +ArrowMorph.prototype.init = function (direction, size, padding, color, isLbl) { + this.direction = direction || 'down'; + this.size = size || ((size === 0) ? 0 : 50); + this.padding = padding || 0; + this.isBlockLabel = isLbl || false; + + ArrowMorph.uber.init.call(this); + this.color = color || BLACK; + this.bounds.setWidth(this.size); + this.bounds.setHeight(this.size); + this.rerender(); +}; + +ArrowMorph.prototype.setSize = function (size) { + var min = Math.max(size, 1); + this.size = size; + this.changed(); + this.bounds.setWidth(min); + this.bounds.setHeight(min); + this.rerender(); +}; + +// ArrowMorph displaying: + +ArrowMorph.prototype.render = function (ctx) { + // initialize my surface property + var pad = this.padding, + h = this.height(), + h2 = h / 2, + w = this.width(), + w2 = w / 2; + + ctx.fillStyle = this.getRenderColor().toString(); + ctx.beginPath(); + if (this.direction === 'down') { + ctx.moveTo(pad, h2); + ctx.lineTo(w - pad, h2); + ctx.lineTo(w2, h - pad); + } else if (this.direction === 'up') { + ctx.moveTo(pad, h2); + ctx.lineTo(w - pad, h2); + ctx.lineTo(w2, pad); + } else if (this.direction === 'left') { + ctx.moveTo(pad, h2); + ctx.lineTo(w2, pad); + ctx.lineTo(w2, h - pad); + } else { // 'right' + ctx.moveTo(w2, pad); + ctx.lineTo(w - pad, h2); + ctx.lineTo(w2, h - pad); + } + ctx.closePath(); + ctx.fill(); +}; + +ArrowMorph.prototype.getRenderColor = function () { + if (this.isBlockLabel) { + if (MorphicPreferences.isFlat) { + return this.color; + } + return SyntaxElementMorph.prototype.alpha > 0.5 ? this.color : WHITE; + } + return this.color; +}; + +// TextSlotMorph ////////////////////////////////////////////////////// + +/* + I am a multi-line input slot, primarily used in Snap's code-mapping + blocks. +*/ + +// TextSlotMorph inherits from InputSlotMorph: + +TextSlotMorph.prototype = new InputSlotMorph(); +TextSlotMorph.prototype.constructor = TextSlotMorph; +TextSlotMorph.uber = InputSlotMorph.prototype; + +// TextSlotMorph instance creation: + +function TextSlotMorph(text, isNumeric, choiceDict, isReadOnly) { + this.init(text, isNumeric, choiceDict, isReadOnly); +} + +TextSlotMorph.prototype.init = function ( + text, + isNumeric, + choiceDict, + isReadOnly +) { + var contents = new InputSlotTextMorph(''), + arrow = new ArrowMorph( + 'down', + 0, + Math.max(Math.floor(this.fontSize / 6), 1), + BLACK, + true + ); + + contents.fontSize = this.fontSize; + contents.fixLayout(); + + this.isUnevaluated = false; + this.choices = choiceDict || null; // object, function or selector + this.oldContentsExtent = contents.extent(); + this.isNumeric = isNumeric || false; + this.isReadOnly = isReadOnly || false; + this.minWidth = 0; // can be chaged for text-type inputs ("landscape") + this.constant = null; + + InputSlotMorph.uber.init.call(this, null, null, null, null, true); // sil. + this.color = WHITE; + this.add(contents); + this.add(arrow); + contents.isEditable = true; + contents.isDraggable = false; + contents.enableSelecting(); + this.setContents(text); + +}; + +// TextSlotMorph accessing: + +TextSlotMorph.prototype.getSpec = function () { + if (this.isNumeric) { + return '%mlt'; + } + return '%mlt'; // default +}; + +TextSlotMorph.prototype.contents = function () { + return detect( + this.children, + child => child instanceof TextMorph + ); +}; + +// TextSlotMorph events: + +TextSlotMorph.prototype.layoutChanged = function () { + this.fixLayout(); +}; + +// ColorSlotMorph ////////////////////////////////////////////////////// + +/* + I am an editable input slot for a color. Users can edit my color by + clicking on me, in which case a display a color gradient palette + and let the user select another color. Note that the user isn't + restricted to selecting a color from the palette, any color from + anywhere within the World can be chosen. + + my block spec is %clr + + evaluate() returns my color +*/ + +// ColorSlotMorph inherits from ArgMorph: + +ColorSlotMorph.prototype = new ArgMorph(); +ColorSlotMorph.prototype.constructor = ColorSlotMorph; +ColorSlotMorph.uber = ArgMorph.prototype; + +// ColorSlotMorph instance creation: + +function ColorSlotMorph(clr) { + this.init(clr); +} + +ColorSlotMorph.prototype.init = function (clr) { + ColorSlotMorph.uber.init.call(this); + this.alpha = 1; + this.setColor(clr || new Color(145, 26, 68)); +}; + +ColorSlotMorph.prototype.getSpec = function () { + return '%clr'; +}; + +// ColorSlotMorph color sensing: + +ColorSlotMorph.prototype.getUserColor = function () { + var myself = this, + world = this.world(), + hand = world.hand, + posInDocument = getDocumentPositionOf(world.worldCanvas), + mouseMoveBak = hand.processMouseMove, + mouseDownBak = hand.processMouseDown, + mouseUpBak = hand.processMouseUp, + pal = new ColorPaletteMorph(null, new Point( + this.fontSize * 16, + this.fontSize * 10 + )), + ctx; + world.add(pal); + pal.setPosition(this.bottomLeft().add(new Point(0, this.edge))); + + // cache the world surface property (its full image) + // to prevent memory issues from constantly generating + // huge canvasses and and reading back pixel data only once + // note: this optimization makes it hard / impossible for the + // user to "catch" and sample the color of moving sprites + // but without it Chrome crashes as of Fall 2023 + ctx = Morph.prototype.fullImage.call(world).getContext('2d'); + + hand.processMouseMove = function (event) { + var pos = hand.position(), + dta = ctx.getImageData(pos.x, pos.y, 1, 1).data; + hand.setPosition(new Point( + event.pageX - posInDocument.x, + event.pageY - posInDocument.y + )); + myself.setColor(new Color(dta[0], dta[1], dta[2])); + }; + + hand.processMouseDown = nop; + + hand.processMouseUp = function () { + pal.destroy(); + hand.processMouseMove = mouseMoveBak; + hand.processMouseDown = mouseDownBak; + hand.processMouseUp = mouseUpBak; + }; +}; + +// ColorSlotMorph events: + +ColorSlotMorph.prototype.mouseClickLeft = function () { + this.selectForEdit().getUserColor(); +}; + +// ColorSlotMorph evaluating: + +ColorSlotMorph.prototype.evaluate = function () { + return this.color; +}; + +// ColorSlotMorph drawing: + +ColorSlotMorph.prototype.fixLayout = function () { + // determine my extent + var side = this.fontSize + this.edge * 2 + this.typeInPadding * 2; + this.bounds.setWidth(side); + this.bounds.setHeight(side); +}; + +ColorSlotMorph.prototype.render = function (ctx) { + var borderColor; + + if (this.parent) { + borderColor = this.parent.color; + } else { + borderColor = new Color(120, 120, 120); + } + ctx.fillStyle = this.color.toString(); + + // cache my border colors + this.cachedClr = borderColor.toString(); + this.cachedClrBright = borderColor.lighter(this.contrast) + .toString(); + this.cachedClrDark = borderColor.darker(this.contrast).toString(); + + ctx.fillRect( + this.edge, + this.edge, + this.width() - this.edge * 2, + this.height() - this.edge * 2 + ); + if (!MorphicPreferences.isFlat) { + this.drawRectBorder(ctx); + } +}; + +ColorSlotMorph.prototype.drawRectBorder = + InputSlotMorph.prototype.drawRectBorder; + +// BlockHighlightMorph ///////////////////////////////////////////////// + +/* + I am a glowing halo around a block or stack of blocks indicating that + a script is currently active or has encountered an error. + I halso have an optional readout that can display a thread count + if more than one process shares the same script +*/ + +// BlockHighlightMorph inherits from Morph: + +BlockHighlightMorph.prototype = new Morph(); +BlockHighlightMorph.prototype.constructor = BlockHighlightMorph; +BlockHighlightMorph.uber = Morph.prototype; + +// BlockHighlightMorph instance creation: + +function BlockHighlightMorph() { + this.threadCount = 0; + this.init(); +} + +BlockHighlightMorph.prototype.init = function () { + BlockHighlightMorph.uber.init.call(this); + this.isCachingImage = true; +}; + +// BlockHighlightMorph thread count readout + +BlockHighlightMorph.prototype.readout = function () { + return this.children.length ? this.children[0] : null; +}; + +BlockHighlightMorph.prototype.updateReadout = function () { + var readout = this.readout(), + inset = useBlurredShadows && !MorphicPreferences.isFlat ? + SyntaxElementMorph.prototype.activeBlur * 0.4 + : SyntaxElementMorph.prototype.activeBorder * -2; + if (this.threadCount < 2) { + if (readout) { + readout.destroy(); + } + return; + } + if (readout) { + readout.changed(); + readout.contents = this.threadCount.toString(); + readout.fixLayout(); + readout.rerender(); + } else { + readout = new SpeechBubbleMorph( + this.threadCount.toString(), + this.color, // color, + null, // edge, + null, // border, + this.color.darker(), // borderColor, + null, // padding, + 1, // isThought - don't draw a hook + true // no shadow - faster + ); + this.add(readout); + } + readout.setPosition(this.position().add(inset)); +}; + +// MultiArgMorph /////////////////////////////////////////////////////// + +/* + I am an arity controlled list of input slots + + my block specs are + + %mult%x - where x is any single input slot + %inputs - for an additional text label 'with inputs' + + evaluation is handles by the interpreter +*/ + +// MultiArgMorph inherits from ArgMorph: + +MultiArgMorph.prototype = new ArgMorph(); +MultiArgMorph.prototype.constructor = MultiArgMorph; +MultiArgMorph.uber = ArgMorph.prototype; + +// MultiArgMorph instance creation: + +function MultiArgMorph( + slotSpec, + labelTxt, + min, + eSpec, + arrowColor, + labelColor, + shadowColor, + shadowOffset, + isTransparent, + infix, + collapse, + defaults, + group +) { + this.init( + slotSpec, + labelTxt, + min, + eSpec, + arrowColor, + labelColor, + shadowColor, + shadowOffset, + isTransparent, + infix, + collapse, + defaults, + group + ); +} + +MultiArgMorph.prototype.init = function ( + slotSpec, // string or array of type strings + labelTxt, // string or array of prefix labels + min, + eSpec, + arrowColor, + labelColor, + shadowColor, + shadowOffset, + isTransparent, + infix, + collapse, + defaults, + group +) { + var label, + collapseLabel, + arrows = new FrameMorph(), + initial = min || 0, + listSymbol, + leftArrow, + rightArrow, + i; + + this.slotSpec = slotSpec || '%s'; + this.labelText = labelTxt instanceof Array ? + labelTxt.map(each => localize(each || '')) + : localize(labelTxt || ''); + this.infix = infix || ''; + this.collapse = localize(collapse || ''); + this.defaultValue = defaults || null; + this.groupInputs = 1; + this.minInputs = this.infix ? 0 : initial; + this.maxInputs = null; + this.elementSpec = eSpec || null; + this.labelColor = labelColor || null; + this.shadowColor = shadowColor || null; + this.shadowOffset = shadowOffset || null; + + // in case an input group spec is specified, initialize it + this.initGroup(group); + + this.canBeEmpty = true; + MultiArgMorph.uber.init.call(this); + + // MultiArgMorphs are transparent by default b/c of zebra coloring + this.alpha = isTransparent === false ? 1 : 0; + arrows.alpha = isTransparent === false ? 1 : 0; + + // collapse label text: + if (this.collapse) { + collapseLabel = this.labelPart(this.collapse); + this.add(collapseLabel); + collapseLabel.hide(); + } + + // label text: + if (this.labelText || (this.slotSpec === '%cs')) { + label = this.labelPart( + this.labelText instanceof Array ? + this.labelText[0] + : this.labelText + ); + this.add(label); + label.hide(); + } + + // left arrow: + leftArrow = new ArrowMorph( + 'left', // direction + fontHeight(this.fontSize), // size + Math.max(Math.floor(this.fontSize / 6), 1), // padding + arrowColor, + true // isLbl + ); + + // right arrow: + rightArrow = new ArrowMorph( + 'right', // direction + fontHeight(this.fontSize), // size + Math.max(Math.floor(this.fontSize / 6), 1), // padding + arrowColor, + true // isLbl + ); + + // list symbol: + // listSymbol = this.labelPart('$verticalEllipsis-0.98'); + + // alternative list symbol designs to contemplate in the future: + // listSymbol = this.labelPart('$listNarrow-0.9'); + + /* + listSymbol = this.labelPart('$listNarrow-.98'); + listSymbol.backgroundColor = new Color(255, 140, 0); // list color + */ + + // /* + // listSymbol = new SymbolMorph('listNarrow', this.fontSize * 0.8); + listSymbol = new SymbolMorph('verticalEllipsis', this.fontSize); + listSymbol.alpha = 0.5; + listSymbol.getRenderColor = function () { + // behave the same as arrows when fading the blocks + if (MorphicPreferences.isFlat) { + return this.color; + } + return SyntaxElementMorph.prototype.alpha > 0.5 ? this.color : WHITE; + }; + // */ + + // control panel: + arrows.add(leftArrow); + arrows.add(rightArrow); + arrows.add(listSymbol); + arrows.rerender(); + arrows.acceptsDrops = false; + + this.add(arrows); + + // create the initial number of inputs + for (i = 0; i < initial; i += 1) { + this.addInput(); + } +}; + +MultiArgMorph.prototype.initGroup = function (aBlockSpec) { + var groupSpec, + words, + isSlot = word => word.startsWith('%') && word.length > 1, + labels = [], + part = []; + if (aBlockSpec) { + // translate block spec + groupSpec = BlockMorph.prototype.localizeBlockSpec(aBlockSpec); + // determine input slot specs + words = groupSpec.split(' '); + this.slotSpec = words.filter(word => isSlot(word)); + // determine group size + this.groupInputs = this.slotSpec.length; + // determine label texts + words.forEach(word => { + if (isSlot(word)) { + labels.push(part); + part = []; + } else { + part.push(word); + } + }); + // only add a postfix if it's non-empty + if (part.some(any => any.length)) { + labels.push(part); + } + this.labelText = labels.map(arr => arr.join(' ')); + } +}; + +MultiArgMorph.prototype.collapseLabel = function () { + return this.collapse ? this.children[0] : null; +}; + +MultiArgMorph.prototype.label = function () { + return this.labelText ? + this.children[this.collapse ? 1 : 0] + : null; +}; + +MultiArgMorph.prototype.allLabels = function () { + // including infix labels + return this.children.filter(m => m instanceof BlockLabelMorph); +}; + +MultiArgMorph.prototype.arrows = function () { + return this.children[this.children.length - 1]; +}; + +MultiArgMorph.prototype.listSymbol = function () { + return this.arrows().children[2]; +}; + +MultiArgMorph.prototype.getSpec = function () { + return '%mult' + this.slotSpec; +}; + +MultiArgMorph.prototype.setIrreplaceable = function (irreplaceable = false) { + this.isStatic = irreplaceable; + this.canBeEmpty = !irreplaceable; + this.fixLayout(); +}; + +MultiArgMorph.prototype.setInfix = function (separator = '') { + var inps; + if (this.infix === separator) { + return; + } + inps = this.inputs(); + this.collapseAll(); + this.infix = separator; + inps.forEach(slot => this.replaceInput(this.addInput(), slot)); + if (inps.length === 1 && this.infix) { // show at least 2 slots with infix + this.addInput(); + } +}; + +// MultiArgMorph defaults: + +MultiArgMorph.prototype.setContents = function (anArray) { + var inputs = this.inputs(), i; + + if (!(anArray instanceof Array) && this.slotSpec === '%rcv') { + // special case for migrating former SEND block inputs to + // newer BROADCAST expansion slots for receivers + // this can be removed once all SEND blocks have been + // converted to v7 + anArray = [anArray]; + } + + for (i = 0; i < anArray.length; i += 1) { + if (anArray[i] !== null && (inputs[i])) { + inputs[i].setContents(anArray[i]); + } + } +}; + +// MultiArgMorph hiding and showing: + +/* + override the inherited behavior to recursively hide/show all + children, so that my instances get restored correctly when + switching back out of app mode. +*/ + +MultiArgMorph.prototype.hide = function () { + this.isVisible = false; + this.changed(); +}; + +MultiArgMorph.prototype.show = function () { + this.isVisible = true; + this.changed(); +}; + +// MultiArgMorph coloring: + +MultiArgMorph.prototype.setLabelColor = function ( + textColor, + shadowColor, + shadowOffset +) { + this.textColor = textColor; + this.shadowColor = shadowColor; + this.shadowOffset = shadowOffset; + MultiArgMorph.uber.setLabelColor.call( + this, + textColor, + shadowColor, + shadowOffset + ); +}; + +// MultiArgMorph layout: + +MultiArgMorph.prototype.fixLayout = function () { + var labels, shadowColor, shadowOffset, block; + if (this.slotSpec === '%t') { + this.isStatic = true; // in this case I cannot be exchanged + } + if (this.parent) { + labels = this.allLabels(); + this.color = this.parent.color; + this.arrows().color = this.color; + shadowColor = this.shadowColor || + this.parent.color.darker(this.labelContrast); + block = this.parentThatIsA(BlockMorph); + this.arrows().children[2].shadowColor = block ? + block.color.darker(this.labelContrast) + : shadowColor; + if (labels.length) { + labels.forEach(label => { + shadowOffset = this.shadowOffset || + (label ? label.shadowOffset : null); + if (!label.shadowColor.eq(shadowColor)) { + label.shadowColor = shadowColor; + label.shadowOffset = shadowOffset; + label.fixLayout(); + label.rerender(); + } + }); + } + } + this.fixArrowsLayout(); + MultiArgMorph.uber.fixLayout.call(this); + if (this.parent) { + this.parent.fixLayout(); + } +}; + +MultiArgMorph.prototype.fixArrowsLayout = function () { + var label = this.label(), + collapseLabel = this.collapseLabel(), + arrows = this.arrows(), + leftArrow = arrows.children[0], + rightArrow = arrows.children[1], + listSymbol = arrows.children[2], + inpCount = this.inputs().length, + dim = new Point(rightArrow.width() / 2, rightArrow.height()), + centerList = true; + leftArrow.show(); + listSymbol.show(); + rightArrow.show(); + arrows.setHeight(dim.y); + if (collapseLabel) { + collapseLabel.hide(); + } + if (this.isStatic) { + listSymbol.hide(); + } + if (inpCount < (this.minInputs + 1)) { // hide left arrow + if (label) { + label.hide(); + } + leftArrow.hide(); + if (this.isStatic) { + arrows.setWidth(dim.x); + } else { + if (collapseLabel) { + collapseLabel.show(); + } + arrows.setWidth(dim.x * 1.3 + listSymbol.width()); + listSymbol.setCenter(arrows.center()); + listSymbol.setLeft(arrows.left()); + centerList = false; + } + } else if (this.is3ArgRingInHOF() && inpCount > 2) { // hide right arrow + rightArrow.hide(); + arrows.width(dim.x); + } else { // show both arrows + if (label) { + label.show(); + } + arrows.setWidth(dim.x * 2.4 + (this.isStatic ? 0 : listSymbol.width())); + if (!isNil(this.maxInputs) && inpCount > this.maxInputs - 1) { + // hide right arrow + rightArrow.hide(); + arrows.setWidth(dim.x); + } + } + leftArrow.setCenter(arrows.center()); + leftArrow.setLeft(arrows.left()); + rightArrow.setCenter(arrows.center()); + rightArrow.setRight(arrows.right()); + if (centerList) { + listSymbol.setCenter(arrows.center()); + } + arrows.rerender(); +}; + +MultiArgMorph.prototype.fixHolesLayout = function () { + var pos; + this.holes = []; + if (this.slotSpec.includes('%cs')) { + pos = this.position(); + this.inputs().forEach(slot => { + if (slot instanceof CSlotMorph) { + slot.fixHolesLayout(); + this.holes.push( + slot.holes[0].translateBy(slot.position().subtract(pos)) + ); + } + }); + } +}; + +MultiArgMorph.prototype.refresh = function () { + this.inputs().forEach(input => { + input.fixLayout(); + input.rerender(); + }); +}; + +// MultiArgMorph deleting & inserting slots: +/* + caution, only call these methods with "primitive" inputs, + since they don't preserve embedded blocks (yes, on purpose) +*/ + +MultiArgMorph.prototype.deleteSlot = function (anInput) { + var len = this.inputs().length, + idx = this.children.indexOf(anInput); + if (len <= this.minInputs) { + return; + } + if (this.infix) { + if (idx === (this.children.length - 2)) { // b/c arrows + this.removeChild(this.children[idx - 1]); + } else { + this.removeChild(this.children[idx + 1]); + } + } + this.removeChild(anInput); + this.fixLayout(); +}; + +MultiArgMorph.prototype.insertNewInputBefore = function (anInput, contents) { + var idx = this.children.indexOf(anInput), + newPart = this.labelPart(this.slotSpec), + infix; + + if (this.maxInputs && (this.inputs().length >= this.maxInputs)) { + return; + } + if (contents) { + newPart.setContents(contents); + } + newPart.parent = this; + if (this.infix) { + infix = this.labelPart(localize(this.infix)); + infix.parent = this; + this.children.splice(idx, 0, newPart, infix); + } else { + this.children.splice(idx, 0, newPart); + } + newPart.fixLayout(); + if (this.parent instanceof BlockMorph) { + this.parent.fixLabelColor(); + } + this.fixLayout(); + return newPart; +}; + +// MultiArgMorph arity control: + +MultiArgMorph.prototype.addInput = function (contents) { + var len = this.inputs().length, + newPart = this.labelPart(this.slotSpecFor(len)), + value = isNil(contents) ? this.defaultValueFor(len) : contents, + i, name, idx; + + this.addInfix(); + idx = this.children.length - 1; + if (!isNil(value)) { + newPart.setContents(value); + } else if (this.elementSpec === '%scriptVars' || + this.elementSpec === '%blockVars') { + name = ''; + i = idx; + if (this.elementSpec === '%scriptVars') { + // compensate for missing label element + i += 1; + } + while (i > 0) { + name = String.fromCharCode(97 + (i - 1) % 26) + name; + i = Math.floor((i - 1) / 26); + } + newPart.setContents(name); + } else if (contains(['%parms', '%ringparms'], this.elementSpec)) { + if (this.is3ArgRingInHOF() && idx < 5) { + newPart.setContents([ + localize('value'), + localize('index'), + localize('list') + ][idx - 1]); + } else { + newPart.setContents('#' + idx); + } + } else if (this.elementSpec === '%message') { + newPart.setContents(localize('data')); + } else if (this.elementSpec === '%keyName') { + newPart.setContents(localize('key')); + } + newPart.parent = this; + this.children.splice(idx, 0, newPart); + this.addPostfix(); + newPart.fixLayout(); + if (this.parent instanceof BlockMorph) { + this.parent.fixLabelColor(); + } + this.fixLayout(); + return newPart; +}; + +MultiArgMorph.prototype.addInfix = function () { + var infix, + len = this.inputs().length, + label = this.infix ? localize(this.infix) + : (this.labelText instanceof Array ? + this.labelText[len % this.slotSpec.length] + : ''); + + if (label === '' || !len || this.children.length < 2) {return; } + infix = this.labelPart(label); + infix.parent = this; + this.children.splice(this.children.length - 1, 0, infix); +}; + +MultiArgMorph.prototype.addPostfix = function () { + var postfix; + if (this.labelText instanceof Array && + this.inputs().length % this.slotSpec.length === 0 && + this.labelText.length === (this.slotSpec.length + 1) + ) { + postfix = this.labelPart(this.labelText[this.slotSpec.length]); + postfix.parent = this; + this.children.splice(this.children.length - 1, 0, postfix); + } +}; + +MultiArgMorph.prototype.removePostfix = function (idx) { + if (this.labelText instanceof Array && + idx % this.slotSpec.length === 0 && + this.labelText.length === (this.slotSpec.length + 1) + ) { + this.removeChild(this.children[this.children.length - 2]); + } +}; + +MultiArgMorph.prototype.removeInput = function () { + var len = this.inputs().length, + oldPart, scripts; + if (len > 0) { + this.removePostfix(len); + oldPart = this.inputs()[len - 1]; + this.removeChild(oldPart); + if (oldPart instanceof CSlotMorph) { + oldPart = oldPart.nestedBlock(); + } + if (oldPart instanceof BlockMorph && + !(oldPart instanceof RingMorph && !oldPart.contents())) { + scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + oldPart.moveBy(10); + scripts.add(oldPart); + } + } + } + if (this.infix || + (this.labelText instanceof Array && this.inputs().length) + ) { + if (this.children.length > (this.collapse ? 2 : 1) && + !(this.labelText instanceof Array && + this.labelText[this.inputs().length % this.slotSpec.length] + === '') + ) { + this.removeChild(this.children[this.children.length - 2]); + } + } + this.fixLayout(); +}; + +MultiArgMorph.prototype.collapseAll = function () { + var len = this.inputs().length, + i; + for (i = 0; i < len; i+= 1) { + this.removeInput(); + } +}; + +MultiArgMorph.prototype.isVertical = function () { + return contains(['%repRing', '%predRing', '%cmdRing'], this.slotSpec); +}; + +MultiArgMorph.prototype.is3ArgRingInHOF = function () { + // answer true if I am embedded into a ring inside a HOF block + // that supports 3 parameters ("item, idx, data") + // of which there are currently only MAP, KEEP and FIND + // and their atomic counterparts + var ring = this.parent, + block; + if (ring) { + block = ring.parent; + if (block instanceof ReporterBlockMorph) { + return block.inputs()[0] === ring && + contains( + [ + 'reportMap', + 'reportAtomicMap', + 'reportKeep', + 'reportAtomicKeep', + 'reportFindFirst', + 'reportAtomicFindFirst' + ], + block.selector + ); + } + } + return false; +}; + +MultiArgMorph.prototype.slotSpecFor = function (index) { + return this.slotSpec instanceof Array ? + this.slotSpec[index % this.slotSpec.length] + : this.slotSpec; +}; + +MultiArgMorph.prototype.defaultValueFor = function (index) { + return this.defaultValue instanceof Array ? + this.defaultValue[index % this.defaultValue.length] + : this.defaultValue; +}; + +// MultiArgMorph events: + +MultiArgMorph.prototype.mouseClickLeft = function (pos) { + // prevent expansion in the palette + // (because it can be hard or impossible to collapse again) + var block = this.parentThatIsA(BlockMorph), + sprite = block.scriptTarget(); + if (!this.parentThatIsA(ScriptsMorph)) { + this.escalateEvent('mouseClickLeft', pos); + return; + } + // if the key is pressed, repeat action 3 times + var target = this.selectForEdit(), + arrows = target.arrows(), + leftArrow = arrows.children[0], + rightArrow = arrows.children[1], + arrowsBounds = target.arrows().bounds.expandBy(this.fontSize / 3), + arrowsCenter = arrows.center().x, + isExpansionClick, + repetition = this.groupInputs * + (target.world().currentKey === 16 ? 3 : 1), + i; + + if (arrowsBounds.containsPoint(pos)) { + if (leftArrow.isVisible && rightArrow.isVisible) { + isExpansionClick = pos.x >= arrowsCenter; + } else { + isExpansionClick = rightArrow.isVisible; + } + if (isExpansionClick) { // right arrow + if (this.infix && !this.inputs().length) { + repetition = Math.max(repetition, 2); + } + for (i = 0; i < repetition; i += 1) { + if (rightArrow.isVisible) { + target.addInput(); + } + } + sprite.recordUserEdit( + 'scripts', + 'poly slot', + 'expand', + block.abstractBlockSpec() + ); + } else { // left arrow + if (this.infix && this.inputs().length < 3) { + repetition = 2; + } + for (i = 0; i < repetition; i += 1) { + if (leftArrow.isVisible) { + target.removeInput(); + } + } + sprite.recordUserEdit( + 'scripts', + 'poly slot', + 'collapse', + block.abstractBlockSpec() + ); + } + } else { + target.escalateEvent('mouseClickLeft', pos); + } +}; + +// MultiArgMorph menu: + +MultiArgMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this), + block = this.parentThatIsA(BlockMorph), + key = ''; + if (!StageMorph.prototype.enableCodeMapping) { + return this.parent.userMenu(); + } + if (block) { + if (block instanceof RingMorph) { + key = 'parms_'; + } else if (block.selector === 'doDeclareVariables') { + key = 'tempvars_'; + } + } + menu.addItem( + 'code list mapping...', + () => this.mapCodeList(key) + ); + menu.addItem( + 'code item mapping...', + () => this.mapCodeItem(key) + ); + menu.addItem( + 'code delimiter mapping...', + () => this.mapCodeDelimiter(key) + ); + return menu; +}; + +// MultiArgMorph code mapping + +/* + code mapping lets you use blocks to generate arbitrary text-based + source code that can be exported and compiled / embedded elsewhere, + it's not part of Snap's evaluator and not needed for Snap itself +*/ + +MultiArgMorph.prototype.mapCodeDelimiter = function (key) { + this.mapToCode(key + 'delim', 'list item delimiter'); +}; + +MultiArgMorph.prototype.mapCodeList = function (key) { + this.mapToCode(key + 'list', 'list contents <#1>'); +}; + +MultiArgMorph.prototype.mapCodeItem = function (key) { + this.mapToCode(key + 'item', 'list item <#1>'); +}; + +MultiArgMorph.prototype.mapToCode = function (key, label) { + // private - open a dialog box letting the user map code via the GUI + new DialogBoxMorph( + this, + code => StageMorph.prototype.codeMappings[key] = code, + this + ).promptCode( + 'Code mapping - ' + label, + StageMorph.prototype.codeMappings[key] || '', + this.world() + ); +}; + +MultiArgMorph.prototype.mappedCode = function (definitions) { + var block = this.parentThatIsA(BlockMorph), + key = '', + code, + items = '', + itemCode, + delim, + count = 0, + parts = []; + + if (block) { + if (block instanceof RingMorph) { + key = 'parms_'; + } else if (block.selector === 'doDeclareVariables') { + key = 'tempvars_'; + } + } + + code = StageMorph.prototype.codeMappings[key + 'list'] || '<#1>'; + itemCode = StageMorph.prototype.codeMappings[key + 'item'] || '<#1>'; + delim = StageMorph.prototype.codeMappings[key + 'delim'] || ' '; + + this.inputs().forEach(input => + parts.push(itemCode.replace(/<#1>/g, input.mappedCode(definitions))) + ); + parts.forEach(part => { + if (count) { + items += delim; + } + items += part; + count += 1; + }); + code = code.replace(/<#1>/g, items); + return code; +}; + +// MultiArgMorph arity evaluating: + +MultiArgMorph.prototype.evaluate = function () { + // this is usually overridden by the interpreter. This method is only + // called (and needed) for the variables menu. + + var result = []; + this.inputs().forEach(slot => + result.push(slot.evaluate()) + ); + return result; +}; + +MultiArgMorph.prototype.isEmptySlot = function () { + return this.canBeEmpty ? this.inputs().length === 0 : false; +}; + +// MultiArgMorph op-sequence analysis + +MultiArgMorph.prototype.unwind = BlockMorph.prototype.unwind; +MultiArgMorph.prototype.unwindAfter = BlockMorph.prototype.unwindAfter; + +// ArgLabelMorph /////////////////////////////////////////////////////// + +/* + I am a label string that is wrapped around an ArgMorph, usually + a MultiArgMorph, so to indicate that it has been replaced entirely + for an embedded reporter block + + I don't have a block spec, I get embedded automatically by the parent + block's argument replacement mechanism + + My evaluation method is the identity function, i.e. I simply pass my + input's value along. +*/ + +// ArgLabelMorph inherits from ArgMorph: + +ArgLabelMorph.prototype = new ArgMorph(); +ArgLabelMorph.prototype.constructor = ArgLabelMorph; +ArgLabelMorph.uber = ArgMorph.prototype; + +// MultiArgMorph instance creation: + +function ArgLabelMorph(argMorph, labelTxt) { + this.init(argMorph, labelTxt); +} + +ArgLabelMorph.prototype.init = function (argMorph, labelTxt) { + var label; + + this.labelText = localize(labelTxt || 'input list:'); + ArgLabelMorph.uber.init.call(this); + + this.isStatic = true; // I cannot be exchanged + + // ArgLabelMorphs are transparent + this.alpha = 0; + + // label text: + label = this.labelPart(this.labelText); + this.add(label); + + // argMorph + this.add(argMorph); +}; + +ArgLabelMorph.prototype.label = function () { + return this.children[0]; +}; + +ArgLabelMorph.prototype.argMorph = function () { + return this.children[1]; +}; + +// ArgLabelMorph layout: + +ArgLabelMorph.prototype.fixLayout = function () { + var label = this.label(), + shadowColor, + shadowOffset; + + if (this.parent) { + this.color = this.parent.color; + shadowOffset = label.shadowOffset || ZERO; + + // determine the shadow color for zebra coloring: + if (shadowOffset.x < 0) { + shadowColor = this.parent.color.darker(this.labelContrast); + } else { + shadowColor = this.parent.color.lighter(this.labelContrast); + } + + if (this.labelText !== '') { + if (!label.shadowColor.eq(shadowColor)) { + label.shadowColor = shadowColor; + label.shadowOffset = shadowOffset; + label.rerender(); + } + } + } + ArgLabelMorph.uber.fixLayout.call(this); + if (this.parent) { + this.parent.fixLayout(); + } +}; + +ArgLabelMorph.prototype.refresh = function () { + this.inputs().forEach(input => { + input.fixLayout(); + input.rerender(); + }); +}; + +// ArgLabelMorph label color: + +ArgLabelMorph.prototype.setLabelColor = function ( + textColor, + shadowColor, + shadowOffset +) { + if (this.labelText !== '') { + var label = this.label(); + label.color = textColor; + label.shadowColor = shadowColor; + label.shadowOffset = shadowOffset; + label.rerender(); + } +}; + +// ArgLabelMorph events: + +ArgLabelMorph.prototype.reactToGrabOf = function () { + if (this.parent instanceof SyntaxElementMorph) { + this.parent.revertToDefaultInput(this); + } +}; + +// ArgLabelMorph evaluating: + +ArgLabelMorph.prototype.evaluate = function () { + // this is usually overridden by the interpreter. This method is only + // called (and needed) for the variables menu. + + return this.argMorph().evaluate(); +}; + +ArgLabelMorph.prototype.isEmptySlot = function () { + return false; +}; + +// FunctionSlotMorph /////////////////////////////////////////////////// + +/* + I am an unevaluated, non-editable, rf-colored, rounded or diamond + input slot. My current (only) use is in the THE BLOCK block. + + My command spec is %f +*/ + +// FunctionSlotMorph inherits from ArgMorph: + +FunctionSlotMorph.prototype = new ArgMorph(); +FunctionSlotMorph.prototype.constructor = FunctionSlotMorph; +FunctionSlotMorph.uber = ArgMorph.prototype; + +// FunctionSlotMorph instance creation: + +function FunctionSlotMorph(isPredicate) { + this.init(isPredicate); +} + +FunctionSlotMorph.prototype.init = function (isPredicate) { + FunctionSlotMorph.uber.init.call(this); + this.isPredicate = isPredicate || false; + this.color = this.rfColor; +}; + +FunctionSlotMorph.prototype.getSpec = function () { + return '%f'; +}; + +// FunctionSlotMorph drawing: + +FunctionSlotMorph.prototype.render = function (ctx) { + var borderColor; + + if (this.parent) { + borderColor = this.parent.color; + } else { + borderColor = new Color(120, 120, 120); + } + + // cache my border colors + this.cachedClr = borderColor.toString(); + this.cachedClrBright = borderColor.lighter(this.contrast) + .toString(); + this.cachedClrDark = borderColor.darker(this.contrast).toString(); + + if (this.isPredicate) { + this.drawDiamond(ctx); + } else { + this.drawRounded(ctx); + } +}; + +FunctionSlotMorph.prototype.drawRounded = function (ctx) { + var h = this.height(), + r = Math.min(this.rounding, h / 2), + w = this.width(), + shift = this.edge / 2, + gradient; + + // draw the 'flat' shape: + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + + // top left: + ctx.arc( + r, + r, + r, + radians(-180), + radians(-90), + false + ); + + // top right: + ctx.arc( + w - r, + r, + r, + radians(-90), + radians(-0), + false + ); + + // bottom right: + ctx.arc( + w - r, + h - r, + r, + radians(0), + radians(90), + false + ); + + // bottom left: + ctx.arc( + r, + h - r, + r, + radians(90), + radians(180), + false + ); + + ctx.closePath(); + ctx.fill(); + + if (MorphicPreferences.isFlat) {return; } + + // add 3D-Effect: + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // bottom left corner + ctx.strokeStyle = this.cachedClr; //gradient; + ctx.beginPath(); + ctx.arc( + r, + h - r, + r - shift, + radians(90), + radians(180), + false + ); + ctx.stroke(); + + // top right corner + ctx.strokeStyle = this.cachedClr; //gradient; + ctx.beginPath(); + ctx.arc( + w - r, + r, + r - shift, + radians(-90), + radians(0), + false + ); + ctx.stroke(); + + // normal gradient edges + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + // top edge: straight line + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r - shift, shift); + ctx.lineTo(w - r + shift, shift); + ctx.stroke(); + + // top edge: left corner + gradient = ctx.createRadialGradient( + r, + r, + r - this.edge, + r, + r, + r + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + r, + r, + r - shift, + radians(180), + radians(270), + false + ); + ctx.stroke(); + + // left edge: straight vertical line + gradient = ctx.createLinearGradient(0, 0, this.edge, 0); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, r); + ctx.lineTo(shift, h - r); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // bottom edge: right corner + gradient = ctx.createRadialGradient( + w - r, + h - r, + r - this.edge, + w - r, + h - r, + r + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + w - r, + h - r, + r - shift, + radians(0), + radians(90), + false + ); + ctx.stroke(); + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r - shift, h - shift); + ctx.lineTo(w - r + shift, h - shift); + ctx.stroke(); + + // right edge: straight vertical line + gradient = ctx.createLinearGradient(w - this.edge, 0, w, 0); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - shift, r + shift); + ctx.lineTo(w - shift, h - r); + ctx.stroke(); + +}; + +FunctionSlotMorph.prototype.drawDiamond = function (ctx) { + var w = this.width(), + h = this.height(), + h2 = Math.floor(h / 2), + r = Math.min(this.rounding, h2), + shift = this.edge / 2, + gradient; + + // draw the 'flat' shape: + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + + ctx.moveTo(0, h2); + ctx.lineTo(r, 0); + ctx.lineTo(w - r, 0); + ctx.lineTo(w, h2); + ctx.lineTo(w - r, h); + ctx.lineTo(r, h); + + ctx.closePath(); + ctx.fill(); + + if (MorphicPreferences.isFlat) {return; } + + // add 3D-Effect: + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // half-tone edges + // bottom left corner + ctx.strokeStyle = this.cachedClr; + ctx.beginPath(); + ctx.moveTo(shift, h2); + ctx.lineTo(r, h - shift); + ctx.stroke(); + + // top right corner + ctx.strokeStyle = this.cachedClr; + ctx.beginPath(); + ctx.moveTo(w - shift, h2); + ctx.lineTo(w - r, shift); + ctx.stroke(); + + // normal gradient edges + // top edge: left corner + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + gradient = ctx.createLinearGradient( + 0, + 0, + r, + 0 + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, h2); + ctx.lineTo(r, shift); + ctx.stroke(); + + // top edge: straight line + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r, shift); + ctx.lineTo(w - r, shift); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // bottom edge: right corner + gradient = ctx.createLinearGradient( + w - r, + 0, + w, + 0 + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - r, h - shift); + ctx.lineTo(w - shift, h2); + ctx.stroke(); + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r + shift, h - shift); + ctx.lineTo(w - r - shift, h - shift); + ctx.stroke(); +}; + +// ReporterSlotMorph /////////////////////////////////////////////////// + +/* + I am a ReporterBlock-shaped input slot. I can nest as well as + accept reporter blocks (containing reified scripts). + + my most important accessor is + + nestedBlock() - answer the reporter block I encompass, if any + + My command spec is %r for reporters (round) and %p for + predicates (diamond) + + evaluate() returns my nested block or null +*/ + +// ReporterSlotMorph inherits from FunctionSlotMorph: + +ReporterSlotMorph.prototype = new FunctionSlotMorph(); +ReporterSlotMorph.prototype.constructor = ReporterSlotMorph; +ReporterSlotMorph.uber = FunctionSlotMorph.prototype; + +// ReporterSlotMorph instance creation: + +function ReporterSlotMorph(isPredicate) { + this.init(isPredicate); +} + +ReporterSlotMorph.prototype.init = function (isPredicate) { + ReporterSlotMorph.uber.init.call(this, isPredicate, true); + this.add(this.emptySlot()); + this.fixLayout(); +}; + +ReporterSlotMorph.prototype.emptySlot = function () { + var empty = new ArgMorph(), + shrink = this.rfBorder * 2 + this.edge * 2; + empty.color = this.rfColor; + empty.alpha = 0; + empty.bounds.setExtent(new Point( + (this.fontSize + this.edge * 2) * 2 - shrink, + this.fontSize + this.edge * 2 - shrink + )); + return empty; +}; + +// ReporterSlotMorph accessing: + +ReporterSlotMorph.prototype.getSpec = function () { + return '%r'; +}; + +ReporterSlotMorph.prototype.contents = function () { + return this.children[0]; +}; + +ReporterSlotMorph.prototype.nestedBlock = function () { + var contents = this.contents(); + return contents instanceof ReporterBlockMorph ? contents : null; +}; + +// ReporterSlotMorph evaluating: + +ReporterSlotMorph.prototype.evaluate = function () { + return this.nestedBlock(); +}; + +ReporterSlotMorph.prototype.isEmptySlot = function () { + return this.nestedBlock() === null; +}; + +// ReporterSlotMorph layout: + +ReporterSlotMorph.prototype.fixLayout = function () { + var contents = this.contents(); + if (!contents) { + contents = this.emptySlot(); + this.add(contents); + } + this.bounds.setExtent(contents.extent().add( + this.edge * 2 + this.rfBorder * 2 + )); + contents.setCenter(this.center()); + if (this.parent) { + if (this.parent.fixLayout) { + this.parent.fixLayout(); + } + } +}; + +// RingReporterSlotMorph /////////////////////////////////////////////////// + +/* + I am a ReporterBlock-shaped input slot for use in RingMorphs. + I can nest reporter blocks (both round and diamond) as well + as command blocks (jigsaw shaped). + + My command spec is %rr for reporters (round) and %rp for + predicates (diamond) + + evaluate() returns my nested block or null + (inherited from ReporterSlotMorph +*/ + +// ReporterSlotMorph inherits from FunctionSlotMorph: + +RingReporterSlotMorph.prototype = new ReporterSlotMorph(); +RingReporterSlotMorph.prototype.constructor = RingReporterSlotMorph; +RingReporterSlotMorph.uber = ReporterSlotMorph.prototype; + +// ReporterSlotMorph preferences settings: + +RingReporterSlotMorph.prototype.rfBorder + = RingCommandSlotMorph.prototype.rfBorder; + +RingReporterSlotMorph.prototype.edge + = RingCommandSlotMorph.prototype.edge; + +RingReporterSlotMorph.prototype.enableCommandDrops = true; + +// RingReporterSlotMorph instance creation: + +function RingReporterSlotMorph(isPredicate) { + this.init(isPredicate); +} + +RingReporterSlotMorph.prototype.init = function (isPredicate) { + RingReporterSlotMorph.uber.init.call(this, isPredicate, true); + this.contrast = RingMorph.prototype.contrast; +}; + +// RingReporterSlotMorph accessing: + +RingReporterSlotMorph.prototype.getSpec = function () { + return '%rr'; +}; + +RingReporterSlotMorph.prototype.replaceInput = function ( + source, + target, + noVanish +) { + RingReporterSlotMorph.uber.replaceInput.call(this, source, target); + if (this.parent instanceof RingMorph && !noVanish) { + this.parent.vanishForSimilar(); + } +}; + +// RingReporterSlotMorph attach targets for commands: + +RingReporterSlotMorph.prototype.slotAttachPoint = + CommandSlotMorph.prototype.slotAttachPoint; + +RingReporterSlotMorph.prototype.dentLeft = + CommandSlotMorph.prototype.dentLeft; + +RingReporterSlotMorph.prototype.dentCenter = + CommandSlotMorph.prototype.dentCenter; + +RingReporterSlotMorph.prototype.attachTargets = function () { + if (!RingReporterSlotMorph.prototype.enableCommandDrops || + this.contents() instanceof ReporterBlockMorph + ) { + // don't let commands "kick out" embedded reporters + return []; + } + return CommandSlotMorph.prototype.attachTargets.call(this); +}; + +// RingReporterSlotMorph nesting for commands: + +RingReporterSlotMorph.prototype.nestedBlock = function (block) { + if (block) { + var nb = this.nestedBlock(); + this.replaceInput(this.children[0], block); + if (nb) { + block.bottomBlock().nextBlock(nb); + } + this.fixLayout(); + } else { + return detect( + this.children, + child => child instanceof BlockMorph + ); + } +}; + +// RingReporterSlotMorph layout: + +RingReporterSlotMorph.prototype.fixLayout = function () { + if (this.contents() instanceof CommandBlockMorph) { + CommandSlotMorph.prototype.fixLayout.call(this); + } else { + RingReporterSlotMorph.uber.fixLayout.call(this); + } +}; + +// RingReporterSlotMorph drawing: + +RingReporterSlotMorph.prototype.render = function (ctx) { + if (MorphicPreferences.isFlat) {return; } + + // init + this.cachedClr = this.color.toString(); + this.cachedClrBright = this.bright(); + this.cachedClrDark = this.dark(); + ctx.fillStyle = this.cachedClr; + + // only add 3D-Effect here, rendering of the flat shape happens at the + // encompassing block level + if (this.isPredicate) { + this.drawEdgesDiamond(ctx); + } else { + this.drawEdgesOval(ctx); + } +}; + +RingReporterSlotMorph.prototype.outlinePath = function (ctx, offset) { + if (this.isPredicate) { + this.outlinePathDiamond(ctx, offset); + } else { + this.outlinePathOval(ctx, offset); + } +}; + +RingReporterSlotMorph.prototype.outlinePathOval = function (ctx, offset) { + var ox = offset.x, + oy = offset.y, + w = this.width(), + h = this.height(), + r = Math.min(this.rounding, h / 2); + + // top left: + ctx.arc( + r + this.edge + ox, + r + this.edge + oy, + r, + radians(-180), + radians(-90), + false + ); + + // top right: + ctx.arc( + w - r - this.edge + ox, + r + this.edge + oy, + r, + radians(-90), + radians(-0), + false + ); + + // bottom right: + ctx.arc( + w - r - this.edge + ox, + h - r - this.edge + oy, + r, + radians(0), + radians(90), + false + ); + + // bottom left: + ctx.arc( + r + this.edge + ox, + h - r - this.edge + oy, + r, + radians(90), + radians(180), + false + ); + + // "close" the path + ctx.lineTo(this.edge + ox, r + this.edge + oy); +}; + +RingReporterSlotMorph.prototype.drawEdgesOval = function (ctx) { + var h = this.height(), + r = Math.min(this.rounding, h / 2), + w = this.width(), + shift = this.edge / 2, + gradient; + + + // add 3D-Effect: + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // bottom left corner + ctx.strokeStyle = this.cachedClr; + ctx.beginPath(); + ctx.arc( + r, + h - r, + r - shift, + radians(90), + radians(180), + false + ); + ctx.stroke(); + + // top right corner + ctx.strokeStyle = this.cachedClr; + ctx.beginPath(); + ctx.arc( + w - r, + r, + r - shift, + radians(-90), + radians(0), + false + ); + ctx.stroke(); + + // normal gradient edges + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + // top edge: straight line + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r - shift, shift); + ctx.lineTo(w - r + shift, shift); + ctx.stroke(); + + // top edge: left corner + gradient = ctx.createRadialGradient( + r, + r, + r - this.edge, + r, + r, + r + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + r, + r, + r - shift, + radians(180), + radians(270), + false + ); + ctx.stroke(); + + // left edge: straight vertical line + gradient = ctx.createLinearGradient(0, 0, this.edge, 0); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, r); + ctx.lineTo(shift, h - r); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // bottom edge: right corner + gradient = ctx.createRadialGradient( + w - r, + h - r, + r - this.edge, + w - r, + h - r, + r + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.arc( + w - r, + h - r, + r - shift, + radians(0), + radians(90), + false + ); + ctx.stroke(); + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r - shift, h - shift); + ctx.lineTo(w - r + shift, h - shift); + ctx.stroke(); + + // right edge: straight vertical line + gradient = ctx.createLinearGradient(w - this.edge, 0, w, 0); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - shift, r + shift); + ctx.lineTo(w - shift, h - r); + ctx.stroke(); +}; + +RingReporterSlotMorph.prototype.outlinePathDiamond = function (ctx, offset) { + var ox = offset.x, + oy = offset.y, + w = this.width(), + h = this.height(), + h2 = Math.floor(h / 2), + r = Math.min(this.rounding, h2); + + ctx.moveTo(ox + this.edge, h2 + oy); + ctx.lineTo(r + this.edge + ox, this.edge + oy); + ctx.lineTo(w - r - this.edge + ox, this.edge + oy); + ctx.lineTo(w - this.edge + ox, h2 + oy); + ctx.lineTo(w - r - this.edge + ox, h - this.edge + oy); + ctx.lineTo(r + this.edge + ox, h - this.edge + oy); + ctx.lineTo(ox + this.edge, h2 + oy); +}; + +RingReporterSlotMorph.prototype.drawEdgesDiamond = function (ctx) { + var w = this.width(), + h = this.height(), + h2 = Math.floor(h / 2), + r = Math.min(this.rounding, h2), + shift = this.edge / 2, + gradient; + + // add 3D-Effect: + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + // half-tone edges + // bottom left corner + ctx.strokeStyle = this.cachedClr; + ctx.beginPath(); + ctx.moveTo(shift, h2); + ctx.lineTo(r, h - shift); + ctx.stroke(); + + // top right corner + ctx.strokeStyle = this.cachedClr; + ctx.beginPath(); + ctx.moveTo(w - shift, h2); + ctx.lineTo(w - r, shift); + ctx.stroke(); + + // normal gradient edges + // top edge: left corner + + if (useBlurredShadows) { + ctx.shadowOffsetX = shift; + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge; + ctx.shadowColor = this.color.darker(80).toString(); + } + + gradient = ctx.createLinearGradient( + 0, + 0, + r, + 0 + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, h2); + ctx.lineTo(r, shift); + ctx.stroke(); + + // top edge: straight line + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(1, this.cachedClrDark); + gradient.addColorStop(0, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r, shift); + ctx.lineTo(w - r, shift); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + // bottom edge: right corner + gradient = ctx.createLinearGradient( + w - r, + 0, + w, + 0 + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - r, h - shift); + ctx.lineTo(w - shift, h2); + ctx.stroke(); + + // bottom edge: straight line + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(1, this.cachedClr); + gradient.addColorStop(0, this.cachedClrBright); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(r + shift, h - shift); + ctx.lineTo(w - r - shift, h - shift); + ctx.stroke(); +}; + +// CommentMorph ////////////////////////////////////////////////////////// + +/* + I am an editable, multi-line non-scrolling text window. I can be collapsed + to a single abbreviated line or expanded to full. My width can be adjusted + by the user, by height is determined by the size of my text body. I can be + either placed in a scripting area or "stuck" to a block. +*/ + +// CommentMorph inherits from BoxMorph: + +CommentMorph.prototype = new BoxMorph(); +CommentMorph.prototype.constructor = CommentMorph; +CommentMorph.uber = BoxMorph.prototype; + +// CommentMorph preferences settings (pseudo-inherited from SyntaxElement): + +CommentMorph.prototype.refreshScale = function () { + CommentMorph.prototype.fontSize = SyntaxElementMorph.prototype.fontSize; + CommentMorph.prototype.padding = 5 * SyntaxElementMorph.prototype.scale; + CommentMorph.prototype.rounding = 8 * SyntaxElementMorph.prototype.scale; +}; + +CommentMorph.prototype.refreshScale(); + +// CommentMorph instance creation: + +function CommentMorph(contents) { + this.init(contents); +} + +CommentMorph.prototype.init = function (contents) { + var scale = SyntaxElementMorph.prototype.scale; + + this.block = null; // optional anchor block + this.stickyOffset = null; // not to be persisted + this.isCollapsed = false; + this.titleBar = new BoxMorph( + this.rounding, + scale, + new Color(255, 255, 180) + ); + this.titleBar.color = new Color(255, 255, 180); + this.titleBar.setHeight(fontHeight(this.fontSize) + this.padding); + this.title = null; + this.arrow = new ArrowMorph( + 'down', + this.fontSize + ); + this.arrow.mouseClickLeft = () => this.toggleExpand(); + this.contents = new TextMorph( + contents || localize('add comment here...'), + this.fontSize + ); + this.contents.isEditable = true; + this.contents.enableSelecting(); + this.contents.maxWidth = 90 * scale; + this.contents.fixLayout(); + this.handle = new HandleMorph( + this.contents, + 80, + this.fontSize * 2, + -2, + -2 + ); + this.handle.setExtent(new Point(11 * scale, 11 * scale)); + this.anchor = null; + + CommentMorph.uber.init.call( + this, + this.rounding, + scale, + new Color(255, 255, 180) + ); + this.color = new Color(255, 255, 220); + this.isDraggable = true; + this.add(this.titleBar); + this.add(this.arrow); + this.add(this.contents); + this.add(this.handle); + + this.fixLayout(); +}; + +// CommentMorph ops: + +CommentMorph.prototype.fullCopy = function () { + var cpy = new CommentMorph(this.contents.text); + cpy.isCollapsed = this.isCollapsed; + cpy.setTextWidth(this.textWidth()); + if (this.selectionID) { // for copy on write + cpy.selectionID = true; + } + return cpy; +}; + +CommentMorph.prototype.setTextWidth = function (pixels) { + this.contents.maxWidth = pixels; + this.contents.fixLayout(); + this.fixLayout(); +}; + +CommentMorph.prototype.textWidth = function () { + return this.contents.maxWidth; +}; + +CommentMorph.prototype.text = function () { + return this.contents.text; +}; + +CommentMorph.prototype.toggleExpand = function () { + var scripts = this.parentThatIsA(ScriptsMorph); + this.isCollapsed = !this.isCollapsed; + this.fixLayout(); + this.align(); + if (!this.isCollapsed) { + this.comeToFront(); + } + if (scripts) { + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + this.isCollapsed ? 'collapse' : 'expand' + ); + } +}; + +CommentMorph.prototype.comeToFront = function () { + if (this.parent) { + this.parent.add(this); + this.changed(); + } +}; + +// CommentMorph events: + +CommentMorph.prototype.mouseClickLeft = function () { + this.comeToFront(); +}; + +CommentMorph.prototype.reactToEdit = function () { + var scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + 'edit' + ); + } +}; + +// CommentMorph layout: + +CommentMorph.prototype.layoutChanged = function () { + // react to a change of the contents area + this.fixLayout(); + this.align(); + this.comeToFront(); +}; + +CommentMorph.prototype.fixLayout = function () { + var label, + tw = this.contents.width() + 2 * this.padding; + + if (this.title) { + this.title.destroy(); + this.title = null; + } + if (this.isCollapsed) { + this.contents.hide(); + this.title = new FrameMorph(); + this.title.alpha = 0; + this.title.acceptsDrops = false; + label = new StringMorph( + this.contents.text, + this.fontSize, + null, // style (sans-serif) + true // bold + ); + label.rootForGrab = () => this; + this.title.add(label); + this.title.setHeight(label.height()); + this.title.setWidth( + tw - this.arrow.width() - this.padding * 2 - this.rounding + ); + this.add(this.title); + } else { + this.contents.show(); + } + this.titleBar.setWidth(tw); + this.contents.setLeft(this.titleBar.left() + this.padding); + this.contents.setTop(this.titleBar.bottom() + this.padding); + this.arrow.direction = this.isCollapsed ? 'right' : 'down'; + this.arrow.rerender(); + this.arrow.setCenter(this.titleBar.center()); + this.arrow.setLeft(this.titleBar.left() + this.padding); + if (this.title) { + this.title.setPosition( + this.arrow.topRight().add(new Point(this.padding, 0)) + ); + } + this.changed(); + this.bounds.setHeight( + this.titleBar.height() + + (this.isCollapsed ? 0 : + this.padding + + this.contents.height() + + this.padding) + ); + this.bounds.setWidth(this.titleBar.width()); + this.rerender(); + this.handle.fixLayout(); +}; + +// CommentMorph menu: + +CommentMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + + menu.addItem( + "duplicate", + () => { + var dup = this.fullCopy(), + ide = this.parentThatIsA(IDE_Morph), + blockEditor = this.parentThatIsA(BlockEditorMorph), + scripts = this.parentThatIsA(ScriptsMorph), + world = this.world(); + dup.pickUp(world); + // register the drop-origin, so the comment can + // slide back to its former situation if dropped + // somewhere where it gets rejected + if (!ide && blockEditor) { + ide = blockEditor.target.parentThatIsA(IDE_Morph); + } + if (ide) { + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + if (scripts) { + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + 'duplicate' + ); + } + }, + 'make a copy\nand pick it up' + ); + menu.addItem("delete", 'userDestroy'); + menu.addItem( + "comment pic...", + () => { + var ide = this.parentThatIsA(IDE_Morph) || + this.parentThatIsA(BlockEditorMorph) + .target.parentThatIsA(IDE_Morph); + ide.saveCanvasAs( + this.fullImage(), + (ide.projectName || localize('untitled')) + ' ' + + localize('comment pic') + ); + }, + 'save a picture\nof this comment' + ); + return menu; +}; + +CommentMorph.prototype.userDestroy = function () { + var scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + 'delete' + ); + } + this.selectForEdit().destroy(); // enable copy-on-edit +}; + +// CommentMorph hiding and showing: + +/* + override the inherited behavior to recursively hide/show all + children, so that my instances get restored correctly when + switching back out of app mode. +*/ + +CommentMorph.prototype.hide = function () { + this.isVisible = false; + this.changed(); +}; + +CommentMorph.prototype.show = function () { + this.isVisible = true; + this.changed(); +}; + +// CommentMorph dragging & dropping + +CommentMorph.prototype.prepareToBeGrabbed = function (hand) { + // disassociate from the block I'm posted to + var scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + 'grab' + ); + } + if (this.block) { + this.block.comment = null; + this.block = null; + } + if (this.anchor) { + this.anchor.destroy(); + this.anchor = null; + } +}; + +CommentMorph.prototype.justDropped = function (hand) { + var scripts = this.parentThatIsA(ScriptsMorph); + if (scripts) { + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + 'drop' + ); + } +}; + +CommentMorph.prototype.selectForEdit = + SyntaxElementMorph.prototype.selectForEdit; + +CommentMorph.prototype.snap = function (hand) { + // passing the hand is optional (for when blocks are dragged & dropped) + var scripts = this.parent, + target; + + if (!(scripts instanceof ScriptsMorph)) { + return null; + } + scripts.clearDropInfo(); + target = scripts.closestBlock(this, hand); + if (target !== null) { + target.comment = this; + this.block = target; + if (this.snapSound) { + this.snapSound.play(); + } + scripts.lastDropTarget = {element: target}; + scripts.scriptTarget().recordUserEdit( + 'scripts', + 'comment', + 'snap', + this.block.abstractBlockSpec() + ); + } + this.align(); + scripts.lastDroppedBlock = this; + if (hand) { + scripts.recordDrop(hand.grabOrigin); + } + +}; + +// CommentMorph sticking to blocks + +CommentMorph.prototype.align = function (topBlock, ignoreLayer) { + if (this.block) { + var top = topBlock || this.block.topBlock(), + affectedBlocks, + tp, + bottom, + rightMost, + scripts = top.parentThatIsA(ScriptsMorph); + this.setTop(this.block.top() + this.block.corner); + tp = this.top(); + bottom = this.bottom(); + affectedBlocks = top.allChildren().filter(child => + child instanceof BlockMorph && + child.bottom() > tp && + child.top() < bottom + ); + rightMost = Math.max.apply( + null, + affectedBlocks.map(block => block.right()) + ); + + this.setLeft(rightMost + 5); + if (!ignoreLayer && scripts) { + scripts.addBack(this); // push to back and show + } + + if (!this.anchor) { + this.anchor = new Morph(); + this.anchor.color = this.titleBar.color; + } + this.anchor.setPosition(new Point( + this.block.right(), + this.top() + this.edge + )); + this.anchor.bounds.corner = new Point( + this.left(), + this.top() + this.edge + 1 + ); + this.anchor.rerender(); + this.addBack(this.anchor); + } +}; + +CommentMorph.prototype.startFollowing = function (topBlock, world) { + this.align(topBlock); + world.add(this); + this.addShadow(); + this.stickyOffset = this.position().subtract(this.block.position()); + this.step = () => { + if (!this.block) { // kludge - only needed for "redo" + this.stopFollowing(); + return; + } + this.setPosition(this.block.position().add(this.stickyOffset)); + }; +}; + +CommentMorph.prototype.stopFollowing = function () { + this.removeShadow(); + delete this.step; +}; + +CommentMorph.prototype.destroy = function () { + if (this.block) { + this.block.comment = null; + } + CommentMorph.uber.destroy.call(this); +}; + +CommentMorph.prototype.stackHeight = function () { + return this.height(); +}; + +// ScriptFocusMorph ////////////////////////////////////////////////////////// + +/* + I offer keyboard navigation for syntax elements, blocks and scripts: + + activate: + - shift + click on a scripting pane's background + - shift + click on any block + - shift + enter in the IDE's edit mode + + stop editing: + - left-click on scripting pane's background + - esc + + navigate among scripts: + - tab: next script + - backtab (shift + tab): last script + + start editing a new script: + - shift + enter + + navigate among commands within a script: + - down arrow: next command + - up arrow: last command + + navigate among all elements within a script: + - right arrow: next element (block or input) + - left arrow: last element + + move the currently edited script (stack of blocks): + - shift + arrow keys (left, right, up, down) + + editing scripts: + + - backspace: + * delete currently focused reporter + * delete command above current insertion mark (blinking) + * collapse currently focused variadic input by one element + + - enter: + * edit currently focused input slot + * expand currently focused variadic input by one element + + - space: + * activate currently focused input slot's pull-down menu, if any + * show a menu of reachable variables for the focused input or reporter + + - any other key: + start searching for insertable matching blocks + + - in menus triggered by this feature: + * navigate with up / down arrow keys + * trigger selection with enter + * cancel menu with esc + + - in the search bar triggered b this feature: + * keep typing / deleting to narrow and update matches + * navigate among shown matches with up / down arrow keys + * insert selected match at the focus' position with enter + * cancel searching and inserting with esc + + running the currently edited script: + * shift+ctrl+enter simulates clicking the edited script with the mouse +*/ + +// ScriptFocusMorph inherits from BoxMorph: + +ScriptFocusMorph.prototype = new BoxMorph(); +ScriptFocusMorph.prototype.constructor = ScriptFocusMorph; +ScriptFocusMorph.uber = BoxMorph.prototype; + +// ScriptFocusMorph instance creation: + +function ScriptFocusMorph(editor, initialElement, position) { + this.init(editor, initialElement, position); +} + +ScriptFocusMorph.prototype.init = function ( + editor, + initialElement, + position +) { + this.editor = editor; // a ScriptsMorph + this.element = initialElement; + this.atEnd = false; + ScriptFocusMorph.uber.init.call(this); + if (this.element instanceof ScriptsMorph) { + this.setPosition(position); + } +}; + +// ScriptFocusMorph keyboard focus: + +ScriptFocusMorph.prototype.getFocus = function (world) { + if (!world) {world = this.world(); } + if (world && world.keyboardFocus !== this) { + world.stopEditing(); + } + world.keyboardFocus = this; + this.fixLayout(); + this.editor.updateToolbar(); +}; + +// ScriptFocusMorph layout: + +ScriptFocusMorph.prototype.fixLayout = function () { + this.changed(); + if (this.element instanceof CommandBlockMorph || + this.element instanceof CommandSlotMorph || + this.element instanceof ScriptsMorph) { + this.manifestStatement(); + } else { + this.manifestExpression(); + } + this.editor.add(this); // come to front + this.scrollIntoView(); + this.changed(); +}; + +ScriptFocusMorph.prototype.manifestStatement = function () { + var newScript = this.element instanceof ScriptsMorph, + y = this.element.top(); + this.border = 0; + this.edge = 0; + this.alpha = 1; + this.color = this.editor.feedbackColor; + this.bounds.setExtent(new Point( + newScript ? + SyntaxElementMorph.prototype.hatWidth : this.element.width(), + Math.max( + SyntaxElementMorph.prototype.corner, + SyntaxElementMorph.prototype.feedbackMinHeight + ) + )); + if (this.element instanceof CommandSlotMorph) { + y += SyntaxElementMorph.prototype.corner; + } else if (this.atEnd) { + y = this.element.bottom(); + } + if (!newScript) { + this.setPosition(new Point( + this.element.left(), + y + )); + } + this.fps = 2; + this.show(); + this.step = function () { + this.toggleVisibility(); + }; +}; + +ScriptFocusMorph.prototype.manifestExpression = function () { + this.edge = SyntaxElementMorph.prototype.rounding; + this.border = Math.max( + SyntaxElementMorph.prototype.edge, + 3 + ); + this.color = this.editor.feedbackColor.copy(); + this.color.a = 0.5; + this.borderColor = this.editor.feedbackColor; + + this.bounds = this.element.fullBounds() + .expandBy(Math.max( + SyntaxElementMorph.prototype.edge * 2, + SyntaxElementMorph.prototype.reporterDropFeedbackPadding + )); + this.rerender(); + delete this.fps; + delete this.step; + this.show(); +}; + +// ScriptFocusMorph editing + +ScriptFocusMorph.prototype.trigger = function () { + var current = this.element, + i; + if (current instanceof MultiArgMorph) { + for (i = 0; i < current.groupInputs; i += 1) { + if (current.arrows().children[1].isVisible) { + current.addInput(); + this.fixLayout(); + } + } + return; + } + if (current.parent instanceof TemplateSlotMorph) { + current.mouseClickLeft(); + return; + } + if (current instanceof BooleanSlotMorph) { + current.toggleValue(); + return; + } + if (current instanceof InputSlotMorph) { + if (!current.isReadOnly) { + delete this.fps; + delete this.step; + this.hide(); + this.world().onNextStep = () => { + current.contents().edit(); + current.contents().selectAll(); + }; + } else if (current.choices) { + current.dropDownMenu(true); + delete this.fps; + delete this.step; + this.hide(); + } + } +}; + +ScriptFocusMorph.prototype.menu = function () { + var current = this.element; + if (current instanceof InputSlotMorph && current.choices) { + current.dropDownMenu(true); + delete this.fps; + delete this.step; + this.hide(); + } else { + this.insertVariableGetter(); + } +}; + +ScriptFocusMorph.prototype.deleteLastElement = function () { + var current = this.element, + i; + if (current.parent instanceof ScriptsMorph) { + if (this.atEnd || current instanceof ReporterBlockMorph) { + current.destroy(); + this.element = this.editor; + this.atEnd = false; + } + } else if (current instanceof MultiArgMorph) { + for (i = 0; i < current.groupInputs; i += 1) { + if (current.arrows().children[0].isVisible) { + current.removeInput(); + } + } + } else if (current instanceof BooleanSlotMorph) { + if (!current.isStatic) { + current.setContents(null); + } + } else if (current instanceof ReporterBlockMorph) { + if (!current.isTemplate) { + this.lastElement(); + current.prepareToBeGrabbed(); + current.destroy(); + } + } else if (current instanceof CommandBlockMorph) { + if (this.atEnd) { + this.element = current.parent; + current.userDestroy(); + } else { + if (current.parent instanceof CommandBlockMorph) { + current.parent.userDestroy(); + } + } + } + this.editor.adjustBounds(); + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.insertBlock = function (block) { + // insert the block after a short gliding animation + this.world().add(block); + block.glideTo( + this.position(), + null, + null, + () => this.fillInBlock(block) + ); +}; + +ScriptFocusMorph.prototype.fillInBlock = function (block) { + var pb, stage, ide, rcvr; + block.isTemplate = false; + block.isDraggable = true; + + if (block.snapSound) { + block.snapSound.play(); + } + + if (this.element instanceof ScriptsMorph) { + this.editor.add(block); + this.element = block; + if (block instanceof CommandBlockMorph) { + block.setLeft(this.left()); + if (block.isStop()) { + block.setTop(this.top()); + } else { + block.setBottom(this.top()); + this.atEnd = true; + } + } else { + block.setCenter(this.center()); + block.setLeft(this.left()); + } + } else if (this.element instanceof CommandBlockMorph) { + if (this.atEnd) { + this.element.nextBlock(block); + this.element = block; + this.fixLayout(); + } else { + // to be done: special case if block.isStop() + pb = this.element.parent; + if (pb instanceof ScriptsMorph) { // top block + block.setLeft(this.element.left()); + block.setBottom(this.element.top() + this.element.corner); + this.editor.add(block); + block.nextBlock(this.element); + this.fixLayout(); + } else if (pb instanceof CommandSlotMorph) { + pb.nestedBlock(block); + } else if (pb instanceof RingReporterSlotMorph) { + block.nextBlock(pb.nestedBlock()); + pb.add(block); + pb.fixLayout(); + } else if (pb instanceof CommandBlockMorph) { + pb.nextBlock(block); + } + } + } else if (this.element instanceof CommandSlotMorph) { + // to be done: special case if block.isStop() + this.element.nestedBlock(block); + this.element = block; + this.atEnd = true; + } else { + pb = this.element.parent; + if (pb instanceof ScriptsMorph) { + this.editor.add(block); + block.setPosition(this.element.position()); + this.element.destroy(); + } else { + pb.replaceInput(this.element, block); + } + this.element = block; + } + block.fixBlockColor(); + this.editor.adjustBounds(); + // block.scrollIntoView(); + this.fixLayout(); + + // register generic hat blocks + if (block.selector === 'receiveCondition') { + rcvr = this.editor.scriptTarget(); + if (rcvr) { + stage = rcvr.parentThatIsA(StageMorph); + if (stage) { + stage.enableCustomHatBlocks = true; + stage.threads.pauseCustomHatBlocks = false; + ide = stage.parentThatIsA(IDE_Morph); + if (ide) { + ide.controlBar.stopButton.refresh(); + } + } + } + } + + // experimental: if the inserted block has inputs, go to the first one + if (block.inputs && block.inputs().length) { + this.element = block; + this.atEnd = false; + this.nextElement(); + } +}; + +ScriptFocusMorph.prototype.insertVariableGetter = function () { + var types = this.blockTypes(), + vars, + menu = new MenuMorph(); + if (!types || !contains(types, 'reporter')) { + return; + } + vars = InputSlotMorph.prototype.getVarNamesDict.call(this.element); + Object.keys(vars).forEach(vName => { + var block = SpriteMorph.prototype.variableBlock(vName); + block.addShadow(new Point(3, 3)); + menu.addItem( + block, + () => { + block.removeShadow(); + this.insertBlock(block); + } + ); + }); + if (menu.items.length > 0) { + menu.popup(this.world(), this.element.bottomLeft()); + menu.getFocus(); + } +}; + +ScriptFocusMorph.prototype.stopEditing = function () { + this.editor.focus = null; + this.editor.updateToolbar(); + this.world().keyboardFocus = null; + this.destroy(); +}; + +// ScriptFocusMorph navigation + +ScriptFocusMorph.prototype.lastElement = function () { + var items = this.items(), + idx; + if (!items.length) { + this.shiftScript(new Point(-50, 0)); + return; + } + if (this.atEnd) { + this.element = items[items.length - 1]; + this.atEnd = false; + } else { + idx = items.indexOf(this.element) - 1; + if (idx < 0) {idx = items.length - 1; } + this.element = items[idx]; + } + if (this.element instanceof CommandSlotMorph && + this.element.nestedBlock()) { + this.lastElement(); + } else if (this.element instanceof HatBlockMorph) { + if (items.length > 1) { + this.lastElement(); + } else { + this.atEnd = true; + } + } + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.nextElement = function () { + var items = this.items(), idx, nb; + if (!items.length) { + this.shiftScript(new Point(50, 0)); + return; + } + idx = items.indexOf(this.element) + 1; + if (idx >= items.length) { + idx = 0; + } + this.atEnd = false; + this.element = items[idx]; + if (this.element instanceof CommandSlotMorph) { + nb = this.element.nestedBlock(); + if (nb) {this.element = nb; } + } else if (this.element instanceof HatBlockMorph) { + if (items.length === 1) { + this.atEnd = true; + } else { + this.nextElement(); + } + } + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.lastCommand = function () { + var cm = this.element.parentThatIsA(CommandBlockMorph), + pb; + if (!cm) { + if (this.element instanceof ScriptsMorph) { + this.shiftScript(new Point(0, -50)); + } + return; + } + if (this.element instanceof CommandBlockMorph) { + if (this.atEnd) { + this.atEnd = false; + } else { + pb = cm.parent.parentThatIsA(CommandBlockMorph); + if (pb) { + this.element = pb; + } else { + pb = cm.topBlock().bottomBlock(); + if (pb) { + this.element = pb; + this.atEnd = true; + } + } + } + } else { + this.element = cm; + this.atEnd = false; + } + if (this.element instanceof HatBlockMorph && !this.atEnd) { + this.lastCommand(); + } + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.nextCommand = function () { + var cm = this.element, + tb, + nb, + cs; + if (cm instanceof ScriptsMorph) { + this.shiftScript(new Point(0, 50)); + return; + } + while (!(cm instanceof CommandBlockMorph)) { + cm = cm.parent; + if (cm instanceof ScriptsMorph) { + return; + } + } + if (this.atEnd) { + cs = cm.parentThatIsA(CommandSlotMorph); + if (cs) { + this.element = cs.parentThatIsA(CommandBlockMorph); + this.atEnd = false; + this.nextCommand(); + } else { + tb = cm.topBlock().parentThatIsA(CommandBlockMorph); + if (tb) { + this.element = tb; + this.atEnd = false; + if (this.element instanceof HatBlockMorph) { + this.nextCommand(); + } + } + } + } else { + nb = cm.nextBlock(); + if (nb) { + this.element = nb; + } else { + this.element = cm; + this.atEnd = true; + } + } + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.nextScript = function () { + var scripts = this.sortedScripts(), + idx; + if (scripts.length < 1) {return; } + if (this.element instanceof ScriptsMorph) { + this.element = scripts[0]; + } + idx = scripts.indexOf(this.element.topBlock()) + 1; + if (idx >= scripts.length) {idx = 0; } + this.element = scripts[idx]; + this.element.scrollIntoView(); + this.atEnd = false; + if (this.element instanceof HatBlockMorph) { + return this.nextElement(); + } + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.lastScript = function () { + var scripts = this.sortedScripts(), + idx; + if (scripts.length < 1) {return; } + if (this.element instanceof ScriptsMorph) { + this.element = scripts[0]; + } + idx = scripts.indexOf(this.element.topBlock()) - 1; + if (idx < 0) {idx = scripts.length - 1; } + this.element = scripts[idx]; + this.element.scrollIntoView(); + this.atEnd = false; + if (this.element instanceof HatBlockMorph) { + return this.nextElement(); + } + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.shiftScript = function (deltaPoint) { + var tb; + if (this.element instanceof ScriptsMorph) { + this.moveBy(deltaPoint); + } else { + tb = this.element.topBlock(); + if (tb && !(tb instanceof PrototypeHatBlockMorph)) { + tb.moveBy(deltaPoint); + } + } + this.editor.adjustBounds(); + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.newScript = function () { + var pos = this.position(); + if (!(this.element instanceof ScriptsMorph)) { + pos = this.element.topBlock().fullBounds().bottomLeft().add( + new Point(0, 50) + ); + } + this.setPosition(pos); + this.element = this.editor; + this.editor.adjustBounds(); + this.fixLayout(); +}; + +ScriptFocusMorph.prototype.runScript = function () { + if (this.element instanceof ScriptsMorph) {return; } + this.element.topBlock().mouseClickLeft(); +}; + +ScriptFocusMorph.prototype.items = function () { + if (this.element instanceof ScriptsMorph) {return []; } + var script = this.element.topBlock(); + return script.allChildren().filter(each => + each instanceof SyntaxElementMorph && + !(each instanceof TemplateSlotMorph) && + (!each.isStatic || + each.choices || + each instanceof BooleanSlotMorph || + each instanceof RingMorph || + each instanceof MultiArgMorph || + each instanceof CommandSlotMorph + ) + ); +}; + +ScriptFocusMorph.prototype.sortedScripts = function () { + var scripts = this.editor.children.filter(each => + each instanceof BlockMorph + ); + scripts.sort((a, b) => + // make sure the prototype hat block always stays on top + a instanceof PrototypeHatBlockMorph ? 0 : a.top() - b.top() + ); + return scripts; +}; + +// ScriptFocusMorph undo / redo + +ScriptFocusMorph.prototype.undrop = function () { + this.editor.undrop(); +}; + +ScriptFocusMorph.prototype.redrop = function () { + this.editor.redrop(); +}; + +// ScriptFocusMorph block types + +ScriptFocusMorph.prototype.blockTypes = function () { + // answer an array of possible block types that fit into + // the current situation, NULL if no block can be inserted + + if (this.element.isTemplate) {return null; } + if (this.element instanceof ScriptsMorph) { + return ['hat', 'command', 'reporter', 'predicate', 'ring']; + } + if (this.element instanceof HatBlockMorph || + this.element instanceof CommandSlotMorph) { + return ['command']; + } + if (this.element instanceof CommandBlockMorph) { + if (this.atEnd && this.element.isStop()) { + return null; + } + if (this.element.parent instanceof ScriptsMorph) { + return ['hat', 'command']; + } + return ['command']; + } + if (this.element instanceof ReporterBlockMorph) { + if (this.element.getSlotSpec() === '%n') { + return ['reporter']; + } + return ['reporter', 'predicate', 'ring']; + } + if (this.element.getSpec() === '%n') { + return ['reporter']; + } + if (this.element.isStatic) { + return null; + } + return ['reporter', 'predicate', 'ring']; +}; + + +// ScriptFocusMorph keyboard events + +ScriptFocusMorph.prototype.processKeyDown = function (event) { + this.processKeyEvent( + event, + this.reactToKeyEvent + ); +}; + +ScriptFocusMorph.prototype.processKeyUp = function (event) { + nop(event); +}; + +ScriptFocusMorph.prototype.processKeyPress = function (event) { + nop(event); +}; + + +ScriptFocusMorph.prototype.processKeyEvent = function (event, action) { + var keyName, ctrl, shift; + + //console.log(event.keyCode); + this.world().hand.destroyTemporaries(); // remove result bubbles, if any + switch (event.keyCode) { + case 8: + keyName = 'backspace'; + break; + case 9: + keyName = 'tab'; + break; + case 13: + keyName = 'enter'; + break; + case 16: + case 17: + case 18: + return; + case 27: + keyName = 'esc'; + break; + case 32: + keyName = 'space'; + break; + case 37: + keyName = 'left arrow'; + break; + case 39: + keyName = 'right arrow'; + break; + case 38: + keyName = 'up arrow'; + break; + case 40: + keyName = 'down arrow'; + break; + default: + keyName = String.fromCharCode(event.keyCode || event.charCode); + } + ctrl = (event.ctrlKey || event.metaKey) ? 'ctrl ' : ''; + shift = event.shiftKey ? 'shift ' : ''; + keyName = ctrl + shift + keyName; + action.call(this, keyName); +}; + +ScriptFocusMorph.prototype.reactToKeyEvent = function (key) { + var evt = key.toLowerCase(), + shift = 50, + types, + vNames; + + // console.log(evt); + switch (evt) { + case 'esc': + return this.stopEditing(); + case 'enter': + return this.trigger(); + case 'shift enter': + return this.newScript(); + case 'ctrl shift enter': + return this.runScript(); + case 'space': + return this.menu(); + case 'left arrow': + return this.lastElement(); + case 'shift left arrow': + return this.shiftScript(new Point(-shift, 0)); + case 'right arrow': + return this.nextElement(); + case 'shift right arrow': + return this.shiftScript(new Point(shift, 0)); + case 'up arrow': + return this.lastCommand(); + case 'shift up arrow': + return this.shiftScript(new Point(0, -shift)); + case 'down arrow': + return this.nextCommand(); + case 'shift down arrow': + return this.shiftScript(new Point(0, shift)); + case 'tab': + return this.nextScript(); + case 'shift tab': + return this.lastScript(); + case 'backspace': + return this.deleteLastElement(); + case 'ctrl z': + return this.undrop(); + case 'ctrl y': + case 'ctrl shift z': + return this.redrop(); + case 'ctrl [': // ignore the first press of the Mac cmd key + return; + default: + types = this.blockTypes(); + if (!(this.element instanceof ScriptsMorph) && + types && contains(types, 'reporter')) { + vNames = Object.keys(this.element.getVarNamesDict()); + } + if (types) { + delete this.fps; + delete this.step; + this.show(); + this.editor.scriptTarget().searchBlocks( + key, + types, + vNames, + this + ); + } + } +}; + + +/* +// register examples with the World demo menu +// comment out to shave off a millisecond loading speed ;-) + +(function () { + var h, b, c, ci, cb, cm, cd, co, cl, cu, cs, cmd, rings, rc, scripts; + // SyntaxElementMorph.prototype.setScale(2.5); + + h = new HatBlockMorph(); + h.setSpec('When %greenflag pressed'); + + b = new ReporterBlockMorph(true); + b.setSpec('%bool'); + + c = new CommandBlockMorph(); + c.setSpec('this is a test $globe'); + + ci = new CommandBlockMorph(); + ci.setSpec('block with input %s unit %mult%n number'); + + cb = new CommandBlockMorph(); + cb.setSpec('bool %b ?'); + + cd = new CommandBlockMorph(); + cd.setSpec('direction %dir degrees'); + + co = new CommandBlockMorph(); + co.setSpec('object %obj'); + + cl = new CommandBlockMorph(); + cl.setSpec('list %l'); + + cu = new CommandBlockMorph(); + cu.setSpec('list %upvar'); + + cs = new CommandBlockMorph(); + cs.setSpec('control %b %ca'); + + cmd = new CommandBlockMorph(); + cmd.setSpec('command %cmdRing'); + + rings = new CommandBlockMorph(); + rings.setSpec('reporter %repRing predicate %predRing'); + + rc = new ReporterBlockMorph(); + rc.setSpec('color %clr'); + + scripts = new ScriptsMorph(); + + BlockMorph.prototype.addToDemoMenu([ + 'Syntax', + [ + [h, 'hat'], + [b, 'predicate'], + [c, 'with label text'], + [ci, 'editable input slots'], + [cb, 'Boolean slot'], + [cm, 'menu input'], + [cd, 'direction input'], + [co, 'object input'], + [cl, 'list input'], + [cu, 'upvar input'], + [cs, 'loop input'], + [cmd, 'cmd ring input'], + [rings, 'reporter rings input'], + [rc, 'color input'], + [scripts, 'scripts'] + ] + ]); +})(); +*/ diff --git a/elements/pl-snap/Snap/src/byob.js b/elements/pl-snap/Snap/src/byob.js new file mode 100644 index 00000000..4adb2b02 --- /dev/null +++ b/elements/pl-snap/Snap/src/byob.js @@ -0,0 +1,5306 @@ +/* + + byob.js + + "build your own blocks" for Snap! + based on morphic.js, widgets.js blocks.js, threads.js and objects.js + inspired by Scratch + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2023 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs blocks.js, threads.js, objects.js, widgets.js and morphic.js + + + hierarchy + --------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + BlockLabelFragment + CustomBlockDefinition + + CommandBlockMorph*** + CustomCommandBlockMorph + HatBlockMorph*** + PrototypeHatBlockMorph + + DialogBoxMorph** + BlockDialogMorph + BlockEditorMorph + BlockExportDialogMorph + BlockImportDialogMorph + BlockRemovalDialogMorph + BlockVisibilityDialogMorph + InputSlotDialogMorph + VariableDialogMorph + + Morph* + BlockLabelFragmentMorph + BlockLabelPlaceHolderMorph + + ReporterBlockMorph*** + CustomReporterBlockMorph + JaggedBlockMorph + + TemplateSlotMorph*** + BlockInputFragmentMorph + + * from morphic.js + ** from widgets.js + *** from blocks.js + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + CustomBlockDefinition + CustomCommandBlockMorph + CustomReporterBlockMorph + JaggedBlockMorph + BlockDialogMorph + BlockEditorMorph + PrototypeHatBlockMorph + BlockLabelFragmentMorph + BlockLabelPlaceHolderMorph + BlockInputFragmentMorph + InputSlotDialogMorph + VariableDialogMorph + BlockExportDialogMorph + BlockImportDialogMorph + BlockRemovalDialogMorph + BlockVisibilityDialogMorph + +*/ + +/*global modules, CommandBlockMorph, SpriteMorph, TemplateSlotMorph, Map, Morph, +StringMorph, Color, DialogBoxMorph, ScriptsMorph, ScrollFrameMorph, WHITE, copy, +Point, HandleMorph, HatBlockMorph, BlockMorph, detect, List, Process, isString, +AlignmentMorph, ToggleMorph, InputFieldMorph, ReporterBlockMorph, StringMorph, +nop, radians, BoxMorph, ArrowMorph, PushButtonMorph, contains, InputSlotMorph, +ToggleButtonMorph, IDE_Morph, MenuMorph, ToggleElementMorph, fontHeight, isNil, +StageMorph, SyntaxElementMorph, CommentMorph, localize, CSlotMorph, Variable, +MorphicPreferences, SymbolMorph, CursorMorph, VariableFrame, BooleanSlotMorph, +WatcherMorph, XML_Serializer, SnapTranslator, SnapExtensions, MultiArgMorph, +ArgLabelMorph, embedMetadataPNG, ArgMorph*/ + +/*jshint esversion: 11*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.byob = '2023-July-14'; + +// Declarations + +var CustomBlockDefinition; +var CustomCommandBlockMorph; +var CustomReporterBlockMorph; +var BlockDialogMorph; +var BlockEditorMorph; +var PrototypeHatBlockMorph; +var BlockLabelFragment; +var BlockLabelFragmentMorph; +var BlockInputFragmentMorph; +var BlockLabelPlaceHolderMorph; +var InputSlotDialogMorph; +var VariableDialogMorph; +var JaggedBlockMorph; +var BlockExportDialogMorph; +var BlockImportDialogMorph; +var BlockRemovalDialogMorph; +var BlockVisibilityDialogMorph; + +// CustomBlockDefinition /////////////////////////////////////////////// + +// CustomBlockDefinition instance creation: + +function CustomBlockDefinition(spec, receiver) { + this.body = null; // a Context (i.e. a reified top block) + this.scripts = []; + this.category = null; + this.isGlobal = false; + this.type = 'command'; + this.spec = spec || ''; + this.declarations = new Map(); + // key: inputName + // value: [ + // type, + // default, + // options, + // isReadOnly, + // isIrreplaceable, + // separator + // ] + this.variableNames = []; + this.comment = null; + this.isHelper = false; + this.codeMapping = null; // generate text code + this.codeHeader = null; // generate text code + this.translations = {}; // format: {lang : spec} + + // don't serialize (not needed for functionality): + this.receiver = receiver || null; // for serialization only (pointer) + this.editorDimensions = null; // a rectangle, last bounds of the editor + this.cachedIsRecursive = null; // for automatic yielding + this.cachedTranslation = null; // for localized block specs + + // transient - for "wishes" + this.storedSemanticSpec = null; +} + +// CustomBlockDefinition instantiating blocks + +CustomBlockDefinition.prototype.blockInstance = function (storeTranslations) { + var block; + if (this.type === 'command') { + block = new CustomCommandBlockMorph(this); + } else { + block = new CustomReporterBlockMorph( + this, + this.type === 'predicate' + ); + } + block.isDraggable = true; + if (storeTranslations) { // only for "wishes" + block.storedTranslations = this.translationsAsText(); + } + return block; +}; + +CustomBlockDefinition.prototype.templateInstance = function () { + var block; + block = this.blockInstance(); + block.refreshDefaults(this); + block.isDraggable = false; + block.isTemplate = true; + return block; +}; + +CustomBlockDefinition.prototype.prototypeInstance = function () { + var block, slot; + + // make a new block instance and mark it as prototype + if (this.type === 'command') { + block = new CustomCommandBlockMorph(this, true); + } else { + block = new CustomReporterBlockMorph( + this, + this.type === 'predicate', + true + ); + } + + // assign slot declarations to prototype inputs + block.parts().forEach(part => { + if (part instanceof BlockInputFragmentMorph) { + slot = this.declarations.get(part.fragment.labelString); + if (slot) { + part.fragment.type = slot[0]; + part.fragment.defaultValue = slot[1]; + part.fragment.options = slot[2]; + part.fragment.isReadOnly = slot[3] || false; + part.fragment.isIrreplaceable = slot[4] || false; + part.fragment.separator = slot[5] || null; + } + } + }); + + return block; +}; + +// CustomBlockDefinition duplicating + +CustomBlockDefinition.prototype.copyAndBindTo = function (sprite, headerOnly) { + var c = copy(this); + + delete c[XML_Serializer.prototype.idProperty]; + c.receiver = sprite; // only for (kludgy) serialization + + // copy declarations + c.declarations = new Map(); + for (var [key, val] of this.declarations) { + c.declarations.set(key, val); + } + + if (headerOnly) { // for serializing inherited method signatures + c.body = null; + return c; + } + if (c.body) { + c.body = Process.prototype.reify.call( + null, + this.body.expression, + new List(this.inputNames()) + ); + c.body.outerContext = null; + } + return c; +}; + +// CustomBlockDefinition accessing + +CustomBlockDefinition.prototype.blockSpec = function () { + if (this.storedSemanticSpec) { + return this.storedSemanticSpec; // for "wishes" + } + + var ans = [], + parts = this.parseSpec(this.spec), + spec; + parts.forEach(part => { + if (part[0] === '%' && part.length > 1) { + spec = this.typeOf(part.slice(1)); + } else if (part === '$nl') { + spec = '%br'; + } else { + spec = part; + } + ans.push(spec); + ans.push(' '); + }); + return ''.concat.apply('', ans).trim(); +}; + +CustomBlockDefinition.prototype.helpSpec = function () { + var ans = [], + parts = this.parseSpec(this.spec); + parts.forEach(part => { + if (part[0] !== '%') { + ans.push(part); + } + }); + return ''.concat.apply('', ans).replace(/\?/g, ''); +}; + +CustomBlockDefinition.prototype.typeOf = function (inputName) { + if (this.declarations.has(inputName)) { + return this.declarations.get(inputName)[0]; + } + return '%s'; +}; + +CustomBlockDefinition.prototype.defaultValueOf = function (inputName) { + if (this.declarations.has(inputName)) { + return this.declarations.get(inputName)[1]; + } + return ''; +}; + +CustomBlockDefinition.prototype.defaultValueOfInputIdx = function (idx) { + var inputName = this.inputNames()[idx]; + return this.defaultValueOf(inputName); +}; + +CustomBlockDefinition.prototype.dropDownMenuOfInputIdx = function (idx) { + var inputName = this.inputNames()[idx]; + return this.dropDownMenuOf(inputName); +}; + +CustomBlockDefinition.prototype.isReadOnlyInputIdx = function (idx) { + var inputName = this.inputNames()[idx]; + return this.isReadOnlyInput(inputName); +}; + +CustomBlockDefinition.prototype.inputOptionsOfIdx = function (idx) { + var inputName = this.inputNames()[idx]; + return this.inputOptionsOf(inputName); +}; + +CustomBlockDefinition.prototype.isIrreplaceableInputIdx = function (idx) { + var inputName = this.inputNames()[idx]; + return this.isIrreplaceableInput(inputName); +}; + +CustomBlockDefinition.prototype.separatorOfInputIdx = function (idx) { + var inputName = this.inputNames()[idx]; + return this.separatorOfInput(inputName); +}; + +CustomBlockDefinition.prototype.dropDownMenuOf = function (inputName) { + var fname; + if (this.declarations.has(inputName) && + this.declarations.get(inputName)[2]) { + if ((this.declarations.get(inputName)[2].indexOf('§_') === 0)) { + fname = this.declarations.get(inputName)[2].slice(2); + if (contains( + [ + 'messagesMenu', + 'messagesReceivedMenu', //for backward (5.0.0 - 5.0.3) support + 'objectsMenu', + 'costumesMenu', + 'soundsMenu', + 'getVarNamesDict', + 'pianoKeyboardMenu', + 'directionDialMenu' + ], + fname + ) || fname.indexOf('ext_') === 0) { + return fname; + } + } + return this.parseChoices(this.declarations.get(inputName)[2]); + } + return null; +}; + +CustomBlockDefinition.prototype.parseChoices = function (string) { + var dict = {}, + stack = [dict], + params, body; + if (string.match(/^function\s*\(.*\)\s*{.*\n/)) { + // It's a JS function definition. + // Let's extract its params and body, and return a Function out of them. + params = string.match(/^function\s*\((.*)\)/)[1].split(','); + body = string.split('\n').slice(1,-1).join('\n'); + return Function.apply(null, params.concat([body])); + } + string.split('\n').forEach(line => { + var pair = line.split('='); + if (pair[0] === '}') { + stack.pop(); + dict = stack[stack.length - 1]; + } else if (pair[1] === '{') { + dict = {}; + stack[stack.length - 1][pair[0]] = dict; + stack.push(dict); + } else { + dict[pair[0]] = isNil(pair[1]) ? pair[0] : pair[1]; + } + }); + return dict; +}; + +CustomBlockDefinition.prototype.encodeChoices = function (list) { + // answer a string representing a parseable dropdown menu for an input slot + var encode = (dta) => dta instanceof List ? + encodeList(dta) : dta.toString(), + encodeList = (dta) => dta.length() === 2 ? encodePair(dta) + : dta.itemsArray().reduce( + (a, b) => encode(a) + '\n' + encode(b)), + encodePair = (dta) => encode(dta.at(1)) + '=' + + (dta.at(2) instanceof List ? + encodeSub(dta.at(2)) + : encode(dta.at(2))), + encodeSub = (dta) => '{\n' + encode(dta) + '\n}'; + + if (list.isEmpty()) { + return ''; + } + return list.itemsArray().reduce((a, b) => encode(a) + '\n' + encode(b)); +}; + +CustomBlockDefinition.prototype.decodeChoices = function (choices) { + // answer a (nested) List representing the input slot dropdown menu + var list = new List(), + key; + for (key in choices) { + if (Object.prototype.hasOwnProperty.call(choices, key)) { + if (key[0] === '~') { + list.add(key[0]); + } else if (choices[key] instanceof Object && + !(choices[key] instanceof Array) && + (typeof choices[key] !== 'function')) { + list.add(new List([key, this.decodeChoices(choices[key])])); + } else if (choices[key] instanceof Array && + isString(choices[key][0])) { + list.add(choices[key][0] === key ? key + : new List([key, choices[key][0]]) + ); + } else if (choices[key] instanceof Array && + choices[key][0] instanceof Object && + typeof choices[key][0] !== 'function') { + list.add(new List([key, this.decodeChoices(choices[key][0])])); + } else { + list.add(choices[key] === key ? key + : new List([key, choices[key]]) + ); + } + } + } + return list; +}; + +CustomBlockDefinition.prototype.menuSearchWords = function () { + // return a single string containing words that can be searched for + // inside my dropdown menus + var terms = []; + this.inputNames().forEach(slot => { + var menu = this.dropDownMenuOf(slot); + if (menu) { + if (isString(menu)) { // special menu, translates its values + if (typeof InputSlotMorph.prototype[menu] === 'function') { + // catch typos in extension menus + menu = InputSlotMorph.prototype[menu](true); + terms.push( + Object.values(menu).map(entry => { + if (isNil(entry)) {return ''; } + if (entry instanceof Array) { + return localize(entry[0]); + } + return entry.toString(); + }).join(' ') + ); + } + } else { // assume a dictionary, take its keys + terms.push(Object.keys(menu).join(' ')); + } + } + }); + return terms.join(' ').toLowerCase(); +}; + +CustomBlockDefinition.prototype.isReadOnlyInput = function (inputName) { + return this.declarations.has(inputName) && + this.declarations.get(inputName)[3] === true; +}; + +CustomBlockDefinition.prototype.isIrreplaceableInput = function (inputName) { + return this.declarations.has(inputName) && + this.declarations.get(inputName)[4] === true; +}; + +CustomBlockDefinition.prototype.separatorOfInput = function (inputName) { + if (this.declarations.has(inputName)) { + return this.declarations.get(inputName)[5] || null; + } + return null; +}; + +CustomBlockDefinition.prototype.inputOptionsOf = function (inputName) { + return [ + this.dropDownMenuOf(inputName), + this.isReadOnlyInput(inputName) + ]; +}; + +CustomBlockDefinition.prototype.inputNames = function () { + var vNames = [], + parts = this.parseSpec(this.spec); + parts.forEach(part => { + if (part[0] === '%' && part.length > 1) { + vNames.push(part.slice(1)); + } + }); + return vNames; +}; + +CustomBlockDefinition.prototype.parseSpec = function (spec) { + // private + var parts = [], word = '', i, quoted = false, c; + for (i = 0; i < spec.length; i += 1) { + c = spec[i]; + if (c === "'") { + quoted = !quoted; + } else if (c === ' ' && !quoted) { + parts.push(word); + word = ''; + } else { + word = word.concat(c); + } + } + parts.push(word); + return parts; +}; + +CustomBlockDefinition.prototype.isDirectlyRecursive = function () { + var myspec; + if (this.cachedIsRecursive !== null) { + return this.cachedIsRecursive; + } + if (!this.body) { + this.cachedIsRecursive = false; + } else { + myspec = this.blockSpec(); + this.cachedIsRecursive = this.body.expression.anyChild( + function (morph) { + return morph.isCustomBlock && + morph.blockSpec === myspec; + } + ); + } + return this.cachedIsRecursive; +}; + +// CustomBlockDefinition localizing + +CustomBlockDefinition.prototype.localizedSpec = function () { + if (this.cachedTranslation) {return this.cachedTranslation; } + + var loc = this.translations[SnapTranslator.language], + sem = this.blockSpec(), + locParts, + inputs, + i = -1; + + function isInput(str) { + return (str.length > 1) && (str[0] === '%'); + } + + if (isNil(loc)) {return sem; } + inputs = BlockMorph.prototype.parseSpec(sem).filter(str => isInput(str)); + locParts = BlockMorph.prototype.parseSpec(loc); + + // perform a bunch of sanity checks on the localized spec + if (locParts.some(str => isInput(str)) || + (locParts.filter(str => str === '_').length !== inputs.length) + ) { + this.cachedTranslation = sem; + } else { + // substitute each input place holder with its semantic spec part + locParts = locParts.map(str => { + if (str === '_') { + i += 1; + return inputs[i]; + } + return str; + }); + this.cachedTranslation = locParts.join(' '); + } + return this.cachedTranslation; +}; + +CustomBlockDefinition.prototype.abstractBlockSpec = function () { + // answer the semantic block spec substituting each input + // with an underscore + return BlockMorph.prototype.parseSpec(this.blockSpec()).map(str => + (str.length > 1 && (str[0]) === '%') ? '_' : str + ).join(' '); +}; + +CustomBlockDefinition.prototype.translationsAsText = function () { + var txt = ''; + Object.keys(this.translations).forEach(lang => + txt += (lang + ':' + this.translations[lang] + '\n') + ); + return txt; +}; + +CustomBlockDefinition.prototype.updateTranslations = function (text) { + var lines = text.split('\n').filter(txt => txt.length); + this.translations = {}; + lines.forEach(txt => { + var idx = txt.indexOf(':'), + key = txt.slice(0, idx).trim(), + val = txt.slice(idx + 1).trim(); + if (idx) { + this.translations[key] = val; + } + }); +}; + +// CustomBlockDefinition API + +CustomBlockDefinition.prototype.setBlockLabel = function (abstractSpec) { + // private - only to be called from a Process that also does housekeeping + // abstract block specs replace the inputs with underscores, + // e.g. "move _ steps", "say _", "_ + _" + var parts = abstractSpec.split(' ').filter(each => each.length && each !== ' '), + count = parts.filter(each => each === '_').length, + inputNames = this.inputNames(), + spec = '', + idx = 0; + + if (count !== inputNames.length) { + throw new Error('expecting the number of inputs to match'); + } + parts.forEach(part => { + if (part === '_') { + spec += inputNames[idx] ? '%\'' + inputNames[idx] + '\' ' : ''; + idx += 1; + } else { + spec += (part + ' '); + } + }); + this.spec = spec.trim(); +}; + +CustomBlockDefinition.prototype.setBlockDefinition = function (aContext) { + // private - only to be called from a Process that also does housekeeping + var oldInputs = this.inputNames(), + newInputs = aContext.inputs, + declarations = this.declarations, + parts = [], + body = aContext, + idx = 0, + reportBlock, + spec; + + // remove excess inputs or add missing ones + this.addInputs(newInputs.length - oldInputs.length); + spec = this.abstractBlockSpec(); + oldInputs = this.inputNames(); + + // change the input names in the spec to those of the given context + parts = spec.split(' ').filter(each => each.length && each !== ' '); + spec = ''; + parts.forEach(part => { + if (part === '_') { + spec += newInputs[idx] ? '%\'' + newInputs[idx] + '\' ' : ''; + idx += 1; + } else { + spec += (part + ' '); + } + }); + this.spec = spec.trim(); + + // change the input names in the slot declarations to those of the context + // copy declarations + this.declarations = new Map(); + for (var [key, val] of declarations) { + this.declarations.set(newInputs[oldInputs.indexOf(key)], val); + } + + // replace the definition body with the given context + if (body.expression instanceof Array) { + this.body = null; + return; + } else if (body.expression instanceof ReporterBlockMorph) { + // turn reporter epressions into a command stack with "report" + body = copy(aContext); + reportBlock = SpriteMorph.prototype.blockForSelector('doReport'); + reportBlock.replaceInput( + reportBlock.inputs()[0], + body.expression.fullCopy() + ); + body.expression = reportBlock; + } + this.body = body; +}; + +CustomBlockDefinition.prototype.addInputs = function (count) { + // private - only to be called from a Process that also does housekeeping + var inputNames, i; + + if (count === 0) { + return; + } else if (count < 0) { + return this.removeInputs(-count); + } + + inputNames = this.inputNames(); + + // create gensyms + for (i = 0; i < count; i += 1) { + inputNames.push(this.gensym(inputNames)); + } + + // add gensyms to the spec + this.spec = this.parseSpec(this.spec).concat( + inputNames.slice(-count).map(str => '%' + str) + ).join(' ').trim(); + + // add slot declarations for the gensyms + inputNames.slice(-count).forEach(name => + this.declarations.set(name, ['%s']) + ); +}; + +CustomBlockDefinition.prototype.removeInputs = function (count) { + // private - only to be called from a Process that also does housekeeping + var surplus = this.inputNames().slice(-count); + + // remove the surplus input names from the spec + this.spec = this.parseSpec(this.spec).filter(str => + !(str.length > 1 && (str[0]) === '%' && surplus.includes(str.slice(1))) + ).join(' ').trim(); + + // remove the surplus input names from the slot declarations + surplus.forEach(name => this.declarations.delete(name)); +}; + +CustomBlockDefinition.prototype.gensym = function (existing) { + var count = 1; + while (contains(existing, '#' + count)) { + count += 1; + } + return '#' + count; +}; + +// CustomBlockDefinition picturing + +CustomBlockDefinition.prototype.scriptsPicture = function () { + return this.scriptsModel().scriptsPicture(); +}; + +CustomBlockDefinition.prototype.sortedElements = function () { + return this.scriptsModel().sortedElements(); +}; + +CustomBlockDefinition.prototype.scriptsModel = function () { + // answer a restored scripting area for the sake + // of creating script pictures + var scripts, proto, block, comment, template; + + scripts = new ScriptsMorph(); + scripts.cleanUpMargin = 10; + proto = new PrototypeHatBlockMorph(this); + proto.setPosition(scripts.position().add(10)); + if (this.comment !== null) { + comment = this.comment.fullCopy(); + proto.comment = comment; + comment.block = proto; + } + if (this.body !== null) { + proto.nextBlock(this.body.expression.fullCopy()); + } + scripts.add(proto); + proto.fixBlockColor(null, true); + this.scripts.forEach(element => { + block = element.fullCopy(); + block.setPosition(scripts.position().add(element.position())); + scripts.add(block); + if (block instanceof BlockMorph) { + block.allComments().forEach(comment => + comment.align(block) + ); + } + }); + proto.allComments().forEach(comment => + comment.align(proto) + ); + template = proto.parts()[0]; + template.fixLayout(); + template.forceNormalColoring(); + template.fixBlockColor(proto, true); + scripts.fixMultiArgs(); + return scripts; +}; + +// CustomBlockDefinition purging deleted blocks + +CustomBlockDefinition.prototype.purgeCorpses = function () { + // remove blocks that have been marked for deletion + if (this.body && this.body.expression.isCorpse) { + this.body = null; + } + this.scripts = this.scripts.filter(topBlock => + !topBlock.isCorpse + ); +}; + +// CustomBlockDefinition dependencies + +CustomBlockDefinition.prototype.collectDependencies = function ( + excluding, + result, + localReceiver // optional when exporting sprite-local blocks +) { + if (!this.isGlobal && !localReceiver) { + throw new Error('cannot collect dependencies for local\n' + + 'custom blocks of an unspecified sprite'); + } + excluding.push(this); + this.scripts.concat( + this.body ? [this.body.expression] : [] + ).forEach(script => { + script.forAllChildren(morph => { + var def; + if (morph.isCustomBlock) { + def = morph.isGlobal ? morph.definition + : localReceiver.getMethod(morph.blockSpec); + if (!contains(excluding, def) && !contains(result, def)) { + result.push(def); + def.collectDependencies( + excluding, + result, + localReceiver + ); + } + } + }); + }); + return result; +}; + +CustomBlockDefinition.prototype.isSending = function (message, receiverName) { + return this.scripts.concat( + this.body ? [this.body.expression] : [] + ).some(script => script instanceof BlockMorph && + script.isSending(message, receiverName) + ); +}; + +CustomBlockDefinition.prototype.dataDependencies = function () { + // return an array of variable names referenced in this custom block + // definition which are not declared here. + // only scan the body, not any unconnected other scripts + var names = [], + inputNames; + if (this.body) { + inputNames = this.inputNames(); + this.body.expression.forAllChildren(morph => { + var vName, + dec; + if (morph instanceof BlockMorph) { + vName = morph.getVarName(); + if (vName) { + dec = morph.rewind(true).find(elem => + elem.selector === 'reportGetVar' && + elem.isTemplate && + (elem.instantiationSpec || elem.blockSpec) === vName + ); + if (!dec && + !this.variableNames.includes(vName) && + !inputNames.includes(vName) && + !names.includes(vName) + ) { + names.push(vName); + } + } + } + }); + } + return names.sort(); +}; + +// CustomCommandBlockMorph ///////////////////////////////////////////// + +// CustomCommandBlockMorph inherits from CommandBlockMorph: + +CustomCommandBlockMorph.prototype = new CommandBlockMorph(); +CustomCommandBlockMorph.prototype.constructor = CustomCommandBlockMorph; +CustomCommandBlockMorph.uber = CommandBlockMorph.prototype; + +// CustomCommandBlockMorph shared settings: + +CustomCommandBlockMorph.prototype.isCustomBlock = true; + +// CustomCommandBlockMorph instance creation: + +function CustomCommandBlockMorph(definition, isProto) { + this.init(definition, isProto); +} + +CustomCommandBlockMorph.prototype.init = function (definition, isProto) { + this.definition = definition; // mandatory + this.semanticSpec = ''; + this.isGlobal = definition ? definition.isGlobal : false; + this.isPrototype = isProto || false; // optional + CustomCommandBlockMorph.uber.init.call(this); + if (isProto) { + this.isTemplate = true; + } + this.category = definition.category; + this.selector = 'evaluateCustomBlock'; + this.variables = null; + this.storedTranslations = null; // transient - only for "wishes" + this.initializeVariables(); + if (definition) { // needed for de-serializing + this.refresh(); + } +}; + +CustomCommandBlockMorph.prototype.reactToTemplateCopy = function () { + var def; + if (this.isPrototype) { + def = this.definition; + this.isPrototype = false; + this.setSpec(' '); + this.refresh(); + this.refreshDefaults(def); + } + CustomCommandBlockMorph.uber.reactToTemplateCopy.call(this); +}; + +CustomCommandBlockMorph.prototype.initializeVariables = function (oldVars) { + this.variables = new VariableFrame(); + if (!this.isGlobal) { + return; + } + this.definition.variableNames.forEach(name => { + var v = oldVars ? oldVars[name] : null; + this.variables.addVar( + name, + v instanceof Variable ? v.value : null + ); + }); +}; + +CustomCommandBlockMorph.prototype.refresh = function (aDefinition) { + var def = aDefinition || this.definition, + newSpec = this.isPrototype ? + def.spec : def.localizedSpec(), + oldInputs; + + this.semanticSpec = def.blockSpec(); + + // make sure local custom blocks don't hold on to a method. + // future performance optimization plan: + // null out the definition for local blocks here, + // and then cache them again when invoking them + if (!this.isGlobal && !this.isPrototype) { + this.definition = null; + } + + this.setCategory(def.category); + if (this.blockSpec !== newSpec) { + oldInputs = this.inputs(); + if (!this.zebraContrast) { + this.forceNormalColoring(); + } else { + this.fixBlockColor(); + } + this.setSpec(newSpec, def); + this.fixLabelColor(); + this.restoreInputs(oldInputs); + } else { // update all input slots' drop-downs + this.inputs().forEach((inp, i) => { + if (inp instanceof ArgMorph && + !(inp instanceof TemplateSlotMorph)) { + inp.isStatic = def.isIrreplaceableInputIdx(i); + inp.canBeEmpty = !inp.isStatic; + } + if (inp instanceof InputSlotMorph) { + inp.setChoices.apply(inp, def.inputOptionsOfIdx(i)); + } + }); + } + + // find unnamed upvars (indicated by non-breaking space) and label them + // to their internal definition (default). + // make sure to set the separator labels for variadic input slots + this.cachedInputs = null; + this.inputs().forEach((inp, idx) => { + if (inp instanceof TemplateSlotMorph && inp.contents() === '\xa0') { + inp.setContents(def.inputNames()[idx]); + } else if (inp instanceof MultiArgMorph) { + inp.setIrreplaceable(def.isIrreplaceableInputIdx(idx)); + inp.setInfix(def.separatorOfInputIdx(idx)); + } + }); + + // initialize block vars + // preserve values of unchanged variable names + if (this.isGlobal) { + this.initializeVariables(this.variables.vars); + } + + // make (double) sure I'm colored correctly + this.forceNormalColoring(); + this.fixBlockColor(null, true); +}; + +CustomCommandBlockMorph.prototype.restoreInputs = function (oldInputs) { + // try to restore my previous inputs when my spec has been changed + var newInputs = this.inputs(), + len = Math.max(oldInputs.length, newInputs.length), + scripts = this.parentThatIsA(ScriptsMorph), + old, + inp, + i; + + function preserve(item) { + // keep unused blocks around in the scripting area + if (item instanceof MultiArgMorph) { + return item.inputs().forEach(slot => preserve(slot)); + } else if (item instanceof CSlotMorph ) { + item = item.evaluate(); + } + if (item instanceof BlockMorph && scripts) { + scripts.add(item); + item.moveBy(new Point(20, 20)); + item.fixBlockColor(); + } + } + + if (this.isPrototype) {return; } + this.cachedInputs = null; + for (i = 0; i < len; i += 1) { + inp = newInputs[i]; + old = oldInputs[i]; + if (old instanceof ArgLabelMorph) { + old = old.argMorph(); + } + if (old instanceof ReporterBlockMorph && inp && + (!(inp instanceof TemplateSlotMorph))) { + this.replaceInput(inp, old.fullCopy()); + } else if (old instanceof InputSlotMorph && + inp instanceof InputSlotMorph) { + if (old.isEmptySlot()) { + inp.setContents(''); + } else { + inp.setContents(old.evaluate()); + } + } else if (old instanceof BooleanSlotMorph && + inp instanceof BooleanSlotMorph) { + inp.setContents(old.evaluate()); + } else if (old instanceof TemplateSlotMorph && + inp instanceof TemplateSlotMorph) { + inp.setContents(old.evaluate()); + } else if (old instanceof CSlotMorph && + inp instanceof CSlotMorph) { + inp.nestedBlock(old.evaluate()); + } else if (old instanceof MultiArgMorph && + inp instanceof MultiArgMorph && + (old.slotSpec === inp.slotSpec)) { + this.replaceInput(inp, old.fullCopy()); + } else { + preserve(old); + } + } + this.cachedInputs = null; +}; + +CustomCommandBlockMorph.prototype.refreshDefaults = function (definition) { + // fill my editable slots with the defaults specified in my definition + var inputs = this.inputs(), + idx = 0; + + inputs.forEach(inp => { + if (inp instanceof InputSlotMorph || inp instanceof BooleanSlotMorph) { + inp.setContents( + (definition || this.definition).defaultValueOfInputIdx(idx) + ); + } + idx += 1; + }); + this.cachedInputs = null; +}; + +CustomCommandBlockMorph.prototype.refreshPrototype = function () { + // create my label parts from my (edited) fragments only + var hat, + protoSpec, + frags = [], + myself = this, // CAUTION: myself changes its value in this method + words, + newFrag, + i = 0; + + if (!this.isPrototype) {return null; } + + hat = this.parentThatIsA(PrototypeHatBlockMorph); + + // remember the edited fragments + this.parts().forEach(part => { + if (!part.fragment.isDeleted) { + // take into consideration that a fragment may spawn others + // if it isn't an input label consisting of several words + if (part.fragment.type) { // marked as input, take label as is + frags.push(part.fragment); + } else { // not an input, devide into several non-input fragments + words = myself.definition.parseSpec( + part.fragment.labelString + ); + words.forEach(word => { + newFrag = part.fragment.copy(); + newFrag.labelString = word; + frags.push(newFrag); + }); + } + } + }); + + // remember the edited prototype spec, + // and prevent removing the last one + protoSpec = this.specFromFragments() || this.blockSpec; + + // update the prototype's type + // and possibly exchange 'this' for 'myself' + if (this instanceof CustomCommandBlockMorph + && ((hat.type === 'reporter') || (hat.type === 'predicate'))) { + myself = new CustomReporterBlockMorph( + this.definition, + hat.type === 'predicate', + true + ); + hat.replaceInput(this, myself); + } else if (this instanceof CustomReporterBlockMorph) { + if (hat.type === 'command') { + myself = new CustomCommandBlockMorph( + this.definition, + true + ); + hat.replaceInput(this, myself); + } else { + this.isPredicate = (hat.type === 'predicate'); + this.fixLayout(); + this.rerender(); + } + } + myself.setCategory(hat.blockCategory || 'other'); + hat.fixBlockColor(); + + // update the (new) prototype's appearance + myself.setSpec(protoSpec); + + // update the (new) prototype's (new) fragments + // with the previously edited ones + + myself.parts().forEach(part => { + if (!(part instanceof BlockLabelPlaceHolderMorph)) { + if (frags[i]) { // don't delete the default fragment + part.fragment = frags[i]; + } + i += 1; + } + }); + + // refresh slot type indicators + this.refreshPrototypeSlotTypes(); + + hat.fixLayout(); +}; + +CustomCommandBlockMorph.prototype.refreshPrototypeSlotTypes = function () { + this.parts().forEach(part => { + if (part instanceof BlockInputFragmentMorph) { + part.template().instantiationSpec = part.contents(); + part.setContents(part.fragment.defTemplateSpecFragment()); + } + }); + this.fixBlockColor(null, true); // enforce zebra coloring of templates +}; + + +CustomCommandBlockMorph.prototype.inputFragmentNames = function () { + // for the variable name slot drop-down menu (in the block editor) + var ans = []; + + this.parts().forEach(part => { + if (!part.fragment.isDeleted && (part.fragment.type)) { + ans.push(part.fragment.labelString); + } + }); + return ans; +}; + +CustomCommandBlockMorph.prototype.upvarFragmentNames = function () { + // for the variable name slot drop-down menu (in the block editor) + var ans = []; + + this.parts().forEach(part => { + if (!part.fragment.isDeleted && (part.fragment.type === '%upvar')) { + ans.push(part.fragment.labelString); + } + }); + return ans; +}; + +CustomCommandBlockMorph.prototype.upvarFragmentName = function (idx) { + // for block prototypes while they are being edited + return this.upvarFragmentNames()[idx] || '\u2191'; +}; + +CustomCommandBlockMorph.prototype.specFromFragments = function () { + // for block prototypes while they are being edited + var ans = ''; + + this.parts().forEach(part => { + if (!part.fragment.isDeleted) { + ans = ans + part.fragment.defSpecFragment() + ' '; + } + }); + return ans.trim(); +}; + +CustomCommandBlockMorph.prototype.blockSpecFromFragments = function () { + // for block instances while their prototype is being edited + var ans = ''; + + this.parts().forEach(part => { + if (!part.fragment.isDeleted) { + ans = ans + part.fragment.blockSpecFragment() + ' '; + } + }); + return ans.trim(); +}; + +CustomCommandBlockMorph.prototype.declarationsFromFragments = function () { + // returns a Map object for type declarations: + // key: inputName + // value: [type, default, options, isReadOnly] + var ans = new Map(); + + this.parts().forEach(part => { + if (part instanceof BlockInputFragmentMorph) { + ans.set( + part.fragment.labelString, + [ + part.fragment.type, + part.fragment.defaultValue, + part.fragment.options, + part.fragment.isReadOnly, + part.fragment.isIrreplaceable, + part.fragment.separator + ] + ); + } + }); + return ans; +}; + +CustomCommandBlockMorph.prototype.parseSpec = function (spec) { + if (!this.isPrototype) { + return CustomCommandBlockMorph.uber.parseSpec.call(this, spec); + } + return CustomBlockDefinition.prototype.parseSpec(spec); +}; + +CustomCommandBlockMorph.prototype.mouseClickLeft = function () { + if (!this.isPrototype) { + return CustomCommandBlockMorph.uber.mouseClickLeft.call(this); + } + this.edit(); +}; + +CustomCommandBlockMorph.prototype.edit = function () { + var def = this.definition, + editor, block, + hat, + rcvr; + + if (this.isPrototype) { + block = this.definition.blockInstance(); + block.addShadow(); + hat = this.parentThatIsA(PrototypeHatBlockMorph); + new BlockDialogMorph( + null, + (definition) => { + if (definition) { // temporarily update everything + hat.blockCategory = definition.category; + hat.type = definition.type; + this.refreshPrototype(); + } + }, + this + ).openForChange( + 'Change block', + hat.blockCategory, + hat.type, + this.world(), + block.doWithAlpha(1, () => block.fullImage()), + this.isInUse() + ); + } else { + // check for local custom block inheritance + rcvr = this.scriptTarget(); + if (!this.isGlobal) { + if (contains( + Object.keys(rcvr.inheritedBlocks()), + this.blockSpec + ) + ) { + this.duplicateBlockDefinition(); + return; + } + def = rcvr.getMethod(this.semanticSpec); + } + editor = new BlockEditorMorph(def, rcvr); + editor.popUp(); + editor.changed(); + } +}; + +CustomCommandBlockMorph.prototype.labelPart = function (spec) { + if (!this.isPrototype) { + return CustomCommandBlockMorph.uber.labelPart.call(this, spec); + } + if ((spec[0] === '%') && (spec.length > 1)) { + // return new BlockInputFragmentMorph(spec.slice(1)); + return new BlockInputFragmentMorph(spec.replace(/%/g, '')); + } + return new BlockLabelFragmentMorph( + spec, + CustomCommandBlockMorph.uber.labelPart.call(this, spec) + ); +}; + +CustomCommandBlockMorph.prototype.placeHolder = function () { + var part; + + part = new BlockLabelPlaceHolderMorph(); + part.fontSize = this.fontSize * 1.4; + part.color = new Color(45, 45, 45); + part.fixLayout(); + return part; +}; + +CustomCommandBlockMorph.prototype.attachTargets = function () { + if (this.isPrototype) { + return []; + } + return CustomCommandBlockMorph.uber.attachTargets.call(this); +}; + +CustomCommandBlockMorph.prototype.isInUse = function () { + // answer true if an instance of my definition is found + // in any of my receiver's scripts or block definitions + // NOTE: for sprite-local blocks only to be used in a situation + // where the user actively clicks on a block in the IDE, + // e.g. to edit it (and change its type) + var def = this.definition, + rcvr = this.scriptTarget(), + ide = rcvr.parentThatIsA(IDE_Morph); + if (def.isGlobal && ide) { + return ide.sprites.asArray().concat([ide.stage]).some((any, idx) => + any.usesBlockInstance(def, false, idx) + ); + } + return rcvr.allDependentInvocationsOf(this.blockSpec).length > 0; +}; + +// CustomCommandBlockMorph menu: + +CustomCommandBlockMorph.prototype.userMenu = function () { + var hat = this.parentThatIsA(PrototypeHatBlockMorph), + rcvr = this.scriptTarget(), + myself = this, + // shiftClicked = this.world().currentKey === 16, + dlg, menu; + + function addOption(label, toggle, test, onHint, offHint) { + menu.addItem( + [ + test ? new SymbolMorph( + 'checkedBox', + MorphicPreferences.menuFontSize * 0.75 + ) : new SymbolMorph( + 'rectangle', + MorphicPreferences.menuFontSize * 0.75 + ), + localize(label) + ], + toggle, + test ? onHint : offHint + ); + } + + function monitor(vName) { + var stage = rcvr.parentThatIsA(StageMorph), + varFrame = myself.variables; + menu.addItem( + vName + '...', + function () { + var watcher = detect( + stage.children, + function (morph) { + return morph instanceof WatcherMorph + && morph.target === varFrame + && morph.getter === vName; + } + ), + others; + if (watcher !== null) { + watcher.show(); + watcher.fixLayout(); // re-hide hidden parts + return; + } + watcher = new WatcherMorph( + vName + ' ' + localize('(temporary)'), + SpriteMorph.prototype.blockColor.variables, + varFrame, + vName + ); + watcher.setPosition(stage.position().add(10)); + others = stage.watchers(watcher.left()); + if (others.length > 0) { + watcher.setTop(others[others.length - 1].bottom()); + } + stage.add(watcher); + watcher.fixLayout(); + } + ); + } + + if (this.isPrototype) { + menu = new MenuMorph(this); + menu.addItem( + "script pic...", + function () { + var ide = this.world().children[0], + top = this.topBlock(), + xml = ide.blocksLibraryXML( + [top.definition].concat( + top.definition.collectDependencies( + [], + [], + top.scriptTarget() + ) + ), + null, + true + ); + ide.saveFileAs( + embedMetadataPNG(top.scriptPic(), xml), + 'image/png', + (ide.getProjectName() || localize('untitled')) + ' ' + + localize('script pic') + ); + }, + 'save a picture\nof this script' + ); + menu.addItem( + "translations...", + function () { + hat.parentThatIsA(BlockEditorMorph).editTranslations(); + } + ); + if (this.isGlobal) { + if (hat.inputs().length < 2) { + menu.addItem( + "block variables...", + function () { + hat.enableBlockVars(); + } + ); + } else { + menu.addItem( + "remove block variables...", + function () { + hat.enableBlockVars(false); + } + ); + } + } + addOption( + 'in palette', + () => hat.isHelper = !hat.isHelper, + !hat.isHelper, + 'uncheck to\nhide in palette', + 'check to\nshow in palette' + ); + menu.addItem( + "export...", + () => hat.exportBlockDefinition(), + 'including dependencies' + ); + } else { + menu = this.constructor.uber.userMenu.call(this); + if (rcvr.parentThatIsA(IDE_Morph).config.noOwnBlocks) { + return menu; + } + dlg = this.parentThatIsA(DialogBoxMorph); + if (dlg && !(dlg instanceof BlockEditorMorph)) { + return menu; + } + if (!menu) { + menu = new MenuMorph(this); + } else { + menu.addLine(); + } + if (this.isTemplate) { // inside the palette + if (this.isGlobal) { + menu.addItem( + "delete block definition...", + 'deleteBlockDefinition' + ); + } else { // local method + if (contains( + Object.keys(rcvr.inheritedBlocks()), + this.blockSpec + )) { + // inherited + addOption( + 'inherited', + function () { + var ide = myself.parentThatIsA(IDE_Morph); + rcvr.customBlocks.push( + rcvr.getMethod( + myself.blockSpec + ).copyAndBindTo(rcvr) + ); + if (ide) { + ide.flushPaletteCache(); + ide.refreshPalette(); + } + }, + true, + 'uncheck to\ndisinherit', + null + ); + } else if (rcvr.exemplar && + rcvr.exemplar.getMethod(this.blockSpec + )) { + // shadowed + addOption( + 'inherited', + 'deleteBlockDefinition', + false, + null, + localize('check to inherit\nfrom') + + ' ' + rcvr.exemplar.name + ); + } else { + // own block + menu.addItem( + "delete block definition...", + 'deleteBlockDefinition' + ); + } + } + menu.addItem( + "duplicate block definition...", + 'duplicateBlockDefinition' + ); + menu.addItem( + "export block definition...", + 'exportBlockDefinition', + 'including dependencies' + ); + } else { // inside a script + // if global or own method - let the user delete the definition + if (this.isGlobal || + contains( + Object.keys(rcvr.ownBlocks()), + this.blockSpec + ) + ) { + menu.addItem( + "delete block definition...", + 'deleteBlockDefinition' + ); + } + } + + this.variables.names().forEach(vName => + monitor(vName) + ); + } + menu.addItem("edit...", 'edit'); // works also for prototypes + return menu; +}; + +CustomCommandBlockMorph.prototype.exportBlockDefinition = function () { + var rcvr = this.scriptTarget(), + ide = rcvr.parentThatIsA(IDE_Morph), + def = this.isGlobal || this instanceof PrototypeHatBlockMorph ? + this.definition + : rcvr.getMethod(this.blockSpec); + new BlockExportDialogMorph( + ide.serializer, + [def].concat(def.collectDependencies([], [], rcvr)), + ide + ).popUp(this.world()); +}; + +CustomCommandBlockMorph.prototype.duplicateBlockDefinition = function () { + var rcvr = this.scriptTarget(), + ide = this.parentThatIsA(IDE_Morph), + def = this.isGlobal ? this.definition : rcvr.getMethod(this.blockSpec), + dup = def.copyAndBindTo(rcvr), + spec = dup.spec, + exp = dup.body? dup.body.expression : null, + count = 1; + + function rebindRecursiveCalls(topBlock) { + topBlock.forAllChildren(morph => { + if (morph.definition === def) { + morph.definition = dup; + morph.refresh(); + } + }); + } + + if (this.isGlobal) { + ide.stage.globalBlocks.push(dup); + } else { + rcvr.customBlocks.push(dup); + } + + // find a unique spec + while (rcvr.doubleDefinitionsFor(dup).length > 0) { + count += 1; + dup.spec = spec + ' (' + count + ')'; + } + + // rebind recursive calls + dup.scripts.forEach(script => rebindRecursiveCalls(script)); + if (exp instanceof BlockMorph) { + rebindRecursiveCalls(exp); + } + + + ide.flushPaletteCache(); + ide.refreshPalette(); + rcvr.recordUserEdit( + 'palette', + 'custom block', + this.isGlobal ? 'global' : 'local', + 'duplicate definition', + dup.abstractBlockSpec() + ); + new BlockEditorMorph(dup, rcvr).popUp(); +}; + +CustomCommandBlockMorph.prototype.deleteBlockDefinition = function () { + var idx, stage, ide, method, block, + rcvr = this.scriptTarget(); + if (this.isPrototype) { + return null; // under construction... + } + method = this.isGlobal? this.definition + : rcvr.getLocalMethod(this.blockSpec); + block = method.blockInstance(); + new DialogBoxMorph( + this, + () => { + rcvr.deleteAllBlockInstances(method); + if (method.isGlobal) { + stage = rcvr.parentThatIsA(StageMorph); + idx = stage.globalBlocks.indexOf(method); + if (idx !== -1) { + stage.globalBlocks.splice(idx, 1); + } + } else { + // delete local definition + idx = rcvr.customBlocks.indexOf(method); + if (idx !== -1) { + rcvr.customBlocks.splice(idx, 1); + } + // refresh instances of inherited method, if any + method = rcvr.getMethod(this.blockSpec); + if (method) { + rcvr.allDependentInvocationsOf(this.blockSpec).forEach( + block => block.refresh(method) + ); + } + } + ide = rcvr.parentThatIsA(IDE_Morph); + if (ide) { + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + } + rcvr.recordUserEdit( + 'palette', + 'custom block', + this.isGlobal ? 'global' : 'local', + 'delete definition', + this.abstractBlockSpec() + ); + }, + this + ).askYesNo( + 'Delete Custom Block', + localize('block deletion dialog text'), // long string lookup + this.world(), + block.doWithAlpha( + 1, + () => { + block.addShadow(); + return block.fullImage(); + } + ) + ); +}; + +// CustomCommandBlockMorph relabelling + +CustomCommandBlockMorph.prototype.relabel = function (alternatives) { + var menu = new MenuMorph(this), + oldSpec = this.abstractBlockSpec(), + oldInputs = this.inputs().map(each => each.fullCopy()); + alternatives.forEach(def => { + var block = def.blockInstance(); + block.restoreInputs(oldInputs); + block.fixBlockColor(null, true); + block.addShadow(new Point(3, 3)); + menu.addItem( + block.doWithAlpha(1, () => block.fullImage()), + () => { + this.definition = def; + this.isGlobal = def.isGlobal; + this.refresh(); + this.fixLayout(); + this.scriptTarget().recordUserEdit( + 'scripts', + 'block', + 'relabel', + oldSpec, + this.abstractBlockSpec() + ); + } + ); + }); + menu.popup(this.world(), this.bottomLeft().subtract(new Point( + 8, + this instanceof CommandBlockMorph ? this.corner : 0 + ))); +}; + +CustomCommandBlockMorph.prototype.alternatives = function () { + var rcvr = this.scriptTarget(), + stage = rcvr.parentThatIsA(StageMorph), + allDefs = rcvr.customBlocks.concat(stage.globalBlocks), + type = this instanceof CommandBlockMorph ? 'command' + : (this.isPredicate ? 'predicate' : 'reporter'); + return allDefs.filter(each => + each !== this.definition && each.type === type && !each.isHelper + ); +}; + +// CustomReporterBlockMorph //////////////////////////////////////////// + +// CustomReporterBlockMorph inherits from ReporterBlockMorph: + +CustomReporterBlockMorph.prototype = new ReporterBlockMorph(); +CustomReporterBlockMorph.prototype.constructor = CustomReporterBlockMorph; +CustomReporterBlockMorph.uber = ReporterBlockMorph.prototype; + +// CustomReporterBlockMorph shared settings: + +CustomReporterBlockMorph.prototype.isCustomBlock = true; + +// CustomReporterBlockMorph instance creation: + +function CustomReporterBlockMorph(definition, isPredicate, isProto) { + this.init(definition, isPredicate, isProto); +} + +CustomReporterBlockMorph.prototype.init = function ( + definition, + isPredicate, + isProto +) { + this.definition = definition; // mandatory + this.semanticSpec = ''; // used for translations + this.isGlobal = definition ? definition.isGlobal : false; + this.isPrototype = isProto || false; // optional + CustomReporterBlockMorph.uber.init.call(this, isPredicate, true); // sil. + if (isProto) { + this.isTemplate = true; + } + this.category = definition.category; + this.storedTranslations = null; // transient - only for "wishes" + this.variables = new VariableFrame(); + this.initializeVariables(); + this.selector = 'evaluateCustomBlock'; + if (definition) { // needed for de-serializing + this.refresh(); + } +}; + +CustomReporterBlockMorph.prototype.initializeVariables = + CustomCommandBlockMorph.prototype.initializeVariables; + +CustomReporterBlockMorph.prototype.reactToTemplateCopy = + CustomCommandBlockMorph.prototype.reactToTemplateCopy; + +CustomReporterBlockMorph.prototype.refresh = function (aDefinition) { + var def = aDefinition || this.definition; + CustomCommandBlockMorph.prototype.refresh.call(this, aDefinition, true); + if (!this.isPrototype) { + this.isPredicate = (def.type === 'predicate'); + } + if (this.parent instanceof SyntaxElementMorph) { + this.parent.cachedInputs = null; + } + this.fixLayout(); +}; + +CustomReporterBlockMorph.prototype.mouseClickLeft = function () { + if (!this.isPrototype) { + return CustomReporterBlockMorph.uber.mouseClickLeft.call(this); + } + this.edit(); +}; + +CustomReporterBlockMorph.prototype.placeHolder + = CustomCommandBlockMorph.prototype.placeHolder; + +CustomReporterBlockMorph.prototype.parseSpec + = CustomCommandBlockMorph.prototype.parseSpec; + +CustomReporterBlockMorph.prototype.edit + = CustomCommandBlockMorph.prototype.edit; + +CustomReporterBlockMorph.prototype.labelPart + = CustomCommandBlockMorph.prototype.labelPart; + +CustomReporterBlockMorph.prototype.upvarFragmentNames + = CustomCommandBlockMorph.prototype.upvarFragmentNames; + +CustomReporterBlockMorph.prototype.upvarFragmentName + = CustomCommandBlockMorph.prototype.upvarFragmentName; + +CustomReporterBlockMorph.prototype.inputFragmentNames + = CustomCommandBlockMorph.prototype.inputFragmentNames; + +CustomReporterBlockMorph.prototype.specFromFragments + = CustomCommandBlockMorph.prototype.specFromFragments; + +CustomReporterBlockMorph.prototype.blockSpecFromFragments + = CustomCommandBlockMorph.prototype.blockSpecFromFragments; + +CustomReporterBlockMorph.prototype.declarationsFromFragments + = CustomCommandBlockMorph.prototype.declarationsFromFragments; + +CustomReporterBlockMorph.prototype.refreshPrototype + = CustomCommandBlockMorph.prototype.refreshPrototype; + +CustomReporterBlockMorph.prototype.refreshPrototypeSlotTypes + = CustomCommandBlockMorph.prototype.refreshPrototypeSlotTypes; + +CustomReporterBlockMorph.prototype.restoreInputs + = CustomCommandBlockMorph.prototype.restoreInputs; + +CustomReporterBlockMorph.prototype.refreshDefaults + = CustomCommandBlockMorph.prototype.refreshDefaults; + +CustomReporterBlockMorph.prototype.isInUse + = CustomCommandBlockMorph.prototype.isInUse; + +// CustomReporterBlockMorph menu: + +CustomReporterBlockMorph.prototype.userMenu + = CustomCommandBlockMorph.prototype.userMenu; + +CustomReporterBlockMorph.prototype.duplicateBlockDefinition + = CustomCommandBlockMorph.prototype.duplicateBlockDefinition; + +CustomReporterBlockMorph.prototype.deleteBlockDefinition + = CustomCommandBlockMorph.prototype.deleteBlockDefinition; + +CustomReporterBlockMorph.prototype.exportBlockDefinition + = CustomCommandBlockMorph.prototype.exportBlockDefinition; + +// CustomReporterBlockMorph events: + +// hover help - commented out for now +/* +CustomReporterBlockMorph.prototype.mouseEnter + = CustomCommandBlockMorph.prototype.mouseEnter; + +CustomReporterBlockMorph.prototype.mouseLeave + = CustomCommandBlockMorph.prototype.mouseLeave; +*/ + +// CustomReporterBlockMorph bubble help: + +CustomReporterBlockMorph.prototype.bubbleHelp + = CustomCommandBlockMorph.prototype.bubbleHelp; + +CustomReporterBlockMorph.prototype.popUpbubbleHelp + = CustomCommandBlockMorph.prototype.popUpbubbleHelp; + +// CustomReporterBlockMorph relabelling + +CustomReporterBlockMorph.prototype.relabel + = CustomCommandBlockMorph.prototype.relabel; + +CustomReporterBlockMorph.prototype.alternatives + = CustomCommandBlockMorph.prototype.alternatives; + +// JaggedBlockMorph //////////////////////////////////////////////////// + +/* + I am a reporter block with jagged left and right edges conveying the + appearance of having the broken out of a bigger block. I am used to + display input types in the long form input dialog. +*/ + +// JaggedBlockMorph inherits from ReporterBlockMorph: + +JaggedBlockMorph.prototype = new ReporterBlockMorph(); +JaggedBlockMorph.prototype.constructor = JaggedBlockMorph; +JaggedBlockMorph.uber = ReporterBlockMorph.prototype; + +// JaggedBlockMorph instance creation: + +function JaggedBlockMorph(spec) { + this.init(spec); +} + +JaggedBlockMorph.prototype.init = function (spec) { + JaggedBlockMorph.uber.init.call(this); + if (spec) {this.setSpec(spec); } + if (spec === '%cs' || (spec === '%ca')) { + this.minWidth = 25; + this.fixLayout(); + } +}; + +// JaggedBlockMorph drawing: + +JaggedBlockMorph.prototype.outlinePath = function (ctx, inset) { + var w = this.width(), + h, + jags, + delta, + pos = this.position(), + y = 0, + i; + + ctx.moveTo(inset, inset); + ctx.lineTo(w - inset, inset); + + // C-Slots + this.cSlots().forEach(slot => { + slot.outlinePath(ctx, inset, slot.position().subtract(pos)); + y += slot.height(); + }); + + h = this.height() - y - inset; + jags = Math.round(h / this.jag); + delta = h / jags; + + // y = 0; + for (i = 0; i < jags; i += 1) { + y += delta / 2; + ctx.lineTo(w - this.jag / 2 - inset, y); + y += delta / 2; + ctx.lineTo(w - inset, y); + } + + h = this.height() - inset; + jags = Math.round(h / this.jag); + delta = h / jags; + + ctx.lineTo(inset, h - inset); + y = h; + for (i = 0; i < jags; i += 1) { + y -= delta / 2; + ctx.lineTo(this.jag / 2 + inset, y); + y -= delta / 2; + ctx.lineTo(inset, y); + } +}; + +JaggedBlockMorph.prototype.drawEdges = function (ctx) { + var w = this.width(), + h = this.height(), + jags = Math.round(h / this.jag), + delta = h / jags, + shift = this.edge / 2, + gradient, + i, + y; + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(shift, shift); + ctx.lineTo(w - shift, shift); + ctx.stroke(); + + if (!this.cSlots().length) { // omit right jagged outline for c-slots + y = 0; + for (i = 0; i < jags; i += 1) { + ctx.strokeStyle = this.cachedClrDark; + ctx.beginPath(); + ctx.moveTo(w - shift, y); + y += delta / 2; + ctx.lineTo(w - this.jag / 2 - shift, y); + ctx.stroke(); + y += delta / 2; + } + } + + gradient = ctx.createLinearGradient( + 0, + h - this.edge, + 0, + h + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - shift, h - shift); + ctx.lineTo(shift, h - shift); + ctx.stroke(); + + y = h; + for (i = 0; i < jags; i += 1) { + ctx.strokeStyle = this.cachedClrBright; + ctx.beginPath(); + ctx.moveTo(shift, y); + y -= delta / 2; + ctx.lineTo(this.jag / 2 + shift, y); + ctx.stroke(); + y -= delta / 2; + } +}; + +// BlockDialogMorph //////////////////////////////////////////////////// + +// BlockDialogMorph inherits from DialogBoxMorph: + +BlockDialogMorph.prototype = new DialogBoxMorph(); +BlockDialogMorph.prototype.constructor = BlockDialogMorph; +BlockDialogMorph.uber = DialogBoxMorph.prototype; + +// BlockDialogMorph instance creation: + +function BlockDialogMorph(target, action, environment) { + this.init(target, action, environment); +} + +BlockDialogMorph.prototype.init = function (target, action, environment) { + // additional properties: + this.blockType = 'command'; + this.category = 'other'; + this.isGlobal = true; + this.types = null; + this.categories = null; + + // initialize inherited properties: + BlockDialogMorph.uber.init.call( + this, + target, + action, + environment + ); + + // override inherited properites: + this.key = 'makeABlock'; + + this.types = new AlignmentMorph('row', this.padding); + this.add(this.types); + this.scopes = new AlignmentMorph('row', this.padding); + this.add(this.scopes); + + this.categories = new BoxMorph(); + this.categories.color = SpriteMorph.prototype.paletteColor.lighter(8); + this.categories.borderColor = this.categories.color.lighter(40); + this.categories.buttons = []; + + this.categories.refresh = function () { + this.buttons.forEach(cat => { + cat.refresh(); + if (cat.state) { + cat.scrollIntoView(); + } + }); + }; + + this.createCategoryButtons(); + this.fixCategoriesLayout(); + this.add(this.categories); + + this.createTypeButtons(); + this.createScopeButtons(); + this.fixLayout(); +}; + +BlockDialogMorph.prototype.openForChange = function ( + title, + category, + type, + world, + pic, + preventTypeChange // +) { + var clr = SpriteMorph.prototype.blockColorFor(category); + this.key = 'changeABlock'; + this.category = category; + this.blockType = type; + + this.categories.refresh(); + this.types.children.forEach(each => { + each.setColor(clr); + each.refresh(); + }); + + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + if (preventTypeChange) { + this.types.destroy(); + this.types = null; + } + this.scopes.destroy(); + this.scopes = null; + this.fixLayout(); + this.rerender(); + this.popUp(world); +}; + +// category buttons + +BlockDialogMorph.prototype.createCategoryButtons = function () { + SpriteMorph.prototype.categories.forEach(cat => + this.addCategoryButton(cat) + ); + + // sort alphabetically + Array.from( + SpriteMorph.prototype.customCategories.keys() + ).sort().forEach(name => + this.addCustomCategoryButton( + name, + SpriteMorph.prototype.customCategories.get(name) + ) + ); +}; + +BlockDialogMorph.prototype.addCategoryButton = function (category) { + var labelWidth = 75, + colors = [ + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor.darker + (MorphicPreferences.isFlat ? 5 : 50 + ), + SpriteMorph.prototype.blockColorFor(category) + ], + button; + + button = new ToggleButtonMorph( + colors, + this, // this block dialog box is the target + () => { + this.category = category; + this.categories.refresh(); + if (this.types) { + this.types.children.forEach(each => + each.setColor(colors[2]) + ); + } + this.edit(); + }, + category[0].toUpperCase().concat(category.slice(1)), // UCase label + () => this.category === category, // query + null, // env + null, // hint + labelWidth, // minWidth + true // has preview + ); + + button.corner = 8; + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = IDE_Morph.prototype.buttonLabelColor; + if (MorphicPreferences.isFlat) { + button.labelPressColor = WHITE; + } + button.contrast = this.buttonContrast; + button.fixLayout(); + button.refresh(); + this.categories.add(button); + this.categories.buttons.push(button); + return button; +}; + +BlockDialogMorph.prototype.addCustomCategoryButton = function (category, clr) { + var labelWidth = 172, + colors = [ + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor.darker + (MorphicPreferences.isFlat ? 5 : 50 + ), + clr + ], + button; + + button = new ToggleButtonMorph( + colors, + this, // this block dialog box is the target + () => { + this.category = category; + this.categories.refresh(); + if (this.types) { + this.types.children.forEach(each => + each.setColor(colors[2]) + ); + } + this.edit(); + }, + category, // UCase label + () => this.category === category, // query + null, // env + null, // hint + labelWidth, // minWidth + true // has preview + ); + + button.corner = 8; + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = IDE_Morph.prototype.buttonLabelColor; + if (MorphicPreferences.isFlat) { + button.labelPressColor = WHITE; + } + button.contrast = this.buttonContrast; + button.fixLayout(); + button.refresh(); + this.categories.add(button); + this.categories.buttons.push(button); + return button; +}; + +BlockDialogMorph.prototype.fixCategoriesLayout = function () { + var buttonWidth = this.categories.children[0].width(), // all the same + buttonHeight = this.categories.children[0].height(), // all the same + more = SpriteMorph.prototype.customCategories.size, + xPadding = 15, + yPadding = 2, + border = 10, // this.categories.border, + l = this.categories.left(), + t = this.categories.top(), + scroller, + row, + col, + i; + + this.categories.setWidth( + 3 * xPadding + 2 * buttonWidth + ); + + this.categories.children.forEach((button, i) => { + if (i < 8) { + row = i % 4; + col = Math.ceil((i + 1) / 4); + } else if (i < 10) { + row = 4; + col = 3 - (10 - i); + } else { + row = i - 5; + col = 1; + } + button.setPosition(new Point( + l + (col * xPadding + ((col - 1) * buttonWidth)), + t + ((row + 1) * yPadding + (row * buttonHeight) + border) + + (i > 9 ? border / 2 : 0) + )); + }); + + if (MorphicPreferences.isFlat) { + this.categories.corner = 0; + this.categories.border = 0; + this.categories.edge = 0; + } + + if (more > 6) { + scroller = new ScrollFrameMorph( + null, + null, + SpriteMorph.prototype.sliderColor.lighter() + ); + scroller.setColor(this.categories.color); + scroller.acceptsDrops = false; + scroller.contents.acceptsDrops = false; + scroller.setPosition( + new Point( + this.categories.left() + this.categories.border, + this.categories.children[10].top() + ) + ); + scroller.setWidth(this.categories.width() - this.categories.border * 2); + scroller.setHeight(buttonHeight * 6 + yPadding * 5); + + for (i = 0; i < more; i += 1) { + scroller.addContents(this.categories.children[10]); + } + this.categories.add(scroller); + this.categories.setHeight( + (5 + 1) * yPadding + + 5 * buttonHeight + + 6 * (yPadding + buttonHeight) + border + 2 + + 2 * border + ); + } else { + this.categories.setHeight( + (5 + 1) * yPadding + + 5 * buttonHeight + + (more ? (more * (yPadding + buttonHeight) + border / 2) : 0) + + 2 * border + ); + } +}; + +// type radio buttons + +BlockDialogMorph.prototype.createTypeButtons = function () { + var block, + clr = SpriteMorph.prototype.blockColorFor(this.category); + + + block = new CommandBlockMorph(); + block.setColor(clr); + block.setSpec(localize('Command')); + this.addBlockTypeButton( + () => this.setType('command'), + block, + () => this.blockType === 'command' + ); + + block = new ReporterBlockMorph(); + block.setColor(clr); + block.setSpec(localize('Reporter')); + this.addBlockTypeButton( + () => this.setType('reporter'), + block, + () => this.blockType === 'reporter' + ); + + block = new ReporterBlockMorph(true); + block.setColor(clr); + block.setSpec(localize('Predicate')); + this.addBlockTypeButton( + () => this.setType('predicate'), + block, + () => this.blockType === 'predicate' + ); +}; + +BlockDialogMorph.prototype.addBlockTypeButton = function ( + action, + element, + query +) { + var button = new ToggleElementMorph( + this, + action, + element, + query, + null, + null, + 'rebuild' + ); + button.refresh(); + button.fixLayout(); + this.types.add(button); + return button; +}; + +BlockDialogMorph.prototype.addTypeButton = function (action, label, query) { + var button = new ToggleMorph( + 'radiobutton', + this, + action, + label, + query + ); + button.edge = this.buttonEdge / 2; + button.outline = this.buttonOutline / 2; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + button.contrast = this.buttonContrast; + + button.fixLayout(); + this.types.add(button); + return button; +}; + +BlockDialogMorph.prototype.setType = function (blockType) { + this.blockType = blockType || this.blockType; + this.types.children.forEach(c => c.refresh()); + this.edit(); +}; + +// scope radio buttons + +BlockDialogMorph.prototype.createScopeButtons = function () { + this.addScopeButton( + () => this.setScope('global'), + "for all sprites", + () => this.isGlobal + ); + this.addScopeButton( + () => this.setScope('local'), + "for this sprite only", + () => !this.isGlobal + ); +}; + +BlockDialogMorph.prototype.addScopeButton = function (action, label, query) { + var button = new ToggleMorph( + 'radiobutton', + this, + action, + label, + query + ); + button.edge = this.buttonEdge / 2; + button.outline = this.buttonOutline / 2; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + button.contrast = this.buttonContrast; + + button.fixLayout(); + this.scopes.add(button); + return button; +}; + + +BlockDialogMorph.prototype.setScope = function (varType) { + this.isGlobal = (varType === 'global'); + this.scopes.children.forEach(c => c.refresh()); + this.edit(); +}; + +// other ops + +BlockDialogMorph.prototype.getInput = function () { + var spec, def, body; + if (this.body instanceof InputFieldMorph) { + spec = this.normalizeSpaces(this.body.getValue()); + } + def = new CustomBlockDefinition(spec); + def.type = this.blockType; + def.category = this.category; + def.isGlobal = this.isGlobal; + if (def.type === 'reporter' || def.type === 'predicate') { + body = Process.prototype.reify.call( + null, + SpriteMorph.prototype.blockForSelector('doReport'), + new List(), + true // ignore empty slots for custom block reification + ); + body.outerContext = null; + def.body = body; + } + return def; +}; + +BlockDialogMorph.prototype.fixLayout = function () { + var th = fontHeight(this.titleFontSize) + this.titlePadding * 2; + + if (this.body) { + this.body.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.bounds.setWidth(this.body.width() + this.padding * 2); + this.bounds.setHeight( + this.body.height() + + this.padding * 2 + + th + ); + if (this.categories) { + this.categories.setCenter(this.body.center()); + this.categories.setTop(this.body.top()); + this.body.setTop(this.categories.bottom() + this.padding); + this.bounds.setHeight( + this.height() + + this.categories.height() + + this.padding + ); + } + } else if (this.head) { // when changing an existing prototype + if (this.types) { + this.types.fixLayout(); + this.bounds.setWidth( + Math.max(this.types.width(), this.head.width()) + + this.padding * 2 + ); + } else { + this.bounds.setWidth( + Math.max(this.categories.width(), this.head.width()) + + this.padding * 2 + ); + } + this.head.setCenter(this.center()); + this.head.setTop(th + this.padding); + this.bounds.setHeight( + this.head.height() + + this.padding * 2 + + th + ); + if (this.categories) { + this.categories.setCenter(this.center()); + this.categories.setTop(this.head.bottom() + this.padding); + this.bounds.setHeight( + this.height() + + this.categories.height() + + this.padding + ); + } + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + } + + if (this.types) { + this.types.fixLayout(); + this.bounds.setHeight( + this.height() + + this.types.height() + + this.padding + ); + this.bounds.setWidth(Math.max( + this.width(), + this.types.width() + this.padding * 2 + )); + this.types.setCenter(this.center()); + if (this.body) { + this.types.setTop(this.body.bottom() + this.padding); + } else if (this.categories) { + this.types.setTop(this.categories.bottom() + this.padding); + } + } + + if (this.scopes) { + this.scopes.fixLayout(); + this.bounds.setHeight( + this.height() + + this.scopes.height() + + (this.padding / 3) + ); + this.bounds.setWidth(Math.max( + this.width(), + this.scopes.width() + this.padding * 2 + )); + this.scopes.setCenter(this.center()); + if (this.types) { + this.scopes.setTop(this.types.bottom() + (this.padding / 3)); + } + } + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.fixLayout(); + this.bounds.setHeight( + this.height() + + this.buttons.height() + + this.padding + ); + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh a shallow shadow + this.removeShadow(); + this.addShadow(); +}; + +BlockDialogMorph.prototype.accept = function () { + if ((this.body instanceof InputFieldMorph) && + (this.normalizeSpaces(this.body.getValue()) === '')) { + this.edit(); + } else { + BlockDialogMorph.uber.accept.call(this); + } +}; + +// BlockEditorMorph //////////////////////////////////////////////////// + +// BlockEditorMorph inherits from DialogBoxMorph: + +BlockEditorMorph.prototype = new DialogBoxMorph(); +BlockEditorMorph.prototype.constructor = BlockEditorMorph; +BlockEditorMorph.uber = DialogBoxMorph.prototype; + +// BlockEditorMorph instance creation: + +function BlockEditorMorph(definition, target) { + this.init(definition, target); +} + +BlockEditorMorph.prototype.init = function (definition, target) { + var scripts, proto, scriptsFrame, block, comment, + isLive = Process.prototype.enableLiveCoding || + Process.prototype.enableSingleStepping; + + // additional properties: + this.definition = definition; + this.translations = definition.translationsAsText(); + this.handle = null; + + // initialize inherited properties: + BlockEditorMorph.uber.init.call( + this, + target, + () => this.updateDefinition(), + target + ); + + // override inherited properites: + this.key = 'editBlock' + definition.spec; + this.labelString = this.definition.isGlobal ? 'Block Editor' + : 'Method Editor'; + this.createLabel(); + + // create scripting area + scripts = new ScriptsMorph(); + scripts.rejectsHats = true; + scripts.isDraggable = false; + scripts.color = IDE_Morph.prototype.groupColor; + scripts.cachedTexture = IDE_Morph.prototype.scriptsPaneTexture; + scripts.cleanUpMargin = 10; + + proto = new PrototypeHatBlockMorph(this.definition); + proto.setPosition(scripts.position().add(10)); + if (definition.comment !== null) { + comment = definition.comment.fullCopy(); + proto.comment = comment; + comment.block = proto; + } + if (definition.body !== null) { + proto.nextBlock(isLive ? definition.body.expression + : definition.body.expression.fullCopy() + ); + } + scripts.add(proto); + + this.definition.scripts.forEach(element => { + block = element.fullCopy(); + block.setPosition(scripts.position().add(element.position())); + scripts.add(block); + if (block instanceof BlockMorph) { + block.allComments().forEach(comment => + comment.align(block) + ); + } + }); + proto.allComments().forEach(comment => + comment.align(proto) + ); + + scriptsFrame = new ScrollFrameMorph(scripts); + scriptsFrame.padding = 10; + scriptsFrame.growth = 50; + scriptsFrame.isDraggable = false; + scriptsFrame.acceptsDrops = false; + scriptsFrame.contents.acceptsDrops = true; + scripts.scrollFrame = scriptsFrame; + scripts.updateToolbar(); + + this.addBody(scriptsFrame); + this.addButton('ok', 'OK'); + if (!isLive) { + this.addButton('updateDefinition', 'Apply'); + this.addButton('cancel', 'Cancel'); + } + + this.setExtent(new Point(375, 300)); // normal initial extent + this.fixLayout(); + scripts.fixMultiArgs(); + + block = proto.parts()[0]; + block.forceNormalColoring(); + proto.fixBlockColor(null, true); + +}; + +BlockEditorMorph.prototype.popUp = function () { + var world = this.target.world(); + + if (world) { + BlockEditorMorph.uber.popUp.call(this, world); + this.setInitialDimensions(); + this.handle = new HandleMorph( + this, + 280, + 220, + this.corner, + this.corner + ); + world.keyboardFocus = null; + } +}; + +BlockEditorMorph.prototype.justDropped = function () { + // override the inherited default behavior, which is to + // give keyboard focus to dialog boxes, as in this case + // we want Snap-global keyboard-shortcuts like ctrl-f + // to still work + nop(); +}; + +// BlockEditorMorph ops + +BlockEditorMorph.prototype.accept = function (origin) { + // check DialogBoxMorph comment for accept() + if (origin instanceof CursorMorph) {return; } + if (this.action) { + if (typeof this.target === 'function') { + if (typeof this.action === 'function') { + this.target.call(this.environment, this.action.call()); + } else { + this.target.call(this.environment, this.action); + } + } else { + if (typeof this.action === 'function') { + this.action.call(this.target, this.getInput()); + } else { // assume it's a String + this.target[this.action](this.getInput()); + } + } + } + this.close(); +}; + +BlockEditorMorph.prototype.cancel = function (origin) { + if (origin instanceof CursorMorph) {return; } + //this.refreshAllBlockInstances(); + this.close(); +}; + +BlockEditorMorph.prototype.close = function () { + var doubles, block; + + // assert that no scope conflicts exists, i.e. that a global + // definition doesn't contain any local custom blocks, as they + // will be rendered "Obsolete!" when reloading the project + if (this.definition.isGlobal) { + block = detect( + this.body.contents.allChildren(), + morph => morph.isCustomBlock && !morph.isGlobal + ); + if (block) { + block = block.scriptTarget() + .getMethod(block.semanticSpec) + .blockInstance(); + block.addShadow(); + new DialogBoxMorph().inform( + 'Local Block(s) in Global Definition', + 'This global block definition contains one or more\n' + + 'local custom blocks which must be removed first.', + this.world(), + block.doWithAlpha(1, () => block.fullImage()) + ); + return; + } + } + + // allow me to disappear only when name collisions + // have been resolved + doubles = this.target.doubleDefinitionsFor(this.definition); + if (doubles.length > 0) { + block = doubles[0].blockInstance(); + block.addShadow(); + new DialogBoxMorph(this, 'consolidateDoubles', this).askYesNo( + 'Same Named Blocks', + 'Another custom block with this name exists.\n' + + 'Would you like to replace it?', + this.world(), + block.doWithAlpha(1, () => block.fullImage()) + ); + return; + } + + this.destroy(); +}; + +BlockEditorMorph.prototype.consolidateDoubles = function () { + this.target.replaceDoubleDefinitionsFor(this.definition); + this.destroy(); +}; + +BlockEditorMorph.prototype.refreshAllBlockInstances = function (oldSpec) { + var def = this.definition, + template = this.target.paletteBlockInstance(def); + + function isMajorTypeChange(oldType) { + var rep = ['reporter', 'predicate'], + type = def.type; + return (type === 'command' && rep.includes(oldType)) || + (oldType == 'command' && rep.includes(type)); + } + + if (def.isGlobal) { + this.target.allBlockInstances(def).reverse().forEach( + block => block.refresh() + ); + this.target.parentThatIsA(StageMorph).allContextsUsing(def).forEach( + context => { + if (context.expression.isCustomBlock && + context.expression.isUnattached() && + isMajorTypeChange(context.expression.type()) + ) { + context.expression = def.blockInstance(); + } + context.changed(); + } + ); + } else { + this.target.allDependentInvocationsOf(oldSpec).reverse().forEach( + block => block.refresh(def) + ); + this.target.parentThatIsA(StageMorph).allContextsInvoking( + def.blockSpec(), + this.target + ).forEach( + context => { + if (context.expression.isCustomBlock && + context.expression.isUnattached() && + isMajorTypeChange(context.expression.type()) + ) { + context.expression = def.blockInstance(); + } + context.changed(); + } + ); + } + if (template) { + template.refreshDefaults(); + } +}; + +BlockEditorMorph.prototype.updateDefinition = function () { + var head, ide, + oldSpec = this.definition.blockSpec(), + pos = this.body.contents.position(), + count = 1, + spec, element; + + this.definition.receiver = this.target; // only for serialization + this.definition.spec = this.prototypeSpec(); + this.definition.declarations = this.prototypeSlots(); + this.definition.variableNames = this.variableNames(); + this.definition.scripts = []; + this.definition.updateTranslations(this.translations); + this.definition.cachedTranslation = null; + this.definition.editorDimensions = this.bounds.copy(); + this.definition.cachedIsRecursive = null; // flush the cache, don't update + + this.body.contents.children.forEach(morph => { + if (morph instanceof PrototypeHatBlockMorph) { + head = morph; + } else if (morph instanceof BlockMorph || + (morph instanceof CommentMorph && !morph.block)) { + element = morph.fullCopy(); + element.parent = null; + element.setPosition(morph.position().subtract(pos)); + this.definition.scripts.push(element); + } + }); + + if (head) { + if (this.definition.category !== head.blockCategory) { + this.target.shadowAttribute('scripts'); + } + this.definition.category = head.blockCategory; + this.definition.type = head.type; + this.definition.isHelper = head.isHelper; + if (head.comment) { + this.definition.comment = head.comment.fullCopy(); + this.definition.comment.block = true; // serialize in short form + } else { + this.definition.comment = null; + } + } + + this.definition.body = this.context(head); + + // make sure the spec is unique + spec = this.definition.spec; + while (this.target.doubleDefinitionsFor(this.definition).length > 0) { + count += 1; + this.definition.spec = spec + ' (' + count + ')'; + } + + this.refreshAllBlockInstances(oldSpec); + ide = this.target.parentThatIsA(IDE_Morph); + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + this.target.recordUserEdit( + 'scripts', + 'custom block', + this.definition.isGlobal ? 'global' : 'local', + 'update', + this.definition.abstractBlockSpec() + ); +}; + +BlockEditorMorph.prototype.context = function (prototypeHat) { + // answer my script reified for deferred execution + // if no prototypeHat is given, my body is scanned + var head, topBlock, stackFrame; + + head = prototypeHat || detect( + this.body.contents.children, + c => c instanceof PrototypeHatBlockMorph + ); + topBlock = head.nextBlock(); + if (topBlock === null) { + return null; + } + topBlock.allChildren().forEach(c => { + if (c instanceof BlockMorph) {c.cachedInputs = null; } + }); + stackFrame = Process.prototype.reify.call( + null, + topBlock, + new List(this.definition.inputNames()), + true // ignore empty slots for custom block reification + ); + stackFrame.outerContext = null; + stackFrame.comment = head?.comment?.text(); + return stackFrame; +}; + +BlockEditorMorph.prototype.prototypeSpec = function () { + // answer the spec represented by my (edited) block prototype + return detect( + this.body.contents.children, + c => c instanceof PrototypeHatBlockMorph + ).parts()[0].specFromFragments(); +}; + +BlockEditorMorph.prototype.prototypeSlots = function () { + // answer the slot declarations from my (edited) block prototype + return detect( + this.body.contents.children, + c => c instanceof PrototypeHatBlockMorph + ).parts()[0].declarationsFromFragments(); +}; + +BlockEditorMorph.prototype.variableNames = function () { + // answer the variable declarations from my prototype hat + return detect( + this.body.contents.children, + c => c instanceof PrototypeHatBlockMorph + ).variableNames(); +}; + +BlockEditorMorph.prototype.isHelper = function () { + // answer the helper declaration from my (edited) prototype hat + return detect( + this.body.contents.children, + c => c instanceof PrototypeHatBlockMorph + ).isHelper; +}; + +// BlockEditorMorph translation + +BlockEditorMorph.prototype.editTranslations = function () { + var block = this.definition.blockInstance(); + block.addShadow(new Point(3, 3)); + new DialogBoxMorph( + this, + text => this.translations = text, + this + ).promptCode( + 'Custom Block Translations', + this.translations, + this.world(), + block.doWithAlpha(1, () => block.fullImage()), + this.definition.abstractBlockSpec() + + '\n\n' + + localize('Enter one translation per line. ' + + 'use colon (":") as lang/spec delimiter\n' + + 'and underscore ("_") as placeholder for an input, ' + + 'e.g.:\n\nen:say _ for _ secs') + ); +}; + +// BlockEditorMorph layout + +BlockEditorMorph.prototype.setInitialDimensions = function () { + var world = this.world(), + mex = world.extent().subtract(new Point(this.padding, this.padding)), + th = fontHeight(this.titleFontSize) + this.titlePadding * 2, + bh = this.buttons.height(); + + if (this.definition.editorDimensions) { + this.setPosition(this.definition.editorDimensions.origin); + this.setExtent(this.definition.editorDimensions.extent().min(mex)); + this.keepWithin(world); + return; + } + this.setExtent( + this.body.contents.extent().add( + new Point(this.padding, this.padding + th + bh) + ).min(mex) + ); + this.setCenter(this.world().center()); +}; + +BlockEditorMorph.prototype.fixLayout = function () { + var th = fontHeight(this.titleFontSize) + this.titlePadding * 2; + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.fixLayout(); + } + + if (this.body) { + this.body.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.body.setExtent(new Point( + this.width() - this.padding * 2, + this.height() - this.padding * 3 - th - this.buttons.height() + )); + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + } + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh a shallow shadow + this.removeShadow(); + this.addShadow(); +}; + +// PrototypeHatBlockMorph ///////////////////////////////////////////// + +// PrototypeHatBlockMorph inherits from HatBlockMorph: + +PrototypeHatBlockMorph.prototype = new HatBlockMorph(); +PrototypeHatBlockMorph.prototype.constructor = PrototypeHatBlockMorph; +PrototypeHatBlockMorph.uber = HatBlockMorph.prototype; + +// PrototypeHatBlockMorph instance creation: + +function PrototypeHatBlockMorph(definition) { + this.init(definition); +} + +PrototypeHatBlockMorph.prototype.init = function (definition) { + var proto = definition.prototypeInstance(), + vars; + + this.definition = definition; + + // additional attributes to store edited data + this.blockCategory = definition ? definition.category : null; + this.type = definition ? definition.type : null; + this.isHelper = definition ? definition.isHelper : false; + + // init inherited stuff + HatBlockMorph.uber.init.call(this); + this.color = SpriteMorph.prototype.blockColor.control; + this.category = 'control'; + this.add(proto); + if (definition.variableNames.length) { + vars = this.labelPart('%blockVars'); + this.add(this.labelPart('%br')); + this.add(vars); + definition.variableNames.forEach(name => + vars.addInput(name) + ); + } + proto.refreshPrototypeSlotTypes(); // show slot type indicators + this.fixLayout(); + proto.fixBlockColor(this, true); +}; + +PrototypeHatBlockMorph.prototype.mouseClickLeft = function () { + // relay the mouse click to my prototype block to + // pop-up a Block Dialog, unless the shift key + // is pressed, in which case initiate keyboard + // editing support + + if (this.world().currentKey === 16) { // shift-clicked + return this.focus(); + } + this.parts()[0].mouseClickLeft(); +}; + +PrototypeHatBlockMorph.prototype.userMenu = function () { + return this.parts()[0].userMenu(); +}; + +PrototypeHatBlockMorph.prototype.exportBlockDefinition = + CustomCommandBlockMorph.prototype.exportBlockDefinition; + +// PrototypeHatBlockMorph zebra coloring + +PrototypeHatBlockMorph.prototype.fixBlockColor = function ( + nearestBlock, + isForced +) { + var nearest = this.parts()[0] || nearestBlock; + + if (!this.zebraContrast && !isForced) { + return; + } + if (!this.zebraContrast && isForced) { + return this.forceNormalColoring(); + } + + if (nearest.category === this.category) { + if (nearest.color.eq(this.color)) { + this.alternateBlockColor(); + } + } else if (this.category && !this.color.eq( + SpriteMorph.prototype.blockColorFor(this.category) + )) { + this.alternateBlockColor(); + } + if (isForced) { + this.fixChildrensBlockColor(true); + } +}; + +// PrototypeHatBlockMorph block instance variables + +PrototypeHatBlockMorph.prototype.variableNames = function (choice) { + var parts = this.parts(); + if (parts.length < 3) {return []; } + return parts[2].evaluate(); +}; + +PrototypeHatBlockMorph.prototype.enableBlockVars = function (choice) { + var prot = this.parts()[0]; + if (choice === false) { + this.setSpec('%s', true); + } else { + this.setSpec('%s %br %blockVars', true); + } + this.replaceInput(this.parts()[0], prot); + this.spec = null; +}; + +// BlockLabelFragment ////////////////////////////////////////////////// + +// BlockLabelFragment instance creation: + +function BlockLabelFragment(labelString) { + this.labelString = labelString || ''; + this.type = '%s'; // null for label, a spec for an input + this.defaultValue = ''; + this.options = ''; + this.isReadOnly = false; // for input slots + this.isIrreplaceable = false; + this.separator = null; // for variadic slots + this.isDeleted = false; +} + +// accessing + +BlockLabelFragment.prototype.defSpecFragment = function () { + // answer a string representing my prototype's spec + var pref = this.type ? '%\'' : ''; + return this.isDeleted ? + '' : pref + this.labelString + (this.type ? '\'' : ''); +}; + +BlockLabelFragment.prototype.defTemplateSpecFragment = function () { + // answer a string representing my prototype's spec + // which also indicates my type, default value or arity + var suff = ''; + if (!this.type) {return this.defSpecFragment(); } + if (this.isUpvar()) { + suff = ' \u2191'; + } else if (this.isMultipleInput()) { + suff = '...'; + } else if (this.type === '%cs' || this.type === '%ca') { + suff = ' \u03BB'; // ' [\u03BB' + } else if (this.type === '%b') { + suff = ' ?'; + } else if (this.type === '%l') { + suff = ' \uFE19'; + } else if (this.type === '%obj') { + suff = ' %turtleOutline'; + } else if (contains( + ['%cmdRing', '%repRing', '%predRing', '%anyUE', '%boolUE'], + this.type + )) { + suff = ' \u03BB'; + } else if (this.defaultValue) { + if (this.type === '%n') { + suff = ' # = ' + this.defaultValue.toString(); + } else if (contains(['%mlt', '%code'], this.type)) { + suff = ' \u00B6 = ' + this.defaultValue.toString(); // pilcrow + } else { // 'any' or 'text' + suff = ' = ' + this.defaultValue.toString(); + } + } else if (this.type === '%n') { + suff = ' #'; + } else if (contains(['%mlt', '%code'], this.type)) { + suff = ' \u00B6'; // pilcrow + } + return this.labelString + suff; +}; + +BlockLabelFragment.prototype.blockSpecFragment = function () { + // answer a string representing my block spec + return this.isDeleted ? '' : this.type || this.labelString; +}; + +BlockLabelFragment.prototype.copy = function () { + var ans = new BlockLabelFragment(this.labelString); + ans.type = this.type; + ans.defaultValue = this.defaultValue; + ans.options = this.options; + ans.isReadOnly = this.isReadOnly; + ans.isIrreplaceable = this.isIrreplaceable; + ans.separator = this.separator; + return ans; +}; + +// options and special drop-down menus + +BlockLabelFragment.prototype.hasOptions = function () { + return this.options !== '' && !this.hasSpecialMenu(); +}; + +BlockLabelFragment.prototype.hasSpecialMenu = function () { + return contains( + [ + '§_messagesMenu', + '§_messagesReceivedMenu', //for backward (5.0.0 - 5.0.3) support + '§_objectsMenu', + '§_costumesMenu', + '§_soundsMenu', + '§_getVarNamesDict', + '§_pianoKeyboardMenu', + '§_directionDialMenu' + ], + this.options + ); +}; + +BlockLabelFragment.prototype.hasExtensionMenu = function () { + return contains( + Array.from(SnapExtensions.menus.keys()).map(str => '§_ext_' + str), + this.options + ); +}; + +// arity + +BlockLabelFragment.prototype.isSingleInput = function () { + return !this.isMultipleInput() && + (this.type !== '%upvar'); +}; + +BlockLabelFragment.prototype.isMultipleInput = function () { + // answer true if the type begins with '%mult' + if (!this.type) { + return false; // not an input at all + } + return this.type.indexOf('%mult') > -1; +}; + +BlockLabelFragment.prototype.isUpvar = function () { + if (!this.type) { + return false; // not an input at all + } + return this.type === '%upvar'; +}; + +BlockLabelFragment.prototype.setToSingleInput = function () { + if (!this.type) {return null; } // not an input at all + if (this.type === '%upvar') { + this.type = '%s'; + } else { + this.type = this.singleInputType(); + } +}; + +BlockLabelFragment.prototype.setToMultipleInput = function () { + if (!this.type) {return null; } // not an input at all + if (this.type === '%upvar') { + this.type = '%s'; + } else if (this.type === '%ca') { + this.type = '%cs'; + } + this.type = '%mult'.concat(this.singleInputType()); +}; + +BlockLabelFragment.prototype.setToUpvar = function () { + if (!this.type) {return null; } // not an input at all + this.type = '%upvar'; +}; + +BlockLabelFragment.prototype.singleInputType = function () { + // answer the type of my input withtou any preceding '%mult' + if (!this.type) { + return null; // not an input at all + } + if (this.isMultipleInput()) { + return this.type.substr(5); // everything following '%mult' + } + return this.type; +}; + +BlockLabelFragment.prototype.setSingleInputType = function (type) { + if (!this.type || !this.isMultipleInput()) { + this.type = type; + } else { + this.type = '%mult'.concat(type); + } +}; + +// BlockLabelFragmentMorph /////////////////////////////////////////////// + +/* + I am a single word in a custom block prototype's label. I can be clicked + to edit my contents and to turn me into an input placeholder. +*/ + +// BlockLabelFragmentMorph inherits from Morph: + +BlockLabelFragmentMorph.prototype = new Morph(); +BlockLabelFragmentMorph.prototype.constructor = BlockLabelFragmentMorph; +BlockLabelFragmentMorph.uber = Morph.prototype; + +// BlockLabelFragmentMorph instance creation: + +function BlockLabelFragmentMorph(spec, shape) { + this.init(spec, shape); +} + +BlockLabelFragmentMorph.prototype.init = function (spec, shape) { + BlockLabelFragmentMorph.uber.init.call(this); + this.spec = spec; + this.fragment = new BlockLabelFragment(spec); + this.fragment.type = null; + this.sO = null; // temporary backup for shadowOffset + this.shape = shape; // the actual label part, a StringMorph or SymbolMorph + this.add(shape); +// this.fixLayout(); +}; + +BlockLabelFragmentMorph.prototype.fixLayout = function () { + this.bounds = this.shape.bounds; +}; + +BlockLabelFragmentMorph.prototype.render = nop; + +// BlockLabelFragmentMorph events: + +BlockLabelFragmentMorph.prototype.mouseEnter = function () { + this.sO = this.shape.shadowOffset; + this.shape.shadowOffset = this.sO.neg(); + this.shape.fixLayout(); + this.shape.rerender(); + this.fixLayout(); +}; + +BlockLabelFragmentMorph.prototype.mouseLeave = function () { + this.shape.shadowOffset = this.sO; + this.shape.fixLayout(); + this.shape.rerender(); + this.fixLayout(); +}; + +BlockLabelFragmentMorph.prototype.mouseClickLeft = function () { +/* + make a copy of my fragment object and open an InputSlotDialog on it. + If the user acknowledges the DialogBox, assign the - edited - copy + of the fragment object to be my new fragment object and update the + custom block'label (the prototype in the block editor). Do not yet update + the definition and every block instance, as this happens only after + the user acknowledges and closes the block editor +*/ + var frag = this.fragment.copy(), + isPlaceHolder = this instanceof BlockLabelPlaceHolderMorph, + isOnlyElement = this.parent.parseSpec(this.parent.blockSpec).length + < 2; + + new InputSlotDialogMorph( + frag, + null, + () => this.updateBlockLabel(frag), + this.spec, + this.parent.definition.category + ).open( + this instanceof BlockLabelFragmentMorph ? + 'Edit label fragment' : + isPlaceHolder ? 'Create input name' : 'Edit input name', + frag.labelString, + this.world(), + null, + isPlaceHolder || isOnlyElement + ); +}; + +BlockLabelFragmentMorph.prototype.updateBlockLabel = function (newFragment) { + var prot = this.parentThatIsA(BlockMorph); + this.fragment = newFragment; + if (prot) { + prot.refreshPrototype(); + } +}; + +BlockLabelFragmentMorph.prototype.userMenu = function () { + // show a menu of built-in special symbols + var symbolColor = new Color(100, 100, 130), + menu = new MenuMorph( + (string) => { + var tuple = this.spec.split('-'); + this.changed(); + tuple[0] = '$' + string; + this.text = tuple.join('-'); + this.fragment.labelString = this.spec; + this.parent.parent.changed(); + this.fixLayout(); + this.parent.parent.fixLayout(); + this.parent.parent.changed(); + }, + null, + this, + this.fontSize + ); + SymbolMorph.prototype.names.forEach(name => + menu.addItem( + [new SymbolMorph(name, menu.fontSize, symbolColor), localize(name)], + name + ) + ); + menu.addLine(); + menu.addItem('\u23CE ' + localize('new line'), 'nl'); + return menu; +}; + +// BlockLabelPlaceHolderMorph /////////////////////////////////////////////// + +/* + I am a space between words or inputs in a custom block prototype's label. + When I am moused over I display a plus sign on a colored background + circle. I can be clicked to add a new word or input to the prototype. +*/ + +// BlockLabelPlaceHolderMorph inherits from Morph: + +BlockLabelPlaceHolderMorph.prototype = new Morph(); +BlockLabelPlaceHolderMorph.prototype.constructor = BlockLabelPlaceHolderMorph; +BlockLabelPlaceHolderMorph.uber = Morph.prototype; + +// BlockLabelPlaceHolderMorph preferences settings + +BlockLabelPlaceHolderMorph.prototype.plainLabel = false; // always show (+) + +// BlockLabelPlaceHolderMorph instance creation: + +function BlockLabelPlaceHolderMorph() { + this.init(); +} + +BlockLabelPlaceHolderMorph.prototype.init = function () { + this.fragment = new BlockLabelFragment(''); + this.fragment.type = '%s'; + this.fragment.isDeleted = true; + this.isHighlighted = false; + BlockLabelFragmentMorph.uber.init.call(this); +}; + +// BlockLabelPlaceHolderMorph drawing + +BlockLabelPlaceHolderMorph.prototype.fixLayout = function () { + var h = fontHeight(SyntaxElementMorph.prototype.fontSize * 1.4); + this.bounds.setHeight(h); + this.bounds.setWidth( + this.isHighlighted || !this.plainLabel ? h / 2 : + SyntaxElementMorph.prototype.scale + ); + + // notify my parent of layout change - move to fixLayout() + if (this.parent) { + if (this.parent.fixLayout) { + this.parent.fixLayout(); + } + if (this.parent.parent instanceof PrototypeHatBlockMorph) { + this.parent.parent.fixLayout(); + } + } +}; + +BlockLabelPlaceHolderMorph.prototype.render = function (ctx) { + var cx = this.width() / 2, + cy = this.height() / 2, + r = Math.min(cx, cy), + unit = SyntaxElementMorph.prototype.scale; + + // draw background, if any + if (this.isHighlighted) { + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + ctx.arc( + cx, + cy, + r, + radians(0), + radians(360), + false + ); + ctx.closePath(); + ctx.fill(); + } + + if (!this.plainLabel || this.isHighlighted) { + ctx.strokeStyle = this.isHighlighted ? 'white' : this.color.toString(); + ctx.lineWidth = unit; + ctx.beginPath(); + ctx.moveTo(unit, cy); + ctx.lineTo(r * 2 - unit, cy); + ctx.moveTo(r, cy - r + unit); + ctx.lineTo(r, cy + r - unit); + ctx.stroke(); + } +}; + +// BlockLabelPlaceHolderMorph events: + +BlockLabelPlaceHolderMorph.prototype.mouseEnter = function () { + var hat = this.parentThatIsA(PrototypeHatBlockMorph); + this.isHighlighted = true; + if (this.plainLabel && hat) { + hat.changed(); + this.fixLayout(); + hat.changed(); + } else { + this.fixLayout(); + this.rerender(); + } +}; + +BlockLabelPlaceHolderMorph.prototype.mouseLeave = function () { + var hat = this.parentThatIsA(PrototypeHatBlockMorph); + this.isHighlighted = false; + if (this.plainLabel && hat) { + hat.changed(); + this.fixLayout(); + hat.changed(); + } else { + this.fixLayout(); + this.rerender(); + } +}; + +BlockLabelPlaceHolderMorph.prototype.mouseClickLeft + = BlockLabelFragmentMorph.prototype.mouseClickLeft; + +BlockLabelPlaceHolderMorph.prototype.updateBlockLabel + = BlockLabelFragmentMorph.prototype.updateBlockLabel; + +// BlockInputFragmentMorph /////////////////////////////////////////////// + +/* + I am a variable blob in a custom block prototype's label. I can be clicked + to edit my contents and to turn me into an part of the block's label text. +*/ + +// BlockInputFragmentMorph inherits from TemplateSlotMorph: + +BlockInputFragmentMorph.prototype = new TemplateSlotMorph(); +BlockInputFragmentMorph.prototype.constructor = BlockInputFragmentMorph; +BlockInputFragmentMorph.uber = TemplateSlotMorph.prototype; + +// BlockInputFragmentMorph instance creation: + +function BlockInputFragmentMorph(text) { + this.init(text); +} + +BlockInputFragmentMorph.prototype.init = function (text) { + this.fragment = new BlockLabelFragment(text); + this.fragment.type = '%s'; + BlockInputFragmentMorph.uber.init.call(this, text); +}; + +// BlockInputFragmentMorph events: + +BlockInputFragmentMorph.prototype.mouseClickLeft + = BlockLabelFragmentMorph.prototype.mouseClickLeft; + +BlockInputFragmentMorph.prototype.updateBlockLabel + = BlockLabelFragmentMorph.prototype.updateBlockLabel; + +// InputSlotDialogMorph //////////////////////////////////////////////// + +// ... "inherits" some methods from BlockDialogMorph + +// InputSlotDialogMorph inherits from DialogBoxMorph: + +InputSlotDialogMorph.prototype = new DialogBoxMorph(); +InputSlotDialogMorph.prototype.constructor = InputSlotDialogMorph; +InputSlotDialogMorph.uber = DialogBoxMorph.prototype; + +// InputSlotDialogMorph preferences settings: + +// if "isLaunchingExpanded" is true I always open in the long form +InputSlotDialogMorph.prototype.isLaunchingExpanded = false; + +// InputSlotDialogMorph instance creation: + +function InputSlotDialogMorph( + fragment, + target, + action, + environment, + category +) { + this.init(fragment, target, action, environment, category); +} + +InputSlotDialogMorph.prototype.init = function ( + fragment, + target, + action, + environment, + category +) { + var scale = SyntaxElementMorph.prototype.scale, + fh = fontHeight(10) / 1.2 * scale; // "raw height" + + // additional properties: + this.fragment = fragment || new BlockLabelFragment(); + this.textfield = null; + this.types = null; + this.slots = null; + this.isExpanded = false; + this.category = category || 'other'; + this.noDelete = false; + + // initialize inherited properties: + BlockDialogMorph.uber.init.call( + this, + target, + action, + environment + ); + + // override inherited properites: + this.types = new AlignmentMorph('row', this.padding); + this.types.respectHiddens = true; // prevent the arrow from flipping + this.add(this.types); + this.slots = new BoxMorph(); + this.slots.color = new Color(55, 55, 55); // same as palette + this.slots.borderColor = this.slots.color.lighter(50); + this.slots.setExtent(new Point((fh + 10) * 24, (fh + 10 * scale) * 10.4)); + this.add(this.slots); + this.createSlotTypeButtons(); + this.fixSlotsLayout(); + this.addSlotsMenu(); + this.createTypeButtons(); + this.fixLayout(); +}; + +InputSlotDialogMorph.prototype.createTypeButtons = function () { + var block, + arrow, + clr = SpriteMorph.prototype.blockColorFor(this.category); + + + block = new JaggedBlockMorph(localize('Title text')); + block.setColor(clr); + this.addBlockTypeButton( + () => this.setType(null), + block, + () => this.fragment.type === null + ); + + block = new JaggedBlockMorph('%inputName'); + block.setColor(clr); + this.addBlockTypeButton( + () => this.setType('%s'), + block, + () => this.fragment.type !== null + ); + + // add an arrow button for long form/short form toggling + arrow = new ArrowMorph( + 'right', + PushButtonMorph.prototype.fontSize + 4, + 2 + ); + arrow.noticesTransparentClick = true; + this.types.add(arrow); + this.types.fixLayout(); + + // configure arrow button + arrow.refresh = (initial) => { + if (this.fragment.type === null) { + this.isExpanded = false; + arrow.hide(); + } else { + arrow.show(); + if (initial || this.isExpanded) { + arrow.direction = 'down'; + } else { + arrow.direction = 'right'; + } + arrow.fixLayout(); + arrow.rerender(); + } + }; + + arrow.mouseClickLeft = () => { + if (arrow.isVisible) { + this.isExpanded = !this.isExpanded; + this.types.children.forEach(c => c.refresh()); + this.changed(); + this.fixLayout(); + this.rerender(); + this.edit(); + } + }; + + arrow.refresh(this.isLaunchingExpanded); +}; + +InputSlotDialogMorph.prototype.addTypeButton + = BlockDialogMorph.prototype.addTypeButton; + +InputSlotDialogMorph.prototype.addBlockTypeButton + = BlockDialogMorph.prototype.addBlockTypeButton; + +InputSlotDialogMorph.prototype.setType = function (fragmentType) { + this.textfield.choices = fragmentType ? null : this.symbolMenu; + this.textfield.fixLayout(); + this.fragment.type = fragmentType || null; + this.types.children.forEach(c => c.refresh()); + this.slots.children.forEach(c => c.refresh()); + this.isExpanded = this.isExpanded || + (!isNil(fragmentType) && this.isLaunchingExpanded); + this.types.children.forEach(c => c.refresh()); + this.changed(); + this.fixLayout(); + this.keepWithin(this.world()); + this.rerender(); + this.edit(); +}; + +InputSlotDialogMorph.prototype.getInput = function () { + var lbl; + if (this.body instanceof InputFieldMorph) { + lbl = this.normalizeSpaces(this.body.getValue()); + } + if (lbl) { + this.fragment.labelString = lbl; + if (contains(['%b', '%boolUE'], this.fragment.type)) { + this.fragment.defaultValue = + this.slots.defaultSwitch.evaluate(); + } else { + this.fragment.defaultValue = + this.slots.defaultInputField.getValue(); + } + return lbl; + } + // otherwise remove the fragment + this.fragment.isDeleted = true; + return null; +}; + +InputSlotDialogMorph.prototype.fixLayout = function () { + var maxWidth, + left = this.left(), + th = fontHeight(this.titleFontSize) + this.titlePadding * 2; + + if (!this.isExpanded) { + if (this.slots) { + this.slots.hide(); + } + return BlockDialogMorph.prototype.fixLayout.call(this); + } + + this.slots.show(); + maxWidth = this.slots.width(); + + // arrange panes : + // body (input field) + this.body.setPosition(this.position().add(new Point( + this.padding + (maxWidth - this.body.width()) / 2, + th + this.padding + ))); + + // label + this.label.setLeft( + left + this.padding + (maxWidth - this.label.width()) / 2 + ); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + + // types + this.types.fixLayout(); + this.types.setTop(this.body.bottom() + this.padding); + this.types.setLeft( + left + this.padding + (maxWidth - this.types.width()) / 2 + ); + + // slots + this.slots.setPosition(new Point( + this.left() + this.padding, + this.types.bottom() + this.padding + )); + this.slots.children.forEach(c => c.refresh()); + + // buttons + this.buttons.fixLayout(); + this.buttons.setTop(this.slots.bottom() + this.padding); + this.buttons.setLeft( + left + this.padding + (maxWidth - this.buttons.width()) / 2 + ); + + // set dialog box dimensions: + this.bounds.setHeight(this.buttons.bottom() - this.top() + this.padding); + this.bounds.setWidth(this.slots.right() - this.left() + this.padding); + + // refresh a shallow shadow + this.removeShadow(); + this.addShadow(); +}; + +InputSlotDialogMorph.prototype.open = function ( + title, + defaultString, + world, + pic, + noDeleteButton +) { + var txt = new InputFieldMorph(defaultString); + + if (!this.fragment.type) { + txt.choices = this.symbolMenu; + } + this.isExpanded = !isNil(this.fragment.type) && this.isLaunchingExpanded; + txt.setWidth(250); + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + this.addBody(txt); + this.textfield = txt; + this.addButton('ok', 'OK'); + if (!noDeleteButton) { + this.addButton('deleteFragment', 'Delete'); + } else { + this.noDelete = true; + } + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + this.popUp(world); + this.add(this.types); // make the types come to front + this.changed(); +}; + +InputSlotDialogMorph.prototype.symbolMenu = function () { + var symbols = [], + symbolColor = new Color(100, 100, 130); + SymbolMorph.prototype.names.forEach(sym => + symbols.push([ + [ + new SymbolMorph(sym, this.fontSize, symbolColor), + localize(sym) + ], + '$' + sym + ]) + ); + symbols.push(['\u23CE ' + localize('new line'), '$nl']); + return symbols; +}; + +InputSlotDialogMorph.prototype.deleteFragment = function () { + this.fragment.isDeleted = true; + this.accept(); +}; + +InputSlotDialogMorph.prototype.createSlotTypeButtons = function () { + // populate my 'slots' area with radio buttons, labels and input fields + var defLabel, defInput, defSwitch, loopArrow, settingsButton; + + // slot types + this.addSlotTypeButton('Object', '%obj'); + this.addSlotTypeButton('Text', '%txt'); + this.addSlotTypeButton('List', '%l'); + this.addSlotTypeButton('Number', '%n'); + this.addSlotTypeButton('Any type', '%s'); + this.addSlotTypeButton('Boolean (T/F)', '%b'); + this.addSlotTypeButton('Command\n(inline)', '%cmdRing'); //'%cmd'); + this.addSlotTypeButton('Reporter', '%repRing'); //'%r'); + this.addSlotTypeButton('Predicate', '%predRing'); //'%p'); + this.addSlotTypeButton('Command\n(C-shape)', ['%cs', '%ca']); + this.addSlotTypeButton('Any\n(unevaluated)', '%anyUE'); + this.addSlotTypeButton('Boolean\n(unevaluated)', '%boolUE'); + + // arity and upvars + this.slots.radioButtonSingle = this.addSlotArityButton( + () => this.setSlotArity('single'), + "Single input.", + () => this.fragment.isSingleInput() + ); + this.addSlotArityButton( + () => this.setSlotArity('multiple'), + "Multiple inputs (value is list of inputs)", + () => this.fragment.isMultipleInput() + ); + this.addSlotArityButton( + () => this.setSlotArity('upvar'), + "Upvar - make internal variable visible to caller", + () => this.fragment.isUpvar() + ); + + // default values + defLabel = new StringMorph(localize('Default Value:')); + defLabel.fontSize = this.slots.radioButtonSingle.fontSize; + defLabel.setColor(WHITE); + defLabel.refresh = () => { + if (this.isExpanded && contains( + [ + '%s', '%n', '%txt', '%anyUE', '%b', '%boolUE', + '%mlt', '%code' + ], + this.fragment.type + )) { + defLabel.show(); + } else { + defLabel.hide(); + } + }; + this.slots.defaultInputLabel = defLabel; + this.slots.add(defLabel); + + defInput = new InputFieldMorph(this.fragment.defaultValue); + defInput.contents().fontSize = defLabel.fontSize; + defInput.contrast = 90; + defInput.setWidth(50); + defInput.refresh = () => { + if (this.isExpanded && contains( + ['%s', '%n', '%txt', '%anyUE', '%mlt', '%code'], + this.fragment.type + )) { + defInput.show(); + if (this.fragment.type === '%n') { + defInput.setIsNumeric(true); + } else { + defInput.setIsNumeric(false); + } + } else { + defInput.hide(); + } + }; + this.slots.defaultInputField = defInput; + this.slots.add(defInput); + + defSwitch = new BooleanSlotMorph(this.fragment.defaultValue); + defSwitch.refresh = () => { + if (this.isExpanded && contains( + ['%b', '%boolUE'], + this.fragment.type + )) { + defSwitch.show(); + } else { + defSwitch.hide(); + } + }; + this.slots.defaultSwitch = defSwitch; + this.slots.add(defSwitch); + + // loop arrow checkbox // + loopArrow = new ToggleMorph( + 'checkbox', + this, // target + () => { // action + if (this.fragment.type === '%ca') { + this.setType('%cs'); + } else { + this.setType('%ca'); + } + }, + null, // label string + () => this.fragment.type === '%ca', + null, // environment + null, // hint + new SymbolMorph( + 'loop', + this.fontSize * 0.7, + WHITE + ).getImage(), + null // builder method that constructs the element morph + ); + loopArrow.refresh = () => { + ToggleMorph.prototype.refresh.call(loopArrow); + if (this.isExpanded && contains( + ['%cs', '%ca'], + this.fragment.type + )) { + loopArrow.show(); + } else { + loopArrow.hide(); + } + }; + this.slots.loopArrow = loopArrow; + this.slots.add(loopArrow); + + // settings button + settingsButton = new PushButtonMorph( + this.slots, + () => this.slots.userMenu().popUpAtHand(this.world()), + new SymbolMorph('gearPartial', this.fontSize * 1.5) + ); + settingsButton.padding = 0; + settingsButton.fixLayout(); + settingsButton.refresh = nop; + this.slots.settingsButton = settingsButton; + this.slots.add(settingsButton); + +}; + +InputSlotDialogMorph.prototype.setSlotType = function (type) { + this.fragment.setSingleInputType(type); + this.slots.children.forEach(c => c.refresh()); + this.edit(); +}; + +InputSlotDialogMorph.prototype.setSlotArity = function (arity) { + if (arity === 'single') { + this.fragment.setToSingleInput(); + } else if (arity === 'multiple') { + this.fragment.setToMultipleInput(); + } else if (arity === 'upvar') { + this.fragment.setToUpvar(); + // hide other options - under construction + } + this.slots.children.forEach(c => c.refresh()); + this.edit(); +}; + +InputSlotDialogMorph.prototype.setSlotOptions = function (text) { + this.fragment.options = text; +}; + +InputSlotDialogMorph.prototype.addSlotTypeButton = function ( + label, + spec // slot spec or array of specs (I *hate* the arrow symbol, -Jens) +) { +/* + this method produces a radio button with a picture of the + slot type indicated by "spec" and the "label" text to + its right. + Note that you can make the slot picture interactive (turn + it into a ToggleElementMorph by changing the + + element.fullImage() + + line to just + + element + + I've opted for the simpler representation because it reduces + the duration of time it takes for the InputSlotDialog to load + and show. But in the future computers and browsers may be + faster. +*/ + var action = () => { + this.setSlotType(spec instanceof Array ? spec[0] : spec); + }, + query, + element = new JaggedBlockMorph(spec instanceof Array ? spec[0] : spec), + button; + + query = () => { + return spec instanceof Array ? + contains(spec, this.fragment.singleInputType()) + : this.fragment.singleInputType() === spec; + }; + element.setCategory(this.category); + element.rebuild(); + button = new ToggleMorph( + 'radiobutton', + this, + action, + label, + query, + null, + null, + element.doWithAlpha(1, () => element.fullImage()), + 'rebuild' + ); + button.edge = this.buttonEdge / 2; + button.outline = this.buttonOutline / 2; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + button.fixLayout(); + button.label.isBold = false; + button.label.setColor(WHITE); + this.slots.add(button); + return button; +}; + +InputSlotDialogMorph.prototype.addSlotArityButton = function ( + action, + label, + query +) { + var button = new ToggleMorph( + 'radiobutton', + this, + action, + label, + query, + null, + null + ); + button.edge = this.buttonEdge / 2; + button.outline = this.buttonOutline / 2; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + + button.fixLayout(); + // button.label.isBold = false; + button.label.setColor(WHITE); + this.slots.add(button); + return button; +}; + +InputSlotDialogMorph.prototype.fixSlotsLayout = function () { + var slots = this.slots, + scale = SyntaxElementMorph.prototype.scale, + xPadding = 10 * scale, + ypadding = 14 * scale, + bh = (fontHeight(10) / 1.2 + 15) * scale, // slot type button height + ah = (fontHeight(10) / 1.2 + 10) * scale, // arity button height + size = 12, // number slot type radio buttons + cols = [ + slots.left() + xPadding, + slots.left() + slots.width() / 3, + slots.left() + slots.width() * 2 / 3 + ], + rows = [ + slots.top() + ypadding, + slots.top() + ypadding + bh, + slots.top() + ypadding + bh * 2, + slots.top() + ypadding + bh * 3, + slots.top() + ypadding + bh * 4, + slots.top() + ypadding + bh * 5, + + slots.top() + ypadding + bh * 5 + ah, + slots.top() + ypadding + bh * 5 + ah * 2 + ], + idx, + row = -1, + col; + + // slot types: + + for (idx = 0; idx < size; idx += 1) { + col = idx % 3; + if (idx % 3 === 0) {row += 1; } + slots.children[idx].setPosition(new Point( + cols[col], + rows[row] + )); + } + + // arity: + + col = 0; + row = 5; + for (idx = size; idx < size + 3; idx += 1) { + slots.children[idx].setPosition(new Point( + cols[col], + rows[row + idx - size] + )); + } + + // default input + + this.slots.defaultInputLabel.setPosition( + this.slots.radioButtonSingle.label.topRight().add(new Point(5, 0)) + ); + this.slots.defaultInputField.setCenter( + this.slots.defaultInputLabel.center().add(new Point( + this.slots.defaultInputField.width() / 2 + + this.slots.defaultInputLabel.width() / 2 + 5, + 0 + )) + ); + this.slots.defaultSwitch.setCenter( + this.slots.defaultInputLabel.center().add(new Point( + this.slots.defaultSwitch.width() / 2 + + this.slots.defaultInputLabel.width() / 2 + 5, + 0 + )) + ); + + // loop arrow + + this.slots.loopArrow.setPosition(this.slots.defaultInputLabel.position()); + this.slots.settingsButton.setPosition( + this.slots.bottomRight().subtract( + this.slots.settingsButton.extent().add( + this.padding + this.slots.border + ) + ) + ); + + this.slots.changed(); +}; + +InputSlotDialogMorph.prototype.addSlotsMenu = function () { + this.slots.userMenu = () => { + var menu = new MenuMorph(this), + on = '\u2611 ', + off = '\u2610 ', + isEditable = contains( + ['%s', '%n', '%txt', '%anyUE', '%mlt', '%code'], + this.fragment.type + ); + if(this.fragment.type === '%upvar') { + return this.specialSlotsMenu(); + } + if (isEditable) { + menu.addItem( + (this.fragment.hasOptions() ? on : off) + + localize('options') + + '...', + 'editSlotOptions' + ); + menu.addItem( + (this.fragment.isReadOnly ? on : off) + + localize('read-only'), + () => this.fragment.isReadOnly = !this.fragment.isReadOnly + ); + } + menu.addItem( + (this.fragment.isIrreplaceable ? on : off) + + localize('static'), + () => this.fragment.isIrreplaceable = + !this.fragment.isIrreplaceable + ); + menu.addLine(); + if (isEditable) { + menu.addMenu( + (this.fragment.hasSpecialMenu() ? on : off) + + localize('menu'), + this.specialOptionsMenu() + ); + } + if (this.fragment.type.includes('%mult')) { + menu.addItem( + (this.fragment.separator ? on : off) + + localize('separator') + + '...', + 'editSeparator' + ); + } + menu.addMenu( + (contains(['%mlt', '%code'], this.fragment.type) ? + on : off) + + localize('special'), + this.specialSlotsMenu() + ); + if (this.world().currentKey === 16) { // shift-key down + menu.addMenu( + (this.fragment.hasExtensionMenu() ? on : off) + + localize('extension'), + this.extensionOptionsMenu() + ); + } + return menu; + }; +}; + +InputSlotDialogMorph.prototype.editSlotOptions = function () { + new DialogBoxMorph( + this, + options => this.fragment.options = options.trim(), + this + ).promptCode( + 'Input Slot Options', + this.fragment.options, + this.world(), + null, + localize('Enter one option per line.\n' + + 'Optionally use "=" as key/value delimiter ' + + 'and {} for submenus. ' + + 'e.g.\n the answer=42') + ); +}; + +InputSlotDialogMorph.prototype.specialSlotsMenu = function () { + var menu = new MenuMorph(this.setSlotType, null, this), + myself = this, + on = '\u26AB ', + off = '\u26AA '; + + function addSpecialSlotType(label, spec) { + menu.addItem( + (myself.fragment.type === spec ? on : off) + localize(label), + spec + ); + } + + addSpecialSlotType('multi-line', '%mlt'); + addSpecialSlotType('code', '%code'); + return menu; +}; + +InputSlotDialogMorph.prototype.specialOptionsMenu = function () { + var menu = new MenuMorph(this.setSlotOptions, null, this), + myself = this, + on = '\u26AB ', + off = '\u26AA '; + + function addSpecialOptions(label, selector) { + menu.addItem( + (myself.fragment.options === selector ? + on : off) + localize(label), + selector + ); + } + + addSpecialOptions('(none)', ''); + addSpecialOptions('messages', '§_messagesMenu'); + addSpecialOptions('objects', '§_objectsMenu'); + // addSpecialOptions('data types', '§_typesMenu'); + addSpecialOptions('costumes', '§_costumesMenu'); + addSpecialOptions('sounds', '§_soundsMenu'); + addSpecialOptions('variables', '§_getVarNamesDict'); + addSpecialOptions('piano keyboard', '§_pianoKeyboardMenu'); + addSpecialOptions('360° dial', '§_directionDialMenu'); + return menu; +}; + +InputSlotDialogMorph.prototype.extensionOptionsMenu = function () { + var menu = new MenuMorph(this.setSlotOptions, null, this), + myself = this, + selectors = Array.from(SnapExtensions.menus.keys()), + on = '\u26AB ', + off = '\u26AA '; + + function addSpecialOptions(label, selector) { + menu.addItem( + (myself.fragment.options === selector ? + on : off) + localize(label), + selector + ); + } + + selectors.forEach(sel => { + addSpecialOptions(sel.slice(4), '§_ext_' + sel); + }); + return menu; +}; + +InputSlotDialogMorph.prototype.editSeparator = function () { + new DialogBoxMorph( + this, + str => this.fragment.separator = str, + this + ).prompt( + "Separator", + this.fragment.separator || '', + this.world() + ); +}; + +// InputSlotDialogMorph hiding and showing: + +/* + override the inherited behavior to recursively hide/show all + children, so that my instances get restored correctly when + hiding/showing my parent. +*/ + +InputSlotDialogMorph.prototype.hide = function () { + this.isVisible = false; + this.changed(); +}; + +InputSlotDialogMorph.prototype.show = function () { + this.isVisible = true; + this.changed(); +}; + +// VariableDialogMorph //////////////////////////////////////////////////// + +// VariableDialogMorph inherits from DialogBoxMorph: + +VariableDialogMorph.prototype = new DialogBoxMorph(); +VariableDialogMorph.prototype.constructor = VariableDialogMorph; +VariableDialogMorph.uber = DialogBoxMorph.prototype; + +// ... and some behavior from BlockDialogMorph + +// VariableDialogMorph instance creation: + +function VariableDialogMorph(target, action, environment) { + this.init(target, action, environment); +} + +VariableDialogMorph.prototype.init = function (target, action, environment) { + // additional properties: + this.types = null; + this.isGlobal = true; + + // initialize inherited properties: + BlockDialogMorph.uber.init.call( + this, + target, + action, + environment + ); + + // override inherited properites: + this.types = new AlignmentMorph('row', this.padding); + this.add(this.types); + this.createTypeButtons(); +}; + +VariableDialogMorph.prototype.createTypeButtons = function () { + this.addTypeButton( + () => this.setType('global'), + "for all sprites", + () => this.isGlobal + ); + this.addTypeButton( + () => this.setType('local'), + "for this sprite only", + () => !this.isGlobal + ); +}; + +VariableDialogMorph.prototype.addTypeButton + = BlockDialogMorph.prototype.addTypeButton; + +VariableDialogMorph.prototype.setType = function (varType) { + this.isGlobal = (varType === 'global'); + this.types.children.forEach(c => c.refresh()); + this.edit(); +}; + +VariableDialogMorph.prototype.getInput = function () { + // answer a tuple: [varName, isGlobal] + var name = this.normalizeSpaces(this.body.getValue()); + return name ? [name, this.isGlobal] : null; +}; + +VariableDialogMorph.prototype.fixLayout = function () { + var th = fontHeight(this.titleFontSize) + this.titlePadding * 2; + + if (this.body) { + this.body.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.bounds.setWidth(this.body.width() + this.padding * 2); + this.bounds.setHeight( + this.body.height() + + this.padding * 2 + + th + ); + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + } + + if (this.types) { + this.types.fixLayout(); + this.bounds.setHeight( + this.height() + + this.types.height() + + this.padding + ); + this.bounds.setWidth(Math.max( + this.width(), + this.types.width() + this.padding * 2 + )); + this.types.setCenter(this.center()); + if (this.body) { + this.types.setTop(this.body.bottom() + this.padding); + } else if (this.categories) { + this.types.setTop(this.categories.bottom() + this.padding); + } + } + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.fixLayout(); + this.bounds.setHeight( + this.height() + + this.buttons.height() + + this.padding + ); + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh a shallow shadow + this.removeShadow(); + this.addShadow(); +}; + +// BlockExportDialogMorph //////////////////////////////////////////////////// + +// BlockExportDialogMorph inherits from DialogBoxMorph: + +BlockExportDialogMorph.prototype = new DialogBoxMorph(); +BlockExportDialogMorph.prototype.constructor = BlockExportDialogMorph; +BlockExportDialogMorph.uber = DialogBoxMorph.prototype; + +// BlockExportDialogMorph constants: + +BlockExportDialogMorph.prototype.key = 'blockExport'; + +// BlockExportDialogMorph instance creation: + +function BlockExportDialogMorph(serializer, blocks, target) { + this.init(serializer, blocks, target); +} + +BlockExportDialogMorph.prototype.init = function (serializer, blocks, target) { + // additional properties: + this.serializer = serializer; + this.blocks = blocks.slice(0); + this.globalData = null; // forked global var frame with data dependencies + this.localData = null; // forked local var frame with data dependencies + this.globalVarNames = null; + this.localVarNames = null; + this.handle = null; + + // initialize inherited properties: + BlockExportDialogMorph.uber.init.call( + this, + target, // target + () => this.exportBlocks(), + null // environment + ); + + // override inherited properites: + this.labelString = 'Export blocks'; + this.createLabel(); + + // determine data dependencies + this.collectDataDependencies(); + + // build contents + this.buildContents(); +}; + +BlockExportDialogMorph.prototype.collectDataDependencies = function () { + var names = []; + + // collect names of all data dependencies + this.blocks.forEach(def => + def.dataDependencies().forEach(name => { + if (!names.includes(name)) { + names.push(name); + } + }) + ); + + // collect sprite-local data dependencies + this.localData = this.target.currentSprite.variables.fork(names); + this.localVarNames = this.localData.names(true).sort(); // include hidden + + // collect remaining global data dependencies + names = names.filter(name => !this.localVarNames.includes(name)); + this.globalData = this.target.stage.globalVariables().fork(names); + this.globalVarNames = this.globalData.names(true).sort(); // include hidden +}; + +BlockExportDialogMorph.prototype.buildContents = function () { + var palette, x, y, block, checkBox, lastCat, + padding = 4; + + // create plaette + palette = new ScrollFrameMorph( + null, + null, + SpriteMorph.prototype.sliderColor + ); + palette.color = SpriteMorph.prototype.paletteColor; + palette.padding = padding; + palette.isDraggable = false; + palette.acceptsDrops = false; + palette.contents.acceptsDrops = false; + + // populate palette + x = palette.left() + padding; + y = palette.top() + padding; + + // - create selectors for global variables + this.globalVarNames.forEach(vName => { + block = SpriteMorph.prototype.variableBlock(vName); + block.isDraggable = false; + block.isTemplate = true; + block.isToggleLabel = true; // mark as unrefreshable label + checkBox = new ToggleMorph( + 'checkbox', + this, + () => { + var idx = this.globalVarNames.indexOf(vName); + if (idx > -1) { + this.globalVarNames.splice(idx, 1); + } else { + this.globalVarNames.push(vName); + } + }, + null, + () => contains(this.globalVarNames, vName), + null, + null, + this.target ? block : block.fullImage() + ); + checkBox.setPosition(new Point( + x, + y + (checkBox.top() - checkBox.toggleElement.top()) + )); + palette.addContents(checkBox); + y += checkBox.fullBounds().height() + padding; + }); + y += padding; + + // - create selectors for local variables + this.localVarNames.forEach(vName => { + block = SpriteMorph.prototype.variableBlock(vName, true); // isLocal + block.isDraggable = false; + block.isTemplate = true; + block.isToggleLabel = true; // mark as unrefreshable label + checkBox = new ToggleMorph( + 'checkbox', + this, + () => { + var idx = this.localVarNames.indexOf(vName); + if (idx > -1) { + this.localVarNames.splice(idx, 1); + } else { + this.localVarNames.push(vName); + } + }, + null, + () => contains(this.localVarNames, vName), + null, + null, + this.target ? block : block.fullImage() + ); + checkBox.setPosition(new Point( + x, + y + (checkBox.top() - checkBox.toggleElement.top()) + )); + palette.addContents(checkBox); + y += checkBox.fullBounds().height() + padding; + }); + y += padding; + + // - create selectors for blocks + SpriteMorph.prototype.allCategories().forEach(category => { + this.blocks.forEach(definition => { + if (definition.category === category) { + if (lastCat && (category !== lastCat)) { + y += padding; + } + lastCat = category; + block = definition.templateInstance(); + block.isToggleLabel = true; // mark as unrefreshable label + checkBox = new ToggleMorph( + 'checkbox', + this, + () => { + var idx = this.blocks.indexOf(definition); + if (idx > -1) { + this.blocks.splice(idx, 1); + } else { + this.blocks.push(definition); + } + this.collectDependencies(); + }, + null, + () => contains(this.blocks, definition), + null, + null, + this.target ? block : block.fullImage() + ); + checkBox.setPosition(new Point( + x, + y + (checkBox.top() - checkBox.toggleElement.top()) + )); + palette.addContents(checkBox); + y += checkBox.fullBounds().height() + padding; + } + }); + }); + + palette.scrollX(padding); + palette.scrollY(padding); + this.addBody(palette); + + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + + this.setExtent(new Point(220, 300)); + this.fixLayout(); +}; + +BlockExportDialogMorph.prototype.popUp = function (wrrld) { + var world = wrrld || this.target.world(); + if (world) { + BlockExportDialogMorph.uber.popUp.call(this, world); + this.handle = new HandleMorph( + this, + 200, + 220, + this.corner, + this.corner + ); + } +}; + +// BlockExportDialogMorph menu + +BlockExportDialogMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this, 'select'); + menu.addItem('all', 'selectAll'); + menu.addItem('none', 'selectNone'); + return menu; +}; + +BlockExportDialogMorph.prototype.selectAll = function () { + this.body.contents.children.forEach(checkBox => { + if (!checkBox.state) { + checkBox.trigger(); + } + }); +}; + +BlockExportDialogMorph.prototype.selectNone = function () { + this.blocks = []; + this.body.contents.children.forEach(checkBox => { + checkBox.refresh(); + }); +}; + +// BlockExportDialogMorph dependency management + +BlockExportDialogMorph.prototype.collectDependencies = function () { + // add dependencies to the blocks: + this.dependencies().forEach(def => { + if (!contains(this.blocks, def)) { + this.blocks.push(def); + } + }); + this.collectDataDependencies(); + // refresh the checkmarks + this.body.contents.children.forEach(checkBox => { + checkBox.refresh(); + }); +}; + +BlockExportDialogMorph.prototype.dependencies = function () { + var deps = []; + this.blocks.forEach(def => def.collectDependencies( + [], + deps, + def.receiver + )); + return deps; +}; + +// BlockExportDialogMorph ops + +BlockExportDialogMorph.prototype.exportBlocks = function () { + var ide = this.world().children[0]; + + if (this.blocks.length) { + ide.saveXMLAs( + ide.blocksLibraryXML( + this.blocks, + null, + true, // as file + this.globalData.fork(this.globalVarNames), + this.localData.fork(this.localVarNames) + ), + (ide.getProjectName() || localize('untitled')) + + ' ' + + localize('blocks' + ) + ); + } else { + new DialogBoxMorph().inform( + 'Export blocks', + 'no blocks were selected', + this.world() + ); + } +}; + +// BlockExportDialogMorph layout + +BlockExportDialogMorph.prototype.fixLayout + = BlockEditorMorph.prototype.fixLayout; + +// BlockImportDialogMorph //////////////////////////////////////////////////// + +// BlockImportDialogMorph inherits from DialogBoxMorph +// and pseudo-inherits from BlockExportDialogMorph: + +BlockImportDialogMorph.prototype = new DialogBoxMorph(); +BlockImportDialogMorph.prototype.constructor = BlockImportDialogMorph; +BlockImportDialogMorph.uber = DialogBoxMorph.prototype; + +// BlockImportDialogMorph constants: + +BlockImportDialogMorph.prototype.key = 'blockImport'; + +// BlockImportDialogMorph instance creation: + +function BlockImportDialogMorph(blocks, target, name) { + this.init(blocks, target, name); +} + +BlockImportDialogMorph.prototype.init = function (blocks, target, name) { + // additional properties: + this.blocks = blocks.slice(0); + this.handle = null; + + // initialize inherited properties: + BlockExportDialogMorph.uber.init.call( + this, + target, + () => this.importBlocks(name), + null // environment + ); + + // override inherited properites: + this.labelString = localize('Import blocks') + + (name ? ': ' : '') + + name || ''; + this.createLabel(); + + // build contents + this.buildContents(); +}; + +BlockImportDialogMorph.prototype.buildContents + = BlockExportDialogMorph.prototype.buildContents; + +BlockImportDialogMorph.prototype.popUp + = BlockExportDialogMorph.prototype.popUp; + +// BlockImportDialogMorph menu + +BlockImportDialogMorph.prototype.userMenu + = BlockExportDialogMorph.prototype.userMenu; + +BlockImportDialogMorph.prototype.selectAll + = BlockExportDialogMorph.prototype.selectAll; + +BlockImportDialogMorph.prototype.selectNone + = BlockExportDialogMorph.prototype.selectNone; + +// BlockImportDialogMorph ops + +BlockImportDialogMorph.prototype.importBlocks = function (name) { + var ide = this.target.parentThatIsA(IDE_Morph); + if (!ide) {return; } + if (this.blocks.length > 0) { + this.blocks.forEach(def => { + if (def.isGlobal) { + def.receiver = ide.stage; + ide.stage.globalBlocks.push(def); + ide.stage.replaceDoubleDefinitionsFor(def); + } else { + def.receiver = ide.currentSprite; + ide.currentSprite.customBlocks.push(def); + ide.currentSprite.replaceDoubleDefinitionsFor(def); + } + }); + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + ide.showMessage( + 'Imported Blocks Module' + (name ? ': ' + name : '') + '.', + 2 + ); + } else { + new DialogBoxMorph().inform( + 'Import blocks', + 'no blocks were selected', + this.world() + ); + } +}; + +// BlockImportDialogMorph layout + +BlockImportDialogMorph.prototype.fixLayout + = BlockEditorMorph.prototype.fixLayout; + +// BlockRemovalDialogMorph /////////////////////////////////////////////////// + +// BlockRemovalDialogMorph inherits from DialogBoxMorph +// and pseudo-inherits from BlockExportDialogMorph: + +BlockRemovalDialogMorph.prototype = new DialogBoxMorph(); +BlockRemovalDialogMorph.prototype.constructor = BlockImportDialogMorph; +BlockRemovalDialogMorph.uber = DialogBoxMorph.prototype; + +// BlockRemovalDialogMorph constants: + +BlockRemovalDialogMorph.prototype.key = 'blockRemove'; + +// BlockRemovalDialogMorph instance creation: + +function BlockRemovalDialogMorph(blocks, target) { + this.init(blocks, target); +} + +BlockRemovalDialogMorph.prototype.init = function (blocks, target) { + // additional properties: + this.blocks = blocks.slice(0); + this.handle = null; + + // initialize inherited properties: + BlockExportDialogMorph.uber.init.call( + this, + target, + () => this.removeBlocks(), + null // environment + ); + + // override inherited properites: + this.labelString = localize('Remove unused blocks') + + (name ? ': ' : '') + + name || ''; + this.createLabel(); + + // build contents + this.buildContents(); +}; + +BlockRemovalDialogMorph.prototype.buildContents = function () { + var palette, x, y, block, checkBox, lastCat, + padding = 4; + + // create plaette + palette = new ScrollFrameMorph( + null, + null, + SpriteMorph.prototype.sliderColor + ); + palette.color = SpriteMorph.prototype.paletteColor; + palette.padding = padding; + palette.isDraggable = false; + palette.acceptsDrops = false; + palette.contents.acceptsDrops = false; + + // populate palette + x = palette.left() + padding; + y = palette.top() + padding; + + // - create selectors for blocks + SpriteMorph.prototype.allCategories().forEach(category => { + this.blocks.forEach(definition => { + if (definition.category === category) { + if (lastCat && (category !== lastCat)) { + y += padding; + } + lastCat = category; + block = definition.templateInstance(); + block.isToggleLabel = true; // mark as unrefreshable label + checkBox = new ToggleMorph( + 'checkbox', + this, + () => { + var idx = this.blocks.indexOf(definition); + if (idx > -1) { + this.blocks.splice(idx, 1); + } else { + this.blocks.push(definition); + } + this.collectDependencies(); + }, + null, + () => contains(this.blocks, definition), + null, + null, + this.target ? block : block.fullImage() + ); + checkBox.setPosition(new Point( + x, + y + (checkBox.top() - checkBox.toggleElement.top()) + )); + palette.addContents(checkBox); + y += checkBox.fullBounds().height() + padding; + } + }); + }); + + palette.scrollX(padding); + palette.scrollY(padding); + this.addBody(palette); + + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + + this.setExtent(new Point(220, 300)); + this.fixLayout(); +}; + +BlockRemovalDialogMorph.prototype.popUp + = BlockExportDialogMorph.prototype.popUp; + +// BlockRemovalDialogMorph menu + +BlockRemovalDialogMorph.prototype.userMenu + = BlockExportDialogMorph.prototype.userMenu; + +BlockRemovalDialogMorph.prototype.selectAll + = BlockExportDialogMorph.prototype.selectAll; + +BlockRemovalDialogMorph.prototype.selectNone + = BlockExportDialogMorph.prototype.selectNone; + +// BlockRemovelDialogMorph dependency management + +BlockRemovalDialogMorph.prototype.collectDependencies = function () { + // add dependencies to the blocks: + this.dependencies().forEach(def => { + if (!contains(this.blocks, def)) { + this.blocks.push(def); + } + }); + // refresh the checkmarks + this.body.contents.children.forEach(checkBox => { + checkBox.refresh(); + }); +}; + +BlockRemovalDialogMorph.prototype.dependencies = + BlockExportDialogMorph.prototype.dependencies; + +// BlockRemovalDialogMorph ops + +BlockRemovalDialogMorph.prototype.removeBlocks = function () { + var ide = this.target; + if (!ide) {return; } + if (this.blocks.length > 0) { + this.blocks.forEach(def => { + var idx = ide.stage.globalBlocks.indexOf(def); + if (idx !== -1) { + ide.stage.globalBlocks.splice(idx, 1); + } + }); + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + ide.showMessage( + this.blocks.length + ' ' + localize('unused block(s) removed'), + 2 + ); + } else { + new DialogBoxMorph().inform( + 'Remove unused blocks', + 'no blocks were selected', + this.world() + ); + } +}; + +// BlockRemovalDialogMorph layout + +BlockRemovalDialogMorph.prototype.fixLayout + = BlockEditorMorph.prototype.fixLayout; + +// BlockVisibilityDialogMorph ////////////////////////////////////////////////// + +// BlockVisibilityDialogMorph inherits from DialogBoxMorph +// and pseudo-inherits from BlockExportDialogMorph: + +BlockVisibilityDialogMorph.prototype = new DialogBoxMorph(); +BlockVisibilityDialogMorph.prototype.constructor = BlockVisibilityDialogMorph; +BlockVisibilityDialogMorph.uber = DialogBoxMorph.prototype; + +// BlockVisibilityDialogMorph constants: + +BlockVisibilityDialogMorph.prototype.key = 'blockVisibility'; + +// BlockVisibilityDialogMorph instance creation: + +function BlockVisibilityDialogMorph(target) { + this.init(target); +} + +BlockVisibilityDialogMorph.prototype.init = function (target) { + // additional properties: + this.blocks = target.allPaletteBlocks(); + this.selection = this.blocks.filter(each => target.isHidingBlock(each)); + this.handle = null; + + // initialize inherited properties: + BlockVisibilityDialogMorph.uber.init.call( + this, + target, + () => this.hideBlocks(), + null // environment + ); + + // override inherited properites: + this.labelString = localize('Hide blocks in palette') + + (name ? ': ' : '') + + name || ''; + this.createLabel(); + + // build contents + this.buildContents(); +}; + +BlockVisibilityDialogMorph.prototype.buildContents = function () { + var palette, x, y, checkBox, lastCat, + padding = 4; + + // create plaette + palette = new ScrollFrameMorph( + null, + null, + SpriteMorph.prototype.sliderColor + ); + palette.color = SpriteMorph.prototype.paletteColor; + palette.padding = padding; + palette.isDraggable = false; + palette.acceptsDrops = false; + palette.contents.acceptsDrops = false; + + // populate palette + x = palette.left() + padding; + y = palette.top() + padding; + + this.blocks.forEach(block => { + if (lastCat && (block.category !== lastCat)) { + y += padding; + } + lastCat = block.category; + + block.isToggleLabel = true; // mark block as unrefreshable toggle label + checkBox = new ToggleMorph( + 'checkbox', + this, + () => { + var idx = this.selection.indexOf(block); + if (idx > -1) { + this.selection.splice(idx, 1); + } else { + this.selection.push(block); + } + }, + null, + () => contains(this.selection, block), + null, + null, + block // allow block to be dragged off from templates + ); + checkBox.setPosition(new Point( + x, + y + (checkBox.top() - checkBox.toggleElement.top()) + )); + palette.addContents(checkBox); + y += checkBox.fullBounds().height() + padding; + }); + + palette.scrollX(padding); + palette.scrollY(padding); + this.addBody(palette); + + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + + this.setExtent(new Point(220, 300)); + this.fixLayout(); +}; + +BlockVisibilityDialogMorph.prototype.popUp + = BlockExportDialogMorph.prototype.popUp; + +// BlockVisibilityDialogMorph menu + +BlockVisibilityDialogMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this, 'select'); + menu.addItem('all', 'selectAll'); + menu.addItem('none', 'selectNone'); + menu.addLine(); + menu.addItem('unused', 'selectUnused'); + return menu; +}; + + +BlockVisibilityDialogMorph.prototype.selectAll = function () { + this.selection = this.blocks.slice(0); + this.body.contents.children.forEach(checkBox => { + checkBox.refresh(); + }); +}; + +BlockVisibilityDialogMorph.prototype.selectNone = function () { + this.selection = []; + this.body.contents.children.forEach(checkBox => { + checkBox.refresh(); + }); +}; + +BlockVisibilityDialogMorph.prototype.selectUnused = function () { + var used = this.target.scripts.allChildren().filter( + m => m instanceof BlockMorph), + uPrim = [], + uCust = [], + uVars = []; + + used.forEach(b => { + if (b.isCustomBlock) { + uCust.push(b.isGlobal ? b.definition + : this.target.getMethod(b.semanticSpec)); + } else if (b.selector === 'reportGetVar') { + uVars.push(b.blockSpec); + } else { + uPrim.push(b.selector); + } + }); + + this.selection = this.blocks.filter(b => { + if (b.isCustomBlock) { + return !contains( + uCust, + b.isGlobal ? b.definition + : this.target.getMethod(b.semanticSpec) + ); + } else if (b.selector === 'reportGetVar') { + return !contains(uVars, b.blockSpec); + } else { + return !contains(uPrim, b.selector); + } + }); + + this.body.contents.children.forEach(checkBox => { + checkBox.refresh(); + }); +}; + +// BlockVisibilityDialogMorph ops + +BlockVisibilityDialogMorph.prototype.hideBlocks = function () { + var ide = this.target.parentThatIsA(IDE_Morph); + this.blocks.forEach(block => this.target.changeBlockVisibility( + block, + contains(this.selection, block), + true // quick - without palette update + )); + if (this.selection.length === 0) { + StageMorph.prototype.hiddenPrimitives = []; + } + ide.flushBlocksCache(); + ide.refreshPalette(); + ide.categories.refreshEmpty(); + this.target.recordUserEdit( + 'palette', + 'hide block' + ); +}; + +// BlockVisibilityDialogMorph layout + +BlockVisibilityDialogMorph.prototype.fixLayout + = BlockEditorMorph.prototype.fixLayout; diff --git a/elements/pl-snap/Snap/src/click.wav b/elements/pl-snap/Snap/src/click.wav new file mode 100644 index 00000000..74b92147 Binary files /dev/null and b/elements/pl-snap/Snap/src/click.wav differ diff --git a/elements/pl-snap/Snap/src/cloud.js b/elements/pl-snap/Snap/src/cloud.js new file mode 100644 index 00000000..ea12bd0c --- /dev/null +++ b/elements/pl-snap/Snap/src/cloud.js @@ -0,0 +1,1128 @@ +/* + + cloud.js + + a backend API for SNAP! + + written by Bernat Romagosa + inspired by the original cloud API by Jens Mönig + + Copyright (C) 2018 by Bernat Romagosa + Copyright (C) 2015 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +*/ + +// Global settings ///////////////////////////////////////////////////// +// cloud.js should be able to exist indepent of Snap! +// (The module date is included for simplicity, but is not needed elsewhere.) + +/*global modules, hex_sha512*/ + +modules = modules || {}; +modules.cloud = '2023-April-12'; + +// Global stuff + +var Cloud; + +// Cloud ///////////////////////////////////////////////////////////// + +function Cloud() { + this.init(); +} + +Cloud.prototype.init = function () { + this.apiBasePath = '/api/v1'; + this.url = this.determineCloudDomain() + this.apiBasePath; + this.username = null; + this.disabled = false; +}; + +Cloud.prototype.disable = function () { + this.disabled = true; + this.username = null; +}; + +// Projects larger than this are rejected. +Cloud.MAX_FILE_SIZE = 10 * 1024 * 1024; + +Cloud.prototype.knownDomains = { + 'Snap!Cloud' : 'https://snap.berkeley.edu', + 'Snap!Cloud (cs10)' : 'https://snap-cloud.cs10.org', + 'Snap!Cloud (staging)': 'https://snap-staging.cs10.org', + 'localhost': 'http://localhost:8080', + 'localhost (secure)': 'https://localhost:4431' +}; + +Cloud.prototype.defaultDomain = Cloud.prototype.knownDomains['Snap!Cloud']; + +Cloud.prototype.determineCloudDomain = function () { + // We dynamically determine the domain of the cloud server. + // This allows for easy mirrors and development servers. + // The domain is determined by: + // 1. in snap.html. + // 2. The current page's domain + var currentDomain = window.location.host, // host includes the port. + metaTag = document.head.querySelector("[name='snap-cloud-domain']"), + cloudDomain = this.defaultDomain, + domainMap = this.knownDomains; + + if (metaTag) { return metaTag.getAttribute('location'); } + + Object.keys(domainMap).some(function (name) { + var server = domainMap[name]; + if (Cloud.isMatchingDomain(currentDomain, server)) { + cloudDomain = server; + return true; + } + return false; + }); + + return cloudDomain; +}; + +Cloud.isMatchingDomain = function (client, server) { + // A matching domain means that the client-server are not subject to + // 3rd party cookie restrictions. + // see https://tools.ietf.org/html/rfc6265#section-5.1.3 + // This matches a domain at end of a subdomain URL. + var position = server.indexOf(client); + switch (position) { + case -1: + return false; + case 0: + return client === server; + default: + return /[\.\/]/.test(server[position - 1]) && + server.length === position + client.length; + } +}; + +// Dictionary handling + +Cloud.prototype.parseDict = function (src) { + var dict = {}; + if (!src) {return dict; } + src.split("&").forEach(function (entry) { + var pair = entry.split("="), + key = decodeURIComponent(pair[0]), + val = decodeURIComponent(pair[1]); + dict[key] = val; + }); + return dict; +}; + +Cloud.prototype.encodeDict = function (dict) { + var str = '', + pair, + key; + if (!dict) {return null; } + for (key in dict) { + if (dict.hasOwnProperty(key)) { + pair = encodeURIComponent(key) + + '=' + + encodeURIComponent(dict[key]); + if (str.length > 0) { + str += '&'; + } + str += pair; + } + } + return str; +}; + +// Error handling + +Cloud.genericErrorMessage = + 'There was an error while trying to access\n' + + 'a Snap!Cloud service. Please try again later.'; + +Cloud.prototype.genericError = function () { + throw new Error(Cloud.genericErrorMessage); +}; + + + +// Low level functionality + +Cloud.prototype.request = function ( + method, + path, + onSuccess, + onError, + errorMsg, + wantsRawResponse, + body) { + + if (this.disabled) { return; } + + var request = new XMLHttpRequest(), + myself = this, + fullPath = this.url + + (path.indexOf('%username') > -1 ? + path.replace('%username', encodeURIComponent(this.username)) : + path); + + try { + request.open( + method, + fullPath, + true + ); + request.setRequestHeader( + 'Content-Type', + 'application/json; charset=utf-8' + ); + request.withCredentials = true; + request.onreadystatechange = function () { + if (request.readyState === 4) { + if (request.responseText) { + var response = + (!wantsRawResponse || + (request.responseText.indexOf('{"errors"') === 0)) ? + JSON.parse(request.responseText) : + request.responseText; + + if (response.errors) { + onError.call( + null, + response.errors[0], + errorMsg + ); + } else { + if (onSuccess) { + onSuccess.call(null, response.message || response); + } + } + } else { + if (onError) { + onError.call( + null, + errorMsg || Cloud.genericErrorMessage, + myself.url + ); + } else { + myself.genericError(); + } + } + } + }; + request.send(typeof body === 'object' ? JSON.stringify(body) : body); + } catch (err) { + onError.call(this, err.toString(), 'Cloud Error'); + } +}; + +Cloud.prototype.withCredentialsRequest = function ( + method, + path, + onSuccess, + onError, + errorMsg, + wantsRawResponse, + body) { + + var myself = this; + this.checkCredentials( + function (username) { + if (username) { + myself.request( + method, + // %username is replaced by the actual username + path, + onSuccess, + onError, + errorMsg, + wantsRawResponse, + body); + } else { + onError.call(this, 'You are not logged in', 'Snap!Cloud'); + } + } + ); +}; + +// Credentials management + +Cloud.prototype.initSession = function (onSuccess) { + var myself = this; + if (location.protocol === 'file:') { + // disabled for now (jens) + return; + } + this.request( + 'POST', + '/init', + function () { myself.checkCredentials(onSuccess); }, + function () {}, + null, + true + ); +}; + +Cloud.prototype.checkCredentials = function (onSuccess, onError, response) { + var myself = this; + this.getCurrentUser( + function (user) { + if (user.username) { + myself.username = user.username; + myself.verified = user.verified; + } + if (onSuccess) { + onSuccess.call( + null, + user.username, + user.role, + response ? JSON.parse(response) : null + ); + } + }, + onError + ); +}; + +Cloud.prototype.getCurrentUser = function (onSuccess, onError) { + this.request( + 'GET', + '/users/c', + onSuccess, + onError, + 'Could not retrieve current user' + ); +}; + +Cloud.prototype.getUser = function (username, onSuccess, onError) { + this.request( + 'GET', + '/users/' + encodeURIComponent(username), + onSuccess, + onError, + 'Could not retrieve user' + ); +}; + +Cloud.prototype.logout = function (onSuccess, onError) { + this.username = null; + this.request( + 'POST', + '/logout', + onSuccess, + onError, + 'logout failed' + ); +}; + +Cloud.prototype.login = function ( + username, + password, + persist, + onSuccess, + onError +) { + var myself = this; + this.request( + 'POST', + '/users/' + encodeURIComponent(username) + '/login?' + + this.encodeDict({ + persist: persist + }), + function (response) { + myself.checkCredentials(onSuccess, onError, response); + }, + onError, + 'login failed', + 'false', // wants raw response + hex_sha512(password) // password travels inside the body + ); +}; + +Cloud.prototype.signup = function ( + username, + password, + passwordRepeat, + email, + onSuccess, + onError +) { + this.request( + 'POST', + '/users/' + encodeURIComponent(username.trim()) + '?' + this.encodeDict({ + email: email, + password: hex_sha512(password), + password_repeat: hex_sha512(passwordRepeat) + }), + onSuccess, + onError, + 'signup failed'); +}; + +Cloud.prototype.changePassword = function ( + password, + newPassword, + passwordRepeat, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/%username/newpassword?' + this.encodeDict({ + oldpassword: hex_sha512(password), + password_repeat: hex_sha512(passwordRepeat), + newpassword: hex_sha512(newPassword) + }), + onSuccess, + onError, + 'Could not change password' + ); +}; + +Cloud.prototype.resetPassword = function (username, onSuccess, onError) { + this.request( + 'POST', + '/users/' + encodeURIComponent(username) + '/password_reset', + onSuccess, + onError, + 'Password reset request failed' + ); +}; + +Cloud.prototype.resendVerification = function (username, onSuccess, onError) { + this.request( + 'POST', + '/users/' + encodeURIComponent(username) + '/resendverification', + onSuccess, + onError, + 'Could not send verification email' + ); +}; + + +// Projects + +Cloud.prototype.saveProject = function (projectName, body, onSuccess, onError) { + // Expects a body object with the following paramters: + // xml, media, thumbnail, remixID (optional), notes (optional) + var myself = this; + this.checkCredentials( + function (username) { + if (username) { + myself.request( + 'POST', + '/projects/' + + encodeURIComponent(username) + + '/' + + encodeURIComponent(projectName), + onSuccess, + onError, + 'Project could not be saved', + false, + body // POST body + ); + } else { + onError.call(this, 'You are not logged in', 'Snap!Cloud'); + } + } + ); +}; + +Cloud.prototype.getProjectList = function (onSuccess, onError, withThumbnail) { + var path = '/projects/%username?updatingnotes=true'; + + if (withThumbnail) { + path += '&withthumbnail=true'; + } + + this.withCredentialsRequest( + 'GET', + path, + onSuccess, + onError, + 'Could not fetch projects' + ); +}; + +Cloud.prototype.getPublishedProjectList = function ( + username, + page, + pageSize, + searchTerm, + onSuccess, + onError, + withThumbnail +) { + var path = '/projects' + + (username ? '/' + encodeURIComponent(username) : '') + + '?ispublished=true'; + + if (!username) { + // When requesting the global list of published projects, filter out + // those with project names that are typical of online courses like + // Teals or BJC. When requesting a user's published projects, show them + // all. + path += '&filtered=true'; + } + + if (withThumbnail) { + path += '&withthumbnail=true'; + } + + if (page) { + path += '&page=' + page + '&pagesize=' + (pageSize || 16); + } + + if (searchTerm) { + path += '&matchtext=' + encodeURIComponent(searchTerm); + } + + this.request( + 'GET', + path, + onSuccess, + onError, + 'Could not fetch projects' + ); +}; + +Cloud.prototype.getThumbnail = function ( + username, + projectName, + onSuccess, + onError +) { + this[username ? 'request' : 'withCredentialsRequest']( + 'GET', + '/projects/' + + (username ? encodeURIComponent(username) : '%username') + + '/' + + encodeURIComponent(projectName) + + '/thumbnail', + onSuccess, + onError, + 'Could not fetch thumbnail', + true + ); +}; + +Cloud.prototype.getProject = function (projectName, delta, onSuccess, onError) { + this.withCredentialsRequest( + 'GET', + '/projects/%username/' + + encodeURIComponent(projectName) + + (delta ? '?delta=' + delta : ''), + onSuccess, + onError, + 'Could not fetch project ' + projectName, + true + ); +}; + +Cloud.prototype.getPublicProject = function ( + projectName, + username, + onSuccess, + onError +) { + this.request( + 'GET', + '/projects/' + + encodeURIComponent(username) + + '/' + + encodeURIComponent(projectName), + onSuccess, + onError, + 'Could not fetch project ' + projectName, + true + ); +}; + +Cloud.prototype.getProjectMetadata = function ( + projectName, + username, + onSuccess, + onError +) { + this.request( + 'GET', + '/projects/' + + encodeURIComponent(username) + + '/' + + encodeURIComponent(projectName) + + '/metadata', + onSuccess, + onError, + 'Could not fetch metadata for ' + projectName + ); +}; + +Cloud.prototype.getProjectVersionMetadata = function ( + projectName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'GET', + '/projects/%username/' + + encodeURIComponent(projectName) + + '/versions', + onSuccess, + onError, + 'Could not fetch versions for project ' + projectName + ); +}; + +Cloud.prototype.getRemixes = function ( + username, + projectName, + page, + pageSize, + onSuccess, + onError +) { + var path = '/projects/' + + encodeURIComponent(username) + '/' + + encodeURIComponent(projectName) + '/remixes'; + + if (page) { + path += '?page=' + page + '&pagesize=' + (pageSize || 16); + } + + this.request( + 'GET', + path, + onSuccess, + onError, + 'Could not fetch remixes for project ' + projectName + ); +}; + +Cloud.prototype.deleteProject = function ( + projectName, + username, + onSuccess, + onError +) { + this[username ? 'request' : 'withCredentialsRequest']( + 'DELETE', + '/projects/' + + (username ? encodeURIComponent(username) : '%username') + + '/' + + encodeURIComponent(projectName), + onSuccess, + onError, + 'Could not delete project' + ); +}; + +Cloud.prototype.shareProject = function ( + projectName, + username, + onSuccess, + onError +) { + this[username ? 'request' : 'withCredentialsRequest']( + 'POST', + '/projects/' + + (username ? encodeURIComponent(username) : '%username') + + '/' + + encodeURIComponent(projectName) + + '/metadata?ispublic=true', + onSuccess, + onError, + 'Could not share project' + ); +}; + +Cloud.prototype.unshareProject = function ( + projectName, + username, + onSuccess, + onError +) { + this[username ? 'request' : 'withCredentialsRequest']( + 'POST', + '/projects/' + + (username ? encodeURIComponent(username) : '%username') + + '/' + + encodeURIComponent(projectName) + + '/metadata?ispublic=false&ispublished=false', + onSuccess, + onError, + 'Could not unshare project' + ); +}; + +Cloud.prototype.publishProject = function ( + projectName, + username, + onSuccess, + onError +) { + this[username ? 'request' : 'withCredentialsRequest']( + 'POST', + '/projects/' + + (username ? encodeURIComponent(username) : '%username') + + '/' + + encodeURIComponent(projectName) + + '/metadata?ispublished=true', + onSuccess, + onError, + 'Could not publish project' + ); +}; + +Cloud.prototype.unpublishProject = function ( + projectName, + username, + onSuccess, + onError +) { + this[username ? 'request' : 'withCredentialsRequest']( + 'POST', + '/projects/' + + (username ? encodeURIComponent(username) : '%username') + + '/' + + encodeURIComponent(projectName) + + '/metadata?ispublished=false', + onSuccess, + onError, + 'Could not unpublish project' + ); +}; + +Cloud.prototype.updateNotes = function ( + projectName, + notes, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/projects/%username/' + + encodeURIComponent(projectName) + + '/metadata', + onSuccess, + onError, + 'Could not update project notes', + false, // wants raw response + { notes: notes } + ); +}; + +Cloud.prototype.updateProjectName = function ( + projectName, + newName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/projects/%username/' + + encodeURIComponent(projectName) + + '/metadata', + onSuccess, + onError, + 'Could not update project name', + false, // wants raw response + { projectname: newName } + ); +}; + +// Collections + +Cloud.prototype.newCollection = function ( + collectionName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/%username/collections/' + encodeURIComponent(collectionName), + onSuccess, + onError, + 'Could not create collection' + ); +}; + +Cloud.prototype.getCollectionMetadata = function ( + collectionUsername, + collectionName, + onSuccess, + onError +) { + this.request( + 'GET', + '/users/' + + (collectionUsername ? + encodeURIComponent(collectionUsername) : + '%username') + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata', + onSuccess, + onError, + 'Could not fetch metadata for ' + collectionName + ); +}; + +Cloud.prototype.getCollectionProjects = function ( + collectionUsername, + page, + pageSize, + collectionName, + onSuccess, + onError, + withThumbnail +) { + var path = '/users/' + + (collectionUsername ? + encodeURIComponent(collectionUsername) : + '%username') + + '/collections/' + encodeURIComponent(collectionName) + + '/projects'; + + if (page) { + path += '?page=' + page + '&pagesize=' + (pageSize || 16); + } + + if (withThumbnail) { + path += (page ? '&' : '?') + 'withthumbnail=true'; + } + + this.request( + 'GET', + path, + onSuccess, + onError, + 'Could not fetch projects' + ); +}; + +Cloud.prototype.setCollectionThumbnail = function ( + collectionUsername, + collectionName, + thumbnailId, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/thumbnail?id=' + encodeURIComponent(thumbnailId), + onSuccess, + onError, + 'Could not set project thumbnail' + ); +}; + +Cloud.prototype.updateCollectionDescription = function ( + collectionUsername, + collectionName, + description, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata', + onSuccess, + onError, + 'Could not update collection description', + false, // wants raw response + { description: description } + ); +}; + +Cloud.prototype.updateCollectionName = function ( + collectionUsername, + collectionName, + newName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata', + onSuccess, + onError, + 'Could not update collection name', + false, // wants raw response + { name: newName } + ); +}; + +Cloud.prototype.shareCollection = function ( + collectionUsername, + collectionName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata?shared=true', + onSuccess, + onError, + 'Could not share collection' + ); +}; + +Cloud.prototype.unshareCollection = function ( + collectionUsername, + collectionName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata?shared=false&published=false', + onSuccess, + onError, + 'Could not unshare collection' + ); +}; + +Cloud.prototype.publishCollection = function ( + collectionUsername, + collectionName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata?published=true', + onSuccess, + onError, + 'Could not publish collection' + ); +}; + +Cloud.prototype.unpublishCollection = function ( + collectionUsername, + collectionName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/metadata?published=false', + onSuccess, + onError, + 'Could not unpublish collection' + ); +}; + +Cloud.prototype.addProjectToCollection = function ( + collectionUsername, + collectionName, + projectUsername, + projectName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/projects', + onSuccess, + onError, + 'Could not add project to collection', + false, // wants raw response + { + username: projectUsername, + projectname: projectName + } + ); +}; + +Cloud.prototype.removeProjectFromCollection = function ( + collectionUsername, + collectionName, + projectId, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'DELETE', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/projects/' + encodeURIComponent(projectId), + onSuccess, + onError, + 'Could not remove project from collection' + ); +}; + +Cloud.prototype.getUserCollections = function ( + collectionUsername, + page, + pageSize, + searchTerm, + onSuccess, + onError +) { + this[(collectionUsername !== this.username) ? + 'request' : + 'withCredentialsRequest']( + 'GET', + '/users/' + + (collectionUsername ? + encodeURIComponent(collectionUsername) : + '%username') + + '/collections?' + + this.encodeDict( + page > 0 ? + { + page: page, + pagesize: pageSize || 16, + matchtext: + searchTerm ? encodeURIComponent(searchTerm) : '' + } : {} + ), + onSuccess, + onError, + 'Could not fetch collections' + ); +}; + +Cloud.prototype.getCollectionsContainingProject = function ( + username, + projectName, + page, + pageSize, + onSuccess, + onError +) { + var path = '/projects/' + + encodeURIComponent(username) + '/' + + encodeURIComponent(projectName) + '/collections'; + + if (page) { + path += '?page=' + page + '&pagesize=' + (pageSize || 16); + } + + this.request( + 'GET', + path, + onSuccess, + onError, + 'Could not fetch collections for project ' + projectName + ); +}; + +Cloud.prototype.getCollections = function ( + page, + pageSize, + searchTerm, + onSuccess, + onError +) { + var dict = { + page: page, + pagesize: page ? pageSize || 16 : '', + }; + + if (searchTerm) { dict.matchtext = encodeURIComponent(searchTerm); } + + this.request( + 'GET', + '/collections?' + this.encodeDict(dict), + onSuccess, + onError, + 'Could not fetch collections' + ); +}; + +Cloud.prototype.deleteCollection = function ( + collectionUsername, + collectionName, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'DELETE', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName), + onSuccess, + onError, + 'Could not remove collection' + ); +}; + +Cloud.prototype.addEditorToCollection = function ( + collectionUsername, + collectionName, + editorUsername, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'POST', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/editors', + onSuccess, + onError, + 'Could not add editor to collection', + false, // wants raw response + { editor_username: editorUsername } + ); +}; + +Cloud.prototype.removeEditorFromCollection = function ( + collectionUsername, + collectionName, + editorUsername, + onSuccess, + onError +) { + this.withCredentialsRequest( + 'DELETE', + '/users/' + encodeURIComponent(collectionUsername) + + '/collections/' + encodeURIComponent(collectionName) + + '/editors/' + encodeURIComponent(editorUsername), + onSuccess, + onError, + 'Could not remove editor from collection' + ); +}; + +// Paths to front-end pages +/* + This list of paths is incomplete, we will add them as necessary. + Important: a path is a string *without* a domain. + These paths are not prefixed by `apiBasePath`. +*/ + +Cloud.prototype.showProjectPath = function (username, projectname) { + return '/project?' + this.encodeDict({ + username: username, + projectname: projectname + }); +}; diff --git a/elements/pl-snap/Snap/src/extensions.js b/elements/pl-snap/Snap/src/extensions.js new file mode 100644 index 00000000..35077c42 --- /dev/null +++ b/elements/pl-snap/Snap/src/extensions.js @@ -0,0 +1,1612 @@ +/* + + extensions.js + + additional primitives for SNAP! + + written by Jens Mönig + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +*/ + +// Global settings ///////////////////////////////////////////////////// + +/*global modules, List, StageMorph, Costume, SpeechSynthesisUtterance, Sound, +IDE_Morph, CamSnapshotDialogMorph, SoundRecorderDialogMorph, isSnapObject, nop, +Color, Process, contains, localize, SnapTranslator, isString, detect, Point, +SVG_Costume, newCanvas, WatcherMorph, BlockMorph, HatBlockMorph*/ + +/*jshint esversion: 11, bitwise: false*/ + +modules.extensions = '2024-February-13'; + +// Global stuff + +var SnapExtensions = { + primitives: new Map(), + menus: new Map(), + buttons: { + palette: [] + }, + scripts: [], + urls: [ // allow-list of trusted servers + 'libraries/', + 'https://snap.berkeley.edu/', + 'https://bjc.berkeley.edu/', + 'https://cs10.org/', + 'https://ecraft2learn.github.io/ai/', // Uni-Oxford, Ken Kahn + 'https://microworld.edc.org/', // EDC, E. Paul Goldenberg + 'https://birdbraintechnologies.com/' // BirdBrain technologies, Tom Lauwers + ] +}; + +/* + SnapExtensions is a set of three global dictionaries of named functions to + be used as extension primitives for blocks, dynamic dropdown menus and + custom push-buttons inside block palette categories. Block extensions are + stored in the "primitives" dictionary of SnapExtensions, dynamic dropdown + menus in the "menus" section and custom palette push-buttons in the + "buttons" collection. + + You can also extend Snap! with your own externally hosted JavaScript file(s) + and have them add your own extension primitives, menus and buttons to the + global SnapExtensions dictionaries. This lets you provide libraries to + support special APIs and custom hardware. + + + 1. Primitives (additional blocks) + ================================= + The names under which primitives are stored will apear in the dropdown + menus of the hidden extension "primitive" blocks sorted alphabetically. + (You can find those extension primitives in Snap's search bar or in dev + mode. There are two version of the primitive block, a command version and + a reporter one, both show the same list of available extensions. + + naming conventions + ------------------ + domain-prefix_function-name(parameter-list) + example: 'lst_sort(list, fn)' + + - domain-prefix: max 3-letter lowercase identifier + followed by an underscore + e.g.: err_, lst_, txt_, dta_, map_, tts_, xhr_, geo_, mda_ + + - function-name: short, single word if possible, lowercase + - parameter-list: comma separated names or type indicators + + function semantics + ------------------ + - functions are called by the "primitive" blocks with any arguments provided + - use the "function () {}" notation to define functions, not the ES6 arrow + notation, otherwise "this" will not get scoped correctly + - "this" refers to the current snap object (sprite or stage) at call-time + - a reference to the current process is always passed as last argument + + + 2. Menus (for input slots) + ========================== + The names of the available dynamic drowdown menus can be written into the + "options" dialog when defining an input slot. Additionally you can choose + from a list of available menus when holding down the shift-key while + clicking on the partial-gear button in Snap's input-slot dialog. + + naming conventions + ------------------ + domain-prefix_function-name + example: 'clr_number' + + - domain-prefix: max 3-letter lowercase identifier + followed by an underscore + e.g.: clr_, txt_, lst_ + + - function-name: short, single word if possible, lowercase + - NOTE: dynamic menu functions cannot have any inputs + + function semantics + ------------------ + - use the "function () {}" notation to define functions, not the ES6 arrow + notation, otherwise "this" will not get scoped correctly + - "this" refers to the current input-slot at call-time (when the menu is + requested by the user by clicking on the down-arrow symbol) + - to get a handle on the current block use "this.parentThatIsA(BlockMorph)" + - likewise to get a handle on the current sprite use + "this.parentThatIsA(IDE_Morph).currentSprite" + - if you want the menu of one input slot to depend on the contents of + another input slot of the same block, you can get a handle to the block + using the above method, and then access all inputs by calling + "block.inputs()". This will give you an array of all input slots. + You can access the contents of an input slot by calling "slot.evaluate()" + + + 3. Buttons + ========== + You can have your extension add buttons at the top of the palette in a + particular category. Usually, you will want to add these buttons to the + category created by your XML library. + + To do so, just add a button entry in your JS extension file: + + SnapExtensions.buttons.palette.push( + { + category: 'My Extension', + label: 'Do Something', + action: function () { doYourStuffWith(this); }, + hint: 'This button does things', + hideable: false + } + ); + + Inside the action, "this" points to the currently selected object, be it a + sprite or the Stage. + + The "hideable" attribute defines whether the button will be hidden when + turning off "Show buttons" in single palette mode. By default, extension + buttons will not be hidden. + + + 4. External JavaScript files + ============================ + You can provide extensions for your custom hardware or for arbitrary APIs + or extend Snap! with JavaScript libraries from other parties. You can + load additional JavaScript files using the + + src_load(url) + + extension primitive inside Snap, which you can find using Snap's search bar + in the IDE. The loading primitive will wait until the source file has fully + loaded and its defined functions are ready to be called. + Snap remembers the external extensions that have been already loaded and + will ignore any subsequent calls to load the same external extension again. + This lets you lazily initialize your extension by simply adding a + "src_load(url)" command for your external JS file before calling any of its + added functions. + + + 5. Miscellaneous + ================ + + calling extension primitives in other JavaScript functions + ---------------------------------------------------------- + you can call other extension primitives from your own JavaScript functions, + especially if you want to reuse them in your own extensions. Just make sure + to use apply() instead of calling them directly, so "this" gets scoped + correctly, e.g.: + + SnapExtensions.primitives.get('var_declare(scope, name)').apply( + this, + ['global', '_my var', proc] + ); + + Don't forget to pass in a reference to the current process as last parameter + in case the callee requires it. + + adding primitives to SnapExtensions + ----------------------------------- + It is the suggested best practice to expose your own extension primitives + by adding them to the global SnapExtensions libraries (for primitives and + menus) using the very same conventions described herein, and then to offer + a library of custom blocks that make calls to your additional operations. + + developing an extension + ----------------------- + Running the "src_load(url)" primitive will throw an error unless you first + check the "Enable JavaScript extensions" setting in Snap's preferences menu, + or if your JavaScript extension comes from a list of trusted hosts. + While you develop your JavaScript extension it's recommended to turn on the + "Enable JavaScript extensions" setting to load the extension once, and + then to turn it off again, so you can make sure your custom blocks are not + using any "JS Function" blocks (because those will be caught if the + preference is turned off). + + publishing an extension + ----------------------- + When you're ready to publish your extension you can contact us to allow-list + the url hosting your JS file, or you can send me a Github pull-request to + include it in the main Snap branch. + We recommend submitting your extensions to the main Snap! Github repository + so they can be made available in the offline versions (source download + and PWA). + External extensions are a powerful tools to change, override and generally + mold Snap into anything you want, so please use these capabilities sensibly. + We look forward to your innovations and don't plan to restrict the scope of + what extensions are allowed to modify. For security reasons we do ask you to + refrain from exposing any form of JS eval(), including "new Function()" to + end users (if you want to use eval() internally in your extension we'll + frown on you but not reject your contribution). +*/ + +// Primitives + +// errors & exceptions (err_): + +SnapExtensions.primitives.set( + 'err_error(msg)', + function (msg) { + throw new Error(msg, {cause: 'user'}); + } +); + +SnapExtensions.primitives.set( + 'err_try(cmd, catch, err)', + function (action, exception, errVarName, proc) { + proc.tryCatch(action, exception, errVarName); + } +); + +SnapExtensions.primitives.set( + 'err_reset', + function (proc) { + proc.resetErrorHandling(); + } +); + +SnapExtensions.primitives.set( + 'err_ignore', + nop +); + +// list utils (lst_): + +SnapExtensions.primitives.set( + 'lst_sort(list, fn)', + function (data, fn, proc) { + return proc.reportAtomicSort(data, fn); + } +); + +SnapExtensions.primitives.set( + 'lst_linked(list)', + function (data) { + return data.isLinked; + } +); + +// text utils (txt_): + +SnapExtensions.primitives.set( + 'txt_lowercase(txt)', + function (txt) { + return txt.toLowerCase(); + } +); + +SnapExtensions.primitives.set( + 'txt_indexof(sub, txt)', + function (sub, txt) { + return txt.indexOf(sub) + 1; + } +); + +SnapExtensions.primitives.set( + 'txt_to_utf8(txt)', + function (txt) { + var lst = new List(Array.from(new TextEncoder().encode(txt))); + // lst.type = 'number'; + return lst; + } +); + +SnapExtensions.primitives.set( + 'txt_from_utf8(utf8List)', + function (utf8List) { + var arr = utf8List.itemsArray(); + if (!(arr instanceof Uint8Array)) { + arr = new Uint8Array(arr); + } + return new TextDecoder("utf-8").decode(arr); + } +); + +SnapExtensions.primitives.set( + 'txt_transform(name, txt)', + /* + supported transformation names: + ------------------------------- + encode URI + decode URI + encode URI component + decode URI component + XML escape + XML unescape + JS escape + hex sha512 hash + */ + function (name, txt) { + return Process.prototype.reportTextFunction(name, txt); + } +); + +SnapExtensions.primitives.set( + 'txt_export(txt, name)', + function (txt, name, proc) { + var ide = this.parentThatIsA(IDE_Morph); + proc.assertType(txt, ['text', 'number']); + name = name || localize('data'); + proc.assertType(name, ['text', 'number']); + name = name.toString(); + ide.saveFileAs(txt.toString(), 'text/txt', name); + } +); + +// bitwise operations + +SnapExtensions.primitives.set( + 'bit_and(a, b)', + function (a, b, proc) { + return proc.hyper(((a, b) => a & b), a, b); + } +); + +SnapExtensions.primitives.set( + 'bit_or(a, b)', + function (a, b, proc) { + return proc.hyper(((a, b) => a | b), a, b); + } +); + +SnapExtensions.primitives.set( + 'bit_xor(a, b)', + function (a, b, proc) { + return proc.hyper(((a, b) => a ^ b), a, b); + } +); + +SnapExtensions.primitives.set( + 'bit_not(a)', + function (a, proc) { + return proc.hyper(n => ~ n, a); + } +); + +SnapExtensions.primitives.set( + 'bit_left_shift(a, b)', + function (a, b, proc) { + return proc.hyper(((a, b) => a << b), a, b); + } +); + +SnapExtensions.primitives.set( + 'bit_right_shift(a, b)', + function (a, b, proc) { + return proc.hyper(((a, b) => a >> b), a, b); + } +); + +SnapExtensions.primitives.set( + 'bit_unsigned_right_shift(a, b)', + function (a, b, proc) { + return proc.hyper(((a, b) => a >>> b), a, b); + } +); + +// data sciene & frequency distribution analysis (dta_): + +SnapExtensions.primitives.set( + 'dta_analyze(list)', + function (list, proc) { + var dict = new Map(), + result = [], + data = list.itemsArray(), + len = data.length, + item, i; + for (i = 0; i < len; i += 1) { + item = proc.reportIsA(data[i], 'number') ? + data[i].toString() : data[i]; + if (dict.has(item)) { + dict.set(item, dict.get(item) + 1); + } else { + dict.set(item, 1); + } + } + dict.forEach(function (value, key) { + result.push(new List([key, value])); + }); + return new List(result); + } +); + +SnapExtensions.primitives.set( + 'dta_group(list, fn)', + function (data, fn, proc) { + return proc.reportAtomicGroup(data, fn); + } +); + +SnapExtensions.primitives.set( + 'dta_transpose(list)', + function (data, proc) { + proc.assertType(data, 'list'); + return data.transpose(); + } +); + +SnapExtensions.primitives.set( + // no longer needed because it's a regular primitive now + 'dta_crossproduct(list)', + function (data, proc) { + proc.assertType(data, 'list'); + return data.crossproduct(); + } +); + +SnapExtensions.primitives.set( + 'dta_zip(list)', + function (data, proc) { + var zip, i, len, + join = (a, b) => [a, b], + append = (a, b) => {a.push(b); return a; }, + merge = atom => atom instanceof Array ? new List(atom) : atom; + proc.assertType(data, 'list'); + len = data.length(); + if (len < 2) { + return data.at(1); + } + zip = proc.hyperDyadic(join, data.at(1), data.at(2)); + for (i = 3; i <= len; i += 1) { + zip = proc.hyperDyadic(append, zip, data.at(i)); + } + return proc.hyperMonadic(merge, zip); + } +); + +// World map (map_): + +SnapExtensions.primitives.set( + 'map_zoom', + function () { + return this.parentThatIsA(StageMorph).worldMap.zoom; + } +); + +SnapExtensions.primitives.set( + 'map_zoom(n)', + function (num) { + this.parentThatIsA(StageMorph).worldMap.setZoom(num); + } +); + +SnapExtensions.primitives.set( + 'map_lon(x)', + function (x) { + return this.parentThatIsA(StageMorph).worldMap.lonFromSnapX(x); + } +); + +SnapExtensions.primitives.set( + 'map_lat(y)', + function (y) { + return this.parentThatIsA(StageMorph).worldMap.latFromSnapY(y); + } +); + +SnapExtensions.primitives.set( + 'map_view(lon, lat)', + function (lon, lat) { + this.parentThatIsA(StageMorph).worldMap.setView(lon, lat); + } +); + +SnapExtensions.primitives.set( + 'map_y(lat)', + function (lat) { + return this.parentThatIsA(StageMorph).worldMap.snapYfromLat(lat); + } +); + +SnapExtensions.primitives.set( + 'map_x(lon)', + function (lon) { + return this.parentThatIsA(StageMorph).worldMap.snapXfromLon(lon); + } +); + +SnapExtensions.primitives.set( + 'map_pan(x, y)', + function (x, y) { + this.parentThatIsA(StageMorph).worldMap.panBy(x, y); + } +); + +SnapExtensions.primitives.set( + 'map_dist(lat1, lon1, lat2, lon2)', + function (lat1, lon1, lat2, lon2) { + return this.parentThatIsA(StageMorph).worldMap.distanceInKm( + lat1, + lon1, + lat2, + lon2 + ); + } +); + +SnapExtensions.primitives.set( + 'map_update', + function () { + var stage = this.parentThatIsA(StageMorph); + stage.worldMap.extent = stage.dimensions; + stage.worldMap.render(); + } +); + +SnapExtensions.primitives.set( + 'map_loaded', + function () { + return !this.parentThatIsA(StageMorph).worldMap.loading; + } +); + +SnapExtensions.primitives.set( + 'map_costume', + function () { + return new Costume( + this.parentThatIsA(StageMorph).worldMap.canvas, + 'map' + ); + } +); + +SnapExtensions.primitives.set( + 'map_style(name)', + function (name) { + this.parentThatIsA(StageMorph).worldMap.setHost(name); + } +); + +// text-to-speech (tts_): + +SnapExtensions.primitives.set( + 'tts_speak(txt, lang, pitch, rate)', + function (msg, accent, pitch, rate) { + var utter = new SpeechSynthesisUtterance(msg), + isDone = false; + utter.lang = accent; + utter.pitch = pitch; + utter.rate = rate; + utter.onend = () => isDone = true; + window.speechSynthesis.speak(utter); + return () => isDone; + } +); + +// XHR: + +SnapExtensions.primitives.set( + 'xhr_request(mth, url, dta, hdrs)', + function (method, url, data, headers, proc) { + var response, i, header; + url = decodeURI(url); + Process.prototype.checkURLAllowed(url); + if (!proc.httpRequest) { + proc.httpRequest = new XMLHttpRequest(); + proc.httpRequest.open(method, url, true); + proc.assertType(headers, 'list'); + for (i = 1; i <= headers.length(); i += 1) { + header = headers.at(i); + proc.assertType(header, 'list'); + proc.httpRequest.setRequestHeader( + header.at(1), + header.at(2) + ); + } + proc.httpRequest.send(data || null); + } else if (proc.httpRequest.readyState === 4) { + response = proc.httpRequest.responseText; + proc.httpRequest = null; + return response; + } + proc.pushContext('doYield'); + proc.pushContext(); + } +); + +// Geo-location (geo_): + +SnapExtensions.primitives.set( + 'geo_location(acc?)', + function (includeAccuracy) { + var crd = new List(), + myself = this, + options = { + enableHighAccuracy: true, + timeout: 5000, + maximumAge: 0 + }; + + function success(pos) { + crd = new List([ + pos.coords.latitude, + pos.coords.longitude + ]); + if (includeAccuracy) { + crd.add(pos.coords.accuracy); + } + } + + function error(err) { + crd = new List([37.872099, -122.257852]); + myself.inform('Warning:\nGeolocation failed.'); + } + + navigator.geolocation.getCurrentPosition( + success, + error, + options + ); + return () => crd; + } +); + +// MediaComp (mda_) + +SnapExtensions.primitives.set( + 'mda_snap', + function () { + var camDialog, + result = false; + camDialog = new CamSnapshotDialogMorph( + this.parentThatIsA(IDE_Morph), + this, + () => result = null, + function (costume) { + result = costume; + this.close(); + } + ); + camDialog.key = 'camera'; + camDialog.popUp(this.world()); + return () => result; + } +); + +SnapExtensions.primitives.set( + 'mda_record', + function () { + var soundRecorder, + result = false; + soundRecorder = new SoundRecorderDialogMorph( + function (audio) { + if (audio) { + result = new Sound(audio, 'recording'); + } else { + result = null; + this.destroy(); + } + } + ); + + soundRecorder.cancel = function () { + result = null; + this.destroy(); + }; + + soundRecorder.key = 'microphone'; + soundRecorder.popUp(this.world()); + return () => result; + } +); + +// Database (db_): + +SnapExtensions.primitives.set( + 'db_store(key, val)', + function (key, value, proc) { + proc.assertType(key, ['text', 'number']); + proc.assertType(value, ['text', 'number']); + window.localStorage.setItem('-snap-project-' + key, '' + value); + } +); + +SnapExtensions.primitives.set( + 'db_getall', + function () { + var str = window.localStorage, + len = str.length, + result = [], + key, + i; + for (i = 0; i < len; i += 1) { + key = str.key(i); + if (key.startsWith('-snap-project-')) { + result.push(new List([key.slice(14), str.getItem(key)])); + } + } + return new List(result); + } +); + +SnapExtensions.primitives.set( + 'db_remove(key)', + function (key, proc) { + proc.assertType(key, ['text', 'number']); + window.localStorage.removeItem('-snap-project-' + key); + } +); + +SnapExtensions.primitives.set( + 'db_get(key)', + function (key) { + var str = window.localStorage, + result = str.getItem('-snap-project-'+key); + if (!result) { + return false; + } + return result; + } +); + +// Object properties (obj_): + +SnapExtensions.primitives.set( + 'obj_name(obj, name)', + function (obj, name, proc) { + var ide = this.parentThatIsA(IDE_Morph); + proc.assertType(obj, ['sprite', 'stage', 'costume', 'sound']); + name = name.toString(); + if (isSnapObject(obj)) { + obj.setName(ide.newSpriteName(name, obj)); + } else if (obj instanceof Costume) { + obj.name = this.newCostumeName(name, obj); + obj.version = Date.now(); + ide.hasChangedMedia = true; + ide.recordUnsavedChanges(); + } else if (obj instanceof Sound) { + obj.name = ide.newSoundName(name); + ide.hasChangedMedia = true; + ide.recordUnsavedChanges(); + } + } +); + +// Costumes (cst_): + +SnapExtensions.primitives.set( + 'cst_load(url)', + function (url, proc) { + if (!proc.context.accumulator) { + proc.context.accumulator = { + img: new Image(), + cst: null, + }; + proc.context.accumulator.img.onload = function () { + var canvas = newCanvas(new Point(this.width, this.height)); + canvas.getContext('2d').drawImage(this, 0, 0); + proc.context.accumulator.cst = new Costume(canvas); + }; + proc.context.accumulator.img.src = url; + } else if (proc.context.accumulator.cst) { + return proc.context.accumulator.cst; + } + proc.pushContext('doYield'); + proc.pushContext(); + } +); + +SnapExtensions.primitives.set( + 'cst_export(cst, name)', + function (cst, name, proc) { + var ide = this.parentThatIsA(IDE_Morph); + proc.assertType(cst, 'costume'); + name = name || cst.name || localize('costume'); + proc.assertType(name, ['text', 'number']); + name = name.toString(); + if (cst instanceof SVG_Costume) { + ide.saveFileAs(cst.contents.src, 'text/svg', name); + } else if (cst.embeddedData) { + // embed payload data (e.g blocks) inside the PNG image data + ide.saveFileAs(cst.pngData(), 'image/png', name); + } else { // rasterized Costume + ide.saveCanvasAs(cst.contents, name); + } + } +); + +SnapExtensions.primitives.set( + // experimental, will probably be taken out again, don't rely on this + 'cst_embed(cst, data)', + function (cst, data, proc) { + var ide = this.parentThatIsA(IDE_Morph); + proc.assertType(cst, 'costume'); + proc.assertType(data, 'text'); + if (cst instanceof SVG_Costume) { + throw new Error('option currently not supported for SVG costumes'); + } + cst.embeddedData = data || null; + cst.version = Date.now(); + ide.recordUnsavedChanges(); + } +); + +// Variables (var_): + +SnapExtensions.primitives.set( + 'var_declare(scope, name)', + function (scope, name, proc) { + var ide, frame; + proc.assertType(name, ['text', 'number']); + if (name === '') {return; } + if (scope === 'script') { + frame = proc.context.isInCustomBlock() ? + proc.homeContext.variables + : proc.context.outerContext.variables; + } else if (scope === 'sprite') { + frame = this.variables; + } else { + frame = this.globalVariables(); + } + if (frame.vars[name] === undefined) { + frame.addVar(name); + ide = this.parentThatIsA(IDE_Morph); + ide.flushBlocksCache('variables'); // b/c of inheritance + ide.refreshPalette(); + } + } +); + +SnapExtensions.primitives.set( + 'var_names(scope)', + function (scope, proc) { + var frame; + if (scope === 'script') { + frame = proc.context.isInCustomBlock() ? + proc.homeContext.variables + : proc.context.outerContext.variables; + } else if (scope === 'sprite') { + frame = this.variables; + } else { + frame = this.globalVariables(); + } + return new List(frame.allNames()); + } +); + +SnapExtensions.primitives.set( + 'var_delete(name)', + function (name, proc) { + var local; + proc.assertType(name, ['text', 'number']); + name = name.toString(); + if (name === '') {return; } + local = proc.context.isInCustomBlock() ? + proc.homeContext.variables + : proc.context.outerContext.variables; + if (local.vars[name] !== undefined) { + delete local.vars[name]; + } else if (this.deletableVariableNames().indexOf(name) > -1) { + this.deleteVariable(name); + } + } +); + +SnapExtensions.primitives.set( + 'var_get(name)', + function (name, proc) { + proc.assertType(name, ['text', 'number']); + return proc.homeContext.variables.getVar(name); + } +); + +SnapExtensions.primitives.set( + 'var_set(name, val)', + function (name, val, proc) { + var local; + proc.assertType(name, ['text', 'number']); + if (name === '') {return; } + local = proc.context.isInCustomBlock() ? + proc.homeContext.variables + : proc.context.outerContext.variables; + local.setVar(name, val); + } +); + +SnapExtensions.primitives.set( + 'var_show(name)', + function (name, proc) { + proc.doShowVar( + name, + proc.context.isInCustomBlock() ? + proc.homeContext + : proc.context.outerContext + ); + } +); + +SnapExtensions.primitives.set( + 'var_hide(name)', + function (name, proc) { + proc.doHideVar( + name, + proc.context.isInCustomBlock() ? + proc.homeContext + : proc.context.outerContext + ); + } +); + +SnapExtensions.primitives.set( + 'var_showing(name)?', + function (name, proc) { + var stage = this.parentThatIsA(StageMorph), + frame = proc.context.isInCustomBlock() ? + proc.homeContext.variables + : proc.context.outerContext.variables, + target = frame.silentFind(name), + watcher; + + if (!target) {return false; } + watcher = detect( + stage.children, + morph => morph instanceof WatcherMorph && + morph.target === target && + morph.getter === name + ); + return watcher ? watcher.isVisible : false; + } +); + +// IDE (ide_): + +// Returns all blocks of the current sprite, regardless of visibility +SnapExtensions.primitives.set( + 'ide_blocks', + function () { + return new List( + this.allPaletteBlocks().filter( + each => each instanceof BlockMorph && + !(each instanceof HatBlockMorph) + ).map(block => { + let instance = block.fullCopy(); + instance.isTemplate = false; + return instance.reify(); + }) + ); + } +); + +SnapExtensions.primitives.set( + 'ide_hide(block)', + function (context, proc) { + var ide = this.parentThatIsA(IDE_Morph); + proc.assertType(context, ['command', 'reporter', 'predicate']); + this.changeBlockVisibility(context.expression, true); + ide.flushBlocksCache(); + ide.refreshPalette(); + ide.categories.refreshEmpty(); + } +); + +SnapExtensions.primitives.set( + 'ide_show(block)', + function (context, proc) { + var ide = this.parentThatIsA(IDE_Morph); + proc.assertType(context, ['command', 'reporter', 'predicate']); + this.changeBlockVisibility(context.expression, false); + ide.flushBlocksCache(); + ide.refreshPalette(); + ide.categories.refreshEmpty(); + } +); + +/* +SnapExtensions.primitives.set( + // not needed right now, commented out for possibly later + 'ide_refreshpalette(name)', + function (name) { + var ide = this.parentThatIsA(IDE_Morph); + if (name !== 'variables') { + ide.flushBlocksCache(name); + } + ide.flushBlocksCache('variables'); // b/c of inheritance + ide.refreshPalette(); + } +); +*/ + +SnapExtensions.primitives.set( + 'ide_translate(text)', + function (text, proc) { + return proc.hyper( + txt => { + proc.assertType(txt, ['text', 'number']); + return localize(txt); + }, + text + ); + } +); + +SnapExtensions.primitives.set( + 'ide_translateback(text)', + function (text, proc) { + var dict = SnapTranslator.dict[SnapTranslator.language]; + return proc.hyper( + txt => { + proc.assertType(txt, ['text', 'number']); + return detect( + Object.keys(dict), + key => dict[key] === txt + ) || txt; + }, + text + ); + } +); + +SnapExtensions.primitives.set( + 'ide_language', + function () { + return SnapTranslator.language; + } +); + +SnapExtensions.primitives.set( + 'ide_setlang(language, [msg])', + function (lang, msg, proc) { + var ide = this.parentThatIsA(IDE_Morph), + disabled = ['receiveGo', 'receiveCondition', 'receiveMessage'], + flag = ide.isAppMode, + restoreMode = () => { + ide.toggleAppMode(flag); + ide.stage.fireUserEditEvent( + ide.currentSprite.name, + ['project', 'language', lang], + ide.version + ); + }, + callback = restoreMode; + proc.assertType(lang, 'text'); + ide.loadNewProject = false; + if (isString(msg) && !contains(disabled, proc.topBlock.selector)) { + // require an explicit user input to trigger a project reload + callback = () => { + restoreMode(); + ide.broadcast(msg); + }; + } + ide.setLanguage(lang, callback, true); // don't save language setting + } +); + +SnapExtensions.primitives.set( + 'ide_translations', + function () { + return new List( + SnapTranslator.languages().map(lang => + new List([SnapTranslator.languageName(lang), lang]) + ) + ); + } +); + +SnapExtensions.primitives.set( + 'ide_translation_dict', + function () { + var dict = SnapTranslator.dict[SnapTranslator.language]; + return new List( + Object.keys(dict).slice().sort().map(key => + new List([key, dict[key]])) + ); + } +); + +SnapExtensions.primitives.set( + 'ide_set_translation_dict(data)', + function (data, proc) { + var ide = this.parentThatIsA(IDE_Morph), + dict = {}; + proc.assertType(data, 'list'); + data.map(eachRow => dict[eachRow.at(1)] = eachRow.at(2)); + SnapTranslator.dict[SnapTranslator.language] = dict; + ide.reflectLanguage(SnapTranslator.language); + } +); + +// Synchronization + +SnapExtensions.primitives.set( + 'syn_scripts([xml])', + function (xml, proc) { + if (xml instanceof Process) { + return this.scriptsOnlyXML(); + } + proc.assertType(xml, 'text'); + this.synchScriptsFrom(xml); + } +); + +// Colors (clr_): + +SnapExtensions.primitives.set( + 'clr_rgba(r, g, b, a)', + function (r, g, b, a) { + return new Color(r, g, b, a); + } +); + +SnapExtensions.primitives.set( + 'clr_channel(clr, rgba)', + function (clr, rgba) { + if (contains(['r', 'g', 'b', 'a'], rgba)) { + return clr[rgba]; + } + throw new Error('unknown rgba color channel "' + rgba + '"'); + } +); + +SnapExtensions.primitives.set( + 'clr_hsv(clr)', + function (clr) { + return new List(clr.hsv()); + } +); + +SnapExtensions.primitives.set( + 'clr_hsv(h, s, v)', + function (h, s, v) { + var c = new Color(); + c.set_hsv(h, s, v); + return c; + } +); + +SnapExtensions.primitives.set( + 'clr_hsl(clr)', + function (clr) { + return new List(clr.hsl()); + } +); + +SnapExtensions.primitives.set( + 'clr_hsl(h, s, l)', + function (h, s, l) { + var c = new Color(); + c.set_hsl(h, s, l); + return c; + } +); + +SnapExtensions.primitives.set( + 'clr_setpen(clr)', + function (clr) { + this.setColor(clr); + } +); + +SnapExtensions.primitives.set( + 'clr_pen', + function () { + return this.color; + } +); + +// web serial (srl_): + +SnapExtensions.primitives.set( + 'srl_open(baud, buffer)', + function (baud, buf, proc) { + var acc = proc.context.accumulator; + + async function forceClose(port){ + try { + if (!port?.writable) {return; } // already closed + // console.log("force close...", port); + if (port._reader) {await port._reader.cancel(); } + if (port?.readable) {await port.readable.cancel(); } + if (port?.writable) {await port.writable.abort(); } + if (port?.writable) {await port.close(); } // close if open + } catch (e) { + // console.log( e); + acc.result = e; + } + } + + if (!acc) { + acc = proc.context.accumulator = {result: false}; + (async function (baud) { + try { + var port; + port = await navigator.serial.requestPort(); + await forceClose(port); + await port.open({ + baudRate: baud, + bufferSize: buf || 15000 + }); + acc.result = port; + port._bklog = [];//backlog + } catch(e) { + acc.result = e; + } + }) (baud || 115200); + } else if (acc.result !== false) { + if (acc.result instanceof Error) { + throw acc.result; + } + return acc.result; + } + proc.pushContext('doYield'); + proc.pushContext(); + } +); + +SnapExtensions.primitives.set( + 'srl_close(port)', + function (port, proc) { + var acc = proc.context.accumulator; + + if (!acc) { + acc = proc.context.accumulator = {result: false}; + (async function (port) { + try { + // console.log("pending close...", port); + if (port._reader) {await port._reader.cancel(); } + if (port?.readable) {await port.readable.cancel(); } + if (port?.writable) {await port.writable.abort(); } + if (port?.readable || port?.writable) {await port.close(); } + acc.result = true; + } catch (e) { + // console.log(e); + acc.result = e; + } + }) (port); + } else if (acc.result !== false) { + if (acc.result instanceof Error) { + throw acc.result; + } + return; + } + proc.pushContext('doYield'); + proc.pushContext(); + } +); + +SnapExtensions.primitives.set( + 'srl_read(port)', + function (port, proc) { + var acc = {result: false}; + if(!port?.readable) {throw Error( "Port not opened."); } + if( port.readable?.locked){ //No reentry + return (port._bklog?.length > 0) ? port._bklog.splice(0) : true; + } + (async function (port) { + var reader, data; + try { + reader = port._reader = port.readable.getReader(); + data = await reader.read(); + delete port._reader; + if( data.value){ + port._bklog.push( ...data.value); + } + } catch (e) { + await reader.cancel(); + acc.result = e; + } + if (reader) {await reader.releaseLock(); } + }) (port); + + if (acc.result !== false) { + if (acc.result instanceof Error) { + throw acc.result; + } + return acc.result; + } + + return (port._bklog?.length > 0) ? + new List( Array.from( port._bklog.splice(0))) + : true; + } +); + +SnapExtensions.primitives.set( + 'srl_write(port, bytes)', + function (port, bytes, proc) { + var acc = proc.context.accumulator; + + if (!acc) { + acc = proc.context.accumulator = {result: false}; + (async function (port, bytes) { + var writer; + try { + if (!port?.writable) {throw Error( "Port not opened."); } + try { + writer = port.writable.getWriter(); + await writer.write(Uint8Array.from( bytes.itemsArray())); + acc.result = true; + } finally { + await writer.close(); + } + } catch(e) { + acc.result = e; + } + }) (port, bytes); + + } else if (acc.result !== false) { + if (acc.result instanceof Error) { + throw acc.result; + } + return; + } + proc.pushContext('doYield'); + proc.pushContext(); + } +); + +// loading external scripts (src_): + +SnapExtensions.primitives.set( + 'src_load(url)', + function (url, proc) { + var scriptElement; + if (!proc.context.accumulator) { + proc.context.accumulator = {done: false}; + if (contains(SnapExtensions.scripts, url)) { + return; + } + if (Process.prototype.enableJS || SnapExtensions.urls.some( + any => url.indexOf(any) === 0) + ) { + scriptElement = document.createElement('script'); + scriptElement.onload = () => { + SnapExtensions.scripts.push(url); + proc.context.accumulator.done = true; + }; + document.head.appendChild(scriptElement); + scriptElement.src = url; + } else { + throw new Error( + 'unlisted extension url:\n"' + url + '"\n' + + 'JavaScript extensions for Snap!\nare turned off' + ); + } + } else if (proc.context.accumulator.done) { + return; + } + proc.pushContext('doYield'); + proc.pushContext(); + } +); + +// Menus + +SnapExtensions.menus.set( + 'clr_numbers', // Brian's browns and oranges, sigh... + function () { + var menuName = this.parent.inputs()[0].evaluate(), // first slot + output, + menus = { + 'color number': [ + "0 black=0", + "14 white=14", + "20 spectral red=20", + "25 darkest red=25", + "30 saddle brown=30", + "35 darkest brown=35", + "40 spectral orange=40", + "45 darkest orange=45", + "50 spectral yellow=50", + "55 darkest yellow=55", + "60 spectral green=60", + "65 darkest green=65", + "70 spectral cyan=70", + "75 darkest cyan=75", + "80 spectral blue=80", + "85 darkest blue=85", + "90 spectral violet=90", + "95 magenta=95" + ], + 'fair hue': [ + "0 red=0", + "12.5 brown=12.5", + "25 orange=25", + "37.5 yellow=37.5", + "50 green=50", + "62.5 cyan=62.5", + "75 blue=75", + "87.5 violet=87.5" + ], + 'crayon': [ + "grays", + [ + "0 black #000000=0", + "1 gray7 #121212=1", + "2 gray14 #242424=2", + "3 gray21 #363636=3", + "4 gray28 #484848=4", + "5 gray36 #5c5c5c=5", + "6 gray43 #6d6d6d=6", + "7 gray50 #7f7f7f=7", + "8 gray57 #919191=8", + "9 gray64 #a3a3a3=9", + "10 gray71 #b5b5b5=10", + "11 gray78 #c8c8c8=11", + "12 gray85 #dadada=12", + "13 gray92 #ececec=13", + "14 white #ffffff=14" + ], + "pinks", + [ + "15 deep pink #ff1493=15", + "16 hot pink #ff69b4=16", + "17 bright pink #ff007f=17", + "18 raspberry #e30b5d=18", + "19 amaranth #e52b50=19" + ], + "reds", + [ + "20 red #ff0000=20", + "21 burgundy #900020=21", + "22 cherry #990000=22", + "23 dark candy apple red #a40000=23", + "24 sanguine #c00000=24", + "25 maroon #800000=25", + "26 crimson #c90016=26", + "27 Lists #d94d11=27", + "28 candy apple red #ff0800=28", + "29 coquelicot #ff3800=29" + ], + "browns", + [ + "30 saddle brown #8b4513=30", + "31 chocolate #7b3f00=31", + "32 kobicha #6b4423=32", + "33 sepia #704214=33", + "34 chestnut #954535=34", + "35 dark brown #654321=35", + "36 brown #964b00=36", + "37 golden brown #996515=37", + "38 cinnamon #b87333=38", + "39 copper #d2691e=39" + ], + "oranges", + [ + "40 orange #ff7f00=40", + "41 Pantone orange #ff5800=41", + "42 pumpkin #ff7518=42", + "43 Variables #f3761d=43", + "44 Spanish orange #e86100=44", + "45 burnt orange #cc5500=45", + "46 sinopia #cb410b=46", + "47 ochre #cc7722=47", + "48 carrot #ed9121=48", + "49 tangerine #f28500=49" + ], + "yellows", + [ + "50 yellow #ffff00=50", + "51 Control #e6a822=51", + "52 dark goldenrod #b8860b=52", + "53 goldenrod #daa520=53", + "54 saffron #f4c430=54", + "55 sandstorm #ecd540=55", + "56 mustard #ffdb58=56", + "57 gold #ffd700=57", + "58 egg yolk #fee33e=58", + "59 rubber duck #fbe108=59" + ], + "greens", + [ + "60 lime #00ff00=60", + "61 apple green #8db600=61", + "62 Operators #62c213=62", + "63 forest green #228b22=63", + "64 green #008000=64", + "65 dark green #006400=65", + "66 dark pastel green #03c03c=66", + "67 emerald #50c878=67", + "68 mint #3eb489=68", + "69 Pen #00a178=69" + ], + "cyans", + [ + "70 aqua (cyan) #00ffff=70", + "71 dark cyan #008b8b=71", + "72 cerulean #007ba7=72", + "73 iceberg #71a6d2=73", + "74 Sensing #0494dc=74", + "75 teal #008080=75", + "76 light sky blue #87cefa=76", + "77 deep sky blue #00bfff=77", + "78 dodger blue #1e90ff=78", + "79 azure #007fff=79" + ], + "blues", + [ + "80 blue #0000ff=80", + "81 midnight blue #191970=81", + "82 dark powder blue #003399=82", + "83 cobalt #0047ab=83", + "84 denim #1560bd=84", + "85 navy blue #000080=85", + "86 steel blue #4682b4=86", + "87 Motion #4a6cd4=87", + "88 cornflower #6495ed=88", + "89 slate blue #6a5acd=89" + ], + "purples", + [ + "90 violet #8000ff=90", + "91 Looks #8f56e3=91", + "92 grape #6f2da8=92", + "93 indigo #4b0082=93", + "94 x11 purple #a020f0=94", + "95 magenta (fuchia) #ff00ff=95", + "96 dark orchid #9932cc=96", + "97 Sound #cf4ad9=97", + "98 purple #7f007f=98", + "99 dark magenta #8b008b=99" + ] + ] + }; + + function makeMenuHelper(items, output) { + // in an array, walk through the items in pairs + var i = 0, + label, possiblyNested, hasEquals, nestingOutput; + while (i < items.length) { + label = items[i]; + possiblyNested = items[i + 1]; + // if possiblyNested is array, it is a nest under label + // if possiblyNested is string, it is just a sibling + if (possiblyNested === undefined) { + // label is actually the last element of the list + hasEquals = label.split("="); + if (hasEquals.length === 2) { + output[hasEquals[0]] = hasEquals[1]; + i += 1; + } else if (hasEquals.length === 3) { + output[ + hasEquals[0]+"\u00A0"+"="+"\u00A0"+hasEquals[2] + ] = hasEquals[0]+"\u00A0"+"="+"\u00A0"+hasEquals[2]; + i += 1; + } else { + output[label] = label; + i += 1; + } + } else if (typeof possiblyNested == "string") { + hasEquals = label.split("="); + if (hasEquals.length == 2) { + output[hasEquals[0]] = hasEquals[1]; + i += 1; + } else if (hasEquals.length == 3) { + output[ + hasEquals[0]+"\u00A0"+"="+"\u00A0"+hasEquals[2] + ] = hasEquals[0]+"\u00A0"+"="+"\u00A0"+hasEquals[2]; + i += 1; + } else { + output[label] = label; + i += 1; + } + } else if (Array.isArray(possiblyNested)) { + nestingOutput = {}; + makeMenuHelper(possiblyNested, nestingOutput); + output[label] = nestingOutput; + i += 2; + } else { + throw new Error("Bad value at index " + i); + } + } + } + + try { + output = {}; + makeMenuHelper(menus[menuName], output); + return output; + } catch(err) { + nop(err); + } + } +); diff --git a/elements/pl-snap/Snap/src/favicon.ico b/elements/pl-snap/Snap/src/favicon.ico new file mode 100644 index 00000000..b2b1e60e Binary files /dev/null and b/elements/pl-snap/Snap/src/favicon.ico differ diff --git a/elements/pl-snap/Snap/src/gui.js b/elements/pl-snap/Snap/src/gui.js new file mode 100644 index 00000000..649c371d --- /dev/null +++ b/elements/pl-snap/Snap/src/gui.js @@ -0,0 +1,12848 @@ +/* + + gui.js + + a programming environment + based on morphic.js, blocks.js, threads.js and objects.js + inspired by Scratch + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs blocks.js, threads.js, objects.js, cloud.jus and morphic.js + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + IDE_Morph + ProjectDialogMorph + LibraryImportDialogMorph + SpriteIconMorph + TurtleIconMorph + CostumeIconMorph + WardrobeMorph + SoundIconMorph + JukeboxMorph + SceneIconMorph + SceneAlbumMorph + StageHandleMorph + PaletteHandleMorph + CamSnapshotDialogMorph + SoundRecorderDialogMorph + + + credits + ------- + Nathan Dinsmore contributed saving and loading of projects, + ypr-Snap! project conversion and countless bugfixes + Ian Reynolds contributed handling and visualization of sounds + Michael Ball contributed the LibraryImportDialogMorph and countless + utilities to load libraries from relative urls + Bernat Romagosa contributed more things than I can mention, + including interfacing to the camera and microphone + +*/ + +/*global modules, Morph, SpriteMorph, SyntaxElementMorph, Color, Cloud, Audio, +ListWatcherMorph, TextMorph, newCanvas, useBlurredShadows, Sound, Scene, Note, +StringMorph, Point, MenuMorph, morphicVersion, DialogBoxMorph, BlockEditorMorph, +ToggleButtonMorph, contains, ScrollFrameMorph, StageMorph, PushButtonMorph, sb, +InputFieldMorph, FrameMorph, Process, nop, SnapSerializer, ListMorph, detect, +AlignmentMorph, TabMorph, Costume, MorphicPreferences,BlockMorph, ToggleMorph, +InputSlotDialogMorph, ScriptsMorph, isNil, SymbolMorph, fontHeight, localize, +BlockExportDialogMorph, BlockImportDialogMorph, SnapTranslator, List, ArgMorph, +Uint8Array, HandleMorph, SVG_Costume, TableDialogMorph, CommentMorph, saveAs, +CommandBlockMorph, BooleanSlotMorph, RingReporterSlotMorph, ScriptFocusMorph, +BlockLabelPlaceHolderMorph, SpeechBubbleMorph, XML_Element, WatcherMorph, WHITE, +BlockRemovalDialogMorph,TableMorph, isSnapObject, isRetinaEnabled, SliderMorph, +disableRetinaSupport, enableRetinaSupport, isRetinaSupported, MediaRecorder, +Animation, BoxMorph, BlockDialogMorph, RingMorph, Project, ZERO, BLACK, +BlockVisibilityDialogMorph, ThreadManager, isString, SnapExtensions, snapEquals +*/ + +/*jshint esversion: 8*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.gui = '2024-March-01'; + +// Declarations + +var SnapVersion = '9.2.10'; + +var IDE_Morph; +var ProjectDialogMorph; +var LibraryImportDialogMorph; +var SpriteIconMorph; +var CostumeIconMorph; +var TurtleIconMorph; +var WardrobeMorph; +var SoundIconMorph; +var JukeboxMorph; +var SceneIconMorph; +var SceneAlbumMorph; +var StageHandleMorph; +var PaletteHandleMorph; +var CamSnapshotDialogMorph; +var SoundRecorderDialogMorph; + +// IDE_Morph /////////////////////////////////////////////////////////// + +// I am SNAP's top-level frame, the Editor window + +// IDE_Morph inherits from Morph: + +IDE_Morph.prototype = new Morph(); +IDE_Morph.prototype.constructor = IDE_Morph; +IDE_Morph.uber = Morph.prototype; + +// IDE_Morph preferences settings and skins + +IDE_Morph.prototype.setDefaultDesign = function () { + MorphicPreferences.isFlat = false; + SpriteMorph.prototype.paletteColor = new Color(30, 30, 30); + SpriteMorph.prototype.paletteTextColor = new Color(230, 230, 230); + StageMorph.prototype.paletteTextColor + = SpriteMorph.prototype.paletteTextColor; + StageMorph.prototype.paletteColor = SpriteMorph.prototype.paletteColor; + SpriteMorph.prototype.sliderColor + = SpriteMorph.prototype.paletteColor.lighter(30); + + IDE_Morph.prototype.buttonContrast = 30; + IDE_Morph.prototype.backgroundColor = new Color(10, 10, 10); + IDE_Morph.prototype.frameColor = SpriteMorph.prototype.paletteColor; + + IDE_Morph.prototype.groupColor + = SpriteMorph.prototype.paletteColor.lighter(5); + IDE_Morph.prototype.sliderColor = SpriteMorph.prototype.sliderColor; + IDE_Morph.prototype.buttonLabelColor = WHITE; + IDE_Morph.prototype.tabColors = [ + IDE_Morph.prototype.groupColor.darker(50), + IDE_Morph.prototype.groupColor.darker(25), + IDE_Morph.prototype.groupColor + ]; + IDE_Morph.prototype.rotationStyleColors = IDE_Morph.prototype.tabColors; + IDE_Morph.prototype.appModeColor = BLACK; + IDE_Morph.prototype.scriptsPaneTexture = this.scriptsTexture(); + IDE_Morph.prototype.padding = 1; + + SpriteIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + CostumeIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + SoundIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + TurtleIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + SceneIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + + SyntaxElementMorph.prototype.contrast = 65; + ScriptsMorph.prototype.feedbackColor = WHITE; +}; + +IDE_Morph.prototype.setFlatDesign = function () { + MorphicPreferences.isFlat = true; + SpriteMorph.prototype.paletteColor = WHITE; + SpriteMorph.prototype.paletteTextColor = new Color(70, 70, 70); + StageMorph.prototype.paletteTextColor + = SpriteMorph.prototype.paletteTextColor; + StageMorph.prototype.paletteColor = SpriteMorph.prototype.paletteColor; + SpriteMorph.prototype.sliderColor = SpriteMorph.prototype.paletteColor; + + IDE_Morph.prototype.buttonContrast = 30; + IDE_Morph.prototype.backgroundColor = new Color(220, 220, 230); + IDE_Morph.prototype.frameColor = new Color(240, 240, 245); + + IDE_Morph.prototype.groupColor = WHITE; + IDE_Morph.prototype.sliderColor = SpriteMorph.prototype.sliderColor; + IDE_Morph.prototype.buttonLabelColor = new Color(70, 70, 70); + IDE_Morph.prototype.tabColors = [ + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor.lighter(50), + IDE_Morph.prototype.groupColor + ]; + IDE_Morph.prototype.rotationStyleColors = IDE_Morph.prototype.tabColors; + IDE_Morph.prototype.appModeColor = IDE_Morph.prototype.frameColor; + IDE_Morph.prototype.scriptsPaneTexture = null; + IDE_Morph.prototype.padding = 1; + + SpriteIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + CostumeIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + SoundIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + TurtleIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + SceneIconMorph.prototype.labelColor + = IDE_Morph.prototype.buttonLabelColor; + + SyntaxElementMorph.prototype.contrast = 25; + ScriptsMorph.prototype.feedbackColor = new Color(153, 255, 213); +}; + +IDE_Morph.prototype.scriptsTexture = function () { + var pic = newCanvas(new Point(100, 100)), // bigger scales faster + ctx = pic.getContext('2d'), + i; + for (i = 0; i < 100; i += 4) { + ctx.fillStyle = this.frameColor.toString(); + ctx.fillRect(i, 0, 1, 100); + ctx.fillStyle = this.groupColor.lighter(2).toString(); + ctx.fillRect(i + 1, 0, 1, 100); + ctx.fillRect(i + 3, 0, 1, 100); + ctx.fillStyle = this.groupColor.darker(2).toString(); + ctx.fillRect(i + 2, 0, 1, 100); + } + return pic; +}; + +IDE_Morph.prototype.setDefaultDesign(); + +// IDE_Morph instance creation: + +function IDE_Morph(config = {}) { + this.init(config); +} + +/* + Configuring the IDE for specialized uses, e.g. as DSL inside another IDE + can be achieved by passing in an optional configuration dictionary when + creating an instance. This is still very much under construction. Currently + the following options are available: + + noAutoFill bool, do not let the IDE fill the whole World canvas + path str, path to additional resources (translations) + load: str, microworld file name (xml) + onload: callback, called when the microworld is loaded + design: str, currently "flat" (bright) or "classic" (dark) + border: num, pixels surrounding the IDE, default is none (zero) + lang: str, translation to be used, e.g. "de" for German + mode: str, currently "presentation" or "edit" + hideControls: bool, hide/show the tool bar + hideCategories: bool, hide/show the palette block category buttons + noDefaultCat: bool, hide/show the buit-in bloc category buttons + noSpriteEdits: bool, hide/show the corral & sprite controls/menus + noSprites: bool, hide/show the stage, corral, sprite editor + noPalette: bool, hide/show the palette including the categories + noImports: bool, disable/allow importing files via drag&drop + noOwnBlocks: bool, hider/show "make a block" and "make a category" + noRingify: bool, disable/enable "ringify"/"unringify" in ctx menu + noUserSettings: bool, disable/enable persistent user preferences + noDevWarning: bool, ignore development version incompatibility warning + noExitWarning: bool, do not show a browser warning when closing the IDE + with unsaved changes + preserveTitle: bool, do not set the tab title dynamically to reflect + the current Snap! version + blocksZoom: num, zoom factor for blocks, e.g. 1.5 + blocksFade: num, fading percentage for blocks, e.g. 85 + zebra: num, contrast percentage for nesting same-color blocks + + Note that such configurations will not affect the user's own preference + settings, e.g. configuring the blocks zoom or language will not overwrite + the user's own settings which are kept in localstorage. +*/ + +IDE_Morph.prototype.init = function (config) { + // global font setting + MorphicPreferences.globalFontFamily = 'Helvetica, Arial'; + + // additional properties: + this.cloud = new Cloud(); + this.cloudMsg = null; + this.source = null; + this.serializer = new SnapSerializer(); + this.config = config; + this.version = Date.now(); // for outside observers + + // restore saved user preferences + this.userLanguage = null; // user language preference for startup + this.applySavedSettings(); + + // scenes + this.scenes = new List([new Scene()]); + this.scene = this.scenes.at(1); + this.isAddingScenes = false; + this.isAddingNextScene = false; + + // editor + this.globalVariables = this.scene.globalVariables; + this.currentSprite = this.scene.addDefaultSprite(); + this.sprites = this.scene.sprites; + this.currentCategory = this.scene.unifiedPalette ? 'unified' : 'motion'; + this.currentTab = 'scripts'; + + // logoURL is disabled because the image data is hard-copied + // to avoid tainting the world canvas + // this.logoURL = this.resourceURL('src', 'snap_logo_sm.png'); + + this.logo = null; + this.controlBar = null; + this.categories = null; + this.palette = null; + this.paletteHandle = null; + this.spriteBar = null; + this.spriteEditor = null; + this.stage = null; + this.stageHandle = null; + this.corralBar = null; + this.corral = null; + + this.embedPlayButton = null; + this.embedOverlay = null; + this.isEmbedMode = false; + + this.isAutoFill = !config.noAutoFill; + this.isAppMode = false; + this.isSmallStage = false; + this.filePicker = null; + + // incrementally saving projects to the cloud is currently unused + // and needs to be extended to work with scenes before reactivation + this.hasChangedMedia = false; + + this.isAnimating = true; + this.paletteWidth = 200; // initially same as logo width + this.stageRatio = 1; // for IDE animations, e.g. when zooming + + this.wasSingleStepping = false; // for toggling to and from app mode + + this.loadNewProject = false; // flag when starting up translated + this.shield = null; + + this.savingPreferences = true; // for bh's infamous "Eisenbergification" + + this.bulkDropInProgress = false; // for handling multiple file-drops + this.cachedSceneFlag = null; // for importing multiple scenes at once + this.isImportingLocalFile = false; // for handling imports of smart pics + + // initialize inherited properties: + IDE_Morph.uber.init.call(this); + + // override inherited properites: + this.color = this.backgroundColor; +}; + +IDE_Morph.prototype.openIn = function (world) { + var hash, myself = this; + + window.onmessage = function (event) { + // make the API accessible from outside an iframe + var ide = myself; + if (!isNil(event.data.selector)) { + window.top.postMessage( + { + selector: event.data.selector, + response: ide[event.data.selector].apply( + ide, + event.data.params + ) + }, + '*' + ); + } + }; + + function initUser(username) { + sessionStorage.username = username; + myself.controlBar.cloudButton.refresh(); + if (username) { + myself.source = 'cloud'; + if (!myself.cloud.verified) { + new DialogBoxMorph().inform( + 'Unverified account', + 'Your account is still unverified.\n' + + 'Please use the verification link that\n' + + 'was sent to your email address when you\n' + + 'signed up.\n\n' + + 'If you cannot find that email, please\n' + + 'check your spam folder. If you still\n' + + 'cannot find it, please use the "Resend\n' + + 'Verification Email..." option in the cloud\n' + + 'menu.', + world, + myself.cloudIcon(null, new Color(0, 180, 0)) + ); + } + } + } + + this.buildPanes(); + world.add(this); + world.userMenu = this.userMenu; + + // override SnapCloud's user message with Morphic + this.cloud.message = (string) => { + var m = new MenuMorph(null, string), + intervalHandle; + m.popUpCenteredInWorld(world); + intervalHandle = setInterval(() => { + m.destroy(); + clearInterval(intervalHandle); + }, 2000); + }; + + // prevent non-DialogBoxMorphs from being dropped + // onto the World in user-mode + world.reactToDropOf = (morph) => { + if (!(morph instanceof DialogBoxMorph || + (morph instanceof MenuMorph))) { + if (world.hand.grabOrigin) { + morph.slideBackTo(world.hand.grabOrigin); + } else { + world.hand.grab(morph); + } + } + }; + + this.reactToWorldResize(world.bounds); + + function applyFlags(dict) { + if (dict.noCloud) { + myself.cloud.disable(); + } + if (dict.embedMode) { + myself.setEmbedMode(); + } + if (dict.editMode) { + myself.toggleAppMode(false); + } else { + myself.toggleAppMode(true); + } + if (!dict.noRun) { + autoRun(); + } + if (dict.hideControls) { + myself.controlBar.hide(); + window.onbeforeunload = nop; + } + if (dict.noExitWarning) { + window.onbeforeunload = window.cachedOnbeforeunload; + } + if (dict.blocksZoom) { + myself.savingPreferences = false; + myself.setBlocksScale(Math.max(1,Math.min(dict.blocksZoom, 12))); + myself.savingPreferences = true; + } + + // only force my world to get focus if I'm not in embed mode + // to prevent the iFrame from involuntarily scrolling into view + if (!myself.isEmbedMode) { + world.worldCanvas.focus(); + } + } + + function autoRun () { + // wait until all costumes and sounds are loaded + if (isLoadingAssets()) { + myself.world().animations.push( + new Animation(nop, nop, 0, 200, nop, autoRun) + ); + } else { + myself.runScripts(); + } + } + + function isLoadingAssets() { + return myself.sprites.asArray().concat([myself.stage]).some(any => + (any.costume ? any.costume.loaded !== true : false) || + any.costumes.asArray().some(each => each.loaded !== true) || + any.sounds.asArray().some(each => each.loaded !== true) + ); + } + + // dynamic notifications from non-source text files + // has some issues, commented out for now + /* + this.cloudMsg = getURL('https://snap.berkeley.edu/cloudmsg.txt'); + motd = getURL('https://snap.berkeley.edu/motd.txt'); + if (motd) { + this.inform('Snap!', motd); + } + */ + + function interpretUrlAnchors() { + var dict, idx; + + if (location.hash.substr(0, 6) === '#open:') { + hash = location.hash.substr(6); + if (hash.charAt(0) === '%' + || hash.search(/\%(?:[0-9a-f]{2})/i) > -1) { + hash = decodeURIComponent(hash); + } + if (contains( + ['project', 'blocks', 'sprites', 'snapdata'].map(each => + hash.substr(0, 8).indexOf(each) + ), + 1 + )) { + this.droppedText(hash); + } else if (hash.match(/\.(png|gif|svg|jpe?g|tiff)$/i)) { + // Import an image, which could contain embedded scripts + fetch(hash).then(res => res.blob()).then(blob => { + let pic = new Image(), + imgURL = URL.createObjectURL(blob), + dataMarker = MorphicPreferences.pngPayloadMarker; + + pic.src = imgURL; + pic.onload = (async () => { + let buff = new Uint8Array(await blob.arrayBuffer()), + strBuff = buff.reduce((acc, b) => + acc + String.fromCharCode(b), ""), + hasImportanbleCode = (txt) => + txt.match( + /^<(blocks|block|script|sprite)/i + ), + embeddedData, canvas; + + if (strBuff.includes(dataMarker)) { + embeddedData = decodeURIComponent( + strBuff.split(dataMarker)[1] + ); + if (hasImportanbleCode(embeddedData)) { + return this.rawOpenScriptString( + embeddedData, + true + ); + } + } else { + canvas = newCanvas( + new Point(pic.width, pic.height), + true + ); + canvas.getContext('2d').drawImage(pic, 0, 0); + this.droppedImage(canvas, decodeURIComponent(hash)); + } + })(); + }); + } else { + idx = hash.indexOf("&"); + if (idx > 0) { + dict = myself.cloud.parseDict(hash.substr(idx)); + dict.editMode = true; + hash = hash.slice(0, idx); + applyFlags(dict); + } + this.shield = new Morph(); + this.shield.alpha = 0; + this.shield.setExtent(this.parent.extent()); + this.parent.add(this.shield); + this.showMessage('Fetching project...'); + + this.getURL( + hash, + projectData => { + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening project...'), + () => { + if (projectData.indexOf(' { + this.shield.destroy(); + this.shield = null; + msg.destroy(); + this.toggleAppMode(false); + } + ]); + } + ); + } + } else if (location.hash.substr(0, 5) === '#run:') { + dict = ''; + hash = location.hash.substr(5); + + //decoding if hash is an encoded URI + if (hash.charAt(0) === '%' + || hash.search(/\%(?:[0-9a-f]{2})/i) > -1) { + hash = decodeURIComponent(hash); + } + idx = hash.indexOf("&"); + + // supporting three URL cases + + // xml project + if (hash.substr(0, 8) === '') + 10) + ); + applyFlags( + myself.cloud.parseDict( + hash.substr(hash.indexOf('') + 10) + ) + ); + // no project, only flags + } else if (idx == 0){ + applyFlags(myself.cloud.parseDict(hash)); + // xml file path + // three path types allowed: + // (1) absolute (http...), + // (2) relative to site ("/path") or + // (3) relative to folder ("path") + } else { + this.shield = new Morph(); + this.shield.alpha = 0; + this.shield.setExtent(this.parent.extent()); + this.parent.add(this.shield); + this.showMessage('Fetching project...'); + if (idx > 0) { + dict = myself.cloud.parseDict(hash.substr(idx)); + hash = hash.slice(0,idx); + } + this.getURL( + hash, + projectData => { + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening project...'), + () => { + if (projectData.indexOf(' { + this.shield.destroy(); + this.shield = null; + msg.destroy(); + // this.toggleAppMode(true); + applyFlags(dict); + } + ]); + } + ); + } + } else if (location.hash.substr(0, 9) === '#present:') { + this.shield = new Morph(); + this.shield.color = this.color; + this.shield.setExtent(this.parent.extent()); + this.parent.add(this.shield); + myself.showMessage('Fetching project\nfrom the cloud...'); + + // make sure to lowercase the username + dict = myself.cloud.parseDict(location.hash.substr(9)); + dict.Username = dict.Username.toLowerCase(); + + myself.cloud.getPublicProject( + dict.ProjectName, + dict.Username, + projectData => { + var msg; + myself.nextSteps([ + () => msg = myself.showMessage('Opening project...'), + () => { + if (projectData.indexOf(' { + myself.shield.destroy(); + myself.shield = null; + msg.destroy(); + applyFlags(dict); + } + ]); + }, + this.cloudError() + ); + } else if (location.hash.substr(0, 7) === '#cloud:') { + this.shield = new Morph(); + this.shield.alpha = 0; + this.shield.setExtent(this.parent.extent()); + this.parent.add(this.shield); + myself.showMessage('Fetching project\nfrom the cloud...'); + + // make sure to lowercase the username + dict = myself.cloud.parseDict(location.hash.substr(7)); + + myself.cloud.getPublicProject( + dict.ProjectName, + dict.Username, + projectData => { + var msg; + myself.nextSteps([ + () => msg = myself.showMessage('Opening project...'), + () => { + if (projectData.indexOf(' { + myself.shield.destroy(); + myself.shield = null; + msg.destroy(); + myself.toggleAppMode(false); + } + ]); + }, + this.cloudError() + ); + } else if (location.hash.substr(0, 4) === '#dl:') { + myself.showMessage('Fetching project\nfrom the cloud...'); + + // make sure to lowercase the username + dict = myself.cloud.parseDict(location.hash.substr(4)); + dict.Username = dict.Username.toLowerCase(); + + myself.cloud.getPublicProject( + dict.ProjectName, + dict.Username, + projectData => { + myself.saveXMLAs(projectData, dict.ProjectName); + myself.showMessage( + 'Saved project\n' + dict.ProjectName, + 2 + ); + }, + this.cloudError() + ); + } else if (location.hash.substr(0, 6) === '#lang:') { + dict = myself.cloud.parseDict(location.hash.substr(6)); + applyFlags(dict); + } else if (location.hash.substr(0, 7) === '#signup') { + this.createCloudAccount(); + } + this.loadNewProject = false; + } + + function launcherLangSetting() { + var langSetting = null; + if (location.hash.substr(0, 6) === '#lang:') { + if (location.hash.charAt(8) === '_') { + langSetting = location.hash.slice(6,11); + } else { + langSetting = location.hash.slice(6,8); + } + } + // lang-flag wins lang-anchor setting + langSetting = myself.cloud.parseDict(location.hash).lang || langSetting; + return langSetting; + } + + if (launcherLangSetting()) { + // launch with this non-persisten lang setting + this.loadNewProject = true; + this.setLanguage(launcherLangSetting(), interpretUrlAnchors, true); + } else if (this.userLanguage) { + this.loadNewProject = true; + this.setLanguage(this.userLanguage, interpretUrlAnchors); + } else { + interpretUrlAnchors.call(this); + } + + if (location.protocol === 'file:') { + Process.prototype.enableJS = true; + } else { + if (!sessionStorage.username) { + // check whether login should persist across browser sessions + this.cloud.initSession(initUser); + } else { + // login only persistent during a single browser session + this.cloud.checkCredentials(initUser); + } + } + + world.keyboardFocus = this.stage; + this.warnAboutIE(); + + // configure optional settings + this.applyConfigurations(); + + this.warnAboutDev(); + return this; +}; + +// IDE_Morph configuration + +IDE_Morph.prototype.applyConfigurations = function () { + var cnf = this.config, + refreshLater = false, + lang, translation, src, + + refresh = () => { + // load project + if (cnf.load) { + this.getURL( + cnf.load, + projectData => { + if (projectData.indexOf(' refresh(); + document.head.appendChild(translation); + translation.src = src; + } + } + + // no palette + if (cnf.noPalette) { + ScriptsMorph.prototype.enableKeyboard = false; + } + + if (!refreshLater) { + refresh(); + } + + // disable cloud access + if (cnf.noCloud) { + this.cloud.disable(); + this.fixLayout(); + } + + // disable onbeforeunload close warning + if (cnf.noExitWarning) { + window.onbeforeunload = window.cachedOnbeforeunload; + } +}; + +IDE_Morph.prototype.applyPaneHidingConfigurations = function () { + var cnf = this.config; + + // hide controls + if (cnf.hideControls) { + this.logo.hide(); + this.controlBar.hide(); + window.onbeforeunload = nop; + } + + // hide categories + if (cnf.hideCategories) { + this.categories.hide(); + } + + // no sprites + if (cnf.noSprites) { + this.stage.hide(); + cnf.noSpriteEdits = true; + } + + // hide sprite editing widgets + if (cnf.noSpriteEdits) { + this.spriteBar.hide(); + this.stageHandle.hide(); + this.corralBar.hide(); + this.corral.hide(); + } + + // no palette + if (cnf.noPalette) { + this.categories.hide(); + this.palette.hide(); + this.paletteHandle.hide(); + } +}; + +// IDE_Morph construction + +IDE_Morph.prototype.buildPanes = function () { + this.createLogo(); + this.createControlBar(); + this.createCategories(); + this.createPalette(); + this.createStage(); + this.createSpriteBar(); + this.createSpriteEditor(); + this.createCorralBar(); + this.createCorral(); +}; + +IDE_Morph.prototype.createLogo = function () { + var myself = this; + + if (this.logo) { + this.logo.destroy(); + } + + this.logo = new Morph(); + + // the logo texture is not loaded dynamically as an image, but instead + // hard-copied here to avoid tainting the world canvas. This lets us + // use Snap's (and Morphic's) color pickers to sense any pixel which + // otherwise would be compromised by annoying browser security. + + // this.logo.texture = this.logoURL; // original code, commented out + this.logo.texture = "data:image/png;base64," + + "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" + + "gg=="; + + this.logo.render = function (ctx) { + var gradient = ctx.createLinearGradient( + 0, + 0, + this.width(), + 0 + ); + gradient.addColorStop(0, 'black'); + gradient.addColorStop(0.5, myself.frameColor.toString()); + ctx.fillStyle = MorphicPreferences.isFlat ? + myself.frameColor.toString() : gradient; + ctx.fillRect(0, 0, this.width(), this.height()); + if (this.cachedTexture) { + this.renderCachedTexture(ctx); + } else if (this.texture) { + this.renderTexture(this.texture, ctx); + } + }; + + this.logo.renderCachedTexture = function (ctx) { + ctx.drawImage( + this.cachedTexture, + 5, + Math.round((this.height() - this.cachedTexture.height) / 2) + ); + this.changed(); + }; + + this.logo.mouseClickLeft = function () { + myself.snapMenu(); + }; + + this.logo.color = BLACK; + this.logo.setExtent(new Point(200, 28)); // dimensions are fixed + this.add(this.logo); +}; + +IDE_Morph.prototype.createControlBar = function () { + // assumes the logo has already been created + var padding = 5, + button, + slider, + stopButton, + pauseButton, + startButton, + projectButton, + settingsButton, + stageSizeButton, + appModeButton, + steppingButton, + cloudButton, + x, + colors = MorphicPreferences.isFlat ? this.tabColors + : [ + this.groupColor, + this.frameColor.darker(50), + this.frameColor.darker(50) + ], + activeColor = new Color(153, 255, 213), + activeColors = [ + activeColor, + activeColor.lighter(40), + activeColor.lighter(40) + ], + myself = this; + + if (this.controlBar) { + this.controlBar.destroy(); + } + + this.controlBar = new Morph(); + this.controlBar.color = this.frameColor; + this.controlBar.setHeight(this.logo.height()); // height is fixed + + // let users manually enforce re-layout when changing orientation + // on mobile devices + this.controlBar.mouseClickLeft = function () { + this.world().fillPage(); + }; + + this.add(this.controlBar); + + //smallStageButton + button = new ToggleButtonMorph( + null, //colors, + this, // the IDE is the target + 'toggleStageSize', + [ + new SymbolMorph('smallStage', 14), + new SymbolMorph('normalStage', 14) + ], + () => this.isSmallStage // query + ); + + button.hasNeutralBackground = true; + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[0]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = MorphicPreferences.isFlat ? + WHITE + : this.buttonLabelColor; + button.contrast = this.buttonContrast; + // button.hint = 'stage size\nsmall & normal'; + button.fixLayout(); + button.refresh(); + stageSizeButton = button; + this.controlBar.add(stageSizeButton); + this.controlBar.stageSizeButton = button; // for refreshing + + //appModeButton + button = new ToggleButtonMorph( + null, //colors, + this, // the IDE is the target + 'toggleAppMode', + [ + new SymbolMorph('fullScreen', 14), + new SymbolMorph('normalScreen', 14) + ], + () => this.isAppMode // query + ); + + button.hasNeutralBackground = true; + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[0]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = this.buttonLabelColor; + button.contrast = this.buttonContrast; + // button.hint = 'app & edit\nmodes'; + button.fixLayout(); + button.refresh(); + appModeButton = button; + this.controlBar.add(appModeButton); + this.controlBar.appModeButton = appModeButton; // for refreshing + + //steppingButton + button = new ToggleButtonMorph( + null, //colors, + this, // the IDE is the target + 'toggleSingleStepping', + [ + new SymbolMorph('footprints', 16), + new SymbolMorph('footprints', 16) + ], + () => Process.prototype.enableSingleStepping // query + ); + + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = activeColor; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = this.buttonLabelColor; + button.contrast = this.buttonContrast; + button.hint = 'Visible stepping'; + button.fixLayout(); + button.refresh(); + steppingButton = button; + this.controlBar.add(steppingButton); + this.controlBar.steppingButton = steppingButton; // for refreshing + + // stopButton + button = new ToggleButtonMorph( + null, // colors + this, // the IDE is the target + 'stopAllScripts', + [ + new SymbolMorph('octagon', 14), + new SymbolMorph('square', 14) + ], + () => this.stage ? // query + myself.stage.enableCustomHatBlocks && + myself.stage.threads.pauseCustomHatBlocks + : true + ); + + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[2]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = new Color( + MorphicPreferences.isFlat ? 128 : 200, + 0, + 0 + ); + button.contrast = this.buttonContrast; + // button.hint = 'stop\nevery-\nthing'; + button.fixLayout(); + button.refresh(); + stopButton = button; + this.controlBar.add(stopButton); + this.controlBar.stopButton = stopButton; // for refreshing + + //pauseButton + button = new ToggleButtonMorph( + null, //colors, + this, // the IDE is the target + 'togglePauseResume', + [ + new SymbolMorph('pause', 12), + new SymbolMorph('pointRight', 14) + ], + () => this.isPaused() // query + ); + + button.hasNeutralBackground = true; + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[0]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = MorphicPreferences.isFlat ? + new Color(220, 185, 0) + : new Color(255, 220, 0); + button.contrast = this.buttonContrast; + // button.hint = 'pause/resume\nall scripts'; + button.fixLayout(); + button.refresh(); + pauseButton = button; + this.controlBar.add(pauseButton); + this.controlBar.pauseButton = pauseButton; // for refreshing + + // startButton + button = new PushButtonMorph( + this, + 'pressStart', + new SymbolMorph('flag', 14) + ); + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[2]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.fps = 4; + button.isActive = false; + + button.step = function () { + var isRunning; + if (!myself.stage) { + return; + } + isRunning = !!myself.stage.threads.processes.length; + if (isRunning === this.isActive) { + return; + } + this.isActive = isRunning; + if (isRunning) { + this.color = activeColors[0]; + this.highlightColor = activeColors[1]; + this.pressColor = activeColors[2]; + } else { + this.color = colors[0]; + this.highlightColor = colors[1]; + this.pressColor = colors[2]; + } + this.rerender(); + }; + + button.labelColor = new Color( + 0, + MorphicPreferences.isFlat ? 100 : 200, + 0 + ); + button.contrast = this.buttonContrast; + // button.hint = 'start green\nflag scripts'; + button.fixLayout(); + startButton = button; + this.controlBar.add(startButton); + this.controlBar.startButton = startButton; + + // steppingSlider + slider = new SliderMorph( + 61, + 1, + Process.prototype.flashTime * 100 + 1, + 6, + 'horizontal' + ); + slider.action = (num) => { + Process.prototype.flashTime = (num - 1) / 100; + this.controlBar.refreshResumeSymbol(); + }; + // slider.alpha = MorphicPreferences.isFlat ? 0.1 : 0.3; + slider.color = activeColor; + slider.alpha = 0.3; + slider.setExtent(new Point(50, 14)); + this.controlBar.add(slider); + this.controlBar.steppingSlider = slider; + + // projectButton + button = new PushButtonMorph( + this, + 'projectMenu', + new SymbolMorph('file', 14) + //'\u270E' + ); + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[2]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = this.buttonLabelColor; + button.contrast = this.buttonContrast; + // button.hint = 'open, save, & annotate project'; + button.fixLayout(); + projectButton = button; + this.controlBar.add(projectButton); + this.controlBar.projectButton = projectButton; // for menu positioning + + // settingsButton + button = new PushButtonMorph( + this, + 'settingsMenu', + new SymbolMorph('gears', 14) + //'\u2699' + ); + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[2]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = this.buttonLabelColor; + button.contrast = this.buttonContrast; + // button.hint = 'edit settings'; + button.fixLayout(); + settingsButton = button; + this.controlBar.add(settingsButton); + this.controlBar.settingsButton = settingsButton; // for menu positioning + + // cloudButton + button = new ToggleButtonMorph( + null, //colors, + this, // the IDE is the target + 'cloudMenu', + [ + new SymbolMorph('cloudOutline', 11), + new SymbolMorph('cloud', 11) + ], + () => !isNil(this.cloud.username) // query + ); + + button.hasNeutralBackground = true; + button.corner = 12; + button.color = colors[0]; + button.highlightColor = colors[1]; + button.pressColor = colors[0]; + button.labelMinExtent = new Point(36, 18); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = this.buttonLabelColor; + button.contrast = this.buttonContrast; + // button.hint = 'cloud operations'; + button.fixLayout(); + button.refresh(); + cloudButton = button; + this.controlBar.add(cloudButton); + this.controlBar.cloudButton = cloudButton; // for menu positioning & refresh + + this.controlBar.fixLayout = function () { + x = this.right() - padding; + [stopButton, pauseButton, startButton].forEach(button => { + button.setCenter(myself.controlBar.center()); + button.setRight(x); + x -= button.width(); + x -= padding; + } + ); + + x = startButton.left() - (3 * padding + 2 * stageSizeButton.width()); + if (!myself.config.noSprites) { + x = Math.min( + x, + myself.right() - myself.stage.dimensions.x * + (myself.isSmallStage ? myself.stageRatio : 1) - + (myself.config.border || 0) + ); + x = Math.max(x, this.left()); + } + [stageSizeButton, appModeButton].forEach(button => { + x += padding; + button.setCenter(myself.controlBar.center()); + button.setLeft(x); + x += button.width(); + } + ); + + slider.setCenter(myself.controlBar.center()); + slider.setRight(stageSizeButton.left() - padding); + + steppingButton.setCenter(myself.controlBar.center()); + steppingButton.setRight(slider.left() - padding); + + settingsButton.setCenter(myself.controlBar.center()); + settingsButton.setLeft(this.left()); + + if (myself.config.hideSettings) { + settingsButton.hide(); + } + + projectButton.setCenter(myself.controlBar.center()); + + if (myself.config.noImports || myself.config.hideProjects) { + projectButton.hide(); + } + + if (myself.cloud.disabled) { + cloudButton.hide(); + projectButton.setRight(settingsButton.left() - padding); + } else { + cloudButton.setCenter(myself.controlBar.center()); + cloudButton.setRight(settingsButton.left() - padding); + projectButton.setRight(cloudButton.left() - padding); + } + + this.refreshSlider(); + this.updateLabel(); + }; + + this.controlBar.refreshSlider = function () { + if (Process.prototype.enableSingleStepping && !myself.isAppMode) { + slider.fixLayout(); + slider.rerender(); + slider.show(); + } else { + slider.hide(); + } + this.refreshResumeSymbol(); + }; + + this.controlBar.refreshResumeSymbol = function () { + var pauseSymbols; + if (Process.prototype.enableSingleStepping && + Process.prototype.flashTime > 0.5) { + myself.stage.threads.pauseAll(myself.stage); + pauseSymbols = [ + new SymbolMorph('pause', 12), + new SymbolMorph('stepForward', 14) + ]; + } else { + pauseSymbols = [ + new SymbolMorph('pause', 12), + new SymbolMorph('pointRight', 14) + ]; + } + pauseButton.labelString = pauseSymbols; + pauseButton.createLabel(); + pauseButton.fixLayout(); + pauseButton.refresh(); + }; + + this.controlBar.updateLabel = function () { + var prefix = myself.hasUnsavedEdits() ? '\u270E ' : '', + suffix = myself.world().isDevMode ? + ' - ' + localize('development mode') : '', + name, scene, txt; + + if (this.label) { + this.label.destroy(); + } + if (myself.isAppMode) { + return; + } + scene = myself.scenes.at(1) !== myself.scene ? + ' (' + myself.scene.name + ')' : ''; + name = (myself.getProjectName() || localize('untitled')); + if (!myself.config.preserveTitle) { + document.title = "Snap! " + + (myself.getProjectName() ? name : SnapVersion); + } + txt = new StringMorph( + prefix + name + scene + suffix, + 14, + 'sans-serif', + true, + false, + false, + MorphicPreferences.isFlat ? null : new Point(2, 1), + myself.frameColor.darker(myself.buttonContrast) + ); + txt.color = myself.buttonLabelColor; + + this.label = new FrameMorph(); + this.label.acceptsDrops = false; + this.label.alpha = 0; + txt.setPosition(this.label.position()); + this.label.add(txt); + this.label.setExtent( + new Point( + steppingButton.left() - settingsButton.right() - padding * 2, + txt.height() + ) + ); + this.label.setCenter(this.center()); + this.label.setLeft(this.settingsButton.right() + padding); + this.add(this.label); + }; +}; + +IDE_Morph.prototype.createCategories = function () { + var myself = this, + categorySelectionAction = this.scene.unifiedPalette ? scrollToCategory + : changePalette, + categoryQueryAction = this.scene.unifiedPalette ? queryTopCategory + : queryCurrentCategory, + shift = this.config.noDefaultCat ? 4 : 0, + flag = true; + + if (this.categories) { + flag = this.categories.isVisible; + this.categories.destroy(); + } + this.categories = new Morph(); + this.categories.color = this.groupColor; + this.categories.bounds.setWidth(this.paletteWidth); + this.categories.buttons = []; + this.categories.isVisible = flag; + + this.categories.droppedImage = (aCanvas, name, embeddedData) => { + this.droppedImage(aCanvas, name, embeddedData, 'categories'); + }; + + this.categories.refresh = function () { + this.buttons.forEach(cat => { + cat.refresh(); + if (cat.state) { + cat.scrollIntoView(); + } + }); + }; + + this.categories.refreshEmpty = function () { + var dict = myself.currentSprite.emptyCategories(); + dict.variables = dict.variables || dict.lists || dict.other; + this.buttons.forEach(cat => { + if (dict[cat.category]) { + cat.enable(); + } else { + cat.disable(); + } + }); + }; + + function changePalette(category) { + return () => { + myself.currentCategory = category; + myself.categories.buttons.forEach(each => + each.refresh() + ); + myself.refreshPalette(true); + }; + } + + function scrollToCategory(category) { + return () => myself.scrollPaletteToCategory(category); + } + + function queryCurrentCategory(category) { + return () => myself.currentCategory === category; + } + + function queryTopCategory(category) { + return () => myself.topVisibleCategoryInPalette() === category; + } + + function addCategoryButton(category) { + var labelWidth = 75, + colors = [ + myself.frameColor, + myself.frameColor.darker(MorphicPreferences.isFlat ? 5 : 50), + SpriteMorph.prototype.blockColor[category] + ], + button; + + button = new ToggleButtonMorph( + colors, + myself, // the IDE is the target + categorySelectionAction(category), + category[0].toUpperCase().concat(category.slice(1)), // label + categoryQueryAction(category), // query + null, // env + null, // hint + labelWidth, // minWidth + true // has preview + ); + + button.category = category; + button.corner = 8; + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = myself.buttonLabelColor; + if (MorphicPreferences.isFlat) { + button.labelPressColor = WHITE; + } + button.fixLayout(); + button.refresh(); + myself.categories.add(button); + myself.categories.buttons.push(button); + return button; + } + + function addCustomCategoryButton(category, color) { + var labelWidth = 168, + colors = [ + myself.frameColor, + myself.frameColor.darker(MorphicPreferences.isFlat ? 5 : 50), + color + ], + button; + + button = new ToggleButtonMorph( + colors, + myself, // the IDE is the target + categorySelectionAction(category), + category, // label + categoryQueryAction(category), // query + null, // env + null, // hint + labelWidth, // minWidth + true // has preview + ); + + button.category = category; + button.corner = 8; + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = myself.buttonLabelColor; + if (MorphicPreferences.isFlat) { + button.labelPressColor = WHITE; + } + button.fixLayout(); + button.refresh(); + myself.categories.add(button); + myself.categories.buttons.push(button); + return button; + } + + function fixCategoriesLayout() { + var buttonWidth = myself.categories.children[0].width(), + buttonHeight = myself.categories.children[0].height(), + more = SpriteMorph.prototype.customCategories.size, + border = 3, + xPadding = (200 // myself.logo.width() + - border + - buttonWidth * 2) / 3, + yPadding = 2, + l = myself.categories.left(), + t = myself.categories.top(), + scroller, + row, + col, + i; + + myself.categories.children.forEach((button, i) => { + row = i < 8 ? i % 4 : i - 4; + col = (i < 4 || i > 7) ? 1 : 2; + button.setPosition(new Point( + l + (col * xPadding + ((col - 1) * buttonWidth)), + t + (((row - shift) + 1) * yPadding + ((row - shift) * buttonHeight) + border) + + (i > 7 ? border + 2 : 0) + )); + }); + + if (shift) { // hide the built-in category buttons + for (i = 0; i < 8; i += 1) { + myself.categories.children[i].hide(); + } + } + + if (more > 6) { + scroller = new ScrollFrameMorph(null, null, myself.sliderColor); + scroller.setColor(myself.groupColor); + scroller.acceptsDrops = false; + scroller.contents.acceptsDrops = false; + scroller.setPosition( + new Point(0, myself.categories.children[8].top()) + ); + scroller.setWidth(myself.paletteWidth); + scroller.setHeight(buttonHeight * 6 + yPadding * 5); + + for (i = 0; i < more; i += 1) { + scroller.addContents(myself.categories.children[8]); + } + myself.categories.add(scroller); + myself.categories.scroller = scroller; + myself.categories.setHeight( + (4 + 1 - shift) * yPadding + + (4 - shift) * buttonHeight + + 6 * (yPadding + buttonHeight) + border + 2 + + 2 * border + ); + } else { + myself.categories.setHeight( + (4 + 1 - shift) * yPadding + + (4 - shift) * buttonHeight + + (more ? + (more * (yPadding + buttonHeight) + border + 2) + : 0) + + 2 * border + ); + } + } + + SpriteMorph.prototype.categories.forEach(cat => { + if (!contains(['lists', 'other'], cat)) { + addCategoryButton(cat); + } + }); + + // sort alphabetically + Array.from( + SpriteMorph.prototype.customCategories.keys() + ).sort().forEach(name => + addCustomCategoryButton( + name, + SpriteMorph.prototype.customCategories.get(name) + ) + ); + + fixCategoriesLayout(); + this.add(this.categories); +}; + +IDE_Morph.prototype.createPalette = function (forSearching) { + // assumes that the logo pane has already been created + // needs the categories pane for layout + var myself = this, + vScrollAction; + + if (this.palette) { + this.palette.destroy(); + } + + if (forSearching) { + this.palette = new ScrollFrameMorph( + null, + null, + this.currentSprite.sliderColor + ); + this.palette.isForSearching = true; + + // search toolbar (floating cancel button): + /* commented out for now + this.palette.toolBar = new PushButtonMorph( + this, + () => { + this.refreshPalette(); + this.palette.adjustScrollBars(); + }, + new SymbolMorph("magnifierOutline", 16) + ); + this.palette.toolBar.alpha = 0.2; + this.palette.toolBar.padding = 1; + // this.palette.toolBar.hint = 'Cancel'; + this.palette.toolBar.labelShadowColor = new Color(140, 140, 140); + this.palette.toolBar.fixLayout(); + this.palette.add(this.palette.toolBar); + */ + + } else { + this.palette = this.currentSprite.palette(this.currentCategory); + } + this.palette.isDraggable = false; + this.palette.acceptsDrops = true; + this.palette.enableAutoScrolling = false; + this.palette.contents.acceptsDrops = false; + + if (this.scene.unifiedPalette) { + this.palette.adjustScrollBars = function () { + ScrollFrameMorph.prototype.adjustScrollBars.call(this); + myself.categories.refresh(); + }; + + vScrollAction = this.palette.vBar.action; + this.palette.vBar.action = function (num) { + vScrollAction(num); + myself.categories.buttons.forEach(each => each.refresh()); + }; + } + + this.palette.reactToDropOf = (droppedMorph, hand) => { + if (droppedMorph instanceof DialogBoxMorph) { + this.world().add(droppedMorph); + } else if (droppedMorph instanceof SpriteMorph) { + this.removeSprite(droppedMorph); + } else if (droppedMorph instanceof SpriteIconMorph) { + droppedMorph.destroy(); + this.removeSprite(droppedMorph.object); + } else if (droppedMorph instanceof CostumeIconMorph) { + // this.currentSprite.wearCostume(null); // do we need this? + droppedMorph.perish(myself.isAnimating ? 200 : 0); + } else if (droppedMorph instanceof BlockMorph) { + this.stage.threads.stopAllForBlock(droppedMorph); + if (hand && hand.grabOrigin.origin instanceof ScriptsMorph) { + hand.grabOrigin.origin.clearDropInfo(); + hand.grabOrigin.origin.lastDroppedBlock = droppedMorph; + hand.grabOrigin.origin.recordDrop(hand.grabOrigin); + } + droppedMorph.perish(myself.isAnimating ? 200 : 0); + this.currentSprite.recordUserEdit( + 'scripts', + 'block', + 'delete', + droppedMorph.abstractBlockSpec() + ); + } else { + droppedMorph.perish(myself.isAnimating ? 200 : 0); + if (droppedMorph instanceof CommentMorph) { + this.currentSprite.recordUserEdit( + 'scripts', + 'comment', + 'delete' + ); + } + } + }; + + this.palette.contents.reactToDropOf = (droppedMorph) => { + // for "undrop" operation + if (droppedMorph instanceof BlockMorph) { + droppedMorph.destroy(); + } + }; + + this.palette.droppedImage = (aCanvas, name, embeddedData) => { + this.droppedImage(aCanvas, name, embeddedData, 'palette'); + }; + + this.palette.setWidth(this.logo.width()); + this.add(this.palette); + return this.palette; +}; + +IDE_Morph.prototype.createPaletteHandle = function () { + // assumes that the palette has already been created + if (this.paletteHandle) {this.paletteHandle.destroy(); } + this.paletteHandle = new PaletteHandleMorph(this.categories); + this.add(this.paletteHandle); +}; + +IDE_Morph.prototype.createStage = function () { + if (this.stage) { + this.stage.destroy(); + } + this.add(this.scene.stage); + this.stage = this.scene.stage; +}; + +IDE_Morph.prototype.createStageHandle = function () { + // assumes that the stage has already been created + if (this.stageHandle) {this.stageHandle.destroy(); } + this.stageHandle = new StageHandleMorph(this.stage); + this.add(this.stageHandle); +}; + +IDE_Morph.prototype.createSpriteBar = function () { + // assumes that the categories pane has already been created + var rotationStyleButtons = [], + thumbSize = new Point(45, 45), + nameField, + padlock, + thumbnail, + tabCorner = 15, + tabColors = this.tabColors, + tabBar = new AlignmentMorph('row', -tabCorner * 2), + tab, + symbols = [ + new SymbolMorph('arrowRightThin', 10), + new SymbolMorph('turnAround', 10), + new SymbolMorph('arrowLeftRightThin', 10), + ], + labels = ['don\'t rotate', 'can rotate', 'only face left/right'], + myself = this; + + if (this.spriteBar) { + this.spriteBar.destroy(); + } + + this.spriteBar = new Morph(); + this.spriteBar.color = this.frameColor; + this.add(this.spriteBar); + + function addRotationStyleButton(rotationStyle) { + var colors = myself.rotationStyleColors, + button; + + button = new ToggleButtonMorph( + colors, + myself, // the IDE is the target + () => { + if (myself.currentSprite instanceof SpriteMorph) { + myself.currentSprite.rotationStyle = rotationStyle; + myself.currentSprite.changed(); + myself.currentSprite.fixLayout(); + myself.currentSprite.rerender(); + myself.currentSprite.recordUserEdit( + 'sprite', + 'rotation', + rotationStyle + ); + } + rotationStyleButtons.forEach(each => + each.refresh() + ); + }, + symbols[rotationStyle], // label + () => myself.currentSprite instanceof SpriteMorph // query + && myself.currentSprite.rotationStyle === rotationStyle, + null, // environment + localize(labels[rotationStyle]) + ); + + button.corner = 8; + button.labelMinExtent = new Point(11, 11); + button.padding = 0; + button.labelShadowOffset = new Point(-1, -1); + button.labelShadowColor = colors[1]; + button.labelColor = myself.buttonLabelColor; + button.fixLayout(); + button.refresh(); + rotationStyleButtons.push(button); + button.setPosition(myself.spriteBar.position().add(new Point(2, 4))); + button.setTop(button.top() + + ((rotationStyleButtons.length - 1) * (button.height() + 2)) + ); + myself.spriteBar.add(button); + if (myself.currentSprite instanceof StageMorph) { + button.hide(); + } + return button; + } + + addRotationStyleButton(1); + addRotationStyleButton(2); + addRotationStyleButton(0); + this.rotationStyleButtons = rotationStyleButtons; + + thumbnail = new Morph(); + thumbnail.isCachingImage = true; + thumbnail.bounds.setExtent(thumbSize); + thumbnail.cachedImage = this.currentSprite.thumbnail(thumbSize); + thumbnail.setPosition( + rotationStyleButtons[0].topRight().add(new Point(5, 3)) + ); + this.spriteBar.add(thumbnail); + + thumbnail.fps = 3; + + thumbnail.step = function () { + if (thumbnail.version !== myself.currentSprite.version) { + thumbnail.cachedImage = myself.currentSprite.thumbnail( + thumbSize, + thumbnail.cachedImage + ); + thumbnail.changed(); + thumbnail.version = myself.currentSprite.version; + } + }; + + nameField = new InputFieldMorph(this.currentSprite.name); + nameField.setWidth(100); // fixed dimensions + nameField.contrast = 90; + nameField.setPosition(thumbnail.topRight().add(new Point(10, 3))); + this.spriteBar.add(nameField); + this.spriteBar.nameField = nameField; + nameField.fixLayout(); + nameField.accept = function () { + var newName = nameField.getValue(); + myself.currentSprite.setName( + myself.newSpriteName(newName, myself.currentSprite) + ); + nameField.setContents(myself.currentSprite.name); + }; + this.spriteBar.reactToEdit = nameField.accept; + + // padlock + padlock = new ToggleMorph( + 'checkbox', + null, + () => { + this.currentSprite.isDraggable = !this.currentSprite.isDraggable; + this.currentSprite.recordUserEdit( + 'sprite', + 'draggable', + this.currentSprite.isDraggable + ); + }, + localize('draggable'), + () => this.currentSprite.isDraggable + ); + padlock.label.isBold = false; + padlock.label.setColor(this.buttonLabelColor); + padlock.color = tabColors[2]; + padlock.highlightColor = tabColors[0]; + padlock.pressColor = tabColors[1]; + + padlock.tick.shadowOffset = MorphicPreferences.isFlat ? + ZERO : new Point(-1, -1); + padlock.tick.shadowColor = BLACK; + padlock.tick.color = this.buttonLabelColor; + padlock.tick.isBold = false; + padlock.tick.fixLayout(); + + padlock.setPosition(nameField.bottomLeft().add(2)); + padlock.fixLayout(); + this.spriteBar.add(padlock); + if (this.currentSprite instanceof StageMorph) { + padlock.hide(); + } + + // tab bar + tabBar.tabTo = function (tabString) { + var active; + if (myself.currentTab === tabString) {return; } + myself.world().hand.destroyTemporaries(); + myself.currentTab = tabString; + this.children.forEach(each => { + each.refresh(); + if (each.state) {active = each; } + }); + active.refresh(); // needed when programmatically tabbing + myself.createSpriteEditor(); + myself.fixLayout('tabEditor'); + }; + + tab = new TabMorph( + tabColors, + null, // target + () => tabBar.tabTo('scripts'), + localize('Scripts'), // label + () => this.currentTab === 'scripts' // query + ); + tab.padding = 3; + tab.corner = tabCorner; + tab.edge = 1; + tab.labelShadowOffset = new Point(-1, -1); + tab.labelShadowColor = tabColors[1]; + tab.labelColor = this.buttonLabelColor; + + tab.getPressRenderColor = function () { + if (MorphicPreferences.isFlat || + SyntaxElementMorph.prototype.alpha > 0.85) { + return this.pressColor; + } + return this.pressColor.mixed( + Math.max(SyntaxElementMorph.prototype.alpha - 0.15, 0), + SpriteMorph.prototype.paletteColor + ); + }; + + tab.fixLayout(); + tabBar.add(tab); + + tab = new TabMorph( + tabColors, + null, // target + () => tabBar.tabTo('costumes'), + localize(this.currentSprite instanceof SpriteMorph ? + 'Costumes' : 'Backgrounds' + ), + () => this.currentTab === 'costumes' // query + ); + tab.padding = 3; + tab.corner = tabCorner; + tab.edge = 1; + tab.labelShadowOffset = new Point(-1, -1); + tab.labelShadowColor = tabColors[1]; + tab.labelColor = this.buttonLabelColor; + tab.fixLayout(); + tabBar.add(tab); + + tab = new TabMorph( + tabColors, + null, // target + () => tabBar.tabTo('sounds'), + localize('Sounds'), // label + () => this.currentTab === 'sounds' // query + ); + tab.padding = 3; + tab.corner = tabCorner; + tab.edge = 1; + tab.labelShadowOffset = new Point(-1, -1); + tab.labelShadowColor = tabColors[1]; + tab.labelColor = this.buttonLabelColor; + tab.fixLayout(); + tabBar.add(tab); + + tabBar.fixLayout(); + tabBar.children.forEach(each => + each.refresh() + ); + this.spriteBar.tabBar = tabBar; + this.spriteBar.add(this.spriteBar.tabBar); + + this.spriteBar.fixLayout = function () { + this.tabBar.setLeft(this.left()); + this.tabBar.setBottom(this.bottom() + myself.padding); + }; +}; + +IDE_Morph.prototype.createSpriteEditor = function () { + // assumes that the logo pane and the stage have already been created + var scripts = this.currentSprite.scripts; + + if (this.spriteEditor) { + this.spriteEditor.destroy(); + } + + if (this.currentTab === 'scripts') { + scripts.isDraggable = false; + scripts.color = this.groupColor; + scripts.cachedTexture = this.scriptsPaneTexture; + + this.spriteEditor = new ScrollFrameMorph( + scripts, + null, + this.sliderColor + ); + this.spriteEditor.color = this.groupColor; + this.spriteEditor.padding = 10; + this.spriteEditor.growth = 50; + this.spriteEditor.isDraggable = false; + this.spriteEditor.acceptsDrops = false; + this.spriteEditor.contents.acceptsDrops = true; + + scripts.scrollFrame = this.spriteEditor; + scripts.updateToolbar(); + this.add(this.spriteEditor); + this.spriteEditor.scrollX(this.spriteEditor.padding); + this.spriteEditor.scrollY(this.spriteEditor.padding); + } else if (this.currentTab === 'costumes') { + this.spriteEditor = new WardrobeMorph( + this.currentSprite, + this.sliderColor + ); + this.spriteEditor.color = this.groupColor; + this.add(this.spriteEditor); + this.spriteEditor.updateSelection(); + + this.spriteEditor.acceptsDrops = false; + this.spriteEditor.contents.acceptsDrops = false; + } else if (this.currentTab === 'sounds') { + this.spriteEditor = new JukeboxMorph( + this.currentSprite, + this.sliderColor + ); + this.spriteEditor.color = this.groupColor; + this.add(this.spriteEditor); + this.spriteEditor.updateSelection(); + this.spriteEditor.acceptDrops = false; + this.spriteEditor.contents.acceptsDrops = false; + } else { + this.spriteEditor = new Morph(); + this.spriteEditor.color = this.groupColor; + this.spriteEditor.acceptsDrops = true; + this.spriteEditor.reactToDropOf = (droppedMorph) => { + if (droppedMorph instanceof DialogBoxMorph) { + this.world().add(droppedMorph); + } else if (droppedMorph instanceof SpriteMorph) { + this.removeSprite(droppedMorph); + } else { + droppedMorph.destroy(); + } + }; + this.add(this.spriteEditor); + } + + this.spriteEditor.mouseEnterDragging = (morph) => { + if (morph instanceof BlockMorph) { + this.spriteBar.tabBar.tabTo('scripts'); + } else if (morph instanceof CostumeIconMorph) { + this.spriteBar.tabBar.tabTo('costumes'); + } else if (morph instanceof SoundIconMorph) { + this.spriteBar.tabBar.tabTo('sounds'); + } + }; + + this.spriteEditor.contents.mouseEnterDragging = + this.spriteEditor.mouseEnterDragging; +}; + +IDE_Morph.prototype.createCorralBar = function () { + // assumes the stage has already been created + var padding = 5, + newbutton, + paintbutton, + cambutton, + trashbutton, + flag = true, + myself = this, + colors = MorphicPreferences.isFlat ? this.tabColors + : [ + this.groupColor, + this.frameColor.darker(50), + this.frameColor.darker(50) + ]; + + if (this.corralBar) { + flag = this.corralBar.isVisible; + this.corralBar.destroy(); + } + + this.corralBar = new Morph(); + this.corralBar.color = this.frameColor; + this.corralBar.isVisible = flag; + this.corralBar.setHeight(this.logo.height()); // height is fixed + this.corralBar.setWidth(this.stage.width()); + this.add(this.corralBar); + + // new sprite button + newbutton = new PushButtonMorph( + this, + "addNewSprite", + new SymbolMorph("turtle", 14) + ); + newbutton.corner = 12; + newbutton.color = colors[0]; + newbutton.highlightColor = colors[1]; + newbutton.pressColor = colors[2]; + newbutton.labelMinExtent = new Point(36, 18); + newbutton.padding = 0; + newbutton.labelShadowOffset = new Point(-1, -1); + newbutton.labelShadowColor = colors[1]; + newbutton.labelColor = this.buttonLabelColor; + newbutton.contrast = this.buttonContrast; + newbutton.hint = "add a new Turtle sprite"; + newbutton.fixLayout(); + newbutton.setCenter(this.corralBar.center()); + newbutton.setLeft(this.corralBar.left() + padding); + this.corralBar.add(newbutton); + + paintbutton = new PushButtonMorph( + this, + "paintNewSprite", + new SymbolMorph("brush", 15) + ); + paintbutton.corner = 12; + paintbutton.color = colors[0]; + paintbutton.highlightColor = colors[1]; + paintbutton.pressColor = colors[2]; + paintbutton.labelMinExtent = new Point(36, 18); + paintbutton.padding = 0; + paintbutton.labelShadowOffset = new Point(-1, -1); + paintbutton.labelShadowColor = colors[1]; + paintbutton.labelColor = this.buttonLabelColor; + paintbutton.contrast = this.buttonContrast; + paintbutton.hint = "paint a new sprite"; + paintbutton.fixLayout(); + paintbutton.setCenter(this.corralBar.center()); + paintbutton.setLeft( + this.corralBar.left() + padding + newbutton.width() + padding + ); + this.corralBar.add(paintbutton); + + if (CamSnapshotDialogMorph.prototype.enableCamera) { + cambutton = new PushButtonMorph( + this, + "newCamSprite", + new SymbolMorph("camera", 15) + ); + cambutton.corner = 12; + cambutton.color = colors[0]; + cambutton.highlightColor = colors[1]; + cambutton.pressColor = colors[2]; + cambutton.labelMinExtent = new Point(36, 18); + cambutton.padding = 0; + cambutton.labelShadowOffset = new Point(-1, -1); + cambutton.labelShadowColor = colors[1]; + cambutton.labelColor = this.buttonLabelColor; + cambutton.contrast = this.buttonContrast; + cambutton.hint = "take a camera snapshot and\n" + + "import it as a new sprite"; + cambutton.fixLayout(); + cambutton.setCenter(this.corralBar.center()); + cambutton.setLeft( + this.corralBar.left() + + padding + + newbutton.width() + + padding + + paintbutton.width() + + padding + ); + this.corralBar.add(cambutton); + document.addEventListener( + 'cameraDisabled', + event => { + cambutton.disable(); + cambutton.hint = + CamSnapshotDialogMorph.prototype.notSupportedMessage; + } + ); + } + + // trash button + trashbutton = new PushButtonMorph( + this, + "undeleteSprites", + new SymbolMorph("trash", 18) + ); + trashbutton.corner = 12; + trashbutton.color = colors[0]; + trashbutton.highlightColor = colors[1]; + trashbutton.pressColor = colors[2]; + trashbutton.labelMinExtent = new Point(36, 18); + trashbutton.padding = 0; + trashbutton.labelShadowOffset = new Point(-1, -1); + trashbutton.labelShadowColor = colors[1]; + trashbutton.labelColor = this.buttonLabelColor; + trashbutton.contrast = this.buttonContrast; + // trashbutton.hint = "bring back deleted sprites"; + trashbutton.fixLayout(); + trashbutton.setCenter(this.corralBar.center()); + trashbutton.setRight(this.corralBar.right() - padding); + this.corralBar.add(trashbutton); + + trashbutton.wantsDropOf = (morph) => + morph instanceof SpriteMorph || morph instanceof SpriteIconMorph; + + trashbutton.reactToDropOf = (droppedMorph) => { + if (droppedMorph instanceof SpriteMorph) { + this.removeSprite(droppedMorph); + } else if (droppedMorph instanceof SpriteIconMorph) { + droppedMorph.destroy(); + this.removeSprite(droppedMorph.object); + } + }; + + this.corralBar.fixLayout = function () { + function updateDisplayOf(button) { + if (button && button.right() > trashbutton.left() - padding) { + button.hide(); + } else { + button.show(); + } + } + this.setWidth(myself.stage.width()); + trashbutton.setRight(this.right() - padding); + updateDisplayOf(cambutton); + updateDisplayOf(paintbutton); + }; +}; + +IDE_Morph.prototype.createCorral = function (keepSceneAlbum) { + // assumes the corral bar has already been created + var frame, padding = 5, myself = this, + album = this.corral? this.corral.album : null; + + this.createStageHandle(); + this.createPaletteHandle(); + + if (this.corral) { + this.corral.destroy(); + } + + this.corral = new Morph(); + this.corral.color = this.groupColor; + this.corral.getRenderColor = ScriptsMorph.prototype.getRenderColor; + + this.add(this.corral); + + this.corral.stageIcon = new SpriteIconMorph(this.stage); + this.corral.stageIcon.isDraggable = false; + this.corral.add(this.corral.stageIcon); + + frame = new ScrollFrameMorph(null, null, this.sliderColor); + frame.acceptsDrops = false; + frame.contents.acceptsDrops = false; + + frame.contents.wantsDropOf = (morph) => morph instanceof SpriteIconMorph; + + frame.contents.reactToDropOf = (spriteIcon) => + this.corral.reactToDropOf(spriteIcon); + + frame.alpha = 0; + + this.sprites.asArray().forEach(morph => { + if (!morph.isTemporary) { + frame.contents.add(new SpriteIconMorph(morph)); + } + }); + + this.corral.frame = frame; + this.corral.add(frame); + + // scenes corral + this.corral.album = keepSceneAlbum ? album + : new SceneAlbumMorph(this, this.sliderColor); + this.corral.album.color = this.frameColor; + this.corral.add(this.corral.album); + + this.corral.fixLayout = function () { + this.stageIcon.setCenter(this.center()); + this.stageIcon.setLeft(this.left() + padding); + + // scenes + if (myself.scenes.length() < 2) { + this.album.hide(); + } else { + this.stageIcon.setTop(this.top()); + this.album.show(); + this.album.setLeft(this.left()); + this.album.setTop(this.stageIcon.bottom() + padding); + this.album.setWidth(this.stageIcon.width() + padding * 2); + this.album.setHeight( + this.height() - this.stageIcon.height() - padding + ); + } + + this.frame.setLeft(this.stageIcon.right() + padding); + this.frame.setExtent(new Point( + this.right() - this.frame.left(), + this.height() + )); + this.arrangeIcons(); + this.refresh(); + }; + + this.corral.arrangeIcons = function () { + var x = this.frame.left(), + y = this.frame.top(), + max = this.frame.right(), + start = this.frame.left(); + + this.frame.contents.children.forEach(icon => { + var w = icon.width(); + + if (x + w > max) { + x = start; + y += icon.height(); // they're all the same + } + icon.setPosition(new Point(x, y)); + x += w; + }); + this.frame.contents.adjustBounds(); + }; + + this.corral.addSprite = function (sprite) { + this.frame.contents.add(new SpriteIconMorph(sprite)); + this.fixLayout(); + sprite.recordUserEdit( + 'corral', + 'add', + sprite.name + ); + }; + + this.corral.refresh = function () { + this.stageIcon.refresh(); + this.frame.contents.children.forEach(icon => + icon.refresh() + ); + }; + + this.corral.wantsDropOf = (morph) => morph instanceof SpriteIconMorph; + + this.corral.reactToDropOf = function (spriteIcon) { + var idx = 1, + pos = spriteIcon.position(); + spriteIcon.destroy(); + this.frame.contents.children.forEach(icon => { + if (pos.gt(icon.position()) || pos.y > icon.bottom()) { + idx += 1; + } + }); + myself.sprites.add(spriteIcon.object, idx); + myself.createCorral(true); // keep scenes + myself.fixLayout(); + }; +}; + +// IDE_Morph layout + +IDE_Morph.prototype.fixLayout = function (situation) { + // situation is a string, i.e. + // 'selectSprite' or 'refreshPalette' or 'tabEditor' + var padding = this.padding, + cnf = this.config, + border = cnf.border || 0, + flag, + maxPaletteWidth; + + // logo + this.logo.setLeft(this.left() + border); + this.logo.setTop(this.top() + border); + + if (situation !== 'refreshPalette') { + // controlBar + this.controlBar.setPosition(this.logo.topRight()); + this.controlBar.setWidth( + this.right() - this.controlBar.left() - border + ); + this.controlBar.fixLayout(); + + // categories + this.categories.setLeft(this.logo.left()); + this.categories.setTop( + cnf.hideControls ? this.top() + border : this.logo.bottom() + ); + this.categories.setWidth(this.paletteWidth); + if (this.categories.scroller) { + this.categories.scroller.setWidth(this.paletteWidth); + } + } + + // palette + this.palette.setLeft(this.logo.left()); + this.palette.setTop( + cnf.hideCategories ? + (cnf.hideControls ? + this.top() + border + : this.controlBar.bottom() + padding) + : this.categories.bottom() + ); + this.palette.setHeight(this.bottom() - this.palette.top() - border); + this.palette.setWidth(this.paletteWidth); + + if (situation !== 'refreshPalette') { + // stage + if (this.isEmbedMode) { + this.stage.setScale(Math.floor(Math.min( + this.width() / this.stage.dimensions.x, + this.height() / this.stage.dimensions.y + ) * 100) / 100); + flag = this.embedPlayButton.flag; + flag.size = Math.floor(Math.min( + this.width(), this.height())) / 5; + flag.fixLayout(); + this.embedPlayButton.size = flag.size * 1.6; + this.embedPlayButton.fixLayout(); + if (this.embedOverlay) { + this.embedOverlay.setExtent(this.extent()); + } + this.stage.setCenter(this.center()); + this.embedPlayButton.setCenter(this.stage.center()); + flag.setCenter(this.embedPlayButton.center()); + flag.setLeft(flag.left() + flag.size * 0.1); // account for slight asymmetry + } else if (this.isAppMode) { + this.stage.setScale(Math.floor(Math.min( + (this.width() - padding * 2) / this.stage.dimensions.x, + (this.height() - this.controlBar.height() * 2 - padding * 2) + / this.stage.dimensions.y + ) * 10) / 10); + this.stage.setCenter(this.center()); + } else { + this.stage.setScale(this.isSmallStage ? this.stageRatio : 1); + this.stage.setTop( + cnf.hideControls ? + this.top() + border + : this.logo.bottom() + padding + ); + this.stage.setRight(this.right() - border); + if (cnf.noSprites) { + maxPaletteWidth = Math.max( + 200, + this.width() - + border * 2 + ); + } else { + maxPaletteWidth = Math.max( + 200, + this.width() - + this.stage.width() - + this.spriteBar.tabBar.width() - + padding * 2 - + border * 2 + ); + } + if (this.paletteWidth > maxPaletteWidth) { + this.paletteWidth = maxPaletteWidth; + this.fixLayout(); + } + this.stageHandle.fixLayout(); + this.paletteHandle.fixLayout(); + } + + // spriteBar + this.spriteBar.setLeft(cnf.noPalette ? + this.left() + border + : this.paletteWidth + padding + border + ); + this.spriteBar.setTop( + cnf.hideControls ? + this.top() + border + : this.logo.bottom() + padding + ); + this.spriteBar.setWidth( + Math.max(0, this.stage.left() - padding - this.spriteBar.left()) + ); + this.spriteBar.setHeight( + Math.round(this.logo.height() * 2.6) + ); + this.spriteBar.fixLayout(); + + // spriteEditor + if (this.spriteEditor.isVisible) { + this.spriteEditor.setLeft(this.spriteBar.left()); + this.spriteEditor.setTop( + cnf.noSprites || cnf.noSpriteEdits ? + (cnf.hideControls ? this.top() + border + : this.controlBar.bottom() + padding) + : this.spriteBar.bottom() + padding + ); + this.spriteEditor.setWidth( + cnf.noSprites ? + this.right() - this.spriteEditor.left() - border + : this.spriteBar.width() + ); + this.spriteEditor.setHeight( + this.bottom() - this.spriteEditor.top() - border + ); + } + + // corralBar + this.corralBar.setLeft(this.stage.left()); + this.corralBar.setTop(this.stage.bottom() + padding); + this.corralBar.setWidth(this.stage.width()); + + // corral + if (!contains(['selectSprite', 'tabEditor'], situation)) { + this.corral.setPosition(this.corralBar.bottomLeft()); + this.corral.setWidth(this.stage.width()); + this.corral.setHeight(this.bottom() - this.corral.top() - border); + this.corral.fixLayout(); + } + } +}; + +// IDE_Morph project properties + +IDE_Morph.prototype.getProjectName = function () { + return this.scenes.at(1).name; +}; + +IDE_Morph.prototype.setProjectName = function (string) { + var projectScene = this.scenes.at(1), + name = this.newSceneName(string, projectScene); + if (name !== projectScene.name) { + projectScene.name = name; + projectScene.stage.version = Date.now(); + this.recordUnsavedChanges(); + if (projectScene === this.scene) { + this.controlBar.updateLabel(); + } + } + return name; +}; + +IDE_Morph.prototype.getProjectNotes = function () { + return this.scenes.at(1).notes; +}; + +IDE_Morph.prototype.setProjectNotes = function (string) { + var projectScene = this.scenes.at(1); + if (string !== projectScene.notes) { + projectScene.notes = string; + projectScene.stage.version = Date.now(); + this.recordUnsavedChanges(); + if (projectScene === this.scene) { + this.controlBar.updateLabel(); + } + } +}; + +// IDE_Morph resizing + +IDE_Morph.prototype.setExtent = function (point) { + var cnf = this.config, + padding = new Point(430, 110), + minExt, + ext, + maxWidth, + minWidth, + maxHeight, + minRatio, + maxRatio; + + // determine the minimum dimensions making sense for the current mode + if (this.isAppMode) { + minExt = new Point(100, 100); + if (!this.isEmbedMode) { + minExt = minExt.add(this.controlBar.height() + 10); + } + } else if (cnf.noSprites) { + minExt = new Point(100, 100); + } else { + if (this.stageRatio > 1) { + minExt = padding.add(this.stage.dimensions); + } else { + minExt = padding.add( + this.stage.dimensions.multiplyBy(this.stageRatio) + ); + } + } + ext = point.max(minExt); + + if (!this.isAppMode) { + // in edit mode adjust stage ratio if necessary + // (in presentation mode this is already handled separately) + if (!cnf.noSprites) { + maxWidth = ext.x - + (200 + this.spriteBar.tabBar.width() + (this.padding * 2)); + minWidth = SpriteIconMorph.prototype.thumbSize.x * 3; + maxHeight = (ext.y - SpriteIconMorph.prototype.thumbSize.y * 3.5); + minRatio = minWidth / this.stage.dimensions.x; + maxRatio = Math.min( + (maxWidth / this.stage.dimensions.x), + (maxHeight / this.stage.dimensions.y) + ); + this.stageRatio = Math.min( + maxRatio, + Math.max(minRatio,this.stageRatio) + ); + } + } + + // apply + IDE_Morph.uber.setExtent.call(this, ext); + this.fixLayout(); +}; + +// IDE_Morph rendering + +IDE_Morph.prototype.render = function (ctx) { + var frame; + IDE_Morph.uber.render.call(this, ctx); + if (this.isAppMode && this.stage) { + // draw a subtle outline rectangle around the stage + // in presentation mode + frame = this.stage.bounds.translateBy( + this.position().neg() + ).expandBy(2); + ctx.strokeStyle = (MorphicPreferences.isFlat ? this.backgroundColor + : this.groupColor).toString(); + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.moveTo(frame.origin.x, frame.origin.y); + ctx.lineTo(frame.corner.x, frame.origin.y); + ctx.lineTo(frame.corner.x, frame.corner.y); + ctx.lineTo(frame.origin.x, frame.corner.y); + ctx.closePath(); + ctx.stroke(); + } +}; + +// IDE_Morph events + +IDE_Morph.prototype.reactToWorldResize = function (rect) { + if (this.isAutoFill) { + this.setPosition(rect.origin); + this.setExtent(rect.extent()); + } + if (this.filePicker) { + document.body.removeChild(this.filePicker); + this.filePicker = null; + this.isImportingLocalFile = false; + } +}; + +IDE_Morph.prototype.beginBulkDrop = function () { + this.bulkDropInProgress = true; + this.cachedSceneFlag = this.isAddingScenes; + this.isAddingScenes = true; +}; + +IDE_Morph.prototype.endBulkDrop = function () { + this.isAddingScenes = this.cachedSceneFlag; + this.bulkDropInProgress = false; +}; + +IDE_Morph.prototype.droppedImage = function (aCanvas, name, embeddedData, src) { + if (this.config.noImports) {return; } + + var costume = new Costume( + aCanvas, + this.currentSprite.newCostumeName( + name ? name.split('.')[0] : '' // up to period + ) + ); + + if (costume.isTainted()) { + this.inform( + 'Unable to import this image', + 'The picture you wish to import has been\n' + + 'tainted by a restrictive cross-origin policy\n' + + 'making it unusable for costumes in Snap!. \n\n' + + 'Try downloading this picture first to your\n' + + 'computer, and import it from there.' + ); + return; + } + + // directly import embedded blocks if the image was dropped on + // a scripting area or the palette, otherwise import as costume + // (with embedded data) + if (!this.isImportingLocalFile && + isString(embeddedData) && + ['scripts', 'palette', 'categories'].includes(src) && + embeddedData[0] === '<' && + ['blocks', 'block', 'script', 'sprite'].some(tag => + embeddedData.slice(1).startsWith(tag)) + ) { + this.isImportingLocalFile = false; + return this.droppedText(embeddedData, name, ''); + } + + this.isImportingLocalFile = false; + costume.embeddedData = embeddedData || null; + this.currentSprite.addCostume(costume); + this.currentSprite.wearCostume(costume); + this.spriteBar.tabBar.tabTo('costumes'); + this.spriteEditor.updateList(); + this.hasChangedMedia = true; + this.currentSprite.recordUserEdit( + 'costume', + 'imported', + costume.name + ); +}; + +IDE_Morph.prototype.droppedSVG = function (anImage, name) { + if (this.config.noImports) {return; } + + var myself, + viewBox, + w = 300, h = 150, // setting HTMLImageElement default values + scale = 1, + svgNormalized, + headerLenght = anImage.src.search('base64') + 7, + // usually 26 from "data:image/svg+xml;base64," + svgStrEncoded = anImage.src.substring(headerLenght), + svgObj = new DOMParser().parseFromString( + atob(svgStrEncoded), "image/svg+xml" + ).firstElementChild, + normalizing = false; + + name = name.split('.')[0]; + + // checking for svg 'width' and 'height' attributes + if (svgObj.attributes.getNamedItem("width") && + svgObj.attributes.getNamedItem("height")) { + w = parseFloat(svgObj.attributes.getNamedItem("width").value); + h = parseFloat(svgObj.attributes.getNamedItem("height").value); + } else { + normalizing = true; + } + + // checking for svg 'viewBox' attribute + if (svgObj.attributes.getNamedItem("viewBox")) { + viewBox = svgObj.attributes.getNamedItem('viewBox').value; + viewBox = viewBox.split(/[ ,]/).filter(item => item); + if (viewBox.length == 4) { + if (normalizing) { + w = parseFloat(viewBox[2]); + h = parseFloat(viewBox[3]); + } + } + } else { + svgObj.setAttribute('viewBox', '0 0 ' + w + ' ' + h); + normalizing = true; + } + + // checking if the costume is bigger than the stage and, if so, fit it + if (this.stage.dimensions.x < w || this.stage.dimensions.y < h) { + scale = Math.min( + (this.stage.dimensions.x / w), + (this.stage.dimensions.y / h) + ); + normalizing = true; + w = w * scale; + h = h * scale; + } + + // loading image, normalized if it needed + // all the images are: + // sized, with 'width' and 'height' attributes + // fitted to stage dimensions + // and with their 'viewBox' attribute + if (normalizing) { + svgNormalized = new Image(w, h); + svgObj.setAttribute('width', w); + svgObj.setAttribute('height', h); + svgNormalized.src = 'data:image/svg+xml;base64,' + + btoa(new XMLSerializer().serializeToString(svgObj)); + myself = this; + svgNormalized.onload = () => myself.loadSVG(svgNormalized, name); + } else { + this.loadSVG(anImage, name); + } +}; + +IDE_Morph.prototype.loadSVG = function (anImage, name) { + var costume = new SVG_Costume(anImage, name); + + this.currentSprite.addCostume(costume); + this.currentSprite.wearCostume(costume); + this.spriteBar.tabBar.tabTo('costumes'); + this.spriteEditor.updateList(); + this.hasChangedMedia = true; +}; + +IDE_Morph.prototype.droppedAudio = function (anAudio, name) { + if (this.config.noImports) {return; } + + if (anAudio.src.indexOf('data:audio') !== 0) { + // fetch and base 64 encode samples using FileReader + this.getURL( + anAudio.src, + blob => { + var reader = new window.FileReader(); + reader.readAsDataURL(blob); + reader.onloadend = () => { + var base64 = reader.result; + base64 = 'data:audio/ogg;base64,' + + base64.split(',')[1]; + anAudio.src = base64; + this.droppedAudio(anAudio, name); + }; + }, + 'blob' + ); + } else { + this.currentSprite.addSound(anAudio, name.split('.')[0]); // up to '.' + this.spriteBar.tabBar.tabTo('sounds'); + this.hasChangedMedia = true; + this.currentSprite.recordUserEdit( + 'sound', + 'imported', + name + ); + } +}; + +IDE_Morph.prototype.droppedText = function (aString, name, fileType) { + if (this.config.noImports) {return; } + + var lbl = name ? name.split('.')[0] : '', + ext = name ? name.slice(name.lastIndexOf('.') + 1).toLowerCase() : '', + setting = this.isAddingScenes; + + // handle the special situation of adding a scene to the current project + if (this.isAddingNextScene) { + this.isAddingScenes = true; + if (aString.indexOf(' { + location.hash = ''; + this.openProjectString(aString); + } + ); + return; + } + if (aString.indexOf(''; + } + if (aString.indexOf('Snap! + var ypr = document.getElementById('ypr'), + myself = this, + suffix = name.substring(name.length - 3); + + if (suffix.toLowerCase() !== 'ypr') {return; } + + function loadYPR(buffer, lbl) { + var reader = new sb.Reader(), + pname = lbl.split('.')[0]; // up to period + reader.onload = function (info) { + myself.droppedText(new sb.XMLWriter().write(pname, info)); + }; + reader.readYPR(new Uint8Array(buffer)); + } + + if (!ypr) { + ypr = document.createElement('script'); + ypr.id = 'ypr'; + ypr.onload = function () {loadYPR(anArrayBuffer, name); }; + document.head.appendChild(ypr); + ypr.src = this.resourceURL('src', 'ypr.js'); + } else { + loadYPR(anArrayBuffer, name); + } +}; + +// IDE_Morph button actions + +IDE_Morph.prototype.refreshPalette = function (shouldIgnorePosition) { + var oldTop = this.palette.contents.top(); + + this.createPalette(); + if (this.isAppMode) { + this.palette.hide(); + return; + } + this.fixLayout('refreshPalette'); + if (!shouldIgnorePosition) { + this.palette.contents.setTop(oldTop); + } + this.palette.adjustScrollBars(); +}; + +IDE_Morph.prototype.scrollPaletteToCategory = function (category) { + var palette = this.palette, + msecs = this.isAnimating ? 200 : 0, + firstInCategory, + delta; + + if (palette.isForSearching) { + this.refreshPalette(); + palette = this.palette; + } + firstInCategory = palette.contents.children.find( + block => block.category === category + ); + if (firstInCategory === undefined) {return; } + delta = palette.top() - firstInCategory.top() + palette.padding; + if (delta === 0) {return; } + this.world().animations.push(new Animation( + y => { // setter + palette.contents.setTop(y); + palette.contents.keepInScrollFrame(); + palette.adjustScrollBars(); + }, + () => palette.contents.top(), // getter + delta, // delta + msecs, // duration in ms + t => Math.pow(t, 6), // easing + null // onComplete + )); +}; + +IDE_Morph.prototype.topVisibleCategoryInPalette = function () { + // private - answer the topmost (partially) visible + // block category in the palette, so it can be indicated + // as "current category" in the category selection buttons + var top; + if (!this.palette) {return; } + top = this.palette.contents.children.find(morph => + morph.category && morph.bounds.intersects(this.palette.bounds) + ); + if (top) { + if (top.category === 'other') { + if (top.selector === 'doWarp') { + return 'control'; + } + if (top instanceof RingMorph) { + return 'operators'; + } + return 'variables'; + } + if (top.category === 'lists') { + return 'variables'; + } + return top.category; + } + return null; +}; + +IDE_Morph.prototype.pressStart = function () { + if (this.world().currentKey === 16) { // shiftClicked + this.toggleFastTracking(); + } else { + this.stage.threads.pauseCustomHatBlocks = false; + this.controlBar.stopButton.refresh(); + this.runScripts(); + } +}; + +IDE_Morph.prototype.toggleFastTracking = function () { + if (this.stage.isFastTracked) { + this.stopFastTracking(); + } else { + this.startFastTracking(); + } +}; + +IDE_Morph.prototype.toggleSingleStepping = function () { + this.stage.threads.toggleSingleStepping(); + this.controlBar.steppingButton.refresh(); + this.controlBar.refreshSlider(); +}; + +IDE_Morph.prototype.toggleCameraSupport = function () { + CamSnapshotDialogMorph.prototype.enableCamera = + !CamSnapshotDialogMorph.prototype.enableCamera; + this.spriteBar.tabBar.tabTo(this.currentTab); + this.createCorralBar(); + this.fixLayout(); +}; + +IDE_Morph.prototype.startFastTracking = function () { + this.stage.isFastTracked = true; + this.controlBar.startButton.labelString = new SymbolMorph('flash', 14); + this.controlBar.startButton.createLabel(); + this.controlBar.startButton.fixLayout(); + this.controlBar.startButton.rerender(); +}; + +IDE_Morph.prototype.stopFastTracking = function () { + this.stage.isFastTracked = false; + this.controlBar.startButton.labelString = new SymbolMorph('flag', 14); + this.controlBar.startButton.createLabel(); + this.controlBar.startButton.fixLayout(); + this.controlBar.startButton.rerender(); +}; + +IDE_Morph.prototype.runScripts = function () { + if (this.stage.threads.pauseCustomHatBlocks) { + this.stage.threads.pauseCustomHatBlocks = false; + this.controlBar.stopButton.refresh(); + } + this.stage.fireGreenFlagEvent(); +}; + +IDE_Morph.prototype.togglePauseResume = function () { + if (this.stage.threads.isPaused()) { + this.stage.threads.resumeAll(this.stage); + } else { + this.stage.threads.pauseAll(this.stage); + } + this.controlBar.pauseButton.refresh(); +}; + +IDE_Morph.prototype.isPaused = function () { + if (!this.stage) {return false; } + return this.stage.threads.isPaused(); +}; + +IDE_Morph.prototype.stopAllScripts = function () { + if (this.world().currentKey === 16) { // shiftClicked + this.scenes.map(scn => scn.stop(true)); + } else { + this.scene.stop(); + } + this.controlBar.stopButton.refresh(); +}; + +IDE_Morph.prototype.selectSprite = function (sprite, noEmptyRefresh) { + // prevent switching to another sprite if a block editor or a block + // visibility dialog box is open + // so local blocks of different sprites don't mix + if ( + detect( + this.world().children, + morph => morph instanceof BlockEditorMorph || + morph instanceof BlockDialogMorph || + morph instanceof BlockVisibilityDialogMorph + ) + ) { + return; + } + if (this.currentSprite && this.currentSprite.scripts.focus) { + this.currentSprite.scripts.focus.stopEditing(); + } + this.currentSprite = sprite; + this.scene.currentSprite = sprite; + if (!noEmptyRefresh) { + this.categories.refreshEmpty(); + } + this.createPalette(); + this.createSpriteBar(); + this.createSpriteEditor(); + this.corral.refresh(); + this.fixLayout('selectSprite'); + this.currentSprite.scripts.fixMultiArgs(); +}; + +// IDE_Morph retina display support + +IDE_Morph.prototype.toggleRetina = function () { + if (isRetinaEnabled()) { + disableRetinaSupport(); + } else { + enableRetinaSupport(); + } + this.world().fillPage(); + if (!MorphicPreferences.isFlat) { + IDE_Morph.prototype.scriptsPaneTexture = this.scriptsTexture(); + } + this.stage.clearPenTrails(); + this.refreshIDE(); +}; + +// IDE_Morph skins + +IDE_Morph.prototype.defaultDesign = function () { + this.setDefaultDesign(); + this.refreshIDE(); + this.removeSetting('design'); +}; + +IDE_Morph.prototype.flatDesign = function () { + this.setFlatDesign(); + this.refreshIDE(); + this.saveSetting('design', 'flat'); +}; + +IDE_Morph.prototype.refreshIDE = function () { + var projectData; + + this.scene.captureGlobalSettings(); + if (Process.prototype.isCatchingErrors) { + try { + projectData = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + } catch (err) { + this.showMessage('Serialization failed: ' + err); + } + } else { + projectData = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + } + SpriteMorph.prototype.initBlocks(); + this.buildPanes(); + this.fixLayout(); + if (this.loadNewProject) { + this.newProject(); + } else { + this.openProjectString(projectData); + } +}; + +// IDE_Morph settings persistance + +IDE_Morph.prototype.applySavedSettings = function () { + if (this.config.noUserSettings) {return; } + + var design = this.getSetting('design'), + zoom = this.getSetting('zoom'), + fade = this.getSetting('fade'), + language = this.getSetting('language'), + click = this.getSetting('click'), + longform = this.getSetting('longform'), + plainprototype = this.getSetting('plainprototype'), + keyboard = this.getSetting('keyboard'), + tables = this.getSetting('tables'), + tableLines = this.getSetting('tableLines'), + autoWrapping = this.getSetting('autowrapping'), + solidshadow = this.getSetting('solidshadow'); + + // design + if (design === 'flat') { + this.setFlatDesign(); + } else { + this.setDefaultDesign(); + } + + // blocks zoom + if (zoom) { + SyntaxElementMorph.prototype.setScale(Math.min(zoom, 12)); + CommentMorph.prototype.refreshScale(); + SpriteMorph.prototype.initBlocks(); + } + + // blocks fade + if (!isNil(fade)) { + this.setBlockTransparency(+fade); + } + + // language + if (language && language !== 'en') { + this.userLanguage = language; + } else { + this.userLanguage = null; + } + + // click + if (click && !BlockMorph.prototype.snapSound) { + BlockMorph.prototype.toggleSnapSound(); + } + + // long form + if (longform) { + InputSlotDialogMorph.prototype.isLaunchingExpanded = true; + } + + // keyboard editing + if (keyboard === 'false') { + ScriptsMorph.prototype.enableKeyboard = false; + } else { + ScriptsMorph.prototype.enableKeyboard = true; + } + + // tables + if (tables === 'false') { + List.prototype.enableTables = false; + } else { + List.prototype.enableTables = true; + } + + // tableLines + if (tableLines) { + TableMorph.prototype.highContrast = true; + } else { + TableMorph.prototype.highContrast = false; + } + + // nested auto-wrapping + if (autoWrapping === 'false') { + ScriptsMorph.prototype.enableNestedAutoWrapping = false; + } else { + ScriptsMorph.prototype.enableNestedAutoWrapping = true; + } + + // plain prototype labels + if (plainprototype) { + BlockLabelPlaceHolderMorph.prototype.plainLabel = true; + } + + // solid shadow + if (solidshadow) { + window.useBlurredShadows = false; + this.rerender(); + } +}; + +IDE_Morph.prototype.saveSetting = function (key, value) { + if (!this.savingPreferences || this.config.noUserSettings) { + return; + } + if (this.hasLocalStorage()) { + localStorage['-snap-setting-' + key] = value; + } +}; + +IDE_Morph.prototype.getSetting = function (key) { + if (this.hasLocalStorage()) { + return localStorage['-snap-setting-' + key]; + } + return null; +}; + +IDE_Morph.prototype.removeSetting = function (key) { + if (this.hasLocalStorage()) { + delete localStorage['-snap-setting-' + key]; + } +}; + +IDE_Morph.prototype.hasLocalStorage = function () { + // checks whether localStorage is available, + // this kludgy try/catch mechanism is needed + // because Safari 11 is paranoid about accessing + // localstorage from the file:// protocol + try { + return !isNil(localStorage); + } catch (err) { + return false; + } +}; + +// IDE_Morph recording unsaved changes + +IDE_Morph.prototype.hasUnsavedEdits = function () { + return this.scenes.itemsArray().some(any => any.hasUnsavedEdits); +}; + +IDE_Morph.prototype.recordUnsavedChanges = function (spriteName, details) { + this.scene.hasUnsavedEdits = true; + this.updateChanges(spriteName, details); +}; + +IDE_Morph.prototype.recordSavedChanges = function () { + this.scenes.itemsArray().forEach(scene => scene.hasUnsavedEdits = false); + this.updateChanges(this.currentSprite.name, ['project', 'save']); +}; + +IDE_Morph.prototype.updateChanges = function (spriteName, details) { + // private + // invalidate saved backup, if any - but don't actually delete it yet + if (this.hasLocalStorage() && + (localStorage['-snap-bakuser-'] == this.cloud.username)) { + localStorage['-snap-bakflag-'] = 'expired'; + } + + // update the version timestamp so my observer can react + this.version = Date.now(); + + // indicate unsaved changes in the project title display + this.controlBar.updateLabel(); + + // trigger an event + this.stage.fireUserEditEvent( + spriteName || this.currentSprite.name, + details || [], + this.version + ); +}; + +// IDE_Morph project backup + +IDE_Morph.prototype.backup = function (callback) { + // in case of unsaved changes let the user confirm whether to + // abort the operation or go ahead with it. + // Save the current project for the currently logged in user + // to localstorage, then perform the given callback, e.g. + // load a new project. + if (this.hasUnsavedEdits()) { + this.confirm( + 'Replace the current project with a new one?', + 'Unsaved Changes!', + () => this.backupAndDo(callback) + ); + } else { + callback(); + } +}; + +IDE_Morph.prototype.backupAndDo = function (callback) { + // private + var username = this.cloud.username; + this.scene.captureGlobalSettings(); + try { + localStorage['-snap-backup-'] = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + delete localStorage['-snap-bakflag-']; + if (username) { + localStorage['-snap-bakuser-'] = username; + } else { + delete localStorage['-snap-bakuser-']; + } + callback(); + } catch (err) { + nop(err); + this.confirm( + 'Backup failed. This cannot be undone, proceed anyway?', + 'Unsaved Changes!', + callback + ); + } +}; + +IDE_Morph.prototype.clearBackup = function () { + delete localStorage['-snap-bakflag-']; + delete localStorage['-snap-bakuser-']; + delete localStorage['-snap-backup-']; +}; + +IDE_Morph.prototype.availableBackup = function (anyway) { + // return the name of the project that can be restored in double + // quotes for the currently logged in user. + // Otherwise return null + var username = this.cloud.username, + bak, ix; + if (this.hasLocalStorage()) { + if ( + localStorage['-snap-bakuser-'] == username && // null == undefined + (!localStorage['-snap-bakflag-'] || anyway) + ) { + bak = localStorage['-snap-backup-']; + if (bak) { + ix = bak.indexOf('"', 15); + if (ix > 15) { + return bak.slice(15, ix); + } + } + } + } + return null; +}; + +IDE_Morph.prototype.restore = function () { + // load the backed up project for the currently logged im user + // and backup the current one, in case they want to switch back to it + var username = this.cloud.username, + bak; + if (this.hasLocalStorage()) { + if (localStorage['-snap-bakuser-'] == username) { // null == undefined + bak = localStorage['-snap-backup-']; + if (bak) { + this.backup(() => { + this.openProjectString( + bak, + () => this.recordUnsavedChanges() + ); + }); + } + } + } +}; + +// IDE_Morph sprite list access + +IDE_Morph.prototype.addNewSprite = function () { + var sprite = new SpriteMorph(this.globalVariables), + rnd = Process.prototype.reportBasicRandom; + + sprite.name = this.newSpriteName(sprite.name); + sprite.setCenter(this.stage.center()); + this.stage.add(sprite); + sprite.fixLayout(); + sprite.rerender(); + + // randomize sprite properties + sprite.setColorDimension(0, rnd.call(this, 0, 100)); + sprite.setColorDimension(1, 100); + sprite.setColorDimension(2, rnd.call(this, 25, 75)); + + sprite.setXPosition(rnd.call(this, -220, 220)); + sprite.setYPosition(rnd.call(this, -160, 160)); + + if (this.world().currentKey === 16) { // shift-click + sprite.turn(rnd.call(this, 1, 360)); + } + + this.sprites.add(sprite); + this.corral.addSprite(sprite); + this.selectSprite(sprite); +}; + +IDE_Morph.prototype.paintNewSprite = function () { + var sprite = new SpriteMorph(this.globalVariables), + cos = new Costume(); + + sprite.name = this.newSpriteName(sprite.name); + sprite.setCenter(this.stage.center()); + this.stage.add(sprite); + this.sprites.add(sprite); + this.corral.addSprite(sprite); + this.selectSprite(sprite); + cos.edit( + this.world(), + this, + true, + () => this.removeSprite(sprite), + () => { + sprite.addCostume(cos); + sprite.wearCostume(cos); + } + ); +}; + +IDE_Morph.prototype.newCamSprite = function () { + var sprite = new SpriteMorph(this.globalVariables), + camDialog; + + sprite.name = this.newSpriteName(sprite.name); + sprite.setCenter(this.stage.center()); + this.stage.add(sprite); + this.sprites.add(sprite); + this.corral.addSprite(sprite); + this.selectSprite(sprite); + + camDialog = new CamSnapshotDialogMorph( + this, + sprite, + () => this.removeSprite(sprite), + function (costume) { // needs to be "function" so it can access "this" + sprite.addCostume(costume); + sprite.wearCostume(costume); + this.close(); + }); + + camDialog.popUp(this.world()); +}; + +IDE_Morph.prototype.recordNewSound = function () { + var soundRecorder; + + soundRecorder = new SoundRecorderDialogMorph( + audio => { + var sound; + if (audio) { + sound = this.currentSprite.addSound( + audio, + this.newSoundName('recording') + ); + this.makeSureRecordingIsMono(sound); + this.spriteBar.tabBar.tabTo('sounds'); + this.hasChangedMedia = true; + } + }); + + soundRecorder.key = 'microphone'; + soundRecorder.popUp(this.world()); +}; + +IDE_Morph.prototype.makeSureRecordingIsMono = function (sound) { + // private and temporary, a horrible kludge to work around browsers' + // reluctance to implement audio recording constraints that let us + // record sound in mono only. As of January 2020 the audio channelCount + // constraint only works in Firefox, hence this terrible function to + // force convert a stereo sound to mono for Chrome. + // If this code is still here next year, something is very wrong. + // -Jens + + decodeSound(sound, makeMono); + + function decodeSound(sound, callback) { + var base64, binaryString, len, bytes, i, arrayBuffer, audioCtx; + if (sound.audioBuffer) { + return callback (sound); + } + base64 = sound.audio.src.split(',')[1]; + binaryString = window.atob(base64); + len = binaryString.length; + bytes = new Uint8Array(len); + for (i = 0; i < len; i += 1) { + bytes[i] = binaryString.charCodeAt(i); + } + arrayBuffer = bytes.buffer; + audioCtx = Note.prototype.getAudioContext(); + sound.isDecoding = true; + audioCtx.decodeAudioData( + arrayBuffer, + buffer => { + sound.audioBuffer = buffer; + return callback (sound); + }, + err => {throw err; } + ); + } + + function makeMono(sound) { + var samples, audio, blob, reader; + if (sound.audioBuffer.numberOfChannels === 1) {return; } + samples = sound.audioBuffer.getChannelData(0); + + audio = new Audio(); + blob = new Blob( + [ + audioBufferToWav( + encodeSound(samples, 44100).audioBuffer + ) + ], + {type: "audio/wav"} + ); + reader = new FileReader(); + reader.onload = () => { + audio.src = reader.result; + sound.audio = audio; // .... aaaand we're done! + sound.audioBuffer = null; + sound.cachedSamples = null; + sound.isDecoding = false; + // console.log('made mono', sound); + }; + reader.readAsDataURL(blob); + } + + function encodeSound(samples, rate) { + var ctx = Note.prototype.getAudioContext(), + frameCount = samples.length, + arrayBuffer = ctx.createBuffer(1, frameCount, +rate || 44100), + i, + source; + + if (!arrayBuffer.copyToChannel) { + arrayBuffer.copyToChannel = function (src, channel) { + var buffer = this.getChannelData(channel); + for (i = 0; i < src.length; i += 1) { + buffer[i] = src[i]; + } + }; + } + arrayBuffer.copyToChannel( + Float32Array.from(samples), + 0, + 0 + ); + source = ctx.createBufferSource(); + source.buffer = arrayBuffer; + source.audioBuffer = source.buffer; + return source; + } + + function audioBufferToWav(buffer, opt) { + var sampleRate = buffer.sampleRate, + format = (opt || {}).float32 ? 3 : 1, + bitDepth = format === 3 ? 32 : 16, + result; + + result = buffer.getChannelData(0); + return encodeWAV(result, format, sampleRate, 1, bitDepth); + } + + function encodeWAV( + samples, + format, + sampleRate, + numChannels, + bitDepth + ) { + var bytesPerSample = bitDepth / 8, + blockAlign = numChannels * bytesPerSample, + buffer = new ArrayBuffer(44 + samples.length * bytesPerSample), + view = new DataView(buffer); + + function writeFloat32(output, offset, input) { + for (var i = 0; i < input.length; i += 1, offset += 4) { + output.setFloat32(offset, input[i], true); + } + } + + function floatTo16BitPCM(output, offset, input) { + var i, s; + for (i = 0; i < input.length; i += 1, offset += 2) { + s = Math.max(-1, Math.min(1, input[i])); + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); + } + } + + function writeString(view, offset, string) { + for (var i = 0; i < string.length; i += 1) { + view.setUint8(offset + i, string.charCodeAt(i)); + } + } + + writeString(view, 0, 'RIFF'); // RIFF identifier + // RIFF chunk length: + view.setUint32(4, 36 + samples.length * bytesPerSample, true); + writeString(view, 8, 'WAVE'); // RIFF type + writeString(view, 12, 'fmt '); // format chunk identifier + view.setUint32(16, 16, true); // format chunk length + view.setUint16(20, format, true); // sample format (raw) + view.setUint16(22, numChannels, true); // channel count + view.setUint32(24, sampleRate, true); // sample rate + // byte rate (sample rate * block align): + view.setUint32(28, sampleRate * blockAlign, true); + // block align (channel count * bytes per sample): + view.setUint16(32, blockAlign, true); + view.setUint16(34, bitDepth, true); // bits per sample + writeString(view, 36, 'data'); // data chunk identifier + // data chunk length: + view.setUint32(40, samples.length * bytesPerSample, true); + if (format === 1) { // Raw PCM + floatTo16BitPCM(view, 44, samples); + } else { + writeFloat32(view, 44, samples); + } + return buffer; + } +}; + +IDE_Morph.prototype.duplicateSprite = function (sprite) { + var duplicate = sprite.fullCopy(); + duplicate.isDown = false; + duplicate.setPosition(this.world().hand.position()); + duplicate.appearIn(this); + duplicate.keepWithin(this.stage); + duplicate.isDown = sprite.isDown; + this.selectSprite(duplicate); + duplicate.recordUserEdit( + 'corral', + 'duplicate', + sprite.name + ); +}; + +IDE_Morph.prototype.instantiateSprite = function (sprite) { + var instance = sprite.fullCopy(true), + hats = instance.allHatBlocksFor('__clone__init__'); + instance.isDown = false; + instance.appearIn(this); + if (hats.length) { + instance.initClone(hats); + } else { + instance.setPosition(this.world().hand.position()); + instance.keepWithin(this.stage); + } + instance.isDown = sprite.isDown; + this.selectSprite(instance); + instance.recordUserEdit( + 'corral', + 'clone', + sprite.name + ); +}; + +IDE_Morph.prototype.removeSprite = function (sprite, enableUndelete = true) { + var idx; + sprite.parts.slice().forEach(part => + this.removeSprite(part) + ); + idx = this.sprites.asArray().indexOf(sprite) + 1; + this.stage.threads.stopAllForReceiver(sprite); + sprite.recordUserEdit( + 'corral', + 'delete', + sprite.name + ); + sprite.corpsify(); + sprite.destroy(); + this.stage.watchers().forEach(watcher => { + if (watcher.object() === sprite) { + watcher.destroy(); + } + }); + if (idx > 0) { + this.sprites.remove(idx); + } + this.createCorral(true); // keep scenes + this.fixLayout(); + this.currentSprite = detect( + this.stage.children, + morph => morph instanceof SpriteMorph && !morph.isTemporary + ) || this.stage; + + this.selectSprite(this.currentSprite); + + // remember the deleted sprite so it can be recovered again later + if (enableUndelete) { + this.scene.trash.push(sprite); + } +}; + +IDE_Morph.prototype.newSoundName = function (name) { + var lastSound = this.currentSprite.sounds.at( + this.currentSprite.sounds.length() + ); + + return this.newName( + name || lastSound.name, + this.currentSprite.sounds.asArray().map(eachSound => + eachSound.name + ) + ); +}; + +IDE_Morph.prototype.newSpriteName = function (name, ignoredSprite) { + var all = this.sprites.asArray().concat(this.stage).filter(each => + each !== ignoredSprite + ).map(each => each.name); + return this.newName(name, all); +}; + +IDE_Morph.prototype.newSceneName = function (name, ignoredScene) { + var sName = name.replace(/['"]/g, ''), // filter out quotation marks + all = this.scenes.asArray().filter(each => + each !== ignoredScene + ).map(each => each.name); + return this.newName(sName, all); +}; + +IDE_Morph.prototype.newName = function (name, elements) { + var count = 1, + newName = name, + exist = e => snapEquals(e, newName); + + while (elements.some(exist)) { + count += 1; + newName = name + '(' + count + ')'; + } + return newName; +}; + +// IDE_Morph identifying sprites by name + +IDE_Morph.prototype.spriteNamed = function (name) { + // answer the SnapObject (sprite or stage) indicated by its name + // or the currently edited object if no name is given or none is found + var match; + if (name === this.stage.name) { + return this.stage; + } + match = detect( + this.sprites, + sprite => sprite.name === name + ); + if (!match) { + // check if the sprite in question is currently being + // dragged around + match = detect( + this.world().hand.children, + morph => morph instanceof SpriteMorph && morph.name === name + ); + } + return match || this.currentSprite; +}; + +// IDE_Morph deleting scripts + +IDE_Morph.prototype.removeBlock = function (aBlock, justThis) { + this.stage.threads.stopAllForBlock(aBlock); + aBlock.destroy(justThis); +}; + +// IDE_Morph menus + +IDE_Morph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + // menu.addItem('help', 'nop'); + return menu; +}; + +IDE_Morph.prototype.snapMenu = function () { + var menu, + world = this.world(); + + menu = new MenuMorph(this); + menu.addItem('About...', 'aboutSnap'); + menu.addLine(); + menu.addItem( + 'Reference manual', + () => { + var url = this.resourceURL('help', 'SnapManual.pdf'); + window.open(url, 'SnapReferenceManual'); + } + ); + menu.addItem( + 'Snap! website', + () => window.open('https://snap.berkeley.edu/', 'SnapWebsite') + ); + menu.addItem( + 'Download source', + () => window.open( + 'https://github.com/jmoenig/Snap/releases/latest', + 'SnapSource' + ) + ); + if (world.isDevMode) { + menu.addLine(); + menu.addItem( + 'Switch back to user mode', + 'switchToUserMode', + 'disable deep-Morphic\ncontext menus' + + '\nand show user-friendly ones', + new Color(0, 100, 0) + ); + } else if (world.currentKey === 16) { // shift-click + menu.addLine(); + menu.addItem( + 'Switch to dev mode', + 'switchToDevMode', + 'enable Morphic\ncontext menus\nand inspectors,' + + '\nnot user-friendly!', + new Color(100, 0, 0) + ); + } + menu.popup(world, this.logo.bottomLeft()); +}; + +IDE_Morph.prototype.cloudMenu = function () { + var menu, + world = this.world(), + pos = this.controlBar.cloudButton.bottomLeft(), + shiftClicked = (world.currentKey === 16); + + if (location.protocol === 'file:' && !shiftClicked) { + this.showMessage('cloud unavailable without a web server.'); + return; + } + + menu = new MenuMorph(this); + if (shiftClicked) { + menu.addItem( + 'url...', + 'setCloudURL', + null, + new Color(100, 0, 0) + ); + menu.addLine(); + } + if (!this.cloud.username) { + menu.addItem( + 'Login...', + 'initializeCloud' + ); + menu.addItem( + 'Signup...', + 'createCloudAccount' + ); + menu.addItem( + 'Reset Password...', + 'resetCloudPassword' + ); + menu.addItem( + 'Resend Verification Email...', + 'resendVerification' + ); + } else { + menu.addItem( + localize('Logout') + ' ' + this.cloud.username, + 'logout' + ); + menu.addItem( + 'Change Password...', + 'changeCloudPassword' + ); + } + if (this.hasCloudProject()) { + menu.addLine(); + menu.addItem( + 'Open in Community Site', + () => { + var dict = this.urlParameters(); + window.open( + this.cloud.showProjectPath( + dict.Username, dict.ProjectName + ), + '_blank' + ); + } + ); + } + if (shiftClicked) { + menu.addLine(); + menu.addItem( + 'export project media only...', + () => { + var pn = this.getProjectName(); + if (pn) { + this.exportProjectMedia(pn); + } else { + this.prompt( + 'Export Project As...', + name => this.exportProjectMedia(name), + null, + 'exportProject' + ); + } + }, + null, + this.hasChangedMedia ? new Color(100, 0, 0) : new Color(0, 100, 0) + ); + menu.addItem( + 'export project without media...', + () => { + var pn = this.getProjectName(); + if (pn) { + this.exportProjectNoMedia(pn); + } else { + this.prompt( + 'Export Project As...', + name => this.exportProjectNoMedia(name), + null, + 'exportProject' + ); + } + }, + null, + new Color(100, 0, 0) + ); + menu.addItem( + 'export project as cloud data...', + () => { + var pn = this.getProjectName(); + if (pn) { + this.exportProjectAsCloudData(pn); + } else { + this.prompt( + 'Export Project As...', + name => this.exportProjectAsCloudData(name), + null, + 'exportProject' + ); + } + }, + null, + new Color(100, 0, 0) + ); + menu.addLine(); + menu.addItem( + 'open shared project from cloud...', + () => { + this.prompt( + 'Author name…', + usr => { + this.prompt( + 'Project name...', + prj => { + this.showMessage( + 'Fetching project\nfrom the cloud...' + ); + this.cloud.getPublicProject( + prj, + usr.toLowerCase(), + projectData => { + var msg; + if ( + !Process.prototype.isCatchingErrors + ) { + window.open( + 'data:text/xml,' + projectData + ); + } + this.nextSteps([ + () => { + msg = this.showMessage( + 'Opening project...' + ); + }, + () => { + this.rawOpenCloudDataString( + projectData + ); + msg.destroy(); + }, + ]); + }, + this.cloudError() + ); + }, + null, + 'project' + ); + }, + null, + 'project' + ); + }, + null, + new Color(100, 0, 0) + ); + } + menu.popup(world, pos); +}; + +IDE_Morph.prototype.settingsMenu = function () { + var menu, + stage = this.stage, + world = this.world(), + pos = this.controlBar.settingsButton.bottomLeft(), + shiftClicked = (world.currentKey === 16), + on = new SymbolMorph( + 'checkedBox', + MorphicPreferences.menuFontSize * 0.75 + ), + off = new SymbolMorph( + 'rectangle', + MorphicPreferences.menuFontSize * 0.75 + ); + + function addPreference(label, toggle, test, onHint, offHint, hide) { + if (!hide || shiftClicked) { + menu.addItem( + [ + (test? on : off), + localize(label) + ], + toggle, + test ? onHint : offHint, + hide ? new Color(100, 0, 0) : null + ); + } + } + + function addSubPreference(label, toggle, test, onHint, offHint, hide) { + if (!hide || shiftClicked) { + menu.addItem( + [ + (test? on : off), + ' ' + localize(label) + ], + toggle, + test ? onHint : offHint, + hide ? new Color(100, 0, 0) : null + ); + } + } + + menu = new MenuMorph(this); + menu.addPair( + [ + new SymbolMorph( + 'globe', + MorphicPreferences.menuFontSize + ), + localize('Language...') + ], + 'languageMenu' + ); + menu.addItem( + 'Zoom blocks...', + 'userSetBlocksScale' + ); + menu.addItem( + 'Fade blocks...', + 'userFadeBlocks' + ); + menu.addItem( + 'Stage size...', + 'userSetStageSize' + ); + if (shiftClicked) { + menu.addItem( + 'Dragging threshold...', + 'userSetDragThreshold', + 'specify the distance the hand has to move\n' + + 'before it picks up an object', + new Color(100, 0, 0) + ); + } + menu.addItem( + 'Microphone resolution...', + 'microphoneMenu' + ); + menu.addLine(); + addPreference( + 'JavaScript extensions', + () => { + /* + if (!Process.prototype.enableJS) { + this.logout(); + } + */ + Process.prototype.enableJS = !Process.prototype.enableJS; + if (Process.prototype.enableJS) { + // show JS-func primitive in case a microworld hides it + delete StageMorph.prototype.hiddenPrimitives.reportJSFunction; + } + this.flushBlocksCache('operators'); + this.refreshPalette(); + this.categories.refreshEmpty(); + }, + Process.prototype.enableJS, + 'uncheck to disable support for\nnative JavaScript functions', + 'check to support\nnative JavaScript functions' /* + + '.\n' + + 'NOTE: You will have to manually\n' + + 'sign in again to access your account.' */ + ); + addPreference( + 'Extension blocks', + () => { + SpriteMorph.prototype.showingExtensions = + !SpriteMorph.prototype.showingExtensions; + this.flushBlocksCache('variables'); + this.refreshPalette(); + this.categories.refreshEmpty(); + }, + SpriteMorph.prototype.showingExtensions, + 'uncheck to hide extension\nprimitives in the palette', + 'check to show extension\nprimitives in the palette' + ); + /* + addPreference( + 'Add scenes', + () => this.isAddingScenes = !this.isAddingScenes, + this.isAddingScenes, + 'uncheck to replace the current project,\nwith a new one', + 'check to add other projects,\nto this one', + true + ); + */ + if (isRetinaSupported()) { + addPreference( + 'Retina display support', + 'toggleRetina', + isRetinaEnabled(), + 'uncheck for lower resolution,\nsaves computing resources', + 'check for higher resolution,\nuses more computing resources', + true + ); + } + addPreference( + 'Input sliders', + 'toggleInputSliders', + MorphicPreferences.useSliderForInput, + 'uncheck to disable\ninput sliders for\nentry fields', + 'check to enable\ninput sliders for\nentry fields' + ); + if (MorphicPreferences.useSliderForInput) { + addSubPreference( + 'Execute on slider change', + 'toggleSliderExecute', + ArgMorph.prototype.executeOnSliderEdit, + 'uncheck to suppress\nrunning scripts\nwhen moving the slider', + 'check to run\nthe edited script\nwhen moving the slider' + ); + } + addPreference( + 'Turbo mode', + 'toggleFastTracking', + this.stage.isFastTracked, + 'uncheck to run scripts\nat normal speed', + 'check to prioritize\nscript execution' + ); + addPreference( + 'Visible stepping', + 'toggleSingleStepping', + Process.prototype.enableSingleStepping, + 'uncheck to turn off\nvisible stepping', + 'check to turn on\n visible stepping (slow)', + false + ); + addPreference( + 'Log pen vectors', + () => StageMorph.prototype.enablePenLogging = + !StageMorph.prototype.enablePenLogging, + StageMorph.prototype.enablePenLogging, + 'uncheck to turn off\nlogging pen vectors', + 'check to turn on\nlogging pen vectors', + false + ); + addPreference( + 'Case sensitivity', + () => Process.prototype.isCaseInsensitive = + !Process.prototype.isCaseInsensitive, + !Process.prototype.isCaseInsensitive, + 'uncheck to ignore upper- and\n lowercase when comparing texts', + 'check to distinguish upper- and\n lowercase when comparing texts', + false + ); + addPreference( + 'Ternary Boolean slots', + () => BooleanSlotMorph.prototype.isTernary = + !BooleanSlotMorph.prototype.isTernary, + BooleanSlotMorph.prototype.isTernary, + 'uncheck to limit\nBoolean slots to true / false', + 'check to allow\nempty Boolean slots', + true + ); + addPreference( + 'Camera support', + 'toggleCameraSupport', + CamSnapshotDialogMorph.prototype.enableCamera, + 'uncheck to disable\ncamera support', + 'check to enable\ncamera support', + true + ); + addPreference( + 'Dynamic sprite rendering', + () => SpriteMorph.prototype.isCachingImage = + !SpriteMorph.prototype.isCachingImage, + !SpriteMorph.prototype.isCachingImage, + 'uncheck to render\nsprites dynamically', + 'check to cache\nsprite renderings', + true + ); + menu.addLine(); // everything visible below is persistent + addPreference( + 'Blurred shadows', + 'toggleBlurredShadows', + useBlurredShadows, + 'uncheck to use solid drop\nshadows and highlights', + 'check to use blurred drop\nshadows and highlights', + true + ); + addPreference( + 'Zebra coloring', + 'toggleZebraColoring', + BlockMorph.prototype.zebraContrast, + 'uncheck to disable alternating\ncolors for nested block', + 'check to enable alternating\ncolors for nested blocks', + true + ); + addPreference( + 'Dynamic input labels', + 'toggleDynamicInputLabels', + SyntaxElementMorph.prototype.dynamicInputLabels, + 'uncheck to disable dynamic\nlabels for variadic inputs', + 'check to enable dynamic\nlabels for variadic inputs', + true + ); + addPreference( + 'Prefer empty slot drops', + 'togglePreferEmptySlotDrops', + ScriptsMorph.prototype.isPreferringEmptySlots, + 'uncheck to allow dropped\nreporters to kick out others', + 'settings menu prefer empty slots hint', + true + ); + addPreference( + 'Long form input dialog', + 'toggleLongFormInputDialog', + InputSlotDialogMorph.prototype.isLaunchingExpanded, + 'uncheck to use the input\ndialog in short form', + 'check to always show slot\ntypes in the input dialog' + ); + addPreference( + 'Plain prototype labels', + 'togglePlainPrototypeLabels', + BlockLabelPlaceHolderMorph.prototype.plainLabel, + 'uncheck to always show (+) symbols\nin block prototype labels', + 'check to hide (+) symbols\nin block prototype labels' + ); + addPreference( + 'Clicking sound', + () => { + BlockMorph.prototype.toggleSnapSound(); + if (BlockMorph.prototype.snapSound) { + this.saveSetting('click', true); + } else { + this.removeSetting('click'); + } + }, + BlockMorph.prototype.snapSound, + 'uncheck to turn\nblock clicking\nsound off', + 'check to turn\nblock clicking\nsound on' + ); + addPreference( + 'Animations', + () => this.isAnimating = !this.isAnimating, + this.isAnimating, + 'uncheck to disable\nIDE animations', + 'check to enable\nIDE animations', + true + ); + /* + addPreference( + 'Cache Inputs', + () => { + BlockMorph.prototype.isCachingInputs = + !BlockMorph.prototype.isCachingInputs; + }, + BlockMorph.prototype.isCachingInputs, + 'uncheck to stop caching\ninputs (for debugging the evaluator)', + 'check to cache inputs\nboosts recursion', + true + ); + */ + addPreference( + 'Rasterize SVGs', + () => MorphicPreferences.rasterizeSVGs = + !MorphicPreferences.rasterizeSVGs, + MorphicPreferences.rasterizeSVGs, + 'uncheck for smooth\nscaling of vector costumes', + 'check to rasterize\nSVGs on import', + true + ); + addPreference( + 'Flat design', + () => { + if (MorphicPreferences.isFlat) { + return this.defaultDesign(); + } + this.flatDesign(); + }, + MorphicPreferences.isFlat, + 'uncheck for default\nGUI design', + 'check for alternative\nGUI design', + false + ); + addPreference( + 'Nested auto-wrapping', + () => { + ScriptsMorph.prototype.enableNestedAutoWrapping = + !ScriptsMorph.prototype.enableNestedAutoWrapping; + if (ScriptsMorph.prototype.enableNestedAutoWrapping) { + this.removeSetting('autowrapping'); + } else { + this.saveSetting('autowrapping', false); + } + }, + ScriptsMorph.prototype.enableNestedAutoWrapping, + 'uncheck to confine auto-wrapping\nto top-level block stacks', + 'check to enable auto-wrapping\ninside nested block stacks', + true + ); + addPreference( + 'Sprite Nesting', + () => SpriteMorph.prototype.enableNesting = + !SpriteMorph.prototype.enableNesting, + SpriteMorph.prototype.enableNesting, + 'uncheck to disable\nsprite composition', + 'check to enable\nsprite composition', + true + ); + addPreference( + 'First-Class Sprites', + () => { + SpriteMorph.prototype.enableFirstClass = + !SpriteMorph.prototype.enableFirstClass; + this.flushBlocksCache('sensing'); + this.refreshPalette(); + this.categories.refreshEmpty(); + }, + SpriteMorph.prototype.enableFirstClass, + 'uncheck to disable support\nfor first-class sprites', + 'check to enable support\n for first-class sprite', + true + ); + addPreference( + 'Keyboard Editing', + () => { + ScriptsMorph.prototype.enableKeyboard = + !ScriptsMorph.prototype.enableKeyboard; + this.currentSprite.scripts.updateToolbar(); + if (ScriptsMorph.prototype.enableKeyboard) { + this.removeSetting('keyboard'); + } else { + this.saveSetting('keyboard', false); + } + }, + ScriptsMorph.prototype.enableKeyboard, + 'uncheck to disable\nkeyboard editing support', + 'check to enable\nkeyboard editing support', + true + ); + addPreference( + 'Table support', + () => { + List.prototype.enableTables = + !List.prototype.enableTables; + if (List.prototype.enableTables) { + this.removeSetting('tables'); + } else { + this.saveSetting('tables', false); + } + }, + List.prototype.enableTables, + 'uncheck to disable\nmulti-column list views', + 'check for multi-column\nlist view support', + true + ); + if (List.prototype.enableTables) { + addPreference( + 'Table lines', + () => { + TableMorph.prototype.highContrast = + !TableMorph.prototype.highContrast; + if (TableMorph.prototype.highContrast) { + this.saveSetting('tableLines', true); + } else { + this.removeSetting('tableLines'); + } + }, + TableMorph.prototype.highContrast, + 'uncheck for less contrast\nmulti-column list views', + 'check for higher contrast\ntable views', + true + ); + } + addPreference( + 'Live coding support', + () => Process.prototype.enableLiveCoding = + !Process.prototype.enableLiveCoding, + Process.prototype.enableLiveCoding, + 'EXPERIMENTAL! uncheck to disable live\ncustom control structures', + 'EXPERIMENTAL! check to enable\n live custom control structures', + true + ); + addPreference( + 'JIT compiler support', + () => { + Process.prototype.enableCompiling = + !Process.prototype.enableCompiling; + this.flushBlocksCache('operators'); + this.refreshPalette(); + this.categories.refreshEmpty(); + }, + Process.prototype.enableCompiling, + 'EXPERIMENTAL! uncheck to disable live\nsupport for compiling', + 'EXPERIMENTAL! check to enable\nsupport for compiling', + true + ); + menu.addLine(); // everything below this line is stored in the project + addPreference( + 'Thread safe scripts', + () => stage.isThreadSafe = !stage.isThreadSafe, + this.stage.isThreadSafe, + 'uncheck to allow\nscript reentrance', + 'check to disallow\nscript reentrance' + ); + addPreference( + 'Flat line ends', + () => SpriteMorph.prototype.useFlatLineEnds = + !SpriteMorph.prototype.useFlatLineEnds, + SpriteMorph.prototype.useFlatLineEnds, + 'uncheck for round ends of lines', + 'check for flat ends of lines' + ); + addPreference( + 'Codification support', + () => { + StageMorph.prototype.enableCodeMapping = + !StageMorph.prototype.enableCodeMapping; + this.flushBlocksCache('variables'); + this.refreshPalette(); + this.categories.refreshEmpty(); + }, + StageMorph.prototype.enableCodeMapping, + 'uncheck to disable\nblock to text mapping features', + 'check for block\nto text mapping features', + false + ); + addPreference( + 'Inheritance support', + () => { + StageMorph.prototype.enableInheritance = + !StageMorph.prototype.enableInheritance; + this.flushBlocksCache('variables'); + this.refreshPalette(); + this.categories.refreshEmpty(); + }, + StageMorph.prototype.enableInheritance, + 'uncheck to disable\nsprite inheritance features', + 'check for sprite\ninheritance features', + true + ); + addPreference( + 'Hyper blocks support', + () => Process.prototype.enableHyperOps = + !Process.prototype.enableHyperOps, + Process.prototype.enableHyperOps, + 'uncheck to disable\nusing operators on lists and tables', + 'check to enable\nusing operators on lists and tables', + true + ); + addPreference( + 'Single palette', + () => this.toggleUnifiedPalette(), + this.scene.unifiedPalette, + 'uncheck to show only the selected category\'s blocks', + 'check to show all blocks in a single palette', + false + ); + if (this.scene.unifiedPalette) { + addSubPreference( + 'Show categories', + () => this.toggleCategoryNames(), + this.scene.showCategories, + 'uncheck to hide\ncategory names\nin the palette', + 'check to show\ncategory names\nin the palette' + ); + addSubPreference( + 'Show buttons', + () => this.togglePaletteButtons(), + this.scene.showPaletteButtons, + 'uncheck to hide buttons\nin the palette', + 'check to show buttons\nin the palette' + ); + } + addPreference( + 'Wrap list indices', + () => { + List.prototype.enableWrapping = + !List.prototype.enableWrapping; + }, + List.prototype.enableWrapping, + 'uncheck to disable\nwrapping list indices', + 'check for wrapping\nlist indices', + true + ); + addPreference( + 'Persist linked sublist IDs', + () => StageMorph.prototype.enableSublistIDs = + !StageMorph.prototype.enableSublistIDs, + StageMorph.prototype.enableSublistIDs, + 'uncheck to disable\nsaving linked sublist identities', + 'check to enable\nsaving linked sublist identities', + true + ); + addPreference( + 'Enable command drops in all rings', + () => RingReporterSlotMorph.prototype.enableCommandDrops = + !RingReporterSlotMorph.prototype.enableCommandDrops, + RingReporterSlotMorph.prototype.enableCommandDrops, + 'uncheck to disable\ndropping commands in reporter rings', + 'check to enable\ndropping commands in all rings', + true + ); + + addPreference( + 'HSL pen color model', + () => { + SpriteMorph.prototype.penColorModel = + SpriteMorph.prototype.penColorModel === 'hsl' ? 'hsv' : 'hsl'; + this.refreshIDE(); + }, + SpriteMorph.prototype.penColorModel === 'hsl', + 'uncheck to switch pen colors\nand graphic effects to HSV', + 'check to switch pen colors\nand graphic effects to HSL', + false + ); + + addPreference( + 'Disable click-to-run', + () => ThreadManager.prototype.disableClickToRun = + !ThreadManager.prototype.disableClickToRun, + ThreadManager.prototype.disableClickToRun, + 'uncheck to enable\ndirectly running blocks\nby clicking on them', + 'check to disable\ndirectly running blocks\nby clicking on them', + false + ); + addPreference( + 'Disable dragging data', + () => SpriteMorph.prototype.disableDraggingData = + !SpriteMorph.prototype.disableDraggingData, + SpriteMorph.prototype.disableDraggingData, + 'uncheck to drag media\nand blocks out of\nwatchers and balloons', + 'disable dragging media\nand blocks out of\nwatchers and balloons', + false + ); + menu.popup(world, pos); +}; + +IDE_Morph.prototype.projectMenu = function () { + var menu, + world = this.world(), + pos = this.controlBar.projectButton.bottomLeft(), + graphicsName = this.currentSprite instanceof SpriteMorph ? + 'Costumes' : 'Backgrounds', + shiftClicked = (world.currentKey === 16), + backup = this.availableBackup(shiftClicked); + + menu = new MenuMorph(this); + menu.addItem('Notes...', 'editNotes'); + menu.addLine(); + menu.addPair('New', 'createNewProject', '^N'); + menu.addPair('Open...', 'openProjectsBrowser', '^O'); + menu.addPair('Save', "save", '^S'); + menu.addItem('Save As...', 'saveProjectsBrowser'); + if (backup) { + menu.addItem( + 'Restore unsaved project', + 'restore', + backup, + shiftClicked ? new Color(100, 0, 0) : null + ); + if (shiftClicked) { + menu.addItem( + 'Clear backup', + 'clearBackup', + backup, + new Color(100, 0, 0) + ); + } + } + menu.addLine(); + menu.addItem( + 'Import...', + 'importLocalFile', + 'file menu import hint' // looks up the actual text in the translator + ); + menu.addItem( + 'Export project...', + () => { + var pn = this.getProjectName(); + if (pn) { + this.exportProject(pn); + } else { + this.prompt( + 'Export Project As...', + name => this.exportProject(name), + null, + 'exportProject' + ); + } + }, + 'save project data as XML\nto your downloads folder' + ); + menu.addItem( + 'Export summary...', + () => this.exportProjectSummary(), + 'save a summary\nof this project' + ); + if (shiftClicked) { + menu.addItem( + 'Export summary with drop-shadows...', + () => this.exportProjectSummary(true), + 'download and save' + + '\nwith a summary of this project' + + '\nwith drop-shadows on all pictures.' + + '\nnot supported by all browsers', + new Color(100, 0, 0) + ); + menu.addItem( + 'Export all scripts as pic...', + () => this.exportScriptsPicture(), + 'show a picture of all scripts\nand block definitions', + new Color(100, 0, 0) + ); + } + menu.addLine(); + if (this.stage.globalBlocks.length) { + menu.addItem( + 'Export blocks...', + () => this.exportGlobalBlocks(), + 'save global custom block\ndefinitions as XML' + ); + menu.addItem( + 'Unused blocks...', + () => this.removeUnusedBlocks(), + 'find unused global custom blocks' + + '\nand remove their definitions' + ); + } + menu.addItem( + 'Hide blocks...', + () => new BlockVisibilityDialogMorph(this.currentSprite).popUp(world) + ); + menu.addItem( + 'New category...', + () => this.createNewCategory() + ); + if (SpriteMorph.prototype.customCategories.size) { + menu.addItem( + 'Remove a category...', + () => this.deleteUserCategory(pos) + ); + } + if (this.currentSprite instanceof SpriteMorph && + !this.currentSprite.solution) { + menu.addItem( + 'Generate puzzle', + 'generatePuzzle', + 'generate a Parson\'s Puzzle\n' + + 'from the current sprite' + ); + } + menu.addLine(); + if (this.scenes.length() > 1) { + menu.addItem('Scenes...', 'scenesMenu'); + } + menu.addPair('New scene', 'createNewScene'); + menu.addPair('Add scene...', 'addScene'); + menu.addLine(); + menu.addItem( + 'Libraries...', + () => { + if (location.protocol === 'file:') { + this.importLocalFile(); + return; + } + this.getURL( + this.resourceURL('libraries', 'LIBRARIES'), + txt => { + var libraries = this.parseResourceFile(txt); + new LibraryImportDialogMorph(this, libraries).popUp(); + } + ); + }, + 'Select categories of additional blocks to add to this project.' + ); + menu.addItem( + localize(graphicsName) + '...', + () => { + if (location.protocol === 'file:') { + this.importLocalFile(); + return; + } + this.importMedia(graphicsName); + }, + 'Select a costume from the media library' + ); + menu.addItem( + localize('Sounds') + '...', + () => { + if (location.protocol === 'file:') { + this.importLocalFile(); + return; + } + this.importMedia('Sounds'); + }, + 'Select a sound from the media library' + ); + + if (this.scene.trash.length) { + menu.addLine(); + menu.addItem( + 'Undelete sprites...', + () => this.undeleteSprites( + this.controlBar.projectButton.bottomLeft() + ), + 'Bring back deleted sprites' + ); + } + menu.popup(world, pos); +}; + +IDE_Morph.prototype.resourceURL = function () { + // Take in variadic inputs that represent an a nested folder structure. + // Method can be easily overridden if running in a custom location. + // Default Snap! simply returns a path (relative to snap.html) + // Note: You can specify a base path to the root directory in the + // configuration object's "path" property that's passed when creating + // an IDE instance, e.g. either a relative one: {path: '../' } + // or a full url, depending on where (your) Snap! distro ist hosted + var args = Array.prototype.slice.call(arguments, 0), + path = this.config.path ? [this.config.path] : []; + return path.concat(args).join('/'); +}; + +IDE_Morph.prototype.getMediaList = function (dirname, callback) { + // Invoke the given callback with a list of files in a directory + // based on the contents file. + // If no callback is specified, synchronously return the list of files + // Note: Synchronous fetching has been deprecated and should be switched + var url = this.resourceURL(dirname, dirname.toUpperCase()), + async = callback instanceof Function, + data; + + function alphabetically(x, y) { + return x.name.toLowerCase() < y.name.toLowerCase() ? -1 : 1; + } + + if (async) { + this.getURL( + url, + txt => { + var data = this.parseResourceFile(txt); + data.sort(alphabetically); + callback.call(this, data); + } + ); + } else { + data = this.parseResourceFile(this.getURL(url)); + data.sort(alphabetically); + return data; + } +}; + +IDE_Morph.prototype.parseResourceFile = function (text) { + // A Resource File lists all the files that could be loaded in a submenu + // Examples are libraries/LIBRARIES, Costumes/COSTUMES, etc + // The file format is tab-delimited, with unix newlines: + // file-name, Display Name, Help Text (optional) + var parts, + items = []; + + text.split('\n').map(line => + line.trim() + ).filter(line => + line.length > 0 + ).forEach(line => { + parts = line.split('\t').map(str => str.trim()); + + if (parts.length < 2) {return; } + + items.push({ + fileName: parts[0], + name: parts[1], + description: parts.length > 2 ? parts[2] : '' + }); + }); + + return items; +}; + +IDE_Morph.prototype.importLocalFile = function () { + var inp = document.createElement('input'), + addingScenes = this.isAddingScenes, + myself = this, + world = this.world(); + + if (this.filePicker) { + document.body.removeChild(this.filePicker); + this.filePicker = null; + } + inp.type = 'file'; + inp.style.color = "transparent"; + inp.style.backgroundColor = "transparent"; + inp.style.border = "none"; + inp.style.outline = "none"; + inp.style.position = "absolute"; + inp.style.top = "0px"; + inp.style.left = "0px"; + inp.style.width = "0px"; + inp.style.height = "0px"; + inp.style.display = "none"; + inp.addEventListener( + "change", + () => { + document.body.removeChild(inp); + this.filePicker = null; + if (addingScenes) { + myself.isAddingNextScene = true; + } + myself.isImportingLocalFile = true; + world.hand.processDrop(inp.files); + }, + false + ); + document.body.appendChild(inp); + this.filePicker = inp; + inp.click(); +}; + +IDE_Morph.prototype.importMedia = function (folderName) { + // open a dialog box letting the user browse available "built-in" + // costumes, backgrounds or sounds + var msg = this.showMessage('Opening ' + folderName + '...'); + this.getMediaList( + folderName, + items => { + msg.destroy(); + this.popupMediaImportDialog(folderName, items); + } + ); + +}; + +IDE_Morph.prototype.popupMediaImportDialog = function (folderName, items) { + // private - this gets called by importMedia() and creates + // the actual dialog + var dialog = new DialogBoxMorph().withKey('import' + folderName), + frame = new ScrollFrameMorph(), + selectedIcon = null, + turtle = new SymbolMorph('turtle', 60), + myself = this, + world = this.world(), + handle; + + frame.acceptsDrops = false; + frame.contents.acceptsDrops = false; + frame.color = myself.groupColor; + frame.fixLayout = nop; + dialog.labelString = folderName; + dialog.createLabel(); + dialog.addBody(frame); + dialog.addButton('ok', 'Import'); + dialog.addButton('cancel', 'Cancel'); + + dialog.ok = function () { + if (selectedIcon) { + if (selectedIcon.object instanceof Sound) { + myself.droppedAudio( + selectedIcon.object.copy().audio, + selectedIcon.labelString + ); + } else if (selectedIcon.object instanceof SVG_Costume) { + myself.droppedSVG( + selectedIcon.object.contents, + selectedIcon.labelString + ); + } else { + myself.droppedImage( + selectedIcon.object.contents, + selectedIcon.labelString + ); + } + } + }; + + dialog.fixLayout = function () { + var th = fontHeight(this.titleFontSize) + this.titlePadding * 2, + x = 0, + y = 0, + fp, fw; + this.buttons.fixLayout(); + this.body.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.body.setExtent(new Point( + this.width() - this.padding * 2, + this.height() - this.padding * 3 - th - this.buttons.height() + )); + fp = this.body.position(); + fw = this.body.width(); + frame.contents.children.forEach(function (icon) { + icon.setPosition(fp.add(new Point(x, y))); + x += icon.width(); + if (x + icon.width() > fw) { + x = 0; + y += icon.height(); + } + }); + frame.contents.adjustBounds(); + this.label.setCenter(this.center()); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + + // refresh shadow + this.removeShadow(); + this.addShadow(); + }; + + items.forEach(item => { + // Caution: creating very many thumbnails can take a long time! + var url = this.resourceURL(folderName, item.fileName), + img = new Image(), + suffix = url.slice(url.lastIndexOf('.') + 1).toLowerCase(), + isSVG = suffix === 'svg' && !MorphicPreferences.rasterizeSVGs, + isSound = contains(['wav', 'mp3'], suffix), + icon; + + if (isSound) { + icon = new SoundIconMorph(new Sound(new Audio(), item.name)); + } else { + icon = new CostumeIconMorph( + new Costume(turtle.getImage(), item.name) + ); + } + icon.isDraggable = false; + icon.userMenu = nop; + icon.action = function () { + if (selectedIcon === icon) {return; } + var prevSelected = selectedIcon; + selectedIcon = icon; + if (prevSelected) {prevSelected.refresh(); } + }; + icon.doubleClickAction = dialog.ok; + icon.query = function () { + return icon === selectedIcon; + }; + frame.addContents(icon); + if (isSound) { + icon.object.audio.onloadeddata = function () { + icon.createThumbnail(); + icon.fixLayout(); + icon.refresh(); + }; + + icon.object.audio.src = url; + icon.object.audio.load(); + } else if (isSVG) { + img.onload = function () { + icon.object = new SVG_Costume(img, item.name); + icon.refresh(); + }; + this.getURL( + url, + txt => img.src = 'data:image/svg+xml;base64,' + + window.btoa(txt) + ); + } else { + img.onload = function () { + var canvas = newCanvas(new Point(img.width, img.height), true); + canvas.getContext('2d').drawImage(img, 0, 0); + icon.object = new Costume(canvas, item.name); + icon.refresh(); + }; + img.src = url; + } + }); + dialog.popUp(world); + dialog.setExtent(new Point(400, 300)); + dialog.setCenter(world.center()); + + handle = new HandleMorph( + dialog, + 300, + 280, + dialog.corner, + dialog.corner + ); +}; + +IDE_Morph.prototype.undeleteSprites = function (pos) { + // pop up a menu showing deleted sprites that can be recovered + // by clicking on them + + var menu = new MenuMorph(sprite => this.undelete(sprite, pos), null, this); + pos = pos || this.corralBar.bottomRight(); + + if (!this.scene.trash.length) { + this.showMessage('trash is empty'); + return; + } + this.scene.trash.forEach(sprite => + menu.addItem( + [ + sprite.thumbnail(new Point(24, 24), null, true), // no corpse + sprite.name, + ], + sprite + ) + ); + menu.popup(this.world(), pos); +}; + +IDE_Morph.prototype.undelete = function (aSprite, pos) { + var rnd = Process.prototype.reportBasicRandom; + + aSprite.setCenter(pos); + this.world().add(aSprite); + aSprite.glideTo( + this.stage.center().subtract(aSprite.extent().divideBy(2)), + this.isAnimating ? 100 : 0, + null, // easing + () => { + aSprite.isCorpse = false; + aSprite.version = Date.now(); + aSprite.name = this.newSpriteName(aSprite.name); + this.stage.add(aSprite); + aSprite.setXPosition(rnd.call(this, -50, 50)); + aSprite.setYPosition(rnd.call(this, -50, 59)); + aSprite.fixLayout(); + aSprite.rerender(); + this.sprites.add(aSprite); + this.corral.addSprite(aSprite); + this.selectSprite(aSprite); + this.scene.updateTrash(); + } + ); +}; + +// IDE_Morph menu actions + +IDE_Morph.prototype.aboutSnap = function () { + var dlg, aboutTxt, noticeTxt, creditsTxt, versions = '', translations, + module, btn1, btn2, btn3, btn4, licenseBtn, translatorsBtn, + world = this.world(); + + aboutTxt = 'Snap! ' + SnapVersion + '\nBuild Your Own Blocks\n\n' + + 'Copyright \u24B8 2008-2024 Jens M\u00F6nig and ' + + 'Brian Harvey\n' + + 'jens@moenig.org, bh@cs.berkeley.edu\n\n' + + ' Snap! is developed by the University of California, ' + + 'Berkeley and SAP \n' + + 'with support from the National Science Foundation (NSF),\n' + + 'MIOsoft and YC Research.\n' + + 'The design of Snap! is influenced and inspired by Scratch,\n' + + 'from the Lifelong Kindergarten group at the MIT Media Lab\n\n' + + + 'for more information see https://snap.berkeley.edu'; + + noticeTxt = localize('License') + + '\n\n' + + 'Snap! is free software: you can redistribute it and/or modify\n' + + 'it under the terms of the GNU Affero General Public License as\n' + + 'published by the Free Software Foundation, either version 3 of\n' + + 'the License, or (at your option) any later version.\n\n' + + + 'This program is distributed in the hope that it will be useful,\n' + + 'but WITHOUT ANY WARRANTY; without even the implied warranty of\n' + + 'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n' + + 'GNU Affero General Public License for more details.\n\n' + + + 'You should have received a copy of the\n' + + 'GNU Affero General Public License along with this program.\n' + + 'If not, see http://www.gnu.org/licenses/\n\n' + + + 'Want to use Snap! but scared by the open-source license?\n' + + 'Get in touch with us, we\'ll make it work.'; + + creditsTxt = localize('Contributors') + + '\n\nNathan Dinsmore: Saving/Loading, Snap-Logo Design, ' + + '\ncountless bugfixes and optimizations' + + '\nMichael Ball: Time/Date UI, Library Import Dialog,' + + '\ncountless bugfixes and optimizations' + + '\nBernat Romagosa: Countless contributions' + + '\nBartosz Leper: Retina Display Support' + + '\nDariusz Dorożalski: Web Serial Support,' + + '\ncountless bugfixes and optimizations' + + '\nZhenlei Jia and Dariusz Dorożalski: IME text editing' + + '\nKen Kahn: IME support and countless other contributions' + + '\nJosep Ferràndiz: Video Motion Detection' + + '\nJoan Guillén: Countless contributions' + + '\nKartik Chandra: Paint Editor' + + '\nCarles Paredes: Initial Vector Paint Editor' + + '\n"Ava" Yuan Yuan, Deborah Servilla: Graphic Effects' + + '\nKyle Hotchkiss: Block search design' + + '\nBrian Broll: Many bugfixes and optimizations' + + '\nEckart Modrow: SciSnap! Extension' + + '\nBambi Brewer: Birdbrain Robotics Extension Support' + + '\nGlen Bull & team: TuneScope Music Extension' + + '\nIan Reynolds: UI Design, Event Bindings, ' + + 'Sound primitives' + + '\nJadga Hügle: Icons and countless other contributions' + + '\nSimon Walters & Xavier Pi: MQTT extension' + + '\nVictoria Phelps: Reporter results tracing' + + '\nIvan Motyashov: Initial Squeak Porting' + + '\nLucas Karahadian: Piano Keyboard Design' + + '\nDavide Della Casa: Morphic Optimizations' + + '\nAchal Dave: Web Audio' + + '\nJoe Otto: Morphic Testing and Debugging' + + '\n\n' + + 'Jahrd, Derec, Jamet, Sarron, Aleassa, and Lirin costumes' + + '\nare watercolor paintings by Meghan Taylor and represent' + + '\n characters from her webcomic Prophecy of the Circle,' + + '\nlicensed to us only for use in Snap! projects.' + + '\nMeghan also painted the Tad costumes,' + + '\nbut that character is in the public domain.'; + + for (module in modules) { + if (Object.prototype.hasOwnProperty.call(modules, module)) { + versions += ('\n' + module + ' (' + + modules[module] + ')'); + } + } + if (versions !== '') { + versions = localize('current module versions:') + ' \n\n' + + 'morphic (' + morphicVersion + ')' + + versions; + } + translations = localize('Translations') + '\n' + SnapTranslator.credits(); + + dlg = new DialogBoxMorph(); + + function txt(textString) { + var tm = new TextMorph( + textString, + dlg.fontSize, + dlg.fontStyle, + true, + false, + 'center', + null, + null, + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE + ), + scroller, + maxHeight = world.height() - dlg.titleFontSize * 10; + if (tm.height() > maxHeight) { + scroller = new ScrollFrameMorph(); + scroller.acceptsDrops = false; + scroller.contents.acceptsDrops = false; + scroller.bounds.setWidth(tm.width()); + scroller.bounds.setHeight(maxHeight); + scroller.addContents(tm); + scroller.color = new Color(0, 0, 0, 0); + return scroller; + } + return tm; + } + + dlg.inform('About Snap', aboutTxt, world, this.logo.cachedTexture); + btn1 = dlg.buttons.children[0]; + translatorsBtn = dlg.addButton( + () => { + dlg.addBody(txt(translations)); + dlg.body.fixLayout(); + btn1.show(); + btn2.show(); + btn3.hide(); + btn4.hide(); + licenseBtn.hide(); + translatorsBtn.hide(); + dlg.fixLayout(); + dlg.setCenter(world.center()); + }, + 'Translators...' + ); + btn2 = dlg.addButton( + () => { + dlg.addBody(txt(aboutTxt)); + dlg.body.fixLayout(); + btn1.show(); + btn2.hide(); + btn3.show(); + btn4.show(); + licenseBtn.show(); + translatorsBtn.hide(); + dlg.fixLayout(); + dlg.setCenter(world.center()); + }, + 'Back...' + ); + btn2.hide(); + licenseBtn = dlg.addButton( + () => { + dlg.addBody(txt(noticeTxt)); + dlg.body.fixLayout(); + btn1.show(); + btn2.show(); + btn3.hide(); + btn4.hide(); + licenseBtn.hide(); + translatorsBtn.hide(); + dlg.fixLayout(); + dlg.setCenter(world.center()); + }, + 'License...' + ); + btn3 = dlg.addButton( + () => { + dlg.addBody(txt(versions)); + dlg.body.fixLayout(); + btn1.show(); + btn2.show(); + btn3.hide(); + btn4.hide(); + licenseBtn.hide(); + translatorsBtn.hide(); + dlg.fixLayout(); + dlg.setCenter(world.center()); + }, + 'Modules...' + ); + btn4 = dlg.addButton( + () => { + dlg.addBody(txt(creditsTxt)); + dlg.body.fixLayout(); + btn1.show(); + btn2.show(); + translatorsBtn.show(); + btn3.hide(); + btn4.hide(); + licenseBtn.hide(); + dlg.fixLayout(); + dlg.setCenter(world.center()); + }, + 'Credits...' + ); + translatorsBtn.hide(); + dlg.fixLayout(); +}; + +IDE_Morph.prototype.scenesMenu = function () { + var menu = new MenuMorph(scn => this.switchToScene(scn), null, this), + world = this.world(), + pos = this.controlBar.projectButton.bottomLeft(), + tick = new SymbolMorph( + 'tick', + MorphicPreferences.menuFontSize * 0.75 + ), + empty = tick.fullCopy(); + + empty.render = nop; + this.scenes.asArray().forEach(scn => + menu.addItem( + [ + this.scene === scn ? tick : empty, + scn.name + ], + scn + ) + ); + menu.popup(world, pos); +}; + +IDE_Morph.prototype.editNotes = function () { + var dialog = new DialogBoxMorph().withKey('notes'), + frame = new ScrollFrameMorph(), + text = new TextMorph(this.scenes.at(1).notes || ''), + size = 250, + world = this.world(); + + frame.padding = 6; + frame.setWidth(size); + frame.acceptsDrops = false; + frame.contents.acceptsDrops = false; + + text.setWidth(size - frame.padding * 2); + text.setPosition(frame.topLeft().add(frame.padding)); + text.enableSelecting(); + text.isEditable = true; + + frame.setHeight(size); + frame.fixLayout = nop; + frame.edge = InputFieldMorph.prototype.edge; + frame.fontSize = InputFieldMorph.prototype.fontSize; + frame.typeInPadding = InputFieldMorph.prototype.typeInPadding; + frame.contrast = InputFieldMorph.prototype.contrast; + frame.render = InputFieldMorph.prototype.render; + frame.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + frame.addContents(text); + + dialog.getInput = () => text.text; + + dialog.target = this; + + dialog.action = (note) => { + this.scene.notes = note; + this.recordUnsavedChanges(); + }; + + dialog.justDropped = () => text.edit(); + + dialog.labelString = 'Notes'; + dialog.createLabel(); + dialog.addBody(frame); + dialog.addButton('ok', 'OK'); + dialog.addButton('cancel', 'Cancel'); + dialog.fixLayout(); + dialog.popUp(world); + dialog.setCenter(world.center()); + text.edit(); +}; + +IDE_Morph.prototype.newProject = function () { + var project = new Project(); + + project.addDefaultScene(); + this.source = this.cloud.username ? 'cloud' : null; + if (location.hash.substr(0, 6) !== '#lang:') { + location.hash = ''; + } + this.openProject(project); +}; + +IDE_Morph.prototype.createNewScene = function () { + var setting = this.isAddingScenes; + this.isAddingScenes = true; + this.newProject(); + this.isAddingScenes = setting; +}; + +IDE_Morph.prototype.createNewCategory = function () { + new DialogBoxMorph( + this, + cat => this.addPaletteCategory(cat.name, cat.color), + this + ).promptCategory( + "New Category", + null, + new Color(0,116,143), + this.world(), + null, // pic + 'Blocks category name:' // msg + ); +}; + +IDE_Morph.prototype.addPaletteCategory = function (name, color) { + if (name === '') {return; } + SpriteMorph.prototype.customCategories.set(name, color); + this.createCategories(); + this.categories.refreshEmpty(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.fixLayout(); +}; + +IDE_Morph.prototype.deleteUserCategory = function (pos) { + var menu = new MenuMorph( + this.deletePaletteCategory, + null, + this + ); + + // sort alphabetically + Array.from( + SpriteMorph.prototype.customCategories.keys() + ).sort().forEach(name => + menu.addItem( + name, + name, + null, + null, + null, + null, + null, + null, + true // verbatim - don't translate + ) + ); + if (pos) { + menu.popup(this.world(), pos); + } else { + menu.popUpAtHand(this.world()); + } +}; + +IDE_Morph.prototype.deletePaletteCategory = function (name) { + this.stage.globalBlocks.forEach(def =>{ + if (def.category === name) { + def.category = 'other'; + this.currentSprite.allBlockInstances(def).reverse().forEach( + block => block.refresh() + ); + } + }); + this.sprites.asArray().concat(this.stage).forEach(obj => { + obj.customBlocks.forEach(def => { + if (def.category === name) { + def.category = 'other'; + obj.allDependentInvocationsOf( + def.blockSpec() + ).reverse().forEach( + block => block.refresh(def) + ); + } + }); + }); + SpriteMorph.prototype.customCategories.delete(name); + this.createCategories(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.flushPaletteCache(); + this.refreshPalette(true); + this.categories.refreshEmpty(); + this.fixLayout(); + this.recordUnsavedChanges(); +}; + +IDE_Morph.prototype.save = function () { + // temporary hack - only allow exporting projects to disk + // when running Snap! locally without a web server + var pn = this.getProjectName(); + if (location.protocol === 'file:') { + if (pn) { + this.exportProject(pn); + } else { + this.prompt( + 'Export Project As...', + name => this.exportProject(name), + null, + 'exportProject' + ); + } + return; + } + + if (this.source === 'examples' || this.source === 'local') { + // cannot save to examples, deprecated localStorage + this.source = null; + } + + if (this.cloud.disabled) {this.source = 'disk'; } + + if (pn) { + if (this.source === 'disk') { + this.exportProject(pn); + } else if (this.source === 'cloud') { + this.saveProjectToCloud(pn); + } else { + this.saveProjectsBrowser(); + } + } else { + this.saveProjectsBrowser(); + } +}; + +IDE_Morph.prototype.exportProject = function (name) { + // Export project XML, saving a file to disk + var menu, str; + if (name) { + name = this.setProjectName(name); + this.scene.captureGlobalSettings(); + try { + menu = this.showMessage('Exporting'); + str = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + this.saveXMLAs(str, name); + menu.destroy(); + this.recordSavedChanges(); + this.showMessage('Exported!', 1); + } catch (err) { + if (Process.prototype.isCatchingErrors) { + this.showMessage('Export failed: ' + err); + } else { + throw err; + } + } + } +}; + +IDE_Morph.prototype.exportGlobalBlocks = function () { + if (this.stage.globalBlocks.length > 0) { + new BlockExportDialogMorph( + this.serializer, + this.stage.globalBlocks, + this + ).popUp(this.world()); + } else { + this.inform( + 'Export blocks', + 'this project doesn\'t have any\n' + + 'custom global blocks yet' + ); + } +}; + +IDE_Morph.prototype.removeUnusedBlocks = function () { + var targets = this.sprites.asArray().concat([this.stage]), + globalBlocks = this.stage.globalBlocks, + unused = [], + isDone = false, + found; + + function scan() { + return globalBlocks.filter(def => { + if (contains(unused, def)) {return false; } + return targets.every((each, trgIdx) => + !each.usesBlockInstance(def, true, trgIdx, unused) + ); + }); + } + + while (!isDone) { + found = scan(); + if (found.length) { + unused = unused.concat(found); + } else { + isDone = true; + } + } + if (unused.length > 0) { + new BlockRemovalDialogMorph( + unused, + this + ).popUp(this.world()); + } else { + this.inform( + 'Remove unused blocks', + 'there are currently no unused\n' + + 'global custom blocks in this project' + ); + } +}; + +IDE_Morph.prototype.generatePuzzle = function () { + if (this.sprites.asArray().some(any => any.solution)) { + return this.addToPuzzle(); + } + + var current = this.currentSprite, + allBlocks = current.allPaletteBlocks(), + used = current.scripts.allChildren().filter( + m => m instanceof BlockMorph), + uPrim = [], + uCust = [], + uVars = [], + unused, + puzzle; + + // add stage-only blocks + this.stage.allPaletteBlocks().forEach(b => { + if (!allBlocks.includes(b)) { + allBlocks.push(b); + } + }); + + // determine unused blocks + used.forEach(b => { + if (b.isCustomBlock) { + uCust.push(b.isGlobal ? b.definition + : current.getMethod(b.semanticSpec)); + } else if (b.selector === 'reportGetVar') { + uVars.push(b.blockSpec); + } else { + uPrim.push(b.selector); + } + }); + unused = allBlocks.filter(b => { + if (b.isCustomBlock) { + return !contains( + uCust, + b.isGlobal ? b.definition + : current.getMethod(b.semanticSpec) + ); + } else if (b.selector === 'reportGetVar') { + return !contains(uVars, b.blockSpec); + } else { + return !contains(uPrim, b.selector); + } + }); + + // hide all unused blocks and show all used ones in the palette + allBlocks.forEach(block => current.changeBlockVisibility( + block, + contains(unused, block), + true // quick - without palette update + )); + if (unused.length === 0) { + StageMorph.prototype.hiddenPrimitives = []; + } + + // fire user edit event + current.recordUserEdit( + 'palette', + 'hide block' + ); + + // turn on single palette and hide buttons + this.setUnifiedPalette(true); + this.scene.showPaletteButtons = false; + + // refresh + this.flushBlocksCache(); + this.refreshPalette(); + this.categories.refreshEmpty(); + + // generate a new puzzle sprite by duplicating the current one + this.duplicateSprite(current); + puzzle = this.currentSprite; // this is now the duplicate + puzzle.setPosition(current.position()); + puzzle.setName(this.newSpriteName(current.name + ' ' + localize('Puzzle'))); + + // remove all scripts but keep the comments that are either unattached + // or attached to the top block of a script + puzzle.scripts.children.forEach(m => { + if (m instanceof CommentMorph) { + m.prepareToBeGrabbed(); + } + }); + puzzle.scripts.children.filter(m => + m instanceof BlockMorph + ).forEach(b => b.destroy()); + + // store the solution inside the puzzlem + // and remove the solution from the stage + puzzle.solution = current; + this.removeSprite(current, false); // disable undelete + + // refresh + this.selectSprite(puzzle); +}; + +IDE_Morph.prototype.addToPuzzle = function () { + var current = this.currentSprite, + allBlocks = current.allPaletteBlocks(), + used = current.scripts.allChildren().filter( + m => m instanceof BlockMorph), + uCust = [], + unused, + puzzle; + + // add stage-only blocks + this.stage.allPaletteBlocks().forEach(b => { + if (!allBlocks.includes(b)) { + allBlocks.push(b); + } + }); + + // determine unused local blocks only + used.forEach(b => { + if (b.isCustomBlock && !b.isGlobal) { + uCust.push(current.getMethod(b.semanticSpec)); + } + }); + unused = allBlocks.filter(b => b.isCustomBlock && !b.isGlobal && + !contains(uCust, current.getMethod(b.semanticSpec)) + ); + + // hide unused local custom bocks + unused.forEach(block => current.changeBlockVisibility(block, true, true)); + + // show used blocks + used.forEach(block => current.changeBlockVisibility(block, false, true)); + + // fire user edit event + current.recordUserEdit( + 'palette', + 'hide block' + ); + + // refresh + this.flushBlocksCache(); + this.refreshPalette(); + this.categories.refreshEmpty(); + + // generate a new puzzle sprite by duplicating the current one + this.duplicateSprite(current); + puzzle = this.currentSprite; // this is now the duplicate + puzzle.setPosition(current.position()); + puzzle.setName(this.newSpriteName(current.name + ' ' + localize('Puzzle'))); + + // remove all scripts but keep the comments that are either unattached + // or attached to the top block of a script + puzzle.scripts.children.forEach(m => { + if (m instanceof CommentMorph) { + m.prepareToBeGrabbed(); + } + }); + puzzle.scripts.children.filter(m => + m instanceof BlockMorph + ).forEach(b => b.destroy()); + + // store the solution inside the puzzlem + // and remove the solution from the stage + puzzle.solution = current; + this.removeSprite(current, false); // disable undelete + + // refresh + this.selectSprite(puzzle); +}; +IDE_Morph.prototype.exportSprite = function (sprite) { + this.saveXMLAs(sprite.toXMLString(), sprite.name); +}; + +IDE_Morph.prototype.exportScriptsPicture = function () { + var pics = [], + pic, + padding = 20, + w = 0, + h = 0, + y = 0, + ctx; + + // collect all script pics + this.sprites.asArray().forEach(sprite => { + pics.push(sprite.getImage()); + pics.push(sprite.scripts.scriptsPicture()); + sprite.customBlocks.forEach(def => + pics.push(def.scriptsPicture()) + ); + }); + pics.push(this.stage.getImage()); + pics.push(this.stage.scripts.scriptsPicture()); + this.stage.customBlocks.forEach(def => + pics.push(def.scriptsPicture()) + ); + + // collect global block pics + this.stage.globalBlocks.forEach(def => + pics.push(def.scriptsPicture()) + ); + + pics = pics.filter(each => !isNil(each)); + + // determine dimensions of composite + pics.forEach(each => { + w = Math.max(w, each.width); + h += (each.height); + h += padding; + }); + h -= padding; + pic = newCanvas(new Point(w, h)); + ctx = pic.getContext('2d'); + + // draw all parts + pics.forEach(each => { + ctx.drawImage(each, 0, y); + y += padding; + y += each.height; + }); + this.saveCanvasAs(pic, this.scene.name || localize('Untitled')); +}; + +IDE_Morph.prototype.exportProjectSummary = function (useDropShadows) { + var html, head, meta, css, body, pname, notes, toc, globalVars, + stage = this.stage; + + function addNode(tag, node, contents) { + if (!node) {node = body; } + return new XML_Element(tag, contents, node); + } + + function add(contents, tag, node) { + if (!tag) {tag = 'p'; } + if (!node) {node = body; } + return new XML_Element(tag, contents, node); + } + + function addImage(canvas, node, inline) { + if (!node) {node = body; } + var para = !inline ? addNode('p', node) : null, + pic = addNode('img', para || node); + pic.attributes.src = canvas.toDataURL(); + return pic; + } + + function addVariables(varFrame) { + var names = varFrame.names().sort(), + isFirst = true, + ul; + if (names.length) { + add(localize('Variables'), 'h3'); + names.forEach(name => { + /* + addImage( + SpriteMorph.prototype.variableBlock(name).scriptPic() + ); + */ + var watcher, listMorph, li, img; + + if (isFirst) { + ul = addNode('ul'); + isFirst = false; + } + li = addNode('li', ul); + watcher = new WatcherMorph( + name, + SpriteMorph.prototype.blockColor.variables, + varFrame, + name + ); + listMorph = watcher.cellMorph.contentsMorph; + if (listMorph instanceof ListWatcherMorph) { + listMorph.expand(); + } + img = addImage(watcher.fullImage(), li); + img.attributes.class = 'script'; + }); + } + } + + function addBlocks(definitions) { + if (definitions.length) { + add(localize('Blocks'), 'h3'); + SpriteMorph.prototype.allCategories().forEach(category => { + var isFirst = true, + ul; + definitions.forEach(def => { + var li, blockImg; + if (def.category === category) { + if (isFirst) { + add( + localize( + category[0].toUpperCase().concat( + category.slice(1) + ) + ), + 'h4' + ); + ul = addNode('ul'); + isFirst = false; + } + li = addNode('li', ul); + blockImg = addImage( + def.templateInstance().scriptPic(), + li + ); + blockImg.attributes.class = 'script'; + def.sortedElements().forEach(script => { + var defImg = addImage( + script instanceof BlockMorph ? + script.scriptPic() + : script.fullImage(), + li + ); + defImg.attributes.class = 'script'; + }); + } + }); + }); + } + } + + pname = this.scene.name || localize('untitled'); + + html = new XML_Element('html'); + html.attributes.lang = SnapTranslator.language; + // html.attributes.contenteditable = 'true'; + + head = addNode('head', html); + + meta = addNode('meta', head); + meta.attributes.charset = 'UTF-8'; + + if (useDropShadows) { + css = 'img {' + + 'vertical-align: top;' + + 'filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.5));' + + '-webkit-filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.5));' + + '-ms-filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.5));' + + '}' + + '.toc {' + + 'vertical-align: middle;' + + 'padding: 2px 1em 2px 1em;' + + '}'; + } else { + css = 'img {' + + 'vertical-align: top;' + + '}' + + '.toc {' + + 'vertical-align: middle;' + + 'padding: 2px 1em 2px 1em;' + + '}' + + '.sprite {' + + 'border: 1px solid lightgray;' + + '}'; + } + addNode('style', head, css); + + add(pname, 'title', head); + + body = addNode('body', html); + add(pname, 'h1'); + + /* + if (this.cloud.username) { + add(localize('by ') + this.cloud.username); + } + */ + if (location.hash.indexOf('#present:') === 0) { + add(location.toString(), 'a', body).attributes.href = + location.toString(); + addImage( + stage.thumbnail(stage.dimensions) + ).attributes.class = 'sprite'; + add(this.serializer.app, 'h4'); + } else { + add(this.serializer.app, 'h4'); + addImage( + stage.thumbnail(stage.dimensions) + ).attributes.class = 'sprite'; + } + + // project notes + notes = Process.prototype.reportTextSplit(this.scene.notes, 'line'); + notes.asArray().forEach(paragraph => add(paragraph)); + + // table of contents + add(localize('Contents'), 'h4'); + toc = addNode('ul'); + + // sprites & stage + this.sprites.asArray().concat([stage]).forEach(sprite => { + var tocEntry = addNode('li', toc), + scripts = sprite.scripts.sortedElements(), + cl = sprite.costumes.length(), + pic, + ol; + + addNode('hr'); + addImage( + sprite.thumbnail(new Point(40, 40)), + tocEntry, + true + ).attributes.class = 'toc'; + add(sprite.name, 'a', tocEntry).attributes.href = '#' + sprite.name; + + add(sprite.name, 'h2').attributes.id = sprite.name; + // if (sprite instanceof SpriteMorph || sprite.costume) { + pic = addImage( + sprite.thumbnail(sprite.extent().divideBy(stage.scale)) + ); + pic.attributes.class = 'sprite'; + if (sprite instanceof SpriteMorph) { + if (sprite.exemplar) { + addImage( + sprite.exemplar.thumbnail(new Point(40, 40)), + add(localize('Kind of') + ' ' + sprite.exemplar.name), + true + ).attributes.class = 'toc'; + } + if (sprite.anchor) { + addImage( + sprite.anchor.thumbnail(new Point(40, 40)), + add(localize('Part of') + ' ' + sprite.anchor.name), + true + ).attributes.class = 'toc'; + } + if (sprite.parts.length) { + add(localize('Parts'), 'h3'); + ol = addNode('ul'); + sprite.parts.forEach(part => { + var li = addNode('li', ol, part.name); + addImage(part.thumbnail(new Point(40, 40)), li, true) + .attributes.class = 'toc'; + }); + } + } + + // costumes + if (cl > 1 || (sprite.getCostumeIdx() !== cl)) { + add(localize('Costumes'), 'h3'); + ol = addNode('ol'); + sprite.costumes.asArray().forEach(costume => { + var li = addNode('li', ol, costume.name); + addImage(costume.thumbnail(new Point(40, 40)), li, true) + .attributes.class = 'toc'; + }); + } + + // sounds + if (sprite.sounds.length()) { + add(localize('Sounds'), 'h3'); + ol = addNode('ol'); + sprite.sounds.asArray().forEach(sound => + add(sound.name, 'li', ol) + ); + } + + // variables + addVariables(sprite.variables); + + // scripts + if (scripts.length) { + add(localize('Scripts'), 'h3'); + scripts.forEach(script => { + var img = addImage(script instanceof BlockMorph ? + script.scriptPic() + : script.fullImage()); + img.attributes.class = 'script'; + }); + } + + // custom blocks + addBlocks(sprite.customBlocks); + }); + + // globals + globalVars = stage.globalVariables(); + if (Object.keys(globalVars.vars).length || stage.globalBlocks.length) { + addNode('hr'); + add( + localize('For all Sprites'), + 'a', + addNode('li', toc) + ).attributes.href = '#global'; + add(localize('For all Sprites'), 'h2').attributes.id = 'global'; + + // variables + addVariables(globalVars); + + // custom blocks + addBlocks(stage.globalBlocks); + } + + this.saveFileAs( + '' + html.toString(), + 'text/html;charset=utf-8', + pname + ); +}; + +IDE_Morph.prototype.openProjectString = function (str, callback) { + var msg; + if (this.bulkDropInProgress || this.isAddingScenes) { + this.rawOpenProjectString(str); + if (callback) {callback(); } + return; + } + this.nextSteps([ + () => msg = this.showMessage('Opening project...'), + () => { + this.rawOpenProjectString(str); + msg.destroy(); + if (callback) {callback(); } + } + ]); +}; + +IDE_Morph.prototype.rawOpenProjectString = function (str) { + this.toggleAppMode(false); + this.spriteBar.tabBar.tabTo('scripts'); + if (Process.prototype.isCatchingErrors) { + try { + this.openProject( + this.serializer.load(str, this) + ); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + this.openProject( + this.serializer.load(str, this) + ); + } + this.autoLoadExtensions(); + this.stopFastTracking(); +}; + +IDE_Morph.prototype.openCloudDataString = function (str) { + var msg, + size = Math.round(str.length / 1024); + this.nextSteps([ + () => msg = this.showMessage('Opening project\n' + size + ' KB...'), + () => { + this.rawOpenCloudDataString(str); + msg.destroy(); + } + ]); +}; + +IDE_Morph.prototype.rawOpenCloudDataString = function (str) { + var model, + setting = this.isAddingScenes; + + if (this.isAddingNextScene) { + this.isAddingScenes = true; + } + if (Process.prototype.isCatchingErrors) { + try { + model = this.serializer.parse(str); + this.serializer.loadMediaModel(model.childNamed('media')); + this.openProject( + this.serializer.loadProjectModel( + model.childNamed('project'), + this, + model.attributes.remixID + ) + ); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + model = this.serializer.parse(str); + this.serializer.loadMediaModel(model.childNamed('media')); + this.openProject( + this.serializer.loadProjectModel( + model.childNamed('project'), + this, + model.attributes.remixID + ) + ); + } + this.autoLoadExtensions(); + this.stopFastTracking(); + this.isAddingScenes = setting; + this.isAddingNextScene = false; +}; + +IDE_Morph.prototype.openBlocksString = function (str, name, silently) { + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening blocks...'), + () => { + this.rawOpenBlocksString(str, name, silently); + msg.destroy(); + } + ]); +}; + +IDE_Morph.prototype.rawOpenBlocksString = function (str, name, silently) { + // name is optional (string), so is silently (bool) + var blocks; + this.toggleAppMode(false); + this.spriteBar.tabBar.tabTo('scripts'); + if (Process.prototype.isCatchingErrors) { + try { + blocks = this.serializer.loadBlocks(str, this.stage); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + blocks = this.serializer.loadBlocks(str, this.stage); + } + if (silently) { + blocks.global.forEach(def => { + def.receiver = this.stage; + this.stage.globalBlocks.push(def); + this.stage.replaceDoubleDefinitionsFor(def); + }); + blocks.local.forEach(def => { + def.receiver = this.currentSprite; + this.currentSprite.customBlocks.push(def); + this.currentSprite.replaceDoubleDefinitionsFor(def); + }); + if (blocks.data) { + this.globalVariables.merge(blocks.data); + this.flushBlocksCache('variables'); + } + if (blocks.localData) { + this.currentSprite.variables.merge(blocks.localData); + this.flushBlocksCache('variables'); + } + this.flushPaletteCache(); + this.refreshPalette(); + this.showMessage( + 'Imported Blocks Module' + (name ? ': ' + name : '') + '.', + 2 + ); + } else { + new BlockImportDialogMorph( + blocks.global.concat(blocks.local), + this.stage, + name + ).popUp(); + } + this.createCategories(); + this.categories.refreshEmpty(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.fixLayout(); + this.autoLoadExtensions(); +}; + +IDE_Morph.prototype.openSpritesString = function (str) { + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening sprite...'), + () => { + this.rawOpenSpritesString(str); + msg.destroy(); + }, + ]); +}; + +IDE_Morph.prototype.rawOpenSpritesString = function (str) { + this.toggleAppMode(false); + this.spriteBar.tabBar.tabTo('scripts'); + if (Process.prototype.isCatchingErrors) { + try { + this.deserializeSpritesString(str); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + this.deserializeSpritesString(str); + } + this.autoLoadExtensions(); +}; + +IDE_Morph.prototype.deserializeSpritesString = function (str) { + var xml = this.serializer.parse(str, true), // assert version + blocksModel = xml.childNamed('blocks'), + blocks; + + if (blocksModel) { + // load the custom block definitions the sprites depend on + blocks = this.serializer.loadBlocksModel(blocksModel, this.stage); + blocks.global.forEach(def => { + def.receiver = this.stage; + this.stage.globalBlocks.push(def); + this.stage.replaceDoubleDefinitionsFor(def); + }); + // load global variables which the custom blocks rely on + if (blocks.data) { + this.globalVariables.merge(blocks.data); + this.flushBlocksCache('variables'); + } + // notice, there should not be any local blocks or datain this part of + // the model instead we're expecting them inside each sprite + this.flushPaletteCache(); + this.refreshPalette(); + this.createCategories(); + this.categories.refreshEmpty(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.fixLayout(); + } + this.serializer.loadSpritesModel(xml, this); +}; + +IDE_Morph.prototype.openMediaString = function (str) { + if (Process.prototype.isCatchingErrors) { + try { + this.serializer.loadMedia(str); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + this.serializer.loadMedia(str); + } + this.showMessage('Imported Media Module.', 2); +}; + +IDE_Morph.prototype.openScriptString = function (str) { + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening script...'), + () => { + this.rawOpenScriptString(str); + msg.destroy(); + } + ]); +}; + +IDE_Morph.prototype.rawOpenScriptString = function (str, silently) { + var world = this.world(), + script; + + if (Process.prototype.isCatchingErrors) { + try { + script = this.deserializeScriptString(str); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + script = this.deserializeScriptString(str); + } + script.fixBlockColor(null, true); + this.spriteBar.tabBar.tabTo('scripts'); + if (silently) { + this.currentSprite.scripts.add(script); + this.currentSprite.scripts.cleanUp(); + } else { + script.pickUp(world); + world.hand.grabOrigin = { + origin: this.palette, + position: this.palette.center() + }; + } + this.showMessage( + 'Imported Script.', + 2 + ); + this.autoLoadExtensions(); +}; + +IDE_Morph.prototype.deserializeScriptString = function (str) { + var xml = this.serializer.parse(str, true), // assert version + blocksModel = xml.childNamed('blocks'), + scriptModel = xml.childNamed('script') || xml, + blocks; + + if (blocksModel) { + // load the custom block definitions the script depends on + blocks = this.serializer.loadBlocksModel(blocksModel, this.stage); + blocks.global.forEach(def => { + def.receiver = this.stage; + this.stage.globalBlocks.push(def); + this.stage.replaceDoubleDefinitionsFor(def); + }); + blocks.local.forEach(def => { + def.receiver = this.currentSprite; + this.currentSprite.customBlocks.push(def); + this.currentSprite.replaceDoubleDefinitionsFor(def); + }); + if (blocks.data) { + this.globalVariables.merge(blocks.data); + this.flushBlocksCache('variables'); + } + if (blocks.localData) { + this.currentSprite.variables.merge(blocks.localData); + this.flushBlocksCache('variables'); + } + this.flushPaletteCache(); + this.refreshPalette(); + this.createCategories(); + this.categories.refreshEmpty(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.fixLayout(); + } + return this.serializer.loadScriptModel(scriptModel, this.currentSprite); +}; + +IDE_Morph.prototype.openScriptsOnlyString = function (str) { + // open scripts that do not contain dependencies such as variable + // declarations and custom block definitions (!) + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening scripts...'), + () => { + this.rawOpenScriptsOnlyString(str); + msg.destroy(); + } + ]); +}; + +IDE_Morph.prototype.rawOpenScriptsOnlyString = function (str) { + // import scripts that do not contain dependencies such as variable + // declarations and custom block definitions (!) + var object = this.currentSprite, + scripts = object.scripts, + xml; + + if (Process.prototype.isCatchingErrors) { + try { + xml = this.serializer.parse(str, true); + this.serializer.loadScripts(object, scripts, xml); + } catch (err) { + this.showMessage('Load failed: ' + err); + } + } else { + xml = this.serializer.parse(str, true); + this.serializer.loadScripts(object, scripts, xml); + } + scripts.changed(); + this.spriteBar.tabBar.tabTo('scripts'); + this.showMessage( + 'Imported Scripts.', + 2 + ); +}; + +IDE_Morph.prototype.openDataString = function (str, name, type) { + var msg; + this.nextSteps([ + () => msg = this.showMessage('Opening data...'), + () => { + this.rawOpenDataString(str, name, type); + msg.destroy(); + } + ]); +}; + +IDE_Morph.prototype.rawOpenDataString = function (str, name, type) { + var data, vName, dlg, + globals = this.currentSprite.globalVariables(); + + function newVarName(name) { + var existing = globals.names(), + ix = name.indexOf('\('), + stem = ((ix < 0) ? name : name.substring(0, ix)).trim(), + count = 1, + newName = stem; + while (contains(existing, newName)) { + count += 1; + newName = stem + ' (' + count + ')'; + } + return newName; + } + + switch (type) { + case 'csv': + data = Process.prototype.parseCSV(str); + break; + case 'json': + data = Process.prototype.parseJSON(str); + break; + default: // assume plain text + data = str; + } + vName = newVarName(name || 'data'); + globals.addVar(vName); + globals.setVar(vName, data); + this.currentSprite.toggleVariableWatcher(vName, true); // global + this.flushBlocksCache('variables'); + this.currentCategory = this.scene.unifiedPalette ? 'unified' : 'variables'; + this.categories.refresh(); + this.refreshPalette(true); + if (data instanceof List) { + dlg = new TableDialogMorph(data); + dlg.labelString = localize(dlg.labelString) + ': ' + vName; + dlg.createLabel(); + dlg.popUp(this.world()); + } + this.autoLoadExtensions(); +}; + +IDE_Morph.prototype.openProjectName = function (name) { + var str; + if (name) { + this.showMessage('opening project\n' + name); + this.setProjectName(name); + str = localStorage['-snap-project-' + name]; + this.openProjectString(str); + } +}; + +IDE_Morph.prototype.openProject = function (project) { + if (this.isAddingScenes) { + project.scenes.itemsArray().forEach(scene => { + scene.name = this.newSceneName(scene.name, scene); + this.scenes.add(scene); + }); + } else { + this.scenes = project.scenes; + } + this.switchToScene( + project.currentScene || project.scenes.at(1), + true, // refresh album + null, // msg + null, // data + true // pause generic WHEN hat blocks + ); +}; + +IDE_Morph.prototype.autoLoadExtensions = function () { + // experimental - allow auto-loading extensions from urls specified + // in global variables whose names start with "__module__". + // Still very much under construction, also needs to be tweaked for + // asynch operation + var urls = []; + Object.keys(this.globalVariables.vars).forEach(vName => { + var val; + if (vName.startsWith('__module__')) { + val = this.globalVariables.getVar(vName); + if (isString(val)) { + urls.push(val); + } + } + }); + urls.forEach(url => { + var scriptElement; + if (contains(SnapExtensions.scripts, url)) { + return; + } + if (Process.prototype.enableJS || SnapExtensions.urls.some( + any => url.indexOf(any) === 0) + ) { + scriptElement = document.createElement('script'); + scriptElement.onload = () => { + SnapExtensions.scripts.push(url); + }; + document.head.appendChild(scriptElement); + scriptElement.src = url; + /* + } else { + // throw new Error( + 'unlisted extension url:\n"' + url + '"\n' + + 'JavaScript extensions for Snap!\nare turned off' + ); + */ + } + }); +}; + +IDE_Morph.prototype.switchToScene = function ( + scene, + refreshAlbum, + msg, + data, + pauseHats +) { + var appMode = this.isAppMode, + listeners; + if (!scene || !scene.stage) { + return; + } + this.siblings().filter( + morph => !morph.nag + ).forEach( + morph => morph.destroy() + ); + this.scene.captureGlobalSettings(); + this.scene = scene; + this.globalVariables = scene.globalVariables; + listeners = this.stage.messageCallbacks; + this.stage.destroy(); + this.add(scene.stage); + this.stage = scene.stage; + this.stage.messageCallbacks = listeners; + this.sprites = scene.sprites; + if (pauseHats) { + this.stage.pauseGenericHatBlocks(); + } + this.createCorral(!refreshAlbum); // keep scenes + this.selectSprite(this.scene.currentSprite, true); + this.corral.album.updateSelection(); + this.fixLayout(); + this.corral.album.contents.children.forEach(function (morph) { + if (morph.state) { + morph.scrollIntoView(); + } + }); + scene.applyGlobalSettings(); + if (!SpriteMorph.prototype.allCategories().includes(this.currentCategory)) { + this.currentCategory = 'motion'; + } + if (!this.setUnifiedPalette(scene.unifiedPalette)) { + this.createCategories(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.fixLayout(); + this.flushBlocksCache(); + this.categories.refreshEmpty(); + this.currentSprite.palette(this.currentCategory); + this.refreshPalette(true); + } + this.toggleAppMode(appMode); + this.controlBar.stopButton.refresh(); + this.world().keyboardFocus = this.stage; + if (msg) { + this.stage.fireChangeOfSceneEvent(msg, data); + } +}; + +IDE_Morph.prototype.saveFileAs = function ( + contents, + fileType, + fileName +) { + /** Allow for downloading a file to a disk. + This relies the FileSaver.js library which exports saveAs() + Two utility methods saveImageAs and saveXMLAs should be used first. + */ + var blobIsSupported = false, + world = this.world(), + fileExt, + dialog; + + // fileType is a /; format. + fileExt = fileType.split('/')[1].split(';')[0]; + // handle text/plain as a .txt file + fileExt = '.' + (fileExt === 'plain' ? 'txt' : fileExt); + + function dataURItoBlob(text, mimeType) { + var i, + data = text, + components = text.split(','), + hasTypeStr = text.indexOf('data:') === 0; + // Convert to binary data, in format Blob() can use. + if (hasTypeStr && components[0].indexOf('base64') > -1) { + text = atob(components[1]); + data = new Uint8Array(text.length); + i = text.length; + while (i--) { + data[i] = text.charCodeAt(i); + } + } else if (hasTypeStr) { + // not base64 encoded + text = text.replace(/^data:image\/.*?, */, ''); + data = new Uint8Array(text.length); + i = text.length; + while (i--) { + data[i] = text.charCodeAt(i); + } + } + return new Blob([data], {type: mimeType }); + } + + try { + blobIsSupported = !!new Blob(); + } catch (e) {} + + if (blobIsSupported) { + if (!(contents instanceof Blob)) { + contents = dataURItoBlob(contents, fileType); + } + // download a file and delegate to FileSaver + // false: Do not preprend a BOM to the file. + saveAs(contents, fileName + fileExt, false); + } else { + dialog = new DialogBoxMorph(); + dialog.inform( + localize('Could not export') + ' ' + fileName, + 'unable to export text', + world + ); + dialog.fixLayout(); + } +}; + +IDE_Morph.prototype.saveCanvasAs = function (canvas, fileName) { + // Export a Canvas object as a PNG image + // Note: This commented out due to poor browser support. + // cavas.toBlob() is currently supported in Firefox, IE, Chrome but + // browsers prevent easily saving the generated files. + // Do not re-enable without revisiting issue #1191 + // if (canvas.toBlob) { + // var myself = this; + // canvas.toBlob(function (blob) { + // myself.saveFileAs(blob, 'image/png', fileName); + // }); + // return; + // } + + this.saveFileAs(canvas.toDataURL(), 'image/png', fileName); +}; + +IDE_Morph.prototype.saveAudioAs = function (audio, fileName) { + // Export a Sound object as a WAV file + this.saveFileAs(audio.src, 'audio/wav', fileName); +}; + +IDE_Morph.prototype.saveXMLAs = function(xml, fileName) { + // wrapper to saving XML files with a proper type tag. + this.saveFileAs(xml, 'text/xml;chartset=utf-8', fileName); +}; + +IDE_Morph.prototype.switchToUserMode = function () { + var world = this.world(); + + world.isDevMode = false; + Process.prototype.isCatchingErrors = true; + this.controlBar.updateLabel(); + this.isAutoFill = true; + this.isDraggable = false; + this.reactToWorldResize(world.bounds.copy()); + this.siblings().forEach(morph => { + if (morph instanceof DialogBoxMorph) { + world.add(morph); // bring to front + } else { + morph.destroy(); + } + }); + this.flushBlocksCache(); + this.refreshPalette(); + this.categories.refreshEmpty(); + // prevent non-DialogBoxMorphs from being dropped + // onto the World in user-mode + world.reactToDropOf = (morph) => { + if (!(morph instanceof DialogBoxMorph || + (morph instanceof MenuMorph))) { + if (world.hand.grabOrigin) { + morph.slideBackTo(world.hand.grabOrigin); + } else { + world.hand.grab(morph); + } + } + }; + this.showMessage('entering user mode', 1); +}; + +IDE_Morph.prototype.switchToDevMode = function () { + var world = this.world(); + + world.isDevMode = true; + Process.prototype.isCatchingErrors = false; + this.controlBar.updateLabel(); + this.isAutoFill = false; + this.isDraggable = true; + this.setExtent(world.extent().subtract(100)); + this.setPosition(world.position().add(20)); + this.flushBlocksCache(); + this.refreshPalette(); + this.categories.refreshEmpty(); + // enable non-DialogBoxMorphs to be dropped + // onto the World in dev-mode + delete world.reactToDropOf; + this.showMessage( + 'entering development mode.\n\n' + + 'error catching is turned off,\n' + + 'use the browser\'s web console\n' + + 'to see error messages.' + ); +}; + +IDE_Morph.prototype.flushBlocksCache = function (category) { + // if no category is specified, the whole cache gets flushed + if (category && category !== 'unified') { + this.stage.primitivesCache[category] = null; + this.stage.children.forEach(m => { + if (m instanceof SpriteMorph) { + m.primitivesCache[category] = null; + } + }); + } else { + this.stage.primitivesCache = {}; + this.stage.children.forEach(m => { + if (m instanceof SpriteMorph) { + m.primitivesCache = {}; + } + }); + } + this.flushPaletteCache(category); +}; + +IDE_Morph.prototype.flushPaletteCache = function (category) { + // if no category is specified, the whole cache gets flushed + if (category) { + this.stage.paletteCache[category] = null; + this.stage.paletteCache.unified = null; + this.stage.children.forEach(m => { + if (m instanceof SpriteMorph) { + m.paletteCache[category] = null; + m.paletteCache.unified = null; + } + }); + } else { + this.stage.paletteCache = {}; + this.stage.children.forEach(m => { + if (m instanceof SpriteMorph) { + m.paletteCache = {}; + } + }); + } + this.stage.categoriesCache = null; + this.stage.children.forEach(m => { + if (m instanceof SpriteMorph) { + m.categoriesCache = null; + } + }); +}; + +IDE_Morph.prototype.toggleZebraColoring = function () { + var scripts = []; + + if (!BlockMorph.prototype.zebraContrast) { + BlockMorph.prototype.zebraContrast = 40; + } else { + BlockMorph.prototype.zebraContrast = 0; + } + + // select all scripts: + this.stage.children.concat(this.stage).forEach(morph => { + if (isSnapObject(morph)) { + scripts = scripts.concat( + morph.scripts.children.filter(morph => + morph instanceof BlockMorph + ) + ); + } + }); + + // force-update all scripts: + scripts.forEach(topBlock => + topBlock.fixBlockColor(null, true) + ); +}; + +IDE_Morph.prototype.toggleDynamicInputLabels = function () { + SyntaxElementMorph.prototype.dynamicInputLabels = + !SyntaxElementMorph.prototype.dynamicInputLabels; + this.refreshIDE(); +}; + +IDE_Morph.prototype.toggleBlurredShadows = function () { + window.useBlurredShadows = !useBlurredShadows; + this.rerender(); + if (window.useBlurredShadows) { + this.removeSetting('solidshadow'); + } else { + this.saveSetting('solidshadow', false); + } +}; + +IDE_Morph.prototype.toggleLongFormInputDialog = function () { + InputSlotDialogMorph.prototype.isLaunchingExpanded = + !InputSlotDialogMorph.prototype.isLaunchingExpanded; + if (InputSlotDialogMorph.prototype.isLaunchingExpanded) { + this.saveSetting('longform', true); + } else { + this.removeSetting('longform'); + } +}; + +IDE_Morph.prototype.togglePlainPrototypeLabels = function () { + BlockLabelPlaceHolderMorph.prototype.plainLabel = + !BlockLabelPlaceHolderMorph.prototype.plainLabel; + if (BlockLabelPlaceHolderMorph.prototype.plainLabel) { + this.saveSetting('plainprototype', true); + } else { + this.removeSetting('plainprototype'); + } +}; + +IDE_Morph.prototype.togglePreferEmptySlotDrops = function () { + ScriptsMorph.prototype.isPreferringEmptySlots = + !ScriptsMorph.prototype.isPreferringEmptySlots; +}; + +IDE_Morph.prototype.toggleInputSliders = function () { + MorphicPreferences.useSliderForInput = + !MorphicPreferences.useSliderForInput; +}; + +IDE_Morph.prototype.toggleSliderExecute = function () { + ArgMorph.prototype.executeOnSliderEdit = + !ArgMorph.prototype.executeOnSliderEdit; +}; + +IDE_Morph.prototype.setEmbedMode = function () { + var myself = this; + + this.isEmbedMode = true; + this.appModeColor = new Color(243,238,235); + this.embedOverlay = new Morph(); + this.embedOverlay.color = new Color(128, 128, 128); + this.embedOverlay.alpha = 0.5; + + this.embedPlayButton = new SymbolMorph('circleSolid'); + this.embedPlayButton.color = new Color(64, 128, 64); + this.embedPlayButton.alpha = 0.75; + this.embedPlayButton.flag = new SymbolMorph('flag'); + this.embedPlayButton.flag.color = new Color(128, 255, 128); + this.embedPlayButton.flag.alpha = 0.75; + this.embedPlayButton.add(this.embedPlayButton.flag); + this.embedPlayButton.mouseClickLeft = function () { + myself.runScripts(); + myself.embedOverlay.destroy(); + this.destroy(); + }; + + this.controlBar.hide(); + + this.add(this.embedOverlay); + this.add(this.embedPlayButton); + + this.fixLayout(); +}; + +IDE_Morph.prototype.toggleAppMode = function (appMode) { + var world = this.world(), + elements = [ + this.logo, + this.controlBar.cloudButton, + this.controlBar.projectButton, + this.controlBar.settingsButton, + this.controlBar.steppingButton, + this.controlBar.stageSizeButton, + this.paletteHandle, + this.stageHandle, + this.corral, + this.corralBar, + this.spriteEditor, + this.spriteBar, + this.palette, + this.categories + ]; + + this.isAppMode = isNil(appMode) ? !this.isAppMode : appMode; + + if (this.isAppMode) { + this.wasSingleStepping = Process.prototype.enableSingleStepping; + if (this.wasSingleStepping) { + this.toggleSingleStepping(); + } + this.setColor(this.appModeColor); + this.controlBar.setColor(this.color); + this.controlBar.appModeButton.refresh(); + elements.forEach(e => + e.hide() + ); + world.children.forEach(morph => { + if (morph instanceof DialogBoxMorph) { + morph.hide(); + } + }); + if (world.keyboardFocus instanceof ScriptFocusMorph) { + world.keyboardFocus.stopEditing(); + } + } else { + if (this.wasSingleStepping && !Process.prototype.enableSingleStepping) { + this.toggleSingleStepping(); + } + this.setColor(this.backgroundColor); + this.controlBar.setColor(this.frameColor); + elements.forEach(e => + e.show() + ); + this.stage.setScale(1); + // show all hidden dialogs + world.children.forEach(morph => { + if (morph instanceof DialogBoxMorph) { + morph.show(); + } + }); + // prevent scrollbars from showing when morph appears + world.allChildren().filter(c => + c instanceof ScrollFrameMorph + ).forEach(s => + s.adjustScrollBars() + ); + // prevent rotation and draggability controls from + // showing for the stage + if (this.currentSprite === this.stage) { + this.spriteBar.children.forEach(child => { + if (child instanceof PushButtonMorph) { + child.hide(); + } + }); + } + // update undrop controls + this.currentSprite.scripts.updateToolbar(); + // hide hidden panes + if (this.config.noSpriteEdits) { + this.spriteBar.hide(); + this.stageHandle.hide(); + this.corralBar.hide(); + this.corral.hide(); + } + } + this.setExtent(this.world().extent()); +}; + +IDE_Morph.prototype.toggleStageSize = function (isSmall, forcedRatio) { + var myself = this, + smallRatio = forcedRatio || 0.5, + msecs = this.isAnimating ? 100 : 0, + world = this.world(), + shiftClicked = (world.currentKey === 16), + altClicked = (world.currentKey === 18); + + function toggle() { + myself.isSmallStage = isNil(isSmall) ? !myself.isSmallStage : isSmall; + } + + function zoomTo(targetRatio) { + myself.isSmallStage = true; + world.animations.push(new Animation( + ratio => { + myself.stageRatio = ratio; + myself.setExtent(world.extent()); + }, + () => myself.stageRatio, + targetRatio - myself.stageRatio, + msecs, + null, // easing + () => { + myself.isSmallStage = (targetRatio !== 1); + myself.controlBar.stageSizeButton.refresh(); + } + )); + } + + if (shiftClicked) { + smallRatio = SpriteIconMorph.prototype.thumbSize.x * 3 / + this.stage.dimensions.x; + if (!this.isSmallStage || (smallRatio === this.stageRatio)) { + toggle(); + } + } else if (altClicked) { + smallRatio = this.width() / 2 / + this.stage.dimensions.x; + if (!this.isSmallStage || (smallRatio === this.stageRatio)) { + toggle(); + } + } else { + toggle(); + } + if (this.isSmallStage) { + zoomTo(smallRatio); + } else { + zoomTo(1); + } +}; + +IDE_Morph.prototype.toggleUnifiedPalette = function () { + this.setUnifiedPalette(!this.scene.unifiedPalette); + this.recordUnsavedChanges(); +}; + +IDE_Morph.prototype.setUnifiedPalette = function (bool) { + // answer true or false indicating whether the palette + // has already been refreshed by this operation + if (this.scene.unifiedPalette === bool && + (bool === (this.currentCategory === 'unified')) + ) { + return false; + } + this.scene.unifiedPalette = bool; + this.currentCategory = bool ? 'unified' : 'motion'; + this.createCategories(); + this.createPaletteHandle(); + this.categories.fixLayout(); + this.fixLayout(); + this.flushBlocksCache(); + this.categories.refreshEmpty(); + this.currentSprite.palette(this.currentCategory); + this.refreshPalette(true); + return true; +}; + +IDE_Morph.prototype.toggleCategoryNames = function () { + this.scene.showCategories = !this.scene.showCategories; + this.flushBlocksCache(); + this.refreshPalette(); + this.recordUnsavedChanges(); +}; + +IDE_Morph.prototype.togglePaletteButtons = function () { + this.scene.showPaletteButtons = !this.scene.showPaletteButtons; + this.flushBlocksCache(); + this.refreshPalette(); + this.recordUnsavedChanges(); +}; + +IDE_Morph.prototype.setPaletteWidth = function (newWidth) { + var msecs = this.isAnimating ? 100 : 0, + world = this.world(); + + world.animations.push(new Animation( + newWidth => { + this.paletteWidth = newWidth; + this.setExtent(world.extent()); + }, + () => this.paletteWidth, + newWidth - this.paletteWidth, + msecs + )); +}; + +IDE_Morph.prototype.createNewProject = function () { + this.backup(() => this.newProject()); +}; + +IDE_Morph.prototype.addScene = function () { + var setting = this.isAddingScenes; + if (location.protocol === 'file:') { + // bypass the project import dialog and directly pop up + // the local file picker. + // this should not be necessary, we should be able + // to access the cloud even when running Snap! locally + // to be worked on.... (jens) + this.isAddingScenes = true; + this.importLocalFile(); + this.isAddingScenes = setting; + return; + } + new ProjectDialogMorph(this, 'add').popUp(); +}; + +IDE_Morph.prototype.openProjectsBrowser = function () { + if (location.protocol === 'file:') { + // bypass the project import dialog and directly pop up + // the local file picker. + // this should not be necessary, we should be able + // to access the cloud even when running Snap! locally + // to be worked on.... (jens) + this.importLocalFile(); + return; + } + new ProjectDialogMorph(this, 'open').popUp(); +}; + +IDE_Morph.prototype.saveProjectsBrowser = function () { + // temporary hack - only allow exporting projects to disk + // when running Snap! locally without a web server + if (location.protocol === 'file:') { + this.prompt( + 'Export Project As...', + name => this.exportProject(name), + null, + 'exportProject' + ); + return; + } + + if (this.source === 'examples') { + this.source = null; // cannot save to examples + } + new ProjectDialogMorph(this, 'save').popUp(); +}; + +// IDE_Morph microphone settings + +IDE_Morph.prototype.microphoneMenu = function () { + var menu = new MenuMorph(this), + world = this.world(), + pos = this.controlBar.settingsButton.bottomLeft(), + resolutions = ['low', 'normal', 'high', 'max'], + microphone = this.stage.microphone, + tick = new SymbolMorph( + 'tick', + MorphicPreferences.menuFontSize * 0.75 + ), + on = new SymbolMorph( + 'checkedBox', + MorphicPreferences.menuFontSize * 0.75 + ), + empty = tick.fullCopy(); + + empty.render = nop; + if (microphone.isReady) { + menu.addItem( + [ + on, + localize('Microphone') + ], + () => microphone.stop() + ); + menu.addLine(); + } + resolutions.forEach((res, i) => { + menu.addItem( + [ + microphone.resolution === i + 1 ? tick : empty, + localize(res) + ], + () => microphone.setResolution(i + 1) + ); + }); + menu.popup(world, pos); +}; + +// IDE_Morph localization + +IDE_Morph.prototype.languageMenu = function () { + var menu = new MenuMorph(this), + world = this.world(), + pos = this.controlBar.settingsButton.bottomLeft(), + tick = new SymbolMorph( + 'tick', + MorphicPreferences.menuFontSize * 0.75 + ), + empty = tick.fullCopy(); + + empty.render = nop; + SnapTranslator.languages().forEach(lang => + menu.addItem( + [ + SnapTranslator.language === lang ? tick : empty, + SnapTranslator.languageName(lang) + ], + () => { + this.loadNewProject = false; + this.setLanguage( + lang, + () => this.stage.fireUserEditEvent( + this.currentSprite.name, + ['project', 'language', lang], + this.version + ) + ); + } + ) + ); + menu.popup(world, pos); +}; + +IDE_Morph.prototype.setLanguage = function (lang, callback, noSave) { + var translation = document.getElementById('language'), + src; + SnapTranslator.unload(); + if (translation) { + document.head.removeChild(translation); + } + if (!(lang in SnapTranslator.dict)) { + if (lang.includes('_') && lang.split('_')[0] in SnapTranslator.dict) { + lang = lang.split('_')[0]; + } else { + lang = 'en'; + } + } + if (lang === 'en') { + return this.reflectLanguage('en', callback, noSave); + } + + src = this.resourceURL('locale', 'lang-' + lang + '.js'); + translation = document.createElement('script'); + translation.id = 'language'; + translation.onload = () => + this.reflectLanguage(lang, callback, noSave); + document.head.appendChild(translation); + translation.src = src; +}; + +IDE_Morph.prototype.reflectLanguage = function (lang, callback, noSave) { + var projectData, + urlBar = location.hash; + SnapTranslator.language = lang; + if (!this.loadNewProject) { + this.scene.captureGlobalSettings(); + if (Process.prototype.isCatchingErrors) { + try { + projectData = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + } catch (err) { + this.showMessage('Serialization failed: ' + err); + } + } else { + projectData = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + } + } + SpriteMorph.prototype.initBlocks(); + this.spriteBar.tabBar.tabTo('scripts'); + this.createCategories(); + this.categories.refreshEmpty(); + this.createCorralBar(); + this.fixLayout(); + if (this.loadNewProject) { + this.newProject(); + location.hash = urlBar; + if (callback) {callback.call(this); } + } else { + this.openProjectString(projectData, callback); + } + if (!noSave) { + this.saveSetting('language', lang); + } +}; + +// IDE_Morph blocks scaling + +IDE_Morph.prototype.userSetBlocksScale = function () { + var scrpt, + blck, + shield, + sample, + action, + dlg; + + scrpt = new CommandBlockMorph(); + scrpt.color = SpriteMorph.prototype.blockColor.motion; + scrpt.setSpec(localize('build')); + blck = new CommandBlockMorph(); + blck.color = SpriteMorph.prototype.blockColor.sound; + blck.setSpec(localize('your own')); + scrpt.nextBlock(blck); + blck = new CommandBlockMorph(); + blck.color = SpriteMorph.prototype.blockColor.operators; + blck.setSpec(localize('blocks')); + scrpt.bottomBlock().nextBlock(blck); + /* + blck = SpriteMorph.prototype.blockForSelector('doForever'); + blck.inputs()[0].nestedBlock(scrpt); + */ + + sample = new FrameMorph(); + sample.acceptsDrops = false; + sample.color = IDE_Morph.prototype.groupColor; + if (SyntaxElementMorph.prototype.alpha > 0.8) { + sample.cachedTexture = this.scriptsPaneTexture; + } + sample.setExtent(new Point(250, 180)); + scrpt.setPosition(sample.position().add(10)); + sample.add(scrpt); + + shield = new Morph(); + shield.alpha = 0; + shield.setExtent(sample.extent()); + shield.setPosition(sample.position()); + sample.add(shield); + + action = (num) => { + scrpt.blockSequence().forEach(block => { + block.setScale(num); + block.setSpec(block.blockSpec); + }); + scrpt.fullChanged(); + }; + + dlg = new DialogBoxMorph( + null, + num => this.setBlocksScale(Math.min(num, 12)) + ).withKey('zoomBlocks'); + if (MorphicPreferences.isTouchDevice) { + dlg.isDraggable = false; + } + dlg.prompt( + 'Zoom blocks', + SyntaxElementMorph.prototype.scale.toString(), + this.world(), + sample, // pic + { + 'normal (1x)' : 1, + 'demo (1.2x)' : 1.2, + 'presentation (1.4x)' : 1.4, + 'big (2x)' : 2, + 'huge (4x)' : 4, + 'giant (8x)' : 8, + 'monstrous (10x)' : 10 + }, + false, // read only? + true, // numeric + 1, // slider min + 5, // slider max + action // slider action + ); +}; + +IDE_Morph.prototype.setBlocksScale = function (num) { + var projectData; + this.scene.captureGlobalSettings(); + if (Process.prototype.isCatchingErrors) { + try { + projectData = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + } catch (err) { + this.showMessage('Serialization failed: ' + err); + } + } else { + projectData = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + } + SyntaxElementMorph.prototype.setScale(num); + CommentMorph.prototype.refreshScale(); + SpriteMorph.prototype.initBlocks(); + this.spriteBar.tabBar.tabTo('scripts'); + this.createCategories(); + this.categories.refreshEmpty(); + this.createCorralBar(); + this.fixLayout(); + this.openProjectString(projectData); + this.saveSetting('zoom', num); +}; + +// IDE_Morph blocks fading + +IDE_Morph.prototype.userFadeBlocks = function () { + var dlg, + initial = 100 - (SyntaxElementMorph.prototype.alpha * 100); + + dlg = new DialogBoxMorph( + null, + num => this.setBlockTransparency(num, true) // and save setting + ).withKey('fadeBlocks'); + if (MorphicPreferences.isTouchDevice) { + dlg.isDraggable = false; + } + + dlg.cancel = () => { + this.setBlockTransparency(initial); + dlg.destroy(); + }; + + dlg.prompt( + 'Fade blocks', + initial.toString(), + this.world(), + null, // pic + { + 'block-solid (0)' : 0, + 'medium (50)' : 50, + 'light (70)' : 70, + 'shimmering (80)' : 80, + 'elegant (90)' : 90, + 'subtle (95)' : 95, + 'text-only (100)' : 100 + }, + false, // read only? + true, // numeric + 0, // slider min + 100, // slider max + num => this.setBlockTransparency(num), // slider action + 0 // decimals + ); +}; + +IDE_Morph.prototype.setBlockTransparency = function (num, save) { + SyntaxElementMorph.prototype.setAlphaScaled(100 - num); + this.changed(); + if (save) { + if (num === 0) { + this.removeSetting('fade'); + } else { + this.saveSetting('fade', num); + } + } +}; + +// IDE_Morph stage size manipulation + +IDE_Morph.prototype.userSetStageSize = function () { + new DialogBoxMorph( + this, + this.setStageExtent, + this + ).promptVector( + "Stage size", + this.stage.dimensions, + new Point(480, 360), + 'Stage width', + 'Stage height', + this.world(), + null, // pic + null // msg + ); +}; + +IDE_Morph.prototype.setStageExtent = function (aPoint) { + var myself = this, + world = this.world(), + ext = aPoint.max(new Point(240, 180)); + + function zoom() { + myself.step = function () { + var delta = ext.subtract( + myself.stage.dimensions + ).divideBy(2); + if (delta.abs().lt(new Point(5, 5))) { + myself.stage.dimensions = ext; + delete myself.step; + } else { + myself.stage.dimensions = + myself.stage.dimensions.add(delta); + } + myself.stage.setExtent(myself.stage.dimensions); + myself.stage.clearPenTrails(); + myself.fixLayout(); + this.setExtent(world.extent()); + }; + } + + this.stageRatio = 1; + this.isSmallStage = false; + this.controlBar.stageSizeButton.refresh(); + this.stage.stopVideo(); + this.setExtent(world.extent()); + Costume.prototype.maxDimensions = aPoint; + this.stage.stopVideo(); + this.stage.stopProjection(); + if (this.isAnimating) { + zoom(); + } else { + this.stage.dimensions = ext; + this.stage.setExtent(this.stage.dimensions); + this.stage.clearPenTrails(); + this.fixLayout(); + this.setExtent(world.extent()); + } +}; + +// IDE_Morph dragging threshold (internal feature) + +IDE_Morph.prototype.userSetDragThreshold = function () { + new DialogBoxMorph( + this, + num => MorphicPreferences.grabThreshold = Math.min( + Math.max(+num, 0), + 200 + ), + this + ).prompt( + "Dragging threshold", + MorphicPreferences.grabThreshold.toString(), + this.world(), + null, // pic + null, // choices + null, // read only + true // numeric + ); +}; + +// IDE_Morph cloud interface + +IDE_Morph.prototype.initializeCloud = function () { + var world = this.world(); + new DialogBoxMorph( + null, + user => this.cloud.login( + user.username.toLowerCase(), + user.password, + user.choice, + (username, role, response) => { + sessionStorage.username = username; + this.controlBar.cloudButton.refresh(); + this.source = 'cloud'; + if (!isNil(response.days_left)) { + var duration = response.days_left + ' day' + + (response.days_left > 1 ? 's' : ''); + new DialogBoxMorph().inform( + 'Unverified account: ' + duration + ' left' + + 'You are now logged in, and your account\n' + + 'is enabled for ' + duration + '.\n' + + 'Please use the verification link that\n' + + 'was sent to your email address when you\n' + + 'signed up.\n\n' + + 'If you cannot find that email, please\n' + + 'check your spam folder. If you still\n' + + 'cannot find it, please use the "Resend\n' + + 'Verification Email..." option in the cloud\n' + + 'menu.\n\n' + + 'You have ' + duration + ' left.', + world, + this.cloudIcon(null, new Color(0, 180, 0)) + ); + } else if (response.title) { + new DialogBoxMorph().inform( + response.title, + response.message, + world, + this.cloudIcon(null, new Color(0, 180, 0)) + ); + } else { + this.showMessage(response.message, 2); + } + }, + this.cloudError() + ) + ).withKey('cloudlogin').promptCredentials( + 'Sign in', + 'login', + null, + null, + null, + null, + 'stay signed in on this computer\nuntil logging out', + world, + this.cloudIcon(), + this.cloudMsg + ); +}; + +IDE_Morph.prototype.createCloudAccount = function () { + var world = this.world(); + + new DialogBoxMorph( + null, + user => this.cloud.signup( + user.username, + user.password, + user.passwordRepeat, + user.email, + (txt, title) => new DialogBoxMorph().inform( + title, + txt + '.\n\nYou can now log in.', + world, + this.cloudIcon(null, new Color(0, 180, 0)) + ), + this.cloudError() + ) + ).withKey('cloudsignup').promptCredentials( + 'Sign up', + 'signup', + 'https://snap.berkeley.edu/tos.html', + 'Terms of Service...', + 'https://snap.berkeley.edu/privacy.html', + 'Privacy...', + 'I have read and agree\nto the Terms of Service', + world, + this.cloudIcon(), + this.cloudMsg + ); +}; + +IDE_Morph.prototype.resetCloudPassword = function () { + var world = this.world(); + + new DialogBoxMorph( + null, + user => this.cloud.resetPassword( + user.username, + (txt, title) => new DialogBoxMorph().inform( + title, + txt + + '\n\nAn e-mail with a link to\n' + + 'reset your password\n' + + 'has been sent to the address provided', + world, + this.cloudIcon(null, new Color(0, 180, 0)) + ), + this.cloudError() + ) + ).withKey('cloudresetpassword').promptCredentials( + 'Reset password', + 'resetPassword', + null, + null, + null, + null, + null, + world, + this.cloudIcon(), + this.cloudMsg + ); +}; + +IDE_Morph.prototype.resendVerification = function () { + var world = this.world(); + + new DialogBoxMorph( + null, + user => this.cloud.resendVerification( + user.username, + (txt, title) => new DialogBoxMorph().inform( + title, + txt, + world, + this.cloudIcon(null, new Color(0, 180, 0)) + ), + this.cloudError() + ) + ).withKey('cloudresendverification').promptCredentials( + 'Resend verification email', + 'resendVerification', + null, + null, + null, + null, + null, + world, + this.cloudIcon(), + this.cloudMsg + ); +}; + +IDE_Morph.prototype.changeCloudPassword = function () { + var world = this.world(); + + new DialogBoxMorph( + null, + user => this.cloud.changePassword( + user.oldpassword, + user.password, + user.passwordRepeat, + () => this.showMessage('password has been changed.', 2), + this.cloudError() + ) + ).withKey('cloudpassword').promptCredentials( + 'Change Password', + 'changePassword', + null, + null, + null, + null, + null, + world, + this.cloudIcon(), + this.cloudMsg + ); +}; + +IDE_Morph.prototype.logout = function () { + this.cloud.logout( + () => { + delete(sessionStorage.username); + this.controlBar.cloudButton.refresh(); + this.showMessage('disconnected.', 2); + }, + () => { + delete(sessionStorage.username); + this.controlBar.cloudButton.refresh(); + this.showMessage('disconnected.', 2); + } + ); +}; + +IDE_Morph.prototype.buildProjectRequest = function () { + var proj = new Project(this.scenes, this.scene), + body, + xml; + + this.scene.captureGlobalSettings(); + this.serializer.isCollectingMedia = true; + xml = this.serializer.serialize(proj); + body = { + notes: proj.notes, + xml: xml, + /* + media: this.hasChangedMedia ? // incremental media upload, disabled + this.serializer.mediaXML(proj.name) : null, + */ + media: this.serializer.mediaXML(proj.name), + thumbnail: proj.thumbnail.toDataURL(), + remixID: this.stage.remixID + }; + this.serializer.isCollectingMedia = false; + this.serializer.flushMedia(); + + return body; +}; + +IDE_Morph.prototype.verifyProject = function (body) { + // Ensure the project is less than 10MB and serializes correctly. + var encodedBody = JSON.stringify(body); + if (encodedBody.length > Cloud.MAX_FILE_SIZE) { + new DialogBoxMorph().inform( + 'Snap!Cloud - Cannot Save Project', + 'The media inside this project exceeds 10 MB.\n' + + 'Please reduce the size of costumes or sounds.\n', + this.world(), + this.cloudIcon(null, new Color(180, 0, 0)) + ); + return false; + } + + // console.log(encodedBody.length); + // check if serialized data can be parsed back again + try { + this.serializer.parse(body.xml); + } catch (err) { + this.showMessage('Serialization of program data failed:\n' + err); + return false; + } + if (body.media !== null) { + try { + this.serializer.parse(body.media); + } catch (err) { + this.showMessage('Serialization of media failed:\n' + err); + return false; + } + } + this.serializer.isCollectingMedia = false; + this.serializer.flushMedia(); + + return encodedBody.length; +}; + +IDE_Morph.prototype.saveProjectToCloud = function (name) { + var projectBody, projectSize; + + if (name) { + name = this.setProjectName(name); + } + + this.showMessage('Saving project\nto the cloud...'); + projectBody = this.buildProjectRequest(); + projectSize = this.verifyProject(projectBody); + if (!projectSize) {return; } // Invalid Projects don't return anything. + this.showMessage( + 'Uploading ' + Math.round(projectSize / 1024) + ' KB...' + ); + this.cloud.saveProject( + this.getProjectName(), + projectBody, + () => { + this.recordSavedChanges(); + this.showMessage('saved.', 2); + }, + this.cloudError() + ); +}; + +IDE_Morph.prototype.exportProjectMedia = function (name) { + var menu, media; + this.scene.captureGlobalSettings(); + this.serializer.isCollectingMedia = true; + if (name) { + this.setProjectName(name); + try { + menu = this.showMessage('Exporting'); + this.serializer.serialize(new Project(this.scenes, this.scene)); + media = this.serializer.mediaXML(name); + this.saveXMLAs(media, this.getProjectName() + ' media'); + menu.destroy(); + this.showMessage('Exported!', 1); + } catch (err) { + if (Process.prototype.isCatchingErrors) { + this.serializer.isCollectingMedia = false; + this.showMessage('Export failed: ' + err); + } else { + throw err; + } + } + } + this.serializer.isCollectingMedia = false; + this.serializer.flushMedia(); + // this.hasChangedMedia = false; +}; + +IDE_Morph.prototype.exportProjectNoMedia = function (name) { + var menu, str; + this.scene.captureGlobalSettings(); + this.serializer.isCollectingMedia = true; + if (name) { + name = this.setProjectName(name); + if (Process.prototype.isCatchingErrors) { + try { + menu = this.showMessage('Exporting'); + str = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + this.saveXMLAs(str, name); + menu.destroy(); + this.showMessage('Exported!', 1); + } catch (err) { + this.serializer.isCollectingMedia = false; + this.showMessage('Export failed: ' + err); + } + } else { + menu = this.showMessage('Exporting'); + str = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + this.saveXMLAs(str, name); + menu.destroy(); + this.showMessage('Exported!', 1); + } + } + this.serializer.isCollectingMedia = false; + this.serializer.flushMedia(); +}; + +IDE_Morph.prototype.exportProjectAsCloudData = function (name) { + var menu, str, media, dta; + this.scene.captureGlobalSettings(); + this.serializer.isCollectingMedia = true; + if (name) { + name = this.setProjectName(name); + if (Process.prototype.isCatchingErrors) { + try { + menu = this.showMessage('Exporting'); + str = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + media = this.serializer.mediaXML(name); + dta = '' + str + media + ''; + this.saveXMLAs(dta, name); + menu.destroy(); + this.showMessage('Exported!', 1); + } catch (err) { + this.serializer.isCollectingMedia = false; + this.showMessage('Export failed: ' + err); + } + } else { + menu = this.showMessage('Exporting'); + str = this.serializer.serialize( + new Project(this.scenes, this.scene) + ); + media = this.serializer.mediaXML(name); + dta = '' + str + media + ''; + this.saveXMLAs(str, name); + menu.destroy(); + this.showMessage('Exported!', 1); + } + } + this.serializer.isCollectingMedia = false; + this.serializer.flushMedia(); + // this.hasChangedMedia = false; +}; + +IDE_Morph.prototype.cloudAcknowledge = function () { + return (responseText, url) => { + nop(responseText); + new DialogBoxMorph().inform( + 'Cloud Connection', + 'Successfully connected to:\n' + + 'http://' + + url, + this.world(), + this.cloudIcon(null, new Color(0, 180, 0)) + ); + }; +}; + +IDE_Morph.prototype.cloudResponse = function () { + return (responseText, url) => { + var response = responseText; + if (response.length > 50) { + response = response.substring(0, 50) + '...'; + } + new DialogBoxMorph().inform( + 'Snap!Cloud', + 'http://' + + url + ':\n\n' + + 'responds:\n' + + response, + this.world(), + this.cloudIcon(null, new Color(0, 180, 0)) + ); + }; +}; + +IDE_Morph.prototype.cloudError = function () { + return (responseText, url) => { + // first, try to find out an explanation for the error + // and notify the user about it, + // if none is found, show an error dialog box + var response = responseText, + // explanation = getURL('https://snap.berkeley.edu/cloudmsg.txt'), + explanation = null; + if (this.shield) { + this.shield.destroy(); + this.shield = null; + } + if (explanation) { + this.showMessage(explanation); + return; + } + new DialogBoxMorph().inform( + 'Snap!Cloud', + (url ? url + '\n' : '') + + response, + this.world(), + this.cloudIcon(null, new Color(180, 0, 0)) + ); + }; +}; + +IDE_Morph.prototype.cloudIcon = function (height, color) { + var clr = color || DialogBoxMorph.prototype.titleBarColor, + isFlat = MorphicPreferences.isFlat, + icon = new SymbolMorph( + isFlat ? 'cloud' : 'cloudGradient', + height || 50, + clr, + isFlat ? null : new Point(-1, -1), + clr.darker(50) + ); + if (!isFlat) { + icon.addShadow(new Point(1, 1), 1, clr.lighter(95)); + } + return icon; +}; + +IDE_Morph.prototype.setCloudURL = function () { + new DialogBoxMorph( + null, + url => { + this.cloud.url = url; + this.cloud.checkCredentials( + () => this.controlBar.cloudButton.refresh(), + () => this.controlBar.cloudButton.refresh() + ); + } + ).withKey('cloudURL').prompt( + 'Cloud URL', + this.cloud.url, + this.world(), + null, + this.cloud.knownDomains + ); +}; + +IDE_Morph.prototype.urlParameters = function () { + var parameters = location.hash.slice(location.hash.indexOf(':') + 1); + return this.cloud.parseDict(parameters); +}; + +IDE_Morph.prototype.hasCloudProject = function () { + var params = this.urlParameters(); + return params.hasOwnProperty('Username') && + params.hasOwnProperty('ProjectName'); +}; + +// IDE_Morph HTTP data fetching + +IDE_Morph.prototype.getURL = function (url, callback, responseType) { + // fetch the contents of a url and pass it into the specified callback. + // If no callback is specified synchronously fetch and return it + // Note: Synchronous fetching has been deprecated and should be switched + // Note: Do Not attemp to prevent caching of requests. + // This has caused issues for BJC and the finch. + var request = new XMLHttpRequest(), + async = callback instanceof Function, + rsp; + if (async) { + request.responseType = responseType || 'text'; + } + rsp = (!async || request.responseType === 'text') ? 'responseText' + : 'response'; + try { + request.open('GET', url, async); + if (async) { + request.onreadystatechange = () => { + if (request.readyState === 4) { + if (request[rsp]) { + callback.call( + this, + request[rsp] + ); + } else { + this.showMessage('unable to retrieve ' + url); + throw new Error('unable to retrieve ' + url); + } + } + }; + } + request.send(); + if (!async) { + if (request.status === 200) { + return request[rsp]; + } + throw new Error('unable to retrieve ' + url); + } + } catch (err) { + this.showMessage(err.toString()); + if (async) { + callback.call(this); + } else { + return request[rsp]; + } + } +}; + +// IDE_Morph serialization helper ops + +IDE_Morph.prototype.blocksLibraryXML = function ( + definitions, + moreCategories, + asFile, + dataFrame, // optional: include global variable dependencies in libraries + localData // optional: include sprite-local variable dependencies +) { + // answer an XML string encoding of an array of CustomBlockDefinitions + var globals = definitions.filter(def => def.isGlobal), + locals = definitions.filter(def => !def.isGlobal), + glbStr = globals.length ? this.serializer.serialize(globals, true) : '', + locStr = locals.length ? this.serializer.serialize(locals, true) : '', + dtaStr = dataFrame && dataFrame.names(true).length ? + this.serializer.serialize(dataFrame, true) + : '', + ldtStr = localData && localData.names(true).length ? + this.serializer.serialize(localData, true) + : '', + cats = moreCategories || [], + appStr = ' app="' + + this.serializer.app + + '" version="' + + this.serializer.version + + '"'; + + return '' + + this.paletteXML(definitions.map(def => def.category).concat(cats)) + + (globals.length ? glbStr : '') + + (locals.length ? ('' + locStr + '') : '') + + (dtaStr ? '' + dtaStr + '' : '') + + (ldtStr ? '' + ldtStr + '' : '') + + ''; +}; + +IDE_Morph.prototype.paletteXML = function (categoryNames) { + // answer an XML string containing the palette information + // found in an array of category names + var palette = new Map(); + categoryNames.forEach(cat => { + if (SpriteMorph.prototype.customCategories.has(cat)) { + palette.set( + cat, + SpriteMorph.prototype.customCategories.get(cat) + ); + } + }); + return this.serializer.paletteToXML(palette); +}; + +// IDE_Morph user dialog shortcuts + +IDE_Morph.prototype.showMessage = function (message, secs) { + var m = new MenuMorph(null, message), + intervalHandle; + m.popUpCenteredInWorld(this.world()); + if (secs) { + intervalHandle = setInterval( + () => { + m.destroy(); + clearInterval(intervalHandle); + }, + secs * 1000 + ); + } + return m; +}; + +IDE_Morph.prototype.inform = function (title, message) { + return new DialogBoxMorph().inform( + title, + localize(message), + this.world() + ); +}; + +IDE_Morph.prototype.confirm = function (message, title, action) { + new DialogBoxMorph(null, action).askYesNo( + title, + localize(message), + this.world() + ); +}; + +IDE_Morph.prototype.prompt = function (message, callback, choices, key) { + (new DialogBoxMorph(null, callback)).withKey(key).prompt( + message, + '', + this.world(), + null, + choices + ); +}; + +// IDE_Morph bracing against IE + +IDE_Morph.prototype.warnAboutIE = function () { + var dlg, txt; + if (this.isIE()) { + dlg = new DialogBoxMorph(); + txt = new TextMorph( + 'Please do not use Internet Explorer.\n' + + 'Snap! runs best in a web-standards\n' + + 'compliant browser', + dlg.fontSize, + dlg.fontStyle, + true, + false, + 'center', + null, + null, + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE + ); + + dlg.key = 'IE-Warning'; + dlg.labelString = "Internet Explorer"; + dlg.createLabel(); + dlg.addBody(txt); + dlg.fixLayout(); + dlg.popUp(this.world()); + dlg.nag = true; + } +}; + +IDE_Morph.prototype.isIE = function () { + var ua = navigator.userAgent; + return ua.indexOf("MSIE ") > -1 || ua.indexOf("Trident/") > -1; +}; + +// IDE_Morph warn about saving project in the dev version + +IDE_Morph.prototype.warnAboutDev = function () { + if (!SnapVersion.includes('-dev') || this.config.noDevWarning) { + return; + } + this.inform( + "CAUTION! Development Version", + 'This version of Snap! is being developed.\n' + + '*** It is NOT supported for end users. ***\n' + + 'Saving a project in THIS version is likely to\n' + + 'make it UNUSABLE or DEFECTIVE for current and\n' + + 'even future official versions!\n\n' + + 'visit https://snap.berkeley.edu/run\n' + + 'for the official Snap! installation.' + ).nag = true; +}; + +// ProjectDialogMorph //////////////////////////////////////////////////// + +// ProjectDialogMorph inherits from DialogBoxMorph: + +ProjectDialogMorph.prototype = new DialogBoxMorph(); +ProjectDialogMorph.prototype.constructor = ProjectDialogMorph; +ProjectDialogMorph.uber = DialogBoxMorph.prototype; + +// ProjectDialogMorph instance creation: + +function ProjectDialogMorph(ide, label) { + this.init(ide, label); +} + +ProjectDialogMorph.prototype.init = function (ide, task) { + // additional properties: + this.ide = ide; + this.task = task || 'open'; // String describing what do do (open, save) + this.source = ide.source; + this.projectList = []; // [{name: , thumb: , notes:}] + + this.handle = null; + this.srcBar = null; + this.nameField = null; + this.filterField = null; + this.magnifyingGlass = null; + this.listField = null; + this.preview = null; + this.notesText = null; + this.notesField = null; + this.deleteButton = null; + this.shareButton = null; + this.unshareButton = null; + this.publishButton = null; + this.unpublishButton = null; + this.recoverButton = null; + + // initialize inherited properties: + ProjectDialogMorph.uber.init.call( + this, + this, // target + null, // function + null // environment + ); + + // override inherited properites: + switch (this.task) { + case 'save': + this.labelString = 'Save Project'; + break; + case 'add': + this.labelString = 'Add Scene'; + break; + default: // 'open' + this.task = 'open'; + this.labelString = 'Open Project'; + } + + this.createLabel(); + this.key = 'project' + task; + + // build contents + if ((task === 'open' || task === 'add') && this.source === 'disk') { + // give the user a chance to switch to another source + this.source = null; + this.buildContents(); + this.projectList = []; + this.listField.hide(); + this.source = 'disk'; + } else { + this.buildContents(); + this.onNextStep = () => // yield to show "updating" message + this.setSource(this.source); + } +}; + +ProjectDialogMorph.prototype.buildContents = function () { + var thumbnail, notification; + + this.addBody(new Morph()); + this.body.color = this.color; + + this.srcBar = new AlignmentMorph('column', this.padding / 2); + + if (this.ide.cloudMsg) { + notification = new TextMorph( + this.ide.cloudMsg, + 10, + null, // style + false, // bold + null, // italic + null, // alignment + null, // width + null, // font name + new Point(1, 1), // shadow offset + WHITE // shadowColor + ); + notification.refresh = nop; + this.srcBar.add(notification); + } + + if (!this.ide.cloud.disabled) { + this.addSourceButton('cloud', localize('Cloud'), 'cloud'); + } + + if (this.task === 'open' || this.task === 'add') { + this.buildFilterField(); + this.addSourceButton('examples', localize('Examples'), 'poster'); + if (this.hasLocalProjects() || this.ide.world().currentKey === 16) { + // shift- clicked + this.addSourceButton('local', localize('Browser'), 'globe'); + } + } + this.addSourceButton('disk', localize('Computer'), 'storage'); + + this.srcBar.fixLayout(); + this.body.add(this.srcBar); + + if (this.task === 'save') { + this.nameField = new InputFieldMorph(this.ide.getProjectName()); + this.body.add(this.nameField); + } + + this.listField = new ListMorph([]); + this.fixListFieldItemColors(); + this.listField.fixLayout = nop; + this.listField.edge = InputFieldMorph.prototype.edge; + this.listField.fontSize = InputFieldMorph.prototype.fontSize; + this.listField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.listField.contrast = InputFieldMorph.prototype.contrast; + this.listField.render = InputFieldMorph.prototype.render; + this.listField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.body.add(this.listField); + + this.preview = new Morph(); + this.preview.fixLayout = nop; + this.preview.edge = InputFieldMorph.prototype.edge; + this.preview.fontSize = InputFieldMorph.prototype.fontSize; + this.preview.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.preview.contrast = InputFieldMorph.prototype.contrast; + this.preview.render = function (ctx) { + InputFieldMorph.prototype.render.call(this, ctx); + if (this.cachedTexture) { + this.renderCachedTexture(ctx); + } else if (this.texture) { + this.renderTexture(this.texture, ctx); + } + }; + this.preview.renderCachedTexture = function (ctx) { + ctx.drawImage(this.cachedTexture, this.edge, this.edge); + }; + this.preview.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + this.preview.setExtent( + this.ide.serializer.thumbnailSize.add(this.preview.edge * 2) + ); + + this.body.add(this.preview); + if (this.task === 'save') { + thumbnail = this.ide.scenes.at(1).stage.thumbnail( + SnapSerializer.prototype.thumbnailSize + ); + this.preview.texture = null; + this.preview.cachedTexture = thumbnail; + this.preview.rerender(); + } + + this.notesField = new ScrollFrameMorph(); + this.notesField.fixLayout = nop; + + this.notesField.edge = InputFieldMorph.prototype.edge; + this.notesField.fontSize = InputFieldMorph.prototype.fontSize; + this.notesField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.notesField.contrast = InputFieldMorph.prototype.contrast; + this.notesField.render = InputFieldMorph.prototype.render; + this.notesField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.notesField.acceptsDrops = false; + this.notesField.contents.acceptsDrops = false; + + if (this.task === 'open' || this.task === 'add') { + this.notesText = new TextMorph(''); + } else { // 'save' + this.notesText = new TextMorph(this.ide.getProjectNotes()); + this.notesText.isEditable = true; + this.notesText.enableSelecting(); + } + + this.notesField.isTextLineWrapping = true; + this.notesField.padding = 3; + this.notesField.setContents(this.notesText); + this.notesField.setWidth(this.preview.width()); + + this.body.add(this.notesField); + + if (this.task === 'open') { + this.addButton('openProject', 'Open'); + this.action = 'openProject'; + this.recoverButton = this.addButton('recoveryDialog', 'Recover', true); + this.recoverButton.hide(); + } else if (this.task === 'add') { + this.addButton('addScene', 'Add'); + this.action = 'addScene'; + this.recoverButton = this.addButton('recoveryDialog', 'Recover', true); + this.recoverButton.hide(); + } else { // 'save' + this.addButton('saveProject', 'Save'); + this.action = 'saveProject'; + } + this.shareButton = this.addButton('shareProject', 'Share', true); + this.unshareButton = this.addButton('unshareProject', 'Unshare', true); + this.shareButton.hide(); + this.unshareButton.hide(); + this.publishButton = this.addButton('publishProject', 'Publish', true); + this.unpublishButton = this.addButton( + 'unpublishProject', + 'Unpublish', + true + ); + this.publishButton.hide(); + this.unpublishButton.hide(); + this.deleteButton = this.addButton('deleteProject', 'Delete'); + this.addButton('cancel', 'Cancel'); + + if (notification) { + this.setExtent(new Point(500, 360).add(notification.extent())); + } else { + this.setExtent(new Point(500, 360)); + } + this.fixLayout(); + +}; + +ProjectDialogMorph.prototype.popUp = function (wrrld) { + var world = wrrld || this.ide.world(); + if (world) { + ProjectDialogMorph.uber.popUp.call(this, world); + this.handle = new HandleMorph( + this, + 350, + 330, + this.corner, + this.corner + ); + } +}; + +// ProjectDialogMorph action buttons + +ProjectDialogMorph.prototype.createButtons = function () { + if (this.buttons) { + this.buttons.destroy(); + } + this.buttons = new AlignmentMorph('column', this.padding / 3); + this.buttons.bottomRow = new AlignmentMorph('row', this.padding); + this.buttons.topRow = new AlignmentMorph('row', this.padding); + this.buttons.add(this.buttons.topRow); + this.buttons.add(this.buttons.bottomRow); + this.add(this.buttons); + + this.buttons.fixLayout = function () { + if (this.topRow.children.some(function (any) { + return any.isVisible; + })) { + this.topRow.show(); + this.topRow.fixLayout(); + } else { + this.topRow.hide(); + } + this.bottomRow.fixLayout(); + AlignmentMorph.prototype.fixLayout.call(this); + }; +}; + +ProjectDialogMorph.prototype.addButton = function (action, label, topRow) { + var button = new PushButtonMorph( + this, + action || 'ok', + ' ' + localize((label || 'OK')) + ' ' + ); + button.fontSize = this.buttonFontSize; + button.corner = this.buttonCorner; + button.edge = this.buttonEdge; + button.outline = this.buttonOutline; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + button.padding = this.buttonPadding; + button.contrast = this.buttonContrast; + button.fixLayout(); + if (topRow) { + this.buttons.topRow.add(button); + } else { + this.buttons.bottomRow.add(button); + } + return button; +}; + +// ProjectDialogMorph source buttons + +ProjectDialogMorph.prototype.addSourceButton = function ( + source, + label, + symbol +) { + var lbl1 = new StringMorph( + label, + 10, + null, + true, + null, + null, + new Point(1, 1), + WHITE + ), + lbl2 = new StringMorph( + label, + 10, + null, + true, + null, + null, + new Point(-1, -1), + this.titleBarColor.darker(50), + WHITE + ), + l1 = new Morph(), + l2 = new Morph(), + button; + + lbl1.add(new SymbolMorph( + symbol, + 24, + this.titleBarColor.darker(20), + new Point(1, 1), + this.titleBarColor.darker(50) + )); + lbl1.children[0].setCenter(lbl1.center()); + lbl1.children[0].setBottom(lbl1.top() - this.padding / 2); + + l1.isCachingImage = true; + l1.cachedImage = lbl1.fullImage(); + l1.bounds = lbl1.fullBounds(); + + lbl2.add(new SymbolMorph( + symbol, + 24, + WHITE, + new Point(-1, -1), + this.titleBarColor.darker(50) + )); + lbl2.children[0].setCenter(lbl2.center()); + lbl2.children[0].setBottom(lbl2.top() - this.padding / 2); + + l2.isCachingImage = true; + l2.cachedImage = lbl2.fullImage(); + l2.bounds = lbl2.fullBounds(); + + button = new ToggleButtonMorph( + null, //colors, + this, // the ProjectDialog is the target + () => this.setSource(source), // action + [l1, l2], + () => this.source === source // query + ); + + button.corner = this.buttonCorner; + button.edge = this.buttonEdge; + button.outline = this.buttonOutline; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + button.labelMinExtent = new Point(60, 0); + button.padding = this.buttonPadding; + button.contrast = this.buttonContrast; + button.pressColor = this.titleBarColor.darker(20); + button.fixLayout(); + button.refresh(); + this.srcBar.add(button); +}; + +// ProjectDialogMorph list field control + +ProjectDialogMorph.prototype.fixListFieldItemColors = function () { + // remember to always fixLayout() afterwards for the changes + // to take effect + this.listField.contents.children[0].alpha = 0; + this.listField.contents.children[0].children.forEach(item => { + item.pressColor = this.titleBarColor.darker(20); + item.color = new Color(0, 0, 0, 0); + }); +}; + +// ProjectDialogMorph filter field + +ProjectDialogMorph.prototype.buildFilterField = function () { + var myself = this; + + this.filterField = new InputFieldMorph(''); + this.magnifyingGlass = new SymbolMorph( + 'magnifyingGlass', + this.filterField.height(), + this.titleBarColor.darker(50) + ); + + this.body.add(this.magnifyingGlass); + this.body.add(this.filterField); + + this.filterField.reactToInput = function (evt) { + var text = this.getValue(); + + myself.listField.elements = + myself.projectList.filter(aProject => { + var name = aProject.projectname || aProject.name, + notes = aProject.notes || ''; + return name.toLowerCase().indexOf(text.toLowerCase()) > -1 || + notes.toLowerCase().indexOf(text.toLowerCase()) > -1; + }); + + if (myself.listField.elements.length === 0) { + myself.listField.elements.push('(no matches)'); + } + + myself.clearDetails(); + myself.listField.buildListContents(); + myself.fixListFieldItemColors(); + myself.listField.adjustScrollBars(); + myself.listField.scrollY(myself.listField.top()); + myself.fixLayout(); + }; +}; + +// ProjectDialogMorph ops + +ProjectDialogMorph.prototype.setSource = function (source) { + var msg, setting; + + this.source = source; + this.srcBar.children.forEach(button => + button.refresh() + ); + + switch (this.source) { + case 'cloud': + msg = this.ide.showMessage('Updating\nproject list...'); + this.projectList = []; + this.ide.cloud.getProjectList( + response => { + // Don't show cloud projects if user has since switched panes. + if (this.source === 'cloud') { + this.installCloudProjectList(response.projects); + } + msg.destroy(); + }, + (err, lbl) => { + msg.destroy(); + this.ide.cloudError().call(null, err, lbl); + } + ); + return; + case 'examples': + this.projectList = this.getExamplesProjectList(); + break; + case 'local': + // deprecated, only for reading + this.projectList = this.getLocalProjectList(); + break; + case 'disk': + if (this.task === 'save') { + this.projectList = []; + } else { + this.destroy(); + if (this.task === 'add') { + setting = this.ide.isAddingScenes; + this.ide.isAddingScenes = true; + this.ide.importLocalFile(); + this.ide.isAddingScenes = setting; + } else { + this.ide.importLocalFile(); + } + return; + } + break; + } + + this.listField.destroy(); + this.listField = new ListMorph( + this.projectList, + this.projectList.length > 0 ? + (element) => {return element.name || element; } + : null, + null, + () => this.ok() + ); + if (this.source === 'disk') { + this.listField.hide(); + } + + this.fixListFieldItemColors(); + this.listField.fixLayout = nop; + this.listField.edge = InputFieldMorph.prototype.edge; + this.listField.fontSize = InputFieldMorph.prototype.fontSize; + this.listField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.listField.contrast = InputFieldMorph.prototype.contrast; + this.listField.render = InputFieldMorph.prototype.render; + this.listField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + if (this.source === 'local') { + this.listField.action = (item) => { + var src, xml; + if (item === undefined) {return; } + if (this.nameField) { + this.nameField.setContents(item.name || ''); + } + if (this.task === 'open') { + src = localStorage['-snap-project-' + item.name]; + if (src) { + xml = this.ide.serializer.parse(src); + this.notesText.text = + xml.childNamed('notes').contents || ''; + this.notesText.rerender(); + this.notesField.contents.adjustBounds(); + this.preview.texture = + xml.childNamed('thumbnail').contents || null; + this.preview.cachedTexture = null; + this.preview.rerender(); + } + } + this.edit(); + }; + } else { // 'examples'; 'cloud' is initialized elsewhere + this.listField.action = (item) => { + var src, xml; + if (item === undefined) {return; } + if (this.nameField) { + this.nameField.setContents(item.name || ''); + } + src = this.ide.getURL( + this.ide.resourceURL('Examples', item.fileName) + ); + xml = this.ide.serializer.parse(src); + this.notesText.text = xml.childNamed('notes').contents || ''; + this.notesText.rerender(); + this.notesField.contents.adjustBounds(); + this.preview.texture = xml.childNamed('thumbnail').contents || null; + this.preview.cachedTexture = null; + this.preview.rerender(); + this.edit(); + }; + } + this.body.add(this.listField); + this.shareButton.hide(); + this.unshareButton.hide(); + + if (this.task === 'open' || this.task === 'add') { + this.recoverButton.hide(); + } + + this.publishButton.hide(); + this.unpublishButton.hide(); + if (this.source === 'local') { + this.deleteButton.show(); + } else { // examples + this.deleteButton.hide(); + } + this.buttons.fixLayout(); + this.fixLayout(); + if (this.task === 'open' || this.task === 'add') { + this.clearDetails(); + } +}; + +ProjectDialogMorph.prototype.hasLocalProjects = function () { + // check and report whether old projects still exist in the + // browser's local storage, which as of v5 has been deprecated, + // so the user can recover and move them elsewhere + return Object.keys(localStorage).some(any => + any.indexOf('-snap-project-') === 0 + ); +}; + +ProjectDialogMorph.prototype.getLocalProjectList = function () { + var stored, name, dta, + projects = []; + for (stored in localStorage) { + if (Object.prototype.hasOwnProperty.call(localStorage, stored) + && stored.substr(0, 14) === '-snap-project-') { + name = stored.substr(14); + dta = { + name: name, + thumb: null, + notes: null + }; + projects.push(dta); + } + } + projects.sort((x, y) => + x.name.toLowerCase() < y.name.toLowerCase() ? -1 : 1 + ); + return projects; +}; + +ProjectDialogMorph.prototype.getExamplesProjectList = function () { + return this.ide.getMediaList('Examples'); +}; + +ProjectDialogMorph.prototype.installCloudProjectList = function (pl) { + this.projectList = pl[0] ? pl : []; + this.projectList.sort((x, y) => + x.projectname.toLowerCase() < y.projectname.toLowerCase() ? -1 : 1 + ); + + this.listField.destroy(); + this.listField = new ListMorph( + this.projectList, + this.projectList.length > 0 ? + (element) => {return element.projectname || element; } + : null, + [ // format: display shared project names bold + [ + 'bold', + proj => proj.ispublic + ], + [ + 'italic', + proj => proj.ispublished + ] + ], + () => this.ok() + ); + this.fixListFieldItemColors(); + this.listField.fixLayout = nop; + this.listField.edge = InputFieldMorph.prototype.edge; + this.listField.fontSize = InputFieldMorph.prototype.fontSize; + this.listField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.listField.contrast = InputFieldMorph.prototype.contrast; + this.listField.render = InputFieldMorph.prototype.render; + this.listField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.listField.action = (item) => { + if (item === undefined) {return; } + if (this.nameField) { + this.nameField.setContents(item.projectname || ''); + } + if (this.task === 'open' || this.task === 'add') { + this.notesText.text = item.notes || ''; + this.notesText.rerender(); + this.notesField.contents.adjustBounds(); + this.preview.texture = ''; + this.preview.rerender(); + // we ask for the thumbnail when selecting a project + this.ide.cloud.getThumbnail( + null, // username is implicit + item.projectname, + thumbnail => { + this.preview.texture = thumbnail; + this.preview.cachedTexture = null; + this.preview.rerender(); + }); + new SpeechBubbleMorph(new TextMorph( + localize('last changed') + '\n' + item.lastupdated, + null, + null, + null, + null, + 'center' + )).popUp( + this.world(), + this.preview.rightCenter().add(new Point(2, 0)) + ); + } + if (item.ispublic) { + this.shareButton.hide(); + this.unshareButton.show(); + if (item.ispublished) { + this.publishButton.hide(); + this.unpublishButton.show(); + } else { + this.publishButton.show(); + this.unpublishButton.hide(); + } + } else { + this.unshareButton.hide(); + this.shareButton.show(); + this.publishButton.hide(); + this.unpublishButton.hide(); + } + this.buttons.fixLayout(); + this.fixLayout(); + this.edit(); + }; + this.body.add(this.listField); + if (this.task === 'open' || this.task === 'add') { + this.recoverButton.show(); + } + this.shareButton.show(); + this.unshareButton.hide(); + this.deleteButton.show(); + this.buttons.fixLayout(); + this.fixLayout(); + if (this.task === 'open' || this.task === 'add') { + this.clearDetails(); + } +}; + +ProjectDialogMorph.prototype.clearDetails = function () { + this.notesText.text = ''; + this.notesText.rerender(); + this.notesField.contents.adjustBounds(); + this.preview.texture = null; + this.preview.cachedTexture = null; + this.preview.rerender(); +}; + +ProjectDialogMorph.prototype.recoveryDialog = function () { + var proj = this.listField.selected; + if (!proj) {return; } + this.removeShadow(); + this.hide(); + new ProjectRecoveryDialogMorph(this.ide, proj.projectname, this).popUp(); +}; + +ProjectDialogMorph.prototype.addScene = function () { + var proj = this.listField.selected, + src; + if (!proj) {return; } + this.ide.isAddingNextScene = true; + this.ide.source = this.source; + if (this.source === 'cloud') { + this.addCloudScene(proj); + } else if (this.source === 'examples') { + // Note "file" is a property of the parseResourceFile function. + src = this.ide.getURL(this.ide.resourceURL('Examples', proj.fileName)); + this.ide.openProjectString(src); + this.destroy(); + + } else { // 'local' + this.ide.source = null; + this.ide.openProjectName(proj.name); + this.destroy(); + } +}; + +ProjectDialogMorph.prototype.openProject = function () { + var proj = this.listField.selected, + src; + if (!proj) {return; } + this.ide.source = this.source; + if (this.source === 'cloud') { + this.openCloudProject(proj); + } else if (this.source === 'examples') { + // Note "file" is a property of the parseResourceFile function. + src = this.ide.getURL(this.ide.resourceURL('Examples', proj.fileName)); + this.ide.backup(() => this.ide.openProjectString(src)); + this.destroy(); + + } else { // 'local' + this.ide.source = null; + this.ide.backup(() => this.ide.openProjectName(proj.name)); + this.destroy(); + } +}; + +ProjectDialogMorph.prototype.addCloudScene = function (project, delta) { + // no need to backup + this.ide.nextSteps([ + () => this.ide.showMessage('Fetching project\nfrom the cloud...'), + () => this.rawOpenCloudProject(project, delta) + ]); +}; + +ProjectDialogMorph.prototype.openCloudProject = function (project, delta) { + this.ide.backup( + () => { + this.ide.nextSteps([ + () => this.ide.showMessage('Fetching project\nfrom the cloud...'), + () => this.rawOpenCloudProject(project, delta) + ]); + } + ); +}; + +ProjectDialogMorph.prototype.rawOpenCloudProject = function (proj, delta) { + this.ide.cloud.getProject( + proj.projectname, + delta, + clouddata => { + this.ide.source = 'cloud'; + this.ide.nextSteps([ + () => this.ide.openCloudDataString(clouddata) + ]); + location.hash = ''; + if (proj.ispublic) { + location.hash = '#present:Username=' + + encodeURIComponent(this.ide.cloud.username) + + '&ProjectName=' + + encodeURIComponent(proj.projectname); + } + }, + this.ide.cloudError() + ); + this.destroy(); +}; + +ProjectDialogMorph.prototype.saveProject = function () { + var name = this.nameField.contents().text.text, + notes = this.notesText.text; + + if (this.ide.getProjectNotes() !== notes) { + this.ide.setProjectNotes(notes); + } + if (name) { + if (this.source === 'cloud') { + if (detect( + this.projectList, + item => item.projectname === name + )) { + this.ide.confirm( + localize( + 'Are you sure you want to replace' + ) + '\n"' + name + '"?', + 'Replace Project', + () => { + this.ide.setProjectName(name); + this.saveCloudProject(); + } + ); + } else { + this.ide.setProjectName(name); + this.saveCloudProject(); + } + } else if (this.source === 'disk') { + this.ide.exportProject(name); + this.ide.source = 'disk'; + this.destroy(); + } + } +}; + +ProjectDialogMorph.prototype.saveCloudProject = function () { + this.ide.source = 'cloud'; + this.ide.saveProjectToCloud(); + this.destroy(); +}; + +ProjectDialogMorph.prototype.deleteProject = function () { + var proj, + idx, + name; + + if (this.source === 'cloud') { + proj = this.listField.selected; + if (proj) { + this.ide.confirm( + localize( + 'Are you sure you want to delete' + ) + '\n"' + proj.projectname + '"?', + 'Delete Project', + () => this.ide.cloud.deleteProject( + proj.projectname, + null, // username is implicit + () => { + this.ide.hasChangedMedia = true; + idx = this.projectList.indexOf(proj); + this.projectList.splice(idx, 1); + this.installCloudProjectList( // refresh list + this.projectList + ); + }, + this.ide.cloudError() + ) + ); + } + } else { // 'local, examples' + if (this.listField.selected) { + name = this.listField.selected.name; + this.ide.confirm( + localize( + 'Are you sure you want to delete' + ) + '\n"' + name + '"?', + 'Delete Project', + () => { + delete localStorage['-snap-project-' + name]; + this.setSource(this.source); // refresh list + } + ); + } + } +}; + +ProjectDialogMorph.prototype.shareProject = function () { + var ide = this.ide, + proj = this.listField.selected, + entry = this.listField.active; + + if (proj) { + this.ide.confirm( + localize( + 'Are you sure you want to share' + ) + '\n"' + proj.projectname + '"?', + 'Share Project', + () => { + ide.showMessage('sharing\nproject...'); + ide.cloud.shareProject( + proj.projectname, + null, // username is implicit + () => { + proj.ispublic = true; + this.unshareButton.show(); + this.shareButton.hide(); + this.publishButton.show(); + this.unpublishButton.hide(); + entry.label.isBold = true; + entry.label.rerender(); + this.buttons.fixLayout(); + this.rerender(); + this.ide.showMessage('shared.', 2); + + // Set the Shared URL if the project is currently open + if (proj.projectname === ide.getProjectName()) { + var usr = ide.cloud.username, + projectId = 'Username=' + + encodeURIComponent(usr.toLowerCase()) + + '&ProjectName=' + + encodeURIComponent(proj.projectname); + location.hash = 'present:' + projectId; + } + }, + this.ide.cloudError() + ); + } + ); + } +}; + +ProjectDialogMorph.prototype.unshareProject = function () { + var ide = this.ide, + proj = this.listField.selected, + entry = this.listField.active; + + if (proj) { + this.ide.confirm( + localize( + 'Are you sure you want to unshare' + ) + '\n"' + proj.projectname + '"?', + 'Unshare Project', + () => { + ide.showMessage('unsharing\nproject...'); + ide.cloud.unshareProject( + proj.projectname, + null, // username is implicit + () => { + proj.ispublic = false; + this.shareButton.show(); + this.unshareButton.hide(); + this.publishButton.hide(); + this.unpublishButton.hide(); + entry.label.isBold = false; + entry.label.isItalic = false; + entry.label.rerender(); + this.buttons.fixLayout(); + this.rerender(); + this.ide.showMessage('unshared.', 2); + if (proj.projectname === ide.getProjectName()) { + location.hash = ''; + } + }, + this.ide.cloudError() + ); + } + ); + } +}; + +ProjectDialogMorph.prototype.publishProject = function () { + var ide = this.ide, + proj = this.listField.selected, + entry = this.listField.active; + + if (proj) { + this.ide.confirm( + localize( + 'Are you sure you want to publish' + ) + '\n"' + proj.projectname + '"?', + 'Publish Project', + () => { + ide.showMessage('publishing\nproject...'); + ide.cloud.publishProject( + proj.projectname, + null, // username is implicit + () => { + proj.ispublished = true; + this.unshareButton.show(); + this.shareButton.hide(); + this.publishButton.hide(); + this.unpublishButton.show(); + entry.label.isItalic = true; + entry.label.rerender(); + this.buttons.fixLayout(); + this.rerender(); + this.ide.showMessage('published.', 2); + + // Set the Shared URL if the project is currently open + if (proj.projectname === ide.getProjectName()) { + var usr = ide.cloud.username, + projectId = 'Username=' + + encodeURIComponent(usr.toLowerCase()) + + '&ProjectName=' + + encodeURIComponent(proj.projectname); + location.hash = 'present:' + projectId; + } + }, + this.ide.cloudError() + ); + } + ); + } +}; + +ProjectDialogMorph.prototype.unpublishProject = function () { + var proj = this.listField.selected, + entry = this.listField.active; + + if (proj) { + this.ide.confirm( + localize( + 'Are you sure you want to unpublish' + ) + '\n"' + proj.projectname + '"?', + 'Unpublish Project', + () => { + this.ide.showMessage('unpublishing\nproject...'); + this.ide.cloud.unpublishProject( + proj.projectname, + null, // username is implicit + () => { + proj.ispublished = false; + this.unshareButton.show(); + this.shareButton.hide(); + this.publishButton.show(); + this.unpublishButton.hide(); + entry.label.isItalic = false; + entry.label.rerender(); + this.buttons.fixLayout(); + this.rerender(); + this.ide.showMessage('unpublished.', 2); + }, + this.ide.cloudError() + ); + } + ); + } +}; + +ProjectDialogMorph.prototype.edit = function () { + if (this.nameField) { + this.nameField.edit(); + } else if (this.filterField) { + this.filterField.edit(); + } +}; + +// ProjectDialogMorph layout + +ProjectDialogMorph.prototype.fixLayout = function () { + var th = fontHeight(this.titleFontSize) + this.titlePadding * 2, + thin = this.padding / 2, + inputField = this.nameField || this.filterField; + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.fixLayout(); + } + + if (this.body) { + this.body.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.body.setExtent(new Point( + this.width() - this.padding * 2, + this.height() - this.padding * 3 - th - this.buttons.height() + )); + this.srcBar.setPosition(this.body.position()); + + inputField.setWidth( + this.body.width() - this.srcBar.width() - this.padding * 6 + ); + inputField.setLeft(this.srcBar.right() + this.padding * 3); + inputField.setTop(this.srcBar.top()); + + this.listField.setLeft(this.srcBar.right() + this.padding); + this.listField.setWidth( + this.body.width() + - this.srcBar.width() + - this.preview.width() + - this.padding + - thin + ); + this.listField.contents.children[0].adjustWidths(); + + this.listField.setTop(inputField.bottom() + this.padding); + this.listField.setHeight( + this.body.height() - inputField.height() - this.padding + ); + + if (this.magnifyingGlass) { + this.magnifyingGlass.setTop(inputField.top()); + this.magnifyingGlass.setLeft(this.listField.left()); + } + + this.preview.setRight(this.body.right()); + this.preview.setTop(inputField.bottom() + this.padding); + + this.notesField.setTop(this.preview.bottom() + thin); + this.notesField.setLeft(this.preview.left()); + this.notesField.setHeight( + this.body.bottom() - this.preview.bottom() - thin + ); + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + } + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh shadow + this.removeShadow(); + this.addShadow(); +}; + +// ProjectRecoveryDialogMorph ///////////////////////////////////////// +// I show previous versions for a particular project and +// let users recover them. + +ProjectRecoveryDialogMorph.prototype = new DialogBoxMorph(); +ProjectRecoveryDialogMorph.prototype.constructor = ProjectRecoveryDialogMorph; +ProjectRecoveryDialogMorph.uber = DialogBoxMorph.prototype; + +// ProjectRecoveryDialogMorph instance creation: + +function ProjectRecoveryDialogMorph(ide, project, browser) { + this.init(ide, project, browser); +} + +ProjectRecoveryDialogMorph.prototype.init = function ( + ide, + projectName, + browser +) { + // initialize inherited properties: + ProjectRecoveryDialogMorph.uber.init.call( + this, + this, // target + null, // function + null // environment + ); + + this.ide = ide; + this.browser = browser; + this.key = 'recoverProject'; + this.projectName = projectName; + + this.versions = null; + + this.handle = null; + this.listField = null; + this.preview = null; + this.notesText = null; + this.notesField = null; + + this.labelString = 'Recover project'; + this.createLabel(); + + this.buildContents(); +}; + +ProjectRecoveryDialogMorph.prototype.buildContents = function () { + this.addBody(new Morph()); + this.body.color = this.color; + + this.buildListField(); + + this.preview = new Morph(); + this.preview.fixLayout = nop; + this.preview.edge = InputFieldMorph.prototype.edge; + this.preview.fontSize = InputFieldMorph.prototype.fontSize; + this.preview.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.preview.contrast = InputFieldMorph.prototype.contrast; + this.preview.render = function (ctx) { + InputFieldMorph.prototype.render.call(this, ctx); + if (this.cachedTexture) { + this.renderCachedTexture(ctx); + } else if (this.texture) { + this.renderTexture(this.texture, ctx); + } + }; + this.preview.renderCachedTexture = function (ctx) { + ctx.drawImage(this.cachedTexture, this.edge, this.edge); + }; + this.preview.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + this.preview.setExtent( + this.ide.serializer.thumbnailSize.add(this.preview.edge * 2) + ); + + this.body.add(this.preview); + + this.notesField = new ScrollFrameMorph(); + this.notesField.fixLayout = nop; + + this.notesField.edge = InputFieldMorph.prototype.edge; + this.notesField.fontSize = InputFieldMorph.prototype.fontSize; + this.notesField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.notesField.contrast = InputFieldMorph.prototype.contrast; + this.notesField.render = InputFieldMorph.prototype.render; + this.notesField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.notesField.acceptsDrops = false; + this.notesField.contents.acceptsDrops = false; + + this.notesText = new TextMorph(''); + + this.notesField.isTextLineWrapping = true; + this.notesField.padding = 3; + this.notesField.setContents(this.notesText); + this.notesField.setWidth(this.preview.width()); + + this.body.add(this.notesField); + + this.addButton('recoverProject', 'Recover', true); + this.addButton('cancel', 'Cancel'); + + this.setExtent(new Point(360, 300)); + this.fixLayout(); +}; + +ProjectRecoveryDialogMorph.prototype.buildListField = function () { + this.listField = new ListMorph([]); + this.fixListFieldItemColors(); + this.listField.fixLayout = nop; + this.listField.edge = InputFieldMorph.prototype.edge; + this.listField.fontSize = InputFieldMorph.prototype.fontSize; + this.listField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.listField.contrast = InputFieldMorph.prototype.contrast; + this.listField.render = InputFieldMorph.prototype.render; + this.listField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.listField.action = (item) => { + var version; + if (item === undefined) { return; } + version = detect( + this.versions, + version => version.lastupdated === item + ); + this.notesText.text = version.notes || ''; + this.notesText.rerender(); + this.notesField.contents.adjustBounds(); + this.preview.texture = version.thumbnail; + this.preview.cachedTexture = null; + this.preview.rerender(); + }; + + this.ide.cloud.getProjectVersionMetadata( + this.projectName, + versions => { + var today = new Date(), + yesterday = new Date(); + yesterday.setDate(today.getDate() - 1); + this.versions = versions; + this.versions.forEach(version => { + var date = new Date( + new Date().getTime() - version.lastupdated * 1000 + ); + if (date.toDateString() === today.toDateString()) { + version.lastupdated = localize('Today, ') + + date.toLocaleTimeString(); + } else if (date.toDateString() === yesterday.toDateString()) { + version.lastupdated = localize('Yesterday, ') + + date.toLocaleTimeString(); + } else { + version.lastupdated = date.toLocaleString(); + } + }); + this.listField.elements = this.versions.map(version => + version.lastupdated + ); + this.clearDetails(); + this.listField.buildListContents(); + this.fixListFieldItemColors(); + this.listField.adjustScrollBars(); + this.listField.scrollY(this.listField.top()); + this.fixLayout(); + }, + this.ide.cloudError() + ); + + this.body.add(this.listField); +}; + +ProjectRecoveryDialogMorph.prototype.cancel = function () { + this.browser.show(); + this.browser.listField.select( + detect( + this.browser.projectList, + item => item.projectname === this.projectName + ) + ); + ProjectRecoveryDialogMorph.uber.cancel.call(this); +}; + +ProjectRecoveryDialogMorph.prototype.recoverProject = function () { + var lastupdated = this.listField.selected, + version = detect( + this.versions, + version => version.lastupdated === lastupdated + ); + + this.browser.openCloudProject( + {projectname: this.projectName}, + version.delta + ); + this.destroy(); +}; + +ProjectRecoveryDialogMorph.prototype.popUp = function () { + var world = this.ide.world(); + if (world) { + ProjectRecoveryDialogMorph.uber.popUp.call(this, world); + this.handle = new HandleMorph( + this, + 300, + 300, + this.corner, + this.corner + ); + } +}; + +ProjectRecoveryDialogMorph.prototype.fixListFieldItemColors = + ProjectDialogMorph.prototype.fixListFieldItemColors; + +ProjectRecoveryDialogMorph.prototype.clearDetails = + ProjectDialogMorph.prototype.clearDetails; + +ProjectRecoveryDialogMorph.prototype.fixLayout = function () { + var titleHeight = fontHeight(this.titleFontSize) + this.titlePadding * 2, + thin = this.padding / 2; + + if (this.body) { + this.body.setPosition(this.position().add(new Point( + this.padding, + titleHeight + this.padding + ))); + this.body.setExtent(new Point( + this.width() - this.padding * 2, + this.height() + - this.padding * 3 // top, bottom and button padding. + - titleHeight + - this.buttons.height() + )); + + this.listField.setWidth( + this.body.width() + - this.preview.width() + - this.padding + ); + this.listField.contents.children[0].adjustWidths(); + + this.listField.setPosition(this.body.position()); + this.listField.setHeight(this.body.height()); + + this.preview.setRight(this.body.right()); + this.preview.setTop(this.listField.top()); + + this.notesField.setTop(this.preview.bottom() + thin); + this.notesField.setLeft(this.preview.left()); + this.notesField.setHeight( + this.body.bottom() - this.preview.bottom() - thin + ); + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop( + this.top() + (titleHeight - this.label.height()) / 2 + ); + } + + if (this.buttons) { + this.buttons.fixLayout(); + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh shadow + this.removeShadow(); + this.addShadow(); +}; + +// LibraryImportDialogMorph /////////////////////////////////////////// +// I am preview dialog shown before importing a library. +// I inherit from a DialogMorph but look similar to +// ProjectDialogMorph, and BlockImportDialogMorph + +LibraryImportDialogMorph.prototype = new DialogBoxMorph(); +LibraryImportDialogMorph.prototype.constructor = LibraryImportDialogMorph; +LibraryImportDialogMorph.uber = DialogBoxMorph.prototype; + +// LibraryImportDialogMorph instance creation: + +function LibraryImportDialogMorph(ide, librariesData) { + this.init(ide, librariesData); +} + +LibraryImportDialogMorph.prototype.init = function (ide, librariesData) { + // additional properties + this.isLoadingLibrary = false; + this.originalCategories = null; + this.captureOriginalCategories(); + + // initialize inherited properties: + LibraryImportDialogMorph.uber.init.call( + this, + this, // target + null, // function + null // environment + ); + + this.ide = ide; + this.key = 'importLibrary'; + this.action = 'importLibrary'; + this.librariesData = librariesData; // [{name: , fileName: , description:}] + + // I contain a cached version of the libaries I have displayed, + // because users may choose to explore a library many times before + // importing. + this.libraryCache = new Map(); // fileName: { blocks: [], palette: {} } + + this.handle = null; + this.listField = null; + this.palette = null; + this.notesText = null; + this.notesField = null; + + this.labelString = 'Import library'; + this.createLabel(); + + this.buildContents(); +}; + +LibraryImportDialogMorph.prototype.captureOriginalCategories = function () { + this.originalCategories = new Map(); + SpriteMorph.prototype.customCategories.forEach((color, name) => + this.originalCategories.set(name, color) + ); +}; + +LibraryImportDialogMorph.prototype.buildContents = function () { + this.addBody(new Morph()); + this.body.color = this.color; + + this.initializePalette(); + this.initializeLibraryDescription(); + this.installLibrariesList(); + + this.addButton('ok', 'Import'); + this.addButton('cancel', 'Cancel'); + + this.setExtent(new Point(460, 455)); + this.fixLayout(); +}; + +LibraryImportDialogMorph.prototype.initializePalette = function () { + // I will display a scrolling list of blocks. + if (this.palette) {this.palette.destroy(); } + + this.palette = new ScrollFrameMorph( + null, + null, + SpriteMorph.prototype.sliderColor + ); + this.palette.color = SpriteMorph.prototype.paletteColor; + this.palette.padding = 4; + this.palette.isDraggable = false; + this.palette.acceptsDrops = false; + this.palette.contents.acceptsDrops = false; + + this.body.add(this.palette); +}; + +LibraryImportDialogMorph.prototype.initializeLibraryDescription = function () { + if (this.notesField) {this.notesField.destroy(); } + + this.notesField = new ScrollFrameMorph(); + this.notesField.fixLayout = nop; + + this.notesField.edge = InputFieldMorph.prototype.edge; + this.notesField.fontSize = InputFieldMorph.prototype.fontSize; + this.notesField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.notesField.contrast = InputFieldMorph.prototype.contrast; + this.notesField.render = InputFieldMorph.prototype.render; + this.notesField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.notesField.acceptsDrops = false; + this.notesField.contents.acceptsDrops = false; + + this.notesText = new TextMorph(''); + + this.notesField.isTextLineWrapping = true; + this.notesField.padding = 3; + this.notesField.setContents(this.notesText); + this.notesField.setHeight(100); + + this.body.add(this.notesField); +}; + +LibraryImportDialogMorph.prototype.installLibrariesList = function () { + if (this.listField) {this.listField.destroy(); } + + this.listField = new ListMorph( + this.librariesData, + element => element.name, + null, + () => this.importLibrary(), + '~', // separator + false // verbatim + ); + + this.fixListFieldItemColors(); + + this.listField.fixLayout = nop; + this.listField.edge = InputFieldMorph.prototype.edge; + this.listField.fontSize = InputFieldMorph.prototype.fontSize; + this.listField.typeInPadding = InputFieldMorph.prototype.typeInPadding; + this.listField.contrast = InputFieldMorph.prototype.contrast; + this.listField.render = InputFieldMorph.prototype.render; + this.listField.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + this.listField.action = ({name, fileName, description}) => { + if (isNil(name)) {return; } + + this.notesText.text = localize(description) || ''; + this.notesText.rerender(); + this.notesField.contents.adjustBounds(); + + if (this.hasCached(fileName)) { + this.displayBlocks(fileName); + } else { + this.showMessage(`${localize('Loading')}\n${localize(name)}`); + this.ide.getURL( + this.ide.resourceURL('libraries', fileName), + libraryXML => { + let serializer = this.ide.serializer, + palette = serializer.parse(libraryXML).childNamed('palette'); + this.cacheLibrary( + fileName, + serializer.loadBlocks(libraryXML), + palette ? serializer.loadPalette(palette) : {} + ); + this.displayBlocks(fileName); + } + ); + } + }; + + this.listField.setWidth(200); + this.body.add(this.listField); + + this.fixLayout(); +}; + +LibraryImportDialogMorph.prototype.popUp = function () { + var world = this.ide.world(); + if (world) { + LibraryImportDialogMorph.uber.popUp.call(this, world); + this.handle = new HandleMorph( + this, + 300, + 300, + this.corner, + this.corner + ); + } +}; + +LibraryImportDialogMorph.prototype.destroy = function () { + LibraryImportDialogMorph.uber.destroy.call(this); + if (!this.isLoadingLibrary) { + SpriteMorph.prototype.customCategories = this.originalCategories; + } +}; + +LibraryImportDialogMorph.prototype.fixListFieldItemColors = + ProjectDialogMorph.prototype.fixListFieldItemColors; + +LibraryImportDialogMorph.prototype.clearDetails = + ProjectDialogMorph.prototype.clearDetails; + +LibraryImportDialogMorph.prototype.fixLayout = function () { + var titleHeight = fontHeight(this.titleFontSize) + this.titlePadding * 2, + thin = this.padding / 2; + + if (this.body) { + this.body.setPosition(this.position().add(new Point( + this.padding, + titleHeight + this.padding + ))); + this.body.setExtent(new Point( + this.width() - this.padding * 2, + this.height() + - this.padding * 3 // top, bottom and button padding. + - titleHeight + - this.buttons.height() + )); + + this.listField.setExtent(new Point( + 200, + this.body.height() + )); + this.notesField.setExtent(new Point( + this.body.width() - this.listField.width() - thin, + 100 + )); + this.palette.setExtent(new Point( + this.notesField.width(), + this.body.height() - this.notesField.height() - thin + )); + this.listField.contents.children[0].adjustWidths(); + + this.listField.setPosition(this.body.position()); + this.palette.setPosition(this.listField.topRight().add( + new Point(thin, 0) + )); + this.notesField.setPosition(this.palette.bottomLeft().add( + new Point(0, thin) + )); + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop( + this.top() + (titleHeight - this.label.height()) / 2 + ); + } + + if (this.buttons) { + this.buttons.fixLayout(); + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh shadow + this.removeShadow(); + this.addShadow(); +}; + +// Library Cache Utilities. +LibraryImportDialogMorph.prototype.hasCached = function (key) { + return this.libraryCache.hasOwnProperty(key); +}; + +LibraryImportDialogMorph.prototype.cacheLibrary = function (key, blocks, palette) { + this.libraryCache.set(key, { blocks, palette }); +}; + +LibraryImportDialogMorph.prototype.cachedLibrary = function (key) { + return this.libraryCache.get(key).blocks; +}; + +LibraryImportDialogMorph.prototype.cachedPalette = function (key) { + return this.libraryCache.get(key).palette; +}; + +LibraryImportDialogMorph.prototype.importLibrary = function () { + if (!this.listField.selected) {return; } + + var ide = this.ide, + selectedLibrary = this.listField.selected.fileName, + libraryName = this.listField.selected.name; + + // restore captured user-blocks categories + SpriteMorph.prototype.customCategories = this.originalCategories; + + if (this.hasCached(selectedLibrary)) { + this.cachedLibrary(selectedLibrary).forEach(def => { + def.receiver = ide.stage; + ide.stage.globalBlocks.push(def); + ide.stage.replaceDoubleDefinitionsFor(def); + }); + this.cachedPalette(selectedLibrary).forEach((value, key) => + SpriteMorph.prototype.customCategories.set(key, value) + ); + ide.showMessage(localize('Imported') + ' ' + localize(libraryName), 2); + } else { + ide.showMessage(localize('Loading') + ' ' + localize(libraryName)); + ide.getURL( + ide.resourceURL('libraries', selectedLibrary), + libraryText => { + ide.droppedText(libraryText, libraryName); + this.isLoadingLibrary = true; + } + ); + } +}; + +LibraryImportDialogMorph.prototype.displayBlocks = function (libraryKey) { + var x, y, blockImage, blockContainer, text, + padding = 4, + libraryBlocks = this.cachedLibrary(libraryKey), + blocksByCategory = new Map( + SpriteMorph.prototype.allCategories().map(cat => [cat, []]) + ); + + // populate palette, grouped by categories. + this.initializePalette(); + x = this.palette.left() + padding; + y = this.palette.top(); + + libraryBlocks.global.concat(libraryBlocks.local).forEach(definition => { + if (!definition.isHelper) { + blocksByCategory.get(definition.category).push(definition); + } + }); + + blocksByCategory.forEach((blocks, category) => { + if (blocks.length > 0) { + text = SpriteMorph.prototype.categoryText(category); + text.setPosition(new Point(x, y)); + this.palette.addContents(text); + y += text.fullBounds().height() + padding; + } + + blocks.forEach(definition => { + blockImage = definition.templateInstance().fullImage(); + blockContainer = new Morph(); + blockContainer.isCachingImage = true; + blockContainer.bounds.setWidth(blockImage.width); + blockContainer.bounds.setHeight(blockImage.height); + blockContainer.cachedImage = blockImage; + blockContainer.setPosition(new Point(x, y)); + this.palette.addContents(blockContainer); + + y += blockContainer.fullBounds().height() + padding; + }); + }); + + this.palette.scrollX(padding); + this.palette.scrollY(padding); + this.fixLayout(); +}; + +LibraryImportDialogMorph.prototype.showMessage = function (msgText) { + var msg = new MenuMorph(null, msgText); + this.initializePalette(); + this.fixLayout(); + msg.popUpCenteredInWorld(this.palette.contents); +}; + +// SpriteIconMorph //////////////////////////////////////////////////// + +/* + I am a selectable element in the Sprite corral, keeping a self-updating + thumbnail of the sprite I'm respresenting, and a self-updating label + of the sprite's name (in case it is changed elsewhere) +*/ + +// SpriteIconMorph inherits from ToggleButtonMorph (Widgets) + +SpriteIconMorph.prototype = new ToggleButtonMorph(); +SpriteIconMorph.prototype.constructor = SpriteIconMorph; +SpriteIconMorph.uber = ToggleButtonMorph.prototype; + +// SpriteIconMorph settings + +SpriteIconMorph.prototype.thumbSize = new Point(40, 40); +SpriteIconMorph.prototype.labelShadowOffset = null; +SpriteIconMorph.prototype.labelShadowColor = null; +SpriteIconMorph.prototype.labelColor = WHITE; +SpriteIconMorph.prototype.fontSize = 9; + +// SpriteIconMorph instance creation: + +function SpriteIconMorph(aSprite) { + this.init(aSprite); +} + +SpriteIconMorph.prototype.init = function (aSprite) { + var colors, action, query, hover; + + colors = [ + IDE_Morph.prototype.groupColor, + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor + ]; + + action = () => { + // make my sprite the current one + var ide = this.parentThatIsA(IDE_Morph); + + if (ide) { + ide.selectSprite(this.object); + } + }; + + query = () => { + // answer true if my sprite is the current one + var ide = this.parentThatIsA(IDE_Morph); + + if (ide) { + return ide.currentSprite === this.object; + } + return false; + }; + + hover = () => { + if (!aSprite.exemplar) {return null; } + return (localize('parent') + ':\n' + aSprite.exemplar.name); + }; + + // additional properties: + this.object = aSprite || new SpriteMorph(); // mandatory, actually + this.version = this.object.version; + this.thumbnail = null; + this.rotationButton = null; // synchronous rotation of nested sprites + + // additional properties for highlighting + this.isFlashing = false; + this.previousColor = null; + this.previousOutline = null; + this.previousState = null; + + // initialize inherited properties: + SpriteIconMorph.uber.init.call( + this, + colors, // color overrides, : [normal, highlight, pressed] + null, // target - not needed here + action, // a toggle function + this.object.name, // label string + query, // predicate/selector + null, // environment + hover // hint + ); + + // override defaults and build additional components + this.isDraggable = true; + this.createThumbnail(); + this.padding = 2; + this.corner = 8; + this.fixLayout(); + this.fps = 1; +}; + +SpriteIconMorph.prototype.createThumbnail = function () { + if (this.thumbnail) { + this.thumbnail.destroy(); + } + + this.thumbnail = new Morph(); + this.thumbnail.isCachingImage = true; + this.thumbnail.bounds.setExtent(this.thumbSize); + if (this.object instanceof SpriteMorph) { // support nested sprites + this.thumbnail.cachedImage = this.object.fullThumbnail( + this.thumbSize, + this.thumbnail.cachedImage + ); + this.add(this.thumbnail); + this.createRotationButton(); + } else { + this.thumbnail.cachedImage = this.object.thumbnail( + this.thumbSize, + this.thumbnail.cachedImage + ); + this.add(this.thumbnail); + } +}; + +SpriteIconMorph.prototype.createLabel = function () { + var txt; + + if (this.label) { + this.label.destroy(); + } + txt = new StringMorph( + this.object.name, + this.fontSize, + this.fontStyle, + true, + false, + false, + this.labelShadowOffset, + this.labelShadowColor, + this.labelColor + ); + + this.label = new FrameMorph(); + this.label.acceptsDrops = false; + this.label.alpha = 0; + this.label.setExtent(txt.extent()); + txt.setPosition(this.label.position()); + this.label.add(txt); + this.add(this.label); +}; + +SpriteIconMorph.prototype.createRotationButton = function () { + var button; + + if (this.rotationButton) { + this.rotationButton.destroy(); + this.roationButton = null; + } + if (!this.object.anchor) { + return; + } + + button = new ToggleButtonMorph( + null, // colors, + null, // target + () => this.object.rotatesWithAnchor = !this.object.rotatesWithAnchor, + [ + '\u2192', + '\u21BB' + ], + () => this.object.rotatesWithAnchor // query + ); + + button.corner = 8; + button.labelMinExtent = new Point(11, 11); + button.padding = 0; + button.pressColor = button.color; + // button.hint = 'rotate synchronously\nwith anchor'; + button.fixLayout(); + button.refresh(); + this.rotationButton = button; + this.add(this.rotationButton); +}; + +// SpriteIconMorph stepping + +SpriteIconMorph.prototype.step = function () { + if (this.version !== this.object.version) { + this.createThumbnail(); + this.createLabel(); + this.fixLayout(); + this.version = this.object.version; + this.refresh(); + } +}; + +// SpriteIconMorph layout + +SpriteIconMorph.prototype.fixLayout = function () { + if (!this.thumbnail || !this.label) {return null; } + + this.bounds.setWidth( + this.thumbnail.width() + + this.outline * 2 + + this.edge * 2 + + this.padding * 2 + ); + + this.bounds.setHeight( + this.thumbnail.height() + + this.outline * 2 + + this.edge * 2 + + this.padding * 3 + + this.label.height() + ); + + this.thumbnail.setCenter(this.center()); + this.thumbnail.setTop( + this.top() + this.outline + this.edge + this.padding + ); + + if (this.rotationButton) { + this.rotationButton.setTop(this.top()); + this.rotationButton.setRight(this.right()); + } + + this.label.setWidth( + Math.min( + this.label.children[0].width(), // the actual text + this.thumbnail.width() + ) + ); + this.label.setCenter(this.center()); + this.label.setTop( + this.thumbnail.bottom() + this.padding + ); +}; + +// SpriteIconMorph menu + +SpriteIconMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + + if (this.object instanceof StageMorph) { + menu.addItem( + 'pic...', + () => { + var ide = this.parentThatIsA(IDE_Morph); + ide.saveCanvasAs( + this.object.fullImage(), + this.object.name + ); + }, + 'save a picture\nof the stage' + ); + if (this.object.trailsLog.length) { + menu.addItem( + 'svg...', + () => this.object.exportTrailsLogAsSVG(), + 'export pen trails\nline segments as SVG' + ); + } + return menu; + } + if (!(this.object instanceof SpriteMorph)) {return null; } + menu.addItem("show", 'showSpriteOnStage'); + menu.addLine(); + menu.addItem("duplicate", 'duplicateSprite'); + if (StageMorph.prototype.enableInheritance) { + menu.addItem("clone", 'instantiateSprite'); + } + menu.addItem("delete", 'removeSprite'); + menu.addLine(); + if (this.object.solution) { + menu.addItem( + 'extract solution', + () => { + this.parentThatIsA(IDE_Morph).undelete( + this.object.solution.fullCopy(), + this.center() + ); + } + ); + menu.addItem( + 'delete solution', + () => { + this.parentThatIsA(IDE_Morph).removeSprite( + this.object.solution + ); + this.object.solution = null; + this.object.recordUserEdit( + 'sprite', + 'solution', + 'delete' + ); + } + ); + menu.addLine(); + } + if (StageMorph.prototype.enableInheritance) { + /* version that hides refactoring capability unless shift-clicked + if (this.world().currentKey === 16) { // shift-clicked + menu.addItem( + "parent...", + 'chooseExemplar', + null, + new Color(100, 0, 0) + ); + } + */ + menu.addItem("parent...", 'chooseExemplar'); + if (this.object.exemplar) { + menu.addItem( + "release", + 'releaseSprite', + 'make temporary and\nhide in the sprite corral' + ); + } + } + if (this.object.anchor) { + menu.addItem( + localize('detach from') + ' ' + this.object.anchor.name, + () => this.object.detachFromAnchor() + ); + } + if (this.object.parts.length) { + menu.addItem( + 'detach all parts', + () => this.object.detachAllParts() + ); + } + menu.addItem("export...", 'exportSprite'); + return menu; +}; + +SpriteIconMorph.prototype.duplicateSprite = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.duplicateSprite(this.object); + } +}; + +SpriteIconMorph.prototype.instantiateSprite = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.instantiateSprite(this.object); + } +}; + +SpriteIconMorph.prototype.removeSprite = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.removeSprite(this.object); + } +}; + +SpriteIconMorph.prototype.exportSprite = function () { + this.object.exportSprite(); +}; + +SpriteIconMorph.prototype.chooseExemplar = function () { + this.object.chooseExemplar(); +}; + +SpriteIconMorph.prototype.releaseSprite = function () { + this.object.release(); + this.object.recordUserEdit( + 'sprite', + 'release', + this.object.name + ); +}; + +SpriteIconMorph.prototype.showSpriteOnStage = function () { + this.object.showOnStage(); +}; + +// SpriteIconMorph events + +SpriteIconMorph.prototype.mouseDoubleClick = function () { + if (this.object instanceof SpriteMorph) { + this.object.flash(); + } +}; + +// SpriteIconMorph drawing + +SpriteIconMorph.prototype.render = function (ctx) { + // only draw the edges if I am selected + switch (this.userState) { + case 'highlight': + this.drawBackground(ctx, this.highlightColor); + break; + case 'pressed': + this.drawOutline(ctx); + this.drawBackground(ctx, this.pressColor); + this.drawEdges( + ctx, + this.pressColor, + this.pressColor.lighter(40), + this.pressColor.darker(40) + ); + break; + default: + this.drawBackground(ctx, this.getRenderColor()); + } +}; + +SpriteIconMorph.prototype.getRenderColor = + ScriptsMorph.prototype.getRenderColor; + +// SpriteIconMorph drag & drop + +SpriteIconMorph.prototype.prepareToBeGrabbed = function () { + var ide = this.parentThatIsA(IDE_Morph), + idx; + this.mouseClickLeft(); // select me + this.alpha = 0.85; + if (ide) { + idx = ide.sprites.asArray().indexOf(this.object); + ide.sprites.remove(idx + 1); + ide.createCorral(true); // keep scenes + ide.fixLayout(); + } +}; + +SpriteIconMorph.prototype.justDropped = function () { + this.alpha = 1; +}; + +SpriteIconMorph.prototype.wantsDropOf = function (morph) { + // allow scripts & media to be copied from one sprite to another + // by drag & drop + return morph instanceof BlockMorph + || (morph instanceof CommentMorph) + || (morph instanceof CostumeIconMorph) + || (morph instanceof SoundIconMorph); +}; + +SpriteIconMorph.prototype.reactToDropOf = function (morph, hand) { + if (morph instanceof BlockMorph || morph instanceof CommentMorph) { + this.copyStack(morph); + } else if (morph instanceof CostumeIconMorph) { + this.copyCostume(morph.object); + } else if (morph instanceof SoundIconMorph) { + this.copySound(morph.object); + } + this.world().add(morph); + morph.slideBackTo(hand.grabOrigin); +}; + +SpriteIconMorph.prototype.copyStack = function (block) { + var sprite = this.object, + dup = block.fullCopy(), + y = Math.max( + sprite.scripts.children.map(stack => + stack.fullBounds().bottom() + ).concat([sprite.scripts.top()]) + ); + + dup.setPosition(new Point(sprite.scripts.left() + 20, y + 20)); + sprite.scripts.add(dup); + if (dup instanceof BlockMorph) { + dup.allComments().forEach(comment => comment.align(dup)); + } + sprite.scripts.adjustBounds(); + + // delete all local custom blocks (methods) that the receiver + // doesn't understand + dup.allChildren().forEach(morph => { + if (morph.isCustomBlock && + !morph.isGlobal && + !sprite.getMethod(morph.blockSpec) + ) { + morph.deleteBlock(); + } + }); +}; + +SpriteIconMorph.prototype.copyCostume = function (costume) { + var dup = costume.copy(); + dup.name = this.object.newCostumeName(dup.name); + this.object.addCostume(dup); + this.object.wearCostume(dup); +}; + +SpriteIconMorph.prototype.copySound = function (sound) { + var dup = sound.copy(); + this.object.addSound(dup.audio, dup.name); +}; + +// SpriteIconMorph flashing + +SpriteIconMorph.prototype.flash = function () { + var world = this.world(); + + if (this.isFlashing) {return; } + this.flashOn(); + + world.animations.push(new Animation( + nop, + nop, + 0, + 800, + nop, + () => this.flashOff() + )); +}; + +SpriteIconMorph.prototype.flashOn = function () { + var isFlat = MorphicPreferences.isFlat, + highlight = SpriteMorph.prototype.highlightColor; + + if (this.isFlashing) {return; } + + this.previousColor = isFlat ? this.pressColor : this.outlineColor; + this.previousOutline = this.outline; + this.previousState = this.userState; + + if (isFlat) { + this.pressColor = highlight; + } else { + this.outlineColor = highlight; + this.outline = 2; + } + this.userState = 'pressed'; + this.rerender(); + this.isFlashing = true; +}; + +SpriteIconMorph.prototype.flashOff = function () { + if (!this.isFlashing) {return; } + + if (MorphicPreferences.isFlat) { + this.pressColor = this.previousColor; + } else { + this.outlineColor = this.previousColor; + this.outline = this.previousOutline; + } + this.userState = this.previousState; + this.rerender(); + this.isFlashing = false; +}; + +// CostumeIconMorph //////////////////////////////////////////////////// + +/* + I am a selectable element in the SpriteEditor's "Costumes" tab, keeping + a self-updating thumbnail of the costume I'm respresenting, and a + self-updating label of the costume's name (in case it is changed + elsewhere) +*/ + +// CostumeIconMorph inherits from ToggleButtonMorph (Widgets) +// ... and copies methods from SpriteIconMorph + +CostumeIconMorph.prototype = new ToggleButtonMorph(); +CostumeIconMorph.prototype.constructor = CostumeIconMorph; +CostumeIconMorph.uber = ToggleButtonMorph.prototype; + +// CostumeIconMorph settings + +CostumeIconMorph.prototype.thumbSize = new Point(80, 60); +CostumeIconMorph.prototype.labelShadowOffset = null; +CostumeIconMorph.prototype.labelShadowColor = null; +CostumeIconMorph.prototype.labelColor = WHITE; +CostumeIconMorph.prototype.fontSize = 9; + +// CostumeIconMorph instance creation: + +function CostumeIconMorph(aCostume) { + this.init(aCostume); +} + +CostumeIconMorph.prototype.init = function (aCostume) { + var colors, action, query; + + colors = [ + IDE_Morph.prototype.groupColor, + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor + ]; + + action = () => { + // make my costume the current one + var ide = this.parentThatIsA(IDE_Morph), + wardrobe = this.parentThatIsA(WardrobeMorph); + + if (ide) { + ide.currentSprite.wearCostume(this.object); + } + if (wardrobe) { + wardrobe.updateSelection(); + } + }; + + query = () => { + // answer true if my costume is the current one + var ide = this.parentThatIsA(IDE_Morph); + + if (ide) { + return ide.currentSprite.costume === this.object; + } + return false; + }; + + // additional properties: + this.object = aCostume || new Costume(); // mandatory, actually + this.version = this.object.version; + this.thumbnail = null; + + // initialize inherited properties: + CostumeIconMorph.uber.init.call( + this, + colors, // color overrides, : [normal, highlight, pressed] + null, // target - not needed here + action, // a toggle function + this.object.name, // label string + query, // predicate/selector + null, // environment + null // hint + ); + + // override defaults and build additional components + this.isDraggable = true; + this.createThumbnail(); + this.padding = 2; + this.corner = 8; + this.fixLayout(); + this.fps = 1; +}; + +CostumeIconMorph.prototype.createThumbnail = function () { + var watermark, txt; + SpriteIconMorph.prototype.createThumbnail.call(this); + watermark = this.object instanceof SVG_Costume ? 'svg' + : (this.object.embeddedData ? ( + this.typeOfStringData(this.object.embeddedData) === 'data' ? + 'dta' : '' + ) + : null); + if (watermark) { + txt = new StringMorph( + watermark, + this.fontSize * 0.8, + this.fontStyle, + false, + false, + false, + this.labelShadowOffset, + this.labelShadowColor, + this.labelColor + ); + txt.setBottom(this.thumbnail.bottom()); + this.thumbnail.add(txt); + } +}; + +CostumeIconMorph.prototype.createLabel + = SpriteIconMorph.prototype.createLabel; + +// CostumeIconMorph stepping + +CostumeIconMorph.prototype.step + = SpriteIconMorph.prototype.step; + +// CostumeIconMorph layout + +CostumeIconMorph.prototype.fixLayout + = SpriteIconMorph.prototype.fixLayout; + +// CostumeIconMorph menu + +CostumeIconMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + if (!(this.object instanceof Costume)) {return null; } + menu.addItem("edit", "editCostume"); + if (this.world().currentKey === 16) { // shift clicked + menu.addItem( + 'edit rotation point only...', + 'editRotationPointOnly', + null, + new Color(100, 0, 0) + ); + } + menu.addItem("rename", "renameCostume"); + menu.addLine(); + menu.addItem("duplicate", "duplicateCostume"); + menu.addItem("delete", "removeCostume"); + menu.addLine(); + if (this.object.embeddedData) { + menu.addItem( + "get" + ' ' + this.typeOfStringData(this.object.embeddedData), + "importEmbeddedData" + ); + } + menu.addItem("export", "exportCostume"); + return menu; +}; + +CostumeIconMorph.prototype.editCostume = function () { + this.disinherit(); + + if (this.object instanceof SVG_Costume && this.object.shapes.length === 0) { + try { + this.object.parseShapes(); + } catch (e) { + this.editRotationPointOnly(); + return; + } + } + + this.object.edit( + this.world(), + this.parentThatIsA(IDE_Morph), + false // not a new costume, retain existing rotation center + ); +}; + +CostumeIconMorph.prototype.editRotationPointOnly = function () { + var ide = this.parentThatIsA(IDE_Morph); + this.object.editRotationPointOnly(this.world(), ide); + ide.hasChangedMedia = true; + ide.currentSprite.recordUserEdit( + 'costume', + 'rotation point', + this.object.name + ); +}; + +CostumeIconMorph.prototype.renameCostume = function () { + this.disinherit(); + var costume = this.object, + wardrobe = this.parentThatIsA(WardrobeMorph), + ide = this.parentThatIsA(IDE_Morph); + new DialogBoxMorph( + null, + answer => { + var old = costume.name; + if (answer && (answer !== costume.name)) { + costume.name = wardrobe.sprite.newCostumeName( + answer, + costume + ); + costume.version = Date.now(); + ide.hasChangedMedia = true; + wardrobe.sprite.recordUserEdit( + 'costume', + 'rename', + old, + costume.name + ); + } + } + ).prompt( + wardrobe.sprite instanceof SpriteMorph ? + 'rename costume' : 'rename background', + costume.name, + this.world() + ); +}; + +CostumeIconMorph.prototype.duplicateCostume = function () { + var wardrobe = this.parentThatIsA(WardrobeMorph), + ide = this.parentThatIsA(IDE_Morph), + newcos = this.object.copy(); + newcos.name = wardrobe.sprite.newCostumeName(newcos.name); + wardrobe.sprite.addCostume(newcos); + wardrobe.updateList(); + if (ide) { + ide.currentSprite.wearCostume(newcos); + } +}; + +CostumeIconMorph.prototype.removeCostume = function () { + var wardrobe = this.parentThatIsA(WardrobeMorph), + idx = this.parent.children.indexOf(this), + off = CamSnapshotDialogMorph.prototype.enableCamera ? 3 : 2; + wardrobe.removeCostumeAt(idx - off); // ignore paintbrush and camera buttons + if (wardrobe.sprite.costume === this.object) { + wardrobe.sprite.wearCostume(null); + } + wardrobe.sprite.recordUserEdit( + 'costume', + 'delete', + idx - off, + this.object.name + ); +}; + +CostumeIconMorph.prototype.importEmbeddedData = function () { + var ide = this.parentThatIsA(IDE_Morph); + ide.spriteBar.tabBar.tabTo('scripts'); + ide.droppedText(this.object.embeddedData, this.object.name, ''); +}; + +CostumeIconMorph.prototype.typeOfStringData = function (aString) { + // check for Snap specific files, projects, libraries, sprites, scripts + if (aString[0] === '<') { + if ([ + 'project', + 'snapdata', + 'blocks', + 'sprites', + 'block', + 'script' + ].some(tag => aString.slice(1).startsWith(tag)) + ) { + return 'blocks'; + } + } + return 'data'; +}; + +CostumeIconMorph.prototype.exportCostume = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (this.object instanceof SVG_Costume) { + // don't show SVG costumes in a new tab (shows text) + ide.saveFileAs(this.object.contents.src, 'text/svg', this.object.name); + } else if (this.object.embeddedData) { + // embed payload data (e.g blocks) inside the PNG image data + ide.saveFileAs(this.object.pngData(), 'image/png', this.object.name); + } else { // rasterized Costume + ide.saveCanvasAs(this.object.contents, this.object.name); + } +}; + +// CostumeIconMorph drawing + +CostumeIconMorph.prototype.render + = SpriteIconMorph.prototype.render; + +// CostumeIconMorph inheritance + +CostumeIconMorph.prototype.disinherit = function () { + var wardrobe = this.parentThatIsA(WardrobeMorph), + idx = this.parent.children.indexOf(this); + if (wardrobe.sprite.inheritsAttribute('costumes')) { + wardrobe.sprite.shadowAttribute('costumes'); + this.object = wardrobe.sprite.costumes.at(idx - 3); + } +}; + +// CostumeIconMorph drag & drop + +CostumeIconMorph.prototype.prepareToBeGrabbed = function () { + this.disinherit(); + this.mouseClickLeft(); // select me + this.removeCostume(); +}; + +// TurtleIconMorph //////////////////////////////////////////////////// + +/* + I am a selectable element in the SpriteEditor's "Costumes" tab, keeping + a thumbnail of the sprite's or stage's default "Turtle" costume. +*/ + +// TurtleIconMorph inherits from ToggleButtonMorph (Widgets) +// ... and copies methods from SpriteIconMorph + +TurtleIconMorph.prototype = new ToggleButtonMorph(); +TurtleIconMorph.prototype.constructor = TurtleIconMorph; +TurtleIconMorph.uber = ToggleButtonMorph.prototype; + +// TurtleIconMorph settings + +TurtleIconMorph.prototype.thumbSize = new Point(80, 60); +TurtleIconMorph.prototype.labelShadowOffset = null; +TurtleIconMorph.prototype.labelShadowColor = null; +TurtleIconMorph.prototype.labelColor = WHITE; +TurtleIconMorph.prototype.fontSize = 9; + +// TurtleIconMorph instance creation: + +function TurtleIconMorph(aSpriteOrStage) { + this.init(aSpriteOrStage); +} + +TurtleIconMorph.prototype.init = function (aSpriteOrStage) { + var colors, action, query; + + colors = [ + IDE_Morph.prototype.groupColor, + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor + ]; + + action = () => { + // make my costume the current one + var ide = this.parentThatIsA(IDE_Morph), + wardrobe = this.parentThatIsA(WardrobeMorph); + + if (ide) { + ide.currentSprite.wearCostume(null); + } + if (wardrobe) { + wardrobe.updateSelection(); + } + }; + + query = () => { + // answer true if my costume is the current one + var ide = this.parentThatIsA(IDE_Morph); + + if (ide) { + return ide.currentSprite.costume === null; + } + return false; + }; + + // additional properties: + this.object = aSpriteOrStage; // mandatory, actually + this.version = this.object.version; + this.thumbnail = null; + + // initialize inherited properties: + TurtleIconMorph.uber.init.call( + this, + colors, // color overrides, : [normal, highlight, pressed] + null, // target - not needed here + action, // a toggle function + 'default', // label string + query, // predicate/selector + null, // environment + null // hint + ); + + // override defaults and build additional components + this.isDraggable = false; + this.createThumbnail(); + this.padding = 2; + this.corner = 8; + this.fixLayout(); +}; + +TurtleIconMorph.prototype.createThumbnail = function () { + var isFlat = MorphicPreferences.isFlat; + + if (this.thumbnail) { + this.thumbnail.destroy(); + } + if (this.object instanceof SpriteMorph) { + this.thumbnail = new SymbolMorph( + 'turtle', + this.thumbSize.y, + this.labelColor, + isFlat ? null : new Point(-1, -1), + new Color(0, 0, 0) + ); + } else { + this.thumbnail = new SymbolMorph( + 'stage', + this.thumbSize.y, + this.labelColor, + isFlat ? null : new Point(-1, -1), + new Color(0, 0, 0) + ); + } + this.add(this.thumbnail); +}; + +TurtleIconMorph.prototype.createLabel = function () { + var txt; + + if (this.label) { + this.label.destroy(); + } + txt = new StringMorph( + localize( + this.object instanceof SpriteMorph ? 'Turtle' : 'Empty' + ), + this.fontSize, + this.fontStyle, + true, + false, + false, + this.labelShadowOffset, + this.labelShadowColor, + this.labelColor + ); + + this.label = new FrameMorph(); + this.label.acceptsDrops = false; + this.label.alpha = 0; + this.label.setExtent(txt.extent()); + txt.setPosition(this.label.position()); + this.label.add(txt); + this.add(this.label); +}; + +// TurtleIconMorph layout + +TurtleIconMorph.prototype.fixLayout + = SpriteIconMorph.prototype.fixLayout; + +// TurtleIconMorph drawing + +TurtleIconMorph.prototype.render + = SpriteIconMorph.prototype.render; + +// TurtleIconMorph user menu + +TurtleIconMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this, 'pen'), + on = '\u25CF', + off = '\u25CB'; + if (this.object instanceof StageMorph) { + return null; + } + menu.addItem( + (this.object.penPoint === 'tip' ? on : off) + ' ' + localize('tip'), + () => { + this.object.penPoint = 'tip'; + this.object.changed(); + this.object.fixLayout(); + this.object.rerender(); + } + ); + menu.addItem( + (this.object.penPoint === 'middle' ? on : off) + ' ' + localize( + 'middle' + ), + () => { + this.object.penPoint = 'middle'; + this.object.changed(); + this.object.fixLayout(); + this.object.rerender(); + } + ); + return menu; +}; + +// WardrobeMorph /////////////////////////////////////////////////////// + +// I am a watcher on a sprite's costume list + +// WardrobeMorph inherits from ScrollFrameMorph + +WardrobeMorph.prototype = new ScrollFrameMorph(); +WardrobeMorph.prototype.constructor = WardrobeMorph; +WardrobeMorph.uber = ScrollFrameMorph.prototype; + +// WardrobeMorph settings + +// ... to follow ... + +// WardrobeMorph instance creation: + +function WardrobeMorph(aSprite, sliderColor) { + this.init(aSprite, sliderColor); +} + +WardrobeMorph.prototype.init = function (aSprite, sliderColor) { + // additional properties + this.sprite = aSprite || new SpriteMorph(); + this.costumesVersion = null; + this.spriteVersion = null; + + // initialize inherited properties + WardrobeMorph.uber.init.call(this, null, null, sliderColor); + + // configure inherited properties + // this.fps = 2; // commented out to make scrollbars more responsive + this.updateList(); +}; + +// Wardrobe updating + +WardrobeMorph.prototype.updateList = function () { + var x = this.left() + 5, + y = this.top() + 5, + padding = 4, + toolsPadding = 5, + oldPos = this.contents.position(), + icon, + txt, + paintbutton, + cambutton; + + this.changed(); + + this.contents.destroy(); + this.contents = new FrameMorph(this); + this.contents.acceptsDrops = false; + this.contents.reactToDropOf = (icon) => { + this.reactToDropOf(icon); + }; + this.addBack(this.contents); + + icon = new TurtleIconMorph(this.sprite); + icon.setPosition(new Point(x, y)); + this.addContents(icon); + y = icon.bottom() + padding; + + paintbutton = new PushButtonMorph( + this, + "paintNew", + new SymbolMorph("brush", 15) + ); + paintbutton.padding = 0; + paintbutton.corner = 12; + paintbutton.color = IDE_Morph.prototype.groupColor; + paintbutton.highlightColor = IDE_Morph.prototype.frameColor.darker(50); + paintbutton.pressColor = paintbutton.highlightColor; + paintbutton.labelMinExtent = new Point(36, 18); + paintbutton.labelShadowOffset = new Point(-1, -1); + paintbutton.labelShadowColor = paintbutton.highlightColor; + paintbutton.labelColor = TurtleIconMorph.prototype.labelColor; + paintbutton.contrast = this.buttonContrast; + paintbutton.hint = "Paint a new costume"; + paintbutton.setPosition(new Point(x, y)); + paintbutton.fixLayout(); + paintbutton.setCenter(icon.center()); + paintbutton.setLeft(icon.right() + padding * 4); + + this.addContents(paintbutton); + + if (CamSnapshotDialogMorph.prototype.enableCamera) { + cambutton = new PushButtonMorph( + this, + "newFromCam", + new SymbolMorph("camera", 15) + ); + cambutton.padding = 0; + cambutton.corner = 12; + cambutton.color = IDE_Morph.prototype.groupColor; + cambutton.highlightColor = IDE_Morph.prototype.frameColor.darker(50); + cambutton.pressColor = paintbutton.highlightColor; + cambutton.labelMinExtent = new Point(36, 18); + cambutton.labelShadowOffset = new Point(-1, -1); + cambutton.labelShadowColor = paintbutton.highlightColor; + cambutton.labelColor = TurtleIconMorph.prototype.labelColor; + cambutton.contrast = this.buttonContrast; + cambutton.hint = "Import a new costume from your webcam"; + cambutton.setPosition(new Point(x, y)); + cambutton.fixLayout(); + cambutton.setCenter(paintbutton.center()); + cambutton.setLeft(paintbutton.right() + toolsPadding); + + this.addContents(cambutton); + + if (!CamSnapshotDialogMorph.prototype.enabled) { + cambutton.disable(); + cambutton.hint = + CamSnapshotDialogMorph.prototype.notSupportedMessage; + } + + document.addEventListener( + 'cameraDisabled', + () => { + cambutton.disable(); + cambutton.hint = + CamSnapshotDialogMorph.prototype.notSupportedMessage; + } + ); + } + + txt = new TextMorph(localize( + "costumes tab help" // look up long string in translator + )); + txt.fontSize = 9; + txt.setColor(SpriteMorph.prototype.paletteTextColor); + + txt.setPosition(new Point(x, y)); + this.addContents(txt); + y = txt.bottom() + padding; + + this.sprite.costumes.asArray().forEach(costume => { + icon = new CostumeIconMorph(costume); + icon.setPosition(new Point(x, y)); + this.addContents(icon); + y = icon.bottom() + padding; + }); + this.costumesVersion = this.sprite.costumes.lastChanged; + + this.contents.setPosition(oldPos); + this.adjustScrollBars(); + this.changed(); + + this.updateSelection(); +}; + +WardrobeMorph.prototype.updateSelection = function () { + this.contents.children.forEach(function (morph) { + if (morph.refresh) { + morph.refresh(); + } + }); + this.spriteVersion = this.sprite.version; +}; + +// Wardrobe stepping + +WardrobeMorph.prototype.step = function () { + if (this.costumesVersion !== this.sprite.costumes.lastChanged) { + this.updateList(); + } + if (this.spriteVersion !== this.sprite.version) { + this.updateSelection(); + } +}; + +// Wardrobe ops + +WardrobeMorph.prototype.removeCostumeAt = function (idx) { + this.sprite.shadowAttribute('costumes'); + this.sprite.costumes.remove(idx); + this.updateList(); +}; + +WardrobeMorph.prototype.paintNew = function () { + var ide = this.parentThatIsA(IDE_Morph), + cos = new Costume( + newCanvas(null, true), + this.sprite.newCostumeName(localize('Untitled')), + null, // rotation center + null, // don't shrink-to-fit + ide.stage.dimensions // max extent + ); + + cos.edit( + this.world(), + ide, + true, + null, + () => { + this.sprite.shadowAttribute('costumes'); + this.sprite.addCostume(cos); + this.updateList(); + this.sprite.wearCostume(cos); + this.sprite.recordUserEdit( + 'costume', + 'draw', + cos.name + ); + } + ); +}; + +WardrobeMorph.prototype.newFromCam = function () { + var camDialog, + ide = this.parentThatIsA(IDE_Morph), + sprite = this.sprite; + + camDialog = new CamSnapshotDialogMorph( + ide, + sprite, + nop, + costume => { + sprite.addCostume(costume); + sprite.wearCostume(costume); + this.updateList(); + sprite.recordUserEdit( + 'costume', + 'snap', + costume.name + ); + }); + + camDialog.key = 'camera'; + camDialog.popUp(this.world()); +}; + +// Wardrobe drag & drop + +WardrobeMorph.prototype.wantsDropOf = function (morph) { + return morph instanceof CostumeIconMorph; +}; + +WardrobeMorph.prototype.reactToDropOf = function (icon) { + var idx = 0, + costume = icon.object, + top = icon.top(); + icon.destroy(); + this.contents.children.forEach(item => { + if (item instanceof CostumeIconMorph && item.top() < top - 4) { + idx += 1; + } + }); + this.sprite.shadowAttribute('costumes'); + this.sprite.costumes.add(costume, idx + 1); + this.updateList(); + icon.mouseClickLeft(); // select + this.sprite.recordUserEdit( + 'costume', + 'add', + costume.name, + idx + 1 + ); +}; + +// SoundIconMorph /////////////////////////////////////////////////////// + +/* + I am an element in the SpriteEditor's "Sounds" tab. +*/ + +// SoundIconMorph inherits from ToggleButtonMorph (Widgets) +// ... and copies methods from SpriteIconMorph + +SoundIconMorph.prototype = new ToggleButtonMorph(); +SoundIconMorph.prototype.constructor = SoundIconMorph; +SoundIconMorph.uber = ToggleButtonMorph.prototype; + +// SoundIconMorph settings + +SoundIconMorph.prototype.thumbSize = new Point(80, 60); +SoundIconMorph.prototype.labelShadowOffset = null; +SoundIconMorph.prototype.labelShadowColor = null; +SoundIconMorph.prototype.labelColor = WHITE; +SoundIconMorph.prototype.fontSize = 9; + +// SoundIconMorph instance creation: + +function SoundIconMorph(aSound) { + this.init(aSound); +} + +SoundIconMorph.prototype.init = function (aSound) { + var colors, action, query; + + colors = [ + IDE_Morph.prototype.groupColor, + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.frameColor + ]; + + action = nop; // When I am selected (which is never the case for sounds) + + query = () => false; + + // additional properties: + this.object = aSound; // mandatory, actually + this.version = this.object.version; + this.thumbnail = null; + + // initialize inherited properties: + SoundIconMorph.uber.init.call( + this, + colors, // color overrides, : [normal, highlight, pressed] + null, // target - not needed here + action, // a toggle function + this.object.name, // label string + query, // predicate/selector + null, // environment + null // hint + ); + + // override defaults and build additional components + this.isDraggable = true; + this.createThumbnail(); + this.padding = 2; + this.corner = 8; + this.fixLayout(); + this.fps = 1; +}; + +SoundIconMorph.prototype.createThumbnail = function () { + var label; + if (this.thumbnail) { + this.thumbnail.destroy(); + } + this.thumbnail = new Morph(); + this.thumbnail.bounds.setExtent(this.thumbSize); + this.add(this.thumbnail); + label = new StringMorph( + this.createInfo(), + '16', + '', + true, + false, + false, + this.labelShadowOffset, + this.labelShadowColor, + new Color(200, 200, 200) + ); + this.thumbnail.add(label); + label.setCenter(new Point(40, 15)); + + this.button = new PushButtonMorph( + this, + 'toggleAudioPlaying', + (this.object.previewAudio ? 'Stop' : 'Play') + ); + this.button.hint = 'Play sound'; + this.button.fixLayout(); + this.thumbnail.add(this.button); + this.button.setCenter(new Point(40, 40)); +}; + +SoundIconMorph.prototype.createInfo = function () { + var dur = Math.round(this.object.audio.duration || 0), + mod = dur % 60; + return Math.floor(dur / 60).toString() + + ":" + + (mod < 10 ? "0" : "") + + mod.toString(); +}; + +SoundIconMorph.prototype.toggleAudioPlaying = function () { + if (!this.object.previewAudio) { + //Audio is not playing + this.button.labelString = 'Stop'; + this.button.hint = 'Stop sound'; + this.object.previewAudio = this.object.play(); + this.object.previewAudio.addEventListener( + 'ended', + () => this.audioHasEnded(), + false + ); + } else { + //Audio is currently playing + this.button.labelString = 'Play'; + this.button.hint = 'Play sound'; + this.object.previewAudio.pause(); + this.object.previewAudio.terminated = true; + this.object.previewAudio = null; + } + this.button.createLabel(); +}; + +SoundIconMorph.prototype.audioHasEnded = function () { + this.button.trigger(); + this.button.mouseLeave(); +}; + +SoundIconMorph.prototype.createLabel + = SpriteIconMorph.prototype.createLabel; + +// SoundIconMorph stepping + +/* +SoundIconMorph.prototype.step + = SpriteIconMorph.prototype.step; +*/ + +// SoundIconMorph layout + +SoundIconMorph.prototype.fixLayout + = SpriteIconMorph.prototype.fixLayout; + +// SoundIconMorph menu + +SoundIconMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + if (!(this.object instanceof Sound)) { return null; } + menu.addItem('rename', 'renameSound'); + menu.addItem('delete', 'removeSound'); + menu.addLine(); + menu.addItem('export', 'exportSound'); + return menu; +}; + + +SoundIconMorph.prototype.renameSound = function () { + var sound = this.object, + ide = this.parentThatIsA(IDE_Morph); + this.disinherit(); + new DialogBoxMorph( + null, + answer => { + var old = sound.name; + if (answer && (answer !== old)) { + sound.name = answer; + sound.version = Date.now(); + this.createLabel(); // can be omitted once I'm stepping + this.fixLayout(); // can be omitted once I'm stepping + ide.hasChangedMedia = true; + ide.currentSprite.recordUserEdit( + 'sound', + 'rename', + old, + sound.name + ); + + } + } + ).prompt( + 'rename sound', + sound.name, + this.world() + ); +}; + +SoundIconMorph.prototype.removeSound = function () { + var jukebox = this.parentThatIsA(JukeboxMorph), + idx = this.parent.children.indexOf(this) - 1; + jukebox.removeSound(idx); + jukebox.sprite.recordUserEdit( + 'sound', + 'delete', + idx, + this.object.name + ); +}; + +SoundIconMorph.prototype.exportSound = function () { + var ide = this.parentThatIsA(IDE_Morph); + ide.saveAudioAs(this.object.audio, this.object.name); +}; + +SoundIconMorph.prototype.render + = SpriteIconMorph.prototype.render; + +SoundIconMorph.prototype.createLabel + = SpriteIconMorph.prototype.createLabel; + +// SoundIconMorph inheritance + +SoundIconMorph.prototype.disinherit = function () { + var jukebox = this.parentThatIsA(JukeboxMorph), + idx = this.parent.children.indexOf(this); + if (jukebox.sprite.inheritsAttribute('sounds')) { + jukebox.sprite.shadowAttribute('sounds'); + this.object = jukebox.sprite.sounds.at(idx - 1); + } +}; + +// SoundIconMorph drag & drop + +SoundIconMorph.prototype.prepareToBeGrabbed = function () { + this.disinherit(); + this.userState = 'pressed'; + this.state = true; + this.rerender(); + this.removeSound(); +}; + +// JukeboxMorph ///////////////////////////////////////////////////// + +/* + I am JukeboxMorph, like WardrobeMorph, but for sounds +*/ + +// JukeboxMorph instance creation + +JukeboxMorph.prototype = new ScrollFrameMorph(); +JukeboxMorph.prototype.constructor = JukeboxMorph; +JukeboxMorph.uber = ScrollFrameMorph.prototype; + +function JukeboxMorph(aSprite, sliderColor) { + this.init(aSprite, sliderColor); +} + +JukeboxMorph.prototype.init = function (aSprite, sliderColor) { + // additional properties + this.sprite = aSprite || new SpriteMorph(); + this.soundsVersion = null; + this.spriteVersion = null; + + // initialize inherited properties + JukeboxMorph.uber.init.call(this, null, null, sliderColor); + + // configure inherited properties + this.acceptsDrops = false; + // this.fps = 2; // commented out to make scrollbars more responsive + this.updateList(); +}; + +// Jukebox updating + +JukeboxMorph.prototype.updateList = function () { + var x = this.left() + 5, + y = this.top() + 5, + padding = 4, + icon, + txt, + ide = this.sprite.parentThatIsA(IDE_Morph), + recordButton; + + this.changed(); + + this.contents.destroy(); + this.contents = new FrameMorph(this); + this.contents.acceptsDrops = false; + this.contents.reactToDropOf = (icon) => this.reactToDropOf(icon); + this.addBack(this.contents); + + txt = new TextMorph(localize( + 'import a sound from your computer\nby dragging it into here' + )); + txt.fontSize = 9; + txt.setColor(SpriteMorph.prototype.paletteTextColor); + txt.setPosition(new Point(x, y)); + this.addContents(txt); + + recordButton = new PushButtonMorph( + ide, + 'recordNewSound', + new SymbolMorph('circleSolid', 15) + ); + recordButton.padding = 0; + recordButton.corner = 12; + recordButton.color = IDE_Morph.prototype.groupColor; + recordButton.highlightColor = IDE_Morph.prototype.frameColor.darker(50); + recordButton.pressColor = recordButton.highlightColor; + recordButton.labelMinExtent = new Point(36, 18); + recordButton.labelShadowOffset = new Point(-1, -1); + recordButton.labelShadowColor = recordButton.highlightColor; + recordButton.labelColor = TurtleIconMorph.prototype.labelColor; + recordButton.contrast = this.buttonContrast; + recordButton.hint = 'Record a new sound'; + recordButton.fixLayout(); + recordButton.label.setColor(new Color(255, 20, 20)); + recordButton.setPosition(txt.bottomLeft().add(new Point(0, padding * 2))); + + this.addContents(recordButton); + + y = recordButton.bottom() + padding; + + this.sprite.sounds.asArray().forEach(sound => { + icon = new SoundIconMorph(sound); + icon.setPosition(new Point(x, y)); + this.addContents(icon); + y = icon.bottom() + padding; + }); + this.soundsVersion = this.sprite.sounds.lastChanged; + + this.changed(); + this.updateSelection(); +}; + +JukeboxMorph.prototype.updateSelection = function () { + this.contents.children.forEach(morph => { + if (morph.refresh) { + morph.refresh(); + } + }); + this.spriteVersion = this.sprite.version; +}; + +// Jukebox stepping + +JukeboxMorph.prototype.step = function () { + if (this.soundsVersion !== this.sprite.sounds.lastChanged) { + this.updateList(); + } + if (this.spriteVersion !== this.sprite.version) { + this.updateSelection(); + } +}; + +// Jukebox ops + +JukeboxMorph.prototype.removeSound = function (idx) { + this.sprite.sounds.remove(idx); + this.updateList(); +}; + +// Jukebox drag & drop + +JukeboxMorph.prototype.wantsDropOf = function (morph) { + return morph instanceof SoundIconMorph; +}; + +JukeboxMorph.prototype.reactToDropOf = function (icon) { + var idx = 0, + sound = icon.object, + top = icon.top(); + + icon.destroy(); + this.contents.children.forEach(item => { + if (item instanceof SoundIconMorph && item.top() < top - 4) { + idx += 1; + } + }); + + this.sprite.shadowAttribute('sounds'); + this.sprite.sounds.add(sound, idx + 1); + this.updateList(); + + this.sprite.recordUserEdit( + 'sound', + 'add', + sound.name, + idx + 1 + ); +}; + +// SceneIconMorph //////////////////////////////////////////////////// + +/* + I am a selectable element in a SceneAlbum, keeping + a self-updating thumbnail of the scene I'm respresenting, and a + self-updating label of the scene's name (in case it is changed + elsewhere) +*/ + +// SceneIconMorph inherits from ToggleButtonMorph (Widgets) +// ... and copies methods from SpriteIconMorph + +SceneIconMorph.prototype = new ToggleButtonMorph(); +SceneIconMorph.prototype.constructor = SceneIconMorph; +SceneIconMorph.uber = ToggleButtonMorph.prototype; + +// SceneIconMorph settings + +SceneIconMorph.prototype.thumbSize = new Point(40, 30); +SceneIconMorph.prototype.labelShadowOffset = null; +SceneIconMorph.prototype.labelShadowColor = null; +SceneIconMorph.prototype.labelColor = WHITE; +SceneIconMorph.prototype.fontSize = 9; + +// SceneIconMorph instance creation: + +function SceneIconMorph(aScene) { + this.init(aScene); +} + +SceneIconMorph.prototype.init = function (aScene) { + var colors, action, query; + + colors = [ + IDE_Morph.prototype.frameColor, + IDE_Morph.prototype.groupColor, + IDE_Morph.prototype.groupColor + ]; + + action = () => { + // make my scene the current one + var ide = this.parentThatIsA(IDE_Morph), + album = this.parentThatIsA(SceneAlbumMorph); + album.scene = this.object; + ide.switchToScene(this.object); + }; + + query = () => { + // answer true if my scene is the current one + var album = this.parentThatIsA(SceneAlbumMorph); + if (album) { + return album.scene === this.object; + } + return false; + }; + + // additional properties: + this.object = aScene || new Scene(); // mandatory, actually + this.version = this.object.stage.version; + this.thumbnail = null; + + // initialize inherited properties: + SceneIconMorph.uber.init.call( + this, + colors, // color overrides, : [normal, highlight, pressed] + null, // target - not needed here + action, // a toggle function + this.object.name || localize('untitled'), // label string + query, // predicate/selector + null, // environment + null // hint + ); + + // override defaults and build additional components + this.isDraggable = true; + this.createThumbnail(); + this.padding = 2; + this.corner = 8; + this.fixLayout(); + this.fps = 1; +}; + +SceneIconMorph.prototype.createThumbnail = function () { + if (this.thumbnail) { + this.thumbnail.destroy(); + } + + this.thumbnail = new Morph(); + this.thumbnail.isCachingImage = true; + this.thumbnail.bounds.setExtent(this.thumbSize); + this.thumbnail.cachedImage = this.object.stage.thumbnail( + this.thumbSize, + this.thumbnail.cachedImage + ); + this.add(this.thumbnail); +}; + +SceneIconMorph.prototype.createLabel = function () { + var txt; + + if (this.label) { + this.label.destroy(); + } + txt = new StringMorph( + this.object.name || localize('untitled'), + this.fontSize, + this.fontStyle, + false, // true + false, + false, + this.labelShadowOffset, + this.labelShadowColor, + this.labelColor + ); + + this.label = new FrameMorph(); + this.label.acceptsDrops = false; + this.label.alpha = 0; + this.label.setExtent(txt.extent()); + txt.setPosition(this.label.position()); + this.label.add(txt); + this.add(this.label); +}; + +// SceneIconMorph stepping + +SceneIconMorph.prototype.step = function () { + if (this.version !== this.object.stage.version) { + this.createThumbnail(); + this.createLabel(); + this.fixLayout(); + this.version = this.object.stage.version; + this.refresh(); + } +}; + +// SceneIconMorph layout + +SceneIconMorph.prototype.fixLayout + = SpriteIconMorph.prototype.fixLayout; + +// SceneIconMorph menu + +SceneIconMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this); + if (!(this.object instanceof Scene)) { + return null; + } + if (!this.isProjectScene()) { + menu.addItem("rename", "renameScene"); + menu.addItem("delete", "removeScene"); + } + menu.addItem("export", "exportScene"); + return menu; +}; + +SceneIconMorph.prototype.renameScene = function () { + var scene = this.object, + ide = this.parentThatIsA(IDE_Morph); + new DialogBoxMorph( + null, + answer => { + if (answer && (answer !== scene.name)) { + scene.name = ide.newSceneName( + answer, + scene + ); + scene.stage.version = Date.now(); + if (scene === ide.scene) { + ide.controlBar.updateLabel(); + } + ide.recordUnsavedChanges(); + } + } + ).prompt( + 'rename scene', + scene.name, + this.world() + ); +}; + +SceneIconMorph.prototype.removeScene = function () { + var album = this.parentThatIsA(SceneAlbumMorph), + idx = this.parent.children.indexOf(this) + 1, + off = 0, // 2, + ide = this.parentThatIsA(IDE_Morph); + album.removeSceneAt(idx - off); // ignore buttons + if (ide.scene === this.object) { + ide.switchToScene(ide.scenes.at(1)); + } +}; + +SceneIconMorph.prototype.exportScene = function () { + // Export scene as project XML, saving a file to disk + var menu, str, + ide = this.parentThatIsA(IDE_Morph), + name = this.object.name || localize('untitled'); + + try { + menu = ide.showMessage('Exporting'); + str = ide.serializer.serialize( + new Project(new List([this.object]), this.object) + ); + ide.saveXMLAs(str, name); + menu.destroy(); + ide.showMessage('Exported!', 1); + } catch (err) { + if (Process.prototype.isCatchingErrors) { + ide.showMessage('Export failed: ' + err); + } else { + throw err; + } + } +}; + +// SceneIconMorph ops + +SceneIconMorph.prototype.isProjectScene = function (anIDE) { + // the first scene of a project cannot be renamed, deleted or rearranged, + // because its name and project notes are those of the project + var ide = anIDE || this.parentThatIsA(IDE_Morph); + return ide.scenes.indexOf(this.object) === 1; +}; + +// SceneIconMorph drawing + +SceneIconMorph.prototype.render + = SpriteIconMorph.prototype.render; + +// SceneIconMorph drag & drop + +SceneIconMorph.prototype.rootForGrab = function () { + return this; +}; + +SceneIconMorph.prototype.prepareToBeGrabbed = function () { + this.mouseClickLeft(); // select me + this.removeScene(); +}; + +// SceneAlbumMorph /////////////////////////////////////////////////////// + +// I am a watcher on a project's scenes list + +// SceneAlbumMorph inherits from ScrollFrameMorph + +SceneAlbumMorph.prototype = new ScrollFrameMorph(); +SceneAlbumMorph.prototype.constructor = SceneAlbumMorph; +SceneAlbumMorph.uber = ScrollFrameMorph.prototype; + +// SceneAlbumMorph instance creation: + +function SceneAlbumMorph(anIDE, sliderColor) { + this.init(anIDE, sliderColor); +} + +SceneAlbumMorph.prototype.init = function (anIDE, sliderColor) { + // additional properties + this.ide = anIDE; + this.scene = anIDE.scene; + this.version = null; + + // initialize inherited properties + SceneAlbumMorph.uber.init.call(this, null, null, sliderColor); + + // configure inherited properties + // this.fps = 2; // commented out to make scrollbars more responsive + this.updateList(); + this.updateSelection(); +}; + +// SceneAlbumMorph updating + +SceneAlbumMorph.prototype.updateList = function () { + var x = this.left() + 5, + y = this.top() + 5, + padding = 4, + oldPos = this.contents.position(), + icon; + + this.changed(); + + this.contents.destroy(); + this.contents = new FrameMorph(this); + this.contents.acceptsDrops = false; + this.contents.reactToDropOf = (icon) => { + this.reactToDropOf(icon); + }; + this.addBack(this.contents); + + this.ide.scenes.asArray().forEach((scene, i) => { + icon = new SceneIconMorph(scene); + if (i < 1) { + icon.isDraggable = false; // project scene cannot be rearranged + } + icon.setPosition(new Point(x, y)); + this.addContents(icon); + y = icon.bottom() + padding; + }); + this.version = this.ide.scenes.lastChanged; + + this.contents.setPosition(oldPos); + this.adjustScrollBars(); + this.changed(); + + this.updateSelection(); +}; + +SceneAlbumMorph.prototype.updateSelection = function () { + this.scene = this.ide.scene; + this.contents.children.forEach(function (morph) { + if (morph.refresh) { + morph.refresh(); + } + }); +}; + +// SceneAlbumMorph stepping + +SceneAlbumMorph.prototype.step = function () { + if (this.version !== this.ide.scenes.lastChanged) { + this.updateList(); + } + if (this.scene !== this.ide.scene) { + this.updateSelection(); + } +}; + +// Wardrobe ops + +SceneAlbumMorph.prototype.removeSceneAt = function (idx) { + this.ide.scenes.remove(idx); + this.updateList(); +}; + +// SceneAlbumMorph drag & drop + +SceneAlbumMorph.prototype.wantsDropOf = function (morph) { + return morph instanceof SceneIconMorph; +}; + +SceneAlbumMorph.prototype.reactToDropOf = function (icon) { + var idx = 0, + scene = icon.object, + top = icon.top(); + icon.destroy(); + this.contents.children.forEach(item => { + if (item instanceof SceneIconMorph && item.top() < top - 4) { + idx += 1; + } + }); + idx = Math.max(idx, 1); // the project scene cannot the rearranged + this.ide.scenes.add(scene, idx + 1); + this.updateList(); + icon.mouseClickLeft(); // select +}; + +// StageHandleMorph //////////////////////////////////////////////////////// + +// I am a horizontal resizing handle for a StageMorph + +// StageHandleMorph inherits from Morph: + +StageHandleMorph.prototype = new Morph(); +StageHandleMorph.prototype.constructor = StageHandleMorph; +StageHandleMorph.uber = Morph.prototype; + +// StageHandleMorph instance creation: + +function StageHandleMorph(target) { + this.init(target); +} + +StageHandleMorph.prototype.init = function (target) { + this.target = target || null; + this.userState = 'normal'; // or 'highlight' + HandleMorph.uber.init.call(this); + this.color = MorphicPreferences.isFlat ? + IDE_Morph.prototype.backgroundColor : new Color(190, 190, 190); + this.isDraggable = false; + this.setExtent(new Point(12, 50)); +}; + +// StageHandleMorph drawing: + +StageHandleMorph.prototype.render = function (ctx) { + if (this.userState === 'highlight') { + this.renderOn( + ctx, + MorphicPreferences.isFlat ? + new Color(245, 245, 255) : new Color(100, 100, 255), + this.color + ); + } else { // assume 'normal' + this.renderOn(ctx, this.color); + } +}; + +StageHandleMorph.prototype.renderOn = function ( + ctx, + color, + shadowColor +) { + var l = this.height() / 8, + w = this.width() / 6, + r = w / 2, + x, + y, + i; + + ctx.lineWidth = w; + ctx.lineCap = 'round'; + y = this.height() / 2; + + ctx.strokeStyle = color.toString(); + x = this.width() / 12; + for (i = 0; i < 3; i += 1) { + if (i > 0) { + ctx.beginPath(); + ctx.moveTo(x, y - (l - r)); + ctx.lineTo(x, y + (l - r)); + ctx.stroke(); + } + x += (w * 2); + l *= 2; + } + if (shadowColor) { + ctx.strokeStyle = shadowColor.toString(); + x = this.width() / 12 + w; + l = this.height() / 8; + for (i = 0; i < 3; i += 1) { + if (i > 0) { + ctx.beginPath(); + ctx.moveTo(x, y - (l - r)); + ctx.lineTo(x, y + (l - r)); + ctx.stroke(); + } + x += (w * 2); + l *= 2; + } + } +}; + +// StageHandleMorph layout: + +StageHandleMorph.prototype.fixLayout = function () { + if (!this.target) {return; } + var ide = this.target.parentThatIsA(IDE_Morph); + this.setTop(this.target.top() + 10); + this.setRight(this.target.left()); + if (ide) {ide.add(this); } // come to front +}; + +// StageHandleMorph stepping: + +StageHandleMorph.prototype.step = null; + +StageHandleMorph.prototype.mouseDownLeft = function (pos) { + var world = this.world(), + offset = this.right() - pos.x, + ide = this.target.parentThatIsA(IDE_Morph); + + if (!this.target) { + return null; + } + ide.isSmallStage = true; + ide.controlBar.stageSizeButton.refresh(); + + this.step = function () { + var newPos, newWidth; + if (world.hand.mouseButton) { + newPos = world.hand.bounds.origin.x + offset; + newWidth = this.target.right() - newPos; + ide.stageRatio = newWidth / this.target.dimensions.x; + ide.setExtent(world.extent()); + + } else { + this.step = null; + ide.isSmallStage = (ide.stageRatio !== 1); + ide.controlBar.stageSizeButton.refresh(); + } + }; +}; + +// StageHandleMorph events: + +StageHandleMorph.prototype.mouseEnter = function () { + this.userState = 'highlight'; + this.rerender(); +}; + +StageHandleMorph.prototype.mouseLeave = function () { + this.userState = 'normal'; + this.rerender(); +}; + +StageHandleMorph.prototype.mouseDoubleClick = function () { + this.target.parentThatIsA(IDE_Morph).toggleStageSize(true, 1); +}; + +// PaletteHandleMorph //////////////////////////////////////////////////////// + +// I am a horizontal resizing handle for a blocks palette +// I pseudo-inherit many things from StageHandleMorph + +// PaletteHandleMorph inherits from Morph: + +PaletteHandleMorph.prototype = new Morph(); +PaletteHandleMorph.prototype.constructor = PaletteHandleMorph; +PaletteHandleMorph.uber = Morph.prototype; + +// PaletteHandleMorph instance creation: + +function PaletteHandleMorph(target) { + this.init(target); +} + +PaletteHandleMorph.prototype.init = function (target) { + this.target = target || null; + this.userState = 'normal'; + HandleMorph.uber.init.call(this); + this.color = MorphicPreferences.isFlat ? + IDE_Morph.prototype.backgroundColor : new Color(190, 190, 190); + this.isDraggable = false; + this.setExtent(new Point(12, 50)); +}; + +// PaletteHandleMorph drawing: + +PaletteHandleMorph.prototype.render = + StageHandleMorph.prototype.render; + +PaletteHandleMorph.prototype.renderOn = + StageHandleMorph.prototype.renderOn; + +// PaletteHandleMorph layout: + +PaletteHandleMorph.prototype.fixLayout = function () { + if (!this.target) {return; } + var ide = this.target.parentThatIsA(IDE_Morph); + this.setTop(this.target.top() + 10); + this.setRight(this.target.right()); + if (ide) {ide.add(this); } // come to front +}; + +// PaletteHandleMorph stepping: + +PaletteHandleMorph.prototype.step = null; + +PaletteHandleMorph.prototype.mouseDownLeft = function (pos) { + var world = this.world(), + offset = this.right() - pos.x, + ide = this.target.parentThatIsA(IDE_Morph), + cnf = ide.config, + border = cnf.border || 0; + + if (!this.target) { + return null; + } + this.step = function () { + var newPos; + if (world.hand.mouseButton) { + newPos = world.hand.bounds.origin.x + offset; + ide.paletteWidth = Math.min( + Math.max( + 200, newPos - ide.left() - border * 2), + cnf.noSprites ? + ide.width() - border * 2 + : ide.stageHandle.left() - + ide.spriteBar.tabBar.width() + ); + ide.setExtent(world.extent()); + + } else { + this.step = null; + } + }; +}; + +// PaletteHandleMorph events: + +PaletteHandleMorph.prototype.mouseEnter + = StageHandleMorph.prototype.mouseEnter; + +PaletteHandleMorph.prototype.mouseLeave + = StageHandleMorph.prototype.mouseLeave; + +PaletteHandleMorph.prototype.mouseDoubleClick = function () { + this.target.parentThatIsA(IDE_Morph).setPaletteWidth(200); +}; + +// CamSnapshotDialogMorph //////////////////////////////////////////////////// + +/* + I am a dialog morph that lets users take a snapshot using their webcam + and use it as a costume for their sprites or a background for the Stage. +*/ + +// CamSnapshotDialogMorph inherits from DialogBoxMorph: + +CamSnapshotDialogMorph.prototype = new DialogBoxMorph(); +CamSnapshotDialogMorph.prototype.constructor = CamSnapshotDialogMorph; +CamSnapshotDialogMorph.uber = DialogBoxMorph.prototype; + +// CamSnapshotDialogMorph settings + +CamSnapshotDialogMorph.prototype.enableCamera = true; +CamSnapshotDialogMorph.prototype.enabled = true; + +CamSnapshotDialogMorph.prototype.notSupportedMessage = + 'Please make sure your web browser is up to date\n' + + 'and your camera is properly configured. \n\n' + + 'Some browsers also require you to access Snap!\n' + + 'through HTTPS to use the camera.\n\n' + + 'Plase replace the "http://" part of the address\n' + + 'in your browser by "https://" and try again.'; + +// CamSnapshotDialogMorph instance creation + +function CamSnapshotDialogMorph(ide, sprite, onCancel, onAccept) { + this.init(ide, sprite, onCancel, onAccept); +} + +CamSnapshotDialogMorph.prototype.init = function ( + ide, + sprite, + onCancel, + onAccept +) { + this.ide = ide; + this.sprite = sprite; + this.padding = 10; + this.oncancel = onCancel; + this.accept = onAccept; + this.videoElement = null; // an HTML5 video element + this.videoView = new Morph(); // a morph where we'll copy the video contents + this.videoView.isCachingImage = true; + + CamSnapshotDialogMorph.uber.init.call(this); + this.labelString = 'Camera'; + this.createLabel(); + this.buildContents(); +}; + +CamSnapshotDialogMorph.prototype.buildContents = function () { + var myself = this, + stage = this.sprite.parentThatIsA(StageMorph); + + function noCameraSupport() { + myself.disable(); + myself.ide.inform( + 'Camera not supported', + CamSnapshotDialogMorph.prototype.notSupportedMessage + ); + if (myself.videoElement) { + myself.videoElement.remove(); + } + myself.cancel(); + } + + this.videoElement = document.createElement('video'); + this.videoElement.hidden = true; + this.videoElement.width = stage.dimensions.x; + this.videoElement.height = stage.dimensions.y; + + document.body.appendChild(this.videoElement); + + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + navigator.mediaDevices.getUserMedia({ video: true }) + .then(stream => { + this.videoElement.srcObject = stream; + this.videoElement.play().catch(noCameraSupport); + this.videoElement.stream = stream; + }).catch(noCameraSupport); + } + + this.videoView.setExtent(stage.dimensions); + this.videoView.cachedImage = newCanvas( + stage.dimensions, + true, // retina, maybe overkill here + this.videoView.cachedImage + ); + + this.videoView.drawOn = function (ctx, rect) { + var videoWidth = myself.videoElement.videoWidth, + videoHeight = myself.videoElement.videoHeight, + w = stage.dimensions.x, + h = stage.dimensions.y, + clippingWidth, clippingHeight; + + if (!videoWidth) { return; } + + ctx.save(); + + // Flip the image so it looks like a mirror + ctx.translate(w, 0); + ctx.scale(-1, 1); + + if (videoWidth / w > videoHeight / h) { + // preserve height, crop width + clippingWidth = w * (videoHeight / h); + clippingHeight = videoHeight; + } else { + // preserve width, crop height + clippingWidth = videoWidth; + clippingHeight = h * (videoWidth / w); + } + + ctx.drawImage( + myself.videoElement, + 0, + 0, + clippingWidth, + clippingHeight, + this.left() * -1, + this.top(), + w, + h + ); + + ctx.restore(); + }; + + this.videoView.step = function () { + this.changed(); + }; + + this.addBody(new AlignmentMorph('column', this.padding / 2)); + this.body.add(this.videoView); + this.body.fixLayout(); + + this.addButton('ok', 'Save'); + this.addButton('cancel', 'Cancel'); + + this.fixLayout(); + this.rerender(); +}; + +CamSnapshotDialogMorph.prototype.ok = function () { + this.accept( + new Costume( + this.videoView.fullImage(), + this.sprite.newCostumeName('camera'), + null, + true // no shrink-wrap + ).flipped() + ); +}; + +CamSnapshotDialogMorph.prototype.disable = function () { + CamSnapshotDialogMorph.prototype.enabled = false; + document.dispatchEvent(new Event('cameraDisabled')); +}; + +CamSnapshotDialogMorph.prototype.destroy = function () { + this.oncancel.call(this); + this.close(); +}; + +CamSnapshotDialogMorph.prototype.close = function () { + if (this.videoElement && this.videoElement.stream) { + this.videoElement.stream.getTracks()[0].stop(); + this.videoElement.remove(); + } + CamSnapshotDialogMorph.uber.destroy.call(this); +}; + +// SoundRecorderDialogMorph //////////////////////////////////////////////////// + +/* + I am a dialog morph that lets users record sound snippets for their + sprites or Stage. +*/ + +// SoundRecorderDialogMorph inherits from DialogBoxMorph: + +SoundRecorderDialogMorph.prototype = new DialogBoxMorph(); +SoundRecorderDialogMorph.prototype.constructor = SoundRecorderDialogMorph; +SoundRecorderDialogMorph.uber = DialogBoxMorph.prototype; + +// SoundRecorderDialogMorph instance creation + +function SoundRecorderDialogMorph(onAccept) { + this.init(onAccept); +} + +SoundRecorderDialogMorph.prototype.init = function (onAccept) { + var myself = this; + this.padding = 10; + this.accept = onAccept; + + this.mediaRecorder = null; // an HTML5 MediaRecorder object + this.audioElement = document.createElement('audio'); + this.audioElement.hidden = true; + this.audioElement.onended = function (event) { + myself.stop(); + }; + document.body.appendChild(this.audioElement); + + this.recordButton = null; + this.stopButton = null; + this.playButton = null; + this.progressBar = new BoxMorph(); + + SoundRecorderDialogMorph.uber.init.call(this); + this.labelString = 'Sound Recorder'; + this.createLabel(); + this.buildContents(); +}; + +SoundRecorderDialogMorph.prototype.buildContents = function () { + var audioChunks = []; + + this.recordButton = new PushButtonMorph( + this, + 'record', + new SymbolMorph('circleSolid', 10) + ); + + this.stopButton = new PushButtonMorph( + this, + 'stop', + new SymbolMorph('rectangleSolid', 10) + ); + + this.playButton = new PushButtonMorph( + this, + 'play', + new SymbolMorph('pointRight', 10) + ); + + this.buildProgressBar(); + + this.addBody(new AlignmentMorph('row', this.padding)); + this.body.add(this.recordButton); + this.body.add(this.stopButton); + this.body.add(this.playButton); + this.body.add(this.progressBar); + + this.body.fixLayout(); + + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + navigator.mediaDevices.getUserMedia( + { + audio: { + channelCount: 1 // force mono, currently only works on FF + } + + } + ).then(stream => { + this.mediaRecorder = new MediaRecorder(stream); + this.mediaRecorder.ondataavailable = (event) => { + audioChunks.push(event.data); + }; + this.mediaRecorder.onstop = (event) => { + var buffer = new Blob(audioChunks), + reader = new window.FileReader(); + reader.readAsDataURL(buffer); + reader.onloadend = () => { + var base64 = reader.result; + base64 = 'data:audio/ogg;base64,' + + base64.split(',')[1]; + this.audioElement.src = base64; + this.audioElement.load(); + audioChunks = []; + }; + }; + }); + } + + this.addButton('ok', 'Save'); + this.addButton('cancel', 'Cancel'); + + this.fixLayout(); + this.rerender(); +}; + +SoundRecorderDialogMorph.prototype.buildProgressBar = function () { + var line = new Morph(), + myself = this; + + this.progressBar.setExtent(new Point(150, 20)); + this.progressBar.setColor(new Color(200, 200, 200)); + this.progressBar.setBorderWidth(1); + this.progressBar.setBorderColor(new Color(150, 150, 150)); + + line.setExtent(new Point(130, 2)); + line.setColor(new Color(50, 50, 50)); + line.setCenter(this.progressBar.center()); + this.progressBar.add(line); + + this.progressBar.indicator = new Morph(); + this.progressBar.indicator.setExtent(new Point(5, 15)); + this.progressBar.indicator.setColor(new Color(50, 200, 50)); + this.progressBar.indicator.setCenter(line.leftCenter()); + + this.progressBar.add(this.progressBar.indicator); + + this.progressBar.setPercentage = function (percentage) { + this.indicator.setLeft( + line.left() + + (line.width() / 100 * percentage) - + this.indicator.width() / 2 + ); + }; + + this.progressBar.step = function () { + if (myself.audioElement.duration) { + this.setPercentage( + myself.audioElement.currentTime / + myself.audioElement.duration * 100); + } else { + this.setPercentage(0); + } + }; +}; + +SoundRecorderDialogMorph.prototype.record = function () { + if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') { + this.stop(); + return; + } + + this.mediaRecorder.start(); + this.recordButton.label.setColor(new Color(255, 0, 0)); + this.playButton.label.setColor(new Color(0, 0, 0)); +}; + +SoundRecorderDialogMorph.prototype.stop = function () { + if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') { + this.mediaRecorder.stop(); + } + + this.audioElement.pause(); + this.audioElement.currentTime = 0; + + this.recordButton.label.setColor(new Color(0, 0, 0)); + this.playButton.label.setColor(new Color(0, 0, 0)); +}; + +SoundRecorderDialogMorph.prototype.play = function () { + this.stop(); + this.audioElement.oncanplaythrough = function () { + this.play(); + this.oncanplaythrough = nop; + }; + this.playButton.label.setColor(new Color(0, 255, 0)); +}; + +SoundRecorderDialogMorph.prototype.ok = function () { + var myself = this; + this.stop(); + this.audioElement.oncanplaythrough = function () { + if (this.duration && this.duration !== Infinity) { + myself.accept(this); + this.oncanplaythrough = nop; + myself.destroy(); + } else { + // For some reason, we need to play the sound + // at least once to get its duration. + myself.buttons.children.forEach(button => + button.disable() + ); + this.play(); + } + }; + +}; + +SoundRecorderDialogMorph.prototype.destroy = function () { + this.stop(); + this.audioElement.remove(); + if (this.mediaRecorder && this.mediaRecorder.stream) { + this.mediaRecorder.stream.getTracks()[0].stop(); + } + SoundRecorderDialogMorph.uber.destroy.call(this); +}; diff --git a/elements/pl-snap/Snap/src/lists.js b/elements/pl-snap/Snap/src/lists.js new file mode 100644 index 00000000..523d601f --- /dev/null +++ b/elements/pl-snap/Snap/src/lists.js @@ -0,0 +1,1719 @@ +/* + + lists.js + + list data structure and GUI for SNAP! + + written by Jens Mönig and Brian Harvey + jens@moenig.org, bh@cs.berkeley.edu + + Copyright (C) 2024 by Jens Mönig and Brian Harvey + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js, widgets.js and gui.js + + + I. hierarchy + ------------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + List + + BoxMorph* + ListWatcherMorph + + * from Morphic.js + + + II. toc + ------- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + List + ListWatcherMorph + +*/ + +/*global modules, BoxMorph, HandleMorph, PushButtonMorph, SyntaxElementMorph, +Color, Point, WatcherMorph, StringMorph, SpriteMorph, ScrollFrameMorph, isNil, +CellMorph, ArrowMorph, MenuMorph, snapEquals, localize, isString, IDE_Morph, +MorphicPreferences, TableDialogMorph, SpriteBubbleMorph, SpeechBubbleMorph, +TableFrameMorph, TableMorph, Variable, isSnapObject, Costume, contains, detect, +Context, ZERO, WHITE*/ + +/*jshint esversion: 6*/ + +// Global settings ///////////////////////////////////////////////////// + +modules.lists = '2024-January-10'; + +var List; +var ListWatcherMorph; + +// List //////////////////////////////////////////////////////////////// + +/* + I am a dynamic array data structure for SNAP! + My index starts with 1 + + I am a "smart" hybrid list, because I can be used as both a linked + list and as a dynamic array + + public interface: + + setters (linked): + ----------------- + cons - answer a new list with the given item in front + cdr - answer all but the first element + + setters (arrayed): + ------------------ + add(element, index) - insert the element before the given slot, + put(element, index) - overwrite the element at the given slot + remove(index) - remove the given slot, shortening the list + clear() - remove all elements + + getters (all hybrid): + --------------------- + length() - number of slots + at(index) - element present in specified slot + contains(element) - + isEmpty() - + indexOf(element) - index of element's first occurrence, 0 if none + + conversion: + ----------- + asArray() - answer me as JavaScript array, convert to arrayed + itemsArray() - answer a JavaScript array shallow copy of myself + asText() - answer my elements (recursively) concatenated + asCSV() - answer a csv-formatted String of myself + asJSON() - answer a json-formatted String of myself + + utility: + --------- + map(callback) - answer an arrayed copy applying a JS func to all + deepMap(callback) - same as map for all atomic elements + + matrix ops (arrayed) + -------------------- + size() - count the number of all atomic elements + rank() - answer the number of my dimensions + shape() - answer a list of the max size for each dimension + width() - answer the maximum length of my columns, if any + flatten() - answer a concatenated list of columns and atoms + ravel() - answer a flat list of all atoms in all sublists + columns() - answer a 2D list with rows turned into columns + transpose() - answer the matrix transpose over all dimensions + reversed() - answer a reversed shallow copy of the list + reshape() - answer a new list formatted to the given dimensions. + crossproduct() - answer a new list of all possible sublist tuples + query() - answer a part of a list or multidimensionel struct + slice() - same as query() turning negative indices into slices + + analysis: + --------- + distribution() - answer the occurrence count for each element + +*/ + +// List instance creation: + +function List(array) { + this.type = null; // for UI lists, such as costumes, sounds, sprites + this.contents = array || []; + this.first = null; + this.rest = null; + this.isLinked = false; + this.lastChanged = Date.now(); +} + +// List global preferences + +List.prototype.enableTables = true; +List.prototype.enableWrapping = false; + +// List printing + +List.prototype.toString = function () { + return 'a List [' + this.length() + ' elements]'; +}; + +// List updating: + +List.prototype.changed = function () { + this.lastChanged = Date.now(); +}; + +// Linked List ops: + +List.prototype.cons = function (car, cdr) { + var answer = new List(); + if (!(cdr instanceof List || isNil(cdr))) { + throw new Error("cdr isn't a list: " + cdr); + } + answer.first = isNil(car) ? null : car; + answer.rest = cdr || null; + answer.isLinked = true; + return answer; +}; + +List.prototype.cdr = function () { + var result, i; + if (this.isLinked) { + return this.rest || new List(); + } + if (this.contents.length < 2) { + return new List(); + } + + result = new List(); + for (i = this.contents.length; i > 1; i -= 1) { + result = this.cons(this.at(i), result); + } + return result; +}; + +// List array setters: + +List.prototype.add = function (element, index) { + // insert the element before the given slot index, + // if no index is specifed, append the element + var idx = isNil(index) ? this.length() + 1 : this.wrapIndex(index), + obj = isNil(element) ? null : element; + + this.becomeArray(); + this.contents.splice(idx - 1, 0, obj); + this.changed(); +}; + +List.prototype.put = function (element, index) { + // exchange the element at the given slot for another + var idx = this.wrapIndex(index), + data = element === 0 ? 0 + : element === false ? false + : element || null; + + this.becomeArray(); + if (idx < 1 || idx > this.contents.length) { + return; + } + this.contents[idx - 1] = data; + this.changed(); +}; + +List.prototype.remove = function (index) { + // remove the given slot, shortening the list + this.becomeArray(); + this.contents.splice(this.wrapIndex(index) - 1, 1); + this.changed(); +}; + +List.prototype.clear = function () { + this.contents = []; + this.first = null; + this.rest = null; + this.isLinked = false; + this.changed(); +}; + +// List utilities + +List.prototype.map = function (callback) { + return new List( + this.itemsArray().map(callback) + ); +}; + +List.prototype.deepMap = function (callback) { + return this.map(item => item instanceof List ? + item.deepMap(callback) + : callback(item)); +}; + +List.prototype.wrapIndex = function (num) { + var idx = Math.round(+num || 0), + mod = (a, b) => ((+a % +b) + (+b)) % +b; + return this.enableWrapping ? + mod(idx - 1, this.length()) + 1 + : idx; +}; + +// List getters (all hybrid): + +List.prototype.length = function () { + if (this.isLinked) { + var pair = this, + result = 0; + while (pair && pair.isLinked) { + result += 1; + pair = pair.rest; + } + return result + (pair ? pair.contents.length : 0); + } + return this.contents.length; +}; + +List.prototype.at = function (index) { + var value, + idx = this.wrapIndex(index), + pair = this; + while (pair.isLinked) { + if (idx > 1) { + pair = pair.rest; + idx -= 1; + } else { + return idx < 1 ? '' : pair.first; + } + } + value = pair.contents[idx - 1]; + return isNil(value) ? '' : value; +}; + +List.prototype.contains = function (element) { + var pair = this; + while (pair.isLinked) { + if (snapEquals(pair.first, element)) { + return true; + } + pair = pair.rest; + } + // in case I'm arrayed + return pair.contents.some(any => snapEquals(any, element)); +}; + +List.prototype.isEmpty = function () { + if (this.isLinked) { + return isNil(this.first); + } + return !this.contents.length; +}; + +List.prototype.indexOf = function (element) { + var pair = this, + idx = 1, + i, len; + while (pair.isLinked) { + if (snapEquals(pair.first, element)) { + return idx; + } + pair = pair.rest; + idx += 1; + } + // in case I'm arrayed + len = pair.contents.length; + for (i = 0; i < len; i += 1) { + if (snapEquals(pair.contents[i], element)) { + return idx + i; + } + } + return 0; +}; + +// List key-value accessing (experimental in v8.1): + +List.prototype.lookup = function (key) { + var rec; + if (parseFloat(key) === +key) { // treat as numerical index + return this.at(key); + } + rec = this.itemsArray().find(elem => elem instanceof List && + elem.length() > 0 && + snapEquals(elem.at(1), key)); + return rec ? + (rec.length() > 2 ? rec.cdr() : rec.at(2)) + : ''; +}; + +List.prototype.bind = function (key, value) { + if (parseFloat(key) === +key) { // treat as numerical index + return this.put(value, key); + } + if (key instanceof List) { + return; // cannot use lists as key because of hyperization + } + this.forget(key); // ensure unique entry + this.add(new List([key, value])); +}; + +List.prototype.forget = function (key) { + var idx = 0, + query = rec => + snapEquals(rec, key) || ( + rec instanceof List && + rec.length() === 2 && + snapEquals(rec.at(1), key) + ); + + if (parseFloat(key) === +key) { // treat as numerical index + return this.remove(key); + } + while (idx > -1) { + idx = this.itemsArray().findIndex(query); + if (idx > -1) { + this.remove(idx + 1); + } + } +}; + +// List table (2D) accessing (for table morph widget): + +List.prototype.isTable = function () { + return this.enableTables && (this.length() > 100 || this.cols() > 1); +}; + +List.prototype.get = function (col, row) { + var r, len, cols; + if (!col) { + if (!row) {return [this.length()]; } + if (row > this.rows()) {return null; } + return this.rowName(row); + } else if (!row) { + if (this.cols() === 1) {return localize('items'); } + return this.colName(col); + } + r = this.at(row); + + // encode "orphaned" as arrays and overshooting ones as Variables + if (r instanceof List) { + len = r.length(); + cols = this.cols(); + if (col > len) { + return null; + } else if (cols === 1 && len > 1) { + return [r]; + } else if (col >= cols && len > cols) { // overshooting + return new Variable(r.at(col)); + } + return r.at(col); + } + if (col === 1 && row <= this.rows()) { + return [r]; + } + return null; +}; + +List.prototype.rows = function () { + return this.length(); +}; + +List.prototype.cols = function () { + // scan the first 10 rows for the maximun width + var len = Math.min(10, this.length()), + count = 1, + r, i; + + for (i = 1; i <= len; i += 1) { + r = this.at(i); + if (r instanceof List) { + count = Math.max(count, r.length()); + } + } + return count; +}; + +List.prototype.colName = function (col) { + if (col > this.cols()) {return null; } + return String.fromCharCode(64 + ((col % 26) || 26)).repeat( + Math.floor((col - 1) / 26) + 1 + ); +}; + +List.prototype.rowName = function (row) { + return row; +}; + +List.prototype.columnNames = function () { + return []; +}; + +List.prototype.version = function (startRow, rows, startCol, cols) { + var l = Math.min(startRow + rows, this.length()), + v = this.lastChanged, + r, + i; + for (i = startRow; i <= l; i += 1) { + r = this.at(i); + if (r instanceof Costume) { + v = Math.max(v, r.version); + } else if (r instanceof List) { + v = Math.max(v, r.version(startCol, cols)); + } else { + v = Math.max(v, r.lastChanged ? r.lastChanged : 0); + } + } + return v; +}; + +// List matrix operations and utilities + +List.prototype.query = function (indices) { + // assumes a 2D argument list where each slot represents + // the indices to select from a dimension + // e.g. [rows, columns, planes] + var first, rank, dim, select; + if (indices.isEmpty()) { + return this.map(e => e); + } + rank = indices.quickRank(); + if (rank === 1) { + return indices.map(i => this.lookup(i)); + } + if (rank > 2) { + return indices.map(i => this.query(i)); + } + dim = indices.length(); + if (dim > 10) { + throw new Error('too many dimensions (' + dim + ')?'); + } + first = indices.at(1); + if (first instanceof List) { + select = first.isEmpty() ? + this.range(1, this.length()) + : first; + } else { + select = new List([first]); + } + return select.map(i => this.lookup(i)).map(e => { + let rest = indices.cdr(); + return e instanceof List ? e.query(rest) + : (rest.isEmpty() ? e + : new List([e]).query(rest)); + }); +}; + +List.prototype.slice = function (indices) { + // EXPERIMENTAL - NOT IN USE. + // assumes a 2D argument list where each slot represents + // the indices to select from a dimension + // e.g. [rows, columns, planes] + // + // slicing spec: + // positive integers represent single indices, + // negative integes and zero represent slices starting at the + // index following the last specified positive integer up to / down to + // my length offset by the negative / zero integer + // + // Currently unused and NOT part of the ITEM OF primitivie in + // production Snap, because negative indices are used in exercises and + // curriculum activities relying on them returning zero / empty values + // rather than wrapped ones, e.g. when creating a "reverb" or "echo" + // effect from sound samples. + // + // to be revisited in the future, perhaps as seperate primitive. + // -Jens + + var first, select; + if (indices.isEmpty()) { + return this.map(e => e); + } + if (indices.rank() === 1) { + return this.rangify(indices).map(i => this.at(i)); + } + first = indices.at(1); + if (first instanceof List) { + select = first.isEmpty() ? + this.range(1, this.length()) + : this.rangify(first); + } else { + select = this.rangify(new List([first])); + } + return select.map(i => this.at(i)).map( + e => e instanceof List? e.slice(indices.cdr()) : e + ); +}; + +List.prototype.rangify = function (indices) { + // EXPERIMENTAL - NOT IN USE. + // private - answer a list of indices with zero and negative integers + // replaced by slices of consecutive indices ranging from the next + // index following the last specified single index up / down to + // my length offset by the negative / zero index. + var result = [], + len = this.length(), + current = 0, + start, end; + indices.itemsArray().forEach(idx => { + idx = +idx; + if (idx > 0) { + result.push(idx); + current = idx; + } else { + end = len + idx; + if (current !== end) { + start = current < end ? current + 1 : current - 1; + this.range(start, end).itemsArray().forEach( + num => result.push(num) + ); + } + } + }); + return new List(result); +}; + +List.prototype.range = function (start, end) { + // private - answer a list of integers from start to the given end + return new List([...Array(Math.abs(end - start) + 1)].map((e, i) => + start < end ? start + i : start - i + )); +}; + +List.prototype.items = function (indices) { + // deprecated. Same as query() above, except in reverse order. + // e.g. [planes, columns, rows] + + // This. This is it. The pinnacle of my programmer's life. + // After days of roaming about my house and garden, + // of taking showers and rummaging through the fridge, + // of strumming the charango and the five ukuleles + // sitting next to my laptop on my desk, + // and of letting my mind wander far and wide, + // to come up with this design, always thinking + // "What would Brian do?". + // And look, Ma, it's turned out all beautiful! -jens + + return makeSelector( + this.rank(), + indices.cdr(), + makeLeafSelector(indices.at(1)) + )(this); + + function makeSelector(rank, indices, next) { + if (rank === 1) { + return next; + } + return makeSelector( + rank - 1, + indices.cdr(), + makeBranch( + indices.at(1) || new List(), + next + ) + ); + } + + function makeBranch(indices, next) { + return function(data) { + if (indices.isEmpty()) { + return data.map(item => next(item)); + } + return indices.map(idx => next(data.at(idx))); + }; + } + + function makeLeafSelector(indices) { + return function (data) { + if (indices.isEmpty()) { + return data.map(item => item); + } + return indices.map(idx => data.at(idx)); + }; + } +}; + +List.prototype.size = function () { + // count the number of all atomic elements + var count = 0; + this.deepMap(() => count += 1); + return count; +}; + +List.prototype.ravel = function () { + // answer a flat list containing all atomic elements in all sublists + var all = []; + this.deepMap(atom => all.push(atom)); + return new List(all); +}; + +List.prototype.rank = function () { + // answer the number of my dimensions + // traverse the whole structure for irregularly shaped nested lists + var rank = 1, + len = this.length(), + item, i; + + for (i = 1; i <= len; i += 1) { + item = this.at(i); + if (item instanceof List) { + rank = Math.max(rank, 1 + item.rank()); + } + } + return rank; +}; + +List.prototype.quickRank = function () { + // answer the number of my dimensions + // only look at the first item of each dimension, + // assuming regularly shaped nested lists + var item = this.at(1); + return item instanceof List ? item.quickRank() + 1 : 1; +}; + +List.prototype.shape = function () { + // answer a list of the maximum size for each dimension + var dim, + rank = this.rank(), + shp = new List([this.length()]), + max, items, i, len; + for (dim = 2; dim <= rank; dim += 1) { + max = 0; + items = this.getDimension(dim); + len = items.length(); + for (i = 1; i <= len; i += 1) { + max = Math.max(max, items.at(i).length()); + } + shp.add(max); + } + return shp; +}; + +List.prototype.quickShape = function () { + // answer a list of each dimension's size + // only look at the first item of each dimension, + // assuming regularly shaped nested lists + var shp = [], + item = this; + while (item instanceof List) { + shp.push(item.length()); + item = item.at(1); + } + return new List(shp); +}; + +List.prototype.getDimension = function (rank = 0) { + // private - answer a list of all elements of the specified rank + if (rank < 1) {return new List(); } + if (rank === 1) { + return this.map(item => item); + } + if (rank === 2) { + return new List(this.itemsArray().filter(item => item instanceof List)); + } + return new List( + this.getDimension(rank - 1).flatten().itemsArray().filter( + value => value instanceof List + ) + ); +}; + +List.prototype.width = function () { + // private - answer the maximum length of my direct sub-lists (columns), + // if any + var i, item, + width = 0, + len = this.length(); + for (i = 1; i <= len; i += 1) { + item = this.at(i); + width = Math.max(width, item instanceof List ? item.length() : 0); + } + return width; +}; + +List.prototype.flatten = function () { + // answer a new list that concatenates my direct sublists (columns) + // and atomic elements + var flat = []; + this.itemsArray().forEach(item => { + if (item instanceof List) { + item.itemsArray().forEach(value => flat.push(value)); + } else { + flat.push(item); + } + }); + return new List(flat); +}; + +List.prototype.transpose = function () { + if (this.quickRank() > 2) { + return this.strideTranspose(); + } + return this.columns(); +}; + +List.prototype.columns = function () { + // answer a 2D list where each item has turned into a row, + // convert atomic items into lists, + // fill ragged columns with atomic values, if any, or empty cells + + var col, src, i, + width = Math.max(this.width(), 1), + table = []; + + // convert atomic items into rows + src = this.map(row => + row instanceof List ? row : new List(new Array(width).fill(row)) + ); + + // define the mapper function + col = (tab, c) => tab.map(row => row.at(c)); + + // create the transform + for (i = 1; i <= width; i += 1) { + table.push(col(src, i)); + } + return new List(table); +}; + +List.prototype.reshape = function (dimensions) { + // answer a new list formatted to fit the given dimensions. + // truncate excess elements, if any. + // pad with (repetitions of) existing elements + var src = this.ravel().itemsArray(), + dim = this.fillDimensionsFor(dimensions, src.length), + i = 0, + size, trg; + + // if no dimensions, report a scalar + if (dim.isEmpty()) {return src[0]; } + + size = dim.itemsArray().reduce((a, b) => a * b); + if (size === Infinity) {return new List(); } + + // make sure the items count matches the specified target dimensions + if (size < src.length) { + // truncate excess elements from the source + trg = src.slice(0, size); + } else { + if (size > src.length && dim.length() > 2 && size > 1000000) { + // limit usage of reshape to grow to a maximum size of 1MM rows + // in higher dimensions to prevent accidental dimension overflow + throw new Error('exceeding the size limit for reshape'); + } + // pad the source by repeating its existing elements + trg = src.slice(); + while (trg.length < size) { + if (i >= src.length) { + i = 0; + } + trg.push(src[i]); + i += 1; + } + } + + // fold the doctored source into the specified dimensions + return new List(trg).folded(dim); +}; + +List.prototype.fillDimensionsFor = function (dimensions, leafCount) { + // private - answer a copy of the dimensions list with all zeroish + // values adjusted to accomodate the given overall leaf count from + // left to right, e.g. for leaf count of 10 the given dimensions + // (0,3) become (4,3) + var factor, + already = -1; + if (dimensions.contains(0) || + dimensions.contains('') || + dimensions.contains(false) + ) { + factor = Math.ceil(leafCount / dimensions.itemsArray().reduce((a, b) => + Math.max(a, 1) * Math.max(b, 1))); + return dimensions.map(each => + each ? each : (already++ ? factor : 1)); + } + return dimensions; +}; + +List.prototype.folded = function (dimensions) { + // private + var len = dimensions.length(), + trg = this, + i; + if (len < 2) { + return this.map(e => e); + } + for (i = len; i > 1; i -= 1) { + trg = trg.asChunksOf(dimensions.at(i)); + } + return trg; +}; + +List.prototype.asChunksOf = function (size) { + // private + var trg = new List(), + len = this.length(), + sub, i; + for (i = 0; i < len; i += 1) { + if (i % size === 0) { + sub = new List(); + trg.add(sub); + } + sub.add(this.at(i + 1)); + } + return trg; +}; + +List.prototype.crossproduct = function () { + // expects myself to be a list of lists. + // answers a new list of all possible tuples + // with one item from each of my sublists + var result = new List(), + len = this.length(), + lengths = this.map(each => each.length()), + size = lengths.itemsArray().reduce((a, b) => a * b), + i, k, row, factor; + + // limit crossproduct to a maximum size of 1MM rows + // to guard against accidental memory overflows in Chrome + if (size > 1000000) { + throw new Error('exceeding the size limit for cross product'); + } + + for (i = 1; i <= size; i += 1) { + row = new List(); + factor = 1; + for (k = 1; k <= len; k += 1) { + row.add( + this.at(k).at( + ((Math.ceil(i / ((size / lengths.at(k)) * factor)) - 1) % + lengths.at(k)) + 1 + ) + ); + factor /= lengths.at(k); + } + result.add(row); + } + return result; +}; + +List.prototype.strideTranspose = function () { + // private - transpose a matric of rank > 2 + // thanks, Brian! + var oldShape = this.shape(), + newShape = oldShape.reversed(), + oldSizes = new List([1]), + newSizes = new List([1]), + oldFlat = this.ravel(), + newFlat = new List(new Array(oldFlat.length())), + product = 1, + i; + + function newIndex(old, os, ns) { + var foo; + if (os.isEmpty()) { + return 0; + } + foo = Math.floor(old / ns.at(1)); + return foo * os.at(1) + newIndex( + old % ns.at(1), + os.cdr(), + ns.cdr() + ); + } + + for (i = oldShape.length(); i > 1; i -= 1) { + product *= oldShape.at(i); + newSizes.add(product, 1); + } + product = 1; + for (i = 1; i <= oldShape.length() - 1; i += 1) { + product *= oldShape.at(i); + oldSizes.add(product); + } + for (i = 1; i <= oldFlat.length(); i += 1) { + newFlat.put( + oldFlat.at(i), + newIndex(i-1, oldSizes, newSizes)+1 + ); + } + return newFlat.reshape(newShape); +}; + +List.prototype.reversed = function () { + // only for arrayed lists + return new List(this.itemsArray().slice().reverse()); +}; + +// List analysis + +List.prototype.distribution = function () { + // return a table representing a dictionary indicating the occurrence count + // of each unique elements + // note: for compound data this method uses identity rather than equality + var dict = new Map(), + data = this.itemsArray(), + len = data.length, + isNum = thing => parseFloat(thing) === +thing, + item, i; + for (i = 0; i < len; i += 1) { + item = isNum(data[i]) ? data[i].toString() : data[i]; + if (dict.has(item)) { + dict.set(item, dict.get(item) + 1); + } else { + dict.set(item, 1); + } + } + return new List([...dict].sort((a, b) => b[1] - a[1]) + .map(pair => new List(pair)) + ); +}; + +// List conversion: + +List.prototype.asArray = function () { + // for use in the evaluator + this.becomeArray(); + return this.contents; +}; + +List.prototype.itemsArray = function () { + // answer an array containing my elements + // don't convert linked lists to arrays + if (this.isLinked) { + var next = this, + result = [], + i; + while (next && next.isLinked) { + result.push(next.first); + next = next.rest; + } + if (next) { + for (i = 1; i <= next.contents.length; i += 1) { + result.push(next.at(i)); + } + } + return result; + } + return this.contents; +}; + +List.prototype.asText = function () { + var result = '', + length, + element, + pair = this, + i; + while (pair.isLinked) { + element = pair.first; + if (element instanceof List) { + result = result.concat(element.asText()); + } else { + element = isNil(element) ? '' : element.toString(); + result = result.concat(element); + } + pair = pair.rest; + } + length = pair.length(); + for (i = 1; i <= length; i += 1) { + element = pair.at(i); + if (element instanceof List) { + result = result.concat(element.asText()); + } else { + element = isNil(element) ? '' : element.toString(); + result = result.concat(element); + } + } + return result; +}; + +List.prototype.becomeArray = function () { + if (this.isLinked) { + this.contents = this.itemsArray(); + this.isLinked = false; + this.first = null; + this.rest = null; + } +}; + +List.prototype.becomeLinked = function () { + var i, stop, tail = this; + if (!this.isLinked) { + stop = this.length(); + for (i = 0; i < stop; i += 1) { + tail.first = this.contents[i]; + if (i < stop) { + tail.rest = new List(); + tail.isLinked = true; + tail = tail.rest; + } + } + this.contents = []; + this.isLinked = true; + } +}; + +List.prototype.asCSV = function () { + // RFC 4180 + // Caution, no error catching! + // this method assumes that the list.canBeCSV() + + var items = this.itemsArray(), + rows = []; + + function encodeCell(atomicValue) { + var string = isNil(atomicValue) ? '' : atomicValue.toString(), + cell; + if (string.indexOf('\"') === -1 && + (string.indexOf('\n') === -1) && + (string.indexOf('\,') === -1)) { + return string; + } + cell = ['\"']; + Array.from(string).forEach(letter => { + cell.push(letter); + if (letter === '\"') { + cell.push(letter); + } + }); + cell.push('\"'); + return cell.join(''); + } + + if (items.some(any => any instanceof List)) { + // 2-dimensional table + items.forEach(item => { + if (item instanceof List) { + rows.push(item.itemsArray().map(encodeCell).join(',')); + } else { + rows.push(encodeCell(item)); + } + }); + return rows.join('\n'); + } + // single row + return items.map(encodeCell).join(','); +}; + +List.prototype.asJSON = function () { + // Caution, no error catching! + // this method assumes that the list.canBeJSON() + + function objectify(list) { + var items = list.itemsArray(), + obj = {}; + if (canBeObject(items)) { + items.forEach(pair => { + var value = pair.length() === 2 ? pair.at(2) : undefined; + obj[pair.at(1)] = (value instanceof List ? + objectify(value) : value); + }); + return obj; + } + return items.map(element => element instanceof List ? + objectify(element) : element + ); + } + + function canBeObject(array) { + // try to determine whether the contents of a list + // might be better represented as dictionary/object + // than as array + var keys; + if (array.every( + element => element instanceof List && (element.length() === 2) + )) { + keys = array.map(each => each.at(1)); + return keys.every(each => isString(each) && isUniqueIn(each, keys)); + } + return false; + } + + function isUniqueIn(element, array) { + return array.indexOf(element) === array.lastIndexOf(element); + } + + return JSON.stringify(objectify(this), null, 4); +}; + +List.prototype.canBeTXT = function () { + return this.itemsArray().every(item => + isString(item) || (typeof item === 'number') + ); +}; + +List.prototype.asTXT = function () { + // Caution, no error catching! + // this method assumes that the list.canBeTXT() + return this.itemsArray().join('\n'); +}; + +List.prototype.canBeWords = function () { + return this.itemsArray().every(item => + isString(item) || + (typeof item === 'number') || + (item instanceof List && item.canBeWords()) + ); +}; + +List.prototype.asWords = function () { + // recursively join all leaf items with spaces between. + // Caution, no error catching! + // this method assumes that the list.canBeWords() + return this.itemsArray().map(each => + each instanceof List ? each.asWords() : each.toString().trim() + ).filter(word => word.length).join(' '); +}; + +// List testing + +List.prototype.equalTo = function (other) { + var myself = this, it = other, i, j, loopcount; + if (!(other instanceof List)) { + return false; + } + + while (myself.isLinked && it.isLinked) { + if (!snapEquals(myself.first, it.first)) { + return false; + } + myself = myself.rest; + it = it.rest; + } + + if (it.isLinked) { + i = it; + it = myself; + myself = i; + } + + j = 0; + while (myself.isLinked) { + if (!snapEquals(myself.first, it.contents[j])) { + return false; + } + myself = myself.rest; + j += 1; + } + + i = 0; + if (myself.contents.length !== (it.contents.length - j)) { + return false; + } + + loopcount = myself.contents.length; + while (loopcount > 0) { + loopcount -= 1; + if (!snapEquals(myself.contents[i], it.contents[j])) { + return false; + } + i += 1; + j += 1; + } + return true; +}; + +List.prototype.canBeCSV = function () { + return this.itemsArray().every(value => + (!isNaN(+value) && typeof value !== 'boolean') || + isString(value) || + (value instanceof List && value.hasOnlyAtomicData()) + ); +}; + +List.prototype.canBeJSON = function () { + return this.itemsArray().every(value => !isNaN(+value) || + isString(value) || + value === true || + value === false || + (value instanceof List && value.canBeJSON()) + ); +}; + +List.prototype.hasOnlyAtomicData = function () { + return this.itemsArray().every(value => + (!isNaN(+value) && typeof value !== 'boolean') || isString(value) + ); +}; + +// List-to-block + +List.prototype.blockify = function (limit = 500, count = [0]) { + var block = SpriteMorph.prototype.blockForSelector('reportNewList'), + slots = block.inputs()[0], + len = this.length(), + bool, + i, value; + + block.isDraggable = true; + slots.removeInput(); + + // fill the slots with the data + for (i = 0; i < len && count[0] < limit; i += 1) { + value = this.at(i + 1); + if (value instanceof List) { + slots.replaceInput( + slots.addInput(), + value.blockify(limit, count) + ); + } else if (typeof value === 'boolean') { + bool = SpriteMorph.prototype.blockForSelector('reportBoolean'); + bool.inputs()[0].setContents(value); + bool.isDraggable = true; + slots.replaceInput( + slots.addInput(), + bool + ); + } else { + slots.addInput(value); + } + count[0] += 1; + } + + slots.fixBlockColor(null, true); + return block; +}; + +// ListWatcherMorph //////////////////////////////////////////////////// + +/* + I am a little window which observes a list and continuously + updates itself accordingly +*/ + +// ListWatcherMorph inherits from BoxMorph: + +ListWatcherMorph.prototype = new BoxMorph(); +ListWatcherMorph.prototype.constructor = ListWatcherMorph; +ListWatcherMorph.uber = BoxMorph.prototype; + +// ListWatcherMorph default settings + +ListWatcherMorph.prototype.cellColor = + SpriteMorph.prototype.blockColor.lists; + +// ListWatcherMorph instance creation: + +function ListWatcherMorph(list, parentCell) { + this.init(list, parentCell); +} + +ListWatcherMorph.prototype.init = function (list, parentCell) { + var myself = this, + readOnly; + + this.list = list || new List(); + this.start = 1; + this.range = 100; + this.lastUpdated = 0; + this.lastCell = null; + this.parentCell = parentCell || null; // for circularity detection + + // elements declarations + this.label = new StringMorph( + localize('length: ') + this.list.length(), + SyntaxElementMorph.prototype.fontSize, + null, + false, + false, + false, + MorphicPreferences.isFlat ? ZERO : new Point(1, 1), + WHITE + ); + this.label.mouseClickLeft = function () {myself.startIndexMenu(); }; + + + this.frame = new ScrollFrameMorph(null, 10); + this.frame.alpha = 0; + this.frame.acceptsDrops = false; + this.frame.contents.acceptsDrops = false; + + this.handle = new HandleMorph( + this, + 80, + 70, + 3, + 3 + ); + this.handle.setExtent(new Point(13, 13)); + + this.arrow = new ArrowMorph( + 'down', + SyntaxElementMorph.prototype.fontSize + ); + this.arrow.mouseClickLeft = function () {myself.startIndexMenu(); }; + this.arrow.setRight(this.handle.right()); + this.arrow.setBottom(this.handle.top()); + this.handle.add(this.arrow); + + readOnly = this.list.type && !contains(['text', 'number'], this.list.type); + if (readOnly) { + this.plusButton = null; + } else { + this.plusButton = new PushButtonMorph( + this.list, + 'add', + '+' + ); + this.plusButton.padding = 0; + this.plusButton.edge = 0; + this.plusButton.outlineColor = this.color; + this.plusButton.fixLayout(); + } + + ListWatcherMorph.uber.init.call( + this, + SyntaxElementMorph.prototype.rounding, + 1, + new Color(120, 120, 120) + ); + + this.color = new Color(220, 220, 220); + this.isDraggable = false; + this.setExtent(new Point(80, 70).multiplyBy( + SyntaxElementMorph.prototype.scale + )); + this.add(this.label); + this.add(this.frame); + if (!readOnly) { + this.add(this.plusButton); + } + this.add(this.handle); + this.handle.fixLayout(); + this.update(); + this.fixLayout(); +}; + +// ListWatcherMorph updating: + +ListWatcherMorph.prototype.update = function (anyway) { + var i, idx, ceil, morphs, cell, cnts, label, button, max, + starttime, maxtime = 1000; + this.frame.contents.children.forEach(m => { + if (m instanceof CellMorph) { + if (m.contentsMorph instanceof ListWatcherMorph) { + m.contentsMorph.update(); + } else if (isSnapObject(m.contents) || + (m.contents instanceof Costume) || + (m.contents instanceof Context) + ) { + m.update(); + } + } + }); + + if (this.lastUpdated === this.list.lastChanged && !anyway) { + return null; + } + this.updateLength(true); + + // adjust start index to current list length + this.start = Math.max( + Math.min( + this.start, + Math.floor((this.list.length() - 1) / this.range) + * this.range + 1 + ), + 1 + ); + + // refresh existing cells + // highest index shown: + max = Math.min( + this.start + this.range - 1, + this.list.length() + ); + + // number of morphs available for refreshing + ceil = Math.min( + (max - this.start + 1) * 3, + this.frame.contents.children.length + ); + + for (i = 0; i < ceil; i += 3) { + idx = this.start + (i / 3); + + cell = this.frame.contents.children[i]; + label = this.frame.contents.children[i + 1]; + button = this.frame.contents.children[i + 2]; + cnts = this.list.at(idx); + + if (cell.contents !== cnts) { + cell.contents = cnts; + cell.fixLayout(); + if (this.lastCell) { + cell.setLeft(this.lastCell.left()); + } + } + this.lastCell = cell; + + if (label.text !== idx.toString()) { + label.text = idx.toString(); + label.fixLayout(); + } + + button.action = idx; + } + + // remove excess cells + // number of morphs to be shown + morphs = (max - this.start + 1) * 3; + + while (this.frame.contents.children.length > morphs) { + this.frame.contents.children[morphs].destroy(); + } + + // add additional cells + ceil = morphs; //max * 3; + i = this.frame.contents.children.length; + + starttime = Date.now(); + if (ceil > i + 1) { + for (i; i < ceil; i += 3) { + if (Date.now() - starttime > maxtime) { + this.fixLayout(); + this.frame.contents.adjustBounds(); + this.frame.contents.setLeft(this.frame.left()); + return null; + } + idx = this.start + (i / 3); + label = new StringMorph( + idx.toString(), + SyntaxElementMorph.prototype.fontSize, + null, + false, + false, + false, + MorphicPreferences.isFlat ? ZERO : new Point(1, 1), + WHITE + ); + cell = new CellMorph( + this.list.at(idx), + this.cellColor, + idx, + this.parentCell + ); + button = new PushButtonMorph( + this.list.remove, + idx, + '-', + this.list + ); + button.padding = 1; + button.edge = 0; + button.corner = 1; + button.outlineColor = this.color.darker(); + button.fixLayout(); + + this.frame.contents.add(cell); + if (this.lastCell) { + cell.setPosition(this.lastCell.bottomLeft()); + } else { + cell.setTop(this.frame.contents.top()); + } + this.lastCell = cell; + label.setCenter(cell.center()); + label.setRight(cell.left() - 2); + this.frame.contents.add(label); + this.frame.contents.add(button); + } + } + this.lastCell = null; + + this.fixLayout(); + this.frame.contents.adjustBounds(); + this.frame.contents.setLeft(this.frame.left()); + this.updateLength(); + this.lastUpdated = this.list.lastChanged; +}; + +ListWatcherMorph.prototype.updateLength = function (notDone) { + this.label.text = localize('length: ') + this.list.length(); + if (notDone) { + this.label.color = new Color(0, 0, 100); + } else { + this.label.color = new Color(0, 0, 0); + } + this.label.fixLayout(); + this.label.setCenter(this.center()); + this.label.setBottom(this.bottom() - 3); +}; + +ListWatcherMorph.prototype.startIndexMenu = function () { + var i, + range, + items = Math.ceil(this.list.length() / this.range), + menu = new MenuMorph( + idx => this.setStartIndex(idx), + null, + this + ); + menu.addItem('1...', 1); + for (i = 1; i < items; i += 1) { + range = i * 100 + 1; + menu.addItem(range + '...', range); + } + menu.popUpAtHand(this.world()); +}; + +ListWatcherMorph.prototype.setStartIndex = function (index) { + this.start = index; + this.list.changed(); + this.update(); +}; + +ListWatcherMorph.prototype.fixLayout = function () { + if (!this.label) {return; } + if (this.frame) { + this.arrangeCells(); + this.frame.setPosition(this.position().add(3)); + this.frame.bounds.corner = this.bounds.corner.subtract(new Point( + 3, + 17 + )); + this.frame.fixLayout(); + this.frame.contents.adjustBounds(); + } + + this.label.setCenter(this.center()); + this.label.setBottom(this.bottom() - 3); + if (this.plusButton) { + this.plusButton.setLeft(this.left() + 3); + this.plusButton.setBottom(this.bottom() - 3); + } + + if (this.parent) { + this.parent.changed(); + this.parent.fixLayout(); + this.parent.rerender(); + } +}; + +ListWatcherMorph.prototype.arrangeCells = function () { + var i, cell, label, button, lastCell, + end = this.frame.contents.children.length; + for (i = 0; i < end; i += 3) { + cell = this.frame.contents.children[i]; + label = this.frame.contents.children[i + 1]; + button = this.frame.contents.children[i + 2]; + if (lastCell) { + cell.setTop(lastCell.bottom()); + } + if (label) { + label.setTop(cell.center().y - label.height() / 2); + label.setRight(cell.left() - 2); + } + if (button) { + button.setCenter(cell.center()); + button.setLeft(cell.right() + 2); + } + lastCell = cell; + } + this.frame.contents.adjustBounds(); +}; + +ListWatcherMorph.prototype.expand = function (maxExtent) { + // make sure to show all (first 100) cells + var fe = this.frame.contents.extent(), + ext = new Point(fe.x + 6, fe.y + this.label.height() + 6); + if (maxExtent) { + ext = ext.min(maxExtent); + } + this.setExtent(ext); + this.handle.setRight(this.right() - 3); + this.handle.setBottom(this.bottom() - 3); +}; + +// ListWatcherMorph context menu + +ListWatcherMorph.prototype.userMenu = function () { + var world = this.world(), + ide = detect(world.children, m => m instanceof IDE_Morph); + + if (!List.prototype.enableTables || ide.isAppMode) { + return this.escalateEvent('userMenu'); + } + var menu = new MenuMorph(this); + menu.addItem('table view...', 'showTableView'); + if (this.list.canBeJSON()) { + menu.addItem( + 'blockify', + () => { + this.list.blockify().pickUp(world); + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + ); + menu.addItem( + 'export', + () => { + if (this.list.canBeCSV()) { + ide.saveFileAs( + this.list.asCSV(), + 'text/csv;charset=utf-8', // RFC 4180 + localize('data') // name + ); + } else { + ide.saveFileAs( + this.list.asJSON(), + 'text/json;charset=utf-8', + localize('data') // name + ); + } + } + ); + } + menu.addLine(); + menu.addItem( + 'open in dialog...', + () => new TableDialogMorph(this.list).popUp(this.world()) + ); + return menu; +}; + +ListWatcherMorph.prototype.showTableView = function () { + var view = this.parentThatIsA( + SpriteBubbleMorph, + SpeechBubbleMorph, + CellMorph + ); + if (!view) {return; } + if (view instanceof SpriteBubbleMorph) { + view.contentsMorph.destroy(); + view.contentsMorph = new TableFrameMorph(new TableMorph(this.list, 10)); + view.contentsMorph.expand(this.extent()); + view.parent.positionTalkBubble(); + } else if (view instanceof SpeechBubbleMorph) { + view.contents = new TableFrameMorph(new TableMorph(this.list, 10)); + view.contents.expand(this.extent()); + } else { // watcher cell + view.changed(); + view.contentsMorph.destroy(); + view.contentsMorph = new TableFrameMorph(new TableMorph(this.list, 10)); + view.add(view.contentsMorph); + view.contentsMorph.setPosition(this.position()); + view.contentsMorph.expand(this.extent()); + } + view.fixLayout(); + view.rerender(); +}; + +// ListWatcherMorph events: + +ListWatcherMorph.prototype.mouseDoubleClick = function (pos) { + if (List.prototype.enableTables) { + new TableDialogMorph(this.list).popUp(this.world()); + } else { + this.escalateEvent('mouseDoubleClick', pos); + } +}; + +// ListWatcherMorph hiding/showing: + +ListWatcherMorph.prototype.show = function () { + ListWatcherMorph.uber.show.call(this); + this.frame.contents.adjustBounds(); +}; + +// ListWatcherMorph rendering: + +ListWatcherMorph.prototype.render = WatcherMorph.prototype.render; diff --git a/elements/pl-snap/Snap/src/locale.js b/elements/pl-snap/Snap/src/locale.js new file mode 100644 index 00000000..ba8e6160 --- /dev/null +++ b/elements/pl-snap/Snap/src/locale.js @@ -0,0 +1,683 @@ +/* + + locale.js + + spoken language translation for SNAP! + + written by Jens Mönig + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + Attention Translators! + ---------------------- + Please refer to the documentation in the file + + lang-de.js + + or to the section titled + + Translating Snap! + + in the file + + Contributing.md + + (same contents) if you would like to contribute. + +*/ + +// Global settings ///////////////////////////////////////////////////// + +/*global modules, contains, SpriteMorph*/ + +/*jshint esversion: 6*/ + +// Global stuff + +modules.locale = '2024-February-02'; + +var Localizer; +var SnapTranslator = new Localizer(); + +function localize(string) { + return SnapTranslator.translate(string); +} + +// Localizer ///////////////////////////////////////////////////////////// + +function Localizer(language, dict) { + this.language = language || 'en'; + this.dict = dict || {}; +} + +Localizer.prototype.translate = function (string) { + var phrase = this.contextualize(string); + return Object.prototype.hasOwnProperty.call( + this.dict[this.language], + phrase + ) ? this.dict[this.language][phrase] || phrase : phrase; +}; + +Localizer.prototype.languages = function () { + var property, arr = []; + for (property in this.dict) { + if (Object.prototype.hasOwnProperty.call(this.dict, property)) { + arr.push(property); + } + } + return arr.sort(); +}; + +Localizer.prototype.languageName = function (lang) { + return this.dict[lang].language_name || lang; +}; + +Localizer.prototype.credits = function () { + var txt = ''; + this.languages().forEach(lang => { + txt = txt + '\n' + + this.languageName(lang) + + ' (' + lang + ') - ' + + this.dict[lang].language_translator + + ' - ' + this.dict[lang].last_changed; + }); + return txt; +}; + +Localizer.prototype.unload = function () { + var dict, + keep = ['language_name', 'language_translator', 'last_changed']; + this.languages().forEach(lang => { + var key; + if (lang !== 'en') { + dict = this.dict[lang]; + for (key in dict) { + if (Object.prototype.hasOwnProperty.call(dict, key) + && !contains(keep, key)) { + delete dict[key]; + } + } + } + }); +}; + +Localizer.prototype.contextualize = function (string) { + switch (string) { + case 'Error': + return 'Hmm...'; + case 'brightness': + return SpriteMorph.prototype.penColorModel === 'hsl' ? + 'lightness' : string; + case 'r-g-b-a': + return 'RGBA'; + case 'r-g-b(-a)': + return 'RGB(A)'; + default: + return string; + } +}; + +// SnapTranslator initialization + +SnapTranslator.dict.en = { + // meta information + 'language_name': + 'English', + 'language_translator': + 'Jens M\u00F6nig', + 'translator_e-mail': + 'jens@moenig.org', + 'last_changed': + '2023-02-15', + + // symbols in dropdowns + '__shout__go__': + 'green flag clicked', + + // rewordings in English avoiding having to adjust all other translations + // -- currently none -- + + // long strings look-up only + 'file menu import hint': + 'load an exported project file\nor block library, a costume\n' + + 'or a sound', + 'settings menu prefer empty slots hint': + 'check to focus on empty slots\nwhen dragging & ' + + 'dropping reporters', + 'costumes tab help': + 'import a picture from another web page or from\n' + + 'a file on your computer by dropping it here\n', + 'block deletion dialog text': + 'Are you sure you want to delete this\n' + + 'custom block and all its instances?', + 'download to disk text': + 'This item could not be opened in a new tab.\n' + + 'It has been saved to your browser\'s downloads folder.', + 'unable to export text': + 'This item could not be exported from Snap!.\n' + + 'It\'s likely that your project may contain a lot of media ' + + '(sounds and images) or that you are using an older browser.' + + 'Please try using a recent version of Chrome, Firefox, or Safari.' +}; + +SnapTranslator.dict.de = { + 'language_name': + 'Deutsch', + 'language_translator': + 'Jens M\u00F6nig, Jadga H\u00fcgle', + 'translator_e-mail': + 'jens@moenig.org, jadga.huegle@sap.com', + 'last_changed': + '2023-11-22' +}; + +SnapTranslator.dict.it = { + 'language_name': + 'Italiano', + 'language_translator': + 'Stefano Federici, Alberto Firpo, Massimo Ghisalberti', + 'translator_e-mail': + 's_federici@yahoo.com, albertofirpo12@gmail.com, zairik@gmail.com', + 'last_changed': + '2023-11-04' +}; + +SnapTranslator.dict.ja = { + 'language_name': + '日本語', + 'language_translator': + 'Kazuhiro Abe', + 'translator_e-mail': + 'abee@squeakland.jp', + 'last_changed': + '2020-07-03' +}; + +SnapTranslator.dict.ja_HIRA = { + 'language_name': + 'にほんご', + 'language_translator': + 'Kazuhiro Abe', + 'translator_e-mail': + 'abee@squeakland.jp', + 'last_changed': + '2018-10-23' +}; + +SnapTranslator.dict.ko = { + 'language_name': + '한국어', + 'language_translator': + 'Yunjae Jang', + 'translator_e-mail': + 'janggoons@gmail.com', + 'last_changed': + '2015-01-21' +}; + +SnapTranslator.dict.pt = { + 'language_name': + 'Português', + 'language_translator': + 'Manuel Menezes de Sequeira', + 'translator_e-mail': + 'mmsequeira@gmail.com', + 'last_changed': + '2020-08-03' +}; + +SnapTranslator.dict.cs = { + 'language_name': + 'Česky', + 'language_translator': + 'Michal Moc, Jan Tomsa', + 'translator_e-mail': + 'info@iguru.eu, jan.tomsa.1976@gmail.com', + 'last_changed': + '2015-11-16' +}; + +SnapTranslator.dict.zh_CN = { + 'language_name': + '简体中文', + 'language_translator': + '五百刀/邓江华/孟锡峰/曹儒林/moodykeke', + 'translator_e-mail': + 'ubertao@qq.com/djh@rhjxx.cn/simon@snapontop.org', + 'last_changed': + '2023-11-15' +}; + +SnapTranslator.dict.eo = { + 'language_name': + 'Esperanto', + 'language_translator': + 'Sebastian Cyprych', + 'translator_e-mail': + 'sebacyp(heliko)gmail(punkto)com', + 'last_changed': + '2017-10-01' +}; + +SnapTranslator.dict.fr = { + 'language_name': + 'Fran\u00E7ais', + 'language_translator': + 'Jean-Jacques Valliet, Mark Rafter, Martin Quinson, Damien Caselli', + 'translator_e-mail': + 'i.scool@mac.com', + 'last_changed': + '2020-10-28' +}; + +SnapTranslator.dict.si = { + 'language_name': + 'Sloven\u0161\u010Dina', + 'language_translator': + 'Sasa Divjak, Gorazd Breskvar', + 'translator_e-mail': + 'sasa.divjak@fri.uni-lj.si', + 'last_changed': + '2016-04-22' +}; + +SnapTranslator.dict.ru = { + 'language_name': + 'Русский', + 'language_translator': + 'Svetlana Ptashnaya, Проскурнёв Артём, Pavel Belousov', + 'translator_e-mail': + 'svetlanap@berkeley.edu, tema@school830.ru, pbsite@mail.ru', + 'last_changed': + '2020-12-22' +}; + +SnapTranslator.dict.es = { + 'language_name': + 'Espa\u00F1ol', + 'language_translator': + 'V\u00EDctor Manuel Muratalla Morales / Cristi\u00E1n Rizzi Iribarren / Alfonso Ruzafa / David Martín', + 'translator_e-mail': + 'victor.muratalla@yahoo.com / rizzi.cristian@gmail.com', + 'last_changed': + '2023-11-20' +}; + +SnapTranslator.dict.nl = { + 'language_name': + 'Nederlands', + 'language_translator': + 'Joek van Montfort, Sjoerd Dirk Meijer, Frank Sierens, Jan-Gerard van der Toorn, Jule Rapp', + 'translator_e-mail': + 'joek@xota.nl, sjoerddirk@fromScratchEd.nl, frank.sierens@telenet.be, jg.2019@xs4all.nl', + 'last_changed': + '2024-02-12' +}; + +SnapTranslator.dict.pl = { + 'language_name': + 'Polski', + 'language_translator': + 'Witek Kranas & deKrain & Andrzej Batorski', + 'translator_e-mail': + 'witek@oeiizk.waw.pl', + 'last_changed': + '2021-05-15' +}; + +SnapTranslator.dict.zh_TW = { + 'language_name': + '繁體中文', + 'language_translator': + 'cch', + 'translator_e-mail': + 'cchuang2009@gmail.com', + 'last_changed': + '2013-8-14' +}; + +SnapTranslator.dict.no = { + 'language_name': + 'Norsk', + 'language_translator': + 'Olav A Marschall', + 'translator_e-mail': + 'olavmarschall@gmail.com', + 'last_changed': + '2020-08-19' +}; + +SnapTranslator.dict.dk = { + 'language_name': + 'Dansk', + 'language_translator': + 'FAB, Pelle Hjek', + 'translator_e-mail': + 'fab@nielsen.mail.dk, hjek@mail.com', + 'last_changed': + '2016-11-16' +}; + +SnapTranslator.dict.el = { + 'language_name': + 'Ελληνικά', + 'language_translator': + 'Ino Samaras, Alexandros Prekates, HM100', + 'translator_e-mail': + 'ino.samaras@berkeley.edu, aprekates@sch.gr', + 'last_changed': + '2023-04-15' +}; + +SnapTranslator.dict.ca = { + 'language_name': + 'Català', + 'language_translator': + 'Joan Guillén i Pelegay, Bernat Romagosa Carrasquer', + 'translator_e-mail': + 'jguille2@xtec.cat, bernat@snap4arduino.rocks', + 'last_changed': + '2023-11-08' +}; + +SnapTranslator.dict.ca_VA = { + 'language_name': + 'Català - Valencià', + 'language_translator': + 'Bernat Romagosa Carrasquer, Joan Guillén i Pelegay, Pilar Embid', + 'translator_e-mail': + 'bernat@snap4arduino.rocks, jguille2@xtec.cat, embid_mar@gva.es', + 'last_changed': + '2018-02-08' +}; + +SnapTranslator.dict.fi = { + 'language_name': + 'suomi', + 'language_translator': + 'Jouni K. Sepp\u00e4nen', + 'translator_e-mail': + 'jks@iki.fi', + 'last_changed': + '2014-04-18' +}; + +SnapTranslator.dict.sv = { + 'language_name': + 'svenska', + 'language_translator': + 'Erik A. Olsson', + 'translator_e-mail': + 'eolsson@gmail.com', + 'last_changed': + '2016-06-09' +}; + +SnapTranslator.dict.pt_BR = { + 'language_name': + 'Português do Brasil', + 'language_translator': + "Aldo von Wangenheim, Cassiano D'Andrea, Artur Arnhold-Müller, Ville Medeiros", + 'translator_e-mail': + 'awangenh@inf.ufsc.br, cassiano.dandrea@tagview.com.br', + 'last_changed': + '2023-10-17', +}; + +SnapTranslator.dict.bn = { + 'language_name': + 'বাংলা', + 'language_translator': + 'Dr. Mokter Hossain, Radman Siddiki', + 'translator_e-mail': + 'mokter@gmail.com, radman.siddiki@outlook.com', + 'last_changed': + '2020-07-04' +}; + +SnapTranslator.dict.kn = { + 'language_name': + '\u0C95\u0CA8\u0CCD\u0CA8\u0CA1', + 'language_translator': + 'Vinayakumar R', + 'translator_e-mail': + 'vnkmr7620@gmail.com', + 'last_changed': + '2014-12-02' +}; + +SnapTranslator.dict.ml = { + 'language_name': + 'Malayalam', + 'language_translator': + 'vinayakumar R', + 'translator_e-mail': + 'vnkmr7620@gmail.com', + 'last_changed': + '2015-02-20' +}; + +SnapTranslator.dict.ta = { + 'language_name': + 'Tamil', + 'language_translator': + 'vinayakumar R, Barthdry', + 'translator_e-mail': + 'vnkmr7620@gmail.com', + 'last_changed': + '2021-01-25' +}; + +SnapTranslator.dict.te = { + 'language_name': + 'Telagu', // the name as it should appear in the language menu + 'language_translator': + 'vinayakumar R', // your name for the Translators tab + 'translator_e-mail': + 'vnkmr7620@gmail.com', // optional + 'last_changed': + '2015-02-20' +}; + +SnapTranslator.dict.tr = { + 'language_name': + 'Türkçe', + 'language_translator': + 'Turgut Güneysu, Hakan Atas', + 'translator_e-mail': + 'tguneysu@msn.com', // hakanatas@gmail.com, mustafaipekbayrak@gmail.com', + 'last_changed': + '2021-01-26' +}; + +SnapTranslator.dict.hu = { + 'language_name': + 'Magyar', + 'language_translator': + 'Makány György, Faragó Attila', + 'translator_e-mail': + 'makany.gyorgy@gmail.com, attila.farago@sap.com', + 'last_changed': + '2022-01-25' +}; + +SnapTranslator.dict.ia = { + 'language_name': + 'Interlingua', + 'language_translator': + 'Ken Dickey', + 'translator_e-mail': + 'Ken.Dickey@whidbey.com', + 'last_changed': + '2015-08-09' +}; + +SnapTranslator.dict.hr = { + 'language_name': + 'Hrvatski', + 'language_translator': + '\u017Deljko Hrvoj', + 'translator_e-mail': + 'zeljko.hrvoj@zg.t-com.hr', + 'last_changed': + '2017-08-15' +}; + +SnapTranslator.dict.bg = { + 'language_name': + 'Български', + 'language_translator': + 'Ivan Savov', + 'translator_e-mail': + 'ivan.savov@gmail.com', + 'last_changed': + '2015-11-16' +}; + +SnapTranslator.dict.ro = { + 'language_name': + 'Român', + 'language_translator': + 'Cristian Macarascu', + 'translator_e-mail': + '', + 'last_changed': + '2015-10-24' +}; + +SnapTranslator.dict.ar = { + 'language_name': + 'العربية', // the name as it should appear in the language menu + 'language_translator': + 'طارق جلال', // your name for the Translators tab + 'translator_e-mail': + 'tarekgalal46@hotmail.com', // optional + 'last_changed': + '2016-02-24' +}; + +SnapTranslator.dict.id = { + 'language_name': + 'Bahasa Indonesia', + 'language_translator': + 'Alexander Raphael Liu, Emmanuella Rumanti', + 'translator_e-mail': + 'raphaxander@gmail.com', + 'last_changed': + '2019-01-21' +}; + +SnapTranslator.dict.et = { + 'language_name': + 'Eesti', + 'language_translator': + 'Hasso Tepper', + 'translator_e-mail': + 'hasso.tepper@gmail.com', + 'last_changed': + '2016-05-03' +}; + +SnapTranslator.dict.gl = { + 'language_name': + 'Galego', + 'language_translator': + 'tecnoloxia <2016>,Miguel A. Bouzada <2019>', + 'translator_e-mail': + 'mbouzada@gmail.com', + 'last_changed': + '2019-07-29' +}; + +SnapTranslator.dict.eu = { + 'language_name': + 'Euskara', + 'language_translator': + 'Asier Iturralde Sarasola', + 'translator_e-mail': + 'aiturralde@iametza.eus', + 'last_changed': + '2018-06-26' +}; + +SnapTranslator.dict.ua = { + 'language_name': + 'Українська', + 'language_translator': + 'Serhiy Kryzhanovsky', + 'translator_e-mail': + 'kseryj@gmail.com', + 'last_changed': + '2024-01-19' +}; + +SnapTranslator.dict.sk = { + 'language_name': + 'Sloven\u010Dina', + 'language_translator': + 'Peter Luka\u010Dovi\u010D', + 'translator_e-mail': + 'peter_lukacovic@outlook.com', + 'last_changed': + '2019-12-10' +}; + +SnapTranslator.dict.he = { + 'language_name': + 'עברית', + 'language_translator': + 'יוסי כהן', + 'translator_e-mail': + 'cohenyossi81@gmail.com', + 'last_changed': + '2020-04-21' +}; + +SnapTranslator.dict.hi = { + 'language_name': + 'हिंदी', + 'language_translator': + 'Barthdry', + 'translator_e-mail': + 'barathkumarbasker2007@gmail.com', + 'last_changed': + '2021-05-08' +}; + +SnapTranslator.dict.ti = { + 'language_name': + 'ትግርኛ', + 'language_translator': + 'Tesfaldet Negash, Heran Sium', + 'translator_e-mail': + 'winna.programming@gmail.com', + 'last_changed': + '2023-05-29' +}; + +SnapTranslator.dict.hy = { + 'language_name': + 'Հայերեն', + 'language_translator': + 'Symotec LLC and Armath team', + 'translator_e-mail': + 'info@symotec.am and info@armath.am', + 'last_changed': + '2023-04-12', +}; diff --git a/elements/pl-snap/Snap/src/maps.js b/elements/pl-snap/Snap/src/maps.js new file mode 100644 index 00000000..4781b520 --- /dev/null +++ b/elements/pl-snap/Snap/src/maps.js @@ -0,0 +1,365 @@ +/* + + maps.js + + a slippy maps tile client for morphic.js and Snap! + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2021 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js + + credits: + -------- + https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames +*/ + +/*global modules, Point, newCanvas, radians, StringMorph, normalizeCanvas*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.maps = '2021-June-15'; + +// WorldMap ///////////////////////////////////////////////////////////// + +function WorldMap(host) { + this.tileServers = { + OpenStreetMap: { + url: 'tile.openstreetmap.org', + type: 'zxy', + subdomains: ['a', 'b', 'c'], + key: null, + min: 0, + max: 19, + credits: 'Map data \u00A9 OpenStreetMap contributors' + + 'CC-BY-SA, Imagery \u00A9 Mapnik' + }, + Wikimedia: { + url: 'maps.wikimedia.org/osm-intl', + type: 'zxy', + subdomains: null, + key: null, + min: 0, + max: 19, + credits: 'Map data \u00A9 OpenStreetMap contributors, ' + + 'CC-BY-SA, Imagery \u00A9 Wikimedia' + }, + Watercolor: { + url: 'stamen-tiles.a.ssl.fastly.net/watercolor', + type: 'zxy', + subdomains: null, + key: null, + min: 0, + max: 20, + credits: 'Map data \u00A9 OpenStreetMap contributors, ' + + 'CC-BY-SA, Imagery \u00A9 Stamen, CC-BY-3.0.' + }, + 'Toner': { + url: 'stamen-tiles.a.ssl.fastly.net/toner', + type: 'zxy', + subdomains: null, + key: null, + min: 0, + max: 20, + credits: 'Map data \u00A9 OpenStreetMap contributors, ' + + 'CC-BY-SA, Imagery \u00A9 Stamen, CC-BY-3.0.' + }, + 'Terrain': { + url: 'stamen-tiles.a.ssl.fastly.net/terrain', + type: 'zxy', + subdomains: null, + key: null, + min: 0, + max: 16, + credits: 'Map data \u00A9 OpenStreetMap contributors, ' + + 'CC-BY-SA, Imagery \u00A9 Stamen, CC-BY-3.0.' + }, + Topographic: { + url: 'tile.opentopomap.org', + type: 'zxy', + subdomains: null, + key: null, + min: 0, + max: 17, + credits: 'Map data \u00A9 OpenStreetMap contributors, ' + + 'CC-BY-SA, Imagery \u00A9 Opentopomaps' + }, + Satellite: { + url: 'services.arcgisonline.com/ArcGIS/rest/services/' + + 'World_Imagery/MapServer/tile', + type: 'zyx', + subdomains: null, + key: null, + min: 0, + max: 19, + credits: 'Imagery \u00A9 ArcGIS' + }, + Streets: { + url: 'services.arcgisonline.com/ArcGIS/rest/services/' + + 'World_Street_Map/MapServer/tile', + type: 'zyx', + subdomains: null, + key: null, + min: 0, + max: 19, + credits: 'Imagery \u00A9 ArcGIS' + }, + Shading: { + url: 'services.arcgisonline.com/ArcGIS/rest/services/' + + 'World_Topo_Map/MapServer/tile', + type: 'zyx', + subdomains: null, + key: null, + min: 0, + max: 19, + credits: 'Imagery \u00A9 ArcGIS' + }, + 'Mapbox (experimental)': { + url: 'api.tiles.mapbox.com/v4/mapbox.streets', + type: 'zxy', + subdomains: null, + key: '?access_token=' + + 'pk.eyJ1IjoibWFwYm94IiwiYSI6ImNpejY4NXVycTA2emYycX' + + 'BndHRqcmZ3N3gifQ.rJcFIG214AriISLbB6B5aw', + min: 0, + max: 20, + credits: 'Map data \u00A9 OpenStreetMap contributors, ' + + 'CC-BY-SA, Imagery \u00A9 Mapbox' + } + }; + this.api = this.tileServers[host || 'OpenStreetMap']; + this.lon = -122.257852; + this.lat = 37.872099; + this.zoom = 13; + this.position = new Point( + this.tileXfromLon(this.lon), + this.tileYfromLat(this.lat) + ); + this.extent = new Point(480, 360); + this.tileSize = 256; + this.canvas = null; + this.creditsTxt = null; + this.creditsBG = null; + this.initializeCredits(); + this.loading = 0; +} + +WorldMap.prototype.setHost = function (host) { + this.api = this.tileServers[host || 'Wikimedia']; + this.initializeCredits(); + this.setZoom(this.zoom); +}; + +WorldMap.prototype.setView = function (lon, lat) { + this.lat = lat; + this.lon = lon; + this.refresh(); +}; + +WorldMap.prototype.setZoom = function (num) { + this.zoom = Math.max(Math.min(this.api.max, Math.floor(num)), this.api.min); + this.refresh(); +}; + +WorldMap.prototype.panBy = function (x, y) { + this.lon = this.lonFromTileX(this.position.x + (x / this.tileSize)); + this.lat = this.latFromTileY(this.position.y + (y / this.tileSize)); + this.refresh(); +}; + +WorldMap.prototype.refresh = function () { + this.position = new Point( + this.wrapTile(this.tileXfromLon(this.lon)), + this.tileYfromLat(this.lat) + ); +}; + +WorldMap.prototype.wrapTile = function (n) { + var max = Math.pow(2, this.zoom); + return n < 0 ? max + n : n % max; +}; + +WorldMap.prototype.tileXfromLon = function (lon) { + return (parseFloat(lon) + 180) / 360 * Math.pow(2, this.zoom); +}; + +WorldMap.prototype.tileYfromLat = function (lat) { + return (1 - Math.log(Math.tan(parseFloat(lat) * Math.PI / 180) + 1 / + Math.cos(parseFloat(lat) * Math.PI / 180)) / Math.PI) / 2 * + Math.pow(2, this.zoom); +}; + +WorldMap.prototype.lonFromTileX = function (x) { + return x / Math.pow(2, this.zoom) * 360 - 180; +}; + +WorldMap.prototype.latFromTileY = function (y) { + var n = Math.PI - 2 * Math.PI * y / Math.pow(2, this.zoom); + return 180 / Math.PI * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))); +}; + +WorldMap.prototype.lonFromSnapX = function (x) { + return this.lonFromTileX(this.position.x + (x / this.tileSize)); +}; + +WorldMap.prototype.latFromSnapY = function (y) { + return this.latFromTileY(this.position.y - (y / this.tileSize)); +}; + +WorldMap.prototype.snapXfromLon = function (lon) { + return (this.tileXfromLon(lon) - this.position.x) * this.tileSize; +}; + +WorldMap.prototype.snapYfromLat = function (lat) { + return (this.tileYfromLat(lat) - this.position.y) * -this.tileSize; +}; + +WorldMap.prototype.distanceInKm = function(lat1, lon1, lat2, lon2) { + // haversine formula: + var R = 6371, // radius of the earth in km + dLat = radians(+lat2 - lat1), + dLon = radians(+lon2 - lon1), + a = Math.sin(dLat/2) * Math.sin(dLat/2) + + Math.cos(radians(+lat1)) * Math.cos(radians(+lat2)) * + Math.sin(dLon/2) * Math.sin(dLon/2), + c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); + return R * c; +}; + +WorldMap.prototype.render = function () { + var cntr = this.extent.divideBy(2), + size = this.tileSize, + tile = this.position.floor(), + off = new Point( + this.position.x % 1, + this.position.y % 1 + ).multiplyBy(size), + tileOrigin = cntr.subtract(off), + tileDistance = tileOrigin.floorDivideBy(size).add(1), + tileGrid = this.extent.floorDivideBy(size).add(2), + originTile = tile.subtract(tileDistance), + mapOrigin = tileOrigin.subtract( + tileDistance.multiplyBy(size) + ), + sub = 0, + myself = this, + max = Math.pow(2, this.zoom), + x, y, img, ctx, tileX, tileY, coords; + + function ok() { + myself.loading -= 1; + ctx.drawImage( + this, + mapOrigin.x + (this.cx * size), + mapOrigin.y + (this.cy * size) + ); + crd(); + } + + function err() { + myself.loading -= 1; + crd(); + } + + function crd() { + if (!myself.loading) { + myself.addCredits(); + } + } + + // create a new canvas. Note, we cannot reuse the existing canvas, + // because it could be queried while tiles are still rendering + this.canvas = newCanvas(this.extent, true); + + ctx = this.canvas.getContext('2d'); + for (x = 0; x < tileGrid.x; x += 1) { + for (y = 0; y < tileGrid.y; y += 1) { + tileX = this.wrapTile(originTile.x + x); + tileY = originTile.y + y; + if ((tileX >= 0 && tileX < max) && (tileY >= 0 && tileY < max)) { + img = new Image(); + img.cx = x; + img.cy = y; + img.crossOrigin = ''; // anonymous + img.onload = ok; + img.onerror = err; + myself.loading += 1; + switch (this.api.type) { + case 'zxy': + coords = '' + this.zoom + '/' + tileX + '/' + tileY; + break; + case 'zyx': + coords = '' + this.zoom + '/' + tileY + '/' + tileX; + break; + case 'xyz': + coords = '' + tileX + '/' + tileY + '/' + this.zoom ; + break; + } + img.src = 'https://' + + (this.api.subdomains ? + this.api.subdomains[sub] + '.' + : '') + + this.api.url + '/' + coords + '.png' + (this.api.key || ''); + if (this.api.subdomains) { + sub += 1; + if (sub === this.api.subdomains.length) { + sub = 0; + } + } + } + } + } +}; + +WorldMap.prototype.initializeCredits = function () { + var ctx; + this.creditsTxt = new StringMorph( + ' ' + this.api.credits + ' ', + 8 + ); + this.creditsTxt.isCachingImage = true; + this.creditsTxt.cachedImage = normalizeCanvas( + this.creditsTxt.getImage(), true + ); + this.creditsBG = newCanvas(this.creditsTxt.extent(), true); + ctx = this.creditsBG.getContext('2d'); + ctx.fillStyle = 'white'; + ctx.fillRect(0, 0, this.creditsBG.width, this.creditsBG.height); +}; + +WorldMap.prototype.addCredits = function () { + var ctx = this.canvas.getContext('2d'), + crd = this.creditsTxt.getImage(); + ctx.globalAlpha = 0.5; + ctx.drawImage( + this.creditsBG, + this.canvas.width - crd.width, + this.canvas.height - crd.height + ); + ctx.globalAlpha = 1; + ctx.drawImage( + crd, + this.canvas.width - crd.width, + this.canvas.height - crd.height + ); +}; diff --git a/elements/pl-snap/Snap/src/morphic.js b/elements/pl-snap/Snap/src/morphic.js new file mode 100644 index 00000000..52bce34c --- /dev/null +++ b/elements/pl-snap/Snap/src/morphic.js @@ -0,0 +1,12938 @@ +/* + + morphic.js + + a lively Web-GUI + inspired by Squeak + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2010-2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + documentation contents + ---------------------- + I. inheritance hierarchy + II. object definition toc + III. yet to implement + IV. open issues + V. browser compatibility + VI. the big picture + VII. programming guide + (1) setting up a web page + (a) single world + (b) multiple worlds + (c) an application + (2) manipulating morphs + (3) events + (a) mouse events + (b) context menu + (c) dragging + (d) dropping + (e) keyboard events + (f) resize event + (g) combined mouse-keyboard events + (h) text editing events + (4) stepping + (5) creating new kinds of morphs + (a) drawing the shape + (b) determining extent and arranging submorphs + (c) pixel-perfect pointing events + (d) caching the shape + (e) holes + (f) updating + (g) duplicating + (6) development and user modes + (7) turtle graphics + (8) supporting high-resolution "retina" screens + (9 animations + (10) minifying morphic.js + VIII. acknowledgements + IX. contributors + + + I. hierarchy + ------------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + Animation + Color + Node + Morph + BlinkerMorph + CursorMorph + BouncerMorph* + BoxMorph + InspectorMorph + MenuMorph + MouseSensorMorph* + SpeechBubbleMorph + CircleBoxMorph + SliderButtonMorph + SliderMorph + ColorPaletteMorph + GrayPaletteMorph + ColorPickerMorph + DialMorph + FrameMorph + ScrollFrameMorph + ListMorph + StringFieldMorph + WorldMorph + HandleMorph + HandMorph + PenMorph + ShadowMorph + StringMorph + TextMorph + TriggerMorph + MenuItemMorph + Point + Rectangle + + + II. toc + ------- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + Global settings + Global functions + + Animation + Color + Point + Rectangle + Node + Morph + ShadowMorph + HandleMorph + PenMorph + ColorPaletteMorph + GrayPaletteMorph + ColorPickerMorph + BlinkerMorph + CursorMorph + BoxMorph + SpeechBubbleMorph + DialMorph + CircleBoxMorph + SliderButtonMorph + SliderMorph + MouseSensorMorph* + InspectorMorph + MenuMorph + StringMorph + TextMorph + TriggerMorph + MenuItemMorph + FrameMorph + ScrollFrameMorph + ListMorph + StringFieldMorph + BouncerMorph* + HandMorph + WorldMorph + + * included only for demo purposes + + + III. yet to implement + --------------------- + - keyboard support for scroll frames and lists + - virtual keyboard support for Android + + + IV. open issues + ---------------- + - clipboard support (copy & paste) for non-textual data + + + V. browser compatibility + ------------------------ + I have taken great care and considerable effort to make morphic.js + runnable and appearing exactly the same on all current browsers + available to me: + + - Firefox for Windows + - Firefox for Mac + - Firefox for Android + - Chrome for Windows + - Chrome for Mac + - Chrome for Android + - Safari for Windows (deprecated) + - safari for Mac + - Safari for iOS (mobile) + - IE for Windows (partial support) + - Edge for Windows + - Opera for Windows + - Opera for Mac + + + VI. the big picture + ------------------- + Morphic.js is completely based on Canvas and JavaScript, it is just + Morphic, nothing else. Morphic.js is very basic and covers only the + bare essentials: + + * a stepping mechanism (a time-sharing multiplexer for lively + user interaction ontop of a single OS/browser thread) + * progressive display updates (only dirty rectangles are + redrawn at each display cycle) + * a tree structure + * a single World per Canvas element (although you can have + multiple worlds in multiple Canvas elements on the same web + page) + * a single Hand per World (but you can support multi-touch + events) + * a single text entry focus per World + + In its current state morphic.js doesn't support transforms (you + cannot rotate Morphs), but with PenMorph there already is a simple + LOGO-like turtle that you can use to draw onto any Morph it is + attached to. I'm planning to add special Morphs that support these + operations later on, but not for every Morph in the system. + Therefore these additions ("sprites" etc.) are likely to be part of + other libraries ("microworld.js") in separate files. + + the purpose of morphic.js is to provide a malleable framework that + will let me experiment with lively GUIs for my hobby horse, which + is drag-and-drop, blocks based programming languages. Those things + (BYOB4 - http://byob.berkeley.edu) will be written using morphic.js + as a library. + + + VII. programming guide + ---------------------- + Morphic.js provides a library for lively GUIs inside single HTML + Canvas elements. Each such canvas element functions as a "world" in + which other visible shapes ("morphs") can be positioned and + manipulated, often directly and interactively by the user. Morphs + are tree nodes and may contain any number of submorphs ("children"). + + All things visible in a morphic World are morphs themselves, i.e. + all text rendering, blinking cursors, entry fields, menus, buttons, + sliders, windows and dialog boxes etc. are created with morphic.js + rather than using HTML DOM elements, and as a consequence can be + changed and adjusted by the programmer regardless of proprietary + browser behavior. + + Each World has an - invisible - "Hand" resembling the mouse cursor + (or the user's finger on touch screens) which handles mouse events, + and may also have a keyboard focus to handle key events. + + The basic idea of Morphic is to continuously run display cycles and + to incrementally update the screen by only redrawing those World + regions which have been "dirtied" since the last redraw. Before + each shape is processed for redisplay it gets the chance to perform + a "step" procedure, thus allowing for an illusion of concurrency. + + + (1) setting up a web page + ------------------------- + Setting up a web page for Morphic always involves three steps: + adding one or more Canvas elements, defining one or more worlds, + initializing and starting the main loop. + + + (a) single world + ----------------- + Most commonly you will want your World to fill the browsers's whole + client area. This default situation is easiest and most straight + forward. + + example html file: + + + + + + Morphic! + + + + + + + + + if you use ScrollFrames or otherwise plan to support mouse wheel + scrolling events, make sure to add the following inline-CSS + attribute to the Canvas element: + + style="position: absolute;" + + which will prevent the World to be scrolled around instead of the + elements inside of it in some browsers. + + + (b) multiple worlds + ------------------- + If you wish to create a web page with more than one world, make + sure to prevent each world from auto-filling the whole page and + include it in the main loop. It's also a good idea to give each + world its own tabindex: + + example html file: + + + + + + Morphic! + + + + +

first world:

+ +

second world:

+ + + + + + (c) an application + ------------------- + Of course, most of the time you don't want to just plain use the + standard Morphic World "as is" out of the box, but write your own + application (something like Scratch!) in it. For such an + application you'll create your own morph prototypes, perhaps + assemble your own "window frame" and bring it all to life in a + customized World state. the following example creates a simple + snake-like mouse drawing game. + + example html file: + + + + + + touch me! + + + + + + + + + To get an idea how you can craft your own custom morph prototypes + I've included two examples which should give you an idea how to add + properties, override inherited methods and use the stepping + mechanism for "livelyness": + + BouncerMorph + MouseSensorMorph + + For the sake of sharing a single file I've included those examples + in morphic.js itself. Usually you'll define your additions in a + separate file and keep morphic.js untouched. + + + (2) manipulating morphs + ----------------------- + There are many methods to programmatically manipulate morphs. Among + the most important and common ones among all morphs are the + following nine: + + * hide() + * show() + + * setPosition(aPoint) + * setExtent(aPoint) + * setColor(aColor) + + * add(submorph) - attaches submorph ontop + * addBack(submorph) - attaches submorph underneath + + * fullCopy() - duplication + * destroy() - deletion + + + (3) events + ---------- + All user (and system) interaction is triggered by events, which are + passed on from the root element - the World - to its submorphs. The + World contains a list of system (browser) events it reacts to in its + + initEventListeners() + + method. Currently there are + + - mouse + - drop + - keyboard + - (window) resize + + events. + + These system events are dispatched within the morphic World by the + World's Hand and its keyboardFocus (usually the active text + cursor). + + + (a) mouse events: + ----------------- + The Hand dispatches the following mouse events to relevant morphs: + + mouseDownLeft + mouseDownRight + mouseClickLeft + mouseClickRight + mouseDoubleClick + mouseEnter + mouseLeave + mouseEnterDragging + mouseLeaveDragging + mouseEnterBounds + mouseLeaveBounds + mouseMove + mouseScroll + + If you wish your morph to react to any such event, simply add a + method of the same name as the event, e.g: + + MyMorph.prototype.mouseMove = function(pos) {}; + + Most of these methods have as optional parameter a Point object + indicating the current position of the Hand inside the World's + coordinate system. The + + mouseMove(pos, button) + + event method has an additional optional parameter indicating the + currently pressed mouse button, which is either 'left' or 'right'. + You can use this to let users interact with 3D environments. + + The + + mouseEnterDragging(morph) + mouseLeaveDragging(morph) + mouseEnterBounds(morph) + mouseLeaveBounds(morph) + + event methods have as optional parameter the morph currently dragged by + the Hand, if any. + + Events may be "bubbled" up a morph's owner chain by calling + + this.escalateEvent(functionName, arg) + + in the event handler method's code. + + Likewise, removing the event handler method will render your morph + passive to the event in question. + + + (b) context menu: + ----------------- + By default right-clicking (or single-finger tap-and-hold) on a morph + also invokes its context menu (in addition to firing the + mouseClickRight event). A morph's context menu can be customized by + assigning a Menu instance to its + + customContextMenu + + property, or altogether suppressed by overriding its inherited + + contextMenu() + + method. + + + (c) dragging: + ------------- + Dragging a morph is initiated when the left mouse button is pressed, + held and the mouse is moved. + + You can control whether a morph is draggable by setting its + + isDraggable + + property either to false or true. If a morph isn't draggable itself + it will pass the pick-up request up its owner chain. This lets you + create draggable composite morphs like Windows, DialogBoxes, + Sliders etc. + + Sometimes it is desireable to make "template" shapes which cannot be + moved themselves, but from which instead duplicates can be peeled + off. This is especially useful for building blocks in construction + kits, e.g. the MIT-Scratch palette. Morphic.js lets you control this + functionality by setting the + + isTemplate + + property flag to true for any morph whose "isDraggable" property is + turned off. When dragging such a Morph the hand will instead grab + a duplicate of the template whose "isDraggable" flag is true and + whose "isTemplate" flag is false, in other words: a non-template. + + When creating a copy from a template, the copy's + + reactToTemplateCopy + + is invoked, if it is present. + + Dragging is indicated by adding a drop shadow to the morph in hand. + If a morph follows the hand without displaying a drop shadow it is + merely being moved about without changing its parent (owner morph), + e.g. when "dragging" a morph handle to resize its owner, or when + "dragging" a slider button. + + Right before a morph is picked up its + + selectForEdit + + and + + prepareToBeGrabbed(handMorph) + + methods are invoked, each if it is present. the optional + + selectForEdit + + if implemented, must return the object that is to be picked up. + In addition to just returning the original object chosen by the user + your method can also modify the target's environment and instead return + a copy of the selected morph if, for example, you would like to implement + a copy-on-write mechanism such as in Snap. + + Immediately after the pick-up the former parent's + + reactToGrabOf(grabbedMorph) + + method is called, again only if it exists. + + Similar to events, these methods are optional and don't exist by + default. For a simple example of how they can be used to adjust + scroll bars in a scroll frame please have a look at their + implementation in FrameMorph. + + + (d) dropping: + ------------- + Dropping is triggered when the left mouse button is either pressed + or released while the Hand is dragging a morph. + + Dropping a morph causes it to become embedded in a new owner morph. + You can control this embedding behavior by setting the prospective + drop target's + + acceptsDrops + + property to either true or false, or by overriding its inherited + + wantsDropOf(aMorph) + + method. + + Right before dropping a morph the designated new parent's optional + + selectForEdit + + method is invoked if it is present. Again, if implemented this method + must return the new parent for the morph that is about to be dropped. + Again, in addition to just returning the designeted drop-target + your method can also modify its environment and instead return + a copy of the new parent if, for example, you would like to implement + a copy-on-write mechanism such as in Snap. + + Right after a morph has been dropped its + + justDropped(handMorph) + + method is called, and its new parent's + + reactToDropOf(droppedMorph, handMorph) + + method is invoked, again only if each method exists. + + Similar to events, these methods are optional and by default are + not present in morphs by default (watch out for inheritance, + though!). For a simple example of how they can be used to adjust + scroll bars in a scroll frame please have a look at their + implementation in FrameMorph. + + Drops of image elements from outside the world canvas are dispatched as + + droppedImage(aCanvas, name, embeddedData) + droppedSVG(anImage, name) + + events to interested Morphs at the mouse pointer. If you want your Morph + to e.g. import outside images you can add the droppedImage() and / or the + droppedSVG() methods to it. The parameter passed to the event handles is + a new offscreen canvas element representing a copy of the original image + element which can be directly used, e.g. by assigning it to another + Morph's cachedImage property. In the case of a dropped SVG it is an image + element (not a canvas), which has to be rasterized onto a canvas before + it can be used. The benefit of handling SVGs as image elements is that + rasterization can be deferred until the destination scale is known, taking + advantage of SVG's ability for smooth scaling. If instead SVGs are to be + rasterized right away, you can set the + + MorphicPreferences.rasterizeSVGs + + preference to . In this case dropped SVGs also trigger the + droppedImage() event with a canvas containing a rasterized version of the + SVG. + + Note that PNG images provide for embedded text comments, which can be used + to include code or arbitrary data such as a CSV, JSON or XML file inside + the image. Such a payload has to be identified by an agreed-upon marker. + The default tag is stored in MorphicPreferences and can be overriden by + apps wishing to make use of this feature. If such an embedded text-payload + is found inside a PNG it is passed as the optional third "embeddedData" + parameter to the "droppedImage()" event. embedded text only applies to PNGs. + You can embed a string into the PNG metadata of a PNG by calling + + embedMetadataPNG(aCanvas, aString) + + with a raster image represented by a canvas and a string that is to be + embedded into the PNG's metadata. + + The same event mechanism applies to drops of audio or text files from + outside the world canvas. + + Those are dispatched as + + droppedAudio(anAudio, name) + droppedText(aString, name, type) + + events to interested Morphs at the mouse pointer. + + if none of the above content types can be determined, the file contents + is dispatched as an ArrayBuffer to interested Morphs: + + droppedBinary(anArrayBuffer, name) + + In case multiple files are dropped simulateneously the events + + beginBulkDrop() + endBulkDrop() + + are dispatched to to Morphs interested in bracketing the bulk operation, + and the endBulkDrop() event is only signalled after the contents last file + has been asynchronously made available. + + + (e) keyboard events + ------------------- + The World dispatches the following key events to its active + keyboard focus: + + keypress + keydown + keyup + + Currently the only morphs which acts as keyboard focus are + CursorMorph - the basic text editing widget - and MenuMorph elements. + If you wish to add keyboard support to your morph you need to add event + handling methods for + + processKeyPress(event) + processKeyDown(event) + processKeyUp(event) + + and activate them by assigning your morph to the World's + + keyboardFocus + + property. + + Note that processKeyUp() is optional and doesn't have to be present + if your morph doesn't require it. + + + (f) resize event + ---------------- + The Window resize event is handled by the World and allows the + World's extent to be adjusted so that it always completely fills + the browser's visible page. You can turn off this default behavior + by setting the World's + + useFillPage + + property to false. + + Alternatively you can also initialize the World with the + useFillPage switch turned off from the beginning by passing the + false value as second parameter to the World's constructor: + + world = new World(aCanvas, false); + + Use this when creating a web page with multiple Worlds. + + if "useFillPage" is turned on the World dispatches an + + reactToWorldResize(newBounds) + + events to all of its children (toplevel only), allowing each to + adjust to the new World bounds by implementing a corresponding + method, the passed argument being the World's new dimensions after + completing the resize. By default, the "reactToWorldResize" Method + does not exist. + + Example: + + Add the following method to your Morph to let it automatically + fill the whole World, but leave a 10 pixel border uncovered: + + MyMorph.prototype.reactToWorldResize = function (rect) { + this.changed(); + this.bounds = rect.insetBy(10); + this.rerender(); + }; + + + (g) combined mouse-keyboard events + ---------------------------------- + Occasionally you'll want an object to react differently to a mouse + click or to some other mouse event while the user holds down a key + on the keyboard. Such "shift-click", "ctl-click", or "alt-click" + events can be implemented by querying the World's + + currentKey + + property inside the function that reacts to the mouse event. This + property stores the keyCode of the key that's currently pressed. + Once the key is released by the user it reverts to null. + + + (h) text editing events + ----------------------- + Much of Morphic's "liveliness" comes out of allowing text elements + (instances of either single-lined StringMorph or multi-lined TextMorph) + to be directly manipulated and edited by users. This requires other + objects which may have an interest in the text element's state to react + appropriately. Therefore text elements and their manipulators emit + a stream of events, mostly by "bubbling" them up the text element's + owner chain. Text elements' parents are notified about the following + events: + + Whenever the user presses a key on the keyboard while a text element + is being edited, first a + + reactToKeystroke(event) + + is escalated up its parent chain, the "event" parameter being the + original one received by the World. + + Whenever the input changes, by adding or removing one or more characters, + an additional + + reactToInput(event) + + is escalated up its parent chain, the "event" parameter again being the + original one received by the World or by the IME element. + + Note that the "reactToKeystroke" event gets triggered before the input + changes, and thus befgore the "reactToInput" event fires. + + Once the user has completed the edit, the following events are + dispatched: + + accept() - was pressed on a single line of text + cancel() - was pressed on any text element + + Note that "accept" only gets triggered by single-line texte elements, + as the key is used to insert line breaks in multi-line + elements. Therefore, whenever a text edit is terminated by the user + (accepted, cancelled or otherwise), + + reactToEdit(StringOrTextMorph) + + is triggered. + + If the MorphicPreference's + + useSliderForInput + + setting is turned on, a slider is popped up underneath the currently + edited text element letting the user insert numbers out of the given + slider range. Whenever this happens, i.e. whenever the slider is moved + or while the slider button is pressed, a stream of + + reactToSliderEdit(StringOrTextMorph) + + events is dispatched, allowing for "Bret-Victor" style "scrubbing" + applications. + + In addition to user-initiated events text elements also emit + change notifications to their direct parents whenever their contents + changes. That way complex Morphs containing text elements + get a chance to react if something about the embedded text has been + modified programmatically. These events are: + + layoutChanged() - sent only from instances of TextMorph + fixLayout() - sent from instances of all Morphs, including StringMorphs + + they are different so that Morphs which contain both multi-line and + single-line text elements can hold them apart. + + + (4) stepping + ------------ + Stepping is what makes Morphic "magical". Two properties control + a morph's stepping behavior: the fps attribute and the step() + method. + + By default the + + step() + + method does nothing. As you can see in the examples of BouncerMorph + and MouseSensorMorph you can easily override this inherited method + to suit your needs. + + By default the step() method is called once per display cycle. + Depending on the number of actively stepping morphs and the + complexity of your step() methods this can cause quite a strain on + your CPU, and also result in your application behaving differently + on slower computers than on fast ones. + + setting + + myMorph.fps + + to a number lower than the interval for the main loop lets you free + system resources (albeit at the cost of a less responsive or slower + behavior for this particular morph). + + + (5) creating new kinds of morphs + -------------------------------- + The real fun begins when you start to create new kinds of morphs + with customized shapes. Imagine, e.g. jigsaw puzzle pieces or + musical notes. + + When you create your own morphs, you'll want to think about how to + graphically render it, how to determine its size and whether it needs + to arrange any other parts ("submorphs). There are also ways to specify + its collision detection behavior and define "untouchable" regions + ("holes"). + + + (a) drawing the shape + --------------------- + For this you have to override the default + + render(ctx) + + method. + + This method draws the morph's shape using a given 2d graphics context. + Note that any coordinates used in the render() method must be relative + to the morph's own position, i.e. you don't need to worry about + translating the shape yourself. + + You can use the following template for a start: + + MyMorph.prototype.render = function(ctx) { + ctx.fillStyle = this.color.toString(); + ctx.fillRect(0, 0, this.width(), this.height()); + }; + + it renders the morph as a solid rectangle completely filling its + area with its current color. + + Notice how the coordinates for the fillRect() call are relative + to the morph's own position: The rendered rectangle's origin is always + located at (0, 0) regardless of the morph's actual position in the World. + + + (b) determining extent and arranging submorphs + ---------------------------------------------- + If your new morph also needs to determine its extent and, e.g. to + encompass one or several other morphs, or arrange the layout of its + submorphs, make sure to also override the default + + fixLayout() + + method. + + NOTE: If you need to set the morph's extent inside, in order to avoid + infinite recursion instead of calling morph.setExtent() - which will + in turn call morph.fixLayout() again - directly modify the morph's + + bounds + + property. Bounds is a rectable on which you can also use the same + size-setters, e.g. by calling: + + this.bounds.setExtent() + + + (c) pixel-perfect pointing events + --------------------------------- + In case your new morph needs to support pixel-perfect collision detection + with other morphs or pointing devices such as the mouse or a stylus you + can set the inherited attribute + + isFreeForm = bool + + to "true" (default is "false"). This makes sense the more your morph's + visual shape diverges from a rectangle. For example, if you create a + circular filled morph the default setting will register mouse-events + anywhere within its bounding box, e.g. also in the transparent parts + between the bounding box's corners outside of the circle's bounds. + Instead you can specify your irregulary shaped morph to only register + pointing events (mouse and touch) on solid, non-transparent parts. + + Notice, however, that such pixel-perfect collision detection might + strain processing resources, especially if applied liberally. + + In order to mitigate unfavorable processor loads for pixel-perfect + collision deteciton of irregularly shaped morphs there are two strategies + to consider: Caching the shape and specifying "untouchable" regions. + + + (d) caching the shape + --------------------- + In case of pixel-perfect free-form collision detection it makes sense to + cache your morph's current shape, so it doesn't have to be re-drawn onto a + new Canvas element every time the mouse moves over its bounding box. + For this you can set then inherited + + isCachingImage = bool + + attribute to "true" instead of the default "false" value. This will + significantly speed up collision detection and smoothen animations that + continuously perform collision detection. However, it will also consume + more memory. Therefore it's best to use this setting with caution. + + Snap! caches the shapes of sprites but not those of blocks. Instead it + manages the insides of C- and E-shaped blocks through the morphic "holes" + mechanism. + + + (e) holes + --------- + An alternative albeit not as precise and general way for handling + irregularly shaped morphs with "untouchable" regions is to specify a set + of rectangular areas in which pointing events (mouse or touch) are not + registered. + + By default the inherited + + holes = [] + + property is an empty array. You can add one or more morphic Rectangle + objects to this list, representing regions, in which occurring events will + instead be passed on to the morph underneath. + + Note that, same with the render() method, the coordinates of these + rectangular holes must be specified relative to your morph's position. + + If you specify holes you might find the need to adjust their layout + depending on the layout of your morph. To accomplish this you can override + the inherited + + fixHolesLayout() + + method. + + + (f) updating + ------------ + One way for morphs to become alive is form them to literally "morph" their + shape depending on whicher contest you wish them to react to. For example, + you might want the user to interactively draw a shape using their fingers + on a touch screen device, or you want the user to be able to "pinch" or + otherwise distort a shape interactively. In all of these situations you'll + want your morph to frequently rerender its shape. + + You can accomplish this, by calling + + rerender() + + after every change to your morph's appearance that requires rerendering. + + Such changes are usually only happening when the morph's dimensions or + other visual properties - such as its color - changes. + + + (g) duplicating + --------------- + If your new morph stores or references to other morphs outside of + the submorph tree in other properties, be sure to also override the + default + + updateReferences() + + method if you want it to support duplication. + + + (6) development and user modes + ------------------------------ + When working with Squeak on Scratch or BYOB among the features I + like the best and use the most is inspecting what's going on in + the World while it is up and running. That's what development mode + is for (you could also call it debug mode). In essence development + mode controls which context menu shows up. In user mode right + clicking (or double finger tapping) a morph invokes its + + customContextMenu + + property, whereas in development mode only the general + + developersMenu() + + method is called and the resulting menu invoked. The developers' + menu features Gui-Builder-wise functionality to directly inspect, + take apart, reassamble and otherwise manipulate morphs and their + contents. + + Instead of using the "customContextMenu" property you can also + assign a more dynamic contextMenu by overriding the general + + userMenu() + + method with a customized menu constructor. The difference between + the customContextMenu property and the userMenu() method is that + the former is also present in development mode and overrides the + developersMenu() result. For an example of how to use the + customContextMenu property have a look at TextMorph's evaluation + menu, which is used for the Inspector's evaluation pane. + + When in development mode you can inspect every Morph's properties + with the inspector, including all of its methods. The inspector + also lets you add, remove and rename properties, and even edit + their values at runtime. Like in a Smalltalk environment the inspect + features an evaluation pane into which you can type in arbitrary + JavaScript code and evaluate it in the context of the inspectee. + + Use switching between user and development modes while you are + developing an application and disable switching to development once + you're done and deploying, because generally you don't want to + confuse end-users with inspectors and meta-level stuff. + + + (7) turtle graphics + ------------------- + + The basic Morphic kernel features a simple LOGO turtle constructor + called + + PenMorph + + which you can use to draw onto its parent Morph. By default every + Morph in the system (including the World) is able to act as turtle + canvas and can display pen trails. Pen trails will be lost whenever + the trails morph (the pen's parent) performs a "render()" + operation. If you want to create your own pen trails canvas, you + may wish to modify its + + penTrails() + + property, so that it keeps a separate offscreen canvas for pen + trails (and doesn't loose these on redraw). + + the following properties of PenMorph are relevant for turtle + graphics: + + color - a Color + size - line width of pen trails + heading - degrees + isDown - drawing state + + the following commands can be used to actually draw something: + + up() - lift the pen up, further movements leave no trails + down() - set down, further movements leave trails + clear() - remove all trails from the current parent + forward(n) - move n steps in the current direction (heading) + turn(n) - turn right n degrees + + Turtle graphics can best be explored interactively by creating a + new PenMorph object and by manipulating it with the inspector + widget. + + NOTE: PenMorph has a special optimization for recursive operations + called + + warp(function) + + You can significantly speed up recursive ops and increase the depth + of recursion that's displayable by wrapping WARP around your + recursive function call: + + example: + + myPen.warp(function () { + myPen.tree(12, 120, 20); + }) + + will be much faster than just invoking the tree function, because it + prevents the parent's parent from keeping track of every single line + segment and instead redraws the outcome in a single pass. + + + (8) supporting high-resolution "retina" screens + ----------------------------------------------- + By default retina support gets installed when Morphic.js loads. There + are two global functions that let you test for retina availability: + + isRetinaSupported() - Bool, answers if retina support is available + isRetinaEnabled() - Bool, answers if currently in retina mode + + and two more functions that let you control retina support if it is + available: + + enableRetinaSupport() + disableRetinaSupport() + + Both of these internally test whether retina is available, so they are + safe to call directly. For an example how to make retina support + user-specifiable refer to + + Snap! >> guis.js >> toggleRetina() + + Even when in retina mode it often makes sense to use normal-resolution + canvasses for simple shapes in order to save system resources and + optimize performance. Examples are costumes and backgrounds in Snap. + In Morphic you can create new canvas elements using + + newCanvas(extentPoint [, nonRetinaFlag]) + + If retina support is enabled such new canvasses will automatically be + high-resolution canvasses, unless the newCanvas() function is given an + otherwise optional second Boolean argument that explicitly makes + it a non-retina canvas. + + Not the whole canvas API is supported by Morphic's retina utilities. + Especially if your code uses putImageData() you will want to "downgrade" + a target high-resolution canvas to a normal-resolution ("non-retina") + one before using + + normalizeCanvas(aCanvas [, copyFlag]) + + This will change the target canvas' resolution in place (!). If you + pass in the optional second Boolean flag the function returns + a non-retina copy and leaves the target canvas unchanged. An example + of this normalize mechanism is converting the penTrails layer of Snap's + stage (high-resolution) into a sprite-costume (normal resolution). + + + (9) animations + --------------- + Animations handle gradual transitions between one state and another over a + period of time. Transition effects can be specified using easing functions. + An easing function maps a fraction of the transition time to a fraction of + the state delta. This way accelerating / decelerating and bouncing sliding + effects can be accomplished. + + Animations are generic and not limited to motion, i.e. they can also handle + other transitions such as color changes, transparency fadings, growing, + shrinking, turning etc. + + Animations need to be stepped by a scheduler, e. g. an interval function. + In Morphic the preferred way to run an animation is to register it with + the World by adding it to the World's animation queue. The World steps each + registered animation once per display cycle independently of the Morphic + stepping mechanism. + + For an example how to use animations look at how the Morph's methods + + glideTo() + fadeTo() + + and + + slideBackTo() + + are implemented. + + + (10) minifying morphic.js + ------------------------- + Coming from Smalltalk and being a Squeaker at heart I am a huge fan + of browsing the code itself to make sense of it. Therefore I have + included this documentation and (too little) inline comments so all + you need to get going is this very file. + + Nowadays with live streaming HD video even on mobile phones 250 KB + shouldn't be a big strain on bandwith, still minifying and even + compressing morphic.js down do about 100 KB may sometimes improve + performance in production use. + + Being an attorney-at-law myself you programmer folk keep harassing + me with rabulistic nitpickings about free software licenses. I'm + releasing morphic.js under an AGPL license. Therefore please make + sure to adhere to that license in any minified or compressed version. + + + VIII. acknowledgements + ---------------------- + The original Morphic was designed and written by Randy Smith and + John Maloney for the SELF programming language, and later ported to + Squeak (Smalltalk) by John Maloney and Dan Ingalls, who has also + ported it to JavaScript (the Lively Kernel), once again setting + a "Gold Standard" for self sustaining systems which morphic.js + cannot and does not aspire to meet. + + This Morphic implementation for JavaScript is not a direct port of + Squeak's Morphic, but still many individual functions have been + ported almost literally from Squeak, sometimes even including their + comments, e.g. the morph duplication mechanism fullCopy(). Squeak + has been a treasure trove, and if morphic.js looks, feels and + smells a lot like Squeak, I'll take it as a compliment. + + Evelyn Eastmond has inspired and encouraged me with her wonderful + implementation of DesignBlocksJS. Thanks for sharing code, ideas + and enthusiasm for programming. + + John Maloney has been my mentor and my source of inspiration for + these Morphic experiments. Thanks for the critique, the suggestions + and explanations for all things Morphic and for being my all time + programming hero. + + I have originally written morphic.js in Florian Balmer's Notepad2 + editor for Windows, later switched to Apple's Dashcode and later + still to Apple's Xcode. I've also come to depend on both Douglas + Crockford's JSLint and later the JSHint project, as well as on + Mozilla's Firebug and Google's Chrome to get it right. + + + IX. contributors + ---------------------- + Joe Otto found and fixed many early bugs and taught me some tricks. + Nathan Dinsmore contributed mouse wheel scrolling, cached + background texture handling, countless bug fixes and optimizations. + Ian Reynolds contributed backspace key handling for Chrome. + Davide Della Casa contributed performance optimizations for Firefox. + Jason N (@cyderize) contributed native copy & paste for text editing. + Bartosz Leper contributed retina display support. + Zhenlei Jia and Dariusz Dorożalski pioneered IME text editing. + Dariusz Dorożalski and Jesus Villalobos contributed embedding blocks + into image metadata. + Bernat Romagosa contributed to text editing and to the core design. + Michael Ball found and fixed a longstanding scrolling bug. + Brian Harvey contributed to the design and implementation of submenus. + Ken Kahn contributed to Chinese keboard entry and Android support. + Brian Broll contributed clickable URLs in text elements and many bugfixes. + + - Jens Mönig +*/ + +// Global settings ///////////////////////////////////////////////////// + +/*global window, HTMLCanvasElement, FileReader, Audio, FileList, Map*/ + +/*jshint esversion: 11, bitwise: false*/ + +var morphicVersion = '2024-March-01'; +var modules = {}; // keep track of additional loaded modules +var useBlurredShadows = true; + +const ZERO = new Point(); +const BLACK = new Color(); +const WHITE = new Color(255, 255, 255); +const CLEAR = new Color(0, 0, 0, 0); + +Object.freeze(ZERO); +Object.freeze(BLACK); +Object.freeze(WHITE); +Object.freeze(CLEAR); + +var standardSettings = { + minimumFontHeight: getMinimumFontHeight(), // browser settings + globalFontFamily: '', + menuFontName: 'sans-serif', + menuFontSize: 12, + bubbleHelpFontSize: 10, + prompterFontName: 'sans-serif', + prompterFontSize: 12, + prompterSliderSize: 10, + handleSize: 15, + scrollBarSize: 9, // was 12, + mouseScrollAmount: 40, + useSliderForInput: false, + isTouchDevice: false, // turned on by touch events, don't set + pngPayloadMarker: 'Data\tPayload\tEmbedded', + rasterizeSVGs: false, + isFlat: false, + grabThreshold: 5, + showHoles: false +}; + +var touchScreenSettings = { + minimumFontHeight: standardSettings.minimumFontHeight, + globalFontFamily: '', + menuFontName: 'sans-serif', + menuFontSize: 24, + bubbleHelpFontSize: 18, + prompterFontName: 'sans-serif', + prompterFontSize: 24, + prompterSliderSize: 20, + handleSize: 26, + scrollBarSize: 24, + mouseScrollAmount: 40, + useSliderForInput: false, + isTouchDevice: true, + pngPayloadMarker: 'Data\tPayload\tEmbedded', + rasterizeSVGs: false, + isFlat: false, + grabThreshold: 5, + showHoles: false +}; + +var MorphicPreferences = standardSettings; + +// first, try enabling support for retina displays - can be turned off later + +/* + Support for retina displays has been pioneered and contributed by + Bartosz Leper. + + NOTE: this will make changes to the HTMLCanvasElement that - mostly - + make Morphic usable on retina displays in very high resolution mode + with crisp fonts and clear fine lines without you (the programmer) + needing to know any specifics, provided both the display and the browser + support these (Safari currently doesn't), otherwise these utilities will + not be installed. + If you don't want your Morphic application to support retina resolutions + you don't have to edit this morphic.js file to comment out the next line + of code, instead you can simply call + + disableRetinaSupport(); + + before you create your World(s) in the html page. Disabling retina + support also will simply do nothing if retina support is not possible + or already disabled, so it's equally safe to call. + + For an example how to make retina support user-specifiable refer to + Snap! >> guis.js >> toggleRetina() +*/ + +enableRetinaSupport(); + +// Global Functions //////////////////////////////////////////////////// + +function nop() { + // do explicitly nothing + return null; +} + +function localize(string) { + // override this function with custom localizations + return string; +} + +function isNil(thing) { + return thing === undefined || thing === null; +} + +function contains(list, element) { + // answer true if element is a member of list + return list.indexOf(element) !== -1; +} + +function detect(list, predicate) { + // answer the first element of list for which predicate evaluates + // true, otherwise answer null + var i, size = list.length; + for (i = 0; i < size; i += 1) { + if (predicate.call(null, list[i])) { + return list[i]; + } + } + return null; +} + +function sizeOf(object) { + // answer the number of own properties + var size = 0, key; + for (key in object) { + if (Object.prototype.hasOwnProperty.call(object, key)) { + size += 1; + } + } + return size; +} + +function isString(target) { + return typeof target === 'string' || target instanceof String; +} + +function isObject(target) { + return target !== null && + (typeof target === 'object' || target instanceof Object); +} + +function radians(degrees) { + return degrees * Math.PI / 180; +} + +function degrees(radians) { + return radians * 180 / Math.PI; +} + +function fontHeight(height) { + var minHeight = Math.max(height, MorphicPreferences.minimumFontHeight); + return minHeight * 1.2; // assuming 1/5 font size for ascenders +} + +function isWordChar(aCharacter) { + // can't use \b or \w because they ignore diacritics + return aCharacter.match(/[A-zÀ-ÿ0-9]/); +} + +function isURLChar(aCharacter) { + return aCharacter.match(/[A-z0-9./:?&_+%-]/); +} + +function isURL(text) { + return /^https?:\/\//.test(text); +} + +function newCanvas(extentPoint, nonRetina, recycleMe) { + // answer a new empty instance of Canvas, don't display anywhere + // nonRetina - optional Boolean "false" + // by default retina support is automatic + // optional existing canvas to be used again, unless it is marked as + // being shared among Morphs (dataset property "morphicShare") + var canvas, ext; + nonRetina = nonRetina || false; + ext = (extentPoint || + (recycleMe ? new Point(recycleMe.width, recycleMe.height) + : new Point(0, 0))).ceil(); + if (recycleMe && + !recycleMe.dataset.morphicShare && + (recycleMe.isRetinaEnabled || false) !== nonRetina && + ext.x === recycleMe.width && ext.y === recycleMe.height + ) { + canvas = recycleMe; + canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height); + return canvas; + } else { + canvas = document.createElement('canvas'); + canvas.width = ext.x; + canvas.height = ext.y; + } + if (nonRetina && canvas.isRetinaEnabled) { + canvas.isRetinaEnabled = false; + } + return canvas; +} + +function copyCanvas(aCanvas) { + // answer a deep copy of a canvas element respecting its retina status + var c; + if (aCanvas && aCanvas.width && aCanvas.height) { + c = newCanvas( + new Point(aCanvas.width, aCanvas.height), + !aCanvas.isRetinaEnabled + ); + c.getContext("2d").drawImage(aCanvas, 0, 0); + return c; + } + return aCanvas; +} + +function getMinimumFontHeight() { + // answer the height of the smallest font renderable in pixels + var str = 'I', + size = 50, + canvas = document.createElement('canvas'), + ctx, + maxX, + data, + x, + y; + canvas.width = size; + canvas.height = size; + ctx = canvas.getContext('2d'); + ctx.font = '1px serif'; + maxX = ctx.measureText(str).width; + ctx.fillStyle = 'black'; + ctx.textBaseline = 'bottom'; + ctx.fillText(str, 0, size); + for (y = 0; y < size; y += 1) { + for (x = 0; x < maxX; x += 1) { + data = ctx.getImageData(x, y, 1, 1); + if (data.data[3] !== 0) { + return size - y + 1; + } + } + } + return 0; +} + +function getDocumentPositionOf(aDOMelement) { + // answer the relative coordinates of a DOM element in the viewport + var rect = aDOMelement.getBoundingClientRect(), + scrollLeft = window.pageXOffset || document.documentElement.scrollLeft, + scrollTop = window.pageYOffset || document.documentElement.scrollTop; + return {x: rect.left + scrollLeft, y:rect.top + scrollTop}; +} + +function copy(target) { + // answer a shallow copy of target + var value, c, property, keys, l, i; + if (typeof target !== 'object') { + return target; + } + value = target.valueOf(); + if (target !== value) { + return new target.constructor(value); + } + if (target instanceof target.constructor && + target.constructor !== Object) { + c = Object.create(target.constructor.prototype); + keys = Object.keys(target); + for (l = keys.length, i = 0; i < l; i += 1) { + property = keys[i]; + if (target[property] instanceof HTMLCanvasElement) { + // tag canvas elements as being shared, + // so the next time when rerendering a Morph + // instead of recycling the shared canvas a + // new unshared one get created + // see newCanvas() function + target[property].dataset.morphicShare = 'true'; + } + c[property] = target[property]; + } + } else { + c = {}; + for (property in target) { + c[property] = target[property]; + } + } + return c; +} + +function embedMetadataPNG(aCanvas, aString) { + var embedTag = MorphicPreferences.pngPayloadMarker, + crc32 = (str, crc) => { + let table = [...Array(256).keys()].map(it => + [...Array(8)].reduce((cc) => + (cc & 1) ? (0xedb88320 ^ (cc >>> 1)) : (cc >>> 1), it) + ); + crc = [...str].reduce( + (crc, ch) => (crc >>> 8) ^ table[(crc ^ ch.charCodeAt(0)) & 0xff], + (crc ? crc = 0 : crc) ^ (-1) // (crc ||= 0) ^ (-1) + ); + return ( crc ^ (-1) ) >>> 0; + }, + arr2Str = (arr) => + arr.reduce((res, byte) => res + String.fromCharCode(byte), ''), + int2BStr = (val) => + arr2Str(Array.from(new Uint8Array(new Uint32Array( [val] ).buffer)).reverse()), + buildChunk = (data) => { + let res = "iTXt" + data; + return int2BStr(data.length) + res + int2BStr(crc32(res)); + }, + parts = aCanvas.toDataURL("image/png").split(","), + bPart = atob(parts[1]).split(""), + newChunk = buildChunk( + "Snap!_SRC\0\0\0\0\0" + + embedTag + + encodeURIComponent(aString) + + embedTag + ); + try { + bPart.splice(-12, 0, ...newChunk); + parts[1] = btoa(bPart.join("")); + } catch (err) { + console.log(err); + } + return parts.join(','); +} + + +// Retina Display Support ////////////////////////////////////////////// + +/* + By default retina support gets installed when Morphic.js loads. There + are two global functions that let you test for retina availability: + + isRetinaSupported() - Boolean, whether retina support is available + isRetinaEnabled() - Boolean, whether currently in retina mode + + and two more functions that let you control retina support if it is + available: + + enableRetinaSupport() + disableRetinaSupport() + + Both of these internally test whether retina is available, so they are + safe to call directly. + + Even when in retina mode it often makes sense to use non-high-resolution + canvasses for simple shapes in order to save system resources and + optimize performance. Examples are costumes and backgrounds in Snap. + In Morphic you can create new canvas elements using + + newCanvas(extentPoint [, nonRetinaFlag]) + + If retina support is enabled such new canvasses will automatically be + high-resolution canvasses, unless the newCanvas() function is given an + otherwise optional second Boolean argument that explicitly makes + it a non-retina canvas. + + Not the whole canvas API is supported by Morphic's retina utilities. + Especially if your code uses putImageData() you will want to "downgrade" + a target high-resolution canvas to a normal-resolution ("non-retina") + one before using + + normalizeCanvas(aCanvas [, copyFlag]) + + This will change the target canvas' resolution in place (!). If you + pass in the optional second Boolean flag the function returns + a non-retina copy and leaves the target canvas unchanged. An example + of this normalize mechanism is converting the penTrails layer of Snap's + stage (high-resolution) into a sprite-costume (normal resolution). +*/ + +function enableRetinaSupport() { +/* + === contributed by Bartosz Leper === + + This installs a series of utilities that allow using Canvas the same way + on retina and non-retina displays. If the display is a retina one, the + underlying dimensions of the Canvas elements are doubled, but this will + be transparent to the code that uses Canvas. All dimensions read or + written to the Canvas element will be scaled appropriately. + + NOTE: This implementation is not exhaustive; it only implements what is + needed by the Snap! UI. + + [Jens]: like all other retina screen support implementations I've seen + Bartosz's patch also does not address putImageData() compatibility when + mixing retina-enabled and non-retina canvasses. If you need to manipulate + pixels in such mixed canvasses, make sure to "downgrade" them all using + normalizeCanvas() below. +*/ + + // Get the window's pixel ratio for canvas elements. + // See: http://www.html5rocks.com/en/tutorials/canvas/hidpi/ + var ctx = document.createElement("canvas").getContext("2d"), + backingStorePixelRatio = ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1, + + // Unfortunately, it's really hard to make this work well when changing + // zoom level, so let's leave it like this right now, and stick to + // whatever the ratio was in the beginning. + + // originalDevicePixelRatio = window.devicePixelRatio, + + // [Jens]: As of summer 2016 non-integer devicePixelRatios lead to + // artifacts when blitting images onto canvas elements in all browsers + // except Chrome, especially Firefox, Edge, IE (Safari doesn't even + // support retina mode as implemented here). + // therefore - to ensure crisp fonts - use the ceiling of whatever + // the devicePixelRatio is. This needs more memory, but looks nicer. + + originalDevicePixelRatio = Math.ceil(window.devicePixelRatio), + + canvasProto = HTMLCanvasElement.prototype, + contextProto = CanvasRenderingContext2D.prototype, + + // [Jens]: keep track of original properties in a dictionary + // so they can be iterated over and restored + uber = { + drawImage: contextProto.drawImage, + getImageData: contextProto.getImageData, + + width: Object.getOwnPropertyDescriptor( + canvasProto, + 'width' + ), + height: Object.getOwnPropertyDescriptor( + canvasProto, + 'height' + ), + shadowOffsetX: Object.getOwnPropertyDescriptor( + contextProto, + 'shadowOffsetX' + ), + shadowOffsetY: Object.getOwnPropertyDescriptor( + contextProto, + 'shadowOffsetY' + ), + shadowBlur: Object.getOwnPropertyDescriptor( + contextProto, + 'shadowBlur' + ) + }; + + // [Jens]: only install retina utilities if the display supports them + if (backingStorePixelRatio === originalDevicePixelRatio) {return; } + // [Jens]: check whether properties can be overridden, needed for Safari + if (Object.keys(uber).some(any => { + var prop = uber[any]; + return prop.hasOwnProperty('configurable') && (!prop.configurable); + })) {return; } + + function getPixelRatio(imageSource) { + return imageSource.isRetinaEnabled ? + (originalDevicePixelRatio || 1) / backingStorePixelRatio : 1; + } + + canvasProto._isRetinaEnabled = true; + // [Jens]: remember the original non-retina properties, + // so they can be restored again + canvasProto._bak = uber; + + Object.defineProperty(canvasProto, 'isRetinaEnabled', { + get: function() { + return this._isRetinaEnabled; + }, + set: function(enabled) { + var prevPixelRatio = getPixelRatio(this), + prevWidth = this.width, + prevHeight = this.height; + + this._isRetinaEnabled = enabled; + if (getPixelRatio(this) != prevPixelRatio) { + this.width = prevWidth; + this.height = prevHeight; + } + }, + configurable: true // [Jens]: allow to be deleted and reconfigured + }); + + Object.defineProperty(canvasProto, 'width', { + get: function() { + return uber.width.get.call(this) / getPixelRatio(this); + }, + set: function(width) { + try { // workaround one of FF's dreaded NS_ERROR_FAILURE bugs + // this should be taken out as soon as FF gets fixed again + var pixelRatio = getPixelRatio(this), + context; + uber.width.set.call(this, width * pixelRatio); + context = this.getContext('2d'); + /* + context.restore(); + context.save(); + */ + context?.scale(pixelRatio, pixelRatio); + } catch (err) { + console.log('Retina Display Support Problem', err); + uber.width.set.call(this, width); + } + } + }); + + Object.defineProperty(canvasProto, 'height', { + get: function() { + return uber.height.get.call(this) / getPixelRatio(this); + }, + set: function(height) { + var pixelRatio = getPixelRatio(this), + context; + uber.height.set.call(this, height * pixelRatio); + context = this.getContext('2d'); + /* + context.restore(); + context.save(); + */ + context?.scale(pixelRatio, pixelRatio); + } + }); + + contextProto.drawImage = function(image) { + var pixelRatio = getPixelRatio(image), + sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight; + + // Different signatures of drawImage() method have different + // parameter assignments. + switch (arguments.length) { + case 9: + sx = arguments[1]; + sy = arguments[2]; + sWidth = arguments[3]; + sHeight = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dWidth = arguments[7]; + dHeight = arguments[8]; + break; + + case 5: + sx = 0; + sy = 0; + sWidth = image.width; + sHeight = image.height; + dx = arguments[1]; + dy = arguments[2]; + dWidth = arguments[3]; + dHeight = arguments[4]; + break; + + case 3: + sx = 0; + sy = 0; + sWidth = image.width; + sHeight = image.height; + dx = arguments[1]; + dy = arguments[2]; + dWidth = image.width; + dHeight = image.height; + break; + + default: + throw Error('Called drawImage() with ' + arguments.length + + ' arguments'); + } + uber.drawImage.call( + this, image, + sx * pixelRatio, sy * pixelRatio, + sWidth * pixelRatio, sHeight * pixelRatio, + dx, dy, + dWidth, dHeight); + }; + + contextProto.getImageData = function(sx, sy, sw, sh) { + var pixelRatio = getPixelRatio(this.canvas); + return uber.getImageData.call( + this, + sx * pixelRatio, sy * pixelRatio, + sw * pixelRatio, sh * pixelRatio); + }; + + Object.defineProperty(contextProto, 'shadowOffsetX', { + get: function() { + return uber.shadowOffsetX.get.call(this) / + getPixelRatio(this.canvas); + }, + set: function(offset) { + var pixelRatio = getPixelRatio(this.canvas); + uber.shadowOffsetX.set.call(this, offset * pixelRatio); + } + }); + + Object.defineProperty(contextProto, 'shadowOffsetY', { + get: function() { + return uber.shadowOffsetY.get.call(this) / + getPixelRatio(this.canvas); + }, + set: function(offset) { + var pixelRatio = getPixelRatio(this.canvas); + uber.shadowOffsetY.set.call(this, offset * pixelRatio); + } + }); + + Object.defineProperty(contextProto, 'shadowBlur', { + get: function() { + return uber.shadowBlur.get.call(this) / + getPixelRatio(this.canvas); + }, + set: function(blur) { + var pixelRatio = getPixelRatio(this.canvas); + uber.shadowBlur.set.call(this, blur * pixelRatio); + } + }); +} + +function isRetinaSupported () { + var ctx = document.createElement("canvas").getContext("2d"), + backingStorePixelRatio = ctx.webkitBackingStorePixelRatio || + ctx.mozBackingStorePixelRatio || + ctx.msBackingStorePixelRatio || + ctx.oBackingStorePixelRatio || + ctx.backingStorePixelRatio || 1, + canvasProto = HTMLCanvasElement.prototype, + contextProto = CanvasRenderingContext2D.prototype, + uber = { + drawImage: contextProto.drawImage, + getImageData: contextProto.getImageData, + + width: Object.getOwnPropertyDescriptor( + canvasProto, + 'width' + ), + height: Object.getOwnPropertyDescriptor( + canvasProto, + 'height' + ), + shadowOffsetX: Object.getOwnPropertyDescriptor( + contextProto, + 'shadowOffsetX' + ), + shadowOffsetY: Object.getOwnPropertyDescriptor( + contextProto, + 'shadowOffsetY' + ), + shadowBlur: Object.getOwnPropertyDescriptor( + contextProto, + 'shadowBlur' + ) + }; + return backingStorePixelRatio !== window.devicePixelRatio && + !(Object.keys(uber).some(any => { + var prop = uber[any]; + return prop.hasOwnProperty('configurable') && (!prop.configurable); + }) + ); +} + +function isRetinaEnabled () { + return HTMLCanvasElement.prototype.hasOwnProperty('_isRetinaEnabled'); +} + +function disableRetinaSupport() { + // uninstalls Retina utilities. Make sure to re-create every Canvas + // element afterwards + var canvasProto, contextProto, uber; + if (!isRetinaEnabled()) {return; } + canvasProto = HTMLCanvasElement.prototype; + contextProto = CanvasRenderingContext2D.prototype; + uber = canvasProto._bak; + Object.defineProperty(canvasProto, 'width', uber.width); + Object.defineProperty(canvasProto, 'height', uber.height); + contextProto.drawImage = uber.drawImage; + contextProto.getImageData = uber.getImageData; + Object.defineProperty(contextProto, 'shadowOffsetX', uber.shadowOffsetX); + Object.defineProperty(contextProto, 'shadowOffsetY', uber.shadowOffsetY); + Object.defineProperty(contextProto, 'shadowBlur', uber.shadowBlur); + delete canvasProto._isRetinaEnabled; + delete canvasProto.isRetinaEnabled; + delete canvasProto._bak; +} + +function normalizeCanvas(aCanvas, getCopy) { + // make sure aCanvas is non-retina, otherwise convert it in place (!) + // or answer a normalized copy if the "getCopy" flag is + var cpy; + if (!aCanvas.isRetinaEnabled) {return aCanvas; } + cpy = newCanvas(new Point(aCanvas.width, aCanvas.height), true); + cpy.getContext('2d').drawImage(aCanvas, 0, 0); + if (getCopy) {return cpy; } + aCanvas.isRetinaEnabled = false; + aCanvas.width = cpy.width; + aCanvas.height = cpy.height; + aCanvas.getContext('2d').drawImage(cpy, 0, 0); + return aCanvas; +} + +// Animations ////////////////////////////////////////////////////////////// + +/* + Animations handle gradual transitions between one state and another over a + period of time. Transition effects can be specified using easing functions. + An easing function maps a fraction of the transition time to a fraction of + the state delta. This way accelerating / decelerating and bouncing sliding + effects can be accomplished. + + Animations are generic and not limited to motion, i.e. they can also handle + other transitions such as color changes, transparency fadings, growing, + shrinking, turning etc. + + Animations need to be stepped by a scheduler, e. g. an interval function. + In Morphic the preferred way to run an animation is to register it with + the World by adding it to the World's animation queue. The World steps each + registered animation once per display cycle independently of the Morphic + stepping mechanism. + + For an example how to use animations look at how the Morph's methods + + glideTo() + fadeTo() + + and + + slideBackTo() + + are implemented. +*/ + +// Animation instance creation: + +function Animation(setter, getter, delta, duration, easing, onComplete) { + this.setter = setter; // function + this.getter = getter; // function + this.delta = delta || 0; // number + this.duration = duration || 0; // milliseconds + this.easing = isString(easing) ? // string or function + this.easings[easing] || this.easings.sinusoidal + : easing || this.easings.sinusoidal; + this.onComplete = onComplete || null; // optional callback + this.endTime = null; + this.destination = null; + this.isActive = false; + this.start(); +} + +Animation.prototype.easings = { + // dictionary of a few pre-defined easing functions used to transition + // two states + + // ease both in and out: + linear: t => t, + sinusoidal: t => 1 - Math.cos(radians(t * 90)), + quadratic: t => t < 0.5 ? 2 * t * t : ((4 - (2 * t)) * t) - 1, + cubic: t => { + return t < 0.5 ? + 4 * t * t * t + : ((t - 1) * ((2 * t) - 2) * ((2 * t) - 2)) + 1; + }, + elastic: t => { + return (t -= 0.5) < 0 ? + (0.01 + 0.01 / t) * Math.sin(50 * t) + : (0.02 - 0.01 / t) * Math.sin(50 * t) + 1; + }, + + // ease in only: + sine_in: t => 1 - Math.sin(radians(90 + (t * 90))), + quad_in: t => t * t, + cubic_in: t => t * t * t, + elastic_in: t => (0.04 - 0.04 / t) * Math.sin(25 * t) + 1, + + // ease out only: + sine_out: t => Math.sin(radians(t * 90)), + quad_out: t => t * (2 - t), + elastic_out: t => 0.04 * t / (--t) * Math.sin(25 * t) +}; + +Animation.prototype.start = function () { + // (re-) activate the animation, e.g. if is has previously completed, + // make sure to plug it into something that repeatedly triggers step(), + // e.g. the World's animations queue + this.endTime = Date.now() + this.duration; + this.destination = this.getter.call(this) + this.delta; + this.isActive = true; +}; + +Animation.prototype.step = function () { + if (!this.isActive) {return; } + var now = Date.now(); + if (now > this.endTime) { + this.setter(this.destination); + this.isActive = false; + if (this.onComplete) {this.onComplete(); } + } else { + this.setter( + this.destination - + (this.delta * this.easing((this.endTime - now) / this.duration)) + ); + } +}; + +// Colors ////////////////////////////////////////////////////////////// + +// Color instance creation: + +function Color(r, g, b, a) { + // all values are optional, just (r, g, b) is fine + this.r = r || 0; + this.g = g || 0; + this.b = b || 0; + this.a = a || ((a === 0) ? 0 : 1); +} + +// Color string representation: e.g. 'rgba(255,165,0,1)' + +Color.prototype.toString = function () { + return 'rgba(' + + Math.round(this.r) + ',' + + Math.round(this.g) + ',' + + Math.round(this.b) + ',' + + this.a + ')'; +}; + +Color.prototype.toRGBstring = function () { + return 'rgb(' + + Math.round(this.r) + ',' + + Math.round(this.g) + ',' + + Math.round(this.b) + ')'; +}; + +Color.fromString = function (aString) { + // I parse rgb/rgba strings into a Color object + var components = aString.split(/[\(),]/), + channels = aString.startsWith('rgba') ? + components.slice(1, 5) : components.slice(0, 4); + return new Color(+channels[0], +channels[1], +channels[2], +channels[3]); +}; + +// Color copying: + +Color.prototype.copy = function () { + return new Color( + this.r, + this.g, + this.b, + this.a + ); +}; + +// Color comparison: + +Color.prototype.eq = function (aColor, observeAlpha) { + // == + return aColor && + this.r === aColor.r && + this.g === aColor.g && + this.b === aColor.b && + (observeAlpha ? this.a === aColor.a : true); +}; + +Color.prototype.isCloseTo = function (aColor, observeAlpha, tolerance) { + // experimental - answer whether a color is "close" to another one by + // a given percentage. tolerance is the percentage by which each color + // channel may diverge, alpha needs to be the exact same unless ignored + var thres = 2.55 * (tolerance || 10); + + function dist(a, b) { + var diff = a - b; + return diff < 0 ? 255 + diff : diff; + } + + return aColor && + dist(this.r, aColor.r) < thres && + dist(this.g, aColor.g) < thres && + dist(this.b, aColor.b) < thres && + (observeAlpha ? this.a === aColor.a : true); +}; + +// Color conversion (hsv): + +Color.prototype.hsv = function () { + // ignore alpha + var max, min, h, s, v, d, + rr = this.r / 255, + gg = this.g / 255, + bb = this.b / 255; + max = Math.max(rr, gg, bb); + min = Math.min(rr, gg, bb); + h = max; + s = max; + v = max; + d = max - min; + s = max === 0 ? 0 : d / max; + if (max === min) { + h = 0; + } else { + switch (max) { + case rr: + h = (gg - bb) / d + (gg < bb ? 6 : 0); + break; + case gg: + h = (bb - rr) / d + 2; + break; + case bb: + h = (rr - gg) / d + 4; + break; + } + h /= 6; + } + return [h, s, v]; +}; + +Color.prototype.set_hsv = function (h, s, v) { + // ignore alpha, h, s and v are to be within [0, 1] + var i, f, p, q, t; + i = Math.floor(h * 6); + f = h * 6 - i; + p = v * (1 - s); + q = v * (1 - f * s); + t = v * (1 - (1 - f) * s); + switch (i % 6) { + case 0: + this.r = v; + this.g = t; + this.b = p; + break; + case 1: + this.r = q; + this.g = v; + this.b = p; + break; + case 2: + this.r = p; + this.g = v; + this.b = t; + break; + case 3: + this.r = p; + this.g = q; + this.b = v; + break; + case 4: + this.r = t; + this.g = p; + this.b = v; + break; + case 5: + this.r = v; + this.g = p; + this.b = q; + break; + } + + this.r *= 255; + this.g *= 255; + this.b *= 255; + +}; + +// Color conversion (hsl): + +Color.prototype.hsl = function () { + // ignore alpha + var rr = this.r / 255, + gg = this.g / 255, + bb = this.b / 255, + max = Math.max(rr, gg, bb), min = Math.min(rr, gg, bb), + h, + s, + l = (max + min) / 2, + d; + if (max === min) { // achromatic + h = 0; + s = 0; + } else { + d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch (max) { + case rr: + h = (gg - bb) / d + (gg < bb ? 6 : 0); + break; + case gg: + h = (bb - rr) / d + 2; + break; + case bb: + h = (rr - gg) / d + 4; + break; + } + h /= 6; + } + return [h, s, l]; +}; + +Color.prototype.set_hsl = function (h, s, l) { + // ignore alpha, h, s and l are to be within [0, 1] + var q, p; + + function hue2rgb(p, q, t) { + if (t < 0) { + t += 1; + } + if (t > 1) { + t -= 1; + } + if (t < 1/6) { + return p + (q - p) * 6 * t; + } + if (t < 1/2) { + return q; + } + if (t < 2/3) { + return p + (q - p) * (2/3 - t) * 6; + } + return p; + } + + if (s == 0) { // achromatic + this.r = l; + this.g = l; + this.b = l; + } else { + q = l < 0.5 ? l * (1 + s) : l + s - l * s; + p = 2 * l - q; + this.r = hue2rgb(p, q, h + 1/3); + this.g = hue2rgb(p, q, h); + this.b = hue2rgb(p, q, h - 1/3); + } + + this.r *= 255; + this.g *= 255; + this.b *= 255; +}; + +// Color mixing: + +Color.prototype.mixed = function (proportion, otherColor) { + // answer a copy of this color mixed with another color, ignore alpha + var frac1 = Math.min(Math.max(proportion, 0), 1), + frac2 = 1 - frac1; + return new Color( + this.r * frac1 + otherColor.r * frac2, + this.g * frac1 + otherColor.g * frac2, + this.b * frac1 + otherColor.b * frac2 + ); +}; + +Color.prototype.darker = function (percent) { + // return an rgb-interpolated darker copy of me, ignore alpha + var fract = 0.8333; + if (percent) { + fract = (100 - percent) / 100; + } + return this.mixed(fract, new Color(0, 0, 0)); +}; + +Color.prototype.lighter = function (percent) { + // return an rgb-interpolated lighter copy of me, ignore alpha + var fract = 0.8333; + if (percent) { + fract = (100 - percent) / 100; + } + return this.mixed(fract, WHITE); +}; + +Color.prototype.dansDarker = function () { + // return an hsv-interpolated darker copy of me, ignore alpha + var hsv = this.hsv(), + result = new Color(), + vv = Math.max(hsv[2] - 0.16, 0); + result.set_hsv(hsv[0], hsv[1], vv); + return result; +}; + +Color.prototype.inverted = function () { + return new Color( + 255 - this.r, + 255 - this.g, + 255 - this.b + ); +}; + +Color.prototype.solid = function () { + return new Color( + this.r, + this.g, + this.b + ); +}; + +// Points ////////////////////////////////////////////////////////////// + +// Point instance creation: + +function Point(x, y) { + this.x = x || 0; + this.y = y || 0; +} + +// Point string representation: e.g. '12@68' + +Point.prototype.toString = function () { + return Math.round(this.x.toString()) + + '@' + Math.round(this.y.toString()); +}; + +// Point copying: + +Point.prototype.copy = function () { + return new Point(this.x, this.y); +}; + +// Point comparison: + +Point.prototype.eq = function (aPoint) { + // == + return this.x === aPoint.x && this.y === aPoint.y; +}; + +Point.prototype.lt = function (aPoint) { + // < + return this.x < aPoint.x && this.y < aPoint.y; +}; + +Point.prototype.gt = function (aPoint) { + // > + return this.x > aPoint.x && this.y > aPoint.y; +}; + +Point.prototype.ge = function (aPoint) { + // >= + return this.x >= aPoint.x && this.y >= aPoint.y; +}; + +Point.prototype.le = function (aPoint) { + // <= + return this.x <= aPoint.x && this.y <= aPoint.y; +}; + +Point.prototype.max = function (aPoint) { + return new Point(Math.max(this.x, aPoint.x), + Math.max(this.y, aPoint.y)); +}; + +Point.prototype.min = function (aPoint) { + return new Point(Math.min(this.x, aPoint.x), + Math.min(this.y, aPoint.y)); +}; + +// Point conversion: + +Point.prototype.round = function () { + return new Point(Math.round(this.x), Math.round(this.y)); +}; + +Point.prototype.abs = function () { + return new Point(Math.abs(this.x), Math.abs(this.y)); +}; + +Point.prototype.neg = function () { + return new Point(-this.x, -this.y); +}; + +Point.prototype.mirror = function () { + return new Point(this.y, this.x); +}; + +Point.prototype.floor = function () { + return new Point( + Math.max(Math.floor(this.x), 0), + Math.max(Math.floor(this.y), 0) + ); +}; + +Point.prototype.ceil = function () { + return new Point(Math.ceil(this.x), Math.ceil(this.y)); +}; + +// Point arithmetic: + +Point.prototype.add = function (other) { + if (other instanceof Point) { + return new Point(this.x + other.x, this.y + other.y); + } + return new Point(this.x + other, this.y + other); +}; + +Point.prototype.subtract = function (other) { + if (other instanceof Point) { + return new Point(this.x - other.x, this.y - other.y); + } + return new Point(this.x - other, this.y - other); +}; + +Point.prototype.multiplyBy = function (other) { + if (other instanceof Point) { + return new Point(this.x * other.x, this.y * other.y); + } + return new Point(this.x * other, this.y * other); +}; + +Point.prototype.divideBy = function (other) { + if (other instanceof Point) { + return new Point(this.x / other.x, this.y / other.y); + } + return new Point(this.x / other, this.y / other); +}; + +Point.prototype.floorDivideBy = function (other) { + if (other instanceof Point) { + return new Point(Math.floor(this.x / other.x), + Math.floor(this.y / other.y)); + } + return new Point(Math.floor(this.x / other), + Math.floor(this.y / other)); +}; + +// Point polar coordinates: + +Point.prototype.r = function () { + var t = (this.multiplyBy(this)); + return Math.sqrt(t.x + t.y); +}; + +Point.prototype.degrees = function () { +/* + answer the angle I make with origin in degrees. + Right is 0, down is 90 +*/ + var tan, theta; + + if (this.x === 0) { + if (this.y >= 0) { + return 90; + } + return 270; + } + tan = this.y / this.x; + theta = Math.atan(tan); + if (this.x >= 0) { + if (this.y >= 0) { + return degrees(theta); + } + return 360 + (degrees(theta)); + } + return 180 + degrees(theta); +}; + +Point.prototype.theta = function () { +/* + answer the angle I make with origin in radians. + Right is 0, down is 90 +*/ + var tan, theta; + + if (this.x === 0) { + if (this.y >= 0) { + return radians(90); + } + return radians(270); + } + tan = this.y / this.x; + theta = Math.atan(tan); + if (this.x >= 0) { + if (this.y >= 0) { + return theta; + } + return radians(360) + theta; + } + return radians(180) + theta; +}; + +// Point functions: + +Point.prototype.crossProduct = function (aPoint) { + return this.multiplyBy(aPoint.mirror()); +}; + +Point.prototype.distanceTo = function (aPoint) { + return (aPoint.subtract(this)).r(); +}; + +Point.prototype.rotate = function (direction, center) { + // direction must be 'right', 'left' or 'pi' + var offset = this.subtract(center); + if (direction === 'right') { + return new Point(-offset.y, offset.y).add(center); + } + if (direction === 'left') { + return new Point(offset.y, -offset.y).add(center); + } + // direction === 'pi' + return center.subtract(offset); +}; + +Point.prototype.flip = function (direction, center) { + // direction must be 'vertical' or 'horizontal' + if (direction === 'vertical') { + return new Point(this.x, center.y * 2 - this.y); + } + // direction === 'horizontal' + return new Point(center.x * 2 - this.x, this.y); +}; + +Point.prototype.distanceAngle = function (dist, angle) { + var deg = angle, x, y; + if (deg > 270) { + deg = deg - 360; + } else if (deg < -270) { + deg = deg + 360; + } + if (-90 <= deg && deg <= 90) { + x = Math.sin(radians(deg)) * dist; + y = Math.sqrt((dist * dist) - (x * x)); + return new Point(x + this.x, this.y - y); + } + x = Math.sin(radians(180 - deg)) * dist; + y = Math.sqrt((dist * dist) - (x * x)); + return new Point(x + this.x, this.y + y); +}; + +// Point transforming: + +Point.prototype.scaleBy = function (scalePoint) { + return this.multiplyBy(scalePoint); +}; + +Point.prototype.translateBy = function (deltaPoint) { + return this.add(deltaPoint); +}; + +Point.prototype.rotateBy = function (angle, centerPoint) { + var center = centerPoint || ZERO, + p = this.subtract(center), + r = p.r(), + theta = angle - p.theta(); + return new Point( + center.x + (r * Math.cos(theta)), + center.y - (r * Math.sin(theta)) + ); +}; + +// Point conversion: + +Point.prototype.asArray = function () { + return [this.x, this.y]; +}; + +// Rectangles ////////////////////////////////////////////////////////// + +// Rectangle instance creation: + +function Rectangle(left, top, right, bottom) { + this.init(new Point((left || 0), (top || 0)), + new Point((right || 0), (bottom || 0))); +} + +Rectangle.prototype.init = function (originPoint, cornerPoint) { + this.origin = originPoint; + this.corner = cornerPoint; +}; + +// Rectangle string representation: e.g. '[0@0 | 160@80]' + +Rectangle.prototype.toString = function () { + return '[' + this.origin.toString() + ' | ' + + this.extent().toString() + ']'; +}; + +// Rectangle copying: + +Rectangle.prototype.copy = function () { + return new Rectangle( + this.left(), + this.top(), + this.right(), + this.bottom() + ); +}; + +// creating Rectangle instances from Points: + +Point.prototype.corner = function (cornerPoint) { + // answer a new Rectangle + return new Rectangle( + this.x, + this.y, + cornerPoint.x, + cornerPoint.y + ); +}; + +Point.prototype.rectangle = function (aPoint) { + // answer a new Rectangle + var org, crn; + org = this.min(aPoint); + crn = this.max(aPoint); + return new Rectangle(org.x, org.y, crn.x, crn.y); +}; + +Point.prototype.extent = function (aPoint) { + //answer a new Rectangle + var crn = this.add(aPoint); + return new Rectangle(this.x, this.y, crn.x, crn.y); +}; + +// Rectangle accessing - setting: + +Rectangle.prototype.setTo = function (left, top, right, bottom) { + // note: all inputs are optional and can be omitted + + this.origin = new Point( + left || ((left === 0) ? 0 : this.left()), + top || ((top === 0) ? 0 : this.top()) + ); + + this.corner = new Point( + right || ((right === 0) ? 0 : this.right()), + bottom || ((bottom === 0) ? 0 : this.bottom()) + ); +}; + +// Rectangle mutating + +Rectangle.prototype.setExtent = function(aPoint) { + this.setWidth(aPoint.x); + this.setHeight(aPoint.y); +}; + +Rectangle.prototype.setWidth = function (width) { + this.corner.x = this.origin.x + width; +}; + +Rectangle.prototype.setHeight = function (height) { + this.corner.y = this.origin.y + height; +}; + +// Rectangle accessing - getting: + +Rectangle.prototype.area = function () { + //requires width() and height() to be defined + var w = this.width(); + if (w < 0) { + return 0; + } + return Math.max(w * this.height(), 0); +}; + +Rectangle.prototype.bottom = function () { + return this.corner.y; +}; + +Rectangle.prototype.bottomCenter = function () { + return new Point(this.center().x, this.bottom()); +}; + +Rectangle.prototype.bottomLeft = function () { + return new Point(this.origin.x, this.corner.y); +}; + +Rectangle.prototype.bottomRight = function () { + return this.corner.copy(); +}; + +Rectangle.prototype.boundingBox = function () { + return this; +}; + +Rectangle.prototype.center = function () { + return this.origin.add( + this.corner.subtract(this.origin).divideBy(2) + ); +}; + +Rectangle.prototype.corners = function () { + return [this.origin, + this.bottomLeft(), + this.corner, + this.topRight()]; +}; + +Rectangle.prototype.extent = function () { + return this.corner.subtract(this.origin); +}; + +Rectangle.prototype.height = function () { + return this.corner.y - this.origin.y; +}; + +Rectangle.prototype.left = function () { + return this.origin.x; +}; + +Rectangle.prototype.leftCenter = function () { + return new Point(this.left(), this.center().y); +}; + +Rectangle.prototype.right = function () { + return this.corner.x; +}; + +Rectangle.prototype.rightCenter = function () { + return new Point(this.right(), this.center().y); +}; + +Rectangle.prototype.top = function () { + return this.origin.y; +}; + +Rectangle.prototype.topCenter = function () { + return new Point(this.center().x, this.top()); +}; + +Rectangle.prototype.topLeft = function () { + return this.origin; +}; + +Rectangle.prototype.topRight = function () { + return new Point(this.corner.x, this.origin.y); +}; + +Rectangle.prototype.width = function () { + return this.corner.x - this.origin.x; +}; + +Rectangle.prototype.position = function () { + return this.origin; +}; + +// Rectangle comparison: + +Rectangle.prototype.eq = function (aRect) { + return this.origin.eq(aRect.origin) && + this.corner.eq(aRect.corner); +}; + +Rectangle.prototype.abs = function () { + var newOrigin, newCorner; + + newOrigin = this.origin.abs(); + newCorner = this.corner.max(newOrigin); + return newOrigin.corner(newCorner); +}; + +// Rectangle functions: + +Rectangle.prototype.insetBy = function (delta) { + // delta can be either a Point or a Number + var result = new Rectangle(); + result.origin = this.origin.add(delta); + result.corner = this.corner.subtract(delta); + return result; +}; + +Rectangle.prototype.expandBy = function (delta) { + // delta can be either a Point or a Number + var result = new Rectangle(); + result.origin = this.origin.subtract(delta); + result.corner = this.corner.add(delta); + return result; +}; + +Rectangle.prototype.growBy = function (delta) { + // delta can be either a Point or a Number + var result = new Rectangle(); + result.origin = this.origin.copy(); + result.corner = this.corner.add(delta); + return result; +}; + +Rectangle.prototype.intersect = function (aRect) { + var result = new Rectangle(); + result.origin = this.origin.max(aRect.origin); + result.corner = this.corner.min(aRect.corner); + return result; +}; + +Rectangle.prototype.merge = function (aRect) { + var result = new Rectangle(); + result.origin = this.origin.min(aRect.origin); + result.corner = this.corner.max(aRect.corner); + return result; +}; + +Rectangle.prototype.mergeWith = function (aRect) { + // mutates myself + this.origin = this.origin.min(aRect.origin); + this.corner = this.corner.max(aRect.corner); +}; + +Rectangle.prototype.round = function () { + return this.origin.round().corner(this.corner.round()); +}; + +Rectangle.prototype.spread = function () { + // round me by applying floor() to my origin and ceil() to my corner + // avoids artefacts on retina displays + return this.origin.floor().corner(this.corner.ceil()); +}; + +Rectangle.prototype.amountToTranslateWithin = function (aRect) { +/* + Answer a Point, delta, such that self + delta is forced within + aRectangle. when all of me cannot be made to fit, prefer to keep + my topLeft inside. Taken from Squeak. +*/ + var dx = 0, dy = 0; + + if (this.right() > aRect.right()) { + dx = aRect.right() - this.right(); + } + if (this.bottom() > aRect.bottom()) { + dy = aRect.bottom() - this.bottom(); + } + if ((this.left() + dx) < aRect.left()) { + dx = aRect.left() - this.left(); + } + if ((this.top() + dy) < aRect.top()) { + dy = aRect.top() - this.top(); + } + return new Point(dx, dy); +}; + +Rectangle.prototype.regionsAround = function (aRect) { + // answer a list of rectangles surrounding another one, + // use this to clip "holes" + var regions = []; + if (!this.intersects(aRect)) { + return regions; + } + // left + if (aRect.left() > this.left()) { + regions.push( + new Rectangle( + this.left(), + this.top(), + aRect.left(), + this.bottom() + ) + ); + } + // above: + if (aRect.top() > this.top()) { + regions.push( + new Rectangle( + this.left(), + this.top(), + this.right(), + aRect.top() + ) + ); + } + // right: + if (aRect.right() < this.right()) { + regions.push( + new Rectangle( + aRect.right(), + this.top(), + this.right(), + this.bottom() + ) + ); + } + // below: + if (aRect.bottom() < this.bottom()) { + regions.push( + new Rectangle( + this.left(), + aRect.bottom(), + this.right(), + this.bottom() + ) + ); + } + return regions; +}; + +// Rectangle testing: + +Rectangle.prototype.containsPoint = function (aPoint) { + return this.origin.le(aPoint) && aPoint.lt(this.corner); +}; + +Rectangle.prototype.containsRectangle = function (aRect) { + return aRect.origin.gt(this.origin) && + aRect.corner.lt(this.corner); +}; + +Rectangle.prototype.intersects = function (aRect) { + var ro = aRect.origin, rc = aRect.corner; + return (rc.x >= this.origin.x) && + (rc.y >= this.origin.y) && + (ro.x <= this.corner.x) && + (ro.y <= this.corner.y); +}; + +Rectangle.prototype.isNearTo = function (aRect, threshold) { + var ro = aRect.origin, rc = aRect.corner, border = threshold || 0; + return (rc.x + border >= this.origin.x) && + (rc.y + border >= this.origin.y) && + (ro.x - border <= this.corner.x) && + (ro.y - border <= this.corner.y); +}; + +// Rectangle transforming: + +Rectangle.prototype.scaleBy = function (scale) { + // scale can be either a Point or a scalar + var o = this.origin.multiplyBy(scale), + c = this.corner.multiplyBy(scale); + return new Rectangle(o.x, o.y, c.x, c.y); +}; + +Rectangle.prototype.translateBy = function (delta) { + // delta can be either a Point or a number + var o = this.origin.add(delta), + c = this.corner.add(delta); + return new Rectangle(o.x, o.y, c.x, c.y); +}; + +// Rectangle converting: + +Rectangle.prototype.asArray = function () { + return [this.left(), this.top(), this.right(), this.bottom()]; +}; + +Rectangle.prototype.asArray_xywh = function () { + return [this.left(), this.top(), this.width(), this.height()]; +}; + +// Nodes /////////////////////////////////////////////////////////////// + +// Node instance creation: + +function Node(parent, childrenArray) { + this.init(parent || null, childrenArray || []); +} + +Node.prototype.init = function (parent, childrenArray) { + this.parent = parent || null; + this.children = childrenArray || []; +}; + +// Node string representation: e.g. 'a Node[3]' + +Node.prototype.toString = function () { + return 'a Node' + '[' + this.children.length.toString() + ']'; +}; + +// Node accessing: + +Node.prototype.addChild = function (aNode) { + this.children.push(aNode); + aNode.parent = this; +}; + +Node.prototype.addChildFirst = function (aNode) { + this.children.splice(0, null, aNode); + aNode.parent = this; +}; + +Node.prototype.removeChild = function (aNode) { + var idx = this.children.indexOf(aNode); + if (idx !== -1) { + this.children.splice(idx, 1); + } +}; + +// Node functions: + +Node.prototype.root = function () { + if (this.parent === null) { + return this; + } + return this.parent.root(); +}; + +Node.prototype.depth = function () { + if (this.parent === null) { + return 0; + } + return this.parent.depth() + 1; +}; + +Node.prototype.allChildren = function () { + // includes myself + var result = [this]; + this.children.forEach(child => { + result = result.concat(child.allChildren()); + }); + return result; +}; + +Node.prototype.forAllChildren = function (aFunction) { + if (this.children.length > 0) { + this.children.forEach(child => child.forAllChildren(aFunction)); + } + aFunction.call(null, this); +}; + +Node.prototype.anyChild = function (aPredicate) { + // includes myself + var i; + if (aPredicate.call(null, this)) { + return true; + } + for (i = 0; i < this.children.length; i += 1) { + if (this.children[i].anyChild(aPredicate)) { + return true; + } + } + return false; +}; + +Node.prototype.allLeafs = function () { + var result = []; + this.allChildren().forEach(element => { + if (element.children.length === 0) { + result.push(element); + } + }); + return result; +}; + +Node.prototype.allParents = function () { + // includes myself + var result = [this]; + if (this.parent !== null) { + result = result.concat(this.parent.allParents()); + } + return result; +}; + +Node.prototype.siblings = function () { + if (this.parent === null) { + return []; + } + return this.parent.children.filter(child => child !== this); +}; + +Node.prototype.parentThatIsA = function () { + // including myself + // Note: you can pass in multiple constructors to test for + var i; + for (i = 0; i < arguments.length; i += 1) { + if (this instanceof arguments[i]) { + return this; + } + } + if (!this.parent) { + return null; + } + return this.parentThatIsA.apply(this.parent, arguments); +}; + +Node.prototype.parentThatIsAnyOf = function (constructors) { + // deprecated, use parentThatIsA instead + return this.parentThatIsA.apply(this, constructors); +}; + +Node.prototype.childThatIsA = function () { + // including myself + // Note: you can pass in multiple constructors to test for + var i, hit; + for (i = 0; i < arguments.length; i += 1) { + if (this instanceof arguments[i]) { + return this; + } + } + if (!this.children.length) { + return null; + } + for (i = 0; i < this.children.length; i += 1) { + hit = this.childThatIsA.apply(this.children[i], arguments); + if (hit) { + return hit; + } + } + return null; +}; + +// Morphs ////////////////////////////////////////////////////////////// + +// Morph: referenced constructors + +var Morph; +var WorldMorph; +var HandMorph; +var ShadowMorph; +var FrameMorph; +var MenuMorph; +var HandleMorph; +var StringFieldMorph; +var ColorPickerMorph; +var SliderMorph; +var ScrollFrameMorph; +var InspectorMorph; +var StringMorph; +var TextMorph; + +// Morph inherits from Node: + +Morph.prototype = new Node(); +Morph.prototype.constructor = Morph; +Morph.uber = Node.prototype; + +// Morph settings: + +Morph.prototype.shadowBlur = 4; + +// Morph instance creation: + +function Morph() { + this.init(); +} + +// Morph initialization: + +Morph.prototype.init = function () { + Morph.uber.init.call(this); + this.isMorph = true; // used to optimize deep copying + this.cachedImage = null; + this.isCachingImage = false; + this.shouldRerender = false; + this.bounds = new Rectangle(0, 0, 50, 40); + this.holes = []; // list of "untouchable" regions (rectangles) + this.color = new Color(80, 80, 80); + this.texture = null; // optional url of a fill-image + this.cachedTexture = null; // internal cache of actual bg image + this.alpha = 1; + this.isVisible = true; + this.isDraggable = false; + this.isTemplate = false; + this.acceptsDrops = false; + this.isFreeForm = false; + this.noDropShadow = false; + this.fullShadowSource = true; + this.fps = 0; + this.customContextMenu = null; + this.lastTime = Date.now(); + this.onNextStep = null; // optional function to be run once +}; + +// Morph string representation: e.g. 'a Morph 2 [20@45 | 130@250]' + +Morph.prototype.toString = function () { + return 'a ' + + (this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]) + + ' ' + + this.children.length.toString() + ' ' + + this.bounds; +}; + +// Morph deleting: + +Morph.prototype.destroy = function () { + if (this.parent !== null) { + this.fullChanged(); + this.parent.removeChild(this); + } +}; + +// Morph stepping: + +Morph.prototype.stepFrame = function () { + if (!this.step) { + return null; + } + var current, elapsed, leftover, nxt; + current = Date.now(); + elapsed = current - this.lastTime; + if (this.fps > 0) { + leftover = (1000 / this.fps) - elapsed; + } else { + leftover = 0; + } + if (leftover < 1) { + this.lastTime = current; + if (this.onNextStep) { + nxt = this.onNextStep; + this.onNextStep = null; + nxt.call(this); + } + this.step(); + this.children.forEach(child => child.stepFrame()); + } +}; + +Morph.prototype.nextSteps = function (arrayOfFunctions) { + var lst = arrayOfFunctions || [], + nxt = lst.shift(); + if (nxt) { + this.onNextStep = () => { + nxt.call(this); + this.nextSteps(lst); + }; + } +}; + +Morph.prototype.step = nop; + +// Morph accessing - geometry getting: + +Morph.prototype.left = function () { + return this.bounds.left(); +}; + +Morph.prototype.right = function () { + return this.bounds.right(); +}; + +Morph.prototype.top = function () { + return this.bounds.top(); +}; + +Morph.prototype.bottom = function () { + return this.bounds.bottom(); +}; + +Morph.prototype.center = function () { + return this.bounds.center(); +}; + +Morph.prototype.bottomCenter = function () { + return this.bounds.bottomCenter(); +}; + +Morph.prototype.bottomLeft = function () { + return this.bounds.bottomLeft(); +}; + +Morph.prototype.bottomRight = function () { + return this.bounds.bottomRight(); +}; + +Morph.prototype.boundingBox = function () { + return this.bounds; +}; + +Morph.prototype.corners = function () { + return this.bounds.corners(); +}; + +Morph.prototype.leftCenter = function () { + return this.bounds.leftCenter(); +}; + +Morph.prototype.rightCenter = function () { + return this.bounds.rightCenter(); +}; + +Morph.prototype.topCenter = function () { + return this.bounds.topCenter(); +}; + +Morph.prototype.topLeft = function () { + return this.bounds.topLeft(); +}; + +Morph.prototype.topRight = function () { + return this.bounds.topRight(); +}; +Morph.prototype.position = function () { + return this.bounds.origin; +}; + +Morph.prototype.extent = function () { + return this.bounds.extent(); +}; + +Morph.prototype.width = function () { + return this.bounds.width(); +}; + +Morph.prototype.height = function () { + return this.bounds.height(); +}; + +Morph.prototype.fullBounds = function () { + var result; + result = this.bounds; + this.children.forEach(child => { + if (child.isVisible) { + result = result.merge(child.fullBounds()); + } + }); + return result; +}; + +Morph.prototype.fullBoundsNoShadow = function () { + // answer my full bounds but ignore any shadow + var result; + result = this.bounds; + this.children.forEach(child => { + if (!(child instanceof ShadowMorph) && (child.isVisible)) { + result = result.merge(child.fullBounds()); + } + }); + return result; +}; + +Morph.prototype.visibleBounds = function () { + // answer which part of me is not clipped by a Frame + var visible = this.bounds, + frames = this.allParents().filter(p => p instanceof FrameMorph); + frames.forEach(f => visible = visible.intersect(f.bounds)); + return visible; +}; + +// Morph accessing - simple changes: + +Morph.prototype.moveBy = function (delta) { + var children = this.children, + i = children.length; + this.changed(); + this.bounds = this.bounds.translateBy(delta); + this.changed(); + for (i; i > 0; i -= 1) { + children[i - 1].moveBy(delta); + } +}; + +Morph.prototype.setPosition = function (aPoint) { + var delta = aPoint.subtract(this.topLeft()); + if (!(delta.eq(ZERO))) { + this.moveBy(delta); + } +}; + +Morph.prototype.setLeft = function (x) { + this.setPosition( + new Point( + x, + this.top() + ) + ); +}; + +Morph.prototype.setRight = function (x) { + this.setPosition( + new Point( + x - this.width(), + this.top() + ) + ); +}; + +Morph.prototype.setTop = function (y) { + this.setPosition( + new Point( + this.left(), + y + ) + ); +}; + +Morph.prototype.setBottom = function (y) { + this.setPosition( + new Point( + this.left(), + y - this.height() + ) + ); +}; + +Morph.prototype.setCenter = function (aPoint) { + this.setPosition( + aPoint.subtract( + this.extent().divideBy(2) + ) + ); +}; + +Morph.prototype.setFullCenter = function (aPoint) { + this.setPosition( + aPoint.subtract( + this.fullBounds().extent().divideBy(2) + ) + ); +}; + +Morph.prototype.keepWithin = function (aMorph) { + // make sure I am completely within another Morph's bounds + var leftOff, rightOff, topOff, bottomOff; + rightOff = this.fullBounds().right() - aMorph.right(); + if (rightOff > 0) { + this.moveBy(new Point(-rightOff, 0)); + } + leftOff = this.fullBounds().left() - aMorph.left(); + if (leftOff < 0) { + this.moveBy(new Point(-leftOff, 0)); + } + bottomOff = this.fullBounds().bottom() - aMorph.bottom(); + if (bottomOff > 0) { + this.moveBy(new Point(0, -bottomOff)); + } + topOff = this.fullBounds().top() - aMorph.top(); + if (topOff < 0) { + this.moveBy(new Point(0, -topOff)); + } +}; + +Morph.prototype.scrollIntoView = function () { + var leftOff, rightOff, topOff, bottomOff, + sf = this.parentThatIsA(ScrollFrameMorph); + if (!sf) {return; } + rightOff = Math.min( + this.fullBounds().right() - sf.right(), + sf.contents.right() - sf.right() + ); + if (rightOff > 0) { + sf.contents.moveBy(new Point(-rightOff, 0)); + } + leftOff = this.fullBounds().left() - sf.left(); + if (leftOff < 0) { + sf.contents.moveBy(new Point(-leftOff, 0)); + } + topOff = this.fullBounds().top() - sf.top(); + if (topOff < 0) { + sf.contents.moveBy(new Point(0, -topOff)); + } + bottomOff = this.fullBounds().bottom() - sf.bottom(); + if (bottomOff > 0) { + sf.contents.moveBy(new Point(0, -bottomOff)); + } + sf.adjustScrollBars(); +}; + +// Morph accessing - dimensional changes requiring a complete redraw + +Morph.prototype.setExtent = function (aPoint) { + if (aPoint.eq(this.extent())) {return; } + this.changed(); + this.bounds.setWidth(aPoint.x); + this.bounds.setHeight(aPoint.y); + this.fixLayout(); + this.rerender(); +}; + +Morph.prototype.setWidth = function (width) { + this.setExtent(new Point(width || 0, this.height())); +}; + +Morph.prototype.setHeight = function (height) { + this.setExtent(new Point(this.width(), height || 0)); +}; + +Morph.prototype.setColor = function (aColor) { + if (aColor) { + if (!this.color.eq(aColor)) { + this.color = aColor; + this.rerender(); + } + } +}; + +// Morph rendering: + +Morph.prototype.getImage = function () { + var img; + if (this.cachedImage && !this.shouldRerender) { + return this.cachedImage; + } + img = newCanvas(this.extent(), false, this.cachedImage); + if (this.isCachingImage) { + this.cachedImage = img; + } + this.render(img.getContext('2d')); + this.shouldRerender = false; + return img; +}; + +Morph.prototype.render = function (aContext) { + aContext.fillStyle = this.getRenderColor().toString(); + aContext.fillRect(0, 0, this.width(), this.height()); + if (this.cachedTexture) { + this.renderCachedTexture(aContext); + } else if (this.texture) { + this.renderTexture(this.texture, aContext); + } +}; + +Morph.prototype.getRenderColor = function () { + // can be overriden by my heirs or instances + return this.color; +}; + +Morph.prototype.fixLayout = function () { + // implemented by my heirs + // determine my extent and arrange my submorphs, if any + // default is to do nothing + // NOTE: If you need to set the extent, in order to avoid + // infinite recursion instead of calling setExtent() (which will + // in turn call fixLayout() again) directly modify the bounds + // property, e.g. like this: this.bounds.setExtent() + return; +}; + +Morph.prototype.fixHolesLayout = function () { + // implemented by my heirs + // arrange my untouchable areas, if any + // default is to do nothing + return; +}; + +// Morph displaying: + +Morph.prototype.renderTexture = function (url, ctx) { + this.cachedTexture = new Image(); + this.cachedTexture.onload = () => this.changed(); + this.cachedTexture.src = this.texture = url; +}; + +Morph.prototype.renderCachedTexture = function (ctx) { + var bg = this.cachedTexture, + cols = Math.floor(this.width() / bg.width), + lines = Math.floor(this.height() / bg.height), + x, + y; + + ctx.save(); + ctx.globalAlpha = this.alpha; + ctx.beginPath(); + ctx.rect(0, 0, this.width(), this.height()); + ctx.clip(); + for (y = 0; y <= lines; y += 1) { + for (x = 0; x <= cols; x += 1) { + ctx.drawImage(bg, x * bg.width, y * bg.height); + } + } + ctx.restore(); +}; + +Morph.prototype.drawOn = function (ctx, rect) { + var clipped = rect.intersect(this.bounds), + pos = this.position(), + pic, src, w, h, sl, st; + + if (!clipped.extent().gt(ZERO)) {return; } + ctx.save(); + ctx.globalAlpha = this.alpha; + if (this.isCachingImage) { + pic = this.getImage(); + src = clipped.translateBy(pos.neg()); + sl = src.left(); + st = src.top(); + w = Math.min(src.width(), pic.width - sl); + h = Math.min(src.height(), pic.height - st); + if (w < 1 || h < 1) {return; } + ctx.drawImage( + pic, + sl, + st, + w, + h, + clipped.left(), + clipped.top(), + w, + h + ); + } else { // render directly on target canvas + ctx.beginPath(); + ctx.rect(clipped.left(), clipped.top(), clipped.width(), clipped.height()); + ctx.clip(); + ctx.translate(pos.x, pos.y); + this.render(ctx); + if (MorphicPreferences.showHoles) { // debug hole rendering + ctx.translate(-pos.x, -pos.y); + ctx.globalAlpha = 0.25; + ctx.fillStyle = 'white'; + this.holes.forEach(hole => { + var sect = hole.translateBy(pos).intersect(clipped); + ctx.fillRect( + sect.left(), + sect.top(), + sect.width(), + sect.height() + ); + }); + } + } + ctx.restore(); +}; + +Morph.prototype.fullDrawOn = function (aContext, aRect) { + if (!this.isVisible) {return; } + this.drawOn(aContext, aRect); + this.children.forEach(child => child.fullDrawOn(aContext, aRect)); +}; + +Morph.prototype.hide = function () { + this.isVisible = false; + this.changed(); +}; + +Morph.prototype.show = function () { + this.isVisible = true; + this.changed(); +}; + +Morph.prototype.toggleVisibility = function () { + this.isVisible = !this.isVisible; + this.changed(); +}; + +// Morph full image: + +Morph.prototype.fullImage = function () { + var fb = this.fullBounds(), + img = newCanvas(fb.extent()), + ctx = img.getContext('2d'); + ctx.translate(-fb.origin.x, -fb.origin.y); + this.fullDrawOn(ctx, fb); + return img; +}; + +// Morph shadow: + +Morph.prototype.shadowImage = function (off, color) { + // for flat design mode + var fb, img, outline, sha, ctx, + offset = off || new Point(7, 7), + clr = color || new Color(0, 0, 0); + if (this.fullShadowSource) { + fb = this.fullBounds().extent(); + img = this.fullImage(); + } else { // optimization when all submorphs are contained inside + fb = this.extent(); + img = this.getImage(); + } + outline = newCanvas(fb); + ctx = outline.getContext('2d'); + ctx.drawImage(img, 0, 0); + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage( + img, + -offset.x, + -offset.y + ); + sha = newCanvas(fb); + ctx = sha.getContext('2d'); + ctx.drawImage(outline, 0, 0); + ctx.globalCompositeOperation = 'source-atop'; + ctx.fillStyle = clr.toString(); + ctx.fillRect(0, 0, fb.x, fb.y); + return sha; +}; + +Morph.prototype.shadowImageBlurred = function (off, color) { + var fb, img, sha, ctx, + offset = off || new Point(7, 7), + blur = this.shadowBlur, + clr = color || new Color(0, 0, 0); + if (this.fullShadowSource) { + fb = this.fullBounds().extent().add(blur * 2); + img = this.fullImage(); + } else { // optimization when all submorphs are contained inside + fb = this.extent().add(blur * 2); + img = this.getImage(); + } + sha = newCanvas(fb); + ctx = sha.getContext('2d'); + ctx.shadowOffsetX = offset.x; + ctx.shadowOffsetY = offset.y; + ctx.shadowBlur = blur; + ctx.shadowColor = clr.toString(); + ctx.drawImage( + img, + blur - offset.x, + blur - offset.y + ); + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage( + img, + blur - offset.x, + blur - offset.y + ); + return sha; +}; + +Morph.prototype.shadow = function (off, a, color) { + var shadow = new ShadowMorph(), + offset = off || new Point(7, 7), + alpha = a || ((a === 0) ? 0 : 0.2), + fb = this.fullBounds(); + shadow.setExtent(fb.extent().add(this.shadowBlur * 2)); + if (useBlurredShadows /*&& !MorphicPreferences.isFlat*/) { + shadow.cachedImage = this.shadowImageBlurred(offset, color); + shadow.alpha = alpha; + shadow.setPosition(fb.origin.add(offset).subtract(this.shadowBlur)); + } else { + shadow.cachedImage = this.shadowImage(offset, color); + shadow.alpha = alpha; + shadow.setPosition(fb.origin.add(offset)); + } + shadow.shouldRerender = false; + return shadow; +}; + +Morph.prototype.addShadow = function (off, a, color) { + var shadow, + offset = off || new Point(7, 7), + alpha = a || ((a === 0) ? 0 : 0.2); + shadow = this.shadow(offset, alpha, color); + this.addBack(shadow); + this.fullChanged(); + return shadow; +}; + +Morph.prototype.getShadow = function () { + var shadows; + shadows = this.children.slice(0).reverse().filter( + child => child instanceof ShadowMorph + ); + if (shadows.length !== 0) { + return shadows[0]; + } + return null; +}; + +Morph.prototype.removeShadow = function () { + var shadow = this.getShadow(); + if (shadow !== null) { + this.fullChanged(); + this.removeChild(shadow); + } +}; + +// Morph pen trails: + +Morph.prototype.penTrails = function () { + // answer my pen trails canvas. default is to answer my image + // NOTE: clients calling this also want to make sure the + // obtained canvas will be around at the next display cycle, + // so they might also wish to set the receiver's "isCachingImage" + // property to "true". + return this.getImage(); +}; + +// Morph updating: + +Morph.prototype.rerender = function () { + this.shouldRerender = true; + this.changed(); +}; + +Morph.prototype.changed = function () { + var w = this.root(); + if (w instanceof WorldMorph) { + w.broken.push(this.visibleBounds().spread()); + } + if (this.parent) { + this.parent.childChanged(this); + } +}; + +Morph.prototype.fullChanged = function () { + var w = this.root(); + if (w instanceof WorldMorph) { + w.broken.push( + this.fullBounds().spread() + ); + } +}; + +Morph.prototype.childChanged = function () { + // react to a change in one of my children, + // default is to just pass this message on upwards + // override this method for Morphs that need to adjust accordingly + if (this.parent) { + this.parent.childChanged(this); + } +}; + +// Morph accessing - structure: + +Morph.prototype.world = function () { + var root = this.root(); + if (root instanceof WorldMorph) { + return root; + } + if (root instanceof HandMorph) { + return root.world; + } + return null; +}; + +Morph.prototype.add = function (aMorph) { + var owner = aMorph.parent; + if (owner !== null) { + owner.removeChild(aMorph); + } + this.addChild(aMorph); +}; + +Morph.prototype.addBack = function (aMorph) { + var owner = aMorph.parent; + if (owner !== null) { + owner.removeChild(aMorph); + } + this.addChildFirst(aMorph); +}; + +Morph.prototype.topMorphAt = function (point) { + var i, result; + if (!this.isVisible) {return null; } + for (i = this.children.length - 1; i >= 0; i -= 1) { + result = this.children[i].topMorphAt(point); + if (result) {return result; } + } + if (this.bounds.containsPoint(point)) { + if (this.holes.some( + any => any.translateBy(this.position()).containsPoint(point)) + ) { + return null; + } + if (this.isFreeForm) { + if (!this.isTransparentAt(point)) { + return this; + } + } else { + return this; + } + } + return null; +}; + +Morph.prototype.topMorphSuchThat = function (predicate) { + var next; + if (predicate.call(null, this)) { + next = detect( + this.children.slice(0).reverse(), + predicate + ); + if (next) { + return next.topMorphSuchThat(predicate); + } + return this; + } + return null; +}; + +Morph.prototype.overlappedMorphs = function () { + //exclude the World + var world = this.world(), + fb = this.fullBounds(), + allParents = this.allParents(), + allChildren = this.allChildren(), + morphs; + + morphs = world.allChildren(); + return morphs.filter(m => { + return m.isVisible && + m !== this && + m !== world && + !contains(allParents, m) && + !contains(allChildren, m) && + m.fullBounds().intersects(fb); + }); +}; + +// Morph pixel access: + +Morph.prototype.getPixelColor = function (aPoint) { + var point, context, data; + point = aPoint.subtract(this.bounds.origin); + context = this.getImage().getContext('2d'); + data = context.getImageData(point.x, point.y, 1, 1); + return new Color( + data.data[0], + data.data[1], + data.data[2], + data.data[3] / 255 + ); +}; + +Morph.prototype.isTransparentAt = function (aPoint) { + var point, context, data; + if (this.bounds.containsPoint(aPoint)) { + if (this.texture) { + return false; + } + point = aPoint.subtract(this.bounds.origin); + context = this.getImage().getContext('2d'); + data = context.getImageData( + Math.floor(point.x), + Math.floor(point.y), + 1, + 1 + ); + return data.data[3] === 0; + } + return false; +}; + +// Morph duplicating: + +Morph.prototype.copy = function () { + var c = copy(this); + c.parent = null; + c.children = []; + c.bounds = this.bounds.copy(); + return c; +}; + +Morph.prototype.fullCopy = function () { + /* + Produce a copy of me with my entire tree of submorphs. Morphs + mentioned more than once are all directed to a single new copy. + Other properties are also *shallow* copied, so you must override + to deep copy Arrays and (complex) Objects + */ + var map = new Map(), c; + c = this.copyRecordingReferences(map); + c.forAllChildren(m => m.updateReferences(map)); + return c; +}; + +Morph.prototype.copyRecordingReferences = function (map) { + /* + Recursively copy this entire composite morph, recording the + correspondence between old and new morphs in the given dictionary. + This dictionary will be used to update intra-composite references + in the copy. See updateReferences(). + + Note: This default implementation copies ONLY morphs. If a morph + stores morphs in other properties that it wants to copy, then it + should override this method to do so. The same goes for morphs that + contain other complex data that should be copied when the morph is + duplicated. + */ + var c = this.copy(); + map.set(this, c); + this.children.forEach(m => c.add(m.copyRecordingReferences(map))); + return c; +}; + +Morph.prototype.updateReferences = function (map) { + /* + Update intra-morph references within a composite morph that has + been copied. For example, if a button refers to morph X in the + orginal composite then the copy of that button in the new composite + should refer to the copy of X in new composite, not the original X. + */ + var properties = Object.keys(this), + l = properties.length, + property, + value, + reference, + i; + for (i = 0; i < l; i += 1) { + property = properties[i]; + value = this[property]; + if (value && value.isMorph) { + reference = map.get(value); + if (reference) { this[property] = reference; } + } + } +}; + +// Morph dragging and dropping: + +Morph.prototype.rootForGrab = function () { + if (this instanceof ShadowMorph) { + return this.parent.rootForGrab(); + } + if (this.parent instanceof ScrollFrameMorph) { + return this.parent; + } + if (this.parent === null || + this.parent instanceof WorldMorph || + this.parent instanceof FrameMorph || + this.isDraggable === true) { + return this; + } + return this.parent.rootForGrab(); +}; + +Morph.prototype.isCorrectingOutsideDrag = function () { + // make sure I don't "trail behind" the hand when dragged + // override for morphs that you want to be dragged outside + // their full bounds + return true; +}; + +Morph.prototype.wantsDropOf = function (aMorph) { + // default is to answer the general flag - change for my heirs + if ((aMorph instanceof HandleMorph) || + (aMorph instanceof MenuMorph) || + (aMorph instanceof InspectorMorph)) { + return false; + } + return this.acceptsDrops; +}; + +Morph.prototype.pickUp = function (wrrld) { + var world = wrrld || this.world(); + this.setPosition( + world.hand.position().subtract( + this.extent().floorDivideBy(2) + ) + ); + world.hand.grab(this); +}; + +Morph.prototype.isPickedUp = function () { + return this.parentThatIsA(HandMorph) !== null; +}; + +Morph.prototype.situation = function () { + // answer a dictionary specifying where I am right now, so + // I can slide back to it if I'm dropped somewhere else + if (this.parent) { + return { + origin: this.parent, + position: this.position().subtract(this.parent.position()) + }; + } + return null; +}; + +Morph.prototype.slideBackTo = function ( + situation, + msecs, + onBeforeDrop, + onComplete +) { + var pos = situation.origin.position().add(situation.position); + this.glideTo( + pos, + msecs, + null, // easing + () => { + situation.origin.add(this); + if (onBeforeDrop) {onBeforeDrop(); } + if (this.justDropped) {this.justDropped(); } + if (situation.origin.reactToDropOf) { + situation.origin.reactToDropOf(this); + } + if (onComplete) {onComplete(); } + } + ); +}; + +// Morph animating: + +Morph.prototype.glideTo = function (endPoint, msecs, easing, onComplete) { + var world = this.world(), + horizontal = new Animation( + x => this.setLeft(x), + () => this.left(), + -(this.left() - endPoint.x), + msecs === 0 ? 0 : msecs || 100, + easing + ); + world.animations.push(horizontal); + world.animations.push(new Animation( + y => this.setTop(y), + () => this.top(), + -(this.top() - endPoint.y), + msecs === 0 ? 0 : msecs || 100, + easing, + () => { + horizontal.setter(horizontal.destination); + horizontal.isActive = false; + onComplete(); + } + + )); +}; + +Morph.prototype.fadeTo = function (endAlpha, msecs, easing, onComplete) { + // include all my children, restore all original transparencies + // on completion, so I can be recovered + var world = this.world(), + oldAlpha = this.alpha; + this.children.forEach(child => child.fadeTo(endAlpha, msecs, easing)); + world.animations.push(new Animation( + n => { + this.alpha = n; + this.changed(); + }, + () => this.alpha, + endAlpha - this.alpha, + msecs === 0 ? 0 : msecs || 200, + easing, + () => { + this.alpha = oldAlpha; + if (onComplete) {onComplete(); } + } + )); +}; + +Morph.prototype.perish = function (msecs, onComplete) { + this.fadeTo( + 0, + msecs === 0 ? 0 : msecs || 100, + null, + () => { + this.destroy(); + if (onComplete) {onComplete(); } + } + ); +}; + +// Morph utilities: + +Morph.prototype.nop = nop; + +Morph.prototype.resize = function () { + this.world().activeHandle = new HandleMorph(this); +}; + +Morph.prototype.move = function () { + this.world().activeHandle = new HandleMorph( + this, + null, + null, + null, + null, + 'move' + ); +}; + +Morph.prototype.moveCenter = function () { + this.world().activeHandle = new HandleMorph( + this, + null, + null, + null, + null, + 'moveCenter' + ); +}; + +Morph.prototype.hint = function (msg) { + var m, text; + text = msg; + if (msg) { + if (msg.toString) { + text = msg.toString(); + } + } else { + text = 'NULL'; + } + m = new MenuMorph(this, text); + m.isDraggable = true; + m.popUpCenteredAtHand(this.world()); +}; + +Morph.prototype.inform = function (msg) { + var m, text; + text = msg; + if (msg) { + if (msg.toString) { + text = msg.toString(); + } + } else { + text = 'NULL'; + } + m = new MenuMorph(this, text); + m.addItem("Ok"); + m.isDraggable = true; + m.popUpCenteredAtHand(this.world()); +}; + +Morph.prototype.prompt = function ( + msg, + callback, + environment, + defaultContents, + width, + floorNum, + ceilingNum, + isRounded, + action = nop +) { + var menu, entryField, slider, isNumeric; + if (ceilingNum) { + isNumeric = true; + } + menu = new MenuMorph( + callback || null, + msg || '', + environment || null + ); + entryField = new StringFieldMorph( + defaultContents || '', + width || 100, + MorphicPreferences.prompterFontSize, + MorphicPreferences.prompterFontName, + false, + false, + isNumeric + ); + menu.items.push(entryField); + if (ceilingNum || MorphicPreferences.useSliderForInput) { + slider = new SliderMorph( + floorNum || 0, + ceilingNum, + parseFloat(defaultContents), + Math.floor((ceilingNum - floorNum) / 4), + 'horizontal' + ); + slider.alpha = 1; + slider.color = new Color(225, 225, 225); + slider.button.color = menu.borderColor; + slider.button.highlightColor = slider.button.color.copy(); + slider.button.highlightColor.b += 100; + slider.button.pressColor = slider.button.color.copy(); + slider.button.pressColor.b += 150; + slider.setHeight(MorphicPreferences.prompterSliderSize); + if (isRounded) { + slider.action = (num) => { + entryField.changed(); + entryField.text.text = Math.round(num).toString(); + entryField.text.fixLayout(); + entryField.text.changed(); + entryField.text.edit(); + action(Math.round(num)); + }; + } else { + slider.action = (num) => { + entryField.changed(); + entryField.text.text = num.toString(); + entryField.text.fixLayout(); + entryField.text.changed(); + action(num); + }; + } + menu.items.push(slider); + } + + menu.addLine(2); + menu.addItem('Ok', () => entryField.string()); + menu.addItem( + 'Cancel', + () => { + action(defaultContents); + return null; + } + ); + menu.isDraggable = true; + menu.popUpAtHand(this.world()); + entryField.text.edit(); +}; + +Morph.prototype.pickColor = function ( + msg, + callback, + environment, + defaultContents +) { + var menu, colorPicker; + menu = new MenuMorph( + callback || null, + msg || '', + environment || null + ); + colorPicker = new ColorPickerMorph(defaultContents); + menu.items.push(colorPicker); + menu.addLine(2); + menu.addItem('Ok', () => colorPicker.getChoice()); + menu.addItem('Cancel', () => null); + menu.isDraggable = true; + menu.popUpAtHand(this.world()); +}; + +Morph.prototype.inspect = function (anotherObject) { + var world = this.world instanceof Function ? + this.world() : this.root() || this.world, + inspector, + inspectee = this; + + if (anotherObject) { + inspectee = anotherObject; + } + inspector = new InspectorMorph(inspectee); + inspector.setPosition(world.hand.position()); + inspector.keepWithin(world); + world.add(inspector); + inspector.changed(); +}; + +Morph.prototype.inspectKeyEvent = function (event) { + this.inform( + 'Key pressed: ' + + String.fromCharCode(event.charCode) + + '\n------------------------' + + '\ncharCode: ' + + event.charCode.toString() + + '\nkeyCode: ' + + event.keyCode.toString() + + '\nkey: ' + + event.key.toString() + + '\nshiftKey: ' + + event.shiftKey.toString() + + '\naltKey: ' + + event.altKey.toString() + + '\nctrlKey: ' + + event.ctrlKey.toString() + + '\ncmdKey: ' + + event.metaKey.toString() + ); +}; + +// Morph menus: + +Morph.prototype.contextMenu = function () { + var world; + + if (this.customContextMenu) { + return this.customContextMenu; + } + world = this.world instanceof Function ? this.world() : this.world; + if (world && world.isDevMode) { + if (this.parent === world) { + return this.developersMenu(); + } + return this.hierarchyMenu(); + } + return this.userMenu() || + (this.parent && this.parent.userMenu()); +}; + +Morph.prototype.hierarchyMenu = function () { + var parents = this.allParents(), + world = this.world instanceof Function ? this.world() : this.world, + menu = new MenuMorph(this, null); + + parents.forEach(each => { + if (each.developersMenu && (each !== world)) { + menu.addMenu( + each.toString().slice(0, 50), + each.developersMenu() + ); + } + }); + return menu; +}; + +Morph.prototype.developersMenu = function () { + // 'name' is not an official property of a function, hence: + var world = this.world instanceof Function ? this.world() : this.world, + userMenu = this.userMenu() || + (this.parent && this.parent.userMenu()), + menu = new MenuMorph(this, this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]); + if (userMenu) { + menu.addMenu('user features', userMenu); + menu.addLine(); + } + menu.addItem( + "color...", + () => { + this.pickColor( + menu.title + localize('\ncolor:'), + this.setColor, + this, + this.color + ); + }, + 'choose another color \nfor this morph' + ); + menu.addItem( + "transparency...", + () => { + this.prompt( + menu.title + localize('\nalpha\nvalue:'), + this.setAlphaScaled, + this, + (this.alpha * 100).toString(), + null, + 1, + 100, + true + ); + }, + 'set this morph\'s\nalpha value' + ); + menu.addItem( + "resize...", + 'resize', + 'show a handle\nwhich can be dragged\nto change this morph\'s' + + ' extent' + ); + menu.addLine(); + menu.addItem( + "duplicate", + () => this.fullCopy().pickUp(this.world()), + 'make a copy\nand pick it up' + ); + menu.addItem( + "pick up", + 'pickUp', + 'detach and put \ninto the hand' + ); + menu.addItem( + "attach...", + 'attach', + 'stick this morph\nto another one' + ); + menu.addItem( + "move...", + 'move', + 'show a handle\nwhich can be dragged\nto move this morph' + ); + menu.addItem( + "inspect...", + 'inspect', + 'open a window\non all properties' + ); + menu.addItem( + "pic...", + () => { + var imgURL = this.fullImage().toDataURL(), + doc, body, tag, str; + try { + doc = window.open('', '_blank', 'popup').document; + body = doc.getElementsByTagName('body')[0]; + str = '' + this; + doc.title = str; + tag = doc.createElement('h1'); + tag.textContent = str; + body.appendChild(tag); + tag = doc.createElement('img'); + tag.alt = str; + tag.src = imgURL; + body.appendChild(tag); + } catch (error) { + console.warn( + 'failed to popup pic, morph:%O, error:%O, image URL:%O', + this, error, [imgURL] + ); + } + }, + 'open a new window\nwith a picture of this morph' + ); + menu.addLine(); + if (this.isDraggable) { + menu.addItem( + "lock", + 'toggleIsDraggable', + 'make this morph\nunmovable' + ); + } else { + menu.addItem( + "unlock", + 'toggleIsDraggable', + 'make this morph\nmovable' + ); + } + menu.addItem("hide", 'hide'); + menu.addItem("delete", 'destroy'); + if (!(this instanceof WorldMorph)) { + menu.addLine(); + menu.addItem( + "World...", + () => world.contextMenu().popUpAtHand(world), + 'show the\nWorld\'s menu' + ); + } + return menu; +}; + +Morph.prototype.userMenu = function () { + return null; +}; + +Morph.prototype.addToDemoMenu = function (aMorphOrMenuArray) { + // register a Morph or a Menu with Morphs with the World's demos menu + // a menu can be added in the form of a two-item array: [name, [morphs]] + WorldMorph.prototype.customMorphs.push(aMorphOrMenuArray); +}; + +// Morph menu actions + +Morph.prototype.setAlphaScaled = function (alpha) { + // for context menu demo purposes + var newAlpha, unscaled; + if (typeof alpha === 'number') { + unscaled = alpha / 100; + this.alpha = Math.min(Math.max(unscaled, 0), 1); + } else { + newAlpha = parseFloat(alpha); + if (!isNaN(newAlpha)) { + unscaled = newAlpha / 100; + this.alpha = Math.min(Math.max(unscaled, 0), 1); + } + } + this.changed(); +}; + +Morph.prototype.attach = function () { + var choices = this.overlappedMorphs(), + menu = new MenuMorph(this, 'choose new parent:'); + + choices.forEach(each => { + menu.addItem(each.toString().slice(0, 50), () => { + each.add(this); + this.isDraggable = false; + }); + }); + if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +Morph.prototype.toggleIsDraggable = function () { + // for context menu demo purposes + this.isDraggable = !this.isDraggable; +}; + +Morph.prototype.colorSetters = function () { + // for context menu demo purposes + return ['color']; +}; + +Morph.prototype.numericalSetters = function () { + // for context menu demo purposes + return [ + 'setLeft', + 'setTop', + 'setWidth', + 'setHeight', + 'setAlphaScaled' + ]; +}; + +// Morph entry field tabbing: + +Morph.prototype.allEntryFields = function () { + return this.allChildren().filter(each => { + return each.isEditable && + (each instanceof StringMorph || + each instanceof TextMorph); + }); +}; + +Morph.prototype.nextEntryField = function (current) { + var fields = this.allEntryFields(), + idx = fields.indexOf(current); + if (idx !== -1) { + if (fields.length > idx + 1) { + return fields[idx + 1]; + } + } + return fields[0]; +}; + +Morph.prototype.previousEntryField = function (current) { + var fields = this.allEntryFields(), + idx = fields.indexOf(current); + if (idx !== -1) { + if (idx > 0) { + return fields[idx - 1]; + } + return fields[fields.length - 1]; + } + return fields[0]; +}; + +Morph.prototype.tab = function (editField) { +/* + the key was pressed in one of my edit fields. + invoke my "nextTab()" function if it exists, else + propagate it up my owner chain. +*/ + if (this.nextTab) { + this.nextTab(editField); + } else if (this.parent) { + this.parent.tab(editField); + } +}; + +Morph.prototype.backTab = function (editField) { +/* + the key was pressed in one of my edit fields. + invoke my "previousTab()" function if it exists, else + propagate it up my owner chain. +*/ + if (this.previousTab) { + this.previousTab(editField); + } else if (this.parent) { + this.parent.backTab(editField); + } +}; + +/* + the following are examples of what the navigation methods should + look like. Insert these at the World level for fallback, and at lower + levels in the Morphic tree (e.g. dialog boxes) for a more fine-grained + control over the tabbing cycle. + +Morph.prototype.nextTab = function (editField) { + var next = this.nextEntryField(editField); + editField.clearSelection(); + next.selectAll(); + next.edit(); +}; + +Morph.prototype.previousTab = function (editField) { + var prev = this.previousEntryField(editField); + editField.clearSelection(); + prev.selectAll(); + prev.edit(); +}; + +*/ + +// Morph events: + +Morph.prototype.escalateEvent = function (functionName, arg) { + var handler = this.parent; + while (!handler[functionName] && handler.parent !== null) { + handler = handler.parent; + } + if (handler[functionName]) { + handler[functionName](arg); + } +}; + +// Morph eval: + +Morph.prototype.evaluateString = function (code) { + var result; + + try { + result = eval(code); + this.changed(); + } catch (err) { + this.inform(err); + } + return result; +}; + +// Morph collision detection: + +Morph.prototype.isTouching = function (otherMorph) { + var data = this.overlappingPixels(otherMorph), + len, i; + + if (!data) {return false; } + len = data[0].length; + for (i = 3; i < len; i += 4) { + if (data[0][i] && data[1][i]) {return true; } + } + return false; +}; + +Morph.prototype.overlappingPixels = function (otherMorph) { + var fb = this.fullBounds(), + otherFb = otherMorph.fullBounds(), + oRect = fb.intersect(otherFb), + thisImg, thatImg; + + if (oRect.width() < 1 || oRect.height() < 1) { + return false; + } + thisImg = this.fullImage(); + thatImg = otherMorph.fullImage(); + if (thisImg.isRetinaEnabled !== thatImg.isRetinaEnabled) { + thisImg = normalizeCanvas(thisImg, true); + thatImg = normalizeCanvas(thatImg, true); + } + return [ + thisImg.getContext("2d").getImageData( + oRect.left() - this.left(), + oRect.top() - this.top(), + oRect.width(), + oRect.height() + ).data, + thatImg.getContext("2d").getImageData( + oRect.left() - otherMorph.left(), + oRect.top() - otherMorph.top(), + oRect.width(), + oRect.height() + ).data + ]; +}; + +// ShadowMorph ///////////////////////////////////////////////////////// + +// ShadowMorph inherits from Morph: + +ShadowMorph.prototype = new Morph(); +ShadowMorph.prototype.constructor = ShadowMorph; +ShadowMorph.uber = Morph.prototype; + +// ShadowMorph instance creation: + +function ShadowMorph() { + this.init(); +} + +ShadowMorph.prototype.init = function () { + ShadowMorph.uber.init.call(this); + this.isCachingImage = true; +}; + +ShadowMorph.prototype.topMorphAt = function () { + return null; +}; + +// HandleMorph //////////////////////////////////////////////////////// + +// I am a resize / move handle that can be attached to any Morph + +// HandleMorph inherits from Morph: + +HandleMorph.prototype = new Morph(); +HandleMorph.prototype.constructor = HandleMorph; +HandleMorph.uber = Morph.prototype; + +// HandleMorph instance creation: + +function HandleMorph(target, minX, minY, insetX, insetY, type) { + // if insetY is missing, it will be the same as insetX + this.init(target, minX, minY, insetX, insetY, type); +} + +HandleMorph.prototype.init = function ( + target, + minX, + minY, + insetX, + insetY, + type +) { + var size = MorphicPreferences.handleSize; + this.target = target || null; + this.minExtent = new Point(minX || 0, minY || 0); + this.inset = new Point(insetX || 0, insetY || insetX || 0); + this.type = type || 'resize'; // also: 'move', 'moveCenter', 'movePivot' + this.isHighlighted = false; + HandleMorph.uber.init.call(this); + this.color = WHITE; + this.isDraggable = false; + if (this.type === 'movePivot') { + size *= 2; + } + this.setExtent(new Point(size, size)); + this.fixLayout(); +}; + +// HandleMorph drawing: + +HandleMorph.prototype.fixLayout = function () { + if (this.target) { + if (this.type === 'moveCenter') { + this.setCenter(this.target.center()); + } else if (this.type === 'movePivot') { + this.setCenter(this.target.rotationCenter()); + } else { // 'resize', 'move' + this.setPosition( + this.target.bottomRight().subtract( + this.extent().add(this.inset) + ) + ); + } + this.target.add(this); + this.target.changed(); + } +}; + +HandleMorph.prototype.render = function (ctx) { + if (this.type === 'movePivot') { + if (this.isHighlighted) { + this.renderCrosshairsOn(ctx, 0.5); + } else { + this.renderCrosshairsOn(ctx, 0.6); + } + } else { + if (this.isHighlighted) { + this.renderHandleOn( + ctx, + new Color(100, 100, 255), + WHITE + ); + } else { + this.renderHandleOn( + ctx, + this.color, + new Color(100, 100, 100) + ); + } + } +}; + +HandleMorph.prototype.renderCrosshairsOn = function (ctx, fract) { + var r = this.width() / 2; + + // semi-transparent white background blob + ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'; + ctx.beginPath(); + ctx.arc( + r, + r, + r * 0.9, + radians(0), + radians(360), + false + ); + ctx.fill(); + + // solid black ring + ctx.strokeStyle = 'black'; + ctx.lineWidth = 1; + ctx.beginPath(); + ctx.arc( + r, + r, + r * fract, + radians(0), + radians(360), + false + ); + ctx.stroke(); + + // vertically centered horizontal line + ctx.moveTo(0, r); + ctx.lineTo(this.width(), r); + ctx.stroke(); + + // horizontally centered vertical line + ctx.moveTo(r, 0); + ctx.lineTo(r, this.height()); + ctx.stroke(); +}; + +HandleMorph.prototype.renderHandleOn = function ( + ctx, + color, + shadowColor +) { + var isSquare = (this.type.indexOf('move') === 0), + p1 = new Point(0, this.height()), // bottom left + p2 = new Point(this.width(), 0), // top right + p11, p22, i; + + ctx.lineWidth = 1; + ctx.lineCap = 'round'; + ctx.strokeStyle = color.toString(); + + if (isSquare) { + p11 = p1.copy(); + p22 = p2.copy(); + for (i = 0; i <= this.height(); i = i + 6) { + p11.y = p1.y - i; + p22.y = p2.y - i; + + ctx.beginPath(); + ctx.moveTo(p11.x, p11.y); + ctx.lineTo(p22.x, p22.y); + ctx.closePath(); + ctx.stroke(); + } + } + + p11 = p1.copy(); + p22 = p2.copy(); + for (i = 0; i <= this.width(); i = i + 6) { + p11.x = p1.x + i; + p22.x = p2.x + i; + + ctx.beginPath(); + ctx.moveTo(p11.x, p11.y); + ctx.lineTo(p22.x, p22.y); + ctx.closePath(); + ctx.stroke(); + } + ctx.strokeStyle = shadowColor.toString(); + + if (isSquare) { + p11 = p1.copy(); + p22 = p2.copy(); + for (i = -2; i <= this.height(); i = i + 6) { + p11.y = p1.y - i; + p22.y = p2.y - i; + + ctx.beginPath(); + ctx.moveTo(p11.x, p11.y); + ctx.lineTo(p22.x, p22.y); + ctx.closePath(); + ctx.stroke(); + } + } + + p11 = p1.copy(); + p22 = p2.copy(); + for (i = 2; i <= this.width(); i = i + 6) { + p11.x = p1.x + i; + p22.x = p2.x + i; + + ctx.beginPath(); + ctx.moveTo(p11.x, p11.y); + ctx.lineTo(p22.x, p22.y); + ctx.closePath(); + ctx.stroke(); + } +}; + +// HandleMorph stepping: + +HandleMorph.prototype.step = null; + +HandleMorph.prototype.mouseDownLeft = function (pos) { + var world = this.root(), + offset; + + if (!this.target) { + return null; + } + if (this.type.indexOf('move') === 0) { + offset = pos.subtract(this.center()); + } else { + offset = pos.subtract(this.bounds.origin); + } + + this.step = () => { + var newPos, newExt; + if (world.hand.mouseButton) { + newPos = world.hand.bounds.origin.copy().subtract(offset); + if (this.type === 'resize') { + newExt = newPos.add( + this.extent().add(this.inset) + ).subtract(this.target.bounds.origin); + newExt = newExt.max(this.minExtent); + this.target.setExtent(newExt); + + this.setPosition( + this.target.bottomRight().subtract( + this.extent().add(this.inset) + ) + ); + } else if (this.type === 'moveCenter') { + this.target.setCenter(newPos); + } else if (this.type === 'movePivot') { + this.target.setPivot(newPos); + this.setCenter(this.target.rotationCenter()); + } else { // type === 'move' + this.target.setPosition( + newPos.subtract(this.target.extent()) + .add(this.extent()) + ); + } + } else { + this.step = null; + } + }; + + if (!this.target.step) { + this.target.step = nop; + } +}; + +// HandleMorph dragging and dropping: + +HandleMorph.prototype.rootForGrab = function () { + return this; +}; + +// HandleMorph events: + +HandleMorph.prototype.mouseEnter = function () { + this.isHighlighted = true; + this.changed(); +}; + +HandleMorph.prototype.mouseLeave = function () { + this.isHighlighted = false; + this.changed(); +}; + +// HandleMorph menu: + +HandleMorph.prototype.attach = function () { + var choices = this.overlappedMorphs(), + menu = new MenuMorph(this, 'choose target:'); + + choices.forEach(each => { + menu.addItem(each.toString().slice(0, 50), () => { + this.isDraggable = false; + this.target = each; + this.fixLayout(); + }); + }); + if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +// PenMorph //////////////////////////////////////////////////////////// + +// I am a simple LOGO-wise turtle. + +// PenMorph: referenced constructors + +var PenMorph; + +// PenMorph inherits from Morph: + +PenMorph.prototype = new Morph(); +PenMorph.prototype.constructor = PenMorph; +PenMorph.uber = Morph.prototype; + +// PenMorph instance creation: + +function PenMorph() { + this.init(); +} + +PenMorph.prototype.init = function () { + var size = MorphicPreferences.handleSize * 4; + + // additional properties: + this.isWarped = false; // internal optimization + this.heading = 0; + this.isDown = true; + this.size = 1; + this.penPoint = 'tip'; // or 'center" + this.penBounds = null; // rect around the visible arrow shape + + HandleMorph.uber.init.call(this); + this.setExtent(new Point(size, size)); +}; + +// PenMorph updating - optimized for warping, i.e atomic recursion + +PenMorph.prototype.changed = function () { + if (this.isWarped) {return; } + PenMorph.uber.changed.call(this); + +}; + +// PenMorph display: + +PenMorph.prototype.render = function (ctx, facing) { + // my orientation can be overridden with the "facing" parameter to + // implement Scratch-style rotation styles + + var start, dest, left, right, len, + direction = facing || this.heading; + + len = this.width() / 2; + start = this.center().subtract(this.bounds.origin); + + if (this.penPoint === 'tip') { + dest = start.distanceAngle(len * 0.75, direction - 180); + left = start.distanceAngle(len, direction + 195); + right = start.distanceAngle(len, direction - 195); + } else { // 'middle' + dest = start.distanceAngle(len * 0.75, direction); + left = start.distanceAngle(len * 0.33, direction + 230); + right = start.distanceAngle(len * 0.33, direction - 230); + } + + // cache penBounds + this.penBounds = new Rectangle( + Math.min(start.x, dest.x, left.x, right.x), + Math.min(start.y, dest.y, left.y, right.y), + Math.max(start.x, dest.x, left.x, right.x), + Math.max(start.y, dest.y, left.y, right.y) + ); + + // draw arrow shape + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + + ctx.moveTo(start.x, start.y); + ctx.lineTo(left.x, left.y); + ctx.lineTo(dest.x, dest.y); + ctx.lineTo(right.x, right.y); + + ctx.closePath(); + ctx.strokeStyle = 'white'; + ctx.lineWidth = 3; + ctx.stroke(); + ctx.strokeStyle = 'black'; + ctx.lineWidth = 1; + ctx.stroke(); + ctx.fill(); +}; + +// PenMorph access: + +PenMorph.prototype.setHeading = function (degrees) { + this.heading = ((+degrees % 360) + 360) % 360; + this.fixLayout(); + this.rerender(); +}; + +PenMorph.prototype.numericalSetters = function () { + // for context menu demo purposes + return [ + 'setLeft', + 'setTop', + 'setWidth', + 'setHeight', + 'setAlphaScaled', + 'setHeading' + ]; +}; + +// PenMorph menu: + +PenMorph.prototype.developersMenu = function () { + var menu = PenMorph.uber.developersMenu.call(this); + menu.addLine(); + menu.addItem( + 'set rotation', + "setRotation", + 'interactively turn this morph\nusing a dial widget' + ); + return menu; +}; + +PenMorph.prototype.setRotation = function () { + var menu, dial, + name = this.name || this.constructor.name; + if (name.length > 10) { + name = name.slice(0, 9) + '...'; + } + menu = new MenuMorph(this, name); + dial = new DialMorph(null, null, this.heading); + dial.rootForGrab = () => dial; + dial.target = this; + dial.action = 'setHeading'; + menu.items.push(dial); + menu.addLine(); + menu.addItem('(90) right', () => this.setHeading(90)); + menu.addItem('(-90) left', () => this.setHeading(-90)); + menu.addItem('(0) up', () => this.setHeading(0)); + menu.addItem('(180) down', () => this.setHeading(180)); + menu.isDraggable = true; + menu.popUpAtHand(this.world()); +}; + +// PenMorph drawing: + +PenMorph.prototype.drawLine = function (start, dest) { + var context = this.parent.penTrails().getContext('2d'), + from = start.subtract(this.parent.bounds.origin), + to = dest.subtract(this.parent.bounds.origin); + if (this.isDown) { + context.lineWidth = this.size; + context.strokeStyle = this.color.toString(); + context.lineCap = 'round'; + context.lineJoin = 'round'; + context.beginPath(); + context.moveTo(from.x, from.y); + context.lineTo(to.x, to.y); + context.stroke(); + if (this.isWarped === false) { + this.world().broken.push( + start.rectangle(dest).expandBy( + Math.max(this.size / 2, 1) + ).intersect(this.parent.visibleBounds()).spread() + ); + } + } +}; + +// PenMorph turtle ops: + +PenMorph.prototype.turn = function (degrees) { + this.setHeading(this.heading + parseFloat(degrees)); +}; + +PenMorph.prototype.forward = function (steps) { + var start = this.center(), + dest, + dist = parseFloat(steps); + if (dist >= 0) { + dest = this.position().distanceAngle(dist, this.heading); + } else { + dest = this.position().distanceAngle( + Math.abs(dist), + (this.heading - 180) + ); + } + this.setPosition(dest); + this.drawLine(start, this.center()); +}; + +PenMorph.prototype.down = function () { + this.isDown = true; +}; + +PenMorph.prototype.up = function () { + this.isDown = false; +}; + +PenMorph.prototype.clear = function () { + this.parent.rerender(); +}; + +// PenMorph optimization for atomic recursion: + +PenMorph.prototype.startWarp = function () { + this.isWarped = true; +}; + +PenMorph.prototype.endWarp = function () { + this.isWarped = false; + this.parent.changed(); +}; + +PenMorph.prototype.warp = function (fun) { + this.startWarp(); + fun.call(this); + this.endWarp(); +}; + +PenMorph.prototype.warpOp = function (selector, argsArray) { + this.startWarp(); + this[selector].apply(this, argsArray); + this.endWarp(); +}; + +// PenMorph demo ops: +// try these with WARP eg.: this.warp(function () {tree(12, 120, 20)}) + +PenMorph.prototype.warpSierpinski = function (length, min) { + this.warpOp('sierpinski', [length, min]); +}; + +PenMorph.prototype.sierpinski = function (length, min) { + var i; + if (length > min) { + for (i = 0; i < 3; i += 1) { + this.sierpinski(length * 0.5, min); + this.turn(120); + this.forward(length); + } + } +}; + +PenMorph.prototype.warpTree = function (level, length, angle) { + this.warpOp('tree', [level, length, angle]); +}; + +PenMorph.prototype.tree = function (level, length, angle) { + if (level > 0) { + this.size = level; + this.forward(length); + this.turn(angle); + this.tree(level - 1, length * 0.75, angle); + this.turn(angle * -2); + this.tree(level - 1, length * 0.75, angle); + this.turn(angle); + this.forward(-length); + } +}; + +// ColorPaletteMorph /////////////////////////////////////////////////// + +var ColorPaletteMorph; + +// ColorPaletteMorph inherits from Morph: + +ColorPaletteMorph.prototype = new Morph(); +ColorPaletteMorph.prototype.constructor = ColorPaletteMorph; +ColorPaletteMorph.uber = Morph.prototype; + +// ColorPaletteMorph instance creation: + +function ColorPaletteMorph(target, sizePoint) { + this.init( + target || null, + sizePoint || new Point(80, 50) + ); +} + +ColorPaletteMorph.prototype.init = function (target, size) { + ColorPaletteMorph.uber.init.call(this); + this.isCachingImage = true; + this.target = target; + this.targetSetter = 'color'; + this.setExtent(size); + this.choice = null; +}; + +ColorPaletteMorph.prototype.render = function (ctx) { + var ext = this.extent(), + x, y, h, l; + + this.choice = BLACK; + for (x = 0; x <= ext.x; x += 1) { + h = 360 * x / ext.x; + for (y = 0; y <= ext.y; y += 1) { + l = 100 - (y / ext.y * 100); + ctx.fillStyle = 'hsl(' + h + ',100%,' + l + '%)'; + ctx.fillRect(x, y, 1, 1); + } + } +}; + +ColorPaletteMorph.prototype.mouseMove = function (pos) { + this.choice = this.getPixelColor(pos); + this.updateTarget(); +}; + +ColorPaletteMorph.prototype.mouseDownLeft = function (pos) { + this.choice = this.getPixelColor(pos); + this.updateTarget(); +}; + +ColorPaletteMorph.prototype.updateTarget = function () { + if (this.target instanceof Morph && this.choice !== null) { + if (this.target[this.targetSetter] instanceof Function) { + this.target[this.targetSetter](this.choice); + } else { + this.target[this.targetSetter] = this.choice; + this.target.rerender(); + } + } +}; + +// ColorPaletteMorph menu: + +ColorPaletteMorph.prototype.developersMenu = function () { + var menu = ColorPaletteMorph.uber.developersMenu.call(this); + menu.addLine(); + menu.addItem( + 'set target', + "setTarget", + 'choose another morph\nwhose color property\n will be' + + ' controlled by this one' + ); + return menu; +}; + +ColorPaletteMorph.prototype.setTarget = function () { + var choices = this.overlappedMorphs(), + menu = new MenuMorph(this, 'choose target:'); + + choices.push(this.world()); + choices.forEach(each => { + menu.addItem(each.toString().slice(0, 50), () => { + this.target = each; + this.setTargetSetter(); + }); + }); + if (choices.length === 1) { + this.target = choices[0]; + this.setTargetSetter(); + } else if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +ColorPaletteMorph.prototype.setTargetSetter = function () { + var choices = this.target.colorSetters(), + menu = new MenuMorph(this, 'choose target property:'); + + choices.forEach(each => { + menu.addItem(each, () => this.targetSetter = each); + }); + if (choices.length === 1) { + this.targetSetter = choices[0]; + } else if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +// GrayPaletteMorph /////////////////////////////////////////////////// + +var GrayPaletteMorph; + +// GrayPaletteMorph inherits from ColorPaletteMorph: + +GrayPaletteMorph.prototype = new ColorPaletteMorph(); +GrayPaletteMorph.prototype.constructor = GrayPaletteMorph; +GrayPaletteMorph.uber = ColorPaletteMorph.prototype; + +// GrayPaletteMorph instance creation: + +function GrayPaletteMorph(target, sizePoint) { + this.init( + target || null, + sizePoint || new Point(80, 10) + ); +} + +GrayPaletteMorph.prototype.render = function (ctx) { + var ext = this.extent(), + gradient; + + this.choice = BLACK; + gradient = ctx.createLinearGradient(0, 0, ext.x, ext.y); + gradient.addColorStop(0, 'black'); + gradient.addColorStop(1, 'white'); + ctx.fillStyle = gradient; + ctx.fillRect(0, 0, ext.x, ext.y); +}; + +// ColorPickerMorph /////////////////////////////////////////////////// + +// ColorPickerMorph inherits from Morph: + +ColorPickerMorph.prototype = new Morph(); +ColorPickerMorph.prototype.constructor = ColorPickerMorph; +ColorPickerMorph.uber = Morph.prototype; + +// ColorPickerMorph instance creation: + +function ColorPickerMorph(defaultColor) { + this.init(defaultColor || WHITE); +} + +ColorPickerMorph.prototype.init = function (defaultColor) { + this.choice = defaultColor; + ColorPickerMorph.uber.init.call(this); + this.color = WHITE; + this.setExtent(new Point(80, 80)); +}; + +ColorPickerMorph.prototype.fixLayout = function () { + var cpal, gpal, x, y; + + this.children.forEach(child => child.destroy()); + this.children = []; + this.feedback = new Morph(); + this.feedback.color = this.choice; + this.feedback.setExtent(new Point(20, 20)); + cpal = new ColorPaletteMorph( + this.feedback, + new Point(this.width(), 50) + ); + gpal = new GrayPaletteMorph( + this.feedback, + new Point(this.width(), 5) + ); + cpal.setPosition(this.bounds.origin); + this.add(cpal); + gpal.setPosition(cpal.bottomLeft()); + this.add(gpal); + x = (gpal.left() + + Math.floor((gpal.width() - this.feedback.width()) / 2)); + y = gpal.bottom() + Math.floor((this.bottom() - + gpal.bottom() - this.feedback.height()) / 2); + this.feedback.setPosition(new Point(x, y)); + this.add(this.feedback); +}; + +ColorPickerMorph.prototype.getChoice = function () { + return this.feedback.color; +}; + +ColorPickerMorph.prototype.rootForGrab = function () { + return this; +}; + +// BlinkerMorph //////////////////////////////////////////////////////// + +// can be used for text cursors + +var BlinkerMorph; + +// BlinkerMorph inherits from Morph: + +BlinkerMorph.prototype = new Morph(); +BlinkerMorph.prototype.constructor = BlinkerMorph; +BlinkerMorph.uber = Morph.prototype; + +// BlinkerMorph instance creation: + +function BlinkerMorph(rate) { + this.init(rate); +} + +BlinkerMorph.prototype.init = function (rate) { + BlinkerMorph.uber.init.call(this); + this.color = new Color(0, 0, 0); + this.fps = rate || 2; +}; + +// BlinkerMorph stepping: + +BlinkerMorph.prototype.step = function () { + this.toggleVisibility(); +}; + +// CursorMorph ///////////////////////////////////////////////////////// + +// I am a String/Text editing widget + +// CursorMorph: referenced constructors + +var CursorMorph; + +// CursorMorph inherits from BlinkerMorph: + +CursorMorph.prototype = new BlinkerMorph(); +CursorMorph.prototype.constructor = CursorMorph; +CursorMorph.uber = BlinkerMorph.prototype; + +// CursorMorph preferences settings: + +CursorMorph.prototype.viewPadding = 1; + +// CursorMorph instance creation: + +function CursorMorph(aStringOrTextMorph, aTextarea) { + this.init(aStringOrTextMorph, aTextarea); +} + +CursorMorph.prototype.init = function (aStringOrTextMorph, aTextarea) { + var ls; + + // additional properties: + this.keyDownEventUsed = false; + this.target = aStringOrTextMorph; + this.originalContents = this.target.text; + this.originalAlignment = this.target.alignment; + this.slot = this.target.text.length; + this.textarea = aTextarea; + + CursorMorph.uber.init.call(this); + + // override inherited defaults + ls = fontHeight(this.target.fontSize); + this.setExtent(new Point(Math.max(Math.floor(ls / 20), 1), ls)); + + if (this.target instanceof TextMorph && + (this.target.alignment !== 'left')) { + this.target.setAlignmentToLeft(); + } + this.textarea.value = this.target.text; + this.textarea.style.fontSize = this.target.fontSize + 'px'; + this.gotoSlot(this.slot); + this.updateTextAreaPosition(); + this.syncTextareaSelectionWith(this.target); +}; + +// CursorMorph event handling + + /* + There are three cases when the textarea gets inputs: + + 1. Inputs that represent special shortcuts of Snap!, so we + don't want the textarea to handle it. These events are captured in + "keydown" event handler. + + 2. inputs that change the content of the textarea, we need to update + the content of its target morph accordingly. This is handled in + the "input" event handler. + + 3. input that change the textarea without triggering an "input" event, + e.g. selection change, cursor movements. These are handled in the + "keyup" event handler. + + Note that some changes in case 2 are not caused by keyboards (for + example, select a word by clicking in IME window), so there are overlaps + between case 2 and case 3. but no one can replace the other. + */ + +CursorMorph.prototype.processKeyDown = function (event) { + /* Special shortcuts + - ctrl-d, ctrl-i and ctrl-p: doit, inspect it and print it + - tab: goto next text field + - esc: discard the editing + - enter / shift+enter: accept the editing + */ + var keyName = event.key, + shift = event.shiftKey, + singleLineText = this.target instanceof StringMorph, + dest; + + if (!isNil(this.target.receiver) && (event.ctrlKey || event.metaKey)) { + if (keyName === 'd') { + event.preventDefault(); + this.target.doIt(); + return; + } else if (keyName === 'i') { + event.preventDefault(); + this.target.inspectIt(); + return; + } else if (keyName === 'p') { + event.preventDefault(); + this.target.showIt(); + return; + } + } + + if (keyName === 'Tab' || keyName === 'U+0009') { + if (shift) { + this.target.backTab(this.target); + } else { + this.target.tab(this.target); + } + event.preventDefault(); + this.target.escalateEvent('reactToEdit', this.target); + } else if (keyName === 'Escape') { + this.cancel(); + } else if (keyName === "Enter" && (singleLineText || shift)) { + this.accept(); + } else { + // catch "up arrow" and "down arrow" keys + if (keyName === 'ArrowDown') { + dest = this.target.downFrom(this.slot); + this.textarea.setSelectionRange(dest, dest); + // to do: allow holding shift to select + event.preventDefault(); + } + if (keyName === 'ArrowUp') { + dest = this.target.upFrom(this.slot); + this.textarea.setSelectionRange(dest, dest); + // to do: allow holding shift to select + event.preventDefault(); + } + this.target.escalateEvent('reactToKeystroke', event); + } +}; + +CursorMorph.prototype.processKeyUp = function (event) { + // handle selection change and cursor position change. + var textarea = this.textarea, + target = this.target; + + if (textarea.selectionStart === textarea.selectionEnd) { + target.startMark = null; + target.endMark = null; + } else { + if (textarea.selectionDirection === 'backward') { + target.startMark = textarea.selectionEnd; + target.endMark = textarea.selectionStart; + } else { + target.startMark = textarea.selectionStart; + target.endMark = textarea.selectionEnd; + } + } + target.fixLayout(); + target.rerender(); + this.gotoSlot(textarea.selectionEnd); +}; + +CursorMorph.prototype.processInput = function (event) { + // handle content change. + var target = this.target, + textarea = this.textarea, + filteredContent, + caret; + + // filter invalid chars for numeric fields + function filterText (content) { + var points = 0, + hasE = false, + result = '', + i, ch, valid; + for (i = 0; i < content.length; i += 1) { + ch = content.charAt(i); + valid = ( + ('0' <= ch && ch <= '9') || // digits + (ch.toLowerCase() === 'e') || // scientific notation + ((i === 0 || hasE) && ch === '-') || // leading '-' or sc. not. + (ch === '.' && points === 0) // at most '.' + ); + if (valid) { + result += ch; + if (ch === '.') { + points += 1; + } + if (ch.toLowerCase() === 'e') { + hasE = true; + } + } + } + return result; + } + + if (target.isNumeric) { + filteredContent = filterText(textarea.value); + } else { + filteredContent = textarea.value; + } + + if (filteredContent.length < textarea.value.length) { + textarea.value = filteredContent; + caret = Math.min(textarea.selectionStart, filteredContent.length); + textarea.selectionEnd = caret; + textarea.selectionStart = caret; + } + // target morph: copy the content and selection status to the target. + target.text = filteredContent; + + if (textarea.selectionStart === textarea.selectionEnd) { + target.startMark = null; + target.endMark = null; + } else { + if (textarea.selectionDirection === 'backward') { + target.startMark = textarea.selectionEnd; + target.endMark = textarea.selectionStart; + } else { + target.startMark = textarea.selectionStart; + target.endMark = textarea.selectionEnd; + } + } + target.changed(); + target.fixLayout(); + target.rerender(); + + // cursor morph: copy the caret position to cursor morph. + this.gotoSlot(textarea.selectionStart); + + this.updateTextAreaPosition(); + + // the "reactToInput" event gets triggered AFTER "reactToKeystroke" + this.target.escalateEvent('reactToInput', event); +}; + +// CursorMorph synching: + +CursorMorph.prototype.updateTextAreaPosition = function () { + var pos = getDocumentPositionOf(this.target.world().worldCanvas), + origin = this.target.bounds.origin.add(new Point(pos.x, pos.y)); + + function number2px (n) { + return Math.ceil(n) + 'px'; + } + + this.textarea.style.top = number2px(origin.y); + this.textarea.style.left = number2px(origin.x); +}; + +CursorMorph.prototype.syncTextareaSelectionWith = function (targetMorph) { + var start = targetMorph.startMark, + end = targetMorph.endMark; + + if (start === end) { + this.textarea.setSelectionRange(this.slot, this.slot, 'none'); + } else if (start < end) { + this.textarea.setSelectionRange(start, end, 'forward'); + } else { + this.textarea.setSelectionRange(end, start, 'backward'); + } + this.textarea.focus(); +}; + +// CursorMorph navigation: + +CursorMorph.prototype.gotoSlot = function (slot) { + var length = this.target.text.length, + pos = this.target.slotPosition(slot), + right, + left; + this.slot = slot < 0 ? 0 : slot > length ? length : slot; + if (this.parent && this.target.isScrollable) { + right = this.parent.right() - this.viewPadding; + left = this.parent.left() + this.viewPadding; + if (pos.x > right) { + this.target.setLeft(this.target.left() + right - pos.x); + pos.x = right; + } + if (pos.x < left) { + left = Math.min(this.parent.left(), left); + this.target.setLeft(this.target.left() + left - pos.x); + pos.x = left; + } + if (this.target.right() < right && + right - this.target.width() < left) { + pos.x += right - this.target.right(); + this.target.setRight(right); + } + } + this.show(); + this.setPosition(pos); + if (this.parent + && this.parent.parent instanceof ScrollFrameMorph + && this.target.isScrollable) { + this.parent.parent.scrollCursorIntoView(this); + } +}; + +CursorMorph.prototype.gotoPos = function (aPoint) { + this.gotoSlot(this.target.slotAt(aPoint)); + this.show(); +}; + +// CursorMorph selecting: + +CursorMorph.prototype.updateSelection = function (shift) { + if (shift) { + if (isNil(this.target.endMark) && isNil(this.target.startMark)) { + this.target.startMark = this.slot; + this.target.endMark = this.slot; + } else if (this.target.endMark !== this.slot) { + this.target.endMark = this.slot; + this.target.changed(); + } + } else { + this.target.clearSelection(); + } +}; + +// CursorMorph editing: + +CursorMorph.prototype.accept = function () { + var world = this.root(); + if (world) { + world.stopEditing(); + } + this.escalateEvent('accept', this); +}; + +CursorMorph.prototype.cancel = function () { + var world = this.root(); + this.undo(); + if (world) { + world.stopEditing(); + } + this.escalateEvent('cancel', this); +}; + +CursorMorph.prototype.undo = function () { + this.target.text = this.originalContents; + this.target.changed(); + this.target.fixLayout(); + this.target.changed(); + this.gotoSlot(0); +}; + +// CursorMorph destroying: + +CursorMorph.prototype.destroy = function () { + if (this.target.alignment !== this.originalAlignment) { + this.target.alignment = this.originalAlignment; + this.target.changed(); + } + CursorMorph.uber.destroy.call(this); + this.target.world().resetKeyboardHandler(); +}; + +// BoxMorph //////////////////////////////////////////////////////////// + +// I can have an optionally rounded border + +var BoxMorph; + +// BoxMorph inherits from Morph: + +BoxMorph.prototype = new Morph(); +BoxMorph.prototype.constructor = BoxMorph; +BoxMorph.uber = Morph.prototype; + +// BoxMorph instance creation: + +function BoxMorph(edge, border, borderColor) { + this.init(edge, border, borderColor); +} + +BoxMorph.prototype.init = function (edge, border, borderColor) { + this.edge = edge || 4; + this.border = border || ((border === 0) ? 0 : 2); + this.borderColor = borderColor || BLACK; + BoxMorph.uber.init.call(this); +}; + +// BoxMorph drawing: + +BoxMorph.prototype.render = function (ctx) { + if ((this.edge === 0) && (this.border === 0)) { + BoxMorph.uber.render.call(this, ctx); + return; + } + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + this.outlinePath( + ctx, + Math.max(this.edge - this.border, 0), + this.border + ); + ctx.closePath(); + ctx.fill(); + if (this.border > 0) { + ctx.lineWidth = this.border; + ctx.strokeStyle = this.borderColor.toString(); + ctx.beginPath(); + this.outlinePath(ctx, this.edge, this.border / 2); + ctx.closePath(); + ctx.stroke(); + } +}; + +BoxMorph.prototype.outlinePath = function (ctx, corner, inset) { + var w = this.width(), + h = this.height(), + radius = Math.min(corner, (Math.min(w, h) - inset) / 2), + offset = radius + inset; + + // top left: + ctx.arc( + offset, + offset, + radius, + radians(-180), + radians(-90), + false + ); + // top right: + ctx.arc( + w - offset, + offset, + radius, + radians(-90), + radians(-0), + false + ); + // bottom right: + ctx.arc( + w - offset, + h - offset, + radius, + radians(0), + radians(90), + false + ); + // bottom left: + ctx.arc( + offset, + h - offset, + radius, + radians(90), + radians(180), + false + ); +}; + +// BoxMorph menus: + +BoxMorph.prototype.developersMenu = function () { + var menu = BoxMorph.uber.developersMenu.call(this); + menu.addLine(); + menu.addItem( + "border width...", + () => { + this.prompt( + menu.title + '\nborder\nwidth:', + this.setBorderWidth, + this, + this.border.toString(), + null, + 0, + 100, + true + ); + }, + 'set the border\'s\nline size' + ); + menu.addItem( + "border color...", + () => { + this.pickColor( + menu.title + '\nborder color:', + this.setBorderColor, + this, + this.borderColor + ); + }, + 'set the border\'s\nline color' + ); + menu.addItem( + "corner size...", + () => { + this.prompt( + menu.title + '\ncorner\nsize:', + this.setCornerSize, + this, + this.edge.toString(), + null, + 0, + 100, + true + ); + }, + 'set the corner\'s\nradius' + ); + return menu; +}; + +BoxMorph.prototype.setBorderWidth = function (size) { + // for context menu demo purposes + var newSize; + if (typeof size === 'number') { + this.border = Math.max(size, 0); + } else { + newSize = parseFloat(size); + if (!isNaN(newSize)) { + this.border = Math.max(newSize, 0); + } + } + this.changed(); +}; + +BoxMorph.prototype.setBorderColor = function (color) { + // for context menu demo purposes + if (color) { + this.borderColor = color; + this.changed(); + } +}; + +BoxMorph.prototype.setCornerSize = function (size) { + // for context menu demo purposes + var newSize; + if (typeof size === 'number') { + this.edge = Math.max(size, 0); + } else { + newSize = parseFloat(size); + if (!isNaN(newSize)) { + this.edge = Math.max(newSize, 0); + } + } + this.changed(); +}; + +BoxMorph.prototype.colorSetters = function () { + // for context menu demo purposes + return ['color', 'borderColor']; +}; + +BoxMorph.prototype.numericalSetters = function () { + // for context menu demo purposes + var list = BoxMorph.uber.numericalSetters.call(this); + list.push('setBorderWidth', 'setCornerSize'); + return list; +}; + +// SpeechBubbleMorph /////////////////////////////////////////////////// + +/* + I am a comic-style speech bubble that can display either a string, + a Morph, a Canvas or a toString() representation of anything else. + If I am invoked using popUp() I behave like a tool tip. +*/ + +// SpeechBubbleMorph: referenced constructors + +var SpeechBubbleMorph; + +// SpeechBubbleMorph inherits from BoxMorph: + +SpeechBubbleMorph.prototype = new BoxMorph(); +SpeechBubbleMorph.prototype.constructor = SpeechBubbleMorph; +SpeechBubbleMorph.uber = BoxMorph.prototype; + +// SpeechBubbleMorph instance creation: + +function SpeechBubbleMorph( + contents, + color, + edge, + border, + borderColor, + padding, + isThought, + noShadow +) { + this.init( + contents, + color, + edge, + border, + borderColor, + padding, + isThought, + noShadow + ); +} + +SpeechBubbleMorph.prototype.init = function ( + contents, + color, + edge, + border, + borderColor, + padding, + isThought, // bool or anything but "true" to draw no hook at all + noShadow // explicit TRUE to suppress +) { + this.isPointingRight = true; // orientation of text + this.contents = contents || ''; + this.padding = padding || 0; // additional vertical pixels + this.isThought = isThought || false; // draw "think" bubble + this.isClickable = false; + SpeechBubbleMorph.uber.init.call( + this, + edge || 6, + border || ((border === 0) ? 0 : 1), + borderColor || new Color(140, 140, 140) + ); + this.hasShadow = noShadow !== true; + this.noDropShadow = true; + this.fullShadowSource = false; + this.color = color || new Color(230, 230, 230); + this.fixLayout(); +}; + +// SpeechBubbleMorph invoking: + +SpeechBubbleMorph.prototype.popUp = function (world, pos, isClickable) { + this.fixLayout(); + this.setPosition(pos.subtract(new Point(0, this.height()))); + this.keepWithin(world); + world.add(this); + this.fullChanged(); + world.hand.destroyTemporaries(); + world.hand.temporaries.push(this); + + if (!isClickable) { + this.mouseEnter = this.destroy; + } else { + this.isClickable = true; + } +}; + +// SpeechBubbleMorph drawing: + +SpeechBubbleMorph.prototype.fixLayout = function () { + // determine my extent and arrange my contents + + if (this.contentsMorph) { + this.contentsMorph.destroy(); + } + if (this.contents instanceof Morph) { + this.contentsMorph = this.contents; + } else if (isString(this.contents)) { + this.contentsMorph = new TextMorph( + this.contents, + MorphicPreferences.bubbleHelpFontSize, + null, + false, + true, + 'center' + ); + } else if (this.contents instanceof HTMLCanvasElement) { + this.contentsMorph = new Morph(); + this.contentsMorph.setExtent(new Point( + this.contents.width, + this.contents.height + )); + this.contentsMorph.cachedImage = this.contents; + } else { + this.contentsMorph = new TextMorph( + this.contents.toString(), + MorphicPreferences.bubbleHelpFontSize, + null, + false, + true, + 'center' + ); + } + this.add(this.contentsMorph); + + // adjust my layout + this.bounds.setExtent( + new Point( + this.contentsMorph.width() + + (this.padding ? this.padding * 2 : this.edge * 2), + this.contentsMorph.height() + + this.edge + + this.border * 2 + + this.padding * 2 + + 2 + ) + ); + + // position my contents + this.contentsMorph.setPosition(this.position().add( + new Point( + this.padding || this.edge, + this.border + this.padding + 1 + ) + )); + + // refresh a shallow shadow + if (this.hasShadow) { + this.removeShadow(); + this.addShadow(new Point(2, 2), 80); + } +}; + +SpeechBubbleMorph.prototype.outlinePath = function (ctx, radius, inset) { + var offset = radius + inset, + w = this.width(), + h = this.height(), + rad; + + function circle(x, y, r) { + ctx.moveTo(x + r, y); + ctx.arc(x, y, r, radians(0), radians(360)); + } + + // top left: + ctx.arc( + offset, + offset, + radius, + radians(-180), + radians(-90), + false + ); + // top right: + ctx.arc( + w - offset, + offset, + radius, + radians(-90), + radians(-0), + false + ); + // bottom right: + ctx.arc( + w - offset, + h - offset - radius, + radius, + radians(0), + radians(90), + false + ); + if (!this.isThought) { // draw speech bubble hook + if (this.isPointingRight) { + ctx.lineTo( + offset + radius, + h - offset + ); + ctx.lineTo( + radius / 2 + inset, + h - inset + ); + } else { // pointing left + ctx.lineTo( + w - (radius / 2 + inset), + h - inset + ); + ctx.lineTo( + w - (offset + radius), + h - offset + ); + } + } + // bottom left: + ctx.arc( + offset, + h - offset - radius, + radius, + radians(90), + radians(180), + false + ); + if (this.isThought === true) { // use anything but "true" to draw nothing + // close large bubble: + ctx.lineTo( + inset, + offset + ); + // draw thought bubbles: + if (this.isPointingRight) { + // tip bubble: + rad = radius / 4; + circle( + rad + inset, + h - rad - inset, + rad + ); + // middle bubble: + rad = radius / 3.2; + circle( + (rad * 2) + inset, + h - rad - (inset * 2), + rad + ); + // top bubble: + rad = radius / 2.8; + circle( + (rad * 3) + inset * 2, + h - rad - (inset * 4), + rad + ); + } else { // pointing left + // tip bubble: + rad = radius / 4; + circle( + w - (rad + inset), + h - rad - inset, + rad + ); + // middle bubble: + rad = radius / 3.2; + circle( + w - (rad * 2 + inset), + h - rad - inset * 2, + rad + ); + // top bubble: + rad = radius / 2.8; + circle( + w - (rad * 3 + inset * 2), + h - rad - inset * 4, + rad + ); + } + } +}; + +// SpeechBubbleMorph shadow + +/* + only take the 'plain' image, so the box rounding and the + shadow doesn't become conflicted by embedded scrolling panes +*/ + +SpeechBubbleMorph.prototype.shadowImage = function (off, color) { + // for "flat" design mode + var fb, img, outline, sha, ctx, + offset = off || new Point(7, 7), + clr = color || new Color(0, 0, 0); + fb = this.extent(); + img = this.getImage(); + outline = newCanvas(fb); + ctx = outline.getContext('2d'); + ctx.drawImage(img, 0, 0); + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage( + img, + -offset.x, + -offset.y + ); + sha = newCanvas(fb); + ctx = sha.getContext('2d'); + ctx.drawImage(outline, 0, 0); + ctx.globalCompositeOperation = 'source-atop'; + ctx.fillStyle = clr.toString(); + ctx.fillRect(0, 0, fb.x, fb.y); + return sha; +}; + +SpeechBubbleMorph.prototype.shadowImageBlurred = function (off, color) { + var fb, img, sha, ctx, + offset = off || new Point(7, 7), + blur = this.shadowBlur, + clr = color || new Color(0, 0, 0); + fb = this.extent().add(blur * 2); + img = this.getImage(); + sha = newCanvas(fb); + ctx = sha.getContext('2d'); + ctx.shadowOffsetX = offset.x; + ctx.shadowOffsetY = offset.y; + ctx.shadowBlur = blur; + ctx.shadowColor = clr.toString(); + ctx.drawImage( + img, + blur - offset.x, + blur - offset.y + ); + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage( + img, + blur - offset.x, + blur - offset.y + ); + return sha; +}; + +// DialMorph ////////////////////////////////////////////////////// + +// I am a knob than can be turned to select a number + +var DialMorph; + +// DialMorph inherits from Morph: + +DialMorph.prototype = new Morph(); +DialMorph.prototype.constructor = DialMorph; +DialMorph.uber = Morph.prototype; + +function DialMorph(min, max, value, tick, radius) { + this.init(min, max, value, tick, radius); +} + +DialMorph.prototype.init = function (min, max, value, tick, radius) { + this.target = null; + this.action = null; + this.min = min || 0; + this.max = max || 360; + this.value = Math.max(this.min, (value || 0) % this.max); + this.tick = tick || 15; + this.fillColor = null; + + DialMorph.uber.init.call(this); + + this.color = new Color(230, 230, 230); + this.setRadius(radius || MorphicPreferences.menuFontSize * 4); +}; + +DialMorph.prototype.setRadius = function (radius) { + this.radius = radius; + this.setExtent(new Point(this.radius * 2, this.radius * 2)); +}; + +DialMorph.prototype.setValue = function (value, snapToTick, noUpdate) { + var range = this.max - this.min; + value = value || 0; + this.value = this.min + (((+value % range) + range) % range); + if (snapToTick) { + if (this.value < this.tick) { + this.value = this.min; + } else { + this.value -= this.value % this.tick % this.value; + } + } + this.changed(); + if (noUpdate) {return; } + this.updateTarget(); +}; + +DialMorph.prototype.getValueOf = function (point) { + var range = this.max - this.min, + center = this.center(), + deltaX = point.x - center.x, + deltaY = center.y - point.y, + angle = Math.abs(deltaX) < 0.001 ? (deltaY < 0 ? 90 : 270) + : Math.round( + (deltaX >= 0 ? 0 : 180) + - (Math.atan(deltaY / deltaX) * 57.2957795131) + ), + value = angle + 90 % 360, + ratio = value / 360; + return range * ratio + this.min; +}; + +DialMorph.prototype.setExtent = function (aPoint) { + var size = Math.min(aPoint.x, aPoint.y); + this.radius = size / 2; + DialMorph.uber.setExtent.call(this, new Point(size, size)); +}; + +DialMorph.prototype.render = function (ctx) { + var i, angle, x1, y1, x2, y2, + light = this.color.lighter().toString(), + range = this.max - this.min, + ticks = range / this.tick, + face = this.radius * 0.75, + inner = face * 0.85, + outer = face * 0.95; + + // draw a light border: + ctx.fillStyle = light; + ctx.beginPath(); + ctx.arc( + this.radius, + this.radius, + face + Math.min(1, this.radius - face), + 0, + 2 * Math.PI, + false + ); + ctx.closePath(); + ctx.fill(); + + // fill circle: + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + ctx.arc( + this.radius, + this.radius, + face, + 0, + 2 * Math.PI, + false + ); + ctx.closePath(); + ctx.fill(); + + // fill value + angle = (this.value - this.min) * (Math.PI * 2) / range - Math.PI / 2; + ctx.fillStyle = (this.fillColor || this.color.darker()).toString(); + ctx.beginPath(); + ctx.arc( + this.radius, + this.radius, + face, + Math.PI / -2, + angle, + false + ); + ctx.lineTo(this.radius, this.radius); + ctx.closePath(); + ctx.fill(); + + // draw ticks: + ctx.strokeStyle = new Color(35, 35, 35).toString(); + ctx.lineWidth = 1; + for (i = 0; i < ticks; i += 1) { + angle = (i - 3) * (Math.PI * 2) / ticks - Math.PI / 2; + ctx.beginPath(); + x1 = this.radius + Math.cos(angle) * inner; + y1 = this.radius + Math.sin(angle) * inner; + x2 = this.radius + Math.cos(angle) * outer; + y2 = this.radius + Math.sin(angle) * outer; + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + } + + // draw a filled center: + inner = face * 0.05; + ctx.fillStyle = 'black'; + ctx.beginPath(); + ctx.arc( + this.radius, + this.radius, + inner, + 0, + 2 * Math.PI, + false + ); + ctx.closePath(); + ctx.fill(); + + // draw the inner hand: + ctx.strokeStyle = 'black'; + ctx.lineWidth = 1; + angle = (this.value - this.min) * (Math.PI * 2) / range - Math.PI / 2; + outer = face * 0.8; + x1 = this.radius + Math.cos(angle) * inner; + y1 = this.radius + Math.sin(angle) * inner; + x2 = this.radius + Math.cos(angle) * outer; + y2 = this.radius + Math.sin(angle) * outer; + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.stroke(); + + // draw a read-out circle: + inner = inner * 2; + x2 = this.radius + Math.cos(angle) * (outer + inner); + y2 = this.radius + Math.sin(angle) * (outer + inner); + ctx.fillStyle = 'black'; + ctx.beginPath(); + ctx.arc( + x2, + y2, + inner, + 0, + 2 * Math.PI, + false + ); + ctx.closePath(); + ctx.stroke(); + + // draw the outer hand: + angle = (this.value - this.min) * (Math.PI * 2) / range - Math.PI / 2; + x1 = this.radius + Math.cos(angle) * face; + y1 = this.radius + Math.sin(angle) * face; + x2 = this.radius + Math.cos(angle) * (this.radius - 1); + y2 = this.radius + Math.sin(angle) * (this.radius - 1); + ctx.beginPath(); + ctx.moveTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.lineWidth = 3; + ctx.strokeStyle = light; + ctx.stroke(); + ctx.lineWidth = 1; + ctx.strokeStyle = 'black'; + ctx.stroke(); + + // draw arrow tip: + angle = radians(degrees(angle) - 4); + x1 = this.radius + Math.cos(angle) * this.radius * 0.9; + y1 = this.radius + Math.sin(angle) * this.radius * 0.9; + ctx.beginPath(); + ctx.moveTo(x1, y1); + angle = radians(degrees(angle) + 8); + x1 = this.radius + Math.cos(angle) * this.radius * 0.9; + y1 = this.radius + Math.sin(angle) * this.radius * 0.9; + ctx.lineTo(x1, y1); + ctx.lineTo(x2, y2); + ctx.closePath(); + ctx.lineWidth = 3; + ctx.strokeStyle = light; + ctx.stroke(); + ctx.lineWidth = 1; + ctx.strokeStyle = 'black'; + ctx.stroke(); + ctx.fill(); +}; + +// DialMorph stepping: + +DialMorph.prototype.step = null; + +DialMorph.prototype.mouseDownLeft = function (pos) { + var world = this.root(); + + this.step = () => { + if (world.hand.mouseButton) { + this.setValue( + this.getValueOf(world.hand.bounds.origin), + world.currentKey !== 16 // snap to tick + ); + } else { + this.step = null; + } + }; +}; + +// DialMorph menu: + +DialMorph.prototype.developersMenu = function () { + var menu = DialMorph.uber.developersMenu.call(this); + menu.addLine(); + menu.addItem( + 'set target', + "setTarget", + 'select another morph\nwhose numerical property\nwill be ' + + 'controlled by this one' + ); + return menu; +}; + +DialMorph.prototype.setTarget = function () { + var choices = this.overlappedMorphs(), + menu = new MenuMorph(this, 'choose target:'); + + choices.push(this.world()); + choices.forEach(each => { + menu.addItem(each.toString().slice(0, 50), () => { + this.target = each; + this.setTargetSetter(); + }); + }); + if (choices.length === 1) { + this.target = choices[0]; + this.setTargetSetter(); + } else if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +DialMorph.prototype.setTargetSetter = function () { + var choices = this.target.numericalSetters(), + menu = new MenuMorph(this, 'choose target property:'); + + choices.forEach(each => { + menu.addItem(each, () => this.action = each); + }); + if (choices.length === 1) { + this.action = choices[0]; + } else if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +DialMorph.prototype.updateTarget = function () { + if (this.action) { + if (typeof this.action === 'function') { + this.action.call(this.target, this.value); + } else { // assume it's a String + this.target[this.action](this.value); + } + } +}; + +// CircleBoxMorph ////////////////////////////////////////////////////// + +// I can be used for sliders + +var CircleBoxMorph; + +// CircleBoxMorph inherits from Morph: + +CircleBoxMorph.prototype = new Morph(); +CircleBoxMorph.prototype.constructor = CircleBoxMorph; +CircleBoxMorph.uber = Morph.prototype; + +function CircleBoxMorph(orientation) { + this.init(orientation || 'vertical'); +} + +CircleBoxMorph.prototype.init = function (orientation) { + CircleBoxMorph.uber.init.call(this); + this.orientation = orientation; + this.autoOrient = true; + this.setExtent(new Point(20, 100)); +}; + +CircleBoxMorph.prototype.autoOrientation = function () { + if (this.height() > this.width()) { + this.orientation = 'vertical'; + } else { + this.orientation = 'horizontal'; + } +}; + +CircleBoxMorph.prototype.render = function (ctx) { + var w = this.width(), + h = this.height(), + radius; + + if (this.autoOrient) { + this.autoOrientation(); + } + + if (this.orientation === 'vertical') { + radius = w / 2; + ctx.beginPath(); + + // top semi-circle + ctx.arc( + radius, + radius, + radius, + radians(180), + radians(0), + false + ); + + // right line + ctx.lineTo( + w, + h - radius + ); + + // bottom semi-circle + ctx.arc( + radius, + h - radius, + radius, + radians(0), + radians(180), + false + ); + + } else { + radius = h / 2; + ctx.beginPath(); + + // left semi-circle + ctx.arc( + radius, + radius, + radius, + radians(90), + radians(-90), + false + ); + + // top line + ctx.lineTo( + w - radius, + 0 + ); + + // right semi-circle + ctx.arc( + w - radius, + radius, + radius, + radians(-90), + radians(90), + false + ); + } + ctx.closePath(); + ctx.fillStyle = this.color.toString(); + ctx.fill(); +}; + +// CircleBoxMorph menu: + +CircleBoxMorph.prototype.developersMenu = function () { + var menu = CircleBoxMorph.uber.developersMenu.call(this); + menu.addLine(); + if (this.orientation === 'vertical') { + menu.addItem( + "horizontal...", + 'toggleOrientation', + 'toggle the\norientation' + ); + } else { + menu.addItem( + "vertical...", + 'toggleOrientation', + 'toggle the\norientation' + ); + } + return menu; +}; + +CircleBoxMorph.prototype.toggleOrientation = function () { + var center = this.center(); + this.changed(); + if (this.orientation === 'vertical') { + this.orientation = 'horizontal'; + } else { + this.orientation = 'vertical'; + } + this.setExtent(new Point(this.height(), this.width())); + this.setCenter(center); +}; + +// SliderButtonMorph /////////////////////////////////////////////////// + +var SliderButtonMorph; + +// SliderButtonMorph inherits from CircleBoxMorph: + +SliderButtonMorph.prototype = new CircleBoxMorph(); +SliderButtonMorph.prototype.constructor = SliderButtonMorph; +SliderButtonMorph.uber = CircleBoxMorph.prototype; + +function SliderButtonMorph(orientation) { + this.init(orientation); +} + +SliderButtonMorph.prototype.init = function (orientation) { + this.color = new Color(80, 80, 80); + this.highlightColor = new Color(90, 90, 140); + this.pressColor = new Color(80, 80, 160); + this.userState = 'normal'; // 'highlight', 'pressed' + this.is3D = false; + this.hasMiddleDip = true; + SliderButtonMorph.uber.init.call(this, orientation); +}; + +SliderButtonMorph.prototype.autoOrientation = nop; + +SliderButtonMorph.prototype.render = function (ctx) { + var colorBak = this.color; + if (this.userState === 'highlight') { + this.color = this.highlightColor; + } else if (this.userState === 'pressed') { + this.color = this.pressColor; + } + SliderButtonMorph.uber.render.call(this, ctx); + if (this.is3D || !MorphicPreferences.isFlat) { + this.renderEdges(ctx); + } + this.color = colorBak; +}; + +SliderButtonMorph.prototype.renderEdges = function (ctx) { + var gradient, + radius, + w = this.width(), + h = this.height(); + + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + if (this.orientation === 'vertical') { + ctx.lineWidth = w / 3; + gradient = ctx.createLinearGradient( + 0, + 0, + ctx.lineWidth, + 0 + ); + gradient.addColorStop(0, 'white'); + gradient.addColorStop(1, this.color.toString()); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(ctx.lineWidth * 0.5, w / 2); + ctx.lineTo(ctx.lineWidth * 0.5, h - w / 2); + ctx.stroke(); + + gradient = ctx.createLinearGradient( + w - ctx.lineWidth, + 0, + w, + 0 + ); + gradient.addColorStop(0, this.color.toString()); + gradient.addColorStop(1, 'black'); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(w - ctx.lineWidth * 0.5, w / 2); + ctx.lineTo(w - ctx.lineWidth * 0.5, h - w / 2); + ctx.stroke(); + + if (this.hasMiddleDip) { + gradient = ctx.createLinearGradient( + ctx.lineWidth, + 0, + w - ctx.lineWidth, + 0 + ); + + radius = w / 4; + gradient.addColorStop(0, 'black'); + gradient.addColorStop(0.35, this.color.toString()); + gradient.addColorStop(0.65, this.color.toString()); + gradient.addColorStop(1, 'white'); + + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc( + w / 2, + h / 2, + radius, + radians(0), + radians(360), + false + ); + ctx.closePath(); + ctx.fill(); + } + } else if (this.orientation === 'horizontal') { + ctx.lineWidth = h / 3; + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + ctx.lineWidth + ); + gradient.addColorStop(0, 'white'); + gradient.addColorStop(1, this.color.toString()); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(h / 2, ctx.lineWidth * 0.5); + ctx.lineTo(w - h / 2, ctx.lineWidth * 0.5); + ctx.stroke(); + + gradient = ctx.createLinearGradient( + 0, + h - ctx.lineWidth, + 0, + h + ); + gradient.addColorStop(0, this.color.toString()); + gradient.addColorStop(1, 'black'); + + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(h / 2, h - ctx.lineWidth * 0.5); + ctx.lineTo(w - h / 2, h - ctx.lineWidth * 0.5); + ctx.stroke(); + + if (this.hasMiddleDip) { + gradient = ctx.createLinearGradient( + 0, + ctx.lineWidth, + 0, + h - ctx.lineWidth + ); + + radius = h / 4; + gradient.addColorStop(0, 'black'); + gradient.addColorStop(0.35, this.color.toString()); + gradient.addColorStop(0.65, this.color.toString()); + gradient.addColorStop(1, 'white'); + + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc( + this.width() / 2, + this.height() / 2, + radius, + radians(0), + radians(360), + false + ); + ctx.closePath(); + ctx.fill(); + } + } +}; + +//SliderButtonMorph events: + +SliderButtonMorph.prototype.mouseEnter = function () { + this.userState = 'highlight'; + this.rerender(); +}; + +SliderButtonMorph.prototype.mouseLeave = function () { + this.userState = 'normal'; + this.rerender(); +}; + +SliderButtonMorph.prototype.mouseDownLeft = function (pos) { + this.userState = 'pressed'; + this.rerender(); + this.escalateEvent('mouseDownLeft', pos); +}; + +SliderButtonMorph.prototype.mouseClickLeft = function () { + this.userState = 'highlight'; + this.rerender(); +}; + +SliderButtonMorph.prototype.mouseMove = function () { + // prevent my parent from getting picked up + nop(); +}; + +// SliderMorph /////////////////////////////////////////////////// + +// SliderMorph inherits from CircleBoxMorph: + +SliderMorph.prototype = new CircleBoxMorph(); +SliderMorph.prototype.constructor = SliderMorph; +SliderMorph.uber = CircleBoxMorph.prototype; + +function SliderMorph(start, stop, value, size, orientation, color) { + this.init( + start || 0, + stop || 100, + value || 0, + size || 10, + orientation || 'vertical', + color + ); +} + +SliderMorph.prototype.init = function ( + start, + stop, + value, + size, + orientation, + color +) { + this.target = null; + this.action = null; + this.start = start; + this.stop = stop; + this.value = value; + this.size = size; + this.offset = null; + this.button = new SliderButtonMorph(); + this.button.isDraggable = false; + this.button.alpha = MorphicPreferences.isFlat ? 0.7 : 1; + this.button.color = new Color(200, 200, 200); + this.button.highlightColor = new Color(210, 210, 255); + this.button.pressColor = new Color(180, 180, 255); + SliderMorph.uber.init.call(this, orientation); + this.add(this.button); + this.alpha = MorphicPreferences.isFlat ? 0 : 0.3; + this.color = color || new Color(0, 0, 0); + this.setExtent(new Point(20, 100)); + this.fixLayout(); +}; + +SliderMorph.prototype.autoOrientation = nop; + +SliderMorph.prototype.rangeSize = function () { + return this.stop - this.start; +}; + +SliderMorph.prototype.ratio = function () { + return this.size / (this.rangeSize() + 1); +}; + +SliderMorph.prototype.unitSize = function () { + if (this.orientation === 'vertical') { + return (this.height() - this.button.height()) / + this.rangeSize(); + } + return (this.width() - this.button.width()) / + this.rangeSize(); +}; + +SliderMorph.prototype.fixLayout = function () { + var bw, bh, posX, posY; + + this.button.orientation = this.orientation; + if (this.orientation === 'vertical') { + bw = this.width() - 2; + bh = Math.max(bw, Math.round(this.height() * this.ratio())); + this.button.setExtent(new Point(bw, bh)); + posX = 1; + posY = Math.max( + Math.min( + Math.round((this.value - this.start) * this.unitSize()), + this.height() - this.button.height() + ), + 0 + ); + } else { + bh = this.height() - 2; + bw = Math.max(bh, Math.round(this.width() * this.ratio())); + this.button.setExtent(new Point(bw, bh)); + posY = 1; + posX = Math.max( + Math.min( + Math.round((this.value - this.start) * this.unitSize()), + this.width() - this.button.width() + ), + 0 + ); + } + this.button.setPosition( + new Point(posX, posY).add(this.bounds.origin) + ); +}; + +SliderMorph.prototype.updateValue = function () { + var relPos; + if (this.orientation === 'vertical') { + relPos = this.button.top() - this.top(); + } else { + relPos = this.button.left() - this.left(); + } + this.value = Math.round(relPos / this.unitSize() + this.start); + this.updateTarget(); +}; + +SliderMorph.prototype.updateTarget = function () { + if (this.action) { + if (typeof this.action === 'function') { + this.action.call(this.target, this.value); + } else { // assume it's a String + this.target[this.action](this.value); + } + } +}; + +// SliderMorph menu: + +SliderMorph.prototype.developersMenu = function () { + var menu = SliderMorph.uber.developersMenu.call(this); + menu.addItem( + "show value...", + 'showValue', + 'display a dialog box\nshowing the selected number' + ); + menu.addItem( + "floor...", + () => { + this.prompt( + menu.title + '\nfloor:', + this.setStart, + this, + this.start.toString(), + null, + 0, + this.stop - this.size, + true + ); + }, + 'set the minimum value\nwhich can be selected' + ); + menu.addItem( + "ceiling...", + () => { + this.prompt( + menu.title + '\nceiling:', + this.setStop, + this, + this.stop.toString(), + null, + this.start + this.size, + this.size * 100, + true + ); + }, + 'set the maximum value\nwhich can be selected' + ); + menu.addItem( + "button size...", + () => { + this.prompt( + menu.title + '\nbutton size:', + this.setSize, + this, + this.size.toString(), + null, + 1, + this.stop - this.start, + true + ); + }, + 'set the range\ncovered by\nthe slider button' + ); + menu.addLine(); + menu.addItem( + 'set target', + "setTarget", + 'select another morph\nwhose numerical property\nwill be ' + + 'controlled by this one' + ); + return menu; +}; + +SliderMorph.prototype.showValue = function () { + this.inform(this.value); +}; + +SliderMorph.prototype.userSetStart = function (num) { + // for context menu demo purposes + this.start = Math.max(num, this.stop); +}; + +SliderMorph.prototype.setStart = function (num, noUpdate) { + // for context menu demo purposes + var newStart; + if (typeof num === 'number') { + this.start = Math.min( + num, + this.stop - this.size + ); + } else { + newStart = parseFloat(num); + if (!isNaN(newStart)) { + this.start = Math.min( + newStart, + this.stop - this.size + ); + } + } + this.value = Math.max(this.value, this.start); + if (!noUpdate) {this.updateTarget(); } + this.fixLayout(); + this.rerender(); +}; + +SliderMorph.prototype.setStop = function (num, noUpdate) { + // for context menu demo purposes + var newStop; + if (typeof num === 'number') { + this.stop = Math.max(num, this.start + this.size); + } else { + newStop = parseFloat(num); + if (!isNaN(newStop)) { + this.stop = Math.max(newStop, this.start + this.size); + } + } + this.value = Math.min(this.value, this.stop); + if (!noUpdate) {this.updateTarget(); } + this.fixLayout(); + this.rerender(); +}; + +SliderMorph.prototype.setSize = function (num, noUpdate) { + // for context menu demo purposes + var newSize; + if (typeof num === 'number') { + this.size = Math.min( + Math.max(num, 1), + this.stop - this.start + ); + } else { + newSize = parseFloat(num); + if (!isNaN(newSize)) { + this.size = Math.min( + Math.max(newSize, 1), + this.stop - this.start + ); + } + } + this.value = Math.min(this.value, this.stop - this.size); + if (!noUpdate) {this.updateTarget(); } + this.fixLayout(); + this.rerender(); +}; + +SliderMorph.prototype.setTarget = function () { + var choices = this.overlappedMorphs(), + menu = new MenuMorph(this, 'choose target:'); + + choices.push(this.world()); + choices.forEach(each => { + menu.addItem(each.toString().slice(0, 50), () => { + this.target = each; + this.setTargetSetter(); + }); + }); + if (choices.length === 1) { + this.target = choices[0]; + this.setTargetSetter(); + } else if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +SliderMorph.prototype.setTargetSetter = function () { + var choices = this.target.numericalSetters(), + menu = new MenuMorph(this, 'choose target property:'); + + choices.forEach(each => { + menu.addItem(each, () => this.action = each); + }); + if (choices.length === 1) { + this.action = choices[0]; + } else if (choices.length > 0) { + menu.popUpAtHand(this.world()); + } +}; + +SliderMorph.prototype.numericalSetters = function () { + // for context menu demo purposes + var list = SliderMorph.uber.numericalSetters.call(this); + list.push('setStart', 'setStop', 'setSize'); + return list; +}; + +// SliderMorph stepping: + +SliderMorph.prototype.step = null; + +SliderMorph.prototype.mouseDownLeft = function (pos) { + var world; + + if (!this.button.bounds.containsPoint(pos)) { + this.offset = new Point(); // return null; + } else { + this.offset = pos.subtract(this.button.bounds.origin); + } + world = this.root(); + + this.step = () => { + var mousePos, newX, newY; + if (world.hand.mouseButton) { + mousePos = world.hand.bounds.origin; + if (this.orientation === 'vertical') { + newX = this.button.bounds.origin.x; + newY = Math.max( + Math.min( + mousePos.y - this.offset.y, + this.bottom() - this.button.height() + ), + this.top() + ); + } else { + newY = this.button.bounds.origin.y; + newX = Math.max( + Math.min( + mousePos.x - this.offset.x, + this.right() - this.button.width() + ), + this.left() + ); + } + this.button.setPosition(new Point(newX, newY)); + this.updateValue(); + } else { + this.step = null; + } + }; +}; + +// MouseSensorMorph //////////////////////////////////////////////////// + +// for demo and debuggin purposes only, to be removed later + +var MouseSensorMorph; + +// MouseSensorMorph inherits from BoxMorph: + +MouseSensorMorph.prototype = new BoxMorph(); +MouseSensorMorph.prototype.constructor = MouseSensorMorph; +MouseSensorMorph.uber = BoxMorph.prototype; + +// MouseSensorMorph instance creation: + +function MouseSensorMorph(edge, border, borderColor) { + this.init(edge, border, borderColor); +} + +MouseSensorMorph.prototype.init = function (edge, border, borderColor) { + MouseSensorMorph.uber.init.call(this); + this.edge = edge || 4; + this.border = border || 2; + this.color = WHITE; + this.borderColor = borderColor || BLACK; + this.isTouched = false; + this.upStep = 0.05; + this.downStep = 0.02; +}; + +MouseSensorMorph.prototype.touch = function () { + if (!this.isTouched) { + this.isTouched = true; + this.alpha = 0.6; + + this.step = () => { + if (this.isTouched) { + if (this.alpha < 1) { + this.alpha += this.upStep; + } + } else if (this.alpha > this.downStep) { + this.alpha -= this.downStep; + } else { + this.alpha = 0; + this.step = null; + } + this.changed(); + }; + } +}; + +MouseSensorMorph.prototype.unTouch = function () { + this.isTouched = false; +}; + +MouseSensorMorph.prototype.mouseEnter = function () { + this.touch(); +}; + +MouseSensorMorph.prototype.mouseLeave = function () { + this.unTouch(); +}; + +MouseSensorMorph.prototype.mouseDownLeft = function () { + this.touch(); +}; + +MouseSensorMorph.prototype.mouseClickLeft = function () { + this.unTouch(); +}; + +// InspectorMorph ////////////////////////////////////////////////////// + +// InspectorMorph: referenced constructors + +var ListMorph; +var TriggerMorph; + +// InspectorMorph inherits from BoxMorph: + +InspectorMorph.prototype = new BoxMorph(); +InspectorMorph.prototype.constructor = InspectorMorph; +InspectorMorph.uber = BoxMorph.prototype; + +// InspectorMorph instance creation: + +function InspectorMorph(target) { + this.init(target); +} + +InspectorMorph.prototype.init = function (target) { + // additional properties: + this.target = target; + this.currentProperty = null; + this.showing = 'attributes'; + this.markOwnProperties = false; + this.hasUserEditedDetails = false; + + // initialize inherited properties: + InspectorMorph.uber.init.call(this); + + // override inherited properties: + this.isDraggable = true; + this.border = 1; + this.edge = MorphicPreferences.isFlat ? 1 : 5; + this.color = new Color(60, 60, 60); + this.borderColor = new Color(95, 95, 95); + this.fps = 25; + + // panes: + this.label = null; + this.list = null; + this.detail = null; + this.work = null; + this.buttonInspect = null; + this.buttonClose = null; + this.buttonSubset = null; + this.buttonEdit = null; + this.resizer = null; + + if (this.target) { + this.buildPanes(); + } + + this.setExtent( + new Point( + MorphicPreferences.handleSize * 20, + MorphicPreferences.handleSize * 20 * 2 / 3 + ) + ); +}; + +InspectorMorph.prototype.setTarget = function (target) { + this.target = target; + this.currentProperty = null; + this.buildPanes(); +}; + +InspectorMorph.prototype.updateCurrentSelection = function () { + var val, txt, cnts, + sel = this.list.selected, + currentTxt = this.detail.contents.children[0], + root = this.root(); + + if (root && + (root.keyboardFocus instanceof CursorMorph) && + (root.keyboardFocus.target === currentTxt)) { + this.hasUserEditedDetails = true; + return; + } + if (isNil(sel) || this.hasUserEditedDetails) {return; } + val = this.target[sel]; + this.currentProperty = val; + if (isNil(val)) { + txt = 'NULL'; + } else if (isString(val)) { + txt = val; + } else { + txt = val.toString(); + } + if (currentTxt.text === txt) {return; } + cnts = new TextMorph(txt); + cnts.isEditable = true; + cnts.enableSelecting(); + cnts.setReceiver(this.target); + this.detail.setContents(cnts); +}; + +InspectorMorph.prototype.buildPanes = function () { + var attribs = [], property, ctrl, ev, doubleClickAction; + + // remove existing panes + this.children.forEach(m => { + if (m !== this.work) { // keep work pane around + m.destroy(); + } + }); + this.children = []; + + // label + this.label = new TextMorph(this.target.toString()); + this.label.fontSize = MorphicPreferences.menuFontSize; + this.label.isBold = true; + this.label.color = WHITE; + this.add(this.label); + + // properties list + for (property in this.target) { + if (property) { // dummy condition, to be refined + attribs.push(property); + } + } + if (this.showing === 'attributes') { + attribs = attribs.filter( + prop => typeof this.target[prop] !== 'function' + ); + } else if (this.showing === 'methods') { + attribs = attribs.filter( + prop => typeof this.target[prop] === 'function' + ); + } // otherwise show all properties + + doubleClickAction = () => { + var world, inspector; + if (!isObject(this.currentProperty)) {return; } + world = this.world(); + inspector = new InspectorMorph( + this.currentProperty + ); + inspector.setPosition(world.hand.position()); + inspector.keepWithin(world); + world.add(inspector); + inspector.changed(); + }; + + this.list = new ListMorph( + this.target instanceof Array ? attribs : attribs.sort(), + null, // label getter + this.markOwnProperties ? + [ // format list + [ // format element: [color, predicate(element] + new Color(0, 0, 180), + element => { + return Object.prototype.hasOwnProperty.call( + this.target, + element + ); + } + ] + ] + : null, + doubleClickAction + ); + + this.list.action = () => { + this.hasUserEditedDetails = false; + this.updateCurrentSelection(); + }; + + this.list.hBar.alpha = 0.6; + this.list.vBar.alpha = 0.6; + this.list.contents.step = null; + this.add(this.list); + + // details pane + this.detail = new ScrollFrameMorph(); + this.detail.acceptsDrops = false; + this.detail.contents.acceptsDrops = false; + this.detail.isTextLineWrapping = true; + this.detail.color = WHITE; + this.detail.hBar.alpha = 0.6; + this.detail.vBar.alpha = 0.6; + ctrl = new TextMorph(''); + ctrl.isEditable = true; + ctrl.enableSelecting(); + ctrl.setReceiver(this.target); + this.detail.setContents(ctrl); + this.add(this.detail); + + // work ('evaluation') pane + // don't refresh the work pane if it already exists + if (this.work === null) { + this.work = new ScrollFrameMorph(); + this.work.acceptsDrops = false; + this.work.contents.acceptsDrops = false; + this.work.isTextLineWrapping = true; + this.work.color = WHITE; + this.work.hBar.alpha = 0.6; + this.work.vBar.alpha = 0.6; + ev = new TextMorph(''); + ev.isEditable = true; + ev.enableSelecting(); + ev.setReceiver(this.target); + this.work.setContents(ev); + } + this.add(this.work); + + // properties button + this.buttonSubset = new TriggerMorph(); + this.buttonSubset.labelString = 'show...'; + this.buttonSubset.createLabel(); + this.buttonSubset.action = () => { + var menu; + menu = new MenuMorph(); + menu.addItem( + 'attributes', + () => { + this.showing = 'attributes'; + this.buildPanes(); + } + ); + menu.addItem( + 'methods', + () => { + this.showing = 'methods'; + this.buildPanes(); + } + ); + menu.addItem( + 'all', + () => { + this.showing = 'all'; + this.buildPanes(); + } + ); + menu.addLine(); + menu.addItem( + (this.markOwnProperties ? + 'un-mark own' : 'mark own'), + () => { + this.markOwnProperties = !this.markOwnProperties; + this.buildPanes(); + }, + 'highlight\n\'own\' properties' + ); + menu.popUpAtHand(this.world()); + }; + + this.add(this.buttonSubset); + + // inspect button + this.buttonInspect = new TriggerMorph(); + this.buttonInspect.labelString = 'inspect...'; + this.buttonInspect.createLabel(); + this.buttonInspect.action = () => { + var menu, world, inspector; + if (isObject(this.currentProperty)) { + menu = new MenuMorph(); + menu.addItem( + 'in new inspector...', + () => { + world = this.world(); + inspector = new InspectorMorph( + this.currentProperty + ); + inspector.setPosition(world.hand.position()); + inspector.keepWithin(world); + world.add(inspector); + inspector.changed(); + } + ); + menu.addItem( + 'here...', + () => this.setTarget(this.currentProperty) + ); + menu.popUpAtHand(this.world()); + } else { + this.inform( + (this.currentProperty === null ? + 'null' : typeof this.currentProperty) + + '\nis not inspectable' + ); + } + }; + this.add(this.buttonInspect); + + // edit button + this.buttonEdit = new TriggerMorph(); + this.buttonEdit.labelString = 'edit...'; + this.buttonEdit.createLabel(); + this.buttonEdit.action = () => { + var menu = new MenuMorph(this); + menu.addItem("save", 'save', 'accept changes'); + menu.addLine(); + menu.addItem("add property...", 'addProperty'); + menu.addItem("rename...", 'renameProperty'); + menu.addItem("remove...", 'removeProperty'); + menu.popUpAtHand(this.world()); + }; + this.add(this.buttonEdit); + + // close button + this.buttonClose = new TriggerMorph(); + this.buttonClose.labelString = 'close'; + this.buttonClose.createLabel(); + this.buttonClose.action = () => this.destroy(); + this.add(this.buttonClose); + + // resizer + this.resizer = new HandleMorph( + this, + 150, + 100, + this.edge, + this.edge + ); + + // update layout + this.fixLayout(); +}; + +InspectorMorph.prototype.fixLayout = function () { + var x, y, r, b, w, h; + + // label + x = this.left() + this.edge; + y = this.top() + this.edge; + r = this.right() - this.edge; + w = r - x; + this.label.setPosition(new Point(x, y)); + this.label.setWidth(w); + if (this.label.height() > (this.height() - 50)) { + this.bounds.setHeight(this.label.height() + 50); + } + + // list + y = this.label.bottom() + 2; + w = Math.min( + Math.floor(this.width() / 3), + this.list.listContents.width() + ); + + w -= this.edge; + b = this.bottom() - (2 * this.edge) - + MorphicPreferences.handleSize; + h = b - y; + this.list.setPosition(new Point(x, y)); + this.list.setExtent(new Point(w, h)); + + // detail + x = this.list.right() + this.edge; + r = this.right() - this.edge; + w = r - x; + this.detail.setPosition(new Point(x, y)); + this.detail.setExtent(new Point(w, (h * 2 / 3) - this.edge)); + + // work + y = this.detail.bottom() + this.edge; + this.work.setPosition(new Point(x, y)); + this.work.setExtent(new Point(w, h / 3)); + + // properties button + x = this.list.left(); + y = this.list.bottom() + this.edge; + w = this.list.width(); + h = MorphicPreferences.handleSize; + this.buttonSubset.setPosition(new Point(x, y)); + this.buttonSubset.setExtent(new Point(w, h)); + + // inspect button + x = this.detail.left(); + w = this.detail.width() - this.edge - + MorphicPreferences.handleSize; + w = w / 3 - this.edge / 3; + this.buttonInspect.setPosition(new Point(x, y)); + this.buttonInspect.setExtent(new Point(w, h)); + + // edit button + x = this.buttonInspect.right() + this.edge; + this.buttonEdit.setPosition(new Point(x, y)); + this.buttonEdit.setExtent(new Point(w, h)); + + // close button + x = this.buttonEdit.right() + this.edge; + r = this.detail.right() - this.edge - + MorphicPreferences.handleSize; + w = r - x; + this.buttonClose.setPosition(new Point(x, y)); + this.buttonClose.setExtent(new Point(w, h)); + + // resizer + this.resizer.fixLayout(); +}; + +// InspectorMorph editing ops: + +InspectorMorph.prototype.save = function () { + var txt = this.detail.contents.children[0].text.toString(), + prop = this.list.selected; + try { + this.target.evaluateString('this.' + prop + ' = ' + txt); + this.hasUserEditedDetails = false; + this.target.changed(); + } catch (err) { + this.inform(err); + } +}; + +InspectorMorph.prototype.addProperty = function () { + this.prompt( + 'new property name:', + prop => { + if (prop) { + this.target[prop] = null; + this.buildPanes(); + this.target.changed(); + } + }, + this, + 'property' + ); +}; + +InspectorMorph.prototype.renameProperty = function () { + var propertyName = this.list.selected; + this.prompt( + 'property name:', + prop => { + try { + delete (this.target[propertyName]); + this.target[prop] = this.currentProperty; + } catch (err) { + this.inform(err); + } + this.buildPanes(); + this.target.changed(); + }, + this, + propertyName + ); +}; + +InspectorMorph.prototype.removeProperty = function () { + var prop = this.list.selected; + try { + delete (this.target[prop]); + this.currentProperty = null; + this.buildPanes(); + this.target.changed(); + } catch (err) { + this.inform(err); + } +}; + +// InspectorMorph stepping + +InspectorMorph.prototype.step = function () { + this.updateCurrentSelection(); + var lbl = this.target.toString(); + if (this.label.text === lbl) {return; } + this.label.text = lbl; + this.fixLayout(); +}; + +// InspectorMorph duplicating: + +InspectorMorph.prototype.updateReferences = function (map) { + var active = this.list.activeIndex(); + InspectorMorph.uber.updateReferences.call(this, map); + this.buildPanes(); + this.list.activateIndex(active); +}; + +// MenuMorph /////////////////////////////////////////////////////////// + +// MenuMorph: referenced constructors + +var MenuItemMorph; + +// MenuMorph inherits from BoxMorph: + +MenuMorph.prototype = new BoxMorph(); +MenuMorph.prototype.constructor = MenuMorph; +MenuMorph.uber = BoxMorph.prototype; + +// MenuMorph instance creation: + +function MenuMorph(target, title, environment, fontSize) { + this.init(target, title, environment, fontSize); + + /* + if target is a function, use it as callback: + execute target as callback function with the action property + of the triggered MenuItem as argument. + Use the environment, if it is specified. + Note: if action is also a function, instead of becoming + the argument itself it will be called to answer the argument. + For selections, Yes/No Choices etc. + + else (if target is not a function): + + if action is a function: + execute the action with target as environment (can be null) + for lambdafied (inline) actions + + else if action is a String: + treat it as function property of target and execute it + for selector-like actions + */ +} + +MenuMorph.prototype.init = function (target, title, environment, fontSize) { + // additional properties: + this.target = target; + this.title = title || null; + this.environment = environment || null; + this.fontSize = fontSize || null; + this.items = []; + this.label = null; + this.world = null; + this.isListContents = false; + this.hasFocus = false; + this.selection = null; + this.submenu = null; + + // initialize inherited properties: + MenuMorph.uber.init.call(this); + + // override inherited properties: + this.isDraggable = false; + this.noDropShadow = true; + this.fullShadowSource = false; + + // immutable properties: + this.border = null; + this.edge = null; +}; + +MenuMorph.prototype.addItem = function ( + labelString, + action, + hint, + color, + bold, // bool + italic, // bool + doubleClickAction, // optional, when used as list contents + shortcut, // optional string, icon (Morph or Canvas) or tuple [icon, string] + verbatim // optional bool, don't translate if true +) { + /* + labelString is normally a single-line string. But it can also be one + of the following: + + * a multi-line string (containing line breaks) + * an icon (either a Morph or a Canvas) + * a tuple of format: [icon, string] + */ + this.items.push([ + verbatim ? labelString || 'close' : localize(labelString || 'close'), + action === 0 ? 0 : action || nop, + hint, + color, + bold || false, + italic || false, + doubleClickAction, + shortcut, + verbatim]); +}; + +MenuMorph.prototype.addMenu = function (label, aMenu, indicator, verbatim) { + this.addPair( + label, + aMenu, + isNil(indicator) ? '\u25ba' : indicator, + null, + verbatim // don't translate + ); +}; + +MenuMorph.prototype.addPair = function ( + label, + action, + shortcut, + hint, + verbatim // don't translate +) { + this.addItem( + label, + action, + hint, + null, + null, + null, + null, + shortcut, + verbatim + ); +}; + +MenuMorph.prototype.addLine = function (width) { + this.items.push([0, width || 1]); +}; + +MenuMorph.prototype.createLabel = function () { + var text; + if (this.label !== null) { + this.label.destroy(); + } + text = new TextMorph( + localize(this.title), + this.fontSize || MorphicPreferences.menuFontSize, + MorphicPreferences.menuFontName, + true, + false, + 'center' + ); + text.alignment = 'center'; + text.color = WHITE; + text.backgroundColor = this.borderColor; + text.fixLayout(); + this.label = new BoxMorph(3, 0); + if (MorphicPreferences.isFlat) { + this.label.edge = 0; + } + this.label.color = this.borderColor; + this.label.borderColor = this.borderColor; + this.label.setExtent(text.extent().add(4)); + this.label.add(text); + this.label.text = text; +}; + +MenuMorph.prototype.createItems = function () { + var item, + fb, + x, + y, + isLine = false; + + this.children.forEach(m => m.destroy()); + this.children = []; + if (!this.isListContents) { + this.edge = MorphicPreferences.isFlat ? 0 : 5; + this.border = MorphicPreferences.isFlat ? 1 : 2; + } + this.color = WHITE; + this.borderColor = new Color(60, 60, 60); + this.setExtent(new Point(0, 0)); + + y = 2; + x = this.left() + 4; + if (!this.isListContents) { + if (this.title) { + this.createLabel(); + this.label.setPosition(this.bounds.origin.add(4)); + this.add(this.label); + y = this.label.bottom(); + } else { + y = this.top() + 4; + } + } + y += 1; + this.items.forEach(tuple => { + isLine = false; + if (tuple instanceof StringFieldMorph || + tuple instanceof ColorPickerMorph || + tuple instanceof SliderMorph || + tuple instanceof DialMorph) { + item = tuple; + } else if (tuple[0] === 0) { + isLine = true; + item = new Morph(); + item.color = this.borderColor; + item.setHeight(tuple[1]); + } else { + item = new MenuItemMorph( + this.target, + tuple[1], + tuple[0], + this.fontSize || MorphicPreferences.menuFontSize, + MorphicPreferences.menuFontName, + this.environment, + tuple[2], // bubble help hint + tuple[3], // color + tuple[4], // bold + tuple[5], // italic + tuple[6], // doubleclick action + tuple[7] // shortcut + ); + } + if (isLine) { + y += 1; + } + item.setPosition(new Point(x, y)); + this.add(item); + y = y + item.height(); + if (isLine) { + y += 1; + } + }); + + fb = this.fullBounds(); + this.setExtent(fb.extent().add(4)); + this.adjustWidths(); +}; + +MenuMorph.prototype.maxWidth = function () { + var w = 0; + + if (this.parent instanceof FrameMorph) { + if (this.parent.scrollFrame instanceof ScrollFrameMorph) { + w = this.parent.scrollFrame.width(); + } + } + this.children.forEach(item => { + if (item instanceof MenuItemMorph) { + w = Math.max( + w, + item.label.width() + 8 + + (item.shortcut ? item.shortcut.width() + 4 : 0) + ); + } else if ((item instanceof StringFieldMorph) || + (item instanceof ColorPickerMorph) || + (item instanceof SliderMorph) || + (item instanceof DialMorph)) { + w = Math.max(w, item.width()); + } + }); + if (this.label) { + w = Math.max(w, this.label.width()); + } + return w; +}; + +MenuMorph.prototype.adjustWidths = function () { + var w = this.maxWidth(); + this.children.forEach(item => { + if (!(item instanceof DialMorph)) { + item.setWidth(w); + } + item.fixLayout(); + if (item === this.label) { + item.text.setPosition( + item.center().subtract( + item.text.extent().divideBy(2) + ) + ); + } + }); +}; + +MenuMorph.prototype.unselectAllItems = function () { + this.children.forEach(item => { + if (item instanceof MenuItemMorph) { + if (item.userState !== 'normal') { + item.userState = 'normal'; + item.rerender(); + } + } else if (item instanceof ScrollFrameMorph) { + item.contents.children.forEach(morph => { + if (morph instanceof MenuItemMorph && + morph.userState !== 'normal') { + morph.userState = 'normal'; + morph.rerender(); + } + }); + } + }); +}; + +// MenuMorph popping up + +MenuMorph.prototype.popup = function (world, pos) { + var scroller; + + this.createItems(); + this.setPosition(pos); + this.addShadow(new Point(2, 2), 80); + this.keepWithin(world); + + if (this.bottom() > world.bottom()) { + // scroll menu items if the menu is taller than the world + this.removeShadow(); + scroller = this.scroll(); + this.bounds.corner.y = world.bottom() - 2; + this.addShadow(new Point(2, 2), 80); + scroller.setHeight(world.bottom() - scroller.top() - 6); + scroller.adjustScrollBars(); // ? + } + + if (world.activeMenu) { + world.activeMenu.destroy(); + } + if (this.items.length < 1 && !this.title) { // don't show empty menus + return; + } + world.add(this); + world.activeMenu = this; + this.world = world; // optionally enable keyboard support + this.fullChanged(); +}; + +MenuMorph.prototype.scroll = function () { + // private - move all items into a scroll frame + var scroller = new ScrollFrameMorph(), + start = this.label ? 1 : 0, + first = this.children[start]; + + scroller.setPosition(first.position()); + this.children.slice(start).forEach(morph => scroller.addContents(morph)); + this.add(scroller); + scroller.setWidth(first.width()); + return scroller; +}; + +MenuMorph.prototype.popUpAtHand = function (world) { + var wrrld = world || this.world; + this.popup(wrrld, wrrld.hand.position()); +}; + +MenuMorph.prototype.popUpCenteredAtHand = function (world) { + var wrrld = world || this.world; + this.fixLayout(); + this.createItems(); + this.popup( + wrrld, + wrrld.hand.position().subtract( + this.extent().floorDivideBy(2) + ) + ); +}; + +MenuMorph.prototype.popUpCenteredInWorld = function (world) { + var wrrld = world || this.world; + this.fixLayout(); + this.createItems(); + this.popup( + wrrld, + wrrld.center().subtract( + this.extent().floorDivideBy(2) + ) + ); +}; + +// MenuMorph submenus + +MenuMorph.prototype.closeRootMenu = function () { + if (this.parent instanceof MenuMorph) { + this.parent.closeRootMenu(); + } else { + this.destroy(); + } +}; + +MenuMorph.prototype.closeSubmenu = function () { + if (this.submenu) { + this.submenu.destroy(); + this.submenu = null; + this.unselectAllItems(); + this.world.activeMenu = this; + } +}; + +// MenuMorph keyboard accessibility + +MenuMorph.prototype.getFocus = function () { + this.world.keyboardFocus = this; + this.selection = null; + this.selectFirst(); + this.hasFocus = true; +}; + +MenuMorph.prototype.processKeyDown = function (event) { + // console.log(event.keyCode); + switch (event.keyCode) { + case 13: // 'enter' + case 32: // 'space' + if (this.selection) { + this.selection.mouseClickLeft(); + if (this.submenu) { + this.submenu.getFocus(); + } + } + return; + case 27: // 'esc' + return this.destroy(); + case 37: // 'left arrow' + return this.leaveSubmenu(); + case 38: // 'up arrow' + return this.selectUp(); + case 39: // 'right arrow' + return this.enterSubmenu(); + case 40: // 'down arrow' + return this.selectDown(); + default: + nop(); + } +}; + +MenuMorph.prototype.processKeyUp = function (event) { + nop(event); +}; + +MenuMorph.prototype.processKeyPress = function (event) { + nop(event); +}; + +MenuMorph.prototype.selectFirst = function () { + var scroller, items, i; + + scroller = detect( + this.children, + morph => morph instanceof ScrollFrameMorph + ); + items = scroller ? scroller.contents.children : this.children; + for (i = 0; i < items.length; i += 1) { + if (items[i] instanceof MenuItemMorph) { + this.select(items[i]); + return; + } + } +}; + +MenuMorph.prototype.selectUp = function () { + var scroller, triggers, idx; + + scroller = detect( + this.children, + morph => morph instanceof ScrollFrameMorph + ); + triggers = (scroller ? scroller.contents.children : this.children).filter( + each => each instanceof MenuItemMorph + ); + if (!this.selection) { + if (triggers.length) { + this.select(triggers[0]); + } + return; + } + idx = triggers.indexOf(this.selection) - 1; + if (idx < 0) { + idx = triggers.length - 1; + } + this.select(triggers[idx]); +}; + +MenuMorph.prototype.selectDown = function () { + var scroller, triggers, idx; + + scroller = detect( + this.children, + morph => morph instanceof ScrollFrameMorph + ); + triggers = (scroller ? scroller.contents.children : this.children).filter( + each => each instanceof MenuItemMorph + ); + if (!this.selection) { + if (triggers.length) { + this.select(triggers[0]); + } + return; + } + idx = triggers.indexOf(this.selection) + 1; + if (idx >= triggers.length) { + idx = 0; + } + this.select(triggers[idx]); +}; + +MenuMorph.prototype.enterSubmenu = function () { + if (this.selection && this.selection.action instanceof MenuMorph) { + this.selection.popUpSubmenu(); + if (this.submenu) { + this.submenu.getFocus(); + } + } +}; + +MenuMorph.prototype.leaveSubmenu = function () { + var menu = this.parent; + if (this.parent instanceof MenuMorph) { + menu.submenu = null; + menu.hasFocus = true; + this.destroy(); + menu.world.keyboardFocus = menu; + menu.world.activeMenu = menu; + } +}; + +MenuMorph.prototype.select = function (aMenuItem) { + this.unselectAllItems(); + aMenuItem.userState = 'highlight'; + aMenuItem.rerender(); + aMenuItem.scrollIntoView(); + this.selection = aMenuItem; +}; + +MenuMorph.prototype.destroy = function () { + if (this.hasFocus) { + this.world.keyboardFocus = null; + } + if (!this.isListContents && (this.world.activeMenu === this)) { + this.world.activeMenu = null; + } + MenuMorph.uber.destroy.call(this); +}; + +// StringMorph ///////////////////////////////////////////////////////// + +// I am a single line of text + +// StringMorph inherits from Morph: + +StringMorph.prototype = new Morph(); +StringMorph.prototype.constructor = StringMorph; +StringMorph.uber = Morph.prototype; + +// StringMorph shared properties: + +// context for measuring text dimensions, used by StringMorphs and TextMorphs +StringMorph.prototype.measureCtx = newCanvas().getContext("2d"); + +// StringMorph instance creation: + +function StringMorph( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName +) { + this.init( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName + ); +} + +StringMorph.prototype.init = function ( + text, + fontSize, + fontStyle, + bold, + italic, + isNumeric, + shadowOffset, + shadowColor, + color, + fontName +) { + // additional properties: + this.text = text || ((text === '') ? '' : 'StringMorph'); + this.fontSize = fontSize || 12; + this.fontName = fontName || MorphicPreferences.globalFontFamily; + this.fontStyle = fontStyle || 'sans-serif'; + this.isBold = bold || false; + this.isItalic = italic || false; + this.isEditable = false; + this.enableLinks = false; // set to "true" if I can contain clickable URLs + this.isNumeric = isNumeric || false; + this.isPassword = false; + this.shadowOffset = shadowOffset || ZERO; + this.shadowColor = shadowColor || null; + this.isShowingBlanks = false; + this.blanksColor = new Color(180, 140, 140); + + // additional properties for text-editing: + this.isScrollable = true; // scrolls into view when edited + this.currentlySelecting = false; + this.startMark = 0; + this.endMark = 0; + this.markedTextColor = WHITE; + this.markedBackgoundColor = new Color(60, 60, 120); + + // initialize inherited properties: + StringMorph.uber.init.call(this, true); + + // override inherited properites: + this.color = color || new Color(0, 0, 0); + this.fixLayout(); // determine my extent +}; + +StringMorph.prototype.toString = function () { + // e.g. 'a StringMorph("Hello World")' + return 'a ' + + (this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]) + + '("' + this.text.slice(0, 30) + '...")'; +}; + +StringMorph.prototype.password = function (letter, length) { + var ans = '', + i; + for (i = 0; i < length; i += 1) { + ans += letter; + } + return ans; +}; + +StringMorph.prototype.font = function () { + // answer a font string, e.g. 'bold italic 12px sans-serif' + var font = ''; + if (this.isBold) { + font = font + 'bold '; + } + if (this.isItalic) { + font = font + 'italic '; + } + return font + + this.fontSize + 'px ' + + (this.fontName ? this.fontName + ', ' : '') + + this.fontStyle; +}; + +StringMorph.prototype.getShadowRenderColor = function () { + // answer the shadow rendering color, can be overridden for my children + return this.shadowColor; +}; + +StringMorph.prototype.fixLayout = function (justMe) { + // determine my extent depending on my current settings + var width, + shadowOffset = this.shadowOffset || ZERO, + txt = this.isPassword ? + this.password('*', this.text.length) : this.text; + + this.measureCtx.font = this.font(); + width = Math.max( + this.measureCtx.measureText(txt).width + Math.abs(shadowOffset.x), + 1 + ); + this.bounds.corner = this.bounds.origin.add( + new Point( + width, + fontHeight(this.fontSize) + Math.abs(shadowOffset.y) + ) + ); + + // notify my parent of layout change + if (!justMe && this.parent) { + if (this.parent.fixLayout) { + this.parent.fixLayout(); + } + } +}; + +StringMorph.prototype.render = function (ctx) { + var start, stop, i, p, c, x, y, + shadowOffset = this.shadowOffset || ZERO, + shadowColor = this.getShadowRenderColor(), + txt = this.isPassword ? + this.password('*', this.text.length) : this.text; + + // prepare context for drawing text + ctx.font = this.font(); + ctx.textAlign = 'left'; + ctx.textBaseline = 'bottom'; + + // first draw the shadow, if any + if (shadowColor) { + x = Math.max(shadowOffset.x, 0); + y = Math.max(shadowOffset.y, 0); + ctx.fillStyle = shadowColor.toString(); + ctx.fillText(txt, x, fontHeight(this.fontSize) + y); + } + + // now draw the actual text + x = Math.abs(Math.min(shadowOffset.x, 0)); + y = Math.abs(Math.min(shadowOffset.y, 0)); + ctx.fillStyle = this.getRenderColor().toString(); + + if (this.isShowingBlanks) { + this.renderWithBlanks( + ctx, + x, + fontHeight(this.fontSize) + y + ); + } else { + ctx.fillText( + txt, + x, + fontHeight(this.fontSize) + y + ); + } + + // draw the selection + start = Math.min(this.startMark, this.endMark); + stop = Math.max(this.startMark, this.endMark); + for (i = start; i < stop; i += 1) { + p = this.slotPosition(i).subtract(this.position()); + c = txt.charAt(i); + ctx.fillStyle = this.markedBackgoundColor.toString(); + ctx.fillRect(p.x, p.y, ctx.measureText(c).width + 1 + x, + fontHeight(this.fontSize) + y); + ctx.fillStyle = this.markedTextColor.toString(); + ctx.fillText(c, p.x, fontHeight(this.fontSize) + p.y); + } +}; + +StringMorph.prototype.renderWithBlanks = function (ctx, startX, y) { + var space = ctx.measureText(' ').width, + blanksColor = this.blanksColor.toString(), + top = y - this.height() / 2, + words = this.text.split(' '), + x = startX || 0, + isFirst = true; + + function drawBlank() { + ctx.fillStyle = blanksColor; + ctx.beginPath(); + ctx.arc( + x + space / 2, + top, + space / 2, + radians(0), + radians(360) + ); + ctx.fill(); + x += space; + } + + // render my text inserting blanks + words.forEach(word => { + if (!isFirst) { + drawBlank(); + } + isFirst = false; + if (word !== '') { + ctx.fillStyle = this.getRenderColor().toString(); + ctx.fillText(word, x, y); + x += ctx.measureText(word).width; + } + }); +}; + +// StringMorph measuring: + +StringMorph.prototype.slotPosition = function (slot) { + // answer the position point of the given index ("slot") + // where the cursor should be placed + var txt = this.isPassword ? + this.password('*', this.text.length) : this.text, + dest = Math.min(Math.max(slot, 0), txt.length); + + this.measureCtx.font = this.font(); + this.pos = dest; + return new Point( + this.left() + this.measureCtx.measureText(txt.slice(0, dest)).width, + this.top() + ); +}; + +StringMorph.prototype.slotAt = function (aPoint) { + // answer the slot (index) closest to the given point taking + // in account how far from the middle of the character it is, + // so the cursor can be moved accordingly + + var txt = this.isPassword ? + this.password('*', this.text.length) : this.text, + idx = 0, + charX = 0; + + this.measureCtx.font = this.font(); + while (aPoint.x - this.left() > charX) { + charX += this.measureCtx.measureText(txt[idx]).width; + idx += 1; + if (idx === txt.length) { + if ((this.measureCtx.measureText(txt).width - + (this.measureCtx.measureText(txt[idx - 1]).width / 2)) < + (aPoint.x - this.left())) { + return idx; + } + } + } + + // see where our click fell with respect to the middle of the char + if (aPoint.x - this.left() > + charX - this.measureCtx.measureText(txt[idx - 1]).width / 2) { + return idx; + } else { + return idx - 1; + } +}; + +StringMorph.prototype.upFrom = function (slot) { + // answer the slot above the given one + return slot; +}; + +StringMorph.prototype.downFrom = function (slot) { + // answer the slot below the given one + return slot; +}; + +StringMorph.prototype.startOfLine = function () { + // answer the first slot (index) of the line for the given slot + return 0; +}; + +StringMorph.prototype.endOfLine = function () { + // answer the slot (index) indicating the EOL for the given slot + return this.text.length; +}; + +StringMorph.prototype.previousWordFrom = function (aSlot) { + // answer the slot (index) slots indicating the position of the + // previous word to the left of aSlot + var index = aSlot - 1; + + // while the current character is non-word one, we skip it, so that + // if we are in the middle of a non-alphanumeric sequence, we'll get + // right to the beginning of the previous word + while (index > 0 && !isWordChar(this.text[index])) { + index -= 1; + } + + // while the current character is a word one, we skip it until we + // find the beginning of the current word + while (index > 0 && isWordChar(this.text[index - 1])) { + index -= 1; + } + + return index; +}; + +StringMorph.prototype.nextWordFrom = function (aSlot) { + var index = aSlot; + + while (index < this.endOfLine() && !isWordChar(this.text[index])) { + index += 1; + } + + while (index < this.endOfLine() && isWordChar(this.text[index])) { + index += 1; + } + + return index; +}; + +StringMorph.prototype.rawHeight = function () { + // answer my corrected fontSize + return this.height() / 1.2; +}; + +// StringMorph menus: + +StringMorph.prototype.developersMenu = function () { + var menu = StringMorph.uber.developersMenu.call(this); + + menu.addLine(); + menu.addItem("edit", 'edit'); + menu.addItem( + "font size...", + () => { + this.prompt( + menu.title + '\nfont\nsize:', + this.setFontSize, + this, + this.fontSize.toString(), + null, + 6, + 500, + true + ); + }, + 'set this String\'s\nfont point size' + ); + if (this.fontStyle !== 'serif') { + menu.addItem("serif", 'setSerif'); + } + if (this.fontStyle !== 'sans-serif') { + menu.addItem("sans-serif", 'setSansSerif'); + } + if (this.isBold) { + menu.addItem("normal weight", 'toggleWeight'); + } else { + menu.addItem("bold", 'toggleWeight'); + } + if (this.isItalic) { + menu.addItem("normal style", 'toggleItalic'); + } else { + menu.addItem("italic", 'toggleItalic'); + } + if (this.isShowingBlanks) { + menu.addItem("hide blanks", 'toggleShowBlanks'); + } else { + menu.addItem("show blanks", 'toggleShowBlanks'); + } + if (this.isPassword) { + menu.addItem("show characters", 'toggleIsPassword'); + } else { + menu.addItem("hide characters", 'toggleIsPassword'); + } + return menu; +}; + +StringMorph.prototype.toggleIsDraggable = function () { + // for context menu demo purposes + this.isDraggable = !this.isDraggable; + if (this.isDraggable) { + this.disableSelecting(); + } else { + this.enableSelecting(); + } +}; + +StringMorph.prototype.toggleShowBlanks = function () { + this.isShowingBlanks = !this.isShowingBlanks; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.toggleWeight = function () { + this.isBold = !this.isBold; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.toggleItalic = function () { + this.isItalic = !this.isItalic; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.toggleIsPassword = function () { + this.isPassword = !this.isPassword; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.setSerif = function () { + this.fontStyle = 'serif'; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.setSansSerif = function () { + this.fontStyle = 'sans-serif'; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.setFontSize = function (size) { + // for context menu demo purposes + var newSize; + if (typeof size === 'number') { + this.fontSize = Math.round(Math.min(Math.max(size, 4), 500)); + } else { + newSize = parseFloat(size); + if (!isNaN(newSize)) { + this.fontSize = Math.round( + Math.min(Math.max(newSize, 4), 500) + ); + } + } + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.setText = function (size) { + // for context menu demo purposes + this.text = Math.round(size).toString(); + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +StringMorph.prototype.numericalSetters = function () { + // for context menu demo purposes + return [ + 'setLeft', + 'setTop', + 'setAlphaScaled', + 'setFontSize', + 'setText' + ]; +}; + +// StringMorph editing: + +StringMorph.prototype.edit = function () { + this.root().edit(this); +}; + +StringMorph.prototype.selection = function () { + var start, stop; + start = Math.min(this.startMark, this.endMark); + stop = Math.max(this.startMark, this.endMark); + return this.text.slice(start, stop); +}; + +StringMorph.prototype.selectionStartSlot = function () { + return Math.min(this.startMark, this.endMark); +}; + +StringMorph.prototype.clearSelection = function () { + if (!this.currentlySelecting && + isNil(this.startMark) && + isNil(this.endMark)) { + return; + } + this.currentlySelecting = false; + this.startMark = null; + this.endMark = null; + this.changed(); +}; + +StringMorph.prototype.deleteSelection = function () { + var start, stop, text; + text = this.text; + start = Math.min(this.startMark, this.endMark); + stop = Math.max(this.startMark, this.endMark); + this.text = text.slice(0, start) + text.slice(stop); + this.changed(); + this.clearSelection(); +}; + +StringMorph.prototype.selectAll = function () { + var cursor; + if (this.isEditable) { + this.startMark = 0; + cursor = this.root().cursor; + this.endMark = this.text.length; + if (cursor) { + cursor.gotoSlot(this.text.length); + cursor.syncTextareaSelectionWith(this); + } + this.fixLayout(); + this.rerender(); + } +}; + +StringMorph.prototype.mouseDownLeft = function (pos) { + if (this.world().currentKey === 16) { + this.shiftClick(pos); + } else if (this.isEditable) { + this.clearSelection(); + } else { + this.escalateEvent('mouseDownLeft', pos); + } +}; + +StringMorph.prototype.shiftClick = function (pos) { + var cursor = this.root().cursor; + + if (cursor) { + if (!this.startMark) { + this.startMark = cursor.slot; + } + cursor.gotoPos(pos); + this.endMark = cursor.slot; + cursor.syncTextareaSelectionWith(this); + this.changed(); + } + this.currentlySelecting = false; + this.escalateEvent('mouseDownLeft', pos); +}; + +StringMorph.prototype.mouseClickLeft = function (pos) { + var cursor, + slot, + clickedText, + startMark, + endMark; + + if (this.isEditable) { + if (!this.currentlySelecting) { + this.edit(); // creates a new cursor + } + cursor = this.root().cursor; + if (cursor) { + cursor.gotoPos(pos); + } + this.currentlySelecting = true; + } else if (this.enableLinks) { + slot = this.slotAt(pos); + if (slot === this.text.length) { + slot -= 1; + } + startMark = slot; + while (startMark > 1 && isURLChar(this.text[startMark-1])) { + startMark -= 1; + } + endMark = slot; + while (endMark < this.text.length - 1 && + isURLChar(this.text[endMark + 1])) { + endMark += 1; + } + clickedText = this.text.substring(startMark, endMark + 1); + if (isURL(clickedText)) { + window.open(clickedText, '_blank'); + } else { + this.escalateEvent('mouseClickLeft', pos); + } + } else { + this.escalateEvent('mouseClickLeft', pos); + } +}; + +StringMorph.prototype.mouseDoubleClick = function (pos) { + // selects the word at pos + // if there is no word, we select whatever is between + // the previous and next words + var slot = this.slotAt(pos); + + if (this.isEditable) { + this.edit(); + + if (slot === this.text.length) { + slot -= 1; + } + + if (this.text[slot] && isWordChar(this.text[slot])) { + this.selectWordAt(slot); + } else if (this.text[slot]) { + this.selectBetweenWordsAt(slot); + } else { + // special case for when we click right after the + // last slot in multi line TextMorphs + this.selectAll(); + } + this.root().cursor.syncTextareaSelectionWith(this); + } else { + this.escalateEvent('mouseDoubleClick', pos); + } +}; + +StringMorph.prototype.selectWordAt = function (slot) { + var cursor = this.root().cursor; + + if (slot === 0 || isWordChar(this.text[slot - 1])) { + cursor.gotoSlot(this.previousWordFrom(slot)); + this.startMark = cursor.slot; + this.endMark = this.nextWordFrom(cursor.slot); + } else { + cursor.gotoSlot(slot); + this.startMark = slot; + this.endMark = this.nextWordFrom(slot); + } + this.changed(); +}; + +StringMorph.prototype.selectBetweenWordsAt = function (slot) { + var cursor = this.root().cursor; + + cursor.gotoSlot(this.nextWordFrom(this.previousWordFrom(slot))); + this.startMark = cursor.slot; + this.endMark = cursor.slot; + + while (this.endMark < this.text.length + && !isWordChar(this.text[this.endMark])) { + this.endMark += 1; + } + this.changed(); +}; + +StringMorph.prototype.enableSelecting = function () { + this.mouseDownLeft = function (pos) { + var crs = this.root().cursor, + already = crs ? crs.target === this : false; + if (this.world().currentKey === 16) { + this.shiftClick(pos); + } else { + this.clearSelection(); + if (this.isEditable && (!this.isDraggable)) { + this.edit(); + this.root().cursor.gotoPos(pos); + this.startMark = this.slotAt(pos); + this.endMark = this.startMark; + this.currentlySelecting = true; + this.root().cursor.syncTextareaSelectionWith(this); + if (!already) {this.escalateEvent('mouseDownLeft', pos); } + } + } + }; + this.mouseMove = function (pos) { + if (this.isEditable && + this.currentlySelecting && + (!this.isDraggable)) { + var newMark = this.slotAt(pos); + if (newMark !== this.endMark) { + this.endMark = newMark; + this.root().cursor.syncTextareaSelectionWith(this); + this.changed(); + } + } + }; +}; + +StringMorph.prototype.disableSelecting = function () { + this.mouseDownLeft = StringMorph.prototype.mouseDownLeft; + delete this.mouseMove; +}; + +// TextMorph //////////////////////////////////////////////////////////////// + +// I am a multi-line, word-wrapping String, quasi-inheriting from StringMorph + +// TextMorph inherits from Morph: + +TextMorph.prototype = new Morph(); +TextMorph.prototype.constructor = TextMorph; +TextMorph.uber = Morph.prototype; + +// TextMorph shared properties: + +// context for measuring text dimensions, shared with StringMorph prototype +TextMorph.prototype.measureCtx = StringMorph.prototype.measureCtx; + +// TextMorph instance creation: + +function TextMorph( + text, + fontSize, + fontStyle, + bold, + italic, + alignment, + width, + fontName, + shadowOffset, + shadowColor +) { + this.init(text, + fontSize, + fontStyle, + bold, + italic, + alignment, + width, + fontName, + shadowOffset, + shadowColor); +} + +TextMorph.prototype.init = function ( + text, + fontSize, + fontStyle, + bold, + italic, + alignment, + width, + fontName, + shadowOffset, + shadowColor +) { + // additional properties: + this.text = text || (text === '' ? text : 'TextMorph'); + this.words = []; + this.lines = []; + this.lineSlots = []; + this.fontSize = fontSize || 12; + this.fontName = fontName || MorphicPreferences.globalFontFamily; + this.fontStyle = fontStyle || 'sans-serif'; + this.isBold = bold || false; + this.isItalic = italic || false; + this.alignment = alignment || 'left'; + this.shadowOffset = shadowOffset || ZERO; + this.shadowColor = shadowColor || null; + this.maxWidth = width || 0; + this.maxLineWidth = 0; + this.backgroundColor = null; + this.isEditable = false; + this.enableLinks = false; // set to "true" if I can contain clickable URLs + + //additional properties for ad-hoc evaluation: + this.receiver = null; + + // additional properties for text-editing: + this.isScrollable = true; // scrolls into view when edited + this.currentlySelecting = false; + this.startMark = 0; + this.endMark = 0; + this.markedTextColor = WHITE; + this.markedBackgoundColor = new Color(60, 60, 120); + + // initialize inherited properties: + TextMorph.uber.init.call(this); + + // override inherited properites: + this.color = new Color(0, 0, 0); + this.fixLayout(); // determine my extent +}; + +TextMorph.prototype.toString = function () { + // e.g. 'a TextMorph("Hello World")' + return 'a TextMorph' + '("' + this.text.slice(0, 30) + '...")'; +}; + +TextMorph.prototype.font = StringMorph.prototype.font; + +TextMorph.prototype.parse = function () { + var paragraphs = this.text.split('\n'), + context = this.measureCtx, + oldline = '', + newline, + w, + slot = 0; + + context.font = this.font(); + this.maxLineWidth = 0; + this.lines = []; + this.lineSlots = [0]; + this.words = []; + + paragraphs.forEach(p => { + this.words = this.words.concat(p.split(' ')); + this.words.push('\n'); + }); + + this.words.forEach(word => { + if (word === '\n') { + this.lines.push(oldline); + this.lineSlots.push(slot); + this.maxLineWidth = Math.max( + this.maxLineWidth, + context.measureText(oldline).width + ); + oldline = ''; + } else { + if (this.maxWidth > 0) { + newline = oldline + word + ' '; + w = context.measureText(newline).width; + if (w > this.maxWidth) { + this.lines.push(oldline); + this.lineSlots.push(slot); + this.maxLineWidth = Math.max( + this.maxLineWidth, + context.measureText(oldline).width + ); + w = context.measureText(word).width; + if (w > this.maxWidth) { + oldline = ''; + word.split('').forEach((letter, idx) => { + w = context.measureText(oldline + letter).width; + if (w > this.maxWidth && oldline.length) { + this.lines.push(oldline); + this.lineSlots.push(slot + idx); + this.maxLineWidth = Math.max( + this.maxLineWidth, + context.measureText(oldline).width + ); + oldline = ''; + } + oldline += letter; + }); + } else { + oldline = word + ' '; + } + } else { + oldline = newline; + } + } else { + oldline = oldline + word + ' '; + } + slot += word.length + 1; + } + }); +}; + +TextMorph.prototype.fixLayout = function () { + // determine my extent depending on my current settings + var height, shadowHeight, shadowWidth; + + this.parse(); + + // set my extent + shadowWidth = Math.abs(this.shadowOffset.x); + shadowHeight = Math.abs(this.shadowOffset.y); + height = this.lines.length * (fontHeight(this.fontSize) + shadowHeight); + if (this.maxWidth === 0) { + this.bounds = this.bounds.origin.extent( + new Point(this.maxLineWidth + shadowWidth, height) + ); + } else { + this.bounds = this.bounds.origin.extent( + new Point(this.maxWidth + shadowWidth, height) + ); + } + + // notify my parent of layout change + if (this.parent) { + if (this.parent.layoutChanged) { + this.parent.layoutChanged(); + } + } +}; + +TextMorph.prototype.render = function (ctx) { + var shadowWidth = Math.abs(this.shadowOffset.x), + shadowHeight = Math.abs(this.shadowOffset.y), + shadowColor = this.getShadowRenderColor(), + i, line, width, offx, offy, x, y, start, stop, p, c; + + // prepare context for drawing text + ctx.font = this.font(); + ctx.textAlign = 'left'; + ctx.textBaseline = 'bottom'; + + // fill the background, if desired + if (this.backgroundColor) { + ctx.fillStyle = this.backgroundColor.toString(); + ctx.fillRect(0, 0, this.width(), this.height()); + } + + // draw the shadow, if any + if (shadowColor) { + offx = Math.max(this.shadowOffset.x, 0); + offy = Math.max(this.shadowOffset.y, 0); + ctx.fillStyle = shadowColor.toString(); + + for (i = 0; i < this.lines.length; i = i + 1) { + line = this.lines[i]; + width = ctx.measureText(line).width + shadowWidth; + if (this.alignment === 'right') { + x = this.width() - width; + } else if (this.alignment === 'center') { + x = (this.width() - width) / 2; + } else { // 'left' + x = 0; + } + y = (i + 1) * (fontHeight(this.fontSize) + shadowHeight) + - shadowHeight; + ctx.fillText(line, x + offx, y + offy); + } + } + + // now draw the actual text + offx = Math.abs(Math.min(this.shadowOffset.x, 0)); + offy = Math.abs(Math.min(this.shadowOffset.y, 0)); + ctx.fillStyle = this.getRenderColor().toString(); + + for (i = 0; i < this.lines.length; i = i + 1) { + line = this.lines[i]; + width = ctx.measureText(line).width + shadowWidth; + if (this.alignment === 'right') { + x = this.width() - width; + } else if (this.alignment === 'center') { + x = (this.width() - width) / 2; + } else { // 'left' + x = 0; + } + y = (i + 1) * (fontHeight(this.fontSize) + shadowHeight) - shadowHeight; + ctx.fillText(line, x + offx, y + offy); + } + + // draw the selection + start = Math.min(this.startMark, this.endMark); + stop = Math.max(this.startMark, this.endMark); + for (i = start; i < stop; i += 1) { + p = this.slotPosition(i).subtract(this.position()); + c = this.text.charAt(i); + ctx.fillStyle = this.markedBackgoundColor.toString(); + ctx.fillRect(p.x, p.y, ctx.measureText(c).width + 1, + fontHeight(this.fontSize)); + ctx.fillStyle = this.markedTextColor.toString(); + ctx.fillText(c, p.x, p.y + fontHeight(this.fontSize)); + } +}; + +TextMorph.prototype.getShadowRenderColor = + StringMorph.prototype.getShadowRenderColor; + +TextMorph.prototype.setExtent = function (aPoint) { + this.maxWidth = Math.max(aPoint.x, 0); + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +// TextMorph mesuring: + +TextMorph.prototype.columnRow = function (slot) { + // answer the logical position point of the given index ("slot") + var row, + col, + idx = 0; + + for (row = 0; row < this.lines.length; row += 1) { + idx = this.lineSlots[row]; + for (col = 0; col < this.lines[row].length; col += 1) { + if (idx === slot) { + return new Point(col, row); + } + idx += 1; + } + } + // return new Point(0, 0); + return new Point( + this.lines[this.lines.length - 1].length - 1, + this.lines.length - 1 + ); +}; + +TextMorph.prototype.slotPosition = function (slot) { + // answer the physical position point of the given index ("slot") + // where the cursor should be placed + var colRow = this.columnRow(slot), + ctx = this.measureCtx, + shadowHeight = Math.abs(this.shadowOffset.y), + xOffset = 0, + yOffset; + + ctx.font = this.font(); + yOffset = colRow.y * (fontHeight(this.fontSize) + shadowHeight); + xOffset = ctx.measureText(this.lines[colRow.y].slice(0, colRow.x)).width; + return new Point(this.left() + xOffset, this.top() + yOffset); +}; + +TextMorph.prototype.slotAt = function (aPoint) { + // answer the slot (index) closest to the given point taking + // in account how far from the middle of the character it is, + // so the cursor can be moved accordingly + var charX, + row = 0, + col = 0, + columnLength, + shadowHeight = Math.abs(this.shadowOffset.y), + ctx = this.measureCtx, + textWidth; + + while (aPoint.y - this.top() > + ((fontHeight(this.fontSize) + shadowHeight) * row)) { + row += 1; + } + row = Math.max(row, 1); + + ctx.font = this.font(); + textWidth = ctx.measureText(this.lines[row - 1]).width; + if (this.alignment === 'right') { + charX = this.width() - textWidth; + } else if (this.alignment === 'center') { + charX = (this.width() - textWidth) / 2; + } else { // 'left' + charX = 0; + } + columnLength = this.lines[row - 1].length; + while (col < columnLength - 1 && aPoint.x - this.left() > charX) { + charX += ctx.measureText(this.lines[row - 1][col]).width; + col += 1; + } + + // see where our click fell with respect to the middle of the char + if (aPoint.x - this.left() > + charX - ctx.measureText(this.lines[row - 1][col]).width / 2) { + return this.lineSlots[Math.max(row - 1, 0)] + col; + } else { + return this.lineSlots[Math.max(row - 1, 0)] + col - 1; + } +}; + +TextMorph.prototype.upFrom = function (slot) { + // answer the slot above the given one + var above, + colRow = this.columnRow(slot); + if (colRow.y < 1) { + return slot; + } + above = this.lines[colRow.y - 1]; + if (above.length < colRow.x - 1) { + return this.lineSlots[colRow.y - 1] + above.length; + } + return this.lineSlots[colRow.y - 1] + colRow.x; +}; + +TextMorph.prototype.downFrom = function (slot) { + // answer the slot below the given one + var below, + colRow = this.columnRow(slot); + if (colRow.y > this.lines.length - 2) { + return slot; + } + below = this.lines[colRow.y + 1]; + if (below.length < colRow.x - 1) { + return this.lineSlots[colRow.y + 1] + below.length; + } + return this.lineSlots[colRow.y + 1] + colRow.x; +}; + +TextMorph.prototype.startOfLine = function (slot) { + // answer the first slot (index) of the line for the given slot + return this.lineSlots[this.columnRow(slot).y]; +}; + +TextMorph.prototype.endOfLine = function (slot) { + // answer the slot (index) indicating the EOL for the given slot + return this.startOfLine(slot) + + this.lines[this.columnRow(slot).y].length - 1; +}; + +TextMorph.prototype.previousWordFrom = StringMorph.prototype.previousWordFrom; + +TextMorph.prototype.nextWordFrom = StringMorph.prototype.nextWordFrom; + +// TextMorph editing: + +TextMorph.prototype.edit = StringMorph.prototype.edit; + +TextMorph.prototype.selection = StringMorph.prototype.selection; + +TextMorph.prototype.selectionStartSlot + = StringMorph.prototype.selectionStartSlot; + +TextMorph.prototype.clearSelection = StringMorph.prototype.clearSelection; + +TextMorph.prototype.deleteSelection = StringMorph.prototype.deleteSelection; + +TextMorph.prototype.selectAll = StringMorph.prototype.selectAll; + +TextMorph.prototype.mouseDownLeft = StringMorph.prototype.mouseDownLeft; + +TextMorph.prototype.shiftClick = StringMorph.prototype.shiftClick; + +TextMorph.prototype.mouseClickLeft = StringMorph.prototype.mouseClickLeft; + +TextMorph.prototype.mouseDoubleClick = StringMorph.prototype.mouseDoubleClick; + +TextMorph.prototype.selectWordAt = StringMorph.prototype.selectWordAt; + +TextMorph.prototype.selectBetweenWordsAt + = StringMorph.prototype.selectBetweenWordsAt; + +TextMorph.prototype.enableSelecting = StringMorph.prototype.enableSelecting; + +TextMorph.prototype.disableSelecting = StringMorph.prototype.disableSelecting; + +TextMorph.prototype.selectAllAndEdit = function () { + this.edit(); + this.selectAll(); +}; + +// TextMorph menus: + +TextMorph.prototype.developersMenu = function () { + var menu = TextMorph.uber.developersMenu.call(this); + menu.addLine(); + menu.addItem("edit", 'edit'); + menu.addItem( + "font size...", + () => { + this.prompt( + menu.title + '\nfont\nsize:', + this.setFontSize, + this, + this.fontSize.toString(), + null, + 6, + 100, + true + ); + }, + 'set this Text\'s\nfont point size' + ); + if (this.alignment !== 'left') { + menu.addItem("align left", 'setAlignmentToLeft'); + } + if (this.alignment !== 'right') { + menu.addItem("align right", 'setAlignmentToRight'); + } + if (this.alignment !== 'center') { + menu.addItem("align center", 'setAlignmentToCenter'); + } + menu.addLine(); + if (this.fontStyle !== 'serif') { + menu.addItem("serif", 'setSerif'); + } + if (this.fontStyle !== 'sans-serif') { + menu.addItem("sans-serif", 'setSansSerif'); + } + if (this.isBold) { + menu.addItem("normal weight", 'toggleWeight'); + } else { + menu.addItem("bold", 'toggleWeight'); + } + if (this.isItalic) { + menu.addItem("normal style", 'toggleItalic'); + } else { + menu.addItem("italic", 'toggleItalic'); + } + return menu; +}; + +TextMorph.prototype.setAlignmentToLeft = function () { + this.alignment = 'left'; + this.rerender(); +}; + +TextMorph.prototype.setAlignmentToRight = function () { + this.alignment = 'right'; + this.rerender(); +}; + +TextMorph.prototype.setAlignmentToCenter = function () { + this.alignment = 'center'; + this.rerender(); +}; + +TextMorph.prototype.toggleIsDraggable + = StringMorph.prototype.toggleIsDraggable; + +TextMorph.prototype.toggleWeight = StringMorph.prototype.toggleWeight; + +TextMorph.prototype.toggleItalic = StringMorph.prototype.toggleItalic; + +TextMorph.prototype.setSerif = StringMorph.prototype.setSerif; + +TextMorph.prototype.setSansSerif = StringMorph.prototype.setSansSerif; + +TextMorph.prototype.setText = StringMorph.prototype.setText; + +TextMorph.prototype.setFontSize = StringMorph.prototype.setFontSize; + +TextMorph.prototype.numericalSetters = StringMorph.prototype.numericalSetters; + +// TextMorph evaluation: + +TextMorph.prototype.evaluationMenu = function () { + var menu = new MenuMorph(this, null); + menu.addItem( + "do it", + 'doIt', + 'evaluate the\nselected expression' + ); + menu.addItem( + "show it", + 'showIt', + 'evaluate the\nselected expression\nand show the result' + ); + menu.addItem( + "inspect it", + 'inspectIt', + 'evaluate the\nselected expression\nand inspect the result' + ); + menu.addLine(); + menu.addItem("select all", 'selectAllAndEdit'); + return menu; +}; + +TextMorph.prototype.setReceiver = function (obj) { + this.receiver = obj; + this.customContextMenu = this.evaluationMenu(); +}; + +TextMorph.prototype.doIt = function () { + this.receiver.evaluateString(this.selection()); + this.edit(); +}; + +TextMorph.prototype.showIt = function () { + var result = this.receiver.evaluateString(this.selection()); + if (result !== null) { + this.inform(result); + } +}; + +TextMorph.prototype.inspectIt = function () { + var result = this.receiver.evaluateString(this.selection()), + world = this.world(), + inspector; + if (isObject(result)) { + inspector = new InspectorMorph(result); + inspector.setPosition(world.hand.position()); + inspector.keepWithin(world); + world.add(inspector); + inspector.changed(); + } +}; + +// TriggerMorph //////////////////////////////////////////////////////// + +// I provide basic button functionality + +// TriggerMorph inherits from Morph: + +TriggerMorph.prototype = new Morph(); +TriggerMorph.prototype.constructor = TriggerMorph; +TriggerMorph.uber = Morph.prototype; + +// TriggerMorph instance creation: + +function TriggerMorph( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + labelColor, + labelBold, + labelItalic, + doubleClickAction +) { + this.init( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + labelColor, + labelBold, + labelItalic, + doubleClickAction + ); +} + +TriggerMorph.prototype.init = function ( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + labelColor, + labelBold, + labelItalic, + doubleClickAction +) { + // additional properties: + this.target = target || null; + this.action = action === 0 ? 0 : action|| null; + this.doubleClickAction = doubleClickAction || null; + this.environment = environment || null; + this.labelString = labelString || ' '; + this.label = null; + this.hint = hint || null; // null, String, or Function + this.schedule = null; // animation slot for displaying hints + this.fontSize = fontSize || MorphicPreferences.menuFontSize; + this.fontStyle = fontStyle || 'sans-serif'; + this.highlightColor = new Color(192, 192, 192); + this.pressColor = new Color(128, 128, 128); + this.labelColor = labelColor || new Color(0, 0, 0); + this.labelBold = labelBold || false; + this.labelItalic = labelItalic || false; + this.userState = 'normal'; // 'highlight', 'pressed' + + // initialize inherited properties: + TriggerMorph.uber.init.call(this); + + // override inherited properites: + this.color = WHITE; + this.createLabel(); +}; + +// TriggerMorph drawing: + +TriggerMorph.prototype.render = function (ctx) { + var colorBak = this.color; + if (this.userState === 'highlight') { + this.color = this.highlightColor; + } else if (this.userState === 'pressed') { + this.color = this.pressColor; + } + TriggerMorph.uber.render.call(this, ctx); + this.color = colorBak; +}; + +TriggerMorph.prototype.createLabel = function () { + if (this.label !== null) { + this.label.destroy(); + } + this.label = new StringMorph( + this.labelString, + this.fontSize, + this.fontStyle, + this.labelBold, + this.labelItalic, + false, // numeric + null, // shadow offset + null, // shadow color + this.labelColor + ); + this.fixLayout(); + this.add(this.label); +}; + +TriggerMorph.prototype.fixLayout = function () { + this.label.setPosition( + this.center().subtract( + this.label.extent().divideBy(2) + ) + ); +}; + +// TriggerMorph action: + +TriggerMorph.prototype.trigger = function () { + /* + if target is a function, use it as callback: + execute target as callback function with action as argument + in the environment as optionally specified. + Note: if action is also a function, instead of becoming + the argument itself it will be called to answer the argument. + for selections, Yes/No Choices etc. As second argument pass + myself, so I can be modified to reflect status changes, e.g. + inside a list box: + + else (if target is not a function): + + if action is a function: + execute the action with target as environment (can be null) + for lambdafied (inline) actions + + else if action is a String: + treat it as function property of target and execute it + for selector-like actions + */ + if (this.schedule) { + this.schedule.isActive = false; + } + if (typeof this.target === 'function') { + if (typeof this.action === 'function') { + this.target.call(this.environment, this.action.call(), this); + } else { + this.target.call(this.environment, this.action, this); + } + } else { + if (typeof this.action === 'function') { + this.action.call(this.target); + } else { // assume it's a String + this.target[this.action](); + } + } +}; + +TriggerMorph.prototype.triggerDoubleClick = function () { + // same as trigger() but use doubleClickAction instead of action property + // note that specifying a doubleClickAction is optional + if (!this.doubleClickAction) {return; } + if (this.schedule) { + this.schedule.isActive = false; + } + if (typeof this.target === 'function') { + if (typeof this.doubleClickAction === 'function') { + this.target.call( + this.environment, + this.doubleClickAction.call(), + this + ); + } else { + this.target.call(this.environment, this.doubleClickAction, this); + } + } else { + if (typeof this.doubleClickAction === 'function') { + this.doubleClickAction.call(this.target); + } else { // assume it's a String + this.target[this.doubleClickAction](); + } + } +}; + +// TriggerMorph events: + +TriggerMorph.prototype.mouseEnter = function () { + var contents = this.hint instanceof Function ? this.hint() : this.hint; + this.userState = 'highlight'; + this.rerender(); + if (contents) { + this.bubbleHelp(contents); + } +}; + +TriggerMorph.prototype.mouseLeave = function () { + this.userState = 'normal'; + this.rerender(); + if (this.schedule) { + this.schedule.isActive = false; + } + if (this.hint) { + this.world().hand.destroyTemporaries(); + } +}; + +TriggerMorph.prototype.mouseDownLeft = function () { + this.userState = 'pressed'; + this.rerender(); +}; + +TriggerMorph.prototype.mouseClickLeft = function () { + this.userState = 'highlight'; + this.rerender(); + this.trigger(); +}; + +TriggerMorph.prototype.mouseDoubleClick = function () { + this.triggerDoubleClick(); +}; + +TriggerMorph.prototype.rootForGrab = function () { + return this.isDraggable ? TriggerMorph.uber.rootForGrab.call(this) : null; +}; + +// TriggerMorph bubble help: + +TriggerMorph.prototype.bubbleHelp = function (contents) { + var world = this.world(); + this.schedule = new Animation( + nop, + nop, + 0, + 500, + nop, + () => this.popUpbubbleHelp(contents) + ); + world.animations.push(this.schedule); +}; + +TriggerMorph.prototype.popUpbubbleHelp = function (contents) { + new SpeechBubbleMorph( + localize(contents), + null, + null, + 1 + ).popUp(this.world(), this.rightCenter().add(new Point(-8, 0))); +}; + +// MenuItemMorph /////////////////////////////////////////////////////// + +// I automatically determine my bounds + +var MenuItemMorph; + +// MenuItemMorph inherits from TriggerMorph: + +MenuItemMorph.prototype = new TriggerMorph(); +MenuItemMorph.prototype.constructor = MenuItemMorph; +MenuItemMorph.uber = TriggerMorph.prototype; + +// MenuItemMorph instance creation: + +function MenuItemMorph( + target, + action, + labelString, // can also be a Morph or a Canvas or a tuple: [icon, string] + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction, // optional when used as list morph item + shortcut // optional string, Morph, Canvas or tuple: [icon, string] +) { + // additional properties: + this.shortcutString = shortcut || null; + this.shortcut = null; + + // initialize inherited properties: + this.init( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction + ); +} + +MenuItemMorph.prototype.createLabel = function () { + var w, h; + if (this.label) { + this.label.destroy(); + } + this.label = this.createLabelPart(this.labelString); + this.add(this.label); + w = this.label.width(); + h = this.label.height(); + if (this.shortcut) { + this.shortcut.destroy(); + } + if (this.shortcutString) { + this.shortcut = this.createLabelPart(this.shortcutString); + w += this.shortcut.width() + 4; + h = Math.max(h, this.shortcut.height()); + this.add(this.shortcut); + } + this.setExtent(new Point(w + 8, h)); +}; + +MenuItemMorph.prototype.fixLayout = function () { + var cntr = this.center(); + this.label.setCenter(cntr); + this.label.setLeft(this.left() + 4); + if (this.shortcut) { + this.shortcut.setCenter(cntr); + this.shortcut.setRight(this.right() - 4); + } +}; + +MenuItemMorph.prototype.createLabelPart = function (source) { + var part, icon, lbl; + if (isString(source)) { + return this.createLabelString(source); + } + if (source instanceof Array) { + // assume its pattern is: [icon, string] + part = new Morph(); + part.alpha = 0; // transparent + icon = this.createIcon(source[0]); + part.add(icon); + lbl = this.createLabelString(source[1]); + part.add(lbl); + lbl.setCenter(icon.center()); + lbl.setLeft(icon.right() + 4); + part.bounds = (icon.bounds.merge(lbl.bounds)); + part.rerender(); + return part; + } + // assume it's either a Morph or a Canvas + return this.createIcon(source); +}; + +MenuItemMorph.prototype.createIcon = function (source) { + // source can be either a Morph or an HTMLCanvasElement + var icon; + + if (source instanceof Morph) { + return source.fullCopy(); + } + // assume a Canvas + icon = new Morph(); + icon.isCachingImage = true; + icon.cachedImage = source; // should we copy the canvas? + icon.bounds.setWidth(source.width); + icon.bounds.setHeight(source.height); + return icon; +}; + +MenuItemMorph.prototype.createLabelString = function (string) { + var lbl = new TextMorph( + string, + this.fontSize, + this.fontStyle, + this.labelBold, + this.labelItalic + ); + lbl.setColor(this.labelColor); + return lbl; +}; + +// MenuItemMorph events: + +MenuItemMorph.prototype.mouseEnter = function () { + var menu = this.parentThatIsA(MenuMorph); + if (this.isShowingSubmenu()) { + return; + } + if (menu) { + menu.closeSubmenu(); + } + if (!this.isListItem()) { + this.userState = 'highlight'; + this.rerender(); + } + if (this.action instanceof MenuMorph) { + this.delaySubmenu(); + } else if (this.hint) { + this.bubbleHelp(this.hint); + } +}; + +MenuItemMorph.prototype.mouseLeave = function () { + if (!this.isListItem()) { + if (this.isShowingSubmenu()) { + this.userState = 'highlight'; + } else { + this.userState = 'normal'; + } + this.rerender(); + } + if (this.schedule) { + this.schedule.isActive = false; + } + if (this.hint) { + this.world().hand.destroyTemporaries(); + } +}; + +MenuItemMorph.prototype.mouseDownLeft = function (pos) { + if (this.isListItem()) { + this.parentThatIsA(MenuMorph).unselectAllItems(); + this.escalateEvent('mouseDownLeft', pos); + } + this.userState = 'pressed'; + this.rerender(); +}; + +MenuItemMorph.prototype.mouseMove = function () { + if (this.isListItem()) { + this.escalateEvent('mouseMove'); + } +}; + +MenuItemMorph.prototype.mouseClickLeft = function () { + if (this.action instanceof MenuMorph) { + this.popUpSubmenu(); + } else { + if (!this.isListItem()) { + this.parentThatIsA(MenuMorph).closeRootMenu(); + this.world().activeMenu = null; + } + this.trigger(); + } +}; + +MenuItemMorph.prototype.isListItem = function () { + var menu = this.parentThatIsA(MenuMorph); + if (menu) { + return menu.isListContents; + } + return false; +}; + +MenuItemMorph.prototype.isSelectedListItem = function () { + if (this.isListItem()) { + return this.userState === 'pressed'; + } + return false; +}; + +MenuItemMorph.prototype.isShowingSubmenu = function () { + var menu = this.parentThatIsA(MenuMorph); + if (menu && (this.action instanceof MenuMorph)) { + return menu.submenu === this.action; + } + return false; +}; + +// MenuItemMorph submenus: + +MenuItemMorph.prototype.delaySubmenu = function () { + var world = this.world(); + this.schedule = new Animation( + nop, + nop, + 0, + 500, + nop, + () => this.popUpSubmenu() + ); + world.animations.push(this.schedule); +}; + +MenuItemMorph.prototype.popUpSubmenu = function () { + var menu = this.parentThatIsA(MenuMorph), + world = this.world(), + scroller; + + if (!(this.action instanceof MenuMorph)) {return; } + this.action.createItems(); + this.action.setPosition(this.topRight().subtract(new Point(0, 5))); + this.action.addShadow(new Point(2, 2), 80); + this.action.keepWithin(this.world()); + if (this.action.items.length < 1 && !this.action.title) {return; } + + if (this.action.bottom() > world.bottom()) { + // scroll menu items if the menu is taller than the world + this.action.removeShadow(); + scroller = this.action.scroll(); + this.action.bounds.corner.y = world.bottom() - 2; + this.action.addShadow(new Point(2, 2), 80); + scroller.setHeight(world.bottom() - scroller.top() - 6); + scroller.adjustScrollBars(); // ? + } + + menu.add(this.action); + menu.submenu = this.action; + menu.submenu.world = menu.world; // keyboard control + this.action.fullChanged(); +}; + +// FrameMorph ////////////////////////////////////////////////////////// + +// I clip my submorphs at my bounds + +// Frames inherit from Morph: + +FrameMorph.prototype = new Morph(); +FrameMorph.prototype.constructor = FrameMorph; +FrameMorph.uber = Morph.prototype; + +function FrameMorph(aScrollFrame) { + this.init(aScrollFrame); +} + +FrameMorph.prototype.init = function (aScrollFrame) { + this.scrollFrame = aScrollFrame || null; + + FrameMorph.uber.init.call(this); + this.color = new Color(255, 250, 245); + this.acceptsDrops = true; + + if (this.scrollFrame) { + this.isDraggable = false; + this.alpha = 0; + } +}; + +FrameMorph.prototype.fullBounds = function () { + var shadow = this.getShadow(); + if (shadow !== null) { + return this.bounds.merge(shadow.bounds); + } + return this.bounds; +}; + +FrameMorph.prototype.fullImage = function () { + // use only for shadows + return this.getImage(); +}; + +FrameMorph.prototype.fullDrawOn = function (ctx, aRect) { + var shadow, clipped; + if (!this.isVisible) {return; } + clipped = this.bounds.intersect(aRect); + if (!clipped.extent().gt(ZERO)) {return; } + this.drawOn(ctx, clipped); + this.children.forEach(child => { + if (child instanceof ShadowMorph) { + shadow = child; + } else { + child.fullDrawOn(ctx, clipped); + } + }); + if (shadow) { + shadow.drawOn(ctx, aRect); + } +}; + +// FrameMorph navigation: + +FrameMorph.prototype.topMorphAt = function (point) { + var i, result; + if (!(this.isVisible && this.bounds.containsPoint(point))) { + return null; + } + for (i = this.children.length - 1; i >= 0; i -= 1) { + result = this.children[i].topMorphAt(point); + if (result) {return result; } + } + if (this.isFreeForm) { + return this.isTransparentAt(point) ? null : this; + } + return this; +}; + +// FrameMorph scrolling support: + +FrameMorph.prototype.submorphBounds = function () { + var result = null; + + if (this.children.length > 0) { + result = this.children[0].bounds; + this.children.forEach(child => { + result = result.merge(child.fullBounds()); + }); + } + return result; +}; + +FrameMorph.prototype.keepInScrollFrame = function () { + if (this.scrollFrame === null) { + return null; + } + if (this.left() > this.scrollFrame.left()) { + this.moveBy( + new Point(this.scrollFrame.left() - this.left(), 0) + ); + } + if (this.right() < this.scrollFrame.right()) { + this.moveBy( + new Point(this.scrollFrame.right() - this.right(), 0) + ); + } + if (this.top() > this.scrollFrame.top()) { + this.moveBy( + new Point(0, this.scrollFrame.top() - this.top()) + ); + } + if (this.bottom() < this.scrollFrame.bottom()) { + this.moveBy( + 0, + new Point(this.scrollFrame.bottom() - this.bottom(), 0) + ); + } +}; + +FrameMorph.prototype.adjustBounds = function () { + var subBounds, + newBounds; + + if (this.scrollFrame === null) {return; } + subBounds = this.submorphBounds(); + if (subBounds && (!this.scrollFrame.isTextLineWrapping)) { + newBounds = subBounds + .expandBy(this.scrollFrame.padding) + .growBy(this.scrollFrame.growth) + .merge(this.scrollFrame.bounds); + } else { + newBounds = this.scrollFrame.bounds.copy(); + } + if (!this.bounds.eq(newBounds)) { + this.bounds = newBounds; + this.keepInScrollFrame(); + } + if (this.scrollFrame.isTextLineWrapping) { + this.children.forEach(morph => { + if (morph instanceof TextMorph) { + morph.setWidth(this.width()); + this.setHeight( + Math.max(morph.height(), this.scrollFrame.height()) + ); + } + }); + } + this.scrollFrame.adjustScrollBars(); +}; + +// FrameMorph dragging & dropping of contents: + +FrameMorph.prototype.reactToDropOf = function () { + this.adjustBounds(); +}; + +FrameMorph.prototype.reactToGrabOf = function () { + this.adjustBounds(); +}; + +// FrameMorph menus: + +FrameMorph.prototype.developersMenu = function () { + var menu = FrameMorph.uber.developersMenu.call(this); + if (this.children.length > 0) { + menu.addLine(); + menu.addItem( + "move all inside...", + 'keepAllSubmorphsWithin', + 'keep all submorphs\nwithin and visible' + ); + } + return menu; +}; + +FrameMorph.prototype.keepAllSubmorphsWithin = function () { + this.children.forEach(m => m.keepWithin(this)); +}; + +// ScrollFrameMorph //////////////////////////////////////////////////// + +ScrollFrameMorph.prototype = new FrameMorph(); +ScrollFrameMorph.prototype.constructor = ScrollFrameMorph; +ScrollFrameMorph.uber = FrameMorph.prototype; + +function ScrollFrameMorph(scroller, size, sliderColor) { + this.init(scroller, size, sliderColor); +} + +ScrollFrameMorph.prototype.init = function (scroller, size, sliderColor) { + ScrollFrameMorph.uber.init.call(this); + this.scrollBarSize = size || MorphicPreferences.scrollBarSize; + this.autoScrollTrigger = null; + this.enableAutoScrolling = true; // change to suppress + this.isScrollingByDragging = true; // change to suppress + this.hasVelocity = true; // dto. + this.padding = 0; // around the scrollable area + this.growth = 0; // pixels or Point to grow right/left when near edge + this.isTextLineWrapping = false; + this.contents = scroller || new FrameMorph(this); + this.add(this.contents); + this.hBar = new SliderMorph( + null, // start + null, // stop + null, // value + null, // size + 'horizontal', + sliderColor + ); + this.hBar.setHeight(this.scrollBarSize); + this.hBar.action = (num) => { + this.contents.setPosition( + new Point( + this.left() - num, + this.contents.position().y + ) + ); + }; + this.hBar.isDraggable = false; + this.add(this.hBar); + this.vBar = new SliderMorph( + null, // start + null, // stop + null, // value + null, // size + 'vertical', + sliderColor + ); + this.vBar.setWidth(this.scrollBarSize); + this.vBar.action = (num) => { + this.contents.setPosition( + new Point( + this.contents.position().x, + this.top() - num + ) + ); + }; + this.vBar.isDraggable = false; + this.add(this.vBar); + this.toolBar = null; // optional slot +}; + +ScrollFrameMorph.prototype.adjustScrollBars = function () { + var hWidth = this.width() - this.scrollBarSize, + vHeight = this.height() - this.scrollBarSize; + + this.changed(); + if (this.contents.width() > this.width()) { + this.hBar.show(); + if (this.hBar.width() !== hWidth) { + this.hBar.setWidth(hWidth); + } + + this.hBar.setPosition( + new Point( + this.left(), + this.bottom() - this.hBar.height() + ) + ); + this.hBar.start = 0; + this.hBar.stop = this.contents.width() - + this.width() + + this.scrollBarSize; + this.hBar.size = + this.width() / this.contents.width() * this.hBar.stop; + this.hBar.value = this.left() - this.contents.left(); + this.hBar.fixLayout(); + } else { + this.hBar.hide(); + } + + if (this.contents.height() > this.height()) { + this.vBar.show(); + if (this.vBar.height() !== vHeight) { + this.vBar.setHeight(vHeight); + } + + this.vBar.setPosition( + new Point( + this.right() - this.vBar.width(), + this.top() + ) + ); + this.vBar.start = 0; + this.vBar.stop = this.contents.height() - + this.height() + + this.scrollBarSize; + this.vBar.size = + this.height() / this.contents.height() * this.vBar.stop; + this.vBar.value = this.top() - this.contents.top(); + this.vBar.fixLayout(); + } else { + this.vBar.hide(); + } + this.adjustToolBar(); +}; + +ScrollFrameMorph.prototype.adjustToolBar = function () { + var padding = 3; + if (this.toolBar) { + this.toolBar.setTop(this.top() + padding); + this.toolBar.setRight( + (this.vBar.isVisible ? this.vBar.left() : this.right()) - padding + ); + } +}; + +ScrollFrameMorph.prototype.addContents = function (aMorph) { + this.contents.add(aMorph); + this.contents.adjustBounds(); +}; + +ScrollFrameMorph.prototype.setContents = function (aMorph) { + this.contents.children.forEach(m => m.destroy()); + this.contents.children = []; + aMorph.setPosition(this.position().add(this.padding + 2)); + this.addContents(aMorph); +}; + +ScrollFrameMorph.prototype.setExtent = function (aPoint) { + if (this.isTextLineWrapping) { + this.contents.setPosition(this.position().copy()); + } + ScrollFrameMorph.uber.setExtent.call(this, aPoint); + this.contents.adjustBounds(); +}; + +// ScrollFrameMorph scrolling by dragging: + +ScrollFrameMorph.prototype.scrollX = function (steps) { + var cl = this.contents.left(), + l = this.left(), + cw = this.contents.width(), + r = this.right(), + newX; + + if (this.vBar.isVisible) { + r -= this.scrollBarSize; + } + + newX = cl + steps; + if (newX + cw < r) { + newX = r - cw; + } + if (newX > l) { + newX = l; + } + if (newX !== cl) { + this.contents.setLeft(newX); + } +}; + +ScrollFrameMorph.prototype.scrollY = function (steps) { + var ct = this.contents.top(), + t = this.top(), + ch = this.contents.height(), + b = this.bottom(), + newY; + + if (this.hBar.isVisible) { + b -= this.scrollBarSize; + } + + newY = ct + steps; + if (newY + ch < b) { + newY = b - ch; + } + if (newY > t) { + newY = t; + } + if (newY !== ct) { + this.contents.setTop(newY); + } +}; + +ScrollFrameMorph.prototype.step = nop; + +ScrollFrameMorph.prototype.mouseDownLeft = function (pos) { + if (!this.isScrollingByDragging) { + return null; + } + var world = this.root(), + hand = world.hand, + oldPos = pos, + deltaX = 0, + deltaY = 0, + friction = 0.8; + + this.step = () => { + var newPos; + if (hand.mouseButton && + (hand.children.length === 0) && + (this.bounds.containsPoint(hand.bounds.origin))) { + + if (hand.grabPosition && + (hand.grabPosition.distanceTo(hand.position()) <= + MorphicPreferences.grabThreshold)) { + // still within the grab threshold + return null; + } + + newPos = hand.bounds.origin; + deltaX = newPos.x - oldPos.x; + if (deltaX !== 0) { + this.scrollX(deltaX); + } + deltaY = newPos.y - oldPos.y; + if (deltaY !== 0) { + this.scrollY(deltaY); + } + oldPos = newPos; + } else { + if (!this.hasVelocity) { + this.step = nop; + } else { + if ((Math.abs(deltaX) < 0.5) && + (Math.abs(deltaY) < 0.5)) { + this.step = nop; + } else { + deltaX = deltaX * friction; + this.scrollX(Math.round(deltaX)); + deltaY = deltaY * friction; + this.scrollY(Math.round(deltaY)); + } + } + } + this.adjustScrollBars(); + }; +}; + +ScrollFrameMorph.prototype.startAutoScrolling = function () { + var inset = MorphicPreferences.scrollBarSize * 3, + world = this.world(), + hand, + inner, + pos; + + if (!world) { + return null; + } + hand = world.hand; + if (!this.autoScrollTrigger) { + this.autoScrollTrigger = Date.now(); + } + this.step = () => { + pos = hand.bounds.origin; + inner = this.bounds.insetBy(inset); + if ((this.bounds.containsPoint(pos)) && + (!(inner.containsPoint(pos))) && + (hand.children.length > 0)) { + this.autoScroll(pos); + } else { + this.step = nop; + this.autoScrollTrigger = null; + } + }; +}; + +ScrollFrameMorph.prototype.autoScroll = function (pos) { + var inset, area; + + if (Date.now() - this.autoScrollTrigger < 500) { + return null; + } + + inset = MorphicPreferences.scrollBarSize * 3; + area = this.topLeft().extent(new Point(this.width(), inset)); + if (area.containsPoint(pos)) { + this.scrollY(inset - (pos.y - this.top())); + } + area = this.topLeft().extent(new Point(inset, this.height())); + if (area.containsPoint(pos)) { + this.scrollX(inset - (pos.x - this.left())); + } + area = (new Point(this.right() - inset, this.top())) + .extent(new Point(inset, this.height())); + if (area.containsPoint(pos)) { + this.scrollX(-(inset - (this.right() - pos.x))); + } + area = (new Point(this.left(), this.bottom() - inset)) + .extent(new Point(this.width(), inset)); + if (area.containsPoint(pos)) { + this.scrollY(-(inset - (this.bottom() - pos.y))); + } + this.adjustScrollBars(); +}; + +// ScrollFrameMorph scrolling by editing text: + +ScrollFrameMorph.prototype.scrollCursorIntoView = function (morph) { + var txt = morph.target, + offset = txt.position().subtract(this.contents.position()), + ft = this.top() + this.padding, + fb = this.bottom() - this.padding; + this.contents.setExtent(txt.extent().add(offset).add(this.padding)); + if (morph.top() < ft) { + this.contents.setTop(this.contents.top() + ft - morph.top()); + morph.setTop(ft); + } else if (morph.bottom() > fb) { + this.contents.setBottom(this.contents.bottom() + fb - morph.bottom()); + morph.setBottom(fb); + } + this.adjustScrollBars(); +}; + +// ScrollFrameMorph events: + +ScrollFrameMorph.prototype.mouseScroll = function (y, x) { + if (y) { + this.scrollY(y * MorphicPreferences.mouseScrollAmount); + } + if (x) { + this.scrollX(x * MorphicPreferences.mouseScrollAmount); + } + this.adjustScrollBars(); +}; + +// ScrollFrameMorph duplicating: + +ScrollFrameMorph.prototype.updateReferences = function (map) { + ScrollFrameMorph.uber.updateReferences.call(this, map); + if (this.hBar) { + this.hBar.action = (num) => { + this.contents.setPosition( + new Point(this.left() - num, this.contents.position().y) + ); + }; + } + if (this.vBar) { + this.vBar.action = (num) => { + this.contents.setPosition( + new Point(this.contents.position().x, this.top() - num) + ); + }; + } +}; + +// ScrollFrameMorph menu: + +ScrollFrameMorph.prototype.developersMenu = function () { + var menu = ScrollFrameMorph.uber.developersMenu.call(this); + if (this.isTextLineWrapping) { + menu.addItem( + "auto line wrap off...", + 'toggleTextLineWrapping', + 'turn automatic\nline wrapping\noff' + ); + } else { + menu.addItem( + "auto line wrap on...", + 'toggleTextLineWrapping', + 'enable automatic\nline wrapping' + ); + } + return menu; +}; + +ScrollFrameMorph.prototype.toggleTextLineWrapping = function () { + this.isTextLineWrapping = !this.isTextLineWrapping; +}; + +// ListMorph /////////////////////////////////////////////////////////// + +ListMorph.prototype = new ScrollFrameMorph(); +ListMorph.prototype.constructor = ListMorph; +ListMorph.uber = ScrollFrameMorph.prototype; + +function ListMorph( + elements, + labelGetter, + format, + onDoubleClick, + separator, + verbatim +) { +/* + passing a format is optional. If the format parameter is specified + it has to be of the following pattern: + + [ + [, ], + ['bold', ], + ['italic', ], + ... + ] + + multiple conditions can be passed in such a format list, the + last predicate to evaluate true when given the list element sets + the given format category (color, bold, italic). + If no condition is met, the default format (color black, non-bold, + non-italic) will be assigned. + + An example of how to use fomats can be found in the InspectorMorph's + "markOwnProperties" mechanism. +*/ + this.init( + elements || [], + labelGetter || function (element) { + if (isString(element)) { + return element; + } + if (element.toSource) { + return element.toSource(); + } + return element.toString(); + }, + format || [], + onDoubleClick, // optional callback + separator, // string indicating a horizontal line between items + verbatim + ); +} + +ListMorph.prototype.init = function ( + elements, + labelGetter, + format, + onDoubleClick, + separator, + verbatim +) { + ListMorph.uber.init.call(this); + + this.contents.acceptsDrops = false; + this.color = WHITE; + this.hBar.alpha = 0.6; + this.vBar.alpha = 0.6; + this.elements = elements || []; + this.labelGetter = labelGetter; + this.format = format; + this.listContents = null; + this.selected = null; // actual element currently selected + this.active = null; // menu item representing the selected element + this.action = null; + this.doubleClickAction = onDoubleClick || null; + this.separator = separator || ''; + this.verbatim = isNil(verbatim) ? true : verbatim; + this.acceptsDrops = false; + this.buildListContents(); +}; + +ListMorph.prototype.buildListContents = function () { + if (this.listContents) { + this.listContents.destroy(); + } + this.listContents = new MenuMorph( + this.select, + null, + this + ); + if (this.elements.length === 0) { + this.elements = ['(empty)']; + } + this.elements.forEach(element => { + var color = null, + bold = false, + italic = false, + label; + + this.format.forEach(pair => { + if (pair[1].call(null, element)) { + if (pair[0] === 'bold') { + bold = true; + } else if (pair[0] === 'italic') { + italic = true; + } else { // assume it's a color + color = pair[0]; + } + } + }); + + label = this.labelGetter(element); + if (label === this.separator) { + this.listContents.addLine(); + } else { + this.listContents.addItem( + label, // label string + element, // action + null, // hint + color, + bold, + italic, + this.doubleClickAction, + null, // shortcut + this.verbatim // don't translate + ); + } + }); + this.listContents.isListContents = true; + this.listContents.createItems(); + this.listContents.setPosition(this.contents.position()); + this.addContents(this.listContents); +}; + +ListMorph.prototype.select = function (item, trigger) { + if (isNil(item)) {return; } + this.selected = item; + this.active = trigger; + if (this.action) { + this.action.call(null, item); + } +}; + +ListMorph.prototype.setExtent = function (aPoint) { + var lb = this.listContents.bounds, + nb = this.bounds.origin.copy().corner( + this.bounds.origin.add(aPoint) + ); + + if (nb.right() > lb.right() && nb.width() <= lb.width()) { + this.listContents.setRight(nb.right()); + } + if (nb.bottom() > lb.bottom() && nb.height() <= lb.height()) { + this.listContents.setBottom(nb.bottom()); + } + ListMorph.uber.setExtent.call(this, aPoint); +}; + +ListMorph.prototype.activeIndex = function () { + return this.listContents.children.indexOf(this.active); +}; + +ListMorph.prototype.activateIndex = function (idx) { + var item = this.listContents.children[idx]; + if (!item) {return; } + item.userState = 'pressed'; + item.rerender(); + item.trigger(); +}; + +// StringFieldMorph //////////////////////////////////////////////////// + +// StringFieldMorph inherit from FrameMorph: + +StringFieldMorph.prototype = new FrameMorph(); +StringFieldMorph.prototype.constructor = StringFieldMorph; +StringFieldMorph.uber = FrameMorph.prototype; + +function StringFieldMorph( + defaultContents, + minWidth, + fontSize, + fontStyle, + bold, + italic, + isNumeric +) { + this.init( + defaultContents || '', + minWidth || 100, + fontSize || 12, + fontStyle || 'sans-serif', + bold || false, + italic || false, + isNumeric + ); +} + +StringFieldMorph.prototype.init = function ( + defaultContents, + minWidth, + fontSize, + fontStyle, + bold, + italic, + isNumeric +) { + this.defaultContents = defaultContents; + this.minWidth = minWidth; + this.fontSize = fontSize; + this.fontStyle = fontStyle; + this.isBold = bold; + this.isItalic = italic; + this.isNumeric = isNumeric || false; + this.text = null; + StringFieldMorph.uber.init.call(this); + this.color = WHITE; + this.isEditable = true; + this.acceptsDrops = false; + this.createText(); +}; + +StringFieldMorph.prototype.createText = function () { + var txt; + txt = this.text ? this.string() : this.defaultContents; + this.text = null; + this.children.forEach(child => child.destroy()); + this.children = []; + this.text = new StringMorph( + txt, + this.fontSize, + this.fontStyle, + this.isBold, + this.isItalic, + this.isNumeric + ); + + this.text.isNumeric = this.isNumeric; // for whichever reason... + this.text.setPosition(this.bounds.origin.copy()); + this.text.isEditable = this.isEditable; + this.text.isDraggable = false; + this.text.enableSelecting(); + this.setExtent( + new Point( + Math.max(this.width(), this.minWidth), + this.text.height() + ) + ); + this.add(this.text); +}; + +StringFieldMorph.prototype.string = function () { + return this.text.text; +}; + +StringFieldMorph.prototype.mouseClickLeft = function (pos) { + if (this.isEditable) { + this.text.edit(); + } else { + this.escalateEvent('mouseClickLeft', pos); + } +}; + +// BouncerMorph //////////////////////////////////////////////////////// + +// I am a Demo of a stepping custom Morph + +var BouncerMorph; + +// Bouncers inherit from Morph: + +BouncerMorph.prototype = new Morph(); +BouncerMorph.prototype.constructor = BouncerMorph; +BouncerMorph.uber = Morph.prototype; + +// BouncerMorph instance creation: + +function BouncerMorph() { + this.init(); +} + +// BouncerMorph initialization: + +BouncerMorph.prototype.init = function (type, speed) { + BouncerMorph.uber.init.call(this); + this.fps = 50; + + // additional properties: + this.isStopped = false; + this.type = type || 'vertical'; + if (this.type === 'vertical') { + this.direction = 'down'; + } else { + this.direction = 'right'; + } + this.speed = speed || 1; +}; + +// BouncerMorph moving: + +BouncerMorph.prototype.moveUp = function () { + this.moveBy(new Point(0, -this.speed)); +}; + +BouncerMorph.prototype.moveDown = function () { + this.moveBy(new Point(0, this.speed)); +}; + +BouncerMorph.prototype.moveRight = function () { + this.moveBy(new Point(this.speed, 0)); +}; + +BouncerMorph.prototype.moveLeft = function () { + this.moveBy(new Point(-this.speed, 0)); +}; + +// BouncerMorph stepping: + +BouncerMorph.prototype.step = function () { + if (!this.isStopped) { + if (this.type === 'vertical') { + if (this.direction === 'down') { + this.moveDown(); + } else { + this.moveUp(); + } + if (this.fullBounds().top() < this.parent.top() && + this.direction === 'up') { + this.direction = 'down'; + } + if (this.fullBounds().bottom() > this.parent.bottom() && + this.direction === 'down') { + this.direction = 'up'; + } + } else if (this.type === 'horizontal') { + if (this.direction === 'right') { + this.moveRight(); + } else { + this.moveLeft(); + } + if (this.fullBounds().left() < this.parent.left() && + this.direction === 'left') { + this.direction = 'right'; + } + if (this.fullBounds().right() > this.parent.right() && + this.direction === 'right') { + this.direction = 'left'; + } + } + } +}; + +// HandMorph /////////////////////////////////////////////////////////// + +// I represent the Mouse cursor + +// HandMorph inherits from Morph: + +HandMorph.prototype = new Morph(); +HandMorph.prototype.constructor = HandMorph; +HandMorph.uber = Morph.prototype; + +// HandMorph instance creation: + +function HandMorph(aWorld) { + this.init(aWorld); +} + +// HandMorph initialization: + +HandMorph.prototype.init = function (aWorld) { + HandMorph.uber.init.call(this, true); + this.bounds = new Rectangle(); + + // additional properties: + this.world = aWorld; + this.mouseButton = null; + this.mouseOverList = []; + this.mouseOverBounds = []; + this.morphToGrab = null; + this.grabPosition = null; + this.grabOrigin = null; + this.temporaries = []; + this.touchHoldTimeout = null; + this.contextMenuEnabled = false; + this.touchStartPosition = null; + + // properties for caching dragged objects: + this.cachedFullImage = null; + this.cachedFullBounds = null; +}; + +// HandMorph dragging optimizations: + +HandMorph.prototype.changed = function () { + var b; + if (this.world !== null) { + b = this.cachedFullBounds || this.fullBounds(); + if (!b.extent().eq(ZERO)) { + this.world.broken.push(b.spread()); + } + } +}; + +HandMorph.prototype.moveBy = function (delta) { + var children = this.children, + i = children.length; + this.changed(); + this.bounds = this.bounds.translateBy(delta); + if (this.cachedFullBounds) { + this.cachedFullBounds = this.cachedFullBounds.translateBy(delta); + } + this.changed(); + for (i; i > 0; i -= 1) { + children[i - 1].moveBy(delta); + } +}; + +HandMorph.prototype.fullChanged = HandMorph.prototype.changed; + +// HandMorph display: + +HandMorph.prototype.fullDrawOn = function (ctx, rect) { + if (!this.cachedFullBounds) { + HandMorph.uber.fullDrawOn.call(this, ctx, rect); + return; + } + + var clipped = rect.intersect(this.cachedFullBounds), + pos = this.cachedFullBounds.origin, + pic, src, w, h, sl, st; + + if (!clipped.extent().gt(ZERO)) {return; } + ctx.save(); + ctx.globalAlpha = this.alpha; + pic = this.cachedFullImage; + src = clipped.translateBy(pos.neg()); + sl = src.left(); + st = src.top(); + w = Math.min(src.width(), pic.width - sl); + h = Math.min(src.height(), pic.height - st); + if (w < 1 || h < 1) {return; } + ctx.drawImage( + pic, + sl, + st, + w, + h, + clipped.left(), + clipped.top(), + w, + h + ); + ctx.restore(); +}; + +// HandMorph navigation: + +HandMorph.prototype.morphAtPointer = function () { + return this.world.topMorphAt(this.bounds.origin) || this.world; +}; + +HandMorph.prototype.allMorphsAtPointer = function () { + return this.world.allChildren().filter(m => m.isVisible && + m.visibleBounds().containsPoint(this.bounds.origin) && + !m.holes.some(any => + any.translateBy(m.position()).containsPoint(this.bounds.origin)) + ); +}; + +// HandMorph dragging and dropping: +/* + drag 'n' drop events, method(arg) -> receiver: + + prepareToBeGrabbed(handMorph) -> grabTarget + reactToGrabOf(grabbedMorph) -> oldParent + wantsDropOf(morphToDrop) -> newParent + justDropped(handMorph) -> droppedMorph + reactToDropOf(droppedMorph, handMorph) -> newParent +*/ + +HandMorph.prototype.dropTargetFor = function (aMorph) { + var target = this.morphAtPointer(); + while (!target.wantsDropOf(aMorph)) { + target = target.parent; + } + return target; +}; + +HandMorph.prototype.grab = function (aMorph) { + var oldParent; + if (!aMorph) { + return null; + } + oldParent = aMorph.parent; + if (aMorph instanceof WorldMorph) { + return null; + } + if (this.children.length === 0) { + this.world.stopEditing(); + this.grabOrigin = aMorph.situation(); + if (aMorph.prepareToBeGrabbed) { + aMorph.prepareToBeGrabbed(this); + } + if (!aMorph.noDropShadow) { + aMorph.addShadow(); + } + + // cache the dragged object's display resources + this.cachedFullImage = aMorph.fullImage(); + this.cachedFullBounds = aMorph.fullBounds(); + + this.add(aMorph); + this.changed(); + if (oldParent && oldParent.reactToGrabOf) { + oldParent.reactToGrabOf(aMorph); + } + } +}; + +HandMorph.prototype.drop = function () { + var target, morphToDrop; + this.alpha = 1; + if (this.children.length !== 0) { + morphToDrop = this.children[0]; + target = this.dropTargetFor(morphToDrop); + target = target.selectForEdit ? target.selectForEdit() : target; + this.changed(); + target.add(morphToDrop); + morphToDrop.changed(); + + // invalidate dragging-cache + this.cachedFullImage = null; + this.cachedFullBounds = null; + + if (!morphToDrop.noDropShadow) { + morphToDrop.removeShadow(); + } + this.children = []; + this.setExtent(new Point()); + if (morphToDrop.justDropped) { + morphToDrop.justDropped(this); + } + if (target.reactToDropOf) { + target.reactToDropOf(morphToDrop, this); + } + } +}; + +// HandMorph event dispatching: +/* + mouse events: + + mouseDownLeft + mouseDownRight + mouseClickLeft + mouseClickRight + mouseDoubleClick + mouseEnter + mouseLeave + mouseEnterDragging + mouseLeaveDragging + mouseEnterBounds + mouseLeaveBounds + mouseMove + mouseScroll +*/ + +HandMorph.prototype.processMouseDown = function (event) { + var morph, actualClick, + posInDocument = getDocumentPositionOf(this.world.worldCanvas); + + // update my position, in case I've just been initialized + if (event.pageX) { + this.setPosition(new Point( + event.pageX - posInDocument.x, + event.pageY - posInDocument.y + )); + } + + // process the actual event + this.destroyTemporaries(); + this.contextMenuEnabled = true; + this.morphToGrab = null; + this.grabPosition = null; + if (this.children.length !== 0) { + this.drop(); + this.mouseButton = null; + } else { + morph = this.morphAtPointer(); + if (this.world.activeMenu) { + if (!contains( + morph.allParents(), + this.world.activeMenu + )) { + this.world.activeMenu.destroy(); + } else { + clearInterval(this.touchHoldTimeout); + } + } + if (this.world.activeHandle) { + if (morph !== this.world.activeHandle) { + this.world.activeHandle.destroy(); + } + } + if (this.world.cursor) { + if (morph !== this.world.cursor.target) { + this.world.stopEditing(); + } + } + if (!morph.mouseMove) { + this.morphToGrab = morph.rootForGrab(); + this.grabPosition = this.bounds.origin.copy(); + } + if (event.button === 2 || event.ctrlKey) { + this.mouseButton = 'right'; + actualClick = 'mouseDownRight'; + } else { + this.mouseButton = 'left'; + actualClick = 'mouseDownLeft'; + } + while (!morph[actualClick]) { + morph = morph.parent; + } + morph[actualClick](this.bounds.origin); + } +}; + +HandMorph.prototype.processTouchStart = function (event) { + MorphicPreferences.isTouchDevice = true; + clearInterval(this.touchHoldTimeout); + if (event.touches.length === 1) { + this.touchStartPosition = new Point( + event.touches[0].pageX, + event.touches[0].pageY + ); + this.touchHoldTimeout = setInterval( // simulate mouseRightClick + () => { + this.processMouseDown({button: 2}); + this.processMouseUp({button: 2}); + event.preventDefault(); + clearInterval(this.touchHoldTimeout); + }, + 400 + ); + this.processMouseMove(event.touches[0]); // update my position + this.processMouseDown({button: 0}); + event.preventDefault(); + } +}; + +HandMorph.prototype.processTouchMove = function (event) { + var pos = new Point(event.touches[0].pageX, event.touches[0].pageY); + MorphicPreferences.isTouchDevice = true; + if (this.touchStartPosition.distanceTo(pos) < + MorphicPreferences.grabThreshold) { + return; + } + if (event.touches.length === 1) { + var touch = event.touches[0]; + this.processMouseMove(touch); + clearInterval(this.touchHoldTimeout); + } +}; + +HandMorph.prototype.processTouchEnd = function (event) { + MorphicPreferences.isTouchDevice = true; + clearInterval(this.touchHoldTimeout); + nop(event); + this.processMouseUp({button: 0}); +}; + +HandMorph.prototype.processMouseUp = function () { + var morph = this.morphAtPointer(), + context, + contextMenu, + expectedClick; + + this.destroyTemporaries(); + if (this.children.length !== 0) { + this.drop(); + } else { + if (this.mouseButton === 'left') { + expectedClick = 'mouseClickLeft'; + } else { + expectedClick = 'mouseClickRight'; + if (this.mouseButton && this.contextMenuEnabled) { + context = morph; + contextMenu = context.contextMenu(); + while ((!contextMenu) && + context.parent) { + context = context.parent; + contextMenu = context.contextMenu(); + } + if (contextMenu) { + contextMenu.popUpAtHand(this.world); + } + } + } + while (!morph[expectedClick]) { + morph = morph.parent; + } + morph[expectedClick](this.bounds.origin); + } + this.mouseButton = null; +}; + +HandMorph.prototype.processDoubleClick = function () { + var morph = this.morphAtPointer(); + + this.destroyTemporaries(); + if (this.children.length !== 0) { + this.drop(); + } else { + while (morph && !morph.mouseDoubleClick) { + morph = morph.parent; + } + if (morph) { + morph.mouseDoubleClick(this.bounds.origin); + } + } + this.mouseButton = null; +}; + +HandMorph.prototype.processMouseMove = function (event) { + var pos, + posInDocument = getDocumentPositionOf(this.world.worldCanvas), + mouseOverNew, + mouseOverBoundsNew, + morph, + topMorph; + + pos = new Point( + event.pageX - posInDocument.x, + event.pageY - posInDocument.y + ); + + this.setPosition(pos); + + // determine the new mouse-over-list: + mouseOverNew = this.morphAtPointer().allParents(); + mouseOverBoundsNew = mouseOverNew.filter(m => m.isVisible && + m.visibleBounds().containsPoint(this.bounds.origin) && + !m.holes.some(any => + any.translateBy(m.position()).containsPoint(this.bounds.origin)) + ); + + if (!this.children.length && this.mouseButton) { + topMorph = this.morphAtPointer(); + morph = topMorph.rootForGrab(); + if (topMorph.mouseMove) { + topMorph.mouseMove(pos, this.mouseButton); + if (this.mouseButton === 'right') { + this.contextMenuEnabled = false; + } + } + + // if a morph is marked for grabbing, just grab it + if (this.mouseButton === 'left' && + this.morphToGrab && + (this.grabPosition.distanceTo(this.bounds.origin) > + MorphicPreferences.grabThreshold)) { + this.setPosition(this.grabPosition); + if (this.morphToGrab.isDraggable) { + morph = this.morphToGrab.selectForEdit ? + this.morphToGrab.selectForEdit() : this.morphToGrab; + this.grab(morph); + } else if (this.morphToGrab.isTemplate) { + this.world.stopEditing(); + morph = this.morphToGrab.fullCopy(); + morph.isTemplate = false; + morph.isDraggable = true; + if (morph.reactToTemplateCopy) { + morph.reactToTemplateCopy(); + } + this.grab(morph); + this.grabOrigin = this.morphToGrab.situation(); + } + this.setPosition(pos); + } + } + + this.mouseOverBounds.forEach(old => { + if (!contains(mouseOverBoundsNew, old)) { + if (old.mouseLeaveBounds) { + old.mouseLeaveBounds(this.children[0]); + } + } + }); + mouseOverBoundsNew.forEach(newMorph => { + if (!contains(this.mouseOverBounds, newMorph)) { + if (newMorph.mouseEnterBounds) { + newMorph.mouseEnterBounds(this.children[0]); + } + } + }); + + this.mouseOverList.forEach(old => { + if (!contains(mouseOverNew, old)) { + if (old.mouseLeave) { + old.mouseLeave(); + } + if (old.mouseLeaveDragging && this.mouseButton) { + old.mouseLeaveDragging(this.children[0]); + } + } + }); + mouseOverNew.forEach(newMorph => { + if (!contains(this.mouseOverList, newMorph)) { + if (newMorph.mouseEnter) { + newMorph.mouseEnter(); + } + if (newMorph.mouseEnterDragging && this.mouseButton) { + newMorph.mouseEnterDragging(this.children[0]); + } + } + + // autoScrolling support: + if (this.children.length > 0) { + if (newMorph instanceof ScrollFrameMorph && + newMorph.enableAutoScrolling && + newMorph.contents.allChildren().some(any => { + return any.wantsDropOf(this.children[0]); + }) + ) { + if (!newMorph.bounds.insetBy( + MorphicPreferences.scrollBarSize * 3 + ).containsPoint(this.bounds.origin)) { + newMorph.startAutoScrolling(); + } + } + } + }); + this.mouseOverList = mouseOverNew; + this.mouseOverBounds = mouseOverBoundsNew; +}; + +HandMorph.prototype.processMouseScroll = function (event) { + var morph = this.morphAtPointer(); + while (morph && !morph.mouseScroll) { + morph = morph.parent; + } + if (morph) { + morph.mouseScroll( + (event.detail / -3) || ( + Object.prototype.hasOwnProperty.call( + event, + 'wheelDeltaY' + ) ? + event.wheelDeltaY / 120 : + event.wheelDelta / 120 + ), + event.wheelDeltaX / 120 || 0 + ); + } +}; + +/* + drop event: + + droppedImage + droppedSVG + droppedAudio + droppedText + + beginBulkDrop + endBulkDrop +*/ + +HandMorph.prototype.processDrop = function (event) { +/* + find out whether an external image or audio file was dropped + onto the world canvas, turn it into an offscreen canvas or audio + element and dispatch the + + droppedImage(canvas, name, embeddedData) + droppedSVG(image, name) + droppedAudio(audio, name) + droppedText(text, name, type) + + events to interested Morphs at the mouse pointer. + + In case multiple files are dropped simulateneously also displatch + the events + + beginBulkDrop() + endBulkDrop() + + to Morphs interested in bracketing the bulk operation +*/ + var files = event instanceof FileList ? event + : event.target.files || event.dataTransfer.files, + file, + fileCount, + url = event.dataTransfer ? + event.dataTransfer.getData('URL') : null, + txt = event.dataTransfer ? + event.dataTransfer.getData('Text/HTML') : null, + suffix, + src, + target = this.morphAtPointer(), + img = new Image(), + canvas, + i; + + function readSVG(aFile) { + var pic = new Image(), + frd = new FileReader(), + trg = target; + while (!trg.droppedSVG) { + trg = trg.parent; + } + pic.onload = () => { + trg.droppedSVG(pic, aFile.name); + bulkDrop(); + }; + frd = new FileReader(); + frd.onloadend = (e) => pic.src = e.target.result; + frd.readAsDataURL(aFile); + } + + function readImage(aFile) { + var pic = new Image(), + frd = new FileReader(), + trg = target, + embedTag = MorphicPreferences.pngPayloadMarker; + + while (!trg.droppedImage) { + trg = trg.parent; + } + + pic.onload = () => { + (async () => { + // extract embedded data (e.g. blocks) + // from the image's metadata if present + var buff = new Uint8Array(await aFile?.arrayBuffer()), + strBuff = buff.reduce((acc, b) => + acc + String.fromCharCode(b), ""), + embedded; + + if (strBuff.includes(embedTag)) { + try { + embedded = decodeURIComponent( + (strBuff)?.split(embedTag)[1] + ); + } catch (err) { + console.log(err); + } + } + canvas = newCanvas(new Point(pic.width, pic.height), true); + canvas.getContext('2d').drawImage(pic, 0, 0); + trg.droppedImage(canvas, aFile.name, embedded); + bulkDrop(); + })(); + }; + + frd = new FileReader(); + frd.onloadend = (e) => pic.src = e.target.result; + frd.readAsDataURL(aFile); + } + + function readAudio(aFile) { + var snd = new Audio(), + frd = new FileReader(), + trg = target; + while (!trg.droppedAudio) { + trg = trg.parent; + } + frd.onloadend = (e) => { + snd.src = e.target.result; + trg.droppedAudio(snd, aFile.name); + bulkDrop(); + }; + frd.readAsDataURL(aFile); + } + + function readText(aFile) { + var frd = new FileReader(), + trg = target; + while (!trg.droppedText) { + trg = trg.parent; + } + frd.onloadend = (e) => { + trg.droppedText(e.target.result, aFile.name, aFile.type); + bulkDrop(); + }; + frd.readAsText(aFile); + } + + function readBinary(aFile) { + var frd = new FileReader(), + trg = target; + while (!trg.droppedBinary) { + trg = trg.parent; + } + frd.onloadend = (e) => { + trg.droppedBinary(e.target.result, aFile.name); + bulkDrop(); + }; + frd.readAsArrayBuffer(aFile); + } + + function beginBulkDrop() { + var trg = target; + while (!trg.beginBulkDrop) { + trg = trg.parent; + } + trg.beginBulkDrop(); + } + + function bulkDrop() { + var trg = target; + fileCount -= 1; + if (files.length > 1 && fileCount === 0) { + while (!trg.endBulkDrop) { + trg = trg.parent; + } + trg.endBulkDrop(); + } + } + + function readURL(url, callback) { + var request = new XMLHttpRequest(); + request.open('GET', url); + request.onreadystatechange = () => { + if (request.readyState === 4) { + if (request.responseText) { + callback(request.responseText); + } else { + throw new Error('unable to retrieve ' + url); + } + } + }; + request.send(); + } + + function parseImgURL(html) { + var iurl = '', + idx, + c, + start = html.indexOf(' 0) { + fileCount = files.length; + if (fileCount > 1) { + beginBulkDrop(); + } + for (i = 0; i < files.length; i += 1) { + file = files[i]; + suffix = file.name.slice( + file.name.lastIndexOf('.') + 1 + ).toLowerCase(); + if (file.type.indexOf("svg") !== -1 + && !MorphicPreferences.rasterizeSVGs) { + readSVG(file); + } else if (file.type.indexOf("image") === 0) { + readImage(file); + } else if (file.type.indexOf("audio") === 0 || + file.type.indexOf("ogg") > -1) { + // check the file-extension because Firefox + // thinks OGGs are videos + readAudio(file); + } else if ((file.type.indexOf("text") === 0) || + contains(['txt', 'csv', 'json'], suffix)) { + // check the file-extension because Windows + // doesn't specify CSVs to be text/csv, sigh + readText(file); + } else { // assume it's meant to be binary + readBinary(file); + } + } + } else if (url) { + suffix = url.slice(url.lastIndexOf('.') + 1).toLowerCase(); + if ( + contains( + ['gif', 'png', 'jpg', 'jpeg', 'bmp'], + suffix + ) + ) { + while (!target.droppedImage) { + target = target.parent; + } + img = new Image(); + img.onload = () => { + canvas = newCanvas(new Point(img.width, img.height), true); + canvas.getContext('2d').drawImage(img, 0, 0); + target.droppedImage(canvas); + }; + img.src = url; + } else if (suffix === 'svg' && !MorphicPreferences.rasterizeSVGs) { + while (!target.droppedSVG) { + target = target.parent; + } + readURL( + url, + txt => { + var pic = new Image(); + pic.onload = () => { + target.droppedSVG( + pic, + url.slice( + url.lastIndexOf('/') + 1, + url.lastIndexOf('.') + ) + ); + }; + pic.src = 'data:image/svg+xml;utf8,' + + encodeURIComponent(txt); + } + ); + } + } else if (txt) { + while (!target.droppedImage) { + target = target.parent; + } + img = new Image(); + img.onload = () => { + canvas = newCanvas(new Point(img.width, img.height), true); + canvas.getContext('2d').drawImage(img, 0, 0); + target.droppedImage(canvas); + }; + src = parseImgURL(txt); + if (src) {img.src = src; } + } +}; + +// HandMorph tools + +HandMorph.prototype.destroyTemporaries = function () { +/* + temporaries are just an array of morphs which will be deleted upon + the next mouse click, or whenever another temporary Morph decides + that it needs to remove them. The primary purpose of temporaries is + to display tools tips of speech bubble help. +*/ + this.temporaries.forEach(morph => { + if (!(morph.isClickable + && morph.bounds.containsPoint(this.position()))) { + morph.destroy(); + this.temporaries.splice(this.temporaries.indexOf(morph), 1); + } + }); +}; + +// WorldMorph ////////////////////////////////////////////////////////// + +// I represent the element + +// WorldMorph inherits from FrameMorph: + +WorldMorph.prototype = new FrameMorph(); +WorldMorph.prototype.constructor = WorldMorph; +WorldMorph.uber = FrameMorph.prototype; + +// WorldMorph global settings & examples + +WorldMorph.prototype.customMorphs = []; + +// WorldMorph instance creation: + +function WorldMorph(aCanvas, fillPage) { + this.init(aCanvas, fillPage); +} + +// WorldMorph initialization: + +WorldMorph.prototype.init = function (aCanvas, fillPage) { + WorldMorph.uber.init.call(this); + this.color = new Color(205, 205, 205); + this.alpha = 1; + this.bounds = new Rectangle(0, 0, aCanvas.width, aCanvas.height); + this.isVisible = true; + this.isDraggable = false; + this.currentKey = null; // currently pressed key code + this.worldCanvas = aCanvas; + + // additional properties: + this.stamp = Date.now(); // reference in multi-world setups + while (this.stamp === Date.now()) {nop(); } + this.stamp = Date.now(); + + this.useFillPage = fillPage; + if (this.useFillPage === undefined) { + this.useFillPage = true; + } + this.isDevMode = false; + this.broken = []; + this.animations = []; + this.hand = new HandMorph(this); + this.keyboardHandler = null; + this.keyboardFocus = null; + this.cursor = null; + this.lastEditedText = null; + this.activeMenu = null; + this.activeHandle = null; + + if (!fillPage && aCanvas.isRetinaEnabled) { + this.initRetina(); + } + + this.initKeyboardHandler(); + this.resetKeyboardHandler(); + this.initEventListeners(); +}; + +// World Morph display: + +WorldMorph.prototype.fullDrawOn = function (aContext, aRect) { + WorldMorph.uber.fullDrawOn.call(this, aContext, aRect); + this.hand.fullDrawOn(aContext, aRect); +}; + +WorldMorph.prototype.updateBroken = function () { + var ctx = this.worldCanvas.getContext('2d'); + this.condenseDamages(); + this.broken.forEach(rect => { + if (rect.extent().gt(ZERO)) { + this.fullDrawOn(ctx, rect); + } + }); + this.broken = []; +}; + +WorldMorph.prototype.stepAnimations = function () { + this.animations.forEach(anim => anim.step()); + this.animations = this.animations.filter(anim => anim.isActive); +}; + +WorldMorph.prototype.condenseDamages = function () { + // collapse clustered damaged rectangles into their unions, + // thereby reducing the array of brokens to a manageable size + + function condense(src) { + var trgt = [], + len = src.length, + rect, + test = each => each.isNearTo(rect, 20), + hit, i; + + for (i = 0; i < len; i += 1) { + rect = src[i]; + hit = detect(trgt, test); + if (hit) { + hit.mergeWith(rect); + } else { + trgt.push(rect); + } + } + return trgt; + } + + function mergeAll(rects) { + var left = rects[0].origin.x, + top = rects[0].origin.y, + right = rects[0].corner.x, + bottom = rects[0].corner.y, + len = rects.length, + each, + i; + + for (i = 1; i < len; i += 1) { + each = rects[i]; + left = Math.min(left, each.origin.x); + top = Math.min(top, each.origin.y); + right = Math.max(right, each.corner.x); + bottom = Math.max(bottom, each.corner.y); + } + + return new Rectangle(left, top, right, bottom); + } + + if (this.broken.length > 1000) { + this.broken = [mergeAll(this.broken)]; + } else { + this.broken = condense(this.broken); + } + + /* // overly eager reduction algorithm, commented out for performance + var again = true, + size = this.broken.length; + + while (again) { + this.broken = condense(this.broken); + again = (this.broken.length < size); + size = this.broken.length; + } + */ +}; + +WorldMorph.prototype.doOneCycle = function () { + this.stepFrame(); + this.stepAnimations(); + this.updateBroken(); +}; + +WorldMorph.prototype.fillPage = function () { + //changes + plWindow = document.getElementById('pl-snap'); + var clientHeight = plWindow.offsetHeight, + clientWidth = plWindow.offsetWidth; + // // return + // this.worldCanvas.style.position = "absolute"; + // this.worldCanvas.style.left = "0px"; + // this.worldCanvas.style.right = "0px"; + this.worldCanvas.style.width = plWindow.offsetWidth + 'px'; + this.worldCanvas.style.height = plWindow.offsetHeight; + + if (document.documentElement.scrollTop) { + // scrolled down b/c of viewport scaling + clientHeight = document.documentElement.clientHeight; + } + if (document.documentElement.scrollLeft) { + // scrolled left b/c of viewport scaling + clientWidth = document.documentElement.clientWidth; + } + if (this.worldCanvas.width !== clientWidth) { + this.worldCanvas.width = clientWidth; + this.setWidth(clientWidth); + } + if (this.worldCanvas.height !== clientHeight) { + this.worldCanvas.height = clientHeight; + this.setHeight(clientHeight); + } + this.children.forEach(child => { + if (child.reactToWorldResize) { + child.reactToWorldResize(this.bounds.copy()); + } + }); +}; + +WorldMorph.prototype.initRetina = function () { + var canvasHeight = this.worldCanvas.getBoundingClientRect().height, + canvasWidth = this.worldCanvas.getBoundingClientRect().width; + this.worldCanvas.style.width = canvasWidth + 'px'; + this.worldCanvas.width = canvasWidth; + this.setWidth(canvasWidth); + this.worldCanvas.style.height = canvasHeight + 'px'; + this.worldCanvas.height = canvasHeight; + this.setHeight(canvasHeight); +}; + +// WorldMorph global pixel access: + +WorldMorph.prototype.getGlobalPixelColor = function (point) { + // answer the color at the given point. + // first, create a new temporary canvas representing the fullImage + // and sample that one instead of the actual world canvas + // this slows things down but keeps Chrome from crashing + // in v119 in the Fall of 2023 + var dta = Morph.prototype.fullImage.call(this) + .getContext('2d') + .getImageData(point.x, point.y, 1, 1) + .data; + return new Color(dta[0], dta[1], dta[2]); +}; + +// WorldMorph events: + +WorldMorph.prototype.initKeyboardHandler = function () { + var kbd = document.getElementById('morphic_keyboard'); + if (kbd) { // share existing handler with other worlds + this.keyboardHandler = kbd; + return; + } + kbd = document.createElement('textarea'); + kbd.setAttribute('id', 'morphic_keyboard'); + kbd.setAttribute('style', 'caret-color:transparent;'); + kbd.style.position = 'absolute'; + kbd.style.overflow = "hidden"; + kbd.style.border = 'none'; + kbd.style.resize = 'none'; + kbd.wrap = "off"; + kbd.world = this; + kbd.style.zIndex = -1; + kbd.autofocus = true; + kbd.style.width = '0px'; + kbd.style.height = '0px'; + document.body.appendChild(kbd); + this.keyboardHandler = kbd; + + kbd.addEventListener( + "keydown", + event => { + // remember the keyCode in the world's currentKey property + kbd.world.currentKey = event.keyCode; + if (kbd.world.activeMenu && !kbd.world.activeMenu.hasFocus) { + kbd.world.stopEditing(); + kbd.world.activeMenu.getFocus(); + } + if (kbd.world.keyboardFocus && + kbd.world.keyboardFocus.processKeyDown) { + kbd.world.keyboardFocus.processKeyDown(event); + } + // suppress tab override and make sure tab gets + // received by all browsers + if (event.keyCode === 9) { + if (kbd.world.keyboardFocus && + kbd.world.keyboardFocus.processKeyPress) { + kbd.world.keyboardFocus.processKeyPress(event); + } + event.preventDefault(); + } + // suppress cmd-d/f/i/p/s override + if ((event.ctrlKey || event.metaKey) && + 'dfiops'.includes(event.key)) { + event.preventDefault(); + } + }, + true + ); + + kbd.addEventListener( + "keyup", + event => { + // flush the world's currentKey property + kbd.world.currentKey = null; + // dispatch to keyboard receiver + if (kbd.world.keyboardFocus && + kbd.world.keyboardFocus.processKeyUp) { + kbd.world.keyboardFocus.processKeyUp(event); + } + event.preventDefault(); + }, + false + ); + + kbd.addEventListener( + "keypress", + event => { + if (kbd.world.keyboardFocus && + kbd.world.keyboardFocus.processKeyPress) { + kbd.world.keyboardFocus.processKeyPress(event); + event.preventDefault(); + } + }, + false + ); + + kbd.addEventListener( + "input", + event => { + if (kbd.world.keyboardFocus && + kbd.world.keyboardFocus.processInput) { + // flush the world's currentKey property + kbd.world.currentKey = null; + kbd.world.keyboardFocus.processInput(event); + } else { + kbd.world.keyboardHandler.value = ''; + } + event.preventDefault(); + }, + false + ); +}; + +WorldMorph.prototype.resetKeyboardHandler = function (keepValue) { + var pos = getDocumentPositionOf(this.worldCanvas); + + function number2px (n) { + return Math.ceil(n) + 'px'; + } + + if (!keepValue) { + this.keyboardHandler.value = ''; + } + this.keyboardHandler.style.top = number2px(pos.y); + this.keyboardHandler.style.left = number2px(pos.x); +}; + +WorldMorph.prototype.initEventListeners = function () { + var canvas = this.worldCanvas; + + if (this.useFillPage) { + this.fillPage(); + } else { + this.changed(); + } + + canvas.addEventListener( + "mousedown", + event => { + event.preventDefault(); + this.keyboardHandler.world = this; // focus the current world + this.resetKeyboardHandler(true); // keep the handler's value + if (!this.onNextStep) { + // horrible kludge to keep Safari from popping up + // a overlay when right-clicking out of a focused + // and edited text or string element + this.keyboardHandler.blur(); + + // change this to not move browser up + // this.onNextStep = () => this.keyboardHandler.focus(); + } + this.hand.processMouseDown(event); + }, + true + ); + + canvas.addEventListener( + "touchstart", + event => this.hand.processTouchStart(event), + false + ); + + canvas.addEventListener( + "mouseup", + event => { + event.preventDefault(); + this.hand.processMouseUp(event); + }, + false + ); + + canvas.addEventListener( + "dblclick", + event => { + event.preventDefault(); + this.hand.processDoubleClick(event); + }, + false + ); + + canvas.addEventListener( + "touchend", + event => this.hand.processTouchEnd(event), + false + ); + + canvas.addEventListener( + "mousemove", + event => this.hand.processMouseMove(event), + false + ); + + canvas.addEventListener( + "touchmove", + event => this.hand.processTouchMove(event), + {passive: true} + ); + + canvas.addEventListener( + "contextmenu", + event => event.preventDefault(), + true // suppress context menu for Mac-Firefox + ); + + canvas.addEventListener( // Safari, Chrome + "mousewheel", + event => { + this.hand.processMouseScroll(event); + event.preventDefault(); + }, + false + ); + canvas.addEventListener( // Firefox + "DOMMouseScroll", + event => { + this.hand.processMouseScroll(event); + event.preventDefault(); + }, + false + ); + + window.addEventListener( + "dragover", + event => event.preventDefault(), + true + ); + window.addEventListener( + "drop", + event => { + this.hand.processMouseMove(event); + this.hand.processDrop(event); + event.preventDefault(); + }, + false + ); + + window.addEventListener( + "resize", + () => { + if (this.useFillPage) { + this.fillPage(); + } + }, + false + ); + + window.cachedOnbeforeunload = window.onbeforeunload; + window.onbeforeunload = (evt) => { + if (window.cachedOnbeforeunload) { + window.cachedOnbeforeunload.call(null, evt); + } + var e = evt || window.event, + msg = "Are you sure you want to leave?"; + // For IE and Firefox + if (e) { + e.returnValue = msg; + } + // For Safari / chrome + return msg; + }; +}; + +WorldMorph.prototype.mouseDownLeft = nop; + +WorldMorph.prototype.mouseClickLeft = nop; + +WorldMorph.prototype.mouseDownRight = nop; + +WorldMorph.prototype.mouseClickRight = nop; + +WorldMorph.prototype.wantsDropOf = function () { + // allow handle drops if any drops are allowed + return this.acceptsDrops; +}; + +WorldMorph.prototype.droppedImage = nop; + +WorldMorph.prototype.droppedSVG = nop; + +WorldMorph.prototype.droppedAudio = nop; + +WorldMorph.prototype.droppedText = nop; + +WorldMorph.prototype.beginBulkDrop = nop; + +WorldMorph.prototype.endBulkDrop = nop; + +// WorldMorph text field tabbing: + +WorldMorph.prototype.nextTab = function (editField) { + var next = this.nextEntryField(editField); + if (next) { + editField.clearSelection(); + next.selectAll(); + next.edit(); + } +}; + +WorldMorph.prototype.previousTab = function (editField) { + var prev = this.previousEntryField(editField); + if (prev) { + editField.clearSelection(); + prev.selectAll(); + prev.edit(); + } +}; + +// WorldMorph menu: + +WorldMorph.prototype.contextMenu = function () { + var menu; + + if (this.isDevMode) { + menu = new MenuMorph(this, this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]); + } else { + menu = new MenuMorph(this, 'Morphic'); + } + if (this.isDevMode) { + menu.addItem("demo...", 'userCreateMorph', 'sample morphs'); + menu.addLine(); + menu.addItem("hide all...", 'hideAll'); + menu.addItem("show all...", 'showAllHiddens'); + menu.addItem( + "move all inside...", + 'keepAllSubmorphsWithin', + 'keep all submorphs\nwithin and visible' + ); + menu.addItem( + "inspect...", + 'inspect', + 'open a window on\nall properties' + ); + menu.addItem( + "screenshot...", + () => window.open(this.fullImage().toDataURL()), + 'open a new window\nwith a picture of this morph' + ); + menu.addLine(); + menu.addItem( + "restore display", + 'changed', + 'redraw the\nscreen once' + ); + menu.addItem( + "fill page...", + 'fillPage', + 'let the World automatically\nadjust to browser resizing' + ); + if (useBlurredShadows) { + menu.addItem( + "sharp shadows...", + 'toggleBlurredShadows', + 'sharp drop shadows\nuse for old browsers' + ); + } else { + menu.addItem( + "blurred shadows...", + 'toggleBlurredShadows', + 'blurry shades,\n use for new browsers' + ); + } + menu.addItem( + "color...", + () => { + this.pickColor( + menu.title + localize('\ncolor:'), + this.setColor, + this, + this.color + ); + }, + 'choose the World\'s\nbackground color' + ); + if (MorphicPreferences === standardSettings) { + menu.addItem( + "touch screen settings", + 'togglePreferences', + 'bigger menu fonts\nand sliders' + ); + } else { + menu.addItem( + "standard settings", + 'togglePreferences', + 'smaller menu fonts\nand sliders' + ); + } + if (MorphicPreferences.showHoles) { + menu.addItem( + 'hide holes', + 'toggleHolesDisplay', + 'debug untouchable regions' + ); + } else { + menu.addItem( + 'show holes', + 'toggleHolesDisplay', + 'debug untouchable regions' + ); + } + menu.addLine(); + } + if (this.isDevMode) { + menu.addItem( + "user mode...", + 'toggleDevMode', + 'disable developers\'\ncontext menus' + ); + } else { + menu.addItem("development mode...", 'toggleDevMode'); + } + menu.addItem("about morphic.js...", 'about'); + return menu; +}; + +WorldMorph.prototype.userCreateMorph = function () { + var myself = this, menu, newMorph; + + function create(aMorph) { + var cpy = aMorph.fullCopy(); + cpy.isDraggable = true; + cpy.pickUp(myself); + } + + menu = new MenuMorph(this, 'make a morph'); + menu.addItem('rectangle', () => create(new Morph())); + menu.addItem('box', () => create(new BoxMorph())); + menu.addItem('circle box', () => create(new CircleBoxMorph())); + menu.addLine(); + menu.addItem('slider', () => create(new SliderMorph())); + menu.addItem('dial', () => { + newMorph = new DialMorph(); + newMorph.pickUp(this); + }); + menu.addItem('frame', () => { + newMorph = new FrameMorph(); + newMorph.setExtent(new Point(350, 250)); + create(newMorph); + }); + menu.addItem('scroll frame', () => { + newMorph = new ScrollFrameMorph(); + newMorph.contents.acceptsDrops = true; + newMorph.contents.adjustBounds(); + newMorph.setExtent(new Point(350, 250)); + create(newMorph); + }); + menu.addItem('handle', () => create(new HandleMorph())); + menu.addLine(); + menu.addItem('string', () => { + newMorph = new StringMorph('Hello, World!'); + newMorph.isEditable = true; + create(newMorph); + }); + menu.addItem('text', () => { + newMorph = new TextMorph( + "Ich wei\u00DF nicht, was soll es bedeuten, dass ich so " + + "traurig bin, ein M\u00E4rchen aus uralten Zeiten, das " + + "kommt mir nicht aus dem Sinn. Die Luft ist k\u00FChl " + + "und es dunkelt, und ruhig flie\u00DFt der Rhein; der " + + "Gipfel des Berges funkelt im Abendsonnenschein. " + + "Die sch\u00F6nste Jungfrau sitzet dort oben wunderbar, " + + "ihr gold'nes Geschmeide blitzet, sie k\u00E4mmt ihr " + + "goldenes Haar, sie k\u00E4mmt es mit goldenem Kamme, " + + "und singt ein Lied dabei; das hat eine wundersame, " + + "gewalt'ge Melodei. Den Schiffer im kleinen " + + "Schiffe, ergreift es mit wildem Weh; er schaut " + + "nicht die Felsenriffe, er schaut nur hinauf in " + + "die H\u00F6h'. Ich glaube, die Wellen verschlingen " + + "am Ende Schiffer und Kahn, und das hat mit ihrem " + + "Singen, die Loreley getan." + ); + newMorph.isEditable = true; + newMorph.maxWidth = 300; + newMorph.fixLayout(); + create(newMorph); + }); + menu.addItem('speech bubble', () => { + newMorph = new SpeechBubbleMorph('Hello, World!'); + create(newMorph); + }); + menu.addLine(); + menu.addItem('gray scale palette', () => create(new GrayPaletteMorph())); + menu.addItem('color palette', () => create(new ColorPaletteMorph())); + menu.addItem('color picker', () => create(new ColorPickerMorph())); + menu.addLine(); + menu.addItem('sensor demo', () => { + newMorph = new MouseSensorMorph(); + newMorph.setColor(new Color(230, 200, 100)); + newMorph.edge = 35; + newMorph.border = 15; + newMorph.borderColor = new Color(200, 100, 50); + newMorph.alpha = 0.2; + newMorph.setExtent(new Point(100, 100)); + create(newMorph); + }); + menu.addItem('animation demo', () => { + var foo, bar, baz, garply, fred; + + foo = new BouncerMorph(); + foo.setPosition(new Point(50, 20)); + foo.setExtent(new Point(300, 200)); + foo.alpha = 0.9; + foo.speed = 3; + + bar = new BouncerMorph(); + bar.setColor(new Color(50, 50, 50)); + bar.setPosition(new Point(80, 80)); + bar.setExtent(new Point(80, 250)); + bar.type = 'horizontal'; + bar.direction = 'right'; + bar.alpha = 0.9; + bar.speed = 5; + + baz = new BouncerMorph(); + baz.setColor(new Color(20, 20, 20)); + baz.setPosition(new Point(90, 140)); + baz.setExtent(new Point(40, 30)); + baz.type = 'horizontal'; + baz.direction = 'right'; + baz.speed = 3; + + garply = new BouncerMorph(); + garply.setColor(new Color(200, 20, 20)); + garply.setPosition(new Point(90, 140)); + garply.setExtent(new Point(20, 20)); + garply.type = 'vertical'; + garply.direction = 'up'; + garply.speed = 8; + + fred = new BouncerMorph(); + fred.setColor(new Color(20, 200, 20)); + fred.setPosition(new Point(120, 140)); + fred.setExtent(new Point(20, 20)); + fred.type = 'vertical'; + fred.direction = 'down'; + fred.speed = 4; + + bar.add(garply); + bar.add(baz); + foo.add(fred); + foo.add(bar); + + create(foo); + }); + menu.addItem('pen', () => create(new PenMorph())); + if (this.customMorphs.length) { + menu.addLine(); + this.customMorphs.forEach(item => { + var sub; + if (item instanceof Array) { // assume [name, [morphs]] + sub = new MenuMorph(); + item[1].forEach(morph => sub.addItem(morph, + () => create(morph instanceof Array ? morph[0] : morph))); + menu.addMenu(item[0], sub); + } else { // assume a Morph + menu.addItem(item.toString(), () => create(item)); + } + }); + } + menu.popUpAtHand(this); +}; + +WorldMorph.prototype.toggleDevMode = function () { + this.isDevMode = !this.isDevMode; +}; + +WorldMorph.prototype.hideAll = function () { + this.children.forEach(child => child.hide()); +}; + +WorldMorph.prototype.showAllHiddens = function () { + this.forAllChildren(child => { + if (!child.isVisible) { + child.show(); + } + }); +}; + +WorldMorph.prototype.about = function () { + var versions = '', module; + + for (module in modules) { + if (Object.prototype.hasOwnProperty.call(modules, module)) { + versions += ('\n' + module + ' (' + modules[module] + ')'); + } + } + if (versions !== '') { + versions = '\n\nmodules:\n\n' + + 'morphic (' + morphicVersion + ')' + + versions; + } + + this.inform( + 'morphic.js\n\n' + + 'a lively Web GUI\ninspired by Squeak\n' + + morphicVersion + + '\n\nwritten by Jens M\u00F6nig\njens@moenig.org' + + versions + ); +}; + +WorldMorph.prototype.edit = function (aStringOrTextMorph) { + if (this.lastEditedText === aStringOrTextMorph) { + return; + } + if (!isNil(this.lastEditedText)) { + this.stopEditing(); + } + if (!aStringOrTextMorph.isEditable) { + return null; + } + if (this.cursor) { + this.cursor.destroy(); + } + + // some magic we apparently need for Android + this.worldCanvas.focus(); + this.keyboardHandler.focus(); + + // create a new cursor + this.cursor = new CursorMorph(aStringOrTextMorph, this.keyboardHandler); + this.keyboardFocus = this.cursor; + aStringOrTextMorph.parent.add(this.cursor); + this.cursor.rerender(); + if (MorphicPreferences.useSliderForInput) { + if (!aStringOrTextMorph.parentThatIsA(MenuMorph)) { + this.slide(aStringOrTextMorph); + } + } + if (this.lastEditedText !== aStringOrTextMorph) { + aStringOrTextMorph.escalateEvent('freshTextEdit', aStringOrTextMorph); + } + this.lastEditedText = aStringOrTextMorph; +}; + +WorldMorph.prototype.slide = function (aStringOrTextMorph) { + // display a slider for numeric text entries + var val = parseFloat(aStringOrTextMorph.text), + menu, + slider; + + if (isNaN(val)) { + val = 0; + } + menu = new MenuMorph(); + slider = new SliderMorph( + val - 25, + val + 25, + val, + 10, + 'horizontal' + ); + slider.alpha = 1; + slider.color = new Color(225, 225, 225); + slider.button.color = menu.borderColor; + slider.button.highlightColor = slider.button.color.copy(); + slider.button.highlightColor.b += 100; + slider.button.pressColor = slider.button.color.copy(); + slider.button.pressColor.b += 150; + slider.setExtent(new Point( + MorphicPreferences.scrollBarSize * 10, + MorphicPreferences.menuFontSize + )); + slider.action = (num) => { + aStringOrTextMorph.changed(); + aStringOrTextMorph.text = Math.round(num).toString(); + aStringOrTextMorph.fixLayout(); + aStringOrTextMorph.rerender(); + aStringOrTextMorph.escalateEvent( + 'reactToSliderEdit', + aStringOrTextMorph + ); + }; + menu.items.push(slider); + menu.popup(this, aStringOrTextMorph.bottomLeft().add(new Point(0, 5))); +}; + +WorldMorph.prototype.stopEditing = function () { + if (this.cursor) { + this.cursor.target.escalateEvent('reactToEdit', this.cursor.target); + this.cursor.target.clearSelection(); + this.cursor.destroy(); + this.cursor = null; + } + if (this.keyboardFocus && this.keyboardFocus.stopEditing) { + this.keyboardFocus.stopEditing(); + } + this.keyboardFocus = null; + this.lastEditedText = null; +}; + +WorldMorph.prototype.toggleBlurredShadows = function () { + useBlurredShadows = !useBlurredShadows; +}; + +WorldMorph.prototype.togglePreferences = function () { + if (MorphicPreferences === standardSettings) { + MorphicPreferences = touchScreenSettings; + } else { + MorphicPreferences = standardSettings; + } +}; + +WorldMorph.prototype.toggleHolesDisplay = function () { + MorphicPreferences.showHoles = !MorphicPreferences.showHoles; + this.rerender(); +}; diff --git a/elements/pl-snap/Snap/src/morphic.txt b/elements/pl-snap/Snap/src/morphic.txt new file mode 100644 index 00000000..41f6583c --- /dev/null +++ b/elements/pl-snap/Snap/src/morphic.txt @@ -0,0 +1,1302 @@ + + morphic.js + + a lively Web-GUI + inspired by Squeak + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2010-2022 by Jens Mönig + + This documentation last changed: August 03, 2022 + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + documentation contents + ---------------------- + I. inheritance hierarchy + II. object definition toc + III. yet to implement + IV. open issues + V. browser compatibility + VI. the big picture + VII. programming guide + (1) setting up a web page + (a) single world + (b) multiple worlds + (c) an application + (2) manipulating morphs + (3) events + (a) mouse events + (b) context menu + (c) dragging + (d) dropping + (e) keyboard events + (f) resize event + (g) combined mouse-keyboard events + (h) text editing events + (4) stepping + (5) creating new kinds of morphs + (a) drawing the shape + (b) determining extent and arranging submorphs + (c) pixel-perfect pointing events + (d) caching the shape + (e) holes + (f) updating + (g) duplicating + (6) development and user modes + (7) turtle graphics + (8) supporting high-resolution "retina" screens + (9 animations + (10) minifying morphic.js + VIII. acknowledgements + IX. contributors + + + I. hierarchy + ------------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + Animation + Color + Node + Morph + BlinkerMorph + CursorMorph + BouncerMorph* + BoxMorph + InspectorMorph + MenuMorph + MouseSensorMorph* + SpeechBubbleMorph + CircleBoxMorph + SliderButtonMorph + SliderMorph + ColorPaletteMorph + GrayPaletteMorph + ColorPickerMorph + DialMorph + FrameMorph + ScrollFrameMorph + ListMorph + StringFieldMorph + WorldMorph + HandleMorph + HandMorph + PenMorph + ShadowMorph + StringMorph + TextMorph + TriggerMorph + MenuItemMorph + Point + Rectangle + + + II. toc + ------- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + Global settings + Global functions + + Animation + Color + Point + Rectangle + Node + Morph + ShadowMorph + HandleMorph + PenMorph + ColorPaletteMorph + GrayPaletteMorph + ColorPickerMorph + BlinkerMorph + CursorMorph + BoxMorph + SpeechBubbleMorph + DialMorph + CircleBoxMorph + SliderButtonMorph + SliderMorph + MouseSensorMorph* + InspectorMorph + MenuMorph + StringMorph + TextMorph + TriggerMorph + MenuItemMorph + FrameMorph + ScrollFrameMorph + ListMorph + StringFieldMorph + BouncerMorph* + HandMorph + WorldMorph + + * included only for demo purposes + + + III. yet to implement + --------------------- + - keyboard support for scroll frames and lists + - virtual keyboard support for Android + + + IV. open issues + ---------------- + - clipboard support (copy & paste) for non-textual data + + + V. browser compatibility + ------------------------ + I have taken great care and considerable effort to make morphic.js + runnable and appearing exactly the same on all current browsers + available to me: + + - Firefox for Windows + - Firefox for Mac + - Firefox for Android + - Chrome for Windows + - Chrome for Mac + - Chrome for Android + - Safari for Windows (deprecated) + - safari for Mac + - Safari for iOS (mobile) + - IE for Windows (partial support) + - Edge for Windows + - Opera for Windows + - Opera for Mac + + + VI. the big picture + ------------------- + Morphic.js is completely based on Canvas and JavaScript, it is just + Morphic, nothing else. Morphic.js is very basic and covers only the + bare essentials: + + * a stepping mechanism (a time-sharing multiplexer for lively + user interaction ontop of a single OS/browser thread) + * progressive display updates (only dirty rectangles are + redrawn at each display cycle) + * a tree structure + * a single World per Canvas element (although you can have + multiple worlds in multiple Canvas elements on the same web + page) + * a single Hand per World (but you can support multi-touch + events) + * a single text entry focus per World + + In its current state morphic.js doesn't support transforms (you + cannot rotate Morphs), but with PenMorph there already is a simple + LOGO-like turtle that you can use to draw onto any Morph it is + attached to. I'm planning to add special Morphs that support these + operations later on, but not for every Morph in the system. + Therefore these additions ("sprites" etc.) are likely to be part of + other libraries ("microworld.js") in separate files. + + the purpose of morphic.js is to provide a malleable framework that + will let me experiment with lively GUIs for my hobby horse, which + is drag-and-drop, blocks based programming languages. Those things + (BYOB4 - http://byob.berkeley.edu) will be written using morphic.js + as a library. + + + VII. programming guide + ---------------------- + Morphic.js provides a library for lively GUIs inside single HTML + Canvas elements. Each such canvas element functions as a "world" in + which other visible shapes ("morphs") can be positioned and + manipulated, often directly and interactively by the user. Morphs + are tree nodes and may contain any number of submorphs ("children"). + + All things visible in a morphic World are morphs themselves, i.e. + all text rendering, blinking cursors, entry fields, menus, buttons, + sliders, windows and dialog boxes etc. are created with morphic.js + rather than using HTML DOM elements, and as a consequence can be + changed and adjusted by the programmer regardless of proprietary + browser behavior. + + Each World has an - invisible - "Hand" resembling the mouse cursor + (or the user's finger on touch screens) which handles mouse events, + and may also have a keyboard focus to handle key events. + + The basic idea of Morphic is to continuously run display cycles and + to incrementally update the screen by only redrawing those World + regions which have been "dirtied" since the last redraw. Before + each shape is processed for redisplay it gets the chance to perform + a "step" procedure, thus allowing for an illusion of concurrency. + + + (1) setting up a web page + ------------------------- + Setting up a web page for Morphic always involves three steps: + adding one or more Canvas elements, defining one or more worlds, + initializing and starting the main loop. + + + (a) single world + ----------------- + Most commonly you will want your World to fill the browsers's whole + client area. This default situation is easiest and most straight + forward. + + example html file: + + + + + + Morphic! + + + + + + + + + if you use ScrollFrames or otherwise plan to support mouse wheel + scrolling events, make sure to add the following inline-CSS + attribute to the Canvas element: + + style="position: absolute;" + + which will prevent the World to be scrolled around instead of the + elements inside of it in some browsers. + + + (b) multiple worlds + ------------------- + If you wish to create a web page with more than one world, make + sure to prevent each world from auto-filling the whole page and + include it in the main loop. It's also a good idea to give each + world its own tabindex: + + example html file: + + + + + + Morphic! + + + + +

first world:

+ +

second world:

+ + + + + + (c) an application + ------------------- + Of course, most of the time you don't want to just plain use the + standard Morphic World "as is" out of the box, but write your own + application (something like Scratch!) in it. For such an + application you'll create your own morph prototypes, perhaps + assemble your own "window frame" and bring it all to life in a + customized World state. the following example creates a simple + snake-like mouse drawing game. + + example html file: + + + + + + touch me! + + + + + + + + + To get an idea how you can craft your own custom morph prototypes + I've included two examples which should give you an idea how to add + properties, override inherited methods and use the stepping + mechanism for "livelyness": + + BouncerMorph + MouseSensorMorph + + For the sake of sharing a single file I've included those examples + in morphic.js itself. Usually you'll define your additions in a + separate file and keep morphic.js untouched. + + + (2) manipulating morphs + ----------------------- + There are many methods to programmatically manipulate morphs. Among + the most important and common ones among all morphs are the + following nine: + + * hide() + * show() + + * setPosition(aPoint) + * setExtent(aPoint) + * setColor(aColor) + + * add(submorph) - attaches submorph ontop + * addBack(submorph) - attaches submorph underneath + + * fullCopy() - duplication + * destroy() - deletion + + + (3) events + ---------- + All user (and system) interaction is triggered by events, which are + passed on from the root element - the World - to its submorphs. The + World contains a list of system (browser) events it reacts to in its + + initEventListeners() + + method. Currently there are + + - mouse + - drop + - keyboard + - (window) resize + + events. + + These system events are dispatched within the morphic World by the + World's Hand and its keyboardFocus (usually the active text + cursor). + + + (a) mouse events: + ----------------- + The Hand dispatches the following mouse events to relevant morphs: + + mouseDownLeft + mouseDownRight + mouseClickLeft + mouseClickRight + mouseDoubleClick + mouseEnter + mouseLeave + mouseEnterDragging + mouseLeaveDragging + mouseEnterBounds + mouseLeaveBounds + mouseMove + mouseScroll + + If you wish your morph to react to any such event, simply add a + method of the same name as the event, e.g: + + MyMorph.prototype.mouseMove = function(pos) {}; + + Most of these methods have as optional parameter a Point object + indicating the current position of the Hand inside the World's + coordinate system. The + + mouseMove(pos, button) + + event method has an additional optional parameter indicating the + currently pressed mouse button, which is either 'left' or 'right'. + You can use this to let users interact with 3D environments. + + The + + mouseEnterDragging(morph) + mouseLeaveDragging(morph) + mouseEnterBounds(morph) + mouseLeaveBounds(morph) + + event methods have as optional parameter the morph currently dragged by + the Hand, if any. + + Events may be "bubbled" up a morph's owner chain by calling + + this.escalateEvent(functionName, arg) + + in the event handler method's code. + + Likewise, removing the event handler method will render your morph + passive to the event in question. + + + (b) context menu: + ----------------- + By default right-clicking (or single-finger tap-and-hold) on a morph + also invokes its context menu (in addition to firing the + mouseClickRight event). A morph's context menu can be customized by + assigning a Menu instance to its + + customContextMenu + + property, or altogether suppressed by overriding its inherited + + contextMenu() + + method. + + + (c) dragging: + ------------- + Dragging a morph is initiated when the left mouse button is pressed, + held and the mouse is moved. + + You can control whether a morph is draggable by setting its + + isDraggable + + property either to false or true. If a morph isn't draggable itself + it will pass the pick-up request up its owner chain. This lets you + create draggable composite morphs like Windows, DialogBoxes, + Sliders etc. + + Sometimes it is desireable to make "template" shapes which cannot be + moved themselves, but from which instead duplicates can be peeled + off. This is especially useful for building blocks in construction + kits, e.g. the MIT-Scratch palette. Morphic.js lets you control this + functionality by setting the + + isTemplate + + property flag to true for any morph whose "isDraggable" property is + turned off. When dragging such a Morph the hand will instead grab + a duplicate of the template whose "isDraggable" flag is true and + whose "isTemplate" flag is false, in other words: a non-template. + + When creating a copy from a template, the copy's + + reactToTemplateCopy + + is invoked, if it is present. + + Dragging is indicated by adding a drop shadow to the morph in hand. + If a morph follows the hand without displaying a drop shadow it is + merely being moved about without changing its parent (owner morph), + e.g. when "dragging" a morph handle to resize its owner, or when + "dragging" a slider button. + + Right before a morph is picked up its + + selectForEdit + + and + + prepareToBeGrabbed(handMorph) + + methods are invoked, each if it is present. the optional + + selectForEdit + + if implemented, must return the object that is to be picked up. + In addition to just returning the original object chosen by the user + your method can also modify the target's environment and instead return + a copy of the selected morph if, for example, you would like to implement + a copy-on-write mechanism such as in Snap. + + Immediately after the pick-up the former parent's + + reactToGrabOf(grabbedMorph) + + method is called, again only if it exists. + + Similar to events, these methods are optional and don't exist by + default. For a simple example of how they can be used to adjust + scroll bars in a scroll frame please have a look at their + implementation in FrameMorph. + + + (d) dropping: + ------------- + Dropping is triggered when the left mouse button is either pressed + or released while the Hand is dragging a morph. + + Dropping a morph causes it to become embedded in a new owner morph. + You can control this embedding behavior by setting the prospective + drop target's + + acceptsDrops + + property to either true or false, or by overriding its inherited + + wantsDropOf(aMorph) + + method. + + Right before dropping a morph the designated new parent's optional + + selectForEdit + + method is invoked if it is present. Again, if implemented this method + must return the new parent for the morph that is about to be dropped. + Again, in addition to just returning the designeted drop-target + your method can also modify its environment and instead return + a copy of the new parent if, for example, you would like to implement + a copy-on-write mechanism such as in Snap. + + Right after a morph has been dropped its + + justDropped(handMorph) + + method is called, and its new parent's + + reactToDropOf(droppedMorph, handMorph) + + method is invoked, again only if each method exists. + + Similar to events, these methods are optional and by default are + not present in morphs by default (watch out for inheritance, + though!). For a simple example of how they can be used to adjust + scroll bars in a scroll frame please have a look at their + implementation in FrameMorph. + + Drops of image elements from outside the world canvas are dispatched as + + droppedImage(aCanvas, name, embeddedData) + droppedSVG(anImage, name) + + events to interested Morphs at the mouse pointer. If you want your Morph + to e.g. import outside images you can add the droppedImage() and / or the + droppedSVG() methods to it. The parameter passed to the event handles is + a new offscreen canvas element representing a copy of the original image + element which can be directly used, e.g. by assigning it to another + Morph's cachedImage property. In the case of a dropped SVG it is an image + element (not a canvas), which has to be rasterized onto a canvas before + it can be used. The benefit of handling SVGs as image elements is that + rasterization can be deferred until the destination scale is known, taking + advantage of SVG's ability for smooth scaling. If instead SVGs are to be + rasterized right away, you can set the + + MorphicPreferences.rasterizeSVGs + + preference to . In this case dropped SVGs also trigger the + droppedImage() event with a canvas containing a rasterized version of the + SVG. + + Note that PNG images provide for embedded text comments, which can be used + to include code or arbitrary data such as a CSV, JSON or XML file inside + the image. Such a payload has to be identified by an agreed-upon marker. + The default tag is stored in MorphicPreferences and can be overriden by + apps wishing to make use of this feature. If such an embedded text-payload + is found inside a PNG it is passed as the optional third "embeddedData" + parameter to the "droppedImage()" event. embedded text only applies to PNGs. + You can embed a string into the PNG metadata of a PNG by calling + + embedMetadataPNG(aCanvas, aString) + + with a raster image represented by a canvas and a string that is to be + embedded into the PNG's metadata. + + The same event mechanism applies to drops of audio or text files from + outside the world canvas. + + Those are dispatched as + + droppedAudio(anAudio, name) + droppedText(aString, name, type) + + events to interested Morphs at the mouse pointer. + + if none of the above content types can be determined, the file contents + is dispatched as an ArrayBuffer to interested Morphs: + + droppedBinary(anArrayBuffer, name) + + In case multiple files are dropped simulateneously the events + + beginBulkDrop() + endBulkDrop() + + are dispatched to to Morphs interested in bracketing the bulk operation, + and the endBulkDrop() event is only signalled after the contents last file + has been asynchronously made available. + + + (e) keyboard events + ------------------- + The World dispatches the following key events to its active + keyboard focus: + + keypress + keydown + keyup + + Currently the only morphs which acts as keyboard focus are + CursorMorph - the basic text editing widget - and MenuMorph elements. + If you wish to add keyboard support to your morph you need to add event + handling methods for + + processKeyPress(event) + processKeyDown(event) + processKeyUp(event) + + and activate them by assigning your morph to the World's + + keyboardFocus + + property. + + Note that processKeyUp() is optional and doesn't have to be present + if your morph doesn't require it. + + + (f) resize event + ---------------- + The Window resize event is handled by the World and allows the + World's extent to be adjusted so that it always completely fills + the browser's visible page. You can turn off this default behavior + by setting the World's + + useFillPage + + property to false. + + Alternatively you can also initialize the World with the + useFillPage switch turned off from the beginning by passing the + false value as second parameter to the World's constructor: + + world = new World(aCanvas, false); + + Use this when creating a web page with multiple Worlds. + + if "useFillPage" is turned on the World dispatches an + + reactToWorldResize(newBounds) + + events to all of its children (toplevel only), allowing each to + adjust to the new World bounds by implementing a corresponding + method, the passed argument being the World's new dimensions after + completing the resize. By default, the "reactToWorldResize" Method + does not exist. + + Example: + + Add the following method to your Morph to let it automatically + fill the whole World, but leave a 10 pixel border uncovered: + + MyMorph.prototype.reactToWorldResize = function (rect) { + this.changed(); + this.bounds = rect.insetBy(10); + this.rerender(); + }; + + + (g) combined mouse-keyboard events + ---------------------------------- + Occasionally you'll want an object to react differently to a mouse + click or to some other mouse event while the user holds down a key + on the keyboard. Such "shift-click", "ctl-click", or "alt-click" + events can be implemented by querying the World's + + currentKey + + property inside the function that reacts to the mouse event. This + property stores the keyCode of the key that's currently pressed. + Once the key is released by the user it reverts to null. + + + (h) text editing events + ----------------------- + Much of Morphic's "liveliness" comes out of allowing text elements + (instances of either single-lined StringMorph or multi-lined TextMorph) + to be directly manipulated and edited by users. This requires other + objects which may have an interest in the text element's state to react + appropriately. Therefore text elements and their manipulators emit + a stream of events, mostly by "bubbling" them up the text element's + owner chain. Text elements' parents are notified about the following + events: + + Whenever the user presses a key on the keyboard while a text element + is being edited, first a + + reactToKeystroke(event) + + is escalated up its parent chain, the "event" parameter being the + original one received by the World. + + Whenever the input changes, by adding or removing one or more characters, + an additional + + reactToInput(event) + + is escalated up its parent chain, the "event" parameter again being the + original one received by the World or by the IME element. + + Note that the "reactToKeystroke" event gets triggered before the input + changes, and thus befgore the "reactToInput" event fires. + + Once the user has completed the edit, the following events are + dispatched: + + accept() - was pressed on a single line of text + cancel() - was pressed on any text element + + Note that "accept" only gets triggered by single-line texte elements, + as the key is used to insert line breaks in multi-line + elements. Therefore, whenever a text edit is terminated by the user + (accepted, cancelled or otherwise), + + reactToEdit(StringOrTextMorph) + + is triggered. + + If the MorphicPreference's + + useSliderForInput + + setting is turned on, a slider is popped up underneath the currently + edited text element letting the user insert numbers out of the given + slider range. Whenever this happens, i.e. whenever the slider is moved + or while the slider button is pressed, a stream of + + reactToSliderEdit(StringOrTextMorph) + + events is dispatched, allowing for "Bret-Victor" style "scrubbing" + applications. + + In addition to user-initiated events text elements also emit + change notifications to their direct parents whenever their contents + changes. That way complex Morphs containing text elements + get a chance to react if something about the embedded text has been + modified programmatically. These events are: + + layoutChanged() - sent only from instances of TextMorph + fixLayout() - sent from instances of all Morphs, including StringMorphs + + they are different so that Morphs which contain both multi-line and + single-line text elements can hold them apart. + + + (4) stepping + ------------ + Stepping is what makes Morphic "magical". Two properties control + a morph's stepping behavior: the fps attribute and the step() + method. + + By default the + + step() + + method does nothing. As you can see in the examples of BouncerMorph + and MouseSensorMorph you can easily override this inherited method + to suit your needs. + + By default the step() method is called once per display cycle. + Depending on the number of actively stepping morphs and the + complexity of your step() methods this can cause quite a strain on + your CPU, and also result in your application behaving differently + on slower computers than on fast ones. + + setting + + myMorph.fps + + to a number lower than the interval for the main loop lets you free + system resources (albeit at the cost of a less responsive or slower + behavior for this particular morph). + + + (5) creating new kinds of morphs + -------------------------------- + The real fun begins when you start to create new kinds of morphs + with customized shapes. Imagine, e.g. jigsaw puzzle pieces or + musical notes. + + When you create your own morphs, you'll want to think about how to + graphically render it, how to determine its size and whether it needs + to arrange any other parts ("submorphs). There are also ways to specify + its collision detection behavior and define "untouchable" regions + ("holes"). + + + (a) drawing the shape + --------------------- + For this you have to override the default + + render(ctx) + + method. + + This method draws the morph's shape using a given 2d graphics context. + Note that any coordinates used in the render() method must be relative + to the morph's own position, i.e. you don't need to worry about + translating the shape yourself. + + You can use the following template for a start: + + MyMorph.prototype.render = function(ctx) { + ctx.fillStyle = this.color.toString(); + ctx.fillRect(0, 0, this.width(), this.height()); + }; + + it renders the morph as a solid rectangle completely filling its + area with its current color. + + Notice how the coordinates for the fillRect() call are relative + to the morph's own position: The rendered rectangle's origin is always + located at (0, 0) regardless of the morph's actual position in the World. + + + (b) determining extent and arranging submorphs + ---------------------------------------------- + If your new morph also needs to determine its extent and, e.g. to + encompass one or several other morphs, or arrange the layout of its + submorphs, make sure to also override the default + + fixLayout() + + method. + + NOTE: If you need to set the morph's extent inside, in order to avoid + infinite recursion instead of calling morph.setExtent() - which will + in turn call morph.fixLayout() again - directly modify the morph's + + bounds + + property. Bounds is a rectable on which you can also use the same + size-setters, e.g. by calling: + + this.bounds.setExtent() + + + (c) pixel-perfect pointing events + --------------------------------- + In case your new morph needs to support pixel-perfect collision detection + with other morphs or pointing devices such as the mouse or a stylus you + can set the inherited attribute + + isFreeForm = bool + + to "true" (default is "false"). This makes sense the more your morph's + visual shape diverges from a rectangle. For example, if you create a + circular filled morph the default setting will register mouse-events + anywhere within its bounding box, e.g. also in the transparent parts + between the bounding box's corners outside of the circle's bounds. + Instead you can specify your irregulary shaped morph to only register + pointing events (mouse and touch) on solid, non-transparent parts. + + Notice, however, that such pixel-perfect collision detection might + strain processing resources, especially if applied liberally. + + In order to mitigate unfavorable processor loads for pixel-perfect + collision deteciton of irregularly shaped morphs there are two strategies + to consider: Caching the shape and specifying "untouchable" regions. + + + (d) caching the shape + --------------------- + In case of pixel-perfect free-form collision detection it makes sense to + cache your morph's current shape, so it doesn't have to be re-drawn onto a + new Canvas element every time the mouse moves over its bounding box. + For this you can set then inherited + + isCachingImage = bool + + attribute to "true" instead of the default "false" value. This will + significantly speed up collision detection and smoothen animations that + continuously perform collision detection. However, it will also consume + more memory. Therefore it's best to use this setting with caution. + + Snap! caches the shapes of sprites but not those of blocks. Instead it + manages the insides of C- and E-shaped blocks through the morphic "holes" + mechanism. + + + (e) holes + --------- + An alternative albeit not as precise and general way for handling + irregularly shaped morphs with "untouchable" regions is to specify a set + of rectangular areas in which pointing events (mouse or touch) are not + registered. + + By default the inherited + + holes = [] + + property is an empty array. You can add one or more morphic Rectangle + objects to this list, representing regions, in which occurring events will + instead be passed on to the morph underneath. + + Note that, same with the render() method, the coordinates of these + rectangular holes must be specified relative to your morph's position. + + If you specify holes you might find the need to adjust their layout + depending on the layout of your morph. To accomplish this you can override + the inherited + + fixHolesLayout() + + method. + + + (f) updating + ------------ + One way for morphs to become alive is form them to literally "morph" their + shape depending on whicher contest you wish them to react to. For example, + you might want the user to interactively draw a shape using their fingers + on a touch screen device, or you want the user to be able to "pinch" or + otherwise distort a shape interactively. In all of these situations you'll + want your morph to frequently rerender its shape. + + You can accomplish this, by calling + + rerender() + + after every change to your morph's appearance that requires rerendering. + + Such changes are usually only happening when the morph's dimensions or + other visual properties - such as its color - changes. + + + (g) duplicating + --------------- + If your new morph stores or references to other morphs outside of + the submorph tree in other properties, be sure to also override the + default + + updateReferences() + + method if you want it to support duplication. + + + (6) development and user modes + ------------------------------ + When working with Squeak on Scratch or BYOB among the features I + like the best and use the most is inspecting what's going on in + the World while it is up and running. That's what development mode + is for (you could also call it debug mode). In essence development + mode controls which context menu shows up. In user mode right + clicking (or double finger tapping) a morph invokes its + + customContextMenu + + property, whereas in development mode only the general + + developersMenu() + + method is called and the resulting menu invoked. The developers' + menu features Gui-Builder-wise functionality to directly inspect, + take apart, reassamble and otherwise manipulate morphs and their + contents. + + Instead of using the "customContextMenu" property you can also + assign a more dynamic contextMenu by overriding the general + + userMenu() + + method with a customized menu constructor. The difference between + the customContextMenu property and the userMenu() method is that + the former is also present in development mode and overrides the + developersMenu() result. For an example of how to use the + customContextMenu property have a look at TextMorph's evaluation + menu, which is used for the Inspector's evaluation pane. + + When in development mode you can inspect every Morph's properties + with the inspector, including all of its methods. The inspector + also lets you add, remove and rename properties, and even edit + their values at runtime. Like in a Smalltalk environment the inspect + features an evaluation pane into which you can type in arbitrary + JavaScript code and evaluate it in the context of the inspectee. + + Use switching between user and development modes while you are + developing an application and disable switching to development once + you're done and deploying, because generally you don't want to + confuse end-users with inspectors and meta-level stuff. + + + (7) turtle graphics + ------------------- + + The basic Morphic kernel features a simple LOGO turtle constructor + called + + PenMorph + + which you can use to draw onto its parent Morph. By default every + Morph in the system (including the World) is able to act as turtle + canvas and can display pen trails. Pen trails will be lost whenever + the trails morph (the pen's parent) performs a "render()" + operation. If you want to create your own pen trails canvas, you + may wish to modify its + + penTrails() + + property, so that it keeps a separate offscreen canvas for pen + trails (and doesn't loose these on redraw). + + the following properties of PenMorph are relevant for turtle + graphics: + + color - a Color + size - line width of pen trails + heading - degrees + isDown - drawing state + + the following commands can be used to actually draw something: + + up() - lift the pen up, further movements leave no trails + down() - set down, further movements leave trails + clear() - remove all trails from the current parent + forward(n) - move n steps in the current direction (heading) + turn(n) - turn right n degrees + + Turtle graphics can best be explored interactively by creating a + new PenMorph object and by manipulating it with the inspector + widget. + + NOTE: PenMorph has a special optimization for recursive operations + called + + warp(function) + + You can significantly speed up recursive ops and increase the depth + of recursion that's displayable by wrapping WARP around your + recursive function call: + + example: + + myPen.warp(function () { + myPen.tree(12, 120, 20); + }) + + will be much faster than just invoking the tree function, because it + prevents the parent's parent from keeping track of every single line + segment and instead redraws the outcome in a single pass. + + + (8) supporting high-resolution "retina" screens + ----------------------------------------------- + By default retina support gets installed when Morphic.js loads. There + are two global functions that let you test for retina availability: + + isRetinaSupported() - Bool, answers if retina support is available + isRetinaEnabled() - Bool, answers if currently in retina mode + + and two more functions that let you control retina support if it is + available: + + enableRetinaSupport() + disableRetinaSupport() + + Both of these internally test whether retina is available, so they are + safe to call directly. For an example how to make retina support + user-specifiable refer to + + Snap! >> guis.js >> toggleRetina() + + Even when in retina mode it often makes sense to use normal-resolution + canvasses for simple shapes in order to save system resources and + optimize performance. Examples are costumes and backgrounds in Snap. + In Morphic you can create new canvas elements using + + newCanvas(extentPoint [, nonRetinaFlag]) + + If retina support is enabled such new canvasses will automatically be + high-resolution canvasses, unless the newCanvas() function is given an + otherwise optional second Boolean argument that explicitly makes + it a non-retina canvas. + + Not the whole canvas API is supported by Morphic's retina utilities. + Especially if your code uses putImageData() you will want to "downgrade" + a target high-resolution canvas to a normal-resolution ("non-retina") + one before using + + normalizeCanvas(aCanvas [, copyFlag]) + + This will change the target canvas' resolution in place (!). If you + pass in the optional second Boolean flag the function returns + a non-retina copy and leaves the target canvas unchanged. An example + of this normalize mechanism is converting the penTrails layer of Snap's + stage (high-resolution) into a sprite-costume (normal resolution). + + + (9) animations + --------------- + Animations handle gradual transitions between one state and another over a + period of time. Transition effects can be specified using easing functions. + An easing function maps a fraction of the transition time to a fraction of + the state delta. This way accelerating / decelerating and bouncing sliding + effects can be accomplished. + + Animations are generic and not limited to motion, i.e. they can also handle + other transitions such as color changes, transparency fadings, growing, + shrinking, turning etc. + + Animations need to be stepped by a scheduler, e. g. an interval function. + In Morphic the preferred way to run an animation is to register it with + the World by adding it to the World's animation queue. The World steps each + registered animation once per display cycle independently of the Morphic + stepping mechanism. + + For an example how to use animations look at how the Morph's methods + + glideTo() + fadeTo() + + and + + slideBackTo() + + are implemented. + + + (10) minifying morphic.js + ------------------------- + Coming from Smalltalk and being a Squeaker at heart I am a huge fan + of browsing the code itself to make sense of it. Therefore I have + included this documentation and (too little) inline comments so all + you need to get going is this very file. + + Nowadays with live streaming HD video even on mobile phones 250 KB + shouldn't be a big strain on bandwith, still minifying and even + compressing morphic.js down do about 100 KB may sometimes improve + performance in production use. + + Being an attorney-at-law myself you programmer folk keep harassing + me with rabulistic nitpickings about free software licenses. I'm + releasing morphic.js under an AGPL license. Therefore please make + sure to adhere to that license in any minified or compressed version. + + + VIII. acknowledgements + ---------------------- + The original Morphic was designed and written by Randy Smith and + John Maloney for the SELF programming language, and later ported to + Squeak (Smalltalk) by John Maloney and Dan Ingalls, who has also + ported it to JavaScript (the Lively Kernel), once again setting + a "Gold Standard" for self sustaining systems which morphic.js + cannot and does not aspire to meet. + + This Morphic implementation for JavaScript is not a direct port of + Squeak's Morphic, but still many individual functions have been + ported almost literally from Squeak, sometimes even including their + comments, e.g. the morph duplication mechanism fullCopy(). Squeak + has been a treasure trove, and if morphic.js looks, feels and + smells a lot like Squeak, I'll take it as a compliment. + + Evelyn Eastmond has inspired and encouraged me with her wonderful + implementation of DesignBlocksJS. Thanks for sharing code, ideas + and enthusiasm for programming. + + John Maloney has been my mentor and my source of inspiration for + these Morphic experiments. Thanks for the critique, the suggestions + and explanations for all things Morphic and for being my all time + programming hero. + + I have originally written morphic.js in Florian Balmer's Notepad2 + editor for Windows, later switched to Apple's Dashcode and later + still to Apple's Xcode. I've also come to depend on both Douglas + Crockford's JSLint and later the JSHint project, as well as on + Mozilla's Firebug and Google's Chrome to get it right. + + + IX. contributors + ---------------------- + Joe Otto found and fixed many early bugs and taught me some tricks. + Nathan Dinsmore contributed mouse wheel scrolling, cached + background texture handling, countless bug fixes and optimizations. + Ian Reynolds contributed backspace key handling for Chrome. + Davide Della Casa contributed performance optimizations for Firefox. + Jason N (@cyderize) contributed native copy & paste for text editing. + Bartosz Leper contributed retina display support. + Zhenlei Jia and Dariusz Dorożalski pioneered IME text editing. + Dariusz Dorożalski and Jesus Villalobos contributed embedding blocks + into image metadata. + Bernat Romagosa contributed to text editing and to the core design. + Michael Ball found and fixed a longstanding scrolling bug. + Brian Harvey contributed to the design and implementation of submenus. + Ken Kahn contributed to Chinese keboard entry and Android support. + Brian Broll contributed clickable URLs in text elements and many bugfixes. + + - Jens Mönig diff --git a/elements/pl-snap/Snap/src/objects.js b/elements/pl-snap/Snap/src/objects.js new file mode 100644 index 00000000..b2582198 --- /dev/null +++ b/elements/pl-snap/Snap/src/objects.js @@ -0,0 +1,14398 @@ +/* + + objects.js + + a scriptable microworld + based on morphic.js, blocks.js and threads.js + inspired by Scratch + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs blocks.js, threads.js, morphic.js and widgets.js + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + SpriteMorph + SpriteHighlightMorph + StageMorph + Costume + SVG_Costume + CostumeEditorMorph + Sound + Note + Microphone + CellMorph + WatcherMorph + StagePrompterMorph + StagePickerMorph + StagePickerItemMorph + + MenuItemMorph* + StagePickerItemMorph + MenuMorph* + StagePickerMorph + SpeechBubbleMorph* + SpriteBubbleMorph + StageBubbleMorph + + * defined in Morphic.js + + + credits + ------- + Ian Reynolds contributed initial porting of primitives from Squeak and + sound handling + Achal Dave contributed research and prototyping for creating music + using the Web Audio API + Yuan Yuan and Deborah Servilla contributed graphic effects for costumes + +*/ + +// Global stuff //////////////////////////////////////////////////////// + +/*global PaintEditorMorph, ListWatcherMorph, PushButtonMorph, ToggleMorph, ZERO, +DialogBoxMorph, InputFieldMorph, SpriteIconMorph, BlockMorph, SymbolMorph, nop, +ThreadManager, VariableFrame, detect, BlockMorph, BoxMorph, Color, Animation, +CommandBlockMorph, FrameMorph, HatBlockMorph, MenuMorph, Morph, MultiArgMorph, +ReporterBlockMorph, ScriptsMorph, StringMorph, SyntaxElementMorph, XML_Element, +TextMorph, contains, degrees, detect, newCanvas, radians, Array, CursorMorph, +Date, FrameMorph, Math, MenuMorph, Morph, invoke, MorphicPreferences, WHITE, +Object, PenMorph, Point, Rectangle, ScrollFrameMorph, SliderMorph, VideoMotion, +StringMorph, TextMorph, contains, copy, degrees, detect, document, isNaN, Point, +isString, newCanvas, nop, parseFloat, radians, window, modules, IDE_Morph, +VariableDialogMorph, HTMLCanvasElement, Context, List, RingMorph, HandleMorph, +SpeechBubbleMorph, InputSlotMorph, isNil, FileReader, TableDialogMorph, String, +BlockEditorMorph, BlockDialogMorph, PrototypeHatBlockMorph, BooleanSlotMorph, +localize, TableMorph, TableFrameMorph, normalizeCanvas, VectorPaintEditorMorph, +AlignmentMorph, Process, WorldMap, copyCanvas, useBlurredShadows, BLACK, +BlockVisibilityDialogMorph, CostumeIconMorph, SoundIconMorph, MenuItemMorph, +embedMetadataPNG, SnapExtensions, SnapSerializer, snapEquals*/ + +/*jshint esversion: 11*/ + +modules.objects = '2024-January-15'; + +var SpriteMorph; +var StageMorph; +var SpriteBubbleMorph; +var StageBubbleMorph; +var Costume; +var SVG_Costume; +var CostumeEditorMorph; +var Sound; +var Note; +var Microphone; +var CellMorph; +var WatcherMorph; +var StagePrompterMorph; +var Note; +var SpriteHighlightMorph; +var StagePickerMorph; +var StagePickerItemMorph; + +function isSnapObject(thing) { + return thing instanceof SpriteMorph || (thing instanceof StageMorph); +} + +// SpriteMorph ///////////////////////////////////////////////////////// + +// I am a scriptable object + +// SpriteMorph inherits from PenMorph: + +SpriteMorph.prototype = new PenMorph(); +SpriteMorph.prototype.constructor = SpriteMorph; +SpriteMorph.uber = PenMorph.prototype; + +// SpriteMorph settings + +SpriteMorph.prototype.attributes = + [ + 'x position', + 'y position', + 'direction', + 'size', + 'costumes', + 'costume #', + 'volume', + 'balance', + 'sounds', + 'shown?', + 'pen down?', + 'scripts' + ]; + +SpriteMorph.prototype.categories = + [ + 'motion', + 'looks', + 'sound', + 'pen', + 'control', + 'sensing', + 'operators', + 'variables', + 'lists', + 'other' + ]; + +SpriteMorph.prototype.blockColor = { + motion : new Color(74, 108, 212), + looks : new Color(143, 86, 227), + sound : new Color(207, 74, 217), + pen : new Color(0, 161, 120), + control : new Color(230, 168, 34), + sensing : new Color(4, 148, 220), + operators : new Color(98, 194, 19), + variables : new Color(243, 118, 29), + lists : new Color(217, 77, 17), + other: new Color(150, 150, 150) +}; + +SpriteMorph.prototype.customCategories = new Map(); // key: name, value: color + +SpriteMorph.prototype.allCategories = function () { + return this.categories.concat( + Array.from(this.customCategories.keys()).sort() + ); +}; + +SpriteMorph.prototype.blockColorFor = function (category) { + return this.blockColor[category] || + this.customCategories.get(category) || + this.blockColor.other; +}; + +SpriteMorph.prototype.paletteColor = new Color(55, 55, 55); +SpriteMorph.prototype.paletteTextColor = new Color(230, 230, 230); +SpriteMorph.prototype.sliderColor + = SpriteMorph.prototype.paletteColor.lighter(30); +SpriteMorph.prototype.isCachingPrimitives = true; + +SpriteMorph.prototype.enableNesting = true; +SpriteMorph.prototype.enableFirstClass = true; +SpriteMorph.prototype.showingExtensions = false; +SpriteMorph.prototype.useFlatLineEnds = false; +SpriteMorph.prototype.penColorModel = 'hsv'; // or 'hsl' +SpriteMorph.prototype.disableDraggingData = false; +SpriteMorph.prototype.highlightColor = new Color(250, 200, 130); +SpriteMorph.prototype.highlightBorder = 8; + +SpriteMorph.prototype.bubbleColor = WHITE; +SpriteMorph.prototype.bubbleFontSize = 14; +SpriteMorph.prototype.bubbleFontIsBold = true; +SpriteMorph.prototype.bubbleCorner = 10; +SpriteMorph.prototype.bubbleBorder = 3; +SpriteMorph.prototype.bubbleBorderColor = new Color(190, 190, 190); +SpriteMorph.prototype.bubbleMaxTextWidth = 130; + +SpriteMorph.prototype.initBlocks = function () { + SpriteMorph.prototype.blocks = { + + // Motion + forward: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'move %n steps', + defaults: [10] + }, + turn: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'turn %clockwise %n degrees', + defaults: [15] + }, + turnLeft: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'turn %counterclockwise %n degrees', + defaults: [15] + }, + setHeading: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'point in direction %dir', + defaults: [90] + }, + doFaceTowards: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'point towards %dst', + defaults: [['mouse-pointer']] + }, + gotoXY: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'go to x: %n y: %n', + defaults: [0, 0] + }, + doGotoObject: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'go to %dst', + defaults: [['random position']] + }, + doGlide: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'glide %n secs to x: %n y: %n', + defaults: [1, 0, 0] + }, + changeXPosition: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'change x by %n', + defaults: [10] + }, + setXPosition: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'set x to %n', + defaults: [0] + }, + changeYPosition: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'change y by %n', + defaults: [10] + }, + setYPosition: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'set y to %n', + defaults: [0] + }, + bounceOffEdge: { + only: SpriteMorph, + type: 'command', + category: 'motion', + spec: 'if on edge, bounce' + }, + getPosition: { + only: SpriteMorph, + type: 'reporter', + category: 'motion', + spec: 'position' + }, + xPosition: { + only: SpriteMorph, + type: 'reporter', + category: 'motion', + spec: 'x position' + }, + yPosition: { + only: SpriteMorph, + type: 'reporter', + category: 'motion', + spec: 'y position' + }, + direction: { + only: SpriteMorph, + type: 'reporter', + category: 'motion', + spec: 'direction' + }, + + // Looks + doSwitchToCostume: { + type: 'command', + category: 'looks', + spec: 'switch to costume %cst' + }, + doWearNextCostume: { + type: 'command', + category: 'looks', + spec: 'next costume' + }, + getCostumeIdx: { + type: 'reporter', + category: 'looks', + spec: 'costume #' + }, + reportGetImageAttribute: { + type: 'reporter', + category: 'looks', + spec: '%img of costume %cst', + defaults: [['width'], ['current']] + }, + reportNewCostume: { + type: 'reporter', + category: 'looks', + spec: 'new costume %l width %dim height %dim' + }, + reportNewCostumeStretched: { + type: 'reporter', + category: 'looks', + spec: 'stretch %cst x: %n y: %n %', + defaults: [['current'], 100, 50] + }, + doSayFor: { + type: 'command', + category: 'looks', + spec: 'say %s for %n secs', + defaults: [localize('Hello!'), 2] + }, + bubble: { + type: 'command', + category: 'looks', + spec: 'say %s', + defaults: [localize('Hello!')] + }, + doThinkFor: { + only: SpriteMorph, + type: 'command', + category: 'looks', + spec: 'think %s for %n secs', + defaults: [localize('Hmm...'), 2] + }, + doThink: { + only: SpriteMorph, + type: 'command', + category: 'looks', + spec: 'think %s', + defaults: [localize('Hmm...')] + }, + changeEffect: { + type: 'command', + category: 'looks', + spec: 'change %eff effect by %n', + defaults: [['ghost'], 25] + }, + setEffect: { + type: 'command', + category: 'looks', + spec: 'set %eff effect to %n', + defaults: [['ghost'], 0] + }, + getEffect: { + type: 'reporter', + category: 'looks', + spec: '%eff effect', + defaults: [['ghost']] + }, + clearEffects: { + type: 'command', + category: 'looks', + spec: 'clear graphic effects' + }, + changeScale: { + only: SpriteMorph, + type: 'command', + category: 'looks', + spec: 'change size by %n', + defaults: [10] + }, + setScale: { + only: SpriteMorph, + type: 'command', + category: 'looks', + spec: 'set size to %n %', + defaults: [100] + }, + getScale: { + only: SpriteMorph, + type: 'reporter', + category: 'looks', + spec: 'size' + }, + show: { + type: 'command', + category: 'looks', + spec: 'show' + }, + hide: { + type: 'command', + category: 'looks', + spec: 'hide' + }, + reportShown: { + type: 'predicate', + category: 'looks', + spec: 'shown?' + }, + goToLayer: { + only: SpriteMorph, + type: 'command', + category: 'looks', + spec: 'go to %layer layer', + defaults: [['front']] + }, + goBack: { + only: SpriteMorph, + type: 'command', + category: 'looks', + spec: 'go back %n layers', + defaults: [1] + }, + + // Looks - Debugging primitives for development mode + doScreenshot: { + dev: true, + type: 'command', + category: 'looks', + spec: 'save %imgsource as costume named %s', + defaults: [['pen trails'], localize('screenshot')] + }, + reportCostumes: { + dev: true, + type: 'reporter', + category: 'looks', + spec: 'wardrobe' + }, + alert: { + dev: true, + type: 'command', + category: 'looks', + spec: 'alert %mult%s' + }, + log: { + dev: true, + type: 'command', + category: 'looks', + spec: 'console log %mult%s' + }, + + // Sound + playSound: { + type: 'command', + category: 'sound', + spec: 'play sound %snd' + }, + doPlaySoundUntilDone: { + type: 'command', + category: 'sound', + spec: 'play sound %snd until done' + }, + doPlaySoundAtRate: { + type: 'command', + category: 'sound', + spec: 'play sound %snd at %rate Hz', + defaults: ['', 44100] + }, + doStopAllSounds: { + type: 'command', + category: 'sound', + spec: 'stop all sounds' + }, + reportGetSoundAttribute: { + type: 'reporter', + category: 'sound', + spec: '%aa of sound %snd', + defaults: [['duration']] + }, + reportNewSoundFromSamples: { + type: 'reporter', + category: 'sound', + spec: 'new sound %l rate %rate Hz', + defaults: [null, 44100] + }, + doRest: { + type: 'command', + category: 'sound', + spec: 'rest for %n beats', + defaults: [0.2] + }, + doPlayNote: { + type: 'command', + category: 'sound', + spec: 'play note %note for %n beats', + defaults: [60, 0.5] + }, + doPlayFrequency: { // only in dev mode - experimental + dev: true, + type: 'command', + category: 'sound', + spec: 'play %n Hz for %n secs', + defaults: [440, 2] + }, + doSetInstrument: { + type: 'command', + category: 'sound', + spec: 'set instrument to %inst', + defaults: [1] + }, + doChangeTempo: { + type: 'command', + category: 'sound', + spec: 'change tempo by %n', + defaults: [20] + }, + doSetTempo: { + type: 'command', + category: 'sound', + spec: 'set tempo to %n bpm', + defaults: [60] + }, + getTempo: { + type: 'reporter', + category: 'sound', + spec: 'tempo' + }, + changeVolume: { + type: 'command', + category: 'sound', + spec: 'change volume by %n', + defaults: [10] + }, + setVolume: { + type: 'command', + category: 'sound', + spec: 'set volume to %n %', + defaults: [100] + }, + getVolume: { + type: 'reporter', + category: 'sound', + spec: 'volume' + }, + changePan: { + type: 'command', + category: 'sound', + spec: 'change balance by %n', + defaults: [10] + }, + setPan: { + type: 'command', + category: 'sound', + spec: 'set balance to %n', + defaults: [0] + }, + getPan: { + type: 'reporter', + category: 'sound', + spec: 'balance' + }, + playFreq: { + type: 'command', + category: 'sound', + spec: 'play frequency %n Hz', + defaults: [440] + }, + stopFreq: { + type: 'command', + category: 'sound', + spec: 'stop frequency' + }, + + // Sound - Debugging primitives for development mode + reportSounds: { + dev: true, + type: 'reporter', + category: 'sound', + spec: 'jukebox' + }, + + // Pen + clear: { + type: 'command', + category: 'pen', + spec: 'clear' + }, + down: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'pen down' + }, + up: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'pen up' + }, + getPenDown: { + only: SpriteMorph, + type: 'predicate', + category: 'pen', + spec: 'pen down?' + }, + setColor: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'set pen color to %clr' + }, + setPenColorDimension: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'set pen %clrdim to %n', + defaults: [['hue'], 50] + }, + changePenColorDimension: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'change pen %clrdim by %n', + defaults: [['hue'], 10] + }, + getPenAttribute: { + type: 'reporter', + category: 'pen', + spec: 'pen %pen', + defaults: [['hue']] + }, + setBackgroundColor: { + only: StageMorph, + type: 'command', + category: 'pen', + spec: 'set background color to %clr' + }, + setBackgroundColorDimension: { + only: StageMorph, + type: 'command', + category: 'pen', + spec: 'set background %clrdim to %n', + defaults: [['hue'], 50] + }, + changeBackgroundColorDimension: { + only: StageMorph, + type: 'command', + category: 'pen', + spec: 'change background %clrdim by %n', + defaults: [['hue'], 10] + }, + changeSize: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'change pen size by %n', + defaults: [1] + }, + setSize: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'set pen size to %n', + defaults: [1] + }, + doStamp: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'stamp' + }, + floodFill: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'fill' + }, + write: { + only: SpriteMorph, + type: 'command', + category: 'pen', + spec: 'write %s size %n', + defaults: [localize('Hello!'), 12] + }, + reportPenTrailsAsCostume: { + type: 'reporter', + category: 'pen', + spec: 'pen trails' + }, + reportPentrailsAsSVG: { + type: 'reporter', + category: 'pen', + spec: 'pen vectors' + }, + doPasteOn: { + type: 'command', + category: 'pen', + spec: 'paste on %spr' + }, + doCutFrom: { + type: 'command', + category: 'pen', + spec: 'cut from %spr' + }, + + // Control + receiveGo: { + type: 'hat', + category: 'control', + spec: 'when %greenflag clicked' + }, + receiveKey: { + type: 'hat', + category: 'control', + spec: 'when %keyHat key pressed %keyName', + defaults: [['space']] + }, + receiveInteraction: { + type: 'hat', + category: 'control', + spec: 'when I am %interaction', + defaults: [['clicked']] + }, + receiveMessage: { + type: 'hat', + category: 'control', + spec: 'when I receive %msgHat %message', + defaults: [['']] // trigger the "message" expansion to refresh + }, + receiveCondition: { + type: 'hat', + category: 'control', + spec: 'when %b' + }, + getLastMessage: { // retained for legacy compatibility + dev: true, + type: 'reporter', + category: 'control', + spec: 'message' + }, + doBroadcast: { + type: 'command', + category: 'control', + spec: 'broadcast %msg %receive' + }, + doBroadcastAndWait: { + type: 'command', + category: 'control', + spec: 'broadcast %msg %receive and wait' + }, + doWait: { + type: 'command', + category: 'control', + spec: 'wait %n secs', + defaults: [1] + }, + doWaitUntil: { + type: 'command', + category: 'control', + spec: 'wait until %b' + }, + doForever: { + type: 'command', + category: 'control', + spec: 'forever %loop' + }, + doRepeat: { + type: 'command', + category: 'control', + spec: 'repeat %n %loop', + defaults: [10] + }, + doUntil: { + type: 'command', + category: 'control', + spec: 'repeat until %b %loop' + }, + doFor: { + type: 'command', + category: 'control', + spec: 'for %upvar = %n to %n %cla', + defaults: ['i', 1, 10] + }, + /* + doVariadicIf: { + type: 'command', + category: 'control', + spec: 'if %b %c %elseif' + }, + */ + doIf: { + type: 'command', + category: 'control', + spec: 'if %b %c %elseif' + }, + doIfElse: { + type: 'command', + category: 'control', + spec: 'if %b %c else %c' + }, + reportIfElse: { + type: 'reporter', + category: 'control', + spec: 'if %b then %s else %s' + }, + doStopThis: { + type: 'command', + category: 'control', + spec: 'stop %stopChoices', + defaults: [['all']] + }, + doRun: { + type: 'command', + category: 'control', + spec: 'run %cmdRing %inputs' + }, + fork: { + type: 'command', + category: 'control', + spec: 'launch %cmdRing %inputs' + }, + evaluate: { + type: 'reporter', + category: 'control', + spec: 'call %repRing %inputs' + }, + doReport: { + type: 'command', + category: 'control', + spec: 'report %s' + }, + doCallCC: { + // deprecated - superseded by reportEnviornment - kept for legacy + dev: true, + type: 'command', + category: 'control', + spec: 'run %cmdRing w/continuation' + }, + reportCallCC: { + // deprecated - superseded by reportEnviornment - kept for legacy + dev: true, + type: 'reporter', + category: 'control', + spec: 'call %cmdRing w/continuation' + }, + doWarp: { + type: 'command', + category: 'other', + spec: 'warp %c' + }, + + // Message passing + doTellTo: { + type: 'command', + category: 'control', + // spec: 'tell %spr to %cl' // I liked this version better, -Jens + spec: 'tell %spr to %cmdRing %inputs' + }, + reportAskFor: { + type: 'reporter', + category: 'control', + spec: 'ask %spr for %repRing %inputs' + }, + + // Cloning + receiveOnClone: { + type: 'hat', + category: 'control', + spec: 'when I start as a clone' + }, + createClone: { + type: 'command', + category: 'control', + spec: 'create a clone of %cln', + defaults: [['myself']] + }, + newClone: { + type: 'reporter', + category: 'control', + spec: 'a new clone of %cln', + defaults: [['myself']] + }, + removeClone: { + type: 'command', + category: 'control', + spec: 'delete this clone' + }, + + // recording user edits + receiveUserEdit: { + type: 'hat', + category: 'control', + spec: 'when %edit is edited %message', + defaults: [['anything']] + }, + + // Custom Blocks & introspection + doDefineBlock: { + type: 'command', + category: 'control', + spec: 'define %upvar %s %repRing', + defaults: [['block']] + }, + doSetBlockAttribute: { + type: 'command', + category: 'control', + spec: 'set %byob of block %repRing to %s', + defaults: [['label']] + }, + doDeleteBlock: { + type: 'command', + category: 'control', + spec: 'delete block %repRing' + }, + reportBlockAttribute: { + type: 'reporter', + category: 'control', + spec: '%block of block %repRing', + defaults: [['definition']] + }, + reportEnvironment: { + type: 'reporter', + category: 'control', + spec: 'this %env', + defaults: [['script']] + }, + + // Debugging - pausing + doPauseAll: { + type: 'command', + category: 'control', + spec: 'pause all %pause' + }, + + // Scenes + doSwitchToScene: { + type: 'command', + category: 'control', + spec: 'switch to scene %scn %send', + defaults: [['next']] + }, + + // Pipe + reportPipe: { + type: 'reporter', + category: 'control', + spec: 'pipe %s $arrowRight %mult%repRing' + }, + + // Sensing + reportTouchingObject: { + only: SpriteMorph, + type: 'predicate', + category: 'sensing', + spec: 'touching %col ?', + defaults: [['mouse-pointer']] + }, + reportTouchingColor: { + only: SpriteMorph, + type: 'predicate', + category: 'sensing', + spec: 'touching %clr ?' + }, + reportColorIsTouchingColor: { + only: SpriteMorph, + type: 'predicate', + category: 'sensing', + spec: 'color %clr is touching %clr ?' + }, + reportAspect: { + type: 'reporter', + category: 'sensing', + spec: '%asp at %loc', + defaults: [['hue'], ['mouse-pointer']] + }, + reportStackSize: { + dev: true, + type: 'reporter', + category: 'sensing', + spec: 'stack size' + }, + reportFrameCount: { + dev: true, + type: 'reporter', + category: 'sensing', + spec: 'frames' + }, + reportYieldCount: { + dev: true, + type: 'reporter', + category: 'sensing', + spec: 'yields' + }, + reportThreadCount: { + dev: true, + type: 'reporter', + category: 'sensing', + spec: 'processes' + }, + doAsk: { + type: 'command', + category: 'sensing', + spec: 'ask %s and wait', + defaults: [localize('what\'s your name?')] + }, + reportLastAnswer: { // retained for legacy compatibility + dev: true, + type: 'reporter', + category: 'sensing', + spec: 'answer' + }, + getLastAnswer: { + type: 'reporter', + category: 'sensing', + spec: 'answer' + }, + reportMousePosition: { + type: 'reporter', + category: 'sensing', + spec: 'mouse position' + }, + reportMouseX: { + type: 'reporter', + category: 'sensing', + spec: 'mouse x' + }, + reportMouseY: { + type: 'reporter', + category: 'sensing', + spec: 'mouse y' + }, + reportMouseDown: { + type: 'predicate', + category: 'sensing', + spec: 'mouse down?' + }, + reportKeyPressed: { + type: 'predicate', + category: 'sensing', + spec: 'key %key pressed?', + defaults: [['space']] + }, + reportRelationTo: { + only: SpriteMorph, + type: 'reporter', + category: 'sensing', + spec: '%rel to %dst', + defaults: [['distance'], ['mouse-pointer']] + }, + doResetTimer: { + type: 'command', + category: 'sensing', + spec: 'reset timer' + }, + reportTimer: { // retained for legacy compatibility + dev: true, + type: 'reporter', + category: 'sensing', + spec: 'timer' + }, + getTimer: { + type: 'reporter', + category: 'sensing', + spec: 'timer' + }, + reportAttributeOf: { + type: 'reporter', + category: 'sensing', + spec: '%att of %spr', + defaults: [['costume #']] + }, + reportObject: { + type: 'reporter', + category: 'sensing', + spec: 'object %self', + defaults: [['myself']] + }, + reportURL: { + type: 'reporter', + category: 'sensing', + spec: 'url %s', + defaults: ['snap.berkeley.edu'] + }, + doSetGlobalFlag: { + type: 'command', + category: 'sensing', + spec: 'set %setting to %b', + defaults: [['video capture']] + }, + reportGlobalFlag: { + type: 'predicate', + category: 'sensing', + spec: 'is %setting on?', + defaults: [['turbo mode']] + }, + reportDate: { + type: 'reporter', + category: 'sensing', + spec: 'current %dates', + defaults: [['date']] + }, + reportGet: { + type: 'reporter', + category: 'sensing', + spec: 'my %get', + defaults: [['neighbors']] + }, + reportAudio: { + type: 'reporter', + category: 'sensing', + spec: 'microphone %audio', + defaults: [['volume']] + }, + + // Operators + reifyScript: { + type: 'ring', + category: 'other', + spec: '%rc %ringparms', + alias: 'command ring lambda' + }, + reifyReporter: { + type: 'ring', + category: 'other', + spec: '%rr %ringparms', + alias: 'reporter ring lambda' + }, + reifyPredicate: { + type: 'ring', + category: 'other', + spec: '%rp %ringparms', + alias: 'predicate ring lambda' + }, + reportVariadicSum: { + type: 'reporter', + category: 'operators', + spec: '%sum', + alias: '+' + }, + reportDifference: { + type: 'reporter', + category: 'operators', + spec: '%n \u2212 %n', + alias: '-' + }, + reportVariadicProduct: { + type: 'reporter', + category: 'operators', + spec: '%product', + alias: '*' + }, + reportQuotient: { + type: 'reporter', + category: 'operators', + spec: '%n / %n' // '%n \u00F7 %n' + }, + reportRound: { + type: 'reporter', + category: 'operators', + spec: 'round %n' + }, + reportMonadic: { + type: 'reporter', + category: 'operators', + spec: '%fun of %n', + defaults: [['sqrt'], 10] + }, + reportPower: { + type: 'reporter', + category: 'operators', + spec: '%n ^ %n' + }, + reportModulus: { + type: 'reporter', + category: 'operators', + spec: '%n mod %n' + }, + reportAtan2: { + type: 'reporter', + category: 'operators', + spec: 'atan2 %n ÷ %n' + }, + reportVariadicMin: { + type: 'reporter', + category: 'operators', + spec: '%min', + alias: 'min' + }, + reportVariadicMax: { + type: 'reporter', + category: 'operators', + spec: '%max', + alias: 'max' + }, + reportRandom: { + type: 'reporter', + category: 'operators', + spec: 'pick random %n to %n', + defaults: [1, 10] + }, + reportVariadicEquals: { + type: 'predicate', + category: 'operators', + spec: '%all=' + }, + reportVariadicNotEquals: { + type: 'predicate', + category: 'operators', + spec: '%all!=' + }, + reportVariadicLessThan: { + type: 'predicate', + category: 'operators', + spec: '%all<' + }, + reportVariadicLessThanOrEquals: { + type: 'predicate', + category: 'operators', + spec: '%all<=' + }, + reportVariadicGreaterThan: { + type: 'predicate', + category: 'operators', + spec: '%all>' + }, + reportVariadicGreaterThanOrEquals: { + type: 'predicate', + category: 'operators', + spec: '%all>=' + }, + reportVariadicAnd: { + type: 'predicate', + category: 'operators', + spec: '%all', + alias: '&' + }, + reportVariadicOr: { + type: 'predicate', + category: 'operators', + spec: '%any', + alias: '|' + }, + reportNot: { + type: 'predicate', + category: 'operators', + spec: 'not %b' + }, + reportBoolean: { + type: 'predicate', + category: 'operators', + spec: '%bool', + defaults: [true], + alias: 'true boolean' + }, + reportFalse: { // special case for keyboard entry and search + type: 'predicate', + category: 'operators', + spec: '%bool', + defaults: [false], + alias: 'false boolean' + }, + reportJoinWords: { + type: 'reporter', + category: 'operators', + spec: 'join %words', + defaults: [localize('hello') + ' ', localize('world')] + }, + reportLetter: { + type: 'reporter', + category: 'operators', + spec: 'letter %ix of %s', + defaults: [1, localize('world')] + }, + reportStringSize: { // deprecated as of v9 + type: 'reporter', + category: 'operators', + spec: 'length of %s', + defaults: [localize('world')] + }, + reportTextAttribute: { + type: 'reporter', + category: 'operators', + spec: '%ta of text %s', + defaults: [['length'], localize('world')] + }, + reportUnicode: { + type: 'reporter', + category: 'operators', + spec: 'unicode of %s', + defaults: ['a'] + }, + reportUnicodeAsLetter: { + type: 'reporter', + category: 'operators', + spec: 'unicode %n as letter', + defaults: [65] + }, + reportIsA: { + type: 'predicate', + category: 'operators', + spec: 'is %s a %typ ?', + defaults: [5, ['number']] + }, + reportVariadicIsIdentical: { + type: 'predicate', + category: 'operators', + spec: 'is %all== ?' + }, + reportTextSplit: { + type: 'reporter', + category: 'operators', + spec: 'split %s by %delim', + defaults: [localize('hello') + ' ' + localize('world'), " "] + }, + reportJSFunction: { + type: 'reporter', + category: 'operators', + spec: 'JavaScript function ( %mult%s ) { %code }' + }, + reportTypeOf: { // only in dev mode for debugging + dev: true, + type: 'reporter', + category: 'operators', + spec: 'type of %s', + defaults: [5] + }, + reportTextFunction: { // only in dev mode - experimental + dev: true, + type: 'reporter', + category: 'operators', + spec: '%txtfun of %s', + defaults: [['encode URI'], "Abelson & Sussman"] + }, + reportCompiled: { // experimental + dev: true, + type: 'reporter', + category: 'operators', + spec: 'compile %repRing for %n args', + defaults: [null, 0] + }, + + // Variables + doSetVar: { + type: 'command', + category: 'variables', + spec: 'set %var to %s', + defaults: [null, 0] + }, + doChangeVar: { + type: 'command', + category: 'variables', + spec: 'change %var by %n', + defaults: [null, 1] + }, + doShowVar: { + type: 'command', + category: 'variables', + spec: 'show variable %var' + }, + doHideVar: { + type: 'command', + category: 'variables', + spec: 'hide variable %var' + }, + doDeclareVariables: { + type: 'command', + category: 'other', + spec: 'script variables %scriptVars' + }, + + // inheritance + doDeleteAttr: { + type: 'command', + category: 'variables', + spec: 'inherit %shd' + }, + + // Lists + reportNewList: { + type: 'reporter', + category: 'lists', + spec: 'list %exp' + }, + reportCONS: { + type: 'reporter', + category: 'lists', + spec: '%s in front of %l' + }, + reportListItem: { + type: 'reporter', + category: 'lists', + spec: 'item %idx of %l', + defaults: [1] + }, + reportCDR: { + type: 'reporter', + category: 'lists', + spec: 'all but first of %l' + }, + reportListLength: { // deprecated as of v6.6 + dev: true, + type: 'reporter', + category: 'lists', + spec: 'length of %l' + }, + reportListAttribute: { + type: 'reporter', + category: 'lists', + spec: '%la of %l', + defaults: [['length']] + }, + reportListContainsItem: { + type: 'predicate', + category: 'lists', + spec: '%l contains %s', + defaults: [null, localize('thing')] + }, + reportListIsEmpty: { + type: 'predicate', + category: 'lists', + spec: 'is %l empty?' + }, + reportListIndex: { + type: 'reporter', + category: 'lists', + spec: 'index of %s in %l', + defaults: [localize('thing')] + }, + doAddToList: { + type: 'command', + category: 'lists', + spec: 'add %s to %l', + defaults: [localize('thing')] + }, + doDeleteFromList: { + type: 'command', + category: 'lists', + spec: 'delete %ida of %l', + defaults: [1] + }, + doInsertInList: { + type: 'command', + category: 'lists', + spec: 'insert %s at %idx of %l', + defaults: [localize('thing'), 1] + }, + doReplaceInList: { + type: 'command', + category: 'lists', + spec: 'replace item %idx of %l with %s', + defaults: [1, null, localize('thing')] + }, + + // numbers - (arrayed when hyper-blocks is on, otherwise linked) + reportNumbers: { + type: 'reporter', + category: 'lists', + spec: 'numbers from %n to %n', + defaults: [1, 10] + }, + /* + reportListCombination: { // currently not in use + type: 'reporter', + category: 'lists', + spec: '%mlfunc %lists', + defaults: [['append']] + }, + */ + reportConcatenatedLists: { + type: 'reporter', + category: 'lists', + spec: 'append %lists' + }, + reportCrossproduct: { + type: 'reporter', + category: 'lists', + spec: 'combinations %lists' + }, + reportTranspose: { // deprecated + type: 'reporter', + category: 'lists', + spec: 'transpose %l' + }, + reportReshape: { + type: 'reporter', + category: 'lists', + spec: 'reshape %s to %nums', + defaults: [null, [4, 3]] + }, + /* + reportSlice: { // currently not in use + type: 'reporter', + category: 'lists', + spec: 'slice %l by %nums', + defaults: [null, [2, -1]] + }, + */ + + // HOFs + reportMap: { + type: 'reporter', + category: 'lists', + spec: 'map %repRing over %l' + }, + reportAtomicMap: { + dev: true, // not shown in palette, only accessible via relabelling + type: 'reporter', + category: 'lists', + spec: '%blitz map %repRing over %l' + }, + reportKeep: { + type: 'reporter', + category: 'lists', + spec: 'keep items %predRing from %l' + }, + reportAtomicKeep: { + dev: true, // not shown in palette, only accessible via relabelling + type: 'reporter', + category: 'lists', + spec: '%blitz keep items %predRing from %l' + }, + reportFindFirst: { + type: 'reporter', + category: 'lists', + spec: 'find first item %predRing in %l' + }, + reportAtomicFindFirst: { + dev: true, // not shown in palette, only accessible via relabelling + type: 'reporter', + category: 'lists', + spec: '%blitz find first item %predRing in %l' + }, + reportCombine: { + type: 'reporter', + category: 'lists', + spec: 'combine %l using %repRing' + }, + reportAtomicCombine: { + dev: true, // not shown in palette, only accessible via relabelling + type: 'reporter', + category: 'lists', + spec: '%blitz combine %l using %repRing' + }, + doForEach: { + type: 'command', + category: 'lists', + spec: 'for each %upvar in %l %cla', + defaults: [localize('item')] + }, + + // Tables - experimental + doShowTable: { + dev: true, + type: 'command', + category: 'lists', + spec: 'show table %l' + }, + + // Code mapping + doMapCodeOrHeader: { + type: 'command', + category: 'other', + spec: 'map %cmdRing to %codeKind %code', + defaults: [null, ['code']] + }, + doMapValueCode: { + type: 'command', + category: 'other', + spec: 'map %mapValue to code %code', + defaults: [['String'], '<#1>'] + }, + doMapListCode: { + type: 'command', + category: 'other', + spec: 'map %codeListPart of %codeListKind to code %code' + }, + reportMappedCode: { + type: 'reporter', + category: 'other', + spec: 'code of %cmdRing' + }, + + // Extensions + doApplyExtension: { + type: 'command', + category: 'other', + spec: 'primitive %prim %mult%s' + }, + reportApplyExtension: { + type: 'reporter', + category: 'other', + spec: 'primitive %prim %mult%s' + }, + + // Video motion + doSetVideoTransparency: { + type: 'command', + category: 'sensing', + spec: 'set video transparency to %n', + defaults: [50] + }, + reportVideo: { + type: 'reporter', + category: 'sensing', + spec: 'video %vid on %self', + defaults: [['motion'], ['myself']] + } + }; +}; + +SpriteMorph.prototype.initBlocks(); + +SpriteMorph.prototype.initBlockMigrations = function () { + // change blocks in existing projects to their updated version + SpriteMorph.prototype.blockMigrations = { + doStopAll: { + selector: 'doStopThis', + inputs: [['all']] + }, + doStop: { + selector: 'doStopThis', + inputs: [['this script']] + }, + doStopBlock: { + selector: 'doStopThis', + inputs: [['this block']] + }, + doStopOthers: { + selector: 'doStopThis', + inputs: [['all']], + offset: 0 + }, + receiveClick: { + selector: 'receiveInteraction', + inputs: [['clicked']] + }, + reportTrue: { + selector: 'reportBoolean', + inputs: [true] + }, + reportFalse: { + selector: 'reportBoolean', + inputs: [false] + }, + reportCostumes: { + selector: 'reportGet', + inputs: [['costumes']] + }, + reportSounds: { + selector: 'reportGet', + inputs: [['sounds']] + }, + doMapStringCode: { + selector: 'doMapValueCode', + inputs: [['String'], '<#1>'], + offset: 1 + }, + reportDistanceTo: { + selector: 'reportRelationTo', + inputs: [['distance']], + offset: 1 + }, + comeToFront: { + selector: 'goToLayer', + inputs: [['front']] + }, + setHue: { + selector: 'setPenColorDimension', + inputs: [['hue']], + offset: 1 + }, + setBrightness: { + selector: 'setPenColorDimension', + inputs: [['brightness']], + offset: 1 + }, + setPenHSVA: { + selector: 'setPenColorDimension' + }, + changeHue: { + selector: 'changePenColorDimension', + inputs: [['hue']], + offset: 1 + }, + changeBrightness: { + selector: 'changePenColorDimension', + inputs: [['brightness']], + offset: 1 + }, + changePenHSVA: { + selector: 'changePenColorDimension' + }, + setBackgroundHSVA: { + selector: 'setBackgroundColorDimension' + }, + changeBackgroundHSVA: { + selector: 'changeBackgroundColorDimension' + }, + reportIsFastTracking: { + selector: 'reportGlobalFlag', + inputs: [['turbo mode']], + offset: 1 + }, + doSetFastTracking: { + selector: 'doSetGlobalFlag', + inputs: [['turbo mode']], + offset: 1 + }, + reportTableRotated: { + selector: 'reportListAttribute', + inputs: [['transpose']], + offset: 1 + }, + reportTranspose: { + selector: 'reportListAttribute', + inputs: [['transpose']], + offset: 1 + }, + reportListLength: { + selector: 'reportListAttribute', + inputs: [['length']], + offset: 1 + }, + doSend: { + selector: 'doBroadcast', + expand: 1 + }, + reportSum: { + selector: 'reportVariadicSum', + variadic: true + }, + reportProduct: { + selector: 'reportVariadicProduct', + variadic: true + }, + reportMin: { + selector: 'reportVariadicMin', + variadic: true + }, + reportMax: { + selector: 'reportVariadicMax', + variadic: true + }, + reportAnd: { + selector: 'reportVariadicAnd', + variadic: true + }, + reportOr: { + selector: 'reportVariadicOr', + variadic: true + }, + reportLessThan: { + selector: 'reportVariadicLessThan', + variadic: true + }, + reportGreaterThan: { + selector: 'reportVariadicGreaterThan', + variadic: true + }, + reportLessThanOrEquals: { + selector: 'reportVariadicLessThanOrEquals', + variadic: true + }, + reportGreaterThanOrEquals: { + selector: 'reportVariadicGreaterThanOrEquals', + variadic: true + }, + reportEquals: { + selector: 'reportVariadicEquals', + variadic: true + }, + reportNotEquals: { + selector: 'reportVariadicNotEquals', + variadic: true + }, + reportIsIdentical: { + selector: 'reportVariadicIsIdentical', + variadic: true + }, + reportThisContext: { + selector: 'reportEnvironment', + inputs: [['script']] + }, + reportStringSize: { + selector: 'reportTextAttribute', + inputs: [['length']], + offset: 1 + } + /* + doIf: { + selector: 'doVariadicIf' + }, + doIfElse: { + selector: 'doVariadicIf', + // variadic: true, + expand: [2, 2] + } + */ + + }; +}; + +SpriteMorph.prototype.newPrimitivesSince = function (version) { + var selectors = ['reportJSFunction']; + if (version < 9.1) { + selectors.push( + 'reportAtan2', + 'reportVariadicMin', + 'reportVariadicMax' + ); + } + // 9: no new primitives + // 8.2: no new primitives + if (version < 8.1) { + selectors.push( + 'reportPipe', + 'receiveUserEdit' + ); + } + if (version < 8) { + selectors.push( + 'getPosition', + 'reportMousePosition', + 'doDefineBlock', + 'doSetBlockAttribute', + 'doDeleteBlock', + 'reportBlockAttribute', + 'reportEnvironment' + ); + } + return selectors; +}; + +SpriteMorph.prototype.initBlockMigrations(); + +SpriteMorph.prototype.blockAlternatives = { + // structure: + // selector: [ersatz, ...] + // ersatz can also be a 2-item array: [selector, input-offset] + + // motion: + forward: ['changeXPosition', 'changeYPosition'], + turn: ['turnLeft'], + turnLeft: ['turn'], + doFaceTowards: ['doGotoObject'], + gotoXY: [['doGlide', 1]], + doGotoObject: ['doFaceTowards'], + doGlide: [['gotoXY', -1]], + changeXPosition: ['changeYPosition', 'setXPosition', 'setYPosition', + 'forward'], + setXPosition: ['setYPosition', 'changeXPosition', 'changeYPosition'], + changeYPosition: ['changeXPosition', 'setYPosition', 'setXPosition', + 'forward'], + setYPosition: ['setXPosition', 'changeYPosition', 'changeXPosition'], + xPosition: ['yPosition', 'getPosition'], + yPosition: ['xPosition', 'getPosition'], + getPosition: ['xPosition', 'yPosition'], + + // looks: + doSayFor: ['doThinkFor', 'bubble', 'doThink', 'doAsk'], + doThinkFor: ['doSayFor', 'doThink', 'bubble', 'doAsk'], + bubble: ['doThink', 'doAsk', 'doSayFor', 'doThinkFor'], + doThink: ['bubble', 'doAsk', 'doSayFor', 'doThinkFor'], + show: ['hide'], + hide: ['show'], + changeEffect: ['setEffect'], + setEffect: ['changeEffect'], + changeScale: ['setScale'], + setScale: ['changeScale'], + + // sound: + playSound: ['doPlaySoundUntilDone', 'doPlaySoundAtRate'], + doPlaySoundUntilDone: ['playSound', 'doPlaySoundAtRate'], + doPlaySoundAtRate: ['playSound', 'doPlaySoundUntilDone'], + doPlayNote: [['doRest', -1]], + doRest: [['doPlayNote', 1]], + doChangeTempo: ['doSetTempo'], + doSetTempo: ['doChangeTempo'], + setVolume: ['changeVolume'], + changeVolume: ['setVolume'], + setPan: ['changePan'], + changePan: ['setPan'], + getVolume: ['getTempo', 'getPan'], + getTempo: ['getVolume', 'getPan'], + getPan: ['getVolume', 'getTempo'], + + // pen: + clear: ['down', 'up', 'doStamp'], + down: ['up', 'clear', 'doStamp'], + up: ['down', 'clear', 'doStamp'], + doPasteOn: ['doCutFrom'], + doCutFrom: ['doPasteOn'], + doStamp: ['clear', 'down', 'up'], + setPenColorDimension: ['changePenColorDimension'], + changePenColorDimension: ['setPenColorDimension'], + setBackgroundColorDimension: ['changeBackgroundColorDimension'], + changeBackgroundColorDimension: ['setBackgroundColorDimension'], + changeSize: ['setSize'], + setSize: ['changeSize'], + + // control: + doBroadcast: ['doBroadcastAndWait'], + doBroadcastAndWait: ['doBroadcast'], + doIf: ['doIfElse', 'doUntil'], + doIfElse: ['doIf', 'doUntil'], + doRepeat: ['doUntil', ['doForever', -1], ['doFor', 2], ['doForEach', 1]], + doUntil: ['doRepeat', 'doIf', ['doForever', -1], ['doFor', 2], + ['doForEach', 1]], + doForever: [['doUntil', 1], ['doRepeat', 1], ['doFor', 3], + ['doForEach', 2]], + doFor: [['doForever', -3], ['doRepeat', -2], ['doUntil', -2], + ['doForEach', -1]], + // doRun: ['fork'], + // fork: ['doRun'], + + // sensing: + doAsk: ['bubble', 'doThink', 'doSayFor', 'doThinkFor'], + getLastAnswer: ['getTimer'], + getTimer: ['getLastAnswer'], + reportMouseX: ['reportMouseY', 'reportMousePosition'], + reportMouseY: ['reportMouseX', 'reportMousePosition'], + reportMousePosition: ['reportMouseX', 'reportMouseY'], + + // operators: + reportVariadicSum: ['reportDifference', 'reportVariadicProduct', + 'reportQuotient', 'reportPower', 'reportModulus', 'reportAtan2', + 'reportVariadicMin', 'reportVariadicMax'], + reportDifference: ['reportVariadicSum', 'reportVariadicProduct', + 'reportQuotient', 'reportPower', 'reportModulus', 'reportAtan2', + 'reportVariadicMin', 'reportVariadicMax'], + reportVariadicProduct: ['reportDifference', 'reportVariadicSum', + 'reportQuotient', 'reportPower', 'reportModulus', 'reportAtan2', + 'reportVariadicMin', 'reportVariadicMax'], + reportQuotient: ['reportDifference', 'reportVariadicProduct', + 'reportVariadicSum', 'reportPower', 'reportModulus', 'reportAtan2', + 'reportVariadicMin', 'reportVariadicMax'], + reportPower: ['reportDifference', 'reportVariadicProduct', + 'reportVariadicSum', 'reportQuotient', 'reportModulus', 'reportAtan2', + 'reportVariadicMin', 'reportVariadicMax'], + reportModulus: ['reportAtan2', 'reportDifference', 'reportVariadicProduct', + 'reportVariadicSum','reportQuotient', 'reportPower', + 'reportVariadicMin', 'reportVariadicMax'], + reportAtan2: ['reportModulus', 'reportDifference', 'reportVariadicProduct', + 'reportVariadicSum','reportQuotient', 'reportPower', + 'reportVariadicMin', 'reportVariadicMax'], + reportVariadicMin: ['reportVariadicMax', 'reportVariadicSum', + 'reportDifference', 'reportVariadicProduct', 'reportQuotient', + 'reportPower', 'reportModulus', 'reportAtan2'], + reportVariadicMax: ['reportVariadicMin', 'reportVariadicSum', + 'reportDifference', 'reportVariadicProduct', 'reportQuotient', + 'reportPower', 'reportModulus', 'reportAtan2'], + reportVariadicLessThan: ['reportVariadicLessThanOrEquals', + 'reportVariadicEquals', 'reportVariadicIsIdentical', + 'reportVariadicNotEquals', 'reportVariadicGreaterThan', + 'reportVariadicGreaterThanOrEquals'], + reportVariadicEquals: ['reportVariadicIsIdentical', + 'reportVariadicNotEquals', 'reportVariadicLessThan', + 'reportVariadicLessThanOrEquals', 'reportVariadicGreaterThan', + 'reportVariadicGreaterThanOrEquals'], + reportVariadicNotEquals: ['reportVariadicEquals', + 'reportVariadicIsIdentical', 'reportVariadicLessThan', + 'reportVariadicLessThanOrEquals', 'reportVariadicGreaterThan', + 'reportVariadicGreaterThanOrEquals'], + reportVariadicGreaterThan: ['reportVariadicGreaterThanOrEquals', + 'reportVariadicEquals', 'reportVariadicIsIdentical', + 'reportVariadicNotEquals', 'reportVariadicLessThan', + 'reportVariadicLessThanOrEquals'], + reportVariadicLessThanOrEquals: ['reportVariadicLessThan', + 'reportVariadicEquals', 'reportVariadicIsIdentical', + 'reportVariadicNotEquals', 'reportVariadicGreaterThan', + 'reportVariadicGreaterThanOrEquals'], + reportVariadicGreaterThanOrEquals: ['reportVariadicGreaterThan', + 'reportVariadicEquals', 'reportVariadicIsIdentical', + 'reportVariadicNotEquals', 'reportVariadicLessThan', + 'reportVariadicLessThanOrEquals'], + reportVariadicIsIdentical: ['reportVariadicEquals', + 'reportVariadicNotEquals', 'reportVariadicLessThan', + 'reportVariadicLessThanOrEquals', 'reportVariadicGreaterThan', + 'reportVariadicGreaterThanOrEquals'], + reportVariadicAnd: ['reportVariadicOr'], + reportVariadicOr: ['reportVariadicAnd'], + + // variables + doSetVar: ['doChangeVar'], + doChangeVar: ['doSetVar'], + doShowVar: ['doHideVar'], + doHideVar: ['doShowVar'], + + // lists + reportConcatenatedLists: ['reportCrossproduct'], + reportCrossproduct: ['reportConcatenatedLists'], + + // HOFs + reportMap: ['reportKeep', 'reportFindFirst'], + reportKeep: ['reportFindFirst', 'reportMap'], + reportFindFirst: ['reportKeep', 'reportMap'], + doForEach: [['doFor', 1], ['doForever', -2], ['doRepeat', -1], + ['doUntil', -1]] +}; + +// SpriteMorph instance creation + +function SpriteMorph(globals) { + this.init(globals); +} + +SpriteMorph.prototype.init = function (globals) { + this.name = localize('Sprite'); + this.variables = new VariableFrame(globals || null, this); + this.scripts = new ScriptsMorph(); + this.customBlocks = []; + this.costumes = new List(); + this.costumes.type = 'costume'; + this.costume = null; + this.sounds = new List(); + this.sounds.type = 'sound'; + this.normalExtent = new Point(60, 60); // only for costume-less situation + this.scale = 1; + this.rotationStyle = 1; // 1 = full, 2 = left/right, 0 = off + this.instrument = null; + this.version = Date.now(); // for observer optimization + this.isTemporary = false; // indicate a temporary Scratch-style clone + this.isCorpse = false; // indicate whether a sprite/clone has been deleted + this.cloneOriginName = ''; + + // volume and stereo-pan support + this.volume = 100; + this.gainNode = null; // must be lazily initialized in Chrome, sigh... + this.pan = 0; + this.pannerNode = null; // must be lazily initialized in Chrome, sigh... + + // frequency player + this.freqPlayer = null; // Note, to be lazily initialized + + // pen color dimensions support + this.cachedColorDimensions = [0, 0, 0]; // not serialized + + // only temporarily for serialization + this.inheritedMethodsCache = []; + + // sprite nesting properties + this.parts = []; // not serialized, only anchor (name) + this.anchor = null; + this.nestingScale = 1; + this.rotatesWithAnchor = true; + this.layers = null; // cache for dragging nested sprites, don't serialize + + // Parsons Problems properties + this.solution = null; + + this.primitivesCache = {}; // not to be serialized (!) + this.paletteCache = {}; // not to be serialized (!) + this.categoriesCache = null; // not to be serialized (!) + this.rotationOffset = ZERO; // not to be serialized (!) + this.idx = 0; // not to be serialized (!) - used for de-serialization + + this.graphicsValues = { + 'color': 0, + 'fisheye': 0, + 'whirl': 0, + 'pixelate': 0, + 'mosaic': 0, + 'duplicate': 0, + 'negative': 0, + 'comic': 0, + 'confetti': 0, + 'saturation': 0, + 'brightness': 0 + }; + + // sprite inheritance + this.exemplar = null; + this.instances = []; + this.cachedPropagation = false; // not to be persisted + this.inheritedAttributes = []; // 'x position', 'direction', 'size' etc... + + // video- and rendering state + this.imageExtent = ZERO; + this.imageOffset = ZERO; + this.imageData = {}; // version: date, pixels: Uint32Array + this.motionAmount = 0; + this.motionDirection = 0; + this.frameNumber = 0; + + SpriteMorph.uber.init.call(this); + + this.isFreeForm = true; + this.cachedColorDimensions = this.color[this.penColorModel](); + this.isDraggable = true; + this.isDown = false; + this.heading = 90; + this.fixLayout(); + this.rerender(); +}; + +// SpriteMorph duplicating (fullCopy) + +SpriteMorph.prototype.fullCopy = function (forClone) { + var c = SpriteMorph.uber.fullCopy.call(this), + arr = [], + cb, effect; + + // make sure the clone has its own canvas to recycle + // needs to be copied instead of redrawn, because at + // this time the clone is not yet onstage and therefore + // has no access to the stage's scale + c.cachedImage = copyCanvas(this.cachedImage); + + // un-share individual properties + c.instances = []; + c.stopTalking(); + c.color = this.color.copy(); + c.gainNode = null; + c.pannerNode = null; + c.freqPlayer = null; + c.primitivesCache = {}; + c.paletteCache = {}; + c.categoriesCache = null; + c.imageData = {}; + c.cachedColorDimensions = c.color[this.penColorModel](); + arr = []; + this.inheritedAttributes.forEach(att => arr.push(att)); + c.inheritedAttributes = arr; + if (forClone) { + c.exemplar = this; + c.customBlocks = []; + c.variables = new VariableFrame(null, c); + c.variables.parentFrame = this.variables; + c.inheritedVariableNames().forEach(name => + c.shadowVar(name, c.variables.getVar(name)) + ); + this.addSpecimen(c); + this.cachedPropagation = false; + ['scripts', 'costumes', 'sounds'].forEach(att => { + if (!contains(c.inheritedAttributes, att)) { + c.inheritedAttributes.push(att); + } + }); + } else { + c.variables = this.variables.copy(); + c.variables.owner = c; + c.scripts = this.scripts.fullCopy(); + c.customBlocks = []; + this.customBlocks.forEach(def => { + cb = def.copyAndBindTo(c); + c.customBlocks.push(cb); + c.allBlockInstances(def).forEach(block => + block.definition = cb + ); + }); + if (c.costume instanceof Costume && !c.getCostumeIdx()) { + c.costume = c.costume.copy(); + } + arr = []; + this.costumes.asArray().forEach(costume => { + var cst = forClone ? costume : costume.copy(); + arr.push(cst); + if (costume === this.costume) { + c.costume = cst; + } + }); + c.costumes = new List(arr); + c.costumes.type = 'costume'; + arr = []; + this.sounds.asArray().forEach(sound => { + var snd = forClone ? sound : sound.copy(); + arr.push(snd); + }); + c.sounds = new List(arr); + c.sounds.type = 'sound'; + arr = []; + } + c.nestingScale = 1; + c.rotatesWithAnchor = true; + c.anchor = null; + c.parts = []; + this.parts.forEach(part => { + var dp = part.fullCopy(forClone); + dp.nestingScale = part.nestingScale; + dp.rotatesWithAnchor = part.rotatesWithAnchor; + c.attachPart(dp); + }); + c.graphicsValues = {}; + for (effect in this.graphicsValues) { + if (this.graphicsValues.hasOwnProperty(effect)) { + c.graphicsValues[effect] = this.graphicsValues[effect]; + } + } + return c; +}; + +SpriteMorph.prototype.appearIn = function (ide) { + // private - used in IDE_Morph.duplicateSprite() + if (!this.isTemporary) { + this.name = ide.newSpriteName(this.name); + ide.corral.addSprite(this); + ide.sprites.add(this); + } + ide.stage.add(this); + this.parts.forEach(part => part.appearIn(ide)); +}; + +// SpriteMorph versioning + +SpriteMorph.prototype.setName = function (string) { + var old = this.name; + if (old === string) {return; } + this.name = string || this.name; + this.version = Date.now(); + this.recordUserEdit('sprite', 'name', old); +}; + +// SpriteMorph rendering + +SpriteMorph.prototype.getImage = function () { + // overrides inherited method to allow for an image exceeding my bounds + // to accommodate rotation and to disable retina resolution to + // optimize graphics performance + if (this.shouldRerender || !this.cachedImage) { + this.cachedImage = newCanvas( + this.costume ? this.imageExtent : this.extent(), + !isNil(this.costume), // retina + this.cachedImage + ); + this.render(this.cachedImage.getContext('2d')); + this.shouldRerender = false; + } + return this.cachedImage; +}; + +SpriteMorph.prototype.fixLayout = function () { + // determine my extent and the extent designated for my cached image + var currentCenter, + facing, // actual costume heading based on my rotation style + isFlipped, + isLoadingCostume, + pic, // (flipped copy of) actual costume based on my rotation style + imageSide, + stageScale, + newX, + corners = [], + origin, + corner, + costumeExtent; + + currentCenter = this.center(); + isLoadingCostume = this.costume && + typeof this.costume.loaded === 'function'; + stageScale = this.parent instanceof StageMorph ? + this.parent.scale : 1; + facing = this.rotationStyle ? this.heading : 90; + if (this.rotationStyle === 2) { + facing = 90; + if ((this.heading > 180 && (this.heading < 360)) + || (this.heading < 0 && (this.heading > -180))) { + isFlipped = true; + } + } + if (this.costume && !isLoadingCostume) { + pic = isFlipped ? this.costume.flipped() : this.costume; + + // determine the rotated costume's bounding box + corners = pic.bounds().corners().map(point => + point.rotateBy( + radians(facing - 90), + this.costume.center() + ) + ); + origin = corners[0]; + corner = corners[0]; + corners.forEach(point => { + origin = origin.min(point); + corner = corner.max(point); + }); + costumeExtent = origin.corner(corner) + .extent().multiplyBy(this.scale * stageScale); + + // determine the new relative origin of the rotated shape + this.imageOffset = ZERO.rotateBy( + radians(-(facing - 90)), + pic.center() + ).subtract(origin); + + // determine an adequately dimensioned image extent, so the + // shape on the canvas ran be rotated without having to create + // a new canvas each time + + if (this.rotationStyle === 1) { // rotate freely in all directions + // create a canvas that is big enough, so the sprite's current + // costume can be fully rotated inside, so we can recycle + // the canvas for re-rendering until the sprite's or the stage's + // scale changes. + // note that the canvas will be too big for most situations, but + // the sprite's bounds indicate the actually visible area. + // recycling canvas elements instead of creating new ones whenever + // we render a sprite boosts performance for recent browser + // architectures that move canvas elements to the GPU for + // rendering (which is a pain in the ass and an altogether + // bad idea for any serious GUI but looks oh-so-nice for + // some flashy graphic effects in the Apple store). + imageSide = Math.sqrt( + Math.pow(pic.width(), 2) + Math.pow(pic.height(), 2) + ) * this.scale * stageScale; + this.imageExtent = new Point(imageSide, imageSide); + } else { // don't actually rotate + this.imageExtent = costumeExtent; + } + this.bounds.setExtent(costumeExtent); + + // adjust my position to the rotation + this.setCenter(currentCenter, true); + + // determine my rotation offset + this.rotationOffset = this.imageOffset + .translateBy(pic.rotationCenter) + .rotateBy(radians(-(facing - 90)), this.imageOffset) + .scaleBy(this.scale * stageScale); + } else { + facing = isFlipped ? -90 : facing; + newX = Math.min( + Math.max( + this.normalExtent.x * this.scale * stageScale, + 5 + ), + 1000 + ); + this.bounds.setWidth(newX); + this.bounds.setHeight(newX); + this.setCenter(currentCenter, true); // just me + this.rotationOffset = this.extent().divideBy(2); + } +}; + +SpriteMorph.prototype.fullDrawOn = function (aContext, aRect) { + if (!this.isVisible) {return; } + this.isCachingImage = SpriteMorph.prototype.isCachingImage || + this.graphicsChanged(); + this.drawOn(aContext, aRect); + this.children.forEach(child => child.fullDrawOn(aContext, aRect)); +}; + +SpriteMorph.prototype.render = function (ctx) { + var myself = this, + facing, // actual costume heading based on my rotation style + isFlipped, + isLoadingCostume, + cst, + pic, // (flipped copy of) actual costume based on my rotation style + stageScale, + handle; + + isLoadingCostume = this.costume && + typeof this.costume.loaded === 'function'; + stageScale = this.parent instanceof StageMorph ? + this.parent.scale : 1; + facing = this.rotationStyle ? this.heading : 90; + if (this.rotationStyle === 2) { + facing = 90; + if ((this.heading > 180 && (this.heading < 360)) + || (this.heading < 0 && (this.heading > -180))) { + isFlipped = true; + } + } + if (this.costume && !isLoadingCostume) { + pic = isFlipped ? this.costume.flipped() : this.costume; + ctx.save(); + ctx.scale(this.scale * stageScale, this.scale * stageScale); + ctx.translate(this.imageOffset.x, this.imageOffset.y); + ctx.rotate(radians(facing - 90)); + ctx.drawImage(pic.contents, 0, 0); + ctx.restore(); + + } else { + facing = isFlipped ? -90 : facing; + SpriteMorph.uber.render.call(this, ctx, facing); + + if (isLoadingCostume) { // retry until costume is done loading + cst = this.costume; + handle = setInterval( + function () { + myself.wearCostume(cst, true); + clearInterval(handle); + }, + 100 + ); + return this.wearCostume(null, true); + } + } + // apply graphics effects to image + this.applyGraphicsEffects(this.cachedImage); + this.version = Date.now(); +}; + +SpriteMorph.prototype.rotationCenter = function () { + return this.position().add(this.rotationOffset); +}; + +SpriteMorph.prototype.getImageData = function () { + // used for video motion detection. + // Get sprite image data scaled to 1 an converted to ABGR array, + // cache to reduce GC load + if (this.version !== this.imageData.version) { + var stage = this.parentThatIsA(StageMorph), + ext = this.extent(), + newExtent = new Point( + Math.floor(ext.x / stage.scale), + Math.floor(ext.y / stage.scale) + ), + canvas = newCanvas(newExtent, true), + canvasContext, + imageData; + canvasContext = canvas.getContext("2d"); + canvasContext.drawImage( + this.getImage(), + 0, 0, Math.floor(ext.x), + Math.floor(ext.y), + 0, 0, newExtent.x, newExtent.y + ); + imageData = canvasContext.getImageData( + 0, + 0, + newExtent.x, + newExtent.y + ).data; + this.imageData = { + version : this.version, + pixels : new Uint32Array(imageData.buffer.slice(0)) + }; + } + return this.imageData.pixels; +}; + +SpriteMorph.prototype.projectionSnap = function() { + var stage = this.parentThatIsA(StageMorph), + center = this.center().subtract(stage.position()) + .divideBy(stage.scale), + cst = this.costume || this.getImage(), + w, h, rot, + offset, + snap, + ctx; + + if (cst instanceof Costume) { + rot = cst.rotationCenter.copy(); + cst = cst.contents; + w = cst.width; + h = cst.height; + } else { + w = this.width(); + h = this.height(); + } + offset = new Point( + Math.floor(center.x - (w / 2)), + Math.floor(center.y - (h / 2)) + ); + snap = newCanvas(new Point(w, h), true); + ctx = snap.getContext('2d'); + ctx.drawImage(cst, 0, 0); + ctx.globalCompositeOperation = 'source-atop'; + ctx.drawImage(stage.projectionLayer(), -offset.x, -offset.y); + return new Costume(snap, this.newCostumeName(localize('snap')), rot); +}; + +// SpriteMorph block instantiation + +SpriteMorph.prototype.blockForSelector = function (selector, setDefaults) { + var migration, info, block, defaults, inputs, i; + migration = this.blockMigrations[selector]; + info = this.blocks[migration ? migration.selector : selector]; + if (!info) {return null; } + block = info.type === 'command' ? new CommandBlockMorph() + : info.type === 'hat' ? new HatBlockMorph() + : info.type === 'ring' ? new RingMorph() + : new ReporterBlockMorph(info.type === 'predicate'); + block.color = this.blockColorFor(info.category); + block.category = info.category; + block.selector = migration ? migration.selector : selector; + if (contains(['reifyReporter', 'reifyPredicate'], block.selector)) { + block.isStatic = true; + } + block.setSpec(block.localizeBlockSpec(info.spec)); + if (migration && migration.expand) { + if (migration.expand instanceof Array) { + for (i = 0; i < migration.expand[1]; i += 1) { + block.inputs()[migration.expand[0]].addInput(); + } + } else { + block.inputs()[migration.expand].addInput(); + } + } + if ((setDefaults && info.defaults) || (migration && migration.inputs)) { + defaults = migration ? migration.inputs : info.defaults; + block.defaults = defaults; + inputs = block.inputs(); + if (inputs[0] instanceof MultiArgMorph) { + inputs[0].setContents(defaults); + inputs[0].defaults = defaults; + } else { + for (i = 0; i < defaults.length; i += 1) { + if (defaults[i] !== null) { + inputs[i].setContents(defaults[i]); + if (inputs[i] instanceof MultiArgMorph) { + inputs[i].defaults = defaults[i]; + } + } + } + } + } + return block; +}; + +SpriteMorph.prototype.variableBlock = function (varName, isLocalTemplate) { + var block = new ReporterBlockMorph(false); + block.selector = 'reportGetVar'; + block.color = this.blockColor.variables; + block.category = 'variables'; + block.isLocalVarTemplate = isLocalTemplate; + block.setSpec(varName); + block.isDraggable = true; + return block; +}; + +// SpriteMorph block templates + +SpriteMorph.prototype.blockTemplates = function ( + category = 'motion', + all = false // include hidden blocks +) { + var blocks = [], myself = this, varNames, + inheritedVars = this.inheritedVariableNames(), + wrld = this.world(), + devMode = wrld && wrld.isDevMode; + + function block(selector, isGhosted) { + if (StageMorph.prototype.hiddenPrimitives[selector] && !all) { + return null; + } + var newBlock = SpriteMorph.prototype.blockForSelector(selector, true); + newBlock.isTemplate = true; + if (isGhosted) {newBlock.ghost(); } + return newBlock; + } + + function variableBlock(varName, isLocal) { + var newBlock = SpriteMorph.prototype.variableBlock(varName, isLocal); + newBlock.isDraggable = false; + newBlock.isTemplate = true; + if (contains(inheritedVars, varName)) { + newBlock.ghost(); + } + return newBlock; + } + + function watcherToggle(selector) { + if (StageMorph.prototype.hiddenPrimitives[selector]) { + return null; + } + var info = SpriteMorph.prototype.blocks[selector]; + return new ToggleMorph( + 'checkbox', + this, + function () { + myself.toggleWatcher( + selector, + localize(info.spec), + myself.blockColor[info.category] + ); + }, + null, + function () { + return myself.showingWatcher(selector); + }, + null + ); + } + + function variableWatcherToggle(varName, isGlobal) { + return new ToggleMorph( + 'checkbox', + this, + function () { + myself.toggleVariableWatcher(varName, isGlobal); + }, + null, + function () { + return myself.showingVariableWatcher(varName, isGlobal); + }, + null + ); + } + + SnapExtensions.buttons.palette.forEach(buttonDescriptor => { + if (buttonDescriptor.category === category) { + blocks.push(this.customPaletteButton(buttonDescriptor)); + } + }); + + if (category === 'motion') { + + blocks.push(block('forward')); + blocks.push(block('turn')); + blocks.push(block('turnLeft')); + blocks.push('-'); + blocks.push(block('setHeading')); + blocks.push(block('doFaceTowards')); + blocks.push('-'); + blocks.push(block('gotoXY')); + blocks.push(block('doGotoObject')); + blocks.push(block('doGlide')); + blocks.push('-'); + blocks.push(block('changeXPosition')); + blocks.push(block('setXPosition')); + blocks.push(block('changeYPosition')); + blocks.push(block('setYPosition')); + blocks.push('-'); + blocks.push(block('bounceOffEdge')); + blocks.push('-'); + blocks.push(block('getPosition')); + blocks.push(watcherToggle('xPosition')); + blocks.push(block('xPosition', this.inheritsAttribute('x position'))); + blocks.push(watcherToggle('yPosition')); + blocks.push(block('yPosition', this.inheritsAttribute('y position'))); + blocks.push(watcherToggle('direction')); + blocks.push(block('direction', this.inheritsAttribute('direction'))); + + } else if (category === 'looks') { + + blocks.push(block('doSwitchToCostume')); + blocks.push(block('doWearNextCostume')); + blocks.push(watcherToggle('getCostumeIdx')); + blocks.push(block('getCostumeIdx', this.inheritsAttribute('costume #'))); + blocks.push('-'); + blocks.push(block('doSayFor')); + blocks.push(block('bubble')); + blocks.push(block('doThinkFor')); + blocks.push(block('doThink')); + blocks.push('-'); + blocks.push(block('reportGetImageAttribute')); + blocks.push(block('reportNewCostumeStretched')); + blocks.push(block('reportNewCostume')); + blocks.push('-'); + blocks.push(block('changeEffect')); + blocks.push(block('setEffect')); + blocks.push(block('clearEffects')); + blocks.push(block('getEffect')); + blocks.push('-'); + blocks.push(block('changeScale')); + blocks.push(block('setScale')); + blocks.push(watcherToggle('getScale')); + blocks.push(block('getScale', this.inheritsAttribute('size'))); + blocks.push('-'); + blocks.push(block('show')); + blocks.push(block('hide')); + blocks.push(watcherToggle('reportShown')); + blocks.push(block('reportShown', this.inheritsAttribute('shown?'))); + blocks.push('-'); + blocks.push(block('goToLayer')); + blocks.push(block('goBack')); + + // for debugging: /////////////// + if (devMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('log')); + blocks.push(block('alert')); + blocks.push('-'); + blocks.push(block('doScreenshot')); + } + + } else if (category === 'sound') { + + blocks.push(block('playSound')); + blocks.push(block('doPlaySoundUntilDone')); + blocks.push(block('doStopAllSounds')); + blocks.push('-'); + blocks.push(block('doPlaySoundAtRate')); + blocks.push(block('reportGetSoundAttribute')); + blocks.push(block('reportNewSoundFromSamples')); + blocks.push('-'); + blocks.push(block('doRest')); + blocks.push(block('doPlayNote')); + blocks.push(block('doSetInstrument')); + blocks.push('-'); + blocks.push(block('doChangeTempo')); + blocks.push(block('doSetTempo')); + blocks.push(watcherToggle('getTempo')); + blocks.push(block('getTempo')); + blocks.push('-'); + blocks.push(block('changeVolume')); + blocks.push(block('setVolume')); + blocks.push(watcherToggle('getVolume')); + blocks.push(block('getVolume', this.inheritsAttribute('volume'))); + blocks.push('-'); + blocks.push(block('changePan')); + blocks.push(block('setPan')); + blocks.push(watcherToggle('getPan')); + blocks.push(block('getPan', this.inheritsAttribute('balance'))); + blocks.push('-'); + blocks.push(block('playFreq')); + blocks.push(block('stopFreq')); + + // for debugging: /////////////// + if (devMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('doPlayFrequency')); + } + + } else if (category === 'pen') { + + blocks.push(block('clear')); + blocks.push('-'); + blocks.push(block('down')); + blocks.push(block('up')); + blocks.push(watcherToggle('getPenDown')); + blocks.push(block('getPenDown', this.inheritsAttribute('pen down?'))); + blocks.push('-'); + blocks.push(block('setColor')); + blocks.push(block('changePenColorDimension')); + blocks.push(block('setPenColorDimension')); + blocks.push(block('getPenAttribute')); + blocks.push('-'); + blocks.push(block('changeSize')); + blocks.push(block('setSize')); + blocks.push('-'); + blocks.push(block('doStamp')); + blocks.push(block('floodFill')); + blocks.push(block('write')); + blocks.push('-'); + blocks.push(block('reportPenTrailsAsCostume')); + blocks.push('-'); + blocks.push(block('doPasteOn')); + blocks.push(block('doCutFrom')); + + } else if (category === 'control') { + + blocks.push(block('receiveGo')); + blocks.push(block('receiveKey')); + blocks.push(block('receiveInteraction')); + blocks.push(block('receiveCondition')); + blocks.push('-'); + blocks.push(block('receiveMessage')); + blocks.push(block('doBroadcast')); + blocks.push(block('doBroadcastAndWait')); + blocks.push('-'); + blocks.push(block('doWarp')); + blocks.push('-'); + blocks.push(block('doWait')); + blocks.push(block('doWaitUntil')); + blocks.push('-'); + blocks.push(block('doForever')); + blocks.push(block('doRepeat')); + blocks.push(block('doUntil')); + blocks.push(block('doFor')); + blocks.push('-'); + // blocks.push(block('doVariadicIf')); + blocks.push(block('doIf')); + blocks.push(block('doIfElse')); + blocks.push(block('reportIfElse')); + blocks.push('-'); + blocks.push(block('doReport')); + blocks.push(block('doStopThis')); + blocks.push('-'); + blocks.push(block('doRun')); + blocks.push(block('fork')); + blocks.push(block('evaluate')); + blocks.push(block('reportPipe')); + blocks.push('-'); + blocks.push(block('doTellTo')); + blocks.push(block('reportAskFor')); + blocks.push('-'); + blocks.push(block('receiveOnClone')); + blocks.push(block('createClone')); + blocks.push(block('newClone')); + blocks.push(block('removeClone')); + blocks.push('-'); + blocks.push(block('doPauseAll')); + blocks.push(block('doSwitchToScene')); + blocks.push('-'); + blocks.push(block('receiveUserEdit')); + blocks.push(block('doDefineBlock')); + blocks.push(block('doDeleteBlock')); + blocks.push(block('doSetBlockAttribute')); + blocks.push(block('reportBlockAttribute')); + blocks.push(block('reportEnvironment')); + + // for debugging: /////////////// + if (devMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(watcherToggle('getLastMessage')); + blocks.push(block('getLastMessage')); + // deprecated - superseded by reportEnviornment - retained for legacy + blocks.push('-'); + blocks.push(block('doCallCC')); + blocks.push(block('reportCallCC')); + } + + } else if (category === 'sensing') { + + blocks.push(block('reportTouchingObject')); + blocks.push(block('reportTouchingColor')); + blocks.push(block('reportColorIsTouchingColor')); + blocks.push('-'); + blocks.push(block('doAsk')); + blocks.push(watcherToggle('getLastAnswer')); + blocks.push(block('getLastAnswer')); + blocks.push('-'); + blocks.push(block('reportMousePosition')); + blocks.push(watcherToggle('reportMouseX')); + blocks.push(block('reportMouseX')); + blocks.push(watcherToggle('reportMouseY')); + blocks.push(block('reportMouseY')); + blocks.push(block('reportMouseDown')); + blocks.push('-'); + blocks.push(block('reportKeyPressed')); + blocks.push('-'); + blocks.push(block('reportRelationTo')); + blocks.push(block('reportAspect')); + blocks.push('-'); + blocks.push(block('doResetTimer')); + blocks.push(watcherToggle('getTimer')); + blocks.push(block('getTimer')); + blocks.push(block('reportDate')); + blocks.push('-'); + blocks.push(block('reportAttributeOf')); + + if (SpriteMorph.prototype.enableFirstClass) { + blocks.push(block('reportGet')); + } + + blocks.push(block('reportObject')); + blocks.push('-'); + blocks.push(block('reportURL')); + blocks.push(block('reportAudio')); + blocks.push(block('reportVideo')); + blocks.push(block('doSetVideoTransparency')); + blocks.push('-'); + blocks.push(block('reportGlobalFlag')); + blocks.push(block('doSetGlobalFlag')); + + // for debugging: /////////////// + if (devMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(watcherToggle('reportThreadCount')); + blocks.push(block('reportThreadCount')); + blocks.push(block('reportStackSize')); + blocks.push(block('reportFrameCount')); + blocks.push(block('reportYieldCount')); + } + } else if (category === 'operators') { + + blocks.push(block('reifyScript')); + blocks.push(block('reifyReporter')); + blocks.push(block('reifyPredicate')); + blocks.push('#'); + blocks.push('-'); + blocks.push(block('reportVariadicSum')); + blocks.push(block('reportDifference')); + blocks.push(block('reportVariadicProduct')); + blocks.push(block('reportQuotient')); + blocks.push(block('reportPower')); + blocks.push('-'); + blocks.push(block('reportModulus')); + blocks.push(block('reportVariadicMin')); + blocks.push(block('reportVariadicMax')); + blocks.push('-'); + blocks.push(block('reportRound')); + blocks.push(block('reportMonadic')); + blocks.push(block('reportAtan2')); + blocks.push(block('reportRandom')); + blocks.push('-'); + blocks.push(block('reportVariadicLessThan')); + blocks.push(block('reportVariadicEquals')); + blocks.push(block('reportVariadicGreaterThan')); + blocks.push('-'); + blocks.push(block('reportVariadicAnd')); + blocks.push(block('reportVariadicOr')); + blocks.push(block('reportNot')); + blocks.push(block('reportBoolean')); + blocks.push('-'); + blocks.push(block('reportJoinWords')); + blocks.push(block('reportTextSplit')); + blocks.push(block('reportLetter')); + blocks.push(block('reportTextAttribute')); + blocks.push('-'); + blocks.push(block('reportUnicode')); + blocks.push(block('reportUnicodeAsLetter')); + blocks.push('-'); + blocks.push(block('reportIsA')); + blocks.push(block('reportVariadicIsIdentical')); + + if (Process.prototype.enableJS) { + blocks.push('-'); + blocks.push(block('reportJSFunction')); + if (Process.prototype.enableCompiling) { + blocks.push(block('reportCompiled')); + } + } + // for debugging: /////////////// + if (devMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('reportTypeOf')); + blocks.push(block('reportTextFunction')); + } + + } else if (category === 'variables') { + + blocks.push(this.makeVariableButton()); + if (this.deletableVariableNames().length > 0) { + blocks.push(this.deleteVariableButton()); + } + blocks.push('-'); + + varNames = this.allGlobalVariableNames(true, all); + if (varNames.length > 0) { + varNames.forEach(name => { + blocks.push(variableWatcherToggle(name, true)); + blocks.push(variableBlock(name)); + }); + blocks.push('-'); + } + + varNames = this.allLocalVariableNames(true, all); + if (varNames.length > 0) { + varNames.forEach(name => { + blocks.push(variableWatcherToggle(name)); + blocks.push(variableBlock(name, true)); + }); + blocks.push('-'); + } + + blocks.push(block('doSetVar')); + blocks.push(block('doChangeVar')); + blocks.push(block('doShowVar')); + blocks.push(block('doHideVar')); + blocks.push(block('doDeclareVariables')); + + // inheritance: + + if (StageMorph.prototype.enableInheritance) { + blocks.push('-'); + blocks.push(block('doDeleteAttr')); + } + + blocks.push('='); + blocks.push(block('reportNewList')); + blocks.push(block('reportNumbers')); + blocks.push('-'); + blocks.push(block('reportCONS')); + blocks.push(block('reportListItem')); + blocks.push(block('reportCDR')); + blocks.push('-'); + blocks.push(block('reportListAttribute')); + blocks.push(block('reportListIndex')); + blocks.push(block('reportListContainsItem')); + blocks.push(block('reportListIsEmpty')); + blocks.push('-'); + blocks.push(block('reportMap')); + blocks.push(block('reportKeep')); + blocks.push(block('reportFindFirst')); + blocks.push(block('reportCombine')); + blocks.push('-'); + blocks.push(block('doForEach')); + blocks.push('-'); + blocks.push(block('doAddToList')); + blocks.push(block('doDeleteFromList')); + blocks.push(block('doInsertInList')); + blocks.push(block('doReplaceInList')); + blocks.push('-'); + blocks.push(block('reportConcatenatedLists')); + blocks.push(block('reportReshape')); + blocks.push(block('reportCrossproduct')); + + if (SpriteMorph.prototype.showingExtensions) { + blocks.push('='); + blocks.push(block('doApplyExtension')); + blocks.push(block('reportApplyExtension')); + } + + if (StageMorph.prototype.enableCodeMapping) { + blocks.push('='); + blocks.push(block('doMapCodeOrHeader')); + blocks.push(block('doMapValueCode')); + blocks.push(block('doMapListCode')); + blocks.push('-'); + blocks.push(block('reportMappedCode')); + } + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('doShowTable')); + } + } + + return blocks; +}; + +// Utitlies displayed in the palette +SpriteMorph.prototype.makeVariableButton = function () { + var button, myself = this; + + function addVar(pair) { + var ide; + if (pair) { + ide = myself.parentThatIsA(IDE_Morph); + myself.addVariable(pair[0], pair[1]); + myself.toggleVariableWatcher(pair[0], pair[1]); + ide.flushBlocksCache('variables'); // b/c of inheritance + ide.refreshPalette(); + myself.recordUserEdit( + 'palette', + 'variable', + pair[1] ? 'global' : 'local', + 'new', + pair[0] + ); + } + } + + button = new PushButtonMorph( + null, + function () { + new VariableDialogMorph( + null, + addVar, + myself + ).prompt( + 'Variable name', + null, + myself.world() + ); + }, + 'Make a variable' + ); + button.userMenu = this.helpMenu; + button.selector = 'addVariable'; + button.showHelp = BlockMorph.prototype.showHelp; + return button; +}; + +SpriteMorph.prototype.deleteVariableButton = function () { + var button, myself = this; + button = new PushButtonMorph( + null, + function () { + var menu = new MenuMorph( + (vn) => myself.deleteVariable(vn), + null, + myself + ); + myself.deletableVariableNames().forEach(name => + menu.addItem( + name, + name, + null, + null, + null, + null, + null, + null, + true // verbatim - don't translate + ) + ); + menu.popUpAtHand(myself.world()); + }, + 'Delete a variable' + ); + button.userMenu = this.helpMenu; + button.selector = 'deleteVariable'; + button.showHelp = BlockMorph.prototype.showHelp; + return button; +}; + +SpriteMorph.prototype.categoryText = function (category) { + var txt = new StringMorph( + localize(category[0].toUpperCase().concat(category.slice(1))), + 11, + null, + true + ); + txt.setColor(this.paletteTextColor); + txt.category = category; + return txt; +}; + +SpriteMorph.prototype.devModeText = function () { + var txt = new TextMorph( + localize('development mode \ndebugging primitives:') + ); + txt.fontSize = 9; + txt.setColor(this.paletteTextColor); + return txt; +}; + +SpriteMorph.prototype.helpMenu = function () { + // return a 1 item context menu for anything that implements + // a 'showHelp' method. + var menu = new MenuMorph(this); + menu.addItem('help...', 'showHelp'); + return menu; +}; + +SpriteMorph.prototype.customBlockTemplatesForCategory = function ( + category, + includeHidden +) { + // returns an array of block templates for a selected category. + var ide = this.parentThatIsA(IDE_Morph), blocks = [], + isInherited = false, block, inheritedBlocks; + + function addCustomBlock(definition) { + if ((!definition.isHelper || includeHidden) && + definition.category === category) + { + block = definition.templateInstance(); + if (isInherited) {block.ghost(); } + blocks.push(block); + } + } + + // global custom blocks: + if (ide && ide.stage) { + ide.stage.globalBlocks.forEach(addCustomBlock); + if (this.customBlocks.length) {blocks.push('='); } + } + + // local custom blocks: + this.customBlocks.forEach(addCustomBlock); + + // inherited custom blocks: + if (this.exemplar) { + inheritedBlocks = this.inheritedBlocks(true); + if (this.customBlocks.length && inheritedBlocks.length) { + blocks.push('='); + } + isInherited = true; + inheritedBlocks.forEach(addCustomBlock); + } + + return blocks; +}; + +SpriteMorph.prototype.makeBlockButton = function (category) { + // answer a button that prompts the user to make a new block + var button = new PushButtonMorph( + this, + 'makeBlock', + 'Make a block' + ); + + button.userMenu = this.helpMenu; + button.selector = 'addCustomBlock'; + button.showHelp = BlockMorph.prototype.showHelp; + return button; +}; + +SpriteMorph.prototype.customPaletteButton = function (descriptor) { + // buttons added by extensions (read the docs in extensions.js) + var button = new PushButtonMorph( + this, + descriptor.action, + descriptor.label, + null, + descriptor.hint + ); + button.hideable = descriptor.hideable; + return button; +}; + +SpriteMorph.prototype.makeBlock = function () { + // prompt the user to make a new block + var ide = this.parentThatIsA(IDE_Morph), + stage = this.parentThatIsA(StageMorph), + category = ide.currentCategory === 'unified' ? + ide.topVisibleCategoryInPalette() + : ide.currentCategory, + clr = SpriteMorph.prototype.blockColorFor(category), + dlg; + dlg = new BlockDialogMorph( + null, + definition => { + if (definition.spec !== '') { + if (definition.isGlobal) { + stage.globalBlocks.push(definition); + } else { + this.customBlocks.push(definition); + } + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + this.recordUserEdit( + 'palette', + 'custom block', + definition.isGlobal ? 'global' : 'local', + 'new', + definition.abstractBlockSpec() + ); + new BlockEditorMorph(definition, this).popUp(); + } + }, + this + ); + if (category !== 'variables' || category !== 'unified') { + dlg.category = category; + dlg.categories.refresh(); + dlg.types.children.forEach(each => { + each.setColor(clr); + each.refresh(); + }); + } + dlg.prompt( + 'Make a block', + null, + this.world() + ); +}; + +SpriteMorph.prototype.getPrimitiveTemplates = function (category) { + var blocks = this.primitivesCache[category]; + if (!blocks) { + blocks = this.blockTemplates(category); + if (this.isCachingPrimitives) { + this.primitivesCache[category] = blocks; + } + } + return blocks; +}; + +SpriteMorph.prototype.palette = function (category) { + if (!this.paletteCache[category]) { + this.paletteCache[category] = this.freshPalette(category); + } + return this.paletteCache[category]; +}; + +SpriteMorph.prototype.freshPalette = function (category) { + var myself = this, + palette = new ScrollFrameMorph(null, null, this.sliderColor), + unit = SyntaxElementMorph.prototype.fontSize, + ide = this.parentThatIsA(IDE_Morph), + showCategories, + showButtons, + x = 0, + y = 5, + ry = 0, + blocks, + hideNextSpace = false, + shade = new Color(140, 140, 140), + searchButton, + makeButton; + + palette.owner = this; + palette.padding = unit / 2; + palette.color = this.paletteColor; + palette.growth = new Point(0, MorphicPreferences.scrollBarSize); + + // toolbar: + + palette.toolBar = new AlignmentMorph('column'); + + searchButton = new PushButtonMorph( + this, + "searchBlocks", + new SymbolMorph("magnifierOutline", 16) + ); + searchButton.alpha = 0.2; + searchButton.padding = 1; + searchButton.hint = localize('find blocks') + '...'; + searchButton.labelShadowColor = shade; + searchButton.edge = 0; + searchButton.padding = 3; + searchButton.fixLayout(); + palette.toolBar.add(searchButton); + + if (!ide || !ide.config.noOwnBlocks) { + makeButton = new PushButtonMorph( + this, + "makeBlock", + new SymbolMorph("cross", 16) + ); + makeButton.alpha = 0.2; + makeButton.padding = 1; + makeButton.hint = localize('Make a block') + '...'; + makeButton.labelShadowColor = shade; + makeButton.edge = 0; + makeButton.padding = 3; + makeButton.fixLayout(); + palette.toolBar.add(makeButton); + } + + palette.toolBar.fixLayout(); + palette.add(palette.toolBar); + + // menu: + palette.userMenu = function () { + var menu = new MenuMorph(); + ide = ide || this.parentThatIsA(IDE_Morph); + + menu.addPair( + [ + new SymbolMorph( + 'magnifyingGlass', + MorphicPreferences.menuFontSize + ), + localize('find blocks') + '...' + ], + () => myself.searchBlocks(), + '^F' + ); + if (!ide.config.noOwnBlocks) { + menu.addItem( + 'hide blocks...', + () => new BlockVisibilityDialogMorph(myself).popUp( + myself.world()) + ); + menu.addLine(); + menu.addItem( + 'make a category...', + () => this.parentThatIsA(IDE_Morph).createNewCategory() + ); + if (SpriteMorph.prototype.customCategories.size) { + menu.addItem( + 'delete a category...', + () => this.parentThatIsA(IDE_Morph).deleteUserCategory() + ); + } + } + return menu; + }; + + if (category === 'unified') { + // In a Unified Palette custom blocks appear following each category, + // but there is only 1 make a block button (at the end). + ide = ide || this.parentThatIsA(IDE_Morph); + showCategories = ide.scene.showCategories; + showButtons = ide.scene.showPaletteButtons; + blocks = SpriteMorph.prototype.allCategories().reduce( + (blocks, category) => { + let header = [this.categoryText(category), '-'], + primitives = this.getPrimitiveTemplates(category), + customs = this.customBlockTemplatesForCategory(category), + showHeader = showCategories && + !['lists', 'other'].includes(category) && + (primitives.some(item => + item instanceof BlockMorph) || customs.length); + + // hide category names + if (!showCategories && category !== 'variables') { + primitives = primitives.filter(each => + each !== '-' && + each !== '=' && + (each && !each.hideWithCategory)); + } + + // hide "make / delete a variable" buttons + if (!showButtons && category === 'variables') { + primitives = primitives.filter(each => + !((each instanceof PushButtonMorph && each.hideable) && + !(each instanceof ToggleMorph))); + } + + return blocks.concat( + showHeader ? header : [], + primitives, + showHeader ? '=' : null, + customs, + showHeader ? '=' : '-' + ); + }, + [] + ); + } else { + // ensure we do not modify the cached array + blocks = this.getPrimitiveTemplates(category).slice(); + } + + if (category !== 'unified' || showButtons) { + ide = ide || this.parentThatIsA(IDE_Morph); + if (!ide || !ide.config.noOwnBlocks) { + blocks.push('='); + blocks.push(this.makeBlockButton(category)); + } + } + + if (category !== 'unified') { + blocks.push('='); + blocks.push(...this.customBlockTemplatesForCategory(category)); + } + if (category === 'variables') { + blocks.push(...this.customBlockTemplatesForCategory('lists')); + blocks.push(...this.customBlockTemplatesForCategory('other')); + } + + blocks.forEach(block => { + if (block === null) { + return; + } + if (block === '-') { + if (hideNextSpace) {return; } + y += unit * 0.8; + hideNextSpace = true; + } else if (block === '=') { + if (hideNextSpace) {return; } + y += unit * 1.6; + hideNextSpace = true; + } else if (block === '#') { + x = 0; + y = (ry === 0 ? y : ry); + } else { + hideNextSpace = false; + if (x === 0) { + y += unit * 0.3; + } + block.setPosition(new Point(x, y)); + palette.addContents(block); + if (block instanceof ToggleMorph) { + x = block.right() + unit / 2; + } else if (block instanceof RingMorph) { + x = block.right() + unit / 2; + ry = block.bottom(); + } else { + x = 0; + y += block.height(); + } + } + }); + + palette.scrollX(palette.padding); + palette.scrollY(palette.padding); + return palette; +}; + +// SpriteMorph utilities for showing & hiding blocks in the palette + +SpriteMorph.prototype.allPaletteBlocks = function () { + // private - only to be used for showing & hiding blocks in the palette + var blocks = SpriteMorph.prototype.allCategories().reduce( + (blocks, category) => { + let primitives = this.blockTemplates(category, true), + customs = this.customBlockTemplatesForCategory(category, true); + return blocks.concat( + primitives, + customs + ); + }, + [] + ); + return blocks.filter(each => each instanceof BlockMorph); +}; + +SpriteMorph.prototype.isHidingBlock = function (aBlock) { + var frame; + if (aBlock.isCustomBlock) { + return ( + aBlock.isGlobal ? aBlock.definition + : this.getMethod(aBlock.semanticSpec) + ).isHelper; + } + if (aBlock.selector === 'reportGetVar') { + frame = this.variables.silentFind(aBlock.blockSpec); + if (!frame) { + return false; + } + return frame.vars[aBlock.blockSpec].isHidden; + } + return StageMorph.prototype.hiddenPrimitives[aBlock.selector] === true; +}; + +SpriteMorph.prototype.isDisablingBlock = function (aBlock) { + // show or hide certain kinds of blocks in search results only + // if they are enabled + var sel = aBlock.selector; + if (sel === 'reportJSFunction') { + return !Process.prototype.enableJS; + } + if ( + sel === 'doApplyExtension' || + sel === 'reportApplyExtension' + ) { + return !SpriteMorph.prototype.showingExtensions; + } + if ( + sel === 'doMapCodeOrHeader' || + sel === 'doMapValueCode' || + sel === 'doMapListCode' || + sel === 'reportMappedCode' + ) { + return !StageMorph.prototype.enableCodeMapping; + } + return false; +}; + +SpriteMorph.prototype.changeBlockVisibility = function (aBlock, hideIt, quick) { + var ide = this.parentThatIsA(IDE_Morph), + dict, cat; + if (aBlock.isCustomBlock) { + (aBlock.isGlobal ? aBlock.definition + : this.getMethod(aBlock.semanticSpec) + ).isHelper = !!hideIt; + } else if (aBlock.selector === 'reportGetVar') { + this.variables.find( + aBlock.blockSpec + ).vars[aBlock.blockSpec].isHidden = !!hideIt; + } else { + if (hideIt) { + StageMorph.prototype.hiddenPrimitives[aBlock.selector] = true; + } else { + delete StageMorph.prototype.hiddenPrimitives[aBlock.selector]; + } + } + if (quick) { + this.recordUserEdit( + 'palette', + hideIt ? 'hide' : 'show', + aBlock.abstractBlockSpec() + ); + return; + } + dict = { + doWarp: 'control', + reifyScript: 'operators', + reifyReporter: 'operators', + reifyPredicate: 'operators', + doDeclareVariables: 'variables' + }; + cat = dict[aBlock.selector] || aBlock.category; + if (cat === 'lists') {cat = 'variables'; } + ide.flushBlocksCache(cat); + ide.refreshPalette(); + this.recordUserEdit( + 'palette', + hideIt ? 'hide' : 'show', + aBlock.abstractBlockSpec() + ); +}; + +SpriteMorph.prototype.emptyCategories = function () { + // return a dictionary that indicates for each category whether + // it has any shown blocks in it (true) or is empty (false) + var hasBlocks = (any) => any instanceof BlockMorph && + !this.isHidingBlock(any); + if (this.categoriesCache === null) { + this.categoriesCache = {}; + SpriteMorph.prototype.allCategories().forEach(category => + this.categoriesCache[category] = + this.getPrimitiveTemplates(category).some(hasBlocks) || + this.customBlockTemplatesForCategory(category).some(hasBlocks)); + } + return this.categoriesCache; +}; + +SpriteMorph.prototype.hasPrimitiveCategories = function () { + // - currently unused - + // answer if at least one category of primitive blocks is + // showing at least one block in the palette, else + // in which case the pane with primitive categories can be + // hidden altogether + var cache = this.emptyCategories(); + return this.categories.some(prim => cache[prim]); +}; + +// SpriteMorph blocks searching + +SpriteMorph.prototype.blocksMatching = function ( + searchString, + strictly, + types, // optional, ['hat', 'command', 'reporter', 'predicate'] + varNames // optional, list of reachable unique variable names +) { + // answer an array of block templates whose spec contains + // the given search string, ordered by descending relevance + // types is an optional array containing block types the search + // is limited to, e.g. "command", "hat", "reporter", "predicate". + // Note that "predicate" is not subsumed by "reporter" and has + // to be specified explicitly. + // if no types are specified all blocks are searched + var blocks = [], + blocksDict, + search = searchString.toLowerCase(), + stage = this.parentThatIsA(StageMorph), + reporterized; + + if (!types || !types.length) { + types = ['hat', 'command', 'reporter', 'predicate', 'ring']; + } + if (!varNames) {varNames = []; } + + function labelOf(aBlockSpec) { + var words = (BlockMorph.prototype.parseSpec(aBlockSpec)), + filtered = words.filter(each => + each.indexOf('%') !== 0 || each.length === 1 + ), + slots = words.filter(each => + each.length > 1 && each.indexOf('%') === 0 + ).map(spec => moreTextIn(spec)); + return filtered.join(' ') + ' ' + slots.join(' '); + } + + function moreTextIn(aSlotSpec) { + var info = BlockMorph.prototype.labelParts[aSlotSpec] || {}, + menu = info.menu, + more; + if (menu) { + if (isString(menu)) { + menu = InputSlotMorph.prototype[menu](true); + } + more = Object.values(menu).map(entry => { + if (isNil(entry)) {return ''; } + if (entry instanceof Array) { + return localize(entry[0]); + } + return entry.toString(); + }).join(' '); + } + return [ + more || '', + localize(info.infix || ''), + localize(info.collapse || '') + ].join(' '); + } + + function fillDigits(anInt, totalDigits, fillChar) { + var ans = String(anInt); + while (ans.length < totalDigits) {ans = fillChar + ans; } + return ans; + } + + function relevance(aBlockLabel, aSearchString) { + var lbl = ' ' + aBlockLabel.toLowerCase(), + idx = lbl.indexOf(aSearchString), + atWord; + if (idx === -1) {return -1; } + atWord = (lbl.charAt(idx - 1) === ' '); + if (strictly && !atWord) {return -1; } + return (atWord ? '1' : '2') + fillDigits(idx, 4, '0'); + } + + function primitive(selector) { + var newBlock = SpriteMorph.prototype.blockForSelector(selector, true); + newBlock.isTemplate = true; + return newBlock; + } + + // variable getters + varNames.forEach(vName => { + var rel = relevance(vName, search); + if (rel !== -1) { + blocks.push([this.variableBlock(vName), rel + '1']); + } + }); + // custom blocks + [this.customBlocks, stage.globalBlocks].forEach(blocksList => + blocksList.forEach(definition => { + if (contains(types, definition.type)) { + var spec = definition.localizedSpec(), + rel = relevance(labelOf( + spec) + ' ' + definition.menuSearchWords(), + search + ); + if (rel !== -1) { + blocks.push([definition.templateInstance(), rel + '2']); + } + } + }) + ); + // primitives + blocksDict = SpriteMorph.prototype.blocks; + Object.keys(blocksDict).forEach(selector => { + if (!StageMorph.prototype.hiddenPrimitives[selector] && + contains(types, blocksDict[selector].type)) { + var block = blocksDict[selector], + spec = BlockMorph.prototype.localizeBlockSpec(block.spec), + rel = relevance(labelOf(spec), search); + if (rel === -1 && block.alias) { + rel = relevance(block.alias, search); + } + if ( + (rel !== -1) && + (!block.dev) && + (!block.only || (block.only === this.constructor)) + ) { + blocks.push([primitive(selector), rel + '3']); + } + } + }); + // infix arithmetic expression + if (contains(types, 'reporter')) { + reporterized = this.reporterize(searchString); + if (reporterized) { + // reporterized.isTemplate = true; + // reporterized.isDraggable = false; + blocks.push([reporterized, '']); + } + } + blocks.sort((x, y) => x[1] < y[1] ? -1 : 1); + blocks = blocks.map(each => each[0]); + return blocks.filter(each => + !this.isHidingBlock(each) && + !this.isDisablingBlock(each) + ); +}; + +SpriteMorph.prototype.searchBlocks = function ( + searchString, + types, + varNames, + scriptFocus +) { + var myself = this, + unit = SyntaxElementMorph.prototype.fontSize, + ide = this.parentThatIsA(IDE_Morph), + oldTop = ide.palette.contents.top(), + oldSearch = '', + searchBar = new InputFieldMorph(searchString || ''), + searchPane = ide.createPalette('forSearch'), + blocksList = [], + selection, + focus; + + function showSelection() { + if (focus) {focus.destroy(); } + if (!selection || !scriptFocus) {return; } + focus = selection.outline( + MorphicPreferences.isFlat ? new Color(150, 200, 255) : WHITE, + 2 + ); + searchPane.contents.add(focus); + focus.scrollIntoView(); + } + + function show(blocks) { + var x = searchPane.contents.left() + 5, + y = (searchBar.bottom() + unit); + blocksList = blocks; + selection = null; + if (blocks.length && scriptFocus) { + selection = blocks[0]; + } + searchPane.contents.children = [searchPane.contents.children[0]]; + blocks.forEach(block => { + block.setPosition(new Point(x, y)); + searchPane.addContents(block); + y += block.height(); + y += unit * 0.3; + }); + showSelection(); + searchPane.changed(); + } + + searchPane.owner = this; + searchPane.color = this.paletteColor; + searchPane.contents.color = this.paletteColor; + searchPane.addContents(searchBar); + searchBar.setWidth(ide.logo.width() - 30); + searchBar.contrast = 90; + searchBar.setPosition( + searchPane.contents.topLeft().add(new Point(10, 10)) + ); + searchBar.fixLayout(); + + searchPane.accept = function () { + var search; + if (scriptFocus) { + searchBar.cancel(); + if (selection) { + scriptFocus.insertBlock(selection); + } + myself.recordUserEdit( + 'scripts', + 'block', + 'insert', + selection instanceof BlockMorph ? + selection.abstractBlockSpec() + : '' + ); + } else { + search = searchBar.getValue(); + if (search.length > 0) { + show(myself.blocksMatching(search)); + } + } + }; + + searchPane.reactToKeystroke = function (evt) { + var idx, code = evt ? evt.keyCode : 0; + switch (code) { + case 38: // up arrow + if (!scriptFocus || !selection) {return; } + idx = blocksList.indexOf(selection) - 1; + if (idx < 0) { + idx = blocksList.length - 1; + } + selection = blocksList[idx]; + showSelection(); + return; + case 40: // down arrow + if (!scriptFocus || !selection) {return; } + idx = blocksList.indexOf(selection) + 1; + if (idx >= blocksList.length) { + idx = 0; + } + selection = blocksList[idx]; + showSelection(); + return; + default: + nop(); + } + }; + + searchPane.reactToInput = function (evt) { + var search = searchBar.getValue(); + if (search !== oldSearch) { + oldSearch = search; + show(myself.blocksMatching( + search, + search.length < 2, + types, + varNames + )); + } + }; + + searchBar.cancel = function () { + ide.refreshPalette(); + ide.palette.contents.setTop(oldTop); + ide.palette.adjustScrollBars(); + }; + + ide.fixLayout('refreshPalette'); + searchBar.edit(); + if (searchString) {searchPane.reactToKeystroke(); } +}; + +// SpritMorph parsing simple arithmetic expressions to reporter blocks + +SpriteMorph.prototype.reporterize = function (expressionString) { + // highly experimental Christmas Easter Egg 2016 :-) + var ast; + + function parseInfix(expression, operator, already) { + // very basic dyadic infix parser for arithmetic expressions + // with strict left-to-right operator precedence (as in Smalltalk) + // which can be overriden by - nested - parentheses. + // assumes well-formed expressions, no graceful error handling yet. + + var inputs = ['', ''], + idx = 0, + ch; + + function format(value) { + return value instanceof Array || isNaN(+value) ? value : +value; + } + + function nested() { + var level = 1, + expr = ''; + while (idx < expression.length) { + ch = expression[idx]; + idx += 1; + switch (ch) { + case '(': + level += 1; + break; + case ')': + level -= 1; + if (!level) { + return expr; + } + break; + } + expr += ch; + } + } + + while (idx < expression.length) { + ch = expression[idx]; + idx += 1; + switch (ch) { + case ' ': + break; + case '(': + if (inputs[operator ? 1 : 0].length) { + inputs[operator ? 1 : 0] = [ + inputs[operator ? 1 : 0], + parseInfix(nested()) + ]; + } else { + inputs[operator ? 1 : 0] = parseInfix(nested()); + } + break; + case '-': + case '+': + case '*': + case '/': + case '%': + case '^': + case '=': + case '<': + case '>': + case '&': + case '|': + if (!operator && !inputs[0].length) { + inputs[0] = ch; + } else if (operator) { + if (!inputs[1].length) { + inputs[1] = ch; + } else { + return parseInfix( + expression.slice(idx), + ch, + [operator, already, format(inputs[1])] + ); + } + } else { + operator = ch; + already = format(inputs[0]); + } + break; + default: + inputs[operator ? 1 : 0] += ch; + } + } + if (operator) { + return [operator, already, format(inputs[1])]; + } + return format(inputs[0]); + } + + function blockFromAST(ast) { + var block, target, selectors, monads, alias, key, sel, i, inps, + off = 1, + reverseDict = {}; + selectors = { + '+': 'reportVariadicSum', + '-': 'reportDifference', + '*': 'reportVariadicProduct', + '/': 'reportQuotient', + '%': 'reportModulus', + '^': 'reportPower', + '=': 'reportVariadicEquals', + '<': 'reportVariadicLessThan', + '>': 'reportVariadicGreaterThan', + '&': 'reportVariadicAnd', + '|': 'reportVariadicOr', + round: 'reportRound', + not: 'reportNot' + }; + monads = ['abs', 'neg', 'ceiling', 'floor', 'sqrt', 'sin', 'cos', + 'tan', 'asin', 'acos', 'atan', 'ln', 'log', 'lg', 'id', 'round', + 'not']; + alias = { + ceil: 'ceiling', + '!' : 'not' + }; + monads.concat(['true', 'false']).forEach(word => + reverseDict[localize(word).toLowerCase()] = word + ); + key = alias[ast[0]] || reverseDict[ast[0].toLowerCase()] || ast[0]; + if (contains(monads, key)) { // monadic + sel = selectors[key]; + if (sel) { // single input + block = SpriteMorph.prototype.blockForSelector(sel); + inps = block.inputs(); + } else { // two inputs, first is function name + block = SpriteMorph.prototype.blockForSelector('reportMonadic'); + inps = block.inputs(); + inps[0].setContents([key]); + off = 0; + } + target = block; + } else { // dyadic + block = SpriteMorph.prototype.blockForSelector(selectors[key]); + target = block; + inps = block.inputs(); + if (inps[0] instanceof MultiArgMorph) { // infix sum or product + target = inps[0]; + inps = target.inputs(); + } + } + for (i = 1; i < ast.length; i += 1) { + if (ast[i] instanceof Array) { + target.replaceInput(inps[i - off], blockFromAST(ast[i])); + } else if (isString(ast[i])) { + if (contains( + ['true', 'false'], reverseDict[ast[i]] || ast[i]) + ) { + target.replaceInput( + inps[i - off], + SpriteMorph.prototype.blockForSelector( + (reverseDict[ast[i]] || ast[i]) === 'true' ? + 'reportTrue' : 'reportFalse' + ) + ); + } else if (ast[i] !== '_') { + target.replaceInput( + inps[i - off], + SpriteMorph.prototype.variableBlock(ast[i]) + ); + } + } else { // number + inps[i - off].setContents(ast[i]); + } + } + target.fixLayout(); + block.isDraggable = true; + block.fixLayout(); + block.fixBlockColor(null, true); + return block; + } + + if (expressionString.length > 100) {return null; } + try { + ast = parseInfix(expressionString); + return ast instanceof Array ? blockFromAST(ast) : null; + } catch (error) { + return null; + } +}; + +// SpriteMorph variable management + +SpriteMorph.prototype.addVariable = function (name, isGlobal) { + var ide = this.parentThatIsA(IDE_Morph); + if (isGlobal) { + this.globalVariables().addVar(name); + if (ide) { + ide.flushBlocksCache('variables'); + } + } else { + this.variables.addVar(name); + this.primitivesCache.variables = null; + } +}; + +SpriteMorph.prototype.deleteVariable = function (varName, isGlobal) { + var ide = this.parentThatIsA(IDE_Morph); + if (isGlobal) { + this.deleteVariableWatcher(varName, true); + this.globalVariables().deleteVar(varName); + } else { + if (!contains(this.inheritedVariableNames(true), varName)) { + // check only shadowed variables + this.deleteVariableWatcher(varName); + } + this.variables.deleteVar(varName); + } + if (ide) { + ide.flushBlocksCache('variables'); // b/c the var could be global + ide.refreshPalette(); + this.recordUserEdit( + 'palette', + 'variable', + isGlobal ? 'global' : 'local', + 'delete', + varName + ); + } +}; + +SpriteMorph.prototype.renameVariable = function ( + oldName, + newName, + isGlobal, + everywhere // bool - including in all scripts & custom block definitions +) { + var stage = this.parentThatIsA(StageMorph), + ide = stage.parentThatIsA(IDE_Morph), + oldWatcher = this.findVariableWatcher(oldName, isGlobal), + scope = isGlobal ? this.globalVariables() : this.variables, + container, newWatcher, targets; + + function renameVariableInCustomBlock(definition) { + definition.scripts.forEach(eachScript => + eachScript.refactorVariable(oldName, newName) + ); + if (definition.body) { + definition.body.expression.refactorVariable( + oldName, + newName + ); + } + } + + if (contains(scope.names(), newName)) { + ide.inform( + 'Variable exists', + 'A variable with this name already exists.' + ); + return false; + + } + container = scope.vars[oldName]; + this.deleteVariable(oldName, isGlobal); + scope.vars[newName] = container; + + if (oldWatcher && oldWatcher.isVisible) { + newWatcher = this.toggleVariableWatcher(newName, isGlobal); + newWatcher.setPosition(oldWatcher.position()); + } + + if (everywhere) { + targets = isGlobal ? + ide.sprites.itemsArray().concat([stage]).filter(sprite => + !contains(sprite.variables.names(), newName)) + : [this]; + + targets.forEach(sprite => { + // in scripts + sprite.scripts.children.forEach(morph => { + if (morph instanceof BlockMorph) { + morph.refactorVariable(oldName, newName); + } + }); + + // in local custom block definitions + sprite.customBlocks.forEach(eachBlock => + renameVariableInCustomBlock(eachBlock) + ); + }); + + // in global custom block definitions + if (isGlobal) { + stage.globalBlocks.forEach(eachBlock => + renameVariableInCustomBlock(eachBlock) + ); + } + + // in currently open block editors + this.world().children.forEach(morph => { + if (morph instanceof BlockEditorMorph) { + morph.body.contents.children.forEach(morph => { + if (morph instanceof BlockMorph) { + morph.refactorVariable(oldName, newName); + } + }); + } + }); + } + + ide.flushBlocksCache('variables'); + ide.refreshPalette(); + this.recordUserEdit( + 'palette', + 'variable', + isGlobal ? 'global' : 'local', + 'rename', + everywhere ? 'all' : 'once', + oldName, + newName + ); + return true; // success +}; + +SpriteMorph.prototype.flashScope = function (varName, isGlobal) { + var scope = this.visibleScopeFor(varName, isGlobal), + clr = SyntaxElementMorph.prototype.activeHighlight.darker(); + scope.flat().forEach(elem => elem.flash(clr)); +}; + +SpriteMorph.prototype.unflashScope = function (varName, isGlobal) { + var scope = this.visibleScopeFor(varName, isGlobal); + scope.flat().forEach(elem => elem.unflash()); +}; + +SpriteMorph.prototype.visibleScopeFor = function (varName, isGlobal) { + // private - answer an array of all my syntax elements within the lexical + // scope of a given variable name, so they can be highlighted in the IDE. + // Note: This is optimized to only answer the *visible* blocks, if you + // want to get the full collection of affected elements use + // Block >> fullScopeFor(varName) instead. + + var elements = []; + + if (isGlobal && contains(this.variables.names(), varName)) { + return elements; + } + + // in scripts + this.scripts.children.forEach(morph => { + if (morph instanceof BlockMorph) { + elements.push(morph.fullScopeFor(varName)); + } + }); + + // in currently open block editors + this.world().children.forEach(morph => { + if (morph instanceof BlockEditorMorph) { + morph.body.contents.children.forEach(morph => { + if (morph instanceof BlockMorph) { + elements.push(morph.fullScopeFor(varName)); + } + }); + } + }); + + return elements.flat(); +}; + +// SpriteMorph costume management + +SpriteMorph.prototype.addCostume = function (costume) { + if (!costume.name) { + costume.name = this.newCostumeName(localize('costume')); + } + this.shadowAttribute('costumes'); + this.costumes.add(costume); + this.recordUserEdit( + 'costume', + 'add', + costume.name + ); +}; + +SpriteMorph.prototype.wearCostume = function (costume, noShadow) { + var x = this.xPosition ? this.xPosition() : null, + y = this.yPosition ? this.yPosition() : null, + idx = isNil(costume) ? null : this.costumes.asArray().indexOf(costume); + + this.changed(); + this.costume = costume; + this.fixLayout(); + this.rerender(); + if (x !== null) { + this.silentGotoXY(x, y, true); // just me + } + if (this.positionTalkBubble) { // the stage doesn't talk + this.positionTalkBubble(); + } + this.version = Date.now(); + + // propagate to children that inherit my costume # + if (!noShadow) { + this.shadowAttribute('costume #'); + } + this.specimens().forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('costume #')) { + if (idx === null) { + instance.wearCostume(null, true); + } else if (idx === -1) { + instance.wearCostume(costume, true); + } else { + instance.doSwitchToCostume(idx + 1, true); + } + } + } + }); +}; + +SpriteMorph.prototype.getCostumeIdx = function () { + if (this.inheritsAttribute('costume #')) { + return this.exemplar.getCostumeIdx(); + } + return this.costumes.asArray().indexOf(this.costume) + 1; +}; + +SpriteMorph.prototype.doWearNextCostume = function () { + var arr = this.costumes.asArray(), + idx; + if (arr.length > 1) { + idx = arr.indexOf(this.costume); + if (idx > -1) { + idx += 1; + if (idx > (arr.length - 1)) { + idx = 0; + } + this.wearCostume(arr[idx]); + } + } +}; + +SpriteMorph.prototype.doWearPreviousCostume = function () { + var arr = this.costumes.asArray(), + idx; + if (arr.length > 1) { + idx = arr.indexOf(this.costume); + if (idx > -1) { + idx -= 1; + if (idx < 0) { + idx = arr.length - 1; + } + this.wearCostume(arr[idx]); + } + } +}; + +SpriteMorph.prototype.doSwitchToCostume = function (id, noShadow) { + var w = 0, + h = 0, + stage; + if (id instanceof List) { // try to turn a list of pixels into a costume + if (id.quickShape().at(2) <= 4) { + if (this.costume) { + // recycle dimensions of current costume + w = this.costume.width(); + h = this.costume.height(); + } + if (w * h !== id.length()) { + // assume stage's dimensions + stage = this.parentThatIsA(StageMorph); + w = stage.dimensions.x; + h = stage.dimensions.y; + } + } // else try to interpret the pixels as matrix + id = Process.prototype.reportNewCostume( + id, + w, + h, + this.newCostumeName(localize('snap')) + ); + } + if (id instanceof Costume) { // allow first-class costumes + this.wearCostume(id, noShadow); + return; + } + if (id instanceof Array && (id[0] === 'current')) { + return; + } + + var num, + arr = this.costumes.asArray(), + costume; + if ( + contains( + [localize('Turtle'), localize('Empty')], + (id instanceof Array ? id[0] : null) + ) + ) { + costume = null; + } else { + if (id === -1) { + this.doWearPreviousCostume(); + return; + } + costume = detect(arr, cst => snapEquals(cst.name, id)); + if (costume === null) { + num = parseFloat(id); + if (num === 0) { + costume = null; + } else { + costume = arr[num - 1] || null; + } + } + } + this.wearCostume(costume, noShadow); +}; + +SpriteMorph.prototype.reportCostumes = function () { + return this.costumes; +}; + +// SpriteMorph sound management + +SpriteMorph.prototype.addSound = function (audio, name) { + var sound = new Sound(audio, this.newSoundName(name)); + this.shadowAttribute('sounds'); + this.sounds.add(sound); + this.recordUserEdit( + 'sounds', + 'add', + sound.name + ); + return sound; +}; + +SpriteMorph.prototype.doPlaySound = function (name) { + var stage = this.parentThatIsA(StageMorph), + sound = name instanceof Sound ? name + : (typeof name === 'number' ? this.sounds.at(name) + : detect( + this.sounds.asArray(), + s => snapEquals(s.name, name.toString()) + )), + ctx = this.audioContext(), + gain = this.getGainNode(), + pan = this.getPannerNode(), + aud, + source; + if (sound) { + aud = document.createElement('audio'); + aud.src = sound.audio.src; + ctx.resume(); // needed to fix tainted context in case of autoplay + source = ctx.createMediaElementSource(aud); + source.connect(gain); + if (pan) { + gain.connect(pan); + pan.connect(ctx.destination); // perhaps redundant + this.setPan(this.getPan()); // yep, should be redundant + } else { + gain.connect(ctx.destination); + } + this.setVolume(this.getVolume()); // probably redundant as well + aud.play(); + + aud.onended = function() { + this.currentSrc = null; + this.src = ""; + this.srcObject = null; + this.terminated = true; + this.remove(); + }; + + if (stage) { + stage.activeSounds.push(aud); + stage.activeSounds = stage.activeSounds.filter(snd => + !snd.ended && !snd.terminated + ); + } + return aud; + } +}; + +SpriteMorph.prototype.reportSounds = function () { + return this.sounds; +}; + +// SpriteMorph volume + +SpriteMorph.prototype.setVolume = function (num, noShadow) { + this.volume = Math.max(Math.min(+num || 0, 100), 0); + this.getGainNode().gain.setValueAtTime( + 1 / Math.pow(10, Math.log2(100 / this.volume)), + this.audioContext().currentTime + ); + if (this instanceof StageMorph) { + return; + } + // propagate to children that inherit my volume + if (!noShadow) { + this.shadowAttribute('volume'); + } + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('volume')) { + instance.setVolume(num, true); + } + } + }); +}; + +SpriteMorph.prototype.changeVolume = function (delta) { + this.setVolume(this.getVolume() + (+delta || 0)); +}; + +SpriteMorph.prototype.getVolume = function () { + if (this.inheritsAttribute('volume')) { + return this.exemplar.getVolume(); + } + return this.volume; +}; + +SpriteMorph.prototype.getGainNode = function () { + if (!this.gainNode) { + this.gainNode = this.audioContext().createGain(); + } + return this.gainNode; +}; + +SpriteMorph.prototype.audioContext = function () { + return Note.prototype.getAudioContext(); +}; + +// SpriteMorph stero panning + +SpriteMorph.prototype.setPan = function (num, noShadow) { + var panner = this.getPannerNode(); + if (!panner) {return; } + this.pan = Math.max(Math.min((+num || 0), 100), -100); + panner.pan.setValueAtTime( + this.pan / 100, + this.audioContext().currentTime + ); + if (this instanceof StageMorph) { + return; + } + // propagate to children that inherit my balance + if (!noShadow) { + this.shadowAttribute('balance'); + } + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('balance')) { + instance.setPan(num, true); + } + } + }); +}; + +SpriteMorph.prototype.changePan = function (delta) { + this.setPan(this.getPan() + (+delta || 0)); +}; + +SpriteMorph.prototype.getPan = function () { + if (this.inheritsAttribute('balance')) { + return this.exemplar.getPan(); + } + return this.pan; +}; + +SpriteMorph.prototype.getPannerNode = function () { + var ctx; + if (!this.pannerNode) { + ctx = this.audioContext(); + if (ctx.createStereoPanner) { + this.pannerNode = this.audioContext().createStereoPanner(); + } + } + return this.pannerNode; +}; + +// SpriteMorph frequency player + +SpriteMorph.prototype.playFreq = function (hz) { + // start playing the given frequency until stopped + var note, + ctx = this.audioContext(), + gain = this.getGainNode(), + pan = this.getPannerNode(), + stage = this.parentThatIsA(StageMorph); + if (!this.freqPlayer) { + this.freqPlayer = new Note(); + } + note = this.freqPlayer; + note.fader = ctx.createGain(); + hz = +hz || 0; + if (note.oscillator) { + note.oscillator.frequency.value = hz; + } else { + note.oscillator = ctx.createOscillator(); + if (!note.oscillator.start) { + note.oscillator.start = note.oscillator.noteOn; + } + if (!note.oscillator.stop) { + note.oscillator.stop = note.oscillator.noteOff; + } + note.setInstrument(this.instrument); + note.oscillator.frequency.value = hz; + this.setVolume(this.getVolume()); + note.oscillator.connect(note.fader); + note.fader.connect(gain); + if (pan) { + gain.connect(pan); + pan.connect(ctx.destination); + this.setPan(this.pan); + } else { + gain.connect(ctx.destination); + } + note.ended = false; + if (stage) { + stage.activeSounds.push(note); + stage.activeSounds = stage.activeSounds.filter(snd => + !snd.ended && !snd.terminated + ); + } + note.fader.gain.setValueCurveAtTime( + note.fadeIn, + ctx.currentTime, + note.fadeTime + ); + note.oscillator.start(0); + } +}; + +SpriteMorph.prototype.stopFreq = function () { + if (this.freqPlayer) { + this.freqPlayer.stop(); + } +}; + +// SpriteMorph user menu + +SpriteMorph.prototype.userMenu = function () { + var ide = this.parentThatIsA(IDE_Morph), + menu = new MenuMorph(this), + allParts, + anchors; + + if (ide && (ide.isAppMode || ide.config.noSpriteEdits)) { + // menu.addItem('help', 'nop'); + return menu; + } + if (!this.isTemporary) { + menu.addItem("duplicate", 'duplicate'); + if (StageMorph.prototype.enableInheritance) { + menu.addItem("clone", 'instantiate'); + menu.addLine(); + } + } + menu.addItem("delete", 'remove'); + menu.addItem("move", 'moveCenter'); + menu.addItem("rotate", 'setRotation'); + if (this.costume) { + menu.addItem( + "pivot", + 'moveRotationCenter', + 'edit the costume\'s\nrotation center' + ); + } + if (this.isTemporary) { + if (StageMorph.prototype.enableInheritance) { + menu.addItem( + "edit", + 'perpetuateAndEdit', + 'make permanent and\nshow in the sprite corral' + ); + } + } else { + menu.addItem("edit", 'edit'); + } + menu.addLine(); + if (this.anchor) { + menu.addItem( + localize('detach from') + ' ' + this.anchor.name, + 'detachFromAnchor' + ); + } else { + allParts = this.allParts(); + anchors = this.parent.children.filter(morph => + morph instanceof SpriteMorph && !contains(allParts, morph) + ); + if (anchors.length) { + menu.addMenu('stick to', this.anchorsMenu(anchors)); + } + } + if (this.parts.length) { + menu.addItem('detach all parts', 'detachAllParts'); + } + menu.addItem("export...", 'exportSprite'); + return menu; +}; + +SpriteMorph.prototype.anchorsMenu = function (targets) { + var menu = new MenuMorph(this.attachTo, null, this); + targets.forEach(sprite => + menu.addItem( + [ + sprite.thumbnail(new Point(24, 24)), + sprite.name, + ], + sprite + ) + ); + return menu; +}; + +SpriteMorph.prototype.exportSprite = function () { + if (this.isTemporary) {return; } + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.exportSprite(this); + } +}; + +SpriteMorph.prototype.edit = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide && !ide.isAppMode && !ide.config.noSpriteEdits) { + ide.selectSprite(this); + } +}; + +SpriteMorph.prototype.showOnStage = function () { + var stage = this.parentThatIsA(StageMorph); + if (stage) { + this.keepWithin(stage); + stage.add(this); + } + this.show(); +}; + +SpriteMorph.prototype.duplicate = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.duplicateSprite(this); + } +}; + +SpriteMorph.prototype.instantiate = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.instantiateSprite(this); + } +}; + +SpriteMorph.prototype.remove = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.removeSprite(this); + } +}; + +// SpriteMorph serialization & exporting utils + +SpriteMorph.prototype.toXMLString = function () { + // answer an xml string representation of this sprite and all parts + // attached to it, including all dependencies (global custom blocks). + var ide = this.parentThatIsA(IDE_Morph), + all = this.allParts(), + dependencies = [], + categories = [], + varNames = [], + localVarNames, + globalData, + blocksXML = ''; + + function collect(item, array) { + // only once + if (!contains(array, item)) { + array.push(item); + } + } + + function collectAll(items, array) { + items.forEach(item => collect(item, array)); + } + + // collect all dependencies and custom categories. + // only collect global custom block dependencies, because the locals + // will be included in each sprite's serialization code + + all.forEach(sprite => { + + // global block definition in scripts + sprite.scripts.children.filter( + morph => morph instanceof BlockMorph + ).forEach(script => + collectAll( + script.dependencies(true), + dependencies + ) + ); + + // global block definitions referenced in local block definitions + sprite.customBlocks.forEach(def => { + collect(def.category, categories); + collectAll( + def.collectDependencies([], [], sprite) + .filter(each => each.isGlobal), + dependencies + ); + }); + + }); + + // collect global data dependencies of the custom block definitions + // to be included in the file + + dependencies.forEach(def => + def.dataDependencies().forEach(name => { + if (!varNames.includes(name)) { + varNames.push(name); + } + }) + ); + localVarNames = this.variables.fork(varNames).names(true); // incl. hidden + varNames = varNames.filter(name => !localVarNames.includes(name)); + globalData = this.globalVariables().fork(varNames); + + // encode both parts of the export-file: + // the blocks library and the sprites + + if (dependencies.length || categories.length) { + blocksXML = ide.blocksLibraryXML( + dependencies, + categories, + false, // as file + globalData + ); + } + + return '' + + blocksXML + + ide.serializer.serialize(all) + + ''; +}; + +// SpriteMorph cloning + +/* + clones are temporary, partially shallow copies of sprites that don't + appear as icons in the corral. Clones get deleted when the red stop button + is pressed. Shallow-copying clones' scripts and costumes makes spawning + very fast, so they can be used for particle system simulations. + This speed-up, however, comes at the cost of some detrimental side + effects: Changes to a costume or a script of the original sprite are + in some cases shared with all of its clones, however such shared changes + are hard to predict for users and not actively propagated, so they don't + offer any reliable feature, and will not be supported as such. + Changes to the original sprite's scripts affect all of its clones, unless + the script contains any custom block whose definition contains one or more + block variables (in which case the script does get deep-copied). + The original sprite's scripting area, costumes wardrobe or sounds jukebox + are also not shared. therefore adding or deleting a script, sound or + costume in the original sprite has no effect on any of its clones. +*/ + +SpriteMorph.prototype.createClone = function (immediately) { + var stage = this.parentThatIsA(StageMorph), + clone; + if (this.isCorpse) { + throw new Error('cannot operate on a deleted sprite'); + } + if (stage && stage.cloneCount <= 5000) { + clone = this.fullCopy(true); + clone.clonify(stage, immediately); + } + return clone; +}; + +SpriteMorph.prototype.newClone = function (immediately) { + var clone = this.createClone(immediately); + if (isNil(clone)) { + throw new Error('exceeding maximum number of clones'); + } + return clone; +}; + +SpriteMorph.prototype.clonify = function (stage, immediately) { + var hats; + this.parts.forEach(part => part.clonify(stage)); + stage.cloneCount += 1; + this.cloneOriginName = this.isTemporary ? + this.cloneOriginName : this.name; + this.isTemporary = true; + this.name = ''; + stage.add(this); + hats = this.allHatBlocksFor('__clone__init__'); + hats.forEach(block => + stage.threads.startProcess( + block, + this, + stage.isThreadSafe, + null, // export result + null, // callback + null, // is clicked + immediately // without yielding + ) + ); + this.endWarp(); +}; + +SpriteMorph.prototype.initClone = function (hats) { + // used when manually instantiating a sprite in the IDE + var stage = this.parentThatIsA(StageMorph); + if (stage) { + hats.forEach(block => + stage.threads.startProcess( + block, + this, + stage.isThreadSafe + ) + ); + this.endWarp(); + } +}; + +SpriteMorph.prototype.removeClone = function () { + var exemplar = this.exemplar; + if (this.isTemporary) { + // this.stopTalking(); + this.parent.threads.stopAllForReceiver(this); + this.parts.slice().forEach(part => { + this.detachPart(part); + part.removeClone(); + }); + this.corpsify(); + this.instances.forEach(child => { + if (child.isTemporary) { + child.setExemplar(exemplar); + } + }); + this.destroy(); + this.parent.cloneCount -= 1; + } +}; + +SpriteMorph.prototype.perpetuate = function () { + // make a temporary sprite (clone) permanent + var stage = this.parentThatIsA(StageMorph), + ide = this.parentThatIsA(IDE_Morph); + + // make sure my exemplar-chain is fully perpetuated + if (this.exemplar) { + this.exemplar.perpetuate(); + } + if (!this.isTemporary || !stage || !ide) { + return; + } + this.isTemporary = false; + this.name = ide.newSpriteName(this.cloneOriginName); + this.cloneOriginName = ''; + stage.cloneCount -= 1; + ide.corral.addSprite(this); + ide.sprites.add(this); + this.parts.forEach(part => part.perpetuate()); +}; + +SpriteMorph.prototype.perpetuateAndEdit = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + this.perpetuate(); + ide.selectSprite(this); + this.recordUserEdit( + 'corral', + 'permanent clone', + this.name + ); + } +}; + +SpriteMorph.prototype.release = function () { + // turn a permenent sprite that's an instance of another one + // into a temporary one (clone), that will vanish either when + // the "delete this clone" operation is executed or when the user + // hits the red stop sign button in the IDE + var stage = this.parentThatIsA(StageMorph), + ide = this.parentThatIsA(IDE_Morph), + idx; + + if (this.isTemporary || !this.exemplar || !stage || !ide) { + return; + } + + // make sure all parts and instances are also released + this.parts.forEach(part => part.release()); + this.instances.forEach(inst => inst.release()); + this.isTemporary = true; + this.name = ''; + this.cloneOriginName = this.exemplar.name; + stage.cloneCount += 1; + idx = ide.sprites.asArray().indexOf(this) + 1; + stage.watchers().forEach(watcher => { + if (watcher.object() === this) { + watcher.destroy(); + } + }); + if (idx > 0) { + ide.sprites.remove(idx); + } + ide.createCorral(); + ide.fixLayout(); + if (ide.currentSprite === this) { + ide.currentSprite = detect( + stage.children, + morph => morph instanceof SpriteMorph && !morph.isTemporary + ) || this.stage; + } + ide.selectSprite(ide.currentSprite); + if (ide.isAppMode) { + ide.toggleAppMode(true); + } +}; + +// SpriteMorph deleting + +SpriteMorph.prototype.corpsify = function () { + this.isCorpse = true; + this.version = Date.now(); +}; + +// SpriteMorph primitives + +// SpriteMorph hiding and showing: + +/* + override the inherited behavior to also hide/show all + nested parts. +*/ + +SpriteMorph.prototype.show = function () { + this.setVisibility(true); +}; + +SpriteMorph.prototype.hide = function () { + this.setVisibility(false); +}; + +SpriteMorph.prototype.setVisibility = function (bool, noShadow) { + var bubble = this.talkBubble(); + + if (bool) { + SpriteMorph.uber.show.call(this); + } else { + SpriteMorph.uber.hide.call(this); + } + + // propagate to speech bubble, if any + if (bubble) { + if (bool) { + bubble.show(); + } else { + bubble.hide(); + } + } + + // progagate to parts + this.parts.forEach(part => part.setVisibility(bool)); + + // propagate to children that inherit my visibility + if (!noShadow) { + this.shadowAttribute('shown?'); + } + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('shown?')) { + instance.setVisibility(bool, true); + } + } + }); +}; + +SpriteMorph.prototype.reportShown = function () { + if (this.inheritsAttribute('shown?')) { + return this.exemplar.reportShown(); + } + return this.isVisible; +}; + +// SpriteMorph pen color + +SpriteMorph.prototype.setColorDimension = function (idx, num) { + var x = this.xPosition(), + y = this.yPosition(), + n = +num; + + idx = +idx; + if (idx < 0 || idx > 3) {return; } + if (idx === 0) { + if (n < 0 || n > 100) { // wrap the hue + n = (n < 0 ? 100 : 0) + n % 100; + } + } else { + n = Math.min(100, Math.max(0, n)); + } + if (idx === 3) { + this.color.a = 1 - n / 100; + } else { + this.cachedColorDimensions[idx] = n / 100; + this.color['set_' + this.penColorModel].apply( + this.color, + this.cachedColorDimensions + ); + } + if (!this.costume) { + this.rerender(); + } + this.silentGotoXY(x, y); +}; + +SpriteMorph.prototype.getColorDimension = function (idx) { + idx = +idx; + if (idx === 3) { + return (1 - this.color.a) * 100; + } + return (this.cachedColorDimensions[idx] || 0) * 100; +}; + +SpriteMorph.prototype.changeColorDimension = function (idx, delta) { + this.setColorDimension( + idx, + this.getColorDimension(idx) + (+delta || 0) + ); +}; + +SpriteMorph.prototype.setColorRGBA = function (dta) { + // dta can be one of the following: + // - a 4 item list representing r-g-b-a each on a scale of 0-255 + // - a 3 item list representing r-g-b leaving a unchanged + // - a 1 item list representing greyscale from 0-255 leaving alpha unchanged + // - a 2 item list representing greyscale and alpha each from 0-255 + // - a number representing greyscale from 0-255 leaving alpha unchanged + var clr = this.color.copy(), + num; + if (dta instanceof List) { + switch (dta.length()) { + case 1: + num = Math.max(0, Math.min(+(dta.at(1)), 255)); + if (isNaN(num)) {return; } + clr.r = num; + clr.g = num; + clr.b = num; + break; + case 2: + num = Math.max(0, Math.min(+(dta.at(1)), 255)); + if (isNaN(num)) {return; } + clr.r = num; + clr.g = num; + clr.b = num; + num = Math.max(0, Math.min(+(dta.at(2)), 255)); + if (isNaN(num)) {return; } + clr.a = num / 255; + break; + case 3: + num = Math.max(0, Math.min(+(dta.at(1)), 255)); + if (isNaN(num)) {return; } + clr.r = num; + num = Math.max(0, Math.min(+(dta.at(2)), 255)); + if (isNaN(num)) {return; } + clr.g = num; + num = Math.max(0, Math.min(+(dta.at(3)), 255)); + if (isNaN(num)) {return; } + clr.b = num; + break; + case 4: + num = Math.max(0, Math.min(+(dta.at(1)), 255)); + if (isNaN(num)) {return; } + clr.r = num; + num = Math.max(0, Math.min(+(dta.at(2)), 255)); + if (isNaN(num)) {return; } + clr.g = num; + num = Math.max(0, Math.min(+(dta.at(3)), 255)); + if (isNaN(num)) {return; } + clr.b = num; + num = Math.max(0, Math.min(+(dta.at(4)), 255)); + if (isNaN(num)) {return; } + clr.a = num / 255; + break; + default: + return; + } + } else { + num = Math.max(0, Math.min(+dta, 255)); + if (isNaN(num)) {return; } + clr.r = num; + clr.g = num; + clr.b = num; + } + this.setColor(clr); +}; + +SpriteMorph.prototype.changeColorRGBA = function (dta) { + // dta can be one of the following: + // - a 4 item list representing r-g-b-a each on a scale of 0-255 + // - a 3 item list representing r-g-b leaving a unchanged + // - a 1 item list representing greyscale from 0-255 leaving alpha unchanged + // - a 2 item list representing greyscale and alpha each from 0-255 + // - a number representing greyscale from 0-255 leaving alpha unchanged + var clr = this.color.copy(), + num; + if (dta instanceof List) { + switch (dta.length()) { + case 1: + num = +(dta.at(1)); + if (isNaN(num)) {return; } + clr.r = Math.max(0, Math.min(clr.r + num, 255)); + clr.g = Math.max(0, Math.min(clr.g + num, 255)); + clr.b = Math.max(0, Math.min(clr.b + num, 255)); + break; + case 2: + num = +(dta.at(1)); + if (isNaN(num)) {return; } + clr.r = Math.max(0, Math.min(clr.r + num, 255)); + clr.g = Math.max(0, Math.min(clr.g + num, 255)); + clr.b = Math.max(0, Math.min(clr.b + num, 255)); + num = +(dta.at(2)); + if (isNaN(num)) {return; } + clr.a = Math.max(0, Math.min((clr.a * 255) + num, 255)) / 255; + break; + case 3: + num = +(dta.at(1)); + if (isNaN(num)) {return; } + clr.r = Math.max(0, Math.min(clr.r + num, 255)); + num = +(dta.at(2)); + if (isNaN(num)) {return; } + clr.g = Math.max(0, Math.min(clr.g + num, 255)); + num = +(dta.at(3)); + if (isNaN(num)) {return; } + clr.b = Math.max(0, Math.min(clr.b + num, 255)); + break; + case 4: + num = +(dta.at(1)); + if (isNaN(num)) {return; } + clr.r = Math.max(0, Math.min(clr.r + num, 255)); + num = +(dta.at(2)); + if (isNaN(num)) {return; } + clr.g = Math.max(0, Math.min(clr.g + num, 255)); + num = +(dta.at(3)); + if (isNaN(num)) {return; } + clr.b = Math.max(0, Math.min(clr.b + num, 255)); + num = +(dta.at(4)); + if (isNaN(num)) {return; } + clr.a = Math.max(0, Math.min((clr.a * 255) + num, 255)) / 255; + break; + default: + return; + } + } else { + num = +dta; + if (isNaN(num)) {return; } + clr.r = Math.max(0, Math.min(clr.r + num, 255)); + clr.g = Math.max(0, Math.min(clr.g + num, 255)); + clr.b = Math.max(0, Math.min(clr.b + num, 255)); + } + this.setColor(clr); +}; + +SpriteMorph.prototype.setColor = function (aColor) { + var x = this.xPosition(), + y = this.yPosition(); + if (!this.color.eq(aColor, true)) { // observeAlpha + this.color = aColor.copy(); + if (!this.costume) { + this.rerender(); + this.silentGotoXY(x, y); + } + this.cachedColorDimensions = this.color[this.penColorModel](); + } +}; + +SpriteMorph.prototype.setBackgroundColor = SpriteMorph.prototype.setColor; + +SpriteMorph.prototype.getPenAttribute = function (attrib) { + var name = attrib instanceof Array ? attrib[0] : attrib.toString(), + options = ['hue', 'saturation', 'brightness', 'transparency']; + if (name === 'size') { + return this.size || 0; + } + if (name === 'r-g-b-a') { + return new List([ + this.color.r, + this.color.g, + this.color.b, + Math.round(this.color.a * 255) + ]); + } + return this.getColorDimension(options.indexOf(name)); +}; + +// SpriteMorph layers + +SpriteMorph.prototype.comeToFront = function () { + if (this.parent) { + this.parent.add(this); + this.changed(); + } +}; + +SpriteMorph.prototype.goToBack = function () { + if (this.parent) { + this.parent.addBack(this); + this.changed(); + } +}; + +SpriteMorph.prototype.goBack = function (layers) { + var layer, + newLayer = +layers, + targetLayer; + + if (!this.parent) {return null; } + layer = this.parent.children.indexOf(this); + this.parent.removeChild(this); + targetLayer = Math.max(layer - newLayer, 0); + this.parent.children.splice(targetLayer, null, this); + this.parent.changed(); +}; + +// SpriteMorph collision detection + +// attempted optimized collision detection using video buffer +// turns out it's actually slower to partially enumerate 2 sets of pixels +// than to create a new masked canvas. +// commented out and kept for reference + +/* +SpriteMorph.prototype.isTouching = function (other) { + var stage = this.parentThatIsA(StageMorph), + inter, off, src, trg, sw, tw, x, y; + + function isOpaque(imageData, width, x, y) { + return (imageData[y * width + x] && 0x000000FF) > 0; // alpha + } + + if (!(other instanceof SpriteMorph)) { + return SpriteMorph.uber.isTouching.call(this, other); + } + + // determine the intersection of both bounding boxes + // unscaled and translated to local coordinates + + inter = this.bounds.intersect(other.bounds).translateBy( + this.position().neg() + ).scaleBy(1 / stage.scale); // .floor(); ? + + if (inter.width() < 1 || inter.height() < 1) { + return false; + } + + off = this.position().subtract( + other.position() + ).scaleBy(1 / stage.scale).floor(); + + src = this.getImageData(); + sw = Math.floor(this.width() / stage.scale); + trg = other.getImageData(); + tw = Math.floor(other.width() / stage.scale); + + for (y = inter.origin.y; y <= inter.corner.y; y += 1) { + for (x = inter.origin.x; x <= inter.corner.x; x += 1) { + if (isOpaque(src, sw, x, y) && + isOpaque(trg, tw, x + off.x, y + off.y)) { + return true; + } + } + } + return false; +}; +*/ + +SpriteMorph.prototype.reportTouchingColor = function (aColor) { + var stage = this.parentThatIsA(StageMorph), + data, len, i; + + if (stage) { + data = this.overlappingPixels(stage); + if (!data) {return false; } + len = data[0].length; + for (i = 3; i < len; i += 4) { + if (data[0][i] && data[1][i]) { + if ( + data[1][i - 3] === aColor.r && + data[1][i - 2] === aColor.g && + data[1][i - 1] === aColor.b + ) { + return true; + } + } + } + } + return false; +}; + +SpriteMorph.prototype.reportColorIsTouchingColor = function ( + thisColor, + thatColor +) { + var stage = this.parentThatIsA(StageMorph), + data, len, i; + + if (stage) { + data = this.overlappingPixels(stage); + if (!data) {return false; } + len = data[0].length; + for (i = 3; i < len; i += 4) { + if (data[0][i] && data[1][i]) { + if ( + data[0][i - 3] === thisColor.r && + data[0][i - 2] === thisColor.g && + data[0][i - 1] === thisColor.b && + data[1][i - 3] === thatColor.r && + data[1][i - 2] === thatColor.g && + data[1][i - 1] === thatColor.b + ) { + return true; + } + } + } + } + return false; +}; + +SpriteMorph.prototype.overlappingPixels = function (otherSprite) { + // overrides method from Morph because Sprites aren't nested Morphs + // the same applies for speech balloons, where it's enough to + // test the encompassing shape only + var oRect = this.bounds.intersect(otherSprite.bounds), + thisImg = this.getImage(), + thatImg = otherSprite.getImage(); + + if (otherSprite instanceof StageMorph) { + // only check for color collision + thatImg = otherSprite.fancyThumbnail(otherSprite.extent(), this, true); + } + if (oRect.width() < 1 || oRect.height() < 1 || !thisImg || !thatImg || + !thisImg.width || !thisImg.height || !thatImg.width || !thatImg.height + ) { + return false; + } + if (thisImg.isRetinaEnabled !== thatImg.isRetinaEnabled) { + thisImg = normalizeCanvas(thisImg, true); + thatImg = normalizeCanvas(thatImg, true); + } + return [ + thisImg.getContext("2d").getImageData( + oRect.left() - this.left(), + oRect.top() - this.top(), + oRect.width(), + oRect.height() + ).data, + thatImg.getContext("2d").getImageData( + oRect.left() - otherSprite.left(), + oRect.top() - otherSprite.top(), + oRect.width(), + oRect.height() + ).data + ]; +}; + +// SpriteMorph neighbor detection + +SpriteMorph.prototype.neighbors = function (aStage) { + var stage = aStage || this.parentThatIsA(StageMorph), + myPerimeter = this.perimeter(stage); + return new List( + stage.children.filter(each => { + var eachPerimeter, + distance; + if (each instanceof SpriteMorph && + each.isVisible && + (each !== this) + ) { + eachPerimeter = each.perimeter(stage); + distance = myPerimeter.center.distanceTo(eachPerimeter.center); + return (distance - myPerimeter.radius - eachPerimeter.radius) + < 0; + } + return false; + }) + ); +}; + +SpriteMorph.prototype.perimeter = function (aStage) { + var stage = aStage || this.parentThatIsA(StageMorph), + stageScale = this instanceof StageMorph ? 1 : stage.scale, + radius; + if (this.costume) { + radius = Math.max( + this.costume.width(), + this.costume.height() + ) * this.scale * stageScale; + } else { + radius = Math.max(this.width(), this.height()); + } + return { + center: this.center(), // geometric center rather than position + radius: radius + }; +}; + +// SpriteMorph pen ops + +SpriteMorph.prototype.doStamp = function () { + var stage = this.parent, + ctx = stage.penTrails().getContext('2d'), + img = this.getImage(); + + if (img.width < 1 || (img.height < 1)) { + // too small to draw + return; + } + ctx.save(); + ctx.scale(1 / stage.scale, 1 / stage.scale); + ctx.globalAlpha = this.alpha; + ctx.drawImage( + img, + this.left() - stage.left(), + this.top() - stage.top() + ); + ctx.restore(); + this.changed(); + stage.cachedPenTrailsMorph = null; +}; + +SpriteMorph.prototype.clear = function () { + this.parent.clearPenTrails(); +}; + +SpriteMorph.prototype.write = function (text, size) { + // thanks to Michael Ball for contributing this code! + if (typeof text !== 'string' && typeof text !== 'number') { + throw new Error( + localize('can only write text or numbers, not a') + ' ' + + typeof text + ); + } + + var stage = this.parentThatIsA(StageMorph), + context = stage.penTrails().getContext('2d'), + rotation = radians(this.direction() - 90), + trans = new Point( + this.rotationCenter().x - stage.left(), + this.rotationCenter().y - stage.top() + ), + len, + pos; + + context.save(); + context.font = size + 'px monospace'; + context.textAlign = 'left'; + context.textBaseline = 'alphabetic'; + context.fillStyle = this.color.toString(); + len = context.measureText(text).width; + trans = trans.multiplyBy(1 / stage.scale); + context.translate(trans.x, trans.y); + context.rotate(rotation); + context.fillText(text, 0, 0); + context.translate(-trans.x, -trans.y); + context.restore(); + pos = new Point( + len * Math.sin(radians(this.direction())), + len * Math.cos(radians(this.direction())) + ); + pos = pos.add(new Point(this.xPosition(), this.yPosition())); + this.gotoXY(pos.x, pos.y, false); + this.changed(); + stage.changed(); +}; + +SpriteMorph.prototype.setSize = function (size) { + // pen size + if (!isNaN(size)) { + this.size = Math.min(Math.max(+size, 0.0001), 1000); + } +}; + +SpriteMorph.prototype.changeSize = function (delta) { + this.setSize(this.size + (+delta || 0)); +}; + +// SpriteMorph printing on another sprite: + +SpriteMorph.prototype.blitOn = function (target, mask = 'source-atop') { + // draw my costume onto a copy of the target's costume scaled and rotated + // so it appears as though I'm "stamped" onto it. + + var sourceHeading = (this.rotationStyle === 1) ? this.heading : 90, + targetHeading = (target.rotationStyle === 1) ? target.heading : 90, + sourceCostume, targetCostume, ctx, + relRot, relScale, stageScale, + centerDist, centerDelta, centerAngleRadians, center, + originDist, originAngleRadians, + spriteCenter, thisCenter, relPos, pos; + + // prevent pasting an object onto itself + if (this === target) {return; } + + // check if both source and target have costumes, + // rasterize copy of target costume if it's an SVG + if (this.costume && target.costume) { + sourceCostume = this.costume; + if (sourceCostume instanceof SVG_Costume) { + sourceCostume = sourceCostume.rasterized(); + } + if (target.costume instanceof SVG_Costume) { + targetCostume = target.costume.rasterized(); + } else { + targetCostume = target.costume.copy(); + } + } else { + return; + } + + // do the math: + if (target instanceof SpriteMorph) { + if (this instanceof SpriteMorph) { + // stamp a sprite on a sprite: + relRot = sourceHeading - targetHeading; + relScale = this.scale / target.scale; + stageScale = this.parentThatIsA(StageMorph).scale; + centerDist = target.center().distanceTo(this.center()); + centerDelta = this.center().subtract(target.center()); + centerAngleRadians = Math.atan2(centerDelta.y, centerDelta.x); + center = new Point( + sourceCostume.width(), + sourceCostume.height() + ).multiplyBy(0.5 * this.scale * stageScale); + originDist = center.distanceTo(ZERO); + originAngleRadians = Math.atan2(center.y, center.x); + spriteCenter = new Point( + target.costume.width(), + target.costume.height() + ).multiplyBy(0.5 * target.scale * stageScale) + .rotateBy(radians(relRot)); + thisCenter = spriteCenter.distanceAngle( + centerDist, + degrees(centerAngleRadians) - sourceHeading + 180 + ); + relPos = thisCenter.distanceAngle( + originDist, + degrees(originAngleRadians) -90 + ); + pos = relPos.divideBy(stageScale) + .divideBy(relScale) + .divideBy(target.scale); + } else { // if the stage is the source + // stamp the stage on a sprite: + relRot = 90 - targetHeading; + relScale = 1 / target.scale; + centerDist = target.center().distanceTo(this.position()); + centerDelta = this.position().subtract(target.center()); + centerAngleRadians = Math.atan2(centerDelta.y, centerDelta.x); + center = new Point( + target.costume.width(), + target.costume.height() + ).multiplyBy(0.5 * target.scale) + .rotateBy(radians(90 - targetHeading)); + pos = center.distanceAngle( + centerDist / this.scale, + degrees(centerAngleRadians) + 90 + ); + } + } else { // if the stage is the target + // stamp a sprite on the stage: + relRot = sourceHeading - 90; + relScale = this.scale; + center = this.center().subtract(target.position()) + .divideBy(this.scale * target.scale) + .rotateBy(radians(sourceHeading - 90)); + pos = center.subtract( + new Point( + sourceCostume.width(), + sourceCostume.height() + ).multiplyBy(0.5) + ); + } + + // draw my costume onto the target's costume copy: + ctx = targetCostume.contents.getContext('2d'); + ctx.rotate(radians(relRot)); + ctx.scale(relScale, relScale); + ctx.globalCompositeOperation = mask; + ctx.drawImage(sourceCostume.contents, pos.x, pos.y); + + // make the target wear the new costume + target.doSwitchToCostume(targetCostume); +}; + +// SpriteMorph pen up and down: + +SpriteMorph.prototype.down = function () { + this.setPenDown(true); +}; + +SpriteMorph.prototype.up = function () { + this.setPenDown(false); +}; + +SpriteMorph.prototype.setPenDown = function (bool, noShadow) { + if (bool) { + SpriteMorph.uber.down.call(this); + } else { + SpriteMorph.uber.up.call(this); + } + + // propagate to children that inherit my visibility + if (!noShadow) { + this.shadowAttribute('pen down?'); + } + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('pen down?')) { + instance.setPenDown(bool, true); + } + } + }); +}; + +SpriteMorph.prototype.getPenDown = function () { + if (this.inheritsAttribute('pen down?')) { + return this.exemplar.getPenDown(); + } + return this.isDown; +}; + +// SpriteMorph scale + +SpriteMorph.prototype.getScale = function () { + // answer my scale in percent + if (this.inheritsAttribute('size')) { + return this.exemplar.getScale(); + } + return this.scale * 100; +}; + +SpriteMorph.prototype.setScale = function (percentage, noShadow) { + // set my (absolute) scale in percent + var x = this.xPosition(), + y = this.yPosition(), + realScale, + growth; + + realScale = (+percentage || 0) / 100; + growth = realScale / this.nestingScale; + this.nestingScale = realScale; + this.scale = Math.max(realScale, 0.01); + + // apply to myself + this.changed(); + this.fixLayout(); + this.rerender(); + + this.silentGotoXY(x, y, true); // just me + this.positionTalkBubble(); + + // propagate to nested parts + this.parts.forEach(part => { + var xDist = part.xPosition() - x, + yDist = part.yPosition() - y; + part.setScale(part.scale * 100 * growth); + part.silentGotoXY( + x + (xDist * growth), + y + (yDist * growth) + ); + }); + + // propagate to children that inherit my scale + if (!noShadow) { + this.shadowAttribute('size'); + } + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('size')) { + instance.setScale(percentage, true); + } + } + }); +}; + +SpriteMorph.prototype.changeScale = function (delta) { + this.setScale(this.getScale() + (+delta || 0)); +}; + +// Spritemorph graphic effects + +SpriteMorph.prototype.graphicsChanged = function () { + return Object.keys(this.graphicsValues).some(any => + this.graphicsValues[any] < 0 || + this.graphicsValues[any] > 0 + ); +}; + +SpriteMorph.prototype.applyGraphicsEffects = function (canvas) { + // For every effect: apply transform of that effect(canvas, stored value) + // Graphic effects from Scratch are heavily based on ScratchPlugin.c + + var ctx, imagedata, w, h; + + function transform_fisheye(imagedata, value) { + var pixels, newImageData, newPixels, centerX, centerY, + w, h, x, y, dx, dy, r, angle, srcX, srcY, i, srcI; + + w = imagedata.width; + h = imagedata.height; + pixels = imagedata.data; + newImageData = ctx.createImageData(w, h); + newPixels = newImageData.data; + + centerX = w / 2; + centerY = h / 2; + value = Math.max(0, (value + 100) / 100); + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + dx = (x - centerX) / centerX; + dy = (y - centerY) / centerY; + r = Math.pow(Math.sqrt(dx * dx + dy * dy), value); + if (r <= 1) { + angle = Math.atan2(dy, dx); + srcX = Math.floor( + centerX + (r * Math.cos(angle) * centerX) + ); + srcY = Math.floor( + centerY + (r * Math.sin(angle) * centerY) + ); + } else { + srcX = x; + srcY = y; + } + i = (y * w + x) * 4; + srcI = (srcY * w + srcX) * 4; + newPixels[i] = pixels[srcI]; + newPixels[i + 1] = pixels[srcI + 1]; + newPixels[i + 2] = pixels[srcI + 2]; + newPixels[i + 3] = pixels[srcI + 3]; + } + } + return newImageData; + } + + function transform_whirl(imagedata, value) { + var pixels, newImageData, newPixels, w, h, centerX, centerY, + x, y, radius, scaleX, scaleY, whirlRadians, radiusSquared, + dx, dy, d, factor, angle, srcX, srcY, i, srcI, sina, cosa; + + w = imagedata.width; + h = imagedata.height; + pixels = imagedata.data; + newImageData = ctx.createImageData(w, h); + newPixels = newImageData.data; + + centerX = w / 2; + centerY = h / 2; + radius = Math.min(centerX, centerY); + if (w < h) { + scaleX = h / w; + scaleY = 1; + } else { + scaleX = 1; + scaleY = w / h; + } + whirlRadians = -radians(value); + radiusSquared = radius * radius; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + dx = scaleX * (x - centerX); + dy = scaleY * (y - centerY); + d = dx * dx + dy * dy; + if (d < radiusSquared) { + factor = 1 - (Math.sqrt(d) / radius); + angle = whirlRadians * (factor * factor); + sina = Math.sin(angle); + cosa = Math.cos(angle); + srcX = Math.floor( + (cosa * dx - sina * dy) / scaleX + centerX + ); + srcY = Math.floor( + (sina * dx + cosa * dy) / scaleY + centerY + ); + } else { + srcX = x; + srcY = y; + } + i = (y * w + x) * 4; + srcI = (srcY * w + srcX) * 4; + newPixels[i] = pixels[srcI]; + newPixels[i + 1] = pixels[srcI + 1]; + newPixels[i + 2] = pixels[srcI + 2]; + newPixels[i + 3] = pixels[srcI + 3]; + } + } + return newImageData; + } + + function transform_pixelate(imagedata, value) { + var pixels, newImageData, newPixels, w, h, + x, y, srcX, srcY, i, srcI; + + w = imagedata.width; + h = imagedata.height; + pixels = imagedata.data; + newImageData = ctx.createImageData(w, h); + newPixels = newImageData.data; + + value = Math.floor(Math.abs(value / 10) + 1); + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + srcX = Math.floor(x / value) * value; + srcY = Math.floor(y / value) * value; + i = (y * w + x) * 4; + srcI = (srcY * w + srcX) * 4; + newPixels[i] = pixels[srcI]; + newPixels[i + 1] = pixels[srcI + 1]; + newPixels[i + 2] = pixels[srcI + 2]; + newPixels[i + 3] = pixels[srcI + 3]; + } + } + return newImageData; + } + + function transform_mosaic(imagedata, value) { + var pixels, i, l, newImageData, newPixels, srcI; + pixels = imagedata.data; + newImageData = ctx.createImageData(imagedata.width, imagedata.height); + newPixels = newImageData.data; + + value = Math.round((Math.abs(value) + 10) / 10); + value = Math.max( + 0, + Math.min(value, Math.min(imagedata.width, imagedata.height)) + ); + for (i = 0, l = pixels.length; i < l; i += 4) { + srcI = i * value % l; + newPixels[i] = pixels[srcI]; + newPixels[i + 1] = pixels[srcI + 1]; + newPixels[i + 2] = pixels[srcI + 2]; + newPixels[i + 3] = pixels[srcI + 3]; + } + return newImageData; + } + + function transform_duplicate(imagedata, value) { + var pixels, i; + pixels = imagedata.data; + for (i = 0; i < pixels.length; i += 4) { + pixels[i] = pixels[i * value]; + pixels[i + 1] = pixels[i * value + 1]; + pixels[i + 2] = pixels[i * value + 2]; + pixels[i + 3] = pixels[i * value + 3]; + } + return imagedata; + } + + function transform_colorDimensions( + imagedata, + hueShift, + saturationShift, + brightnessShift + ) { + var pixels = imagedata.data, + l = pixels.length, + clr = new Color(), + index, dim; + + for (index = 0; index < l; index += 4) { + + clr.r = pixels[index]; + clr.g = pixels[index + 1]; + clr.b = pixels[index + 2]; + + dim = clr[SpriteMorph.prototype.penColorModel](); + dim[0] = dim[0] * 100 + hueShift; + if (dim[0] < 0 || dim[0] > 100) { // wrap the hue + dim[0] = (dim[0] < 0 ? 100 : 0) + dim[0] % 100; + } + dim[0] = dim[0] / 100; + dim[1] = dim[1] + saturationShift / 100; + dim[2] = dim[2] + brightnessShift / 100; + + clr['set_' + SpriteMorph.prototype.penColorModel].apply(clr, dim); + pixels[index] = clr.r; + pixels[index + 1] = clr.g; + pixels[index + 2] = clr.b; + } + return imagedata; + } + + function transform_negative (imagedata, value) { + var pixels, i, l, rcom, gcom, bcom; + pixels = imagedata.data; + for (i = 0, l = pixels.length; i < l; i += 4) { + rcom = 255 - pixels[i]; + gcom = 255 - pixels[i + 1]; + bcom = 255 - pixels[i + 2]; + + if (pixels[i] < rcom) { //compare to the complement + pixels[i] += value; + } else if (pixels[i] > rcom) { + pixels[i] -= value; + } + if (pixels[i + 1] < gcom) { + pixels[i + 1] += value; + } else if (pixels[i + 1] > gcom) { + pixels[i + 1] -= value; + } + if (pixels[i + 2] < bcom) { + pixels[i + 2] += value; + } else if (pixels[i + 2] > bcom) { + pixels[i + 2] -= value; + } + } + return imagedata; + } + + function transform_comic (imagedata, value) { + var pixels, i, l; + pixels = imagedata.data; + for (i = 0, l = pixels.length; i < l; i += 4) { + pixels[i] += Math.sin(i * value) * 127 + 128; + pixels[i + 1] += Math.sin(i * value) * 127 + 128; + pixels[i + 2] += Math.sin(i * value) * 127 + 128; + } + return imagedata; + } + + function transform_confetti (imagedata, value) { + var pixels, i, l; + pixels = imagedata.data; + for (i = 0, l = pixels.length; i < l; i += 1) { + pixels[i] = Math.sin(value * pixels[i]) * 127 + pixels[i]; + } + return imagedata; + } + + if (this.graphicsChanged()) { + w = Math.ceil(this.width()); + h = Math.ceil(this.height()); + if (!canvas.width || !canvas.height || !w || !h) { + // too small to get image data, abort + return canvas; + } + ctx = canvas.getContext("2d"); + imagedata = ctx.getImageData(0, 0, w, h); + + if (this.graphicsValues.fisheye) { + imagedata = transform_fisheye( + imagedata, + this.graphicsValues.fisheye + ); + } + if (this.graphicsValues.whirl) { + imagedata = transform_whirl( + imagedata, + this.graphicsValues.whirl + ); + } + if (this.graphicsValues.pixelate) { + imagedata = transform_pixelate( + imagedata, + this.graphicsValues.pixelate + ); + } + if (this.graphicsValues.mosaic) { + imagedata = transform_mosaic( + imagedata, + this.graphicsValues.mosaic + ); + } + if (this.graphicsValues.duplicate) { + imagedata = transform_duplicate( + imagedata, + this.graphicsValues.duplicate + ); + } + if (this.graphicsValues.color || + this.graphicsValues.saturation || + this.graphicsValues.brightness) { + imagedata = transform_colorDimensions( + imagedata, + this.graphicsValues.color, + this.graphicsValues.saturation, + this.graphicsValues.brightness + ); + } + if (this.graphicsValues.negative) { + imagedata = transform_negative( + imagedata, + this.graphicsValues.negative + ); + } + if (this.graphicsValues.comic) { + imagedata = transform_comic( + imagedata, + this.graphicsValues.comic + ); + } + if (this.graphicsValues.confetti) { + imagedata = transform_confetti( + imagedata, + this.graphicsValues.confetti + ); + } + + ctx.putImageData(imagedata, 0, 0); + } + + return canvas; +}; + +SpriteMorph.prototype.setEffect = function (effect, value) { + var eff = effect instanceof Array ? effect[0] : effect.toString(); + if (!contains( + [ + 'color', + 'saturation', + 'brightness', + 'ghost', + 'fisheye', + 'whirl', + 'pixelate', + 'mosaic', + 'negative', + // depracated, but still supported in legacy projects: + 'duplicate', + 'comic', + 'confetti' + ], + eff + )) { + throw new Error(localize('unsupported graphic effect') + ': "' + eff + '"'); + } + if (eff === 'ghost') { + this.alpha = 1 - Math.min(Math.max(+value || 0, 0), 100) / 100; + } else { + this.graphicsValues[eff] = +value; + } + this.rerender(); +}; + +SpriteMorph.prototype.getEffect = function (effect) { + var eff = effect instanceof Array ? effect[0] : effect.toString(); + if (eff === 'ghost') { + return this.getGhostEffect(); + } + return this.graphicsValues[eff] || 0; +}; + +SpriteMorph.prototype.getGhostEffect = function () { + return (1 - this.alpha) * 100; +}; + +SpriteMorph.prototype.changeEffect = function (effect, value) { + var eff = effect instanceof Array ? effect[0] : effect.toString(); + if (eff === 'ghost') { + this.setEffect(effect, this.getGhostEffect() + (+value || 0)); + } else { + this.setEffect(effect, +this.graphicsValues[eff] + (+value)); + } +}; + +SpriteMorph.prototype.clearEffects = function () { + var effect; + for (effect in this.graphicsValues) { + if (this.graphicsValues.hasOwnProperty(effect)) { + this.setEffect([effect], 0); + } + } + this.setEffect(['ghost'], 0); +}; + +// SpriteMorph talk bubble + +SpriteMorph.prototype.stopTalking = function () { + var bubble = this.talkBubble(); + if (bubble) {bubble.destroy(); } +}; + +SpriteMorph.prototype.doThink = function (data) { + this.bubble(data, true); +}; + +SpriteMorph.prototype.bubble = function (data, isThought, isQuestion) { + var bubble, + stage = this.parentThatIsA(StageMorph); + + this.stopTalking(); + if (data === '' || isNil(data)) {return; } + bubble = new SpriteBubbleMorph( + data, + stage, + isThought, + isQuestion + ); + this.add(bubble); + this.positionTalkBubble(); +}; + +SpriteMorph.prototype.talkBubble = function () { + return detect( + this.children, + morph => morph instanceof SpeechBubbleMorph + ); +}; + +SpriteMorph.prototype.positionTalkBubble = function () { + var stage = this.parentThatIsA(StageMorph), + stageScale = stage ? stage.scale : 1, + bubble = this.talkBubble(), + bottom = this.bottom(), + step = this.extent().divideBy(10) + .max(new Point(5, 5).scaleBy(stageScale)) + .multiplyBy(new Point(-1, 1)); + + if (!bubble) {return null; } + bubble.show(); + if (!bubble.isPointingRight) { + bubble.isPointingRight = true; + bubble.fixLayout(); + bubble.rerender(); + } + bubble.setLeft(this.right()); + bubble.setBottom(this.top()); + while (!this.isTouching(bubble) && bubble.bottom() < bottom) { + bubble.moveBy(step); + } + bubble.moveBy(step.mirror()); + if (!stage) {return null; } + if (bubble.right() > stage.right()) { + bubble.isPointingRight = false; + bubble.fixLayout(); + bubble.rerender(); + bubble.setRight(this.center().x); + } + bubble.keepWithin(stage); +}; + +// dragging and dropping adjustments b/c of talk bubbles and parts + +SpriteMorph.prototype.prepareToBeGrabbed = function (hand) { + this.recordLayers(); + this.shadowAttribute('x position'); + this.shadowAttribute('y position'); + if (!this.bounds.containsPoint(hand.position()) && + this.isCorrectingOutsideDrag()) { + this.setCenter(hand.position()); + } +}; + +SpriteMorph.prototype.isCorrectingOutsideDrag = function () { + // make sure I don't "trail behind" the hand when dragged + // override for morphs that you want to be dragged outside + // their full bounds + return !this.parts.length; +}; + +SpriteMorph.prototype.justDropped = function () { + var stage = this.parentThatIsA(StageMorph); + if (stage) { + stage.enableCustomHatBlocks = true; + } + if (this.exemplar) { + this.inheritedAttributes.forEach(att => { + if (contains(['direction', 'size', 'costume #'], att)) { + // only refresh certain propagated attributes + this.refreshInheritedAttribute(att); + } + }); + } + this.restoreLayers(); + this.positionTalkBubble(); + this.receiveUserInteraction('dropped'); +}; + +// SpriteMorph drawing: + +SpriteMorph.prototype.drawLine = function (start, dest) { + var stagePos = this.parent.bounds.origin, + stageScale = this.parent.scale, + context = this.parent.penTrails().getContext('2d'), + from = start.subtract(stagePos).divideBy(stageScale), + to = dest.subtract(stagePos).divideBy(stageScale), + damagedFrom, + damagedTo, + damaged; + + if (this.isDown) { + // record for later svg conversion + if (StageMorph.prototype.enablePenLogging) { + this.parent.trailsLog.push( + [ + this.snapPoint(start), + this.snapPoint(dest), + this.color.copy(), + this.size, + this.useFlatLineEnds ? 'butt' : 'round' + ] + ); + } + + // draw on the pen-trails layer + context.lineWidth = this.size; + context.strokeStyle = this.color.toString(); + if (this.useFlatLineEnds) { + context.lineCap = 'butt'; + context.lineJoin = 'miter'; + } else { + context.lineCap = 'round'; + context.lineJoin = 'round'; + } + context.beginPath(); + context.moveTo(from.x, from.y); + context.lineTo(to.x, to.y); + context.stroke(); + if (this.isWarped === false) { + damagedFrom = from.multiplyBy(stageScale).add(stagePos); + damagedTo = to.multiplyBy(stageScale).add(stagePos); + damaged = damagedFrom.rectangle(damagedTo).expandBy( + Math.max(this.size * stageScale / 2, 1) + ).intersect(this.parent.visibleBounds()).spread(); + this.world().broken.push(damaged); + } + this.parent.cachedPenTrailsMorph = null; + } +}; + +SpriteMorph.prototype.floodFill = function () { + if (!this.parent.bounds.containsPoint(this.rotationCenter())) { + return; + } + this.parent.cachedPenTrailsMorph = null; + if (this.color.a > 1) { + // fix a legacy bug in Morphic color detection + this.color.a = this.color.a / 255; + } + var layer = normalizeCanvas(this.parent.penTrails()), + width = layer.width, + height = layer.height, + ctx = layer.getContext('2d'), + img = ctx.getImageData(0, 0, width, height), + dta = img.data, + stack = [ + Math.floor((height / 2) - this.yPosition()) * width + + Math.floor(this.xPosition() + (width / 2)) + ], + clr = new Color( + Math.round(Math.min(Math.max(this.color.r, 0), 255)), + Math.round(Math.min(Math.max(this.color.g, 0), 255)), + Math.round(Math.min(Math.max(this.color.b, 0), 255)), + this.color.a + ), + current, + src; + + function read(p) { + var d = p * 4; + return [dta[d], dta[d + 1], dta[d + 2], dta[d + 3]]; + } + + function check(p) { + return p[0] === src[0] && + p[1] === src[1] && + p[2] === src[2] && + p[3] === src[3]; + } + + src = read(stack[0]); + if (src[0] === clr.r && + src[1] === clr.g && + src[2] === clr.b && + src[3] === Math.round(clr.a * 255)) { + return; + } + while (stack.length > 0) { + current = stack.pop(); + if (check(read(current))) { + if (current % width > 1) { + stack.push(current + 1); + stack.push(current - 1); + } + if (current > 0 && current < height * width) { + stack.push(current + width); + stack.push(current - width); + } + } + dta[current * 4] = clr.r; + dta[current * 4 + 1] = clr.g; + dta[current * 4 + 2] = clr.b; + dta[current * 4 + 3] = Math.round(clr.a * 255); + } + ctx.putImageData(img, 0, 0); + this.parent.changed(); +}; + +// SpriteMorph pen trails as costume + +SpriteMorph.prototype.reportPenTrailsAsCostume = function () { + var cst = new Costume( + this.parentThatIsA(StageMorph).trailsCanvas, + this.newCostumeName(localize('Costume')) + ); + cst.shrinkWrap(); + cst.rotationCenter = cst.rotationCenter.translateBy( + new Point(this.xPosition(), -this.yPosition()) + ); + return cst; +}; + +// SpriteMorph motion - adjustments due to nesting + +SpriteMorph.prototype.moveBy = function (delta, justMe) { + // override the inherited default to make sure my parts follow + // unless it's justMe (a correction) + var start = this.isDown && !justMe && this.parent ? + this.rotationCenter() : null; + SpriteMorph.uber.moveBy.call(this, delta); + if (start) { + this.drawLine(start, this.rotationCenter()); + } + if (!justMe) { + this.parts.forEach(part => part.moveBy(delta)); + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + var inheritsX = instance.inheritsAttribute('x position'), + inheritsY = instance.inheritsAttribute('y position'); + if (inheritsX && inheritsY) { + instance.moveBy(delta); + } else if (inheritsX) { + instance.moveBy(new Point(delta.x, 0)); + } else if (inheritsY) { + instance.moveBy(new Point(0, delta.y)); + } + } + }); + } +}; + +SpriteMorph.prototype.rootForGrab = function () { + if (this.anchor) { + return this.anchor.rootForGrab(); + } + return SpriteMorph.uber.rootForGrab.call(this); +}; + +SpriteMorph.prototype.setCenter = function (aPoint, justMe) { + // override the inherited default to make sure my parts follow + // unless it's justMe + var delta = aPoint.subtract(this.center()); + this.moveBy(delta, justMe); +}; + +SpriteMorph.prototype.nestingBounds = function () { + // same as fullBounds(), except that it uses "parts" instead of children + // and special cases the costume-less "arrow" shape's bounding box + var result = this.bounds; + if (!this.costume && this.penBounds) { + result = this.penBounds.translateBy(this.position()); + } + this.parts.forEach(part => { + if (part.isVisible) { + result = result.merge(part.nestingBounds()); + } + }); + return result; +}; + +// SpriteMorph motion primitives + +SpriteMorph.prototype.setPosition = function (aPoint, justMe) { + // override the inherited default to make sure my parts follow + // unless it's justMe + var delta = aPoint.subtract(this.topLeft()); + if ((delta.x !== 0) || (delta.y !== 0)) { + this.moveBy(delta, justMe); + } +}; + +SpriteMorph.prototype.forward = function (steps) { + var dest, + dist = steps * this.parent.scale || 0, + dot = 0.1; + + if (dist === 0 && this.isDown) { // draw a dot + // dot = Math.min(this.size, 1); + this.isDown = false; + this.forward(dot * -0.5); + this.isDown = true; + this.forward(dot); + this.isDown = false; + this.forward(dot * -0.5); + this.isDown = true; + return; + } else if (dist >= 0) { + dest = this.position().distanceAngle(dist, this.heading); + } else { + dest = this.position().distanceAngle( + Math.abs(dist), + (this.heading - 180) + ); + } + + this.shadowAttribute('x position'); + this.shadowAttribute('y position'); + + this.setPosition(dest); + this.positionTalkBubble(); +}; + +SpriteMorph.prototype.setHeading = function (degrees, noShadow) { + var x = this.xPosition(), + y = this.yPosition(), + dir = !isFinite(degrees) ? 0 : +degrees, + turn = dir - this.heading; + + // apply to myself + if (this.rotationStyle) { // optimization, only redraw if rotatable + this.changed(); + SpriteMorph.uber.setHeading.call(this, dir); + this.silentGotoXY(x, y, true); // just me + this.positionTalkBubble(); + } else { + this.heading = ((+degrees % 360) + 360) % 360; + } + + // propagate to my parts + this.parts.forEach(part => { + var pos = new Point(part.xPosition(), part.yPosition()), + trg = pos.rotateBy(radians(turn), new Point(x, y)); + if (part.rotatesWithAnchor) { + part.turn(turn); + } + part.gotoXY(trg.x, trg.y); + }); + + // propagate to children that inherit my direction + if (!noShadow) { + this.shadowAttribute('direction'); + } + this.instances.forEach(instance => { + if (instance.cachedPropagation) { + if (instance.inheritsAttribute('direction')) { + instance.setHeading(degrees, true); + } + } + }); +}; + +SpriteMorph.prototype.faceToXY = function (x, y) { + this.setHeading(this.angleToXY(x, y)); +}; + +SpriteMorph.prototype.angleToXY = function (x, y) { + var deltaX = (x - this.xPosition()) * this.parent.scale, + deltaY = (y - this.yPosition()) * this.parent.scale, + angle = Math.abs(deltaX) < 0.001 ? (deltaY < 0 ? 90 : 270) + : Math.round( + (deltaX >= 0 ? 0 : 180) + - (Math.atan(deltaY / deltaX) * 57.2957795131) + ); + return angle + 90; +}; + +SpriteMorph.prototype.turn = function (degrees) { + this.setHeading(this.heading + (+degrees || 0)); +}; + +SpriteMorph.prototype.turnLeft = function (degrees) { + this.setHeading(this.heading - (+degrees || 0)); +}; + +SpriteMorph.prototype.getPosition = function () { + return new List([this.xPosition(), this.yPosition()]); +}; + +SpriteMorph.prototype.xPosition = function () { + if (this.inheritsAttribute('x position')) { + return this.exemplar.xPosition(); + } + + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent?.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (this.rotationCenter().x - stage.center().x) / stage.scale; + } + return this.rotationCenter().x; +}; + +SpriteMorph.prototype.yPosition = function () { + if (this.inheritsAttribute('y position')) { + return this.exemplar.yPosition(); + } + + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent?.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (stage.center().y - this.rotationCenter().y) / stage.scale; + } + return this.rotationCenter().y; +}; + +SpriteMorph.prototype.direction = function () { + if (this.inheritsAttribute('direction')) { + return this.exemplar.direction(); + } + return this.heading; +}; + +SpriteMorph.prototype.penSize = function () { + return this.size; +}; + +SpriteMorph.prototype.gotoXY = function (x, y, justMe, noShadow) { + var stage = this.parentThatIsA(StageMorph), + newX, + newY, + dest; + + if (!stage) {return; } + if (!noShadow) { + this.shadowAttribute('x position'); + this.shadowAttribute('y position'); + } + x = !isFinite(+x) ? 0 : +x; + y = !isFinite(+y) ? 0 : +y; + newX = stage.center().x + x * stage.scale; + newY = stage.center().y - y * stage.scale; + if (this.costume) { + dest = new Point(newX, newY).subtract(this.rotationOffset); + } else { + dest = new Point(newX, newY).subtract(this.extent().divideBy(2)); + } + this.setPosition(dest, justMe); + this.positionTalkBubble(); +}; + +SpriteMorph.prototype.silentGotoXY = function (x, y, justMe) { + // move without drawing + // don't shadow coordinate attributes + var penState = this.isDown; + this.isDown = false; + this.gotoXY(x, y, justMe, true); // don't shadow coordinates + this.isDown = penState; +}; + +SpriteMorph.prototype.setXPosition = function (num) { + this.shadowAttribute('x position'); + this.gotoXY(+num || 0, this.yPosition(), false, true); +}; + +SpriteMorph.prototype.changeXPosition = function (delta) { + this.setXPosition(this.xPosition() + (+delta || 0)); +}; + +SpriteMorph.prototype.setYPosition = function (num) { + this.shadowAttribute('y position'); + this.gotoXY(this.xPosition(), +num || 0, false, true); +}; + +SpriteMorph.prototype.changeYPosition = function (delta) { + this.setYPosition(this.yPosition() + (+delta || 0)); +}; + +SpriteMorph.prototype.glide = function ( + duration, + endX, + endY, + elapsed, + startPoint +) { + var fraction, endPoint, rPos; + endPoint = new Point(endX, endY); + fraction = Math.max(Math.min(elapsed / duration, 1), 0); + rPos = startPoint.add( + endPoint.subtract(startPoint).multiplyBy(fraction) + ); + this.gotoXY(rPos.x, rPos.y); +}; + +SpriteMorph.prototype.bounceOffEdge = function () { + // taking nested parts into account + var stage = this.parentThatIsA(StageMorph), + fb = this.nestingBounds(), + dirX, + dirY; + + if (!stage) {return null; } + if (stage.bounds.containsRectangle(fb)) {return null; } + + dirX = Math.cos(radians(this.heading - 90)); + dirY = -(Math.sin(radians(this.heading - 90))); + + if (fb.left() < stage.left()) { + dirX = Math.abs(dirX); + } + if (fb.right() > stage.right()) { + dirX = -(Math.abs(dirX)); + } + if (fb.top() < stage.top()) { + dirY = -(Math.abs(dirY)); + } + if (fb.bottom() > stage.bottom()) { + dirY = Math.abs(dirY); + } + + this.shadowAttribute('x position'); + this.shadowAttribute('y position'); + this.shadowAttribute('direction'); + + this.setHeading(degrees(Math.atan2(-dirY, dirX)) + 90); + this.setPosition(this.position().add( + fb.amountToTranslateWithin(stage.bounds) + )); + this.positionTalkBubble(); +}; + +// SpriteMorph coordinate conversion + +SpriteMorph.prototype.snapPoint = function(aPoint) { + var stage = this.parentThatIsA(StageMorph), + origin = stage.center(); + return new Point( + (aPoint.x - origin.x) / stage.scale, + (origin.y - aPoint.y) / stage.scale + ); +}; + +SpriteMorph.prototype.worldPoint = function(aSnapPoint) { + var stage = this.parentThatIsA(StageMorph); + return this.normalizePoint(aSnapPoint) + .multiplyBy(stage.scale) + .translateBy(stage.center()); +}; + +SpriteMorph.prototype.normalizePoint = function (snapPoint) { + return new Point(snapPoint.x, -snapPoint.y); +}; + +// SpriteMorph rotation center / fixation point manipulation + +SpriteMorph.prototype.setRotationX = function (absoluteX) { + this.setRotationCenter(new Point(absoluteX, this.yPosition())); +}; + +SpriteMorph.prototype.setRotationY = function (absoluteY) { + this.setRotationCenter(new Point(this.xPosition(), absoluteY)); +}; + +SpriteMorph.prototype.setRotationCenter = function (absoluteCoordinate) { + var delta, normal; + if (!this.costume) { + throw new Error('setting the rotation center requires a costume'); + } + this.shadowAttribute('costumes'); + delta = absoluteCoordinate.subtract( + new Point(this.xPosition(), this.yPosition()) + ).divideBy(this.scale).rotateBy(radians(90 - this.heading)); + normal = this.costume.rotationCenter.add(new Point(delta.x, -delta.y)); + this.costume.rotationCenter = normal; + this.changed(); + this.fixLayout(); + this.changed(); +}; + +SpriteMorph.prototype.moveRotationCenter = function () { + // make this a method of Snap >> SpriteMorph + this.world().activeHandle = new HandleMorph( + this, + null, + null, + null, + null, + 'movePivot' + ); +}; + +SpriteMorph.prototype.setPivot = function (worldCoordinate) { + var stage = this.parentThatIsA(StageMorph), + cntr; + if (stage) { + cntr = stage.center(); + this.setRotationCenter( + new Point( + (worldCoordinate.x - cntr.x) / stage.scale, + (cntr.y - worldCoordinate.y) / stage.scale + ) + ); + this.recordUserEdit( + 'sprite', + 'pivot', + this.xPosition(), + this.yPosition() + ); + } +}; + +// SpriteMorph dimension getters + +SpriteMorph.prototype.xCenter = function () { + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (this.center().x - stage.center().x) / stage.scale; + } + return this.center().x; +}; + +SpriteMorph.prototype.yCenter = function () { + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (stage.center().y - this.center().y) / stage.scale; + } + return this.center().y; +}; + +SpriteMorph.prototype.xLeft = function () { + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (this.left() - stage.center().x) / stage.scale; + } + return this.left(); +}; + +SpriteMorph.prototype.xRight = function () { + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (this.right() - stage.center().x) / stage.scale; + } + return this.right(); +}; + +SpriteMorph.prototype.yTop = function () { + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (stage.center().y - this.top()) / stage.scale; + } + return this.top(); +}; + +SpriteMorph.prototype.yBottom = function () { + var stage = this.parentThatIsA(StageMorph); + + if (!stage && this.parent.grabOrigin) { // I'm currently being dragged + stage = this.parent.grabOrigin.origin; + } + if (stage) { + return (stage.center().y - this.bottom()) / stage.scale; + } + return this.bottom(); +}; + +// SpriteMorph message broadcasting + +SpriteMorph.prototype.allMessageNames = function () { + var msgs = []; + this.allScripts().forEach(script => { + script.allChildren().forEach(morph => { + var txt; + if (morph instanceof InputSlotMorph && morph.choices && contains( + ['messagesMenu', 'messagesReceivedMenu'], + morph.choices + )) { + txt = morph.evaluate(); + if (isString(txt) && txt !== '') { + if (!msgs.some(m => snapEquals(m, txt))) { + msgs.push(txt); + } + } + } + }); + }); + return msgs; +}; + +SpriteMorph.prototype.allSendersOf = function (message, receiverName, known) { + return this.allScripts().filter(script => + script.isSending && script.isSending(message, receiverName, known) + ); +}; + +SpriteMorph.prototype.allHatBlocksFor = function (message) { + if (typeof message === 'number') { + message = message.toString(); + } + return this.scripts.children.filter(morph => { + var sel = morph.selector, + event; + if (sel) { + if (sel === 'receiveMessage') { + event = morph.inputs()[0].evaluate(); + return snapEquals(event, message) || + (event instanceof Array && snapEquals(event[0], message)) || + (event instanceof Array && + event[0] === 'any message' && + message !== '__shout__go__' && + message !== '__clone__init__'); + } + if (sel === 'receiveGo') { + return message === '__shout__go__'; + } + if (sel === 'receiveOnClone') { + return message === '__clone__init__'; + } + } + return false; + }); +}; + +SpriteMorph.prototype.allHatBlocksForKey = function (key) { + return this.scripts.children.filter(morph => { + if (morph.selector) { + if (morph.selector === 'receiveKey') { + var choice = morph.inputs()[0].evaluate(), + evt = choice instanceof Array ? choice[0] : choice; + return evt === key || evt === 'any key'; + } + } + return false; + }); +}; + +SpriteMorph.prototype.allHatBlocksForInteraction = function (interaction) { + return this.scripts.children.filter(morph => { + if (morph.selector) { + if (morph.selector === 'receiveInteraction') { + var choice = morph.inputs()[0].evaluate(); + return (choice instanceof Array ? + choice[0] + : choice + ) === interaction; + } + } + return false; + }); +}; + +SpriteMorph.prototype.allHatBlocksForUserEdit = function (spriteName) { + return this.scripts.children.filter(morph => { + if (morph.selector) { + if (morph.selector === 'receiveUserEdit') { + var choice = morph.inputs()[0].evaluate(), + evt = choice instanceof Array ? choice[0] : choice; + return evt === spriteName || evt === 'anything'; + } + } + return false; + }); +}; + +SpriteMorph.prototype.hasGenericHatBlocks = function () { + return this.scripts.children.some(morph => + morph.selector === 'receiveCondition' + ); +}; + +SpriteMorph.prototype.allGenericHatBlocks = function () { + return this.scripts.children.filter(morph => { + if (morph.selector) { + return morph.selector === 'receiveCondition'; + } + return false; + }); +}; + +SpriteMorph.prototype.allScripts = function () { + var all = this.scripts.children.slice(); + this.customBlocks.forEach(def => { + if (def.body) { + all.push(def.body.expression); + } + def.scripts.forEach(scr => all.push(scr)); + }); + if (this.globalBlocks) { + this.globalBlocks.forEach(def => { + if (def.body) { + all.push(def.body.expression); + } + def.scripts.forEach(scr => all.push(scr)); + }); + } + return all; +}; + +// SpriteMorph events + +SpriteMorph.prototype.mouseClickLeft = function () { + return this.receiveUserInteraction('clicked'); +}; + +SpriteMorph.prototype.mouseEnter = function () { + return this.receiveUserInteraction('mouse-entered'); +}; + +SpriteMorph.prototype.mouseDownLeft = function () { + return this.receiveUserInteraction('pressed'); +}; + +SpriteMorph.prototype.mouseScroll = function (y) { + return this.receiveUserInteraction('scrolled-' + (y > 0 ? 'up' : 'down')); +}; + +SpriteMorph.prototype.receiveUserInteraction = function ( + interaction, + rightAway, + threadSafe +) { + var stage = this.parentThatIsA(StageMorph), + procs = [], + hats; + if (!stage) {return; } // currently dragged + hats = this.allHatBlocksForInteraction(interaction); + hats.forEach(block => + procs.push(stage.threads.startProcess( + block, + this, + threadSafe || stage.isThreadSafe, + null, // export result + null, // callback + null, // is clicked + rightAway, // immediately + interaction === 'stopped' // atomic + )) + ); + return procs; +}; + +SpriteMorph.prototype.mouseDoubleClick = function () { + if (this.isTemporary) {return; } + this.edit(); +}; + +// SpriteMorph timer + +SpriteMorph.prototype.getTimer = function () { + var stage = this.parentThatIsA(StageMorph); + if (stage) { + return stage.getTimer(); + } + return 0; +}; + +// SpriteMorph tempo + +SpriteMorph.prototype.getTempo = function () { + var stage = this.parentThatIsA(StageMorph); + if (stage) { + return stage.getTempo(); + } + return 0; +}; + +// SpriteMorph last message + +SpriteMorph.prototype.getLastMessage = function () { + var stage = this.parentThatIsA(StageMorph); + if (stage) { + return stage.getLastMessage(); + } + return ''; +}; + +// SpriteMorph user prompting + +SpriteMorph.prototype.getLastAnswer = function () { + return this.parentThatIsA(StageMorph).lastAnswer; +}; + +// SpriteMorph thread count (for debugging) + +SpriteMorph.prototype.reportThreadCount = function () { + var stage = this.parentThatIsA(StageMorph); + if (stage) { + return stage.threads.processes.length; + } + return 0; +}; + +// SpriteMorph variable watchers (for palette checkbox toggling) + +SpriteMorph.prototype.findVariableWatcher = function (varName, isGlobal) { + var stage = this.parentThatIsA(StageMorph), + globals = this.globalVariables(); + if (stage === null) { + return null; + } + return detect( + stage.children, + morph => morph instanceof WatcherMorph && + (isGlobal ? morph.target === globals : morph.target === this.variables) && + morph.getter === varName + ); +}; + +SpriteMorph.prototype.toggleVariableWatcher = function (varName, isGlobal) { + var stage = this.parentThatIsA(StageMorph), + ide = this.parentThatIsA(IDE_Morph), + globals = this.globalVariables(), + watcher, + others; + + if (stage === null) { + return null; + } + watcher = this.findVariableWatcher(varName, isGlobal); + if (watcher !== null) { + if (watcher.isVisible) { + watcher.hide(); + } else { + watcher.show(); + watcher.fixLayout(); // re-hide hidden parts + watcher.keepWithin(stage); + } + ide.flushBlocksCache('variables'); + ide.refreshPalette(); + return; + } + + // if no watcher exists, create a new one + watcher = new WatcherMorph( + varName, + this.blockColor.variables, + isGlobal ? globals : this.variables, + varName + ); + watcher.setPosition(stage.position().add(10)); + others = stage.watchers(watcher.left()); + if (others.length > 0) { + watcher.setTop(others[others.length - 1].bottom()); + } + watcher.fixLayout(); + watcher.keepWithin(stage); + stage.add(watcher); + watcher.changed(); + return watcher; +}; + +SpriteMorph.prototype.showingVariableWatcher = function (varName, isGlobal) { + var stage = this.parentThatIsA(StageMorph), + watcher; + if (stage === null) { + return false; + } + watcher = this.findVariableWatcher(varName, isGlobal); + if (watcher) { + return watcher.isVisible; + } + return false; +}; + +SpriteMorph.prototype.deleteVariableWatcher = function (varName, isGlobal) { + var stage = this.parentThatIsA(StageMorph), + watcher; + if (stage === null) { + return null; + } + watcher = this.findVariableWatcher(varName, isGlobal); + if (watcher !== null) { + watcher.destroy(); + } +}; + +// SpriteMorph non-variable watchers + +SpriteMorph.prototype.toggleWatcher = function (selector, label, color) { + var stage = this.parentThatIsA(StageMorph), + ide = this.parentThatIsA(IDE_Morph), + watcher, + others; + if (!stage) { return; } + watcher = this.watcherFor(stage, selector); + if (watcher) { + if (watcher.isVisible) { + watcher.hide(); + } else { + watcher.show(); + watcher.fixLayout(); // re-hide hidden parts + watcher.keepWithin(stage); + } + if (watcher.isGlobal(selector)) { + ide.flushBlocksCache(); + ide.refreshPalette(); + } + return; + } + + // if no watcher exists, create a new one + watcher = new WatcherMorph( + label, + color, + WatcherMorph.prototype.isGlobal(selector) ? stage : this, + selector + ); + watcher.setPosition(stage.position().add(10)); + others = stage.watchers(watcher.left()); + if (others.length > 0) { + watcher.setTop(others[others.length - 1].bottom()); + } + stage.add(watcher); + watcher.fixLayout(); + watcher.keepWithin(stage); + watcher.changed(); + if (watcher.isGlobal(selector)) { + ide.flushBlocksCache(); + ide.refreshPalette(); + } +}; + +SpriteMorph.prototype.showingWatcher = function (selector) { + var stage = this.parentThatIsA(StageMorph), + watcher; + if (stage === null) { + return false; + } + watcher = this.watcherFor(stage, selector); + if (watcher) { + return watcher.isVisible; + } + return false; +}; + +SpriteMorph.prototype.watcherFor = function (stage, selector) { + return detect( + stage.children, + morph => morph instanceof WatcherMorph && + morph.getter === selector && + morph.target === (morph.isGlobal(selector) ? stage : this) + ); +}; + +// SpriteMorph custom blocks + +SpriteMorph.prototype.deleteAllBlockInstances = function (definition) { + var stage, + blocks = definition.isGlobal ? this.allBlockInstances(definition) + : this.allIndependentInvocationsOf(definition.blockSpec()); + + blocks.forEach(each => each.deleteBlock()); + + // purge custom block definitions of "corpses" + // i.e. blocks that have been marked for deletion + if (definition.isGlobal) { + stage = this.parentThatIsA(StageMorph); + if (stage) { + stage.globalBlocks.forEach(def => def.purgeCorpses()); + stage.children.concat(stage).forEach(sprite => { + if (sprite.isSnapObject) { + sprite.customBlocks.forEach(def => def.purgeCorpses()); + } + }); + } + } else { + this.allSpecimens().concat(this).forEach(sprite => + sprite.customBlocks.forEach(def => def.purgeCorpses()) + ); + } +}; + +SpriteMorph.prototype.allBlockInstances = function (definition) { + var stage, objects, + blocks = [], + inDefinitions = []; + if (definition.isGlobal) { + stage = this.parentThatIsA(StageMorph); + objects = stage.children.filter(morph => + morph instanceof SpriteMorph + ); + objects.slice().forEach(sprite => { + if (sprite.solution) { + objects.push(sprite.solution); + } + }); + objects.push(stage); + objects.forEach(sprite => + blocks = blocks.concat( + sprite.allLocalBlockInstances(definition) + ) + ); + stage.globalBlocks.forEach(def => { + def.scripts.forEach(eachScript => + eachScript.allChildren().forEach(c => { + if (c.isCustomBlock && (c.definition === definition)) { + inDefinitions.push(c); + } + }) + ); + if (def.body) { + def.body.expression.allChildren().forEach(c => { + if (c.isCustomBlock && (c.definition === definition)) { + inDefinitions.push(c); + } + }); + } + }); + return blocks.concat(inDefinitions).concat( + stage.allBlockInstancesInData(definition) + ); + } + return this.allLocalBlockInstances(definition); +}; + +SpriteMorph.prototype.allIndependentInvocationsOf = function (aSpec) { + var blocks; + if (this.exemplar && this.exemplar.getMethod(aSpec)) { + // shadows an inherited method, don't delete + return []; + } + blocks = this.allInvocationsOf(aSpec); + this.instances.forEach(sprite => + sprite.addAllInvocationsOf(aSpec, blocks) + ); + return blocks; +}; + +SpriteMorph.prototype.allDependentInvocationsOf = function (aSpec) { + var blocks; + blocks = this.allInvocationsOf(aSpec); + this.instances.forEach(sprite => + sprite.addAllInvocationsOf(aSpec, blocks) + ); + return blocks.concat( + this.parentThatIsA(StageMorph).allBlockInvocationsInData(aSpec, this) + ); +}; + +SpriteMorph.prototype.allInvocationsOf = function (aSpec) { + // only inside the receiver, without the inheritance branches + var inScripts, inDefinitions, inBlockEditors, blocks; + + inScripts = this.scripts.allChildren().filter(c => + c.isCustomBlock && !c.isGlobal && (c.blockSpec === aSpec) + ); + + inDefinitions = []; + this.customBlocks.forEach(def => { + def.scripts.forEach(eachScript => + eachScript.allChildren().forEach(c => { + if (c.isCustomBlock && !c.isGlobal && + (c.blockSpec === aSpec) + ) { + inDefinitions.push(c); + } + }) + ); + if (def.body) { + def.body.expression.allChildren().forEach(c => { + if (c.isCustomBlock && !c.isGlobal && + (c.blockSpec === aSpec) + ) { + inDefinitions.push(c); + } + }); + } + }); + + inBlockEditors = this.allEditorBlockInstances(null, aSpec); + blocks = inScripts.concat(inDefinitions).concat(inBlockEditors); + return blocks; +}; + +SpriteMorph.prototype.addAllInvocationsOf = function (aSpec, anArray) { + if (!this.getLocalMethod(aSpec)) { + this.allInvocationsOf(aSpec).forEach(block => + anArray.push(block) + ); + this.instances.forEach(sprite => + sprite.addAllInvocationsOf(aSpec, anArray) + ); + } +}; + + +SpriteMorph.prototype.allLocalBlockInstances = function (definition) { + var inScripts, inDefinitions, inBlockEditors, inPalette, result; + + inScripts = this.scripts.allChildren().filter(c => + c.isCustomBlock && (c.definition === definition) + ); + + inDefinitions = []; + this.customBlocks.forEach(def => { + if (def.body) { + def.body.expression.allChildren().forEach(c => { + if (c.isCustomBlock && (c.definition === definition)) { + inDefinitions.push(c); + } + }); + } + }); + + inBlockEditors = this.allEditorBlockInstances(definition); + inPalette = this.paletteBlockInstance(definition); + + result = inScripts.concat(inDefinitions).concat(inBlockEditors); + if (inPalette) { + result.push(inPalette); + } + return result; +}; + +SpriteMorph.prototype.allEditorBlockInstances = function (definition, spec) { + // either pass a definition for global custom blocks + // or a spec for local ones + var inBlockEditors = [], + world = this.world(); + + if (!world) {return []; } // when copying a sprite + + this.world().children.forEach(morph => { + if (morph instanceof BlockEditorMorph) { + morph.body.contents.allChildren().forEach(block => { + if (definition) { // global + if (!block.isPrototype + && !(block instanceof PrototypeHatBlockMorph) + && (block.definition === definition)) { + inBlockEditors.push(block); + } + } else { // local + if (block.isCustomBlock + && !block.isGlobal + && !block.isPrototype + && !(block instanceof PrototypeHatBlockMorph) + && (block.blockSpec === spec)) { + inBlockEditors.push(block); + } + } + }); + } + }); + return inBlockEditors; +}; + +SpriteMorph.prototype.paletteBlockInstance = function (definition) { + var ide = this.parentThatIsA(IDE_Morph); + if (!ide) {return null; } + return detect( + ide.palette.contents.children, + block => block.isCustomBlock && (block.definition === definition) + ); +}; + +SpriteMorph.prototype.usesBlockInstance = function ( + definition, + forRemoval, // optional bool + skipGlobals, // optional bool + skipBlocks // optional array with ignorable definitions +) { + var inDefinitions, + inScripts = detect( + this.scripts.allChildren(), + c => c.isCustomBlock && (c.definition === definition) + ); + + if (inScripts) {return true; } + + if (definition.isGlobal && !skipGlobals) { + inDefinitions = []; + this.parentThatIsA(StageMorph).globalBlocks.forEach(def => { + if (forRemoval && (definition === def)) {return; } + if (skipBlocks && contains(skipBlocks, def)) {return; } + if (def.body) { + def.body.expression.allChildren().forEach(c => { + if (c.isCustomBlock && (c.definition === definition)) { + inDefinitions.push(c); + } + }); + } + }); + if (inDefinitions.length > 0) {return true; } + } + + inDefinitions = []; + this.customBlocks.forEach(def => { + if (def.body) { + def.body.expression.allChildren().forEach(c => { + if (c.isCustomBlock && (c.definition === definition)) { + inDefinitions.push(c); + } + }); + } + }); + return (inDefinitions.length > 0); +}; + +SpriteMorph.prototype.doubleDefinitionsFor = function (definition) { + var spec = definition.blockSpec(), + blockList, + idx, + stage; + + if (definition.isGlobal) { + stage = this.parentThatIsA(StageMorph); + if (!stage) {return []; } + blockList = stage.globalBlocks; + } else { + blockList = this.customBlocks; + } + idx = blockList.indexOf(definition); + if (idx === -1) {return []; } + return blockList.filter((def, i) => + def.blockSpec() === spec && (i !== idx) + ); +}; + +SpriteMorph.prototype.replaceDoubleDefinitionsFor = function (definition) { + var doubles = this.doubleDefinitionsFor(definition), + stage, + ide; + doubles.forEach(double => + this.allBlockInstances(double).forEach(block => { + block.definition = definition; + block.refresh(); + }) + ); + if (definition.isGlobal) { + stage = this.parentThatIsA(StageMorph); + stage.globalBlocks = stage.globalBlocks.filter(def => + !contains(doubles, def) + ); + } else { + this.customBlocks = this.customBlocks.filter(def => + !contains(doubles, def) + ); + this.allDependentInvocationsOf( + definition.blockSpec() + ).reverse().forEach( + block => block.refresh(definition) + ); + } + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.flushPaletteCache(); + ide.refreshPalette(); + } +}; + +// SpriteMorph controlling generic WHEN hats + +SpriteMorph.prototype.pauseGenericHatBlocks = function () { + var stage = this.parentThatIsA(StageMorph), + ide = this.parentThatIsA(IDE_Morph); + if (this.hasGenericHatBlocks()) { + stage.enableCustomHatBlocks = true; + stage.threads.pauseCustomHatBlocks = true; + ide.controlBar.stopButton.refresh(); + } +}; + +// SpriteMorph inheritance - general + +SpriteMorph.prototype.chooseExemplar = function () { + var stage = this.parentThatIsA(StageMorph), + other = stage.children.filter(m => + m instanceof SpriteMorph && + !m.isTemporary && + (!contains(m.allExemplars(), this)) + ), + menu; + menu = new MenuMorph( + aSprite => this.setExemplar(aSprite), + localize('current parent') + + ':\n' + + (this.exemplar ? this.exemplar.name : localize('none')) + ); + other.forEach(eachSprite => + menu.addItem( + eachSprite.name, + eachSprite, + null, // hint + null, // color + null, // bold + null, // italic + null, // doubleClickAction + null, // shortcut + true // verbatim + ) + ); + menu.addLine(); + menu.addItem(localize('none'), null); + menu.popUpAtHand(this.world()); +}; + +SpriteMorph.prototype.setExemplar = function (another, enableError) { + var ide; + + // check for circularity + if (another instanceof SpriteMorph && + contains(another.allExemplars(), this)) { + if (enableError) { + throw new Error( + localize('unable to inherit\n(disabled or circular?)') + ); + } + return; // silently fail so stored projects can still be loaded + } + + this.emancipate(); + this.exemplar = another; + if (another) { + this.variables.parentFrame = another.variables; + another.addSpecimen(this); + } else { + this.variables.parentFrame = this.globalVariables(); + } + if (this.isTemporary) { + this.cloneOriginName = another.cloneOriginName || another.name; + } else { + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.flushBlocksCache(); + ide.refreshPalette(); + } + } +}; + +SpriteMorph.prototype.prune = function () { + // sever ties with all my specimen, if any, + this.instances.forEach(child => { + child.shadowAllAttributes(); + child.shadowAllMethods(); + child.shadowAllVars(); + child.exemplar = null; + }); + this.instances = []; +}; + +SpriteMorph.prototype.emancipate = function () { + // sever all relations with my exemplar, if any, + // and make sure I am the root of my specimen + if (this.exemplar) { + if (!this.isTemporary) { + this.shadowAllAttributes(); + this.shadowAllMethods(); + this.shadowAllVars(); + } + this.exemplar.removeSpecimen(this); // optimization + this.exemplar = null; + } +}; + +SpriteMorph.prototype.allExemplars = function () { + // including myself + var all = [], + current = this; + while (!isNil(current)) { + all.push(current); + current = current.exemplar; + } + return all; +}; + +SpriteMorph.prototype.specimens = function () { + // without myself + return this.instances; +}; + +SpriteMorph.prototype.allSpecimens = function () { + // without myself + var all = this.instances.slice(); + this.instances.forEach(child => + all.push.apply(all, child.allSpecimens()) + ); + return all; +}; + +SpriteMorph.prototype.addSpecimen = function (another) { + // private - use setExemplar() to establish an inheritance relationship + this.instances.push(another); +}; + +SpriteMorph.prototype.removeSpecimen = function(another) { + // private - use setExemplar(null) to cancel an inheritance relationship + var idx = this.instances.indexOf(another); + if (idx !== -1) { + this.instances.splice(idx, 1); + } +}; + +// SpriteMorph inheritance - attributes + +SpriteMorph.prototype.inheritsAttribute = function (aName) { + return !isNil(this.exemplar) && contains(this.inheritedAttributes, aName); +}; + +SpriteMorph.prototype.updatePropagationCache = function () { + // private - indicate whether one of my inherited attributes is technically + // propagated down from my exemplar, instead of truly shared. + // (only) needed for internal optimization caching + this.cachedPropagation = !isNil(this.exemplar) && detect( + [ + 'x position', + 'y position', + 'direction', + 'size', + 'costume #', + 'volume', + 'balance', + 'shown?', + 'pen down?' + ], + att => contains(this.inheritedAttributes, att) + ); +}; + +SpriteMorph.prototype.shadowedAttributes = function () { + // answer an array of attribute names that can be deleted/shared + var inherited = this.inheritedAttributes; + return this.attributes.filter(each => !contains(inherited, each)); +}; + +SpriteMorph.prototype.shadowAllAttributes = function () { + this.attributes.forEach(att => + this.shadowAttribute(att) + ); +}; + +SpriteMorph.prototype.shadowAttribute = function (aName) { + var ide, wardrobe, jukebox, + pos; + if (!this.inheritsAttribute(aName)) { + return; + } + ide = this.parentThatIsA(IDE_Morph); + this.inheritedAttributes = this.inheritedAttributes.filter(each => + each !== aName + ); + if (aName === 'costumes') { + wardrobe = new List(); + this.costumes.asArray().forEach(costume => { + var cst = costume.copy(); + wardrobe.add(cst); + if (costume === this.costume) { + this.wearCostume(cst); + } + }); + this.costumes = wardrobe; + this.instances.forEach(obj => { + if (obj.inheritsAttribute('costumes')) { + obj.refreshInheritedAttribute('costumes'); + } + }); + } else if (aName === 'sounds') { + jukebox = new List(); + this.sounds.asArray().forEach(sound => jukebox.add(sound.copy())); + this.sounds = jukebox; + this.instances.forEach(obj => { + if (obj.inheritsAttribute('sounds')) { + obj.refreshInheritedAttribute('sounds'); + } + }); + } else if (aName === 'scripts') { + ide.stage.threads.stopAllForReceiver(this); + pos = this.scripts.position(); + this.scripts = this.exemplar.scripts.fullCopy(); + if (ide && (contains(ide.currentSprite.allExemplars(), this))) { + ide.createSpriteEditor(); + ide.fixLayout('selectSprite'); + this.scripts.fixMultiArgs(); + this.scripts.setPosition(pos); + ide.spriteEditor.adjustScrollBars(); + } + this.instances.forEach(obj => { + if (obj.inheritsAttribute('scripts')) { + obj.refreshInheritedAttribute('scripts'); + } + }); + } else { + this.updatePropagationCache(); + if (ide && !this.isTemporary) { + ide.flushBlocksCache(); // optimization: specify category if known + ide.refreshPalette(); + } + } +}; + +SpriteMorph.prototype.inheritAttribute = function (aName) { + var ide = this.parentThatIsA(IDE_Morph); + if (!this.exemplar || !contains(this.attributes, aName)) { + return; + } + if (!this.inheritsAttribute(aName)) { + this.inheritedAttributes.push(aName); + this.refreshInheritedAttribute(aName); + if (ide) { + ide.flushBlocksCache(); // optimization: specify category + ide.refreshPalette(); + } + } +}; + +SpriteMorph.prototype.refreshInheritedAttribute = function (aName) { + var ide, idx; + switch (aName) { + case 'x position': + case 'y position': + this.cachedPropagation = true; + this.gotoXY(this.xPosition(), this.yPosition(), false, true); + break; + case 'direction': + this.cachedPropagation = true; + this.setHeading(this.direction(), true); + break; + case 'size': + this.cachedPropagation = true; + this.setScale(this.getScale(), true); + break; + case 'costume #': + this.cachedPropagation = true; + if (this.inheritsAttribute('costumes')) { + // if inheriting the whole wardrobe, + // just switch to the exemplar's costume + this.wearCostume(this.exemplar.costume, true); + } else { + // otherwise switch to the own costume of the + // corresponing number + this.doSwitchToCostume(this.getCostumeIdx(), true); + } + break; + case 'volume': + this.cachedPropagation = true; + this.setVolume(this.getVolume(), true); + break; + case 'shown?': + this.cachedPropagation = true; + this.setVisibility(this.reportShown(), true); + break; + case 'pen down?': + this.cachedPropagation = true; + this.setPenDown(this.getPenDown(), true); + break; + case 'balance': + this.cachedPropagation = true; + this.setPan(this.getPan(), true); + break; + case 'costumes': + idx = this.getCostumeIdx(); + this.costumes = this.exemplar.costumes; + this.doSwitchToCostume(idx, true); + this.instances.forEach(sprite => { + if (sprite.inheritsAttribute('costumes')) { + sprite.refreshInheritedAttribute('costumes'); + } + }); + break; + case 'sounds': + this.sounds = this.exemplar.sounds; + this.instances.forEach(sprite => { + if (sprite.inheritsAttribute('sounds')) { + sprite.refreshInheritedAttribute('sounds'); + } + }); + break; + case 'scripts': + this.scripts = this.exemplar.scripts; + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.stage.threads.stopAllForReceiver(this); + if (contains(ide.currentSprite.allExemplars(), this)) { + ide.createSpriteEditor(); + ide.fixLayout('selectSprite'); + } + } + this.instances.forEach(sprite => { + if (sprite.inheritsAttribute('scripts')) { + sprite.refreshInheritedAttribute('scripts'); + } + }); + break; + default: + nop(); + } +}; + +SpriteMorph.prototype.toggleInheritanceForAttribute = function (aName) { + if (this.inheritsAttribute(aName)) { + this.shadowAttribute(aName); + } else { + this.inheritAttribute(aName); + } +}; + +// SpriteMorph inheritance - variables + +SpriteMorph.prototype.globalVariables = function () { + var current = this.variables.parentFrame; + while (current.owner) { + current = current.parentFrame; + } + return current; +}; + +SpriteMorph.prototype.shadowAllVars = function () { + this.inheritedVariableNames().forEach(name => + this.shadowVar(name, this.variables.getVar(name)) + ); +}; + +SpriteMorph.prototype.shadowVar = function (name, value) { + var ide; + this.variables.addVar(name, value); + if (!this.isTemporary) { + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.flushBlocksCache('variables'); + ide.refreshPalette(); + } + } +}; + +SpriteMorph.prototype.toggleInheritedVariable = function (vName) { + if (contains(this.inheritedVariableNames(true), vName)) { // is shadowed + this.deleteVariable(vName); + } else if (contains(this.inheritedVariableNames(), vName)) { // inherited + this.shadowVar(vName, this.variables.getVar(vName)); + } +}; + +SpriteMorph.prototype.inheritedVariableNames = function (shadowedOnly) { + var names = [], + own = this.variables.names(), + current = this.variables.parentFrame; + + function test(each) { + return shadowedOnly ? contains(own, each) : !contains(own, each); + } + + while (current.owner instanceof SpriteMorph) { + names.push.apply( + names, + current.names().filter(test) + ); + current = current.parentFrame; + } + return names; +}; + +SpriteMorph.prototype.deletableVariableNames = function () { + var locals = this.variables.names(), + inherited = this.inheritedVariableNames(); + return locals.concat( + this.globalVariables().names().filter(each => + !contains(locals, each) && !contains(inherited, each) + ) + ); +}; + +SpriteMorph.prototype.allLocalVariableNames = function (sorted, all) { + // "all" includes hidden ones in the palette + var data = this.variables.allNames(this.globalVariables(), all); + + function alphabetically(x, y) { + return x.toLowerCase() < y.toLowerCase() ? -1 : 1; + } + + if (sorted) { + data.sort(alphabetically); + } + return data; +}; + +SpriteMorph.prototype.allGlobalVariableNames = function (sorted, all) { + var data = this.globalVariables().names(all); + + function alphabetically(x, y) { + return x.toLowerCase() < y.toLowerCase() ? -1 : 1; + } + + if (sorted) { + data.sort(alphabetically); + } + return data; +}; + +// SpriteMorph inheritance - custom blocks + +SpriteMorph.prototype.getMethod = function (spec) { + return this.allBlocks()[spec]; +}; + +SpriteMorph.prototype.getLocalMethod = function (spec) { + return this.ownBlocks()[spec]; +}; + +SpriteMorph.prototype.ownBlocks = function () { + var dict = {}; + this.customBlocks.forEach(def => + dict[def.blockSpec()] = def + ); + return dict; +}; + +SpriteMorph.prototype.allBlocks = function (valuesOnly) { + var dict = {}; + this.allExemplars().reverse().forEach(sprite => + sprite.customBlocks.forEach(def => + dict[def.blockSpec()] = def + ) + ); + if (valuesOnly) { + return Object.keys(dict).map(key => dict[key]); + } + return dict; +}; + +SpriteMorph.prototype.inheritedBlocks = function (valuesOnly) { + var dict = {}, + own = Object.keys(this.ownBlocks()), + others = this.allExemplars().reverse(); + others.pop(); + others.forEach(sprite => + sprite.customBlocks.forEach(def => { + var spec = def.blockSpec(); + if (!contains(own, spec)) { + dict[spec] = def; + } + }) + ); + if (valuesOnly) { + return Object.keys(dict).map(key => dict[key]); + } + return dict; +}; + +SpriteMorph.prototype.shadowAllMethods = function () { + var ide; + this.inheritedMethods().forEach(dup => + this.customBlocks.push(dup) + ); + if (!this.isTemporary) { + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.flushPaletteCache(); + ide.refreshPalette(); + } + } +}; + +SpriteMorph.prototype.inheritedMethods = function () { + // private - pre-serialization preparation + return this.inheritedBlocks(true).map(def => + def.copyAndBindTo(this, true) // header only + ); +}; + +// SpriteMorph thumbnail + +SpriteMorph.prototype.thumbnail = function (extentPoint, recycleMe, noCorpse) { + // answer a new Canvas of extentPoint dimensions containing + // my thumbnail representation keeping the originial aspect ratio + // a "recycleMe canvas can be passed for re-use + var src = this.getImage(), // at this time sprites aren't composite morphs + w = this.width(), + h = this.height(), + scale = Math.min( + (extentPoint.x / w), + (extentPoint.y / h) + ), + xOffset = (extentPoint.x - (w * scale)) / 2, + yOffset = (extentPoint.y - (h * scale)) / 2, + trg = newCanvas(extentPoint, false, recycleMe), + ctx = trg.getContext('2d'); + + function xOut(style, alpha, width) { + var inset = Math.min(extentPoint.x, extentPoint.y) / 10; + ctx.strokeStyle = style; + ctx.globalAlpha = alpha; + ctx.compositeOperation = 'lighter'; + ctx.lineWidth = width || 1; + ctx.moveTo(inset, inset); + ctx.lineTo(trg.width - inset, trg.height - inset); + ctx.moveTo(inset, trg.height - inset); + ctx.lineTo(trg.width - inset, inset); + ctx.stroke(); + } + + ctx.save(); + if (this.isCorpse && !noCorpse) { + ctx.globalAlpha = 0.3; + } + if (w && h && src.width && src.height) { + ctx.scale(scale, scale); + ctx.drawImage( + src, + Math.floor(xOffset / scale), + Math.floor(yOffset / scale) + ); + } + if (this.isCorpse && !noCorpse) { + ctx.restore(); + xOut('white', 0.8, 6); + xOut('black', 0.8, 1); + } + ctx.restore(); + return trg; +}; + +SpriteMorph.prototype.fullThumbnail = function (extentPoint, recycleMe) { + // containing parts and anchor symbols, if any + var thumb = this.thumbnail(extentPoint, recycleMe), + ctx = thumb.getContext('2d'), + ext = extentPoint.divideBy(3), + i = 0; + + ctx.restore(); + if (this.anchor) { + ctx.drawImage( + this.anchor.thumbnail(ext), + 0, + 0 + ); + } + for (i = 0; i < 3; i += 1) { + if (this.parts[i]) { + ctx.drawImage( + this.parts[i].thumbnail(ext), + i * ext.x, + extentPoint.y - ext.y + ); + } + } + return thumb; +}; + +// SpriteMorph Boolean visual representation + +SpriteMorph.prototype.booleanMorph = function (bool) { + var sym = new BooleanSlotMorph(bool); + sym.isStatic = true; + sym.fixLayout(); + return sym; +}; + +// SpriteMorph nesting +/* + simulate Morphic trees +*/ + +SpriteMorph.prototype.attachTo = function (aSprite) { + aSprite.attachPart(this); +}; + +SpriteMorph.prototype.attachPart = function (aSprite) { + var v = Date.now(); + if (aSprite.anchor) { + aSprite.anchor.detachPart(aSprite); + } + this.parts.push(aSprite); + this.version = v; + aSprite.anchor = this; + this.allParts().forEach(part => + part.nestingScale = part.scale + ); + aSprite.version = v; +}; + +SpriteMorph.prototype.detachPart = function (aSprite) { + var idx = this.parts.indexOf(aSprite), + v; + if (idx !== -1) { + v = Date.now(); + this.parts.splice(idx, 1); + this.version = v; + aSprite.anchor = null; + aSprite.version = v; + } +}; + +SpriteMorph.prototype.detachAllParts = function () { + var v = Date.now(); + + this.parts.forEach(part => { + part.anchor = null; + part.version = v; + }); + this.parts = []; + this.version = v; +}; + +SpriteMorph.prototype.detachFromAnchor = function () { + if (this.anchor) { + this.anchor.detachPart(this); + } +}; + +SpriteMorph.prototype.allParts = function () { + // includes myself + var result = [this]; + this.parts.forEach(part => + result = result.concat(part.allParts()) + ); + return result; +}; + +SpriteMorph.prototype.allAnchors = function () { + // includes myself + var result = [this]; + if (this.anchor !== null) { + result = result.concat(this.anchor.allAnchors()); + } + return result; +}; + +SpriteMorph.prototype.recordLayers = function () { + var stage = this.parentThatIsA(StageMorph); + if (!stage) { + this.layerCache = null; + return; + } + this.layers = this.allParts(); + this.layers.forEach(part => { + var bubble = part.talkBubble(); + if (bubble) {bubble.hide(); } + }); + this.layers.sort((x, y) => + stage.children.indexOf(x) < stage.children.indexOf(y) ? + -1 : 1 + ); +}; + +SpriteMorph.prototype.restoreLayers = function () { + if (this.layers && this.layers.length > 1) { + this.layers.forEach(sprite => { + sprite.comeToFront(); + sprite.positionTalkBubble(); + }); + } + this.layers = null; +}; + +// SpriteMorph destroying + +SpriteMorph.prototype.destroy = function () { + // make sure to sever all inheritance ties to other sprites + if (this.anchor) { + this.anchor.detachPart(this); + } + this.emancipate(); + if (!this.isTemporary) { + this.prune(); + } + SpriteMorph.uber.destroy.call(this); +}; + +// SpriteMorph highlighting + +SpriteMorph.prototype.flash = function () { + var world = this.world(); + this.addHighlight(); + world.animations.push(new Animation( + nop, + nop, + 0, + 800, + nop, + () => this.removeHighlight() + )); +}; + +SpriteMorph.prototype.addHighlight = function (oldHighlight) { + var isHidden = !this.isVisible, + highlight; + + if (isHidden) {this.show(); } + highlight = this.highlight( + oldHighlight ? oldHighlight.color : this.highlightColor, + this.highlightBorder + ); + this.addBack(highlight); + this.fullChanged(); + if (isHidden) {this.hide(); } + return highlight; +}; + +SpriteMorph.prototype.removeHighlight = function () { + var highlight = this.getHighlight(); + if (highlight !== null) { + this.fullChanged(); + this.removeChild(highlight); + } + return highlight; +}; + +SpriteMorph.prototype.toggleHighlight = function () { + if (this.getHighlight()) { + this.removeHighlight(); + } else { + this.addHighlight(); + } +}; + +SpriteMorph.prototype.highlight = function (color, border) { + var highlight = new SpriteHighlightMorph(), + fb = this.bounds, // sprites are not nested in a Morphic way + edge = border, + ctx; + + highlight.bounds.setExtent(fb.extent().add(edge * 2)); + highlight.color = color; + highlight.cachedImage = this.highlightImage(color, border); + ctx = highlight.cachedImage.getContext('2d'); + ctx.drawImage( + this.highlightImage(WHITE, 4), + border - 4, + border - 4 + ); + ctx.drawImage( + this.highlightImage(new Color(50, 50, 50), 2), + border - 2, + border - 2 + ); + ctx.drawImage( + this.highlightImage(WHITE, 1), + border - 1, + border - 1 + ); + highlight.setPosition(fb.origin.subtract(new Point(edge, edge))); + return highlight; +}; + +SpriteMorph.prototype.highlightImage = function (color, border) { + var fb, img, hi, ctx, out; + fb = this.extent(); + img = this.getImage(); + + hi = newCanvas(fb.add(border * 2)); + ctx = hi.getContext('2d'); + + ctx.drawImage(img, 0, 0); + ctx.drawImage(img, border, 0); + ctx.drawImage(img, border * 2, 0); + ctx.drawImage(img, border * 2, border); + ctx.drawImage(img, border * 2, border * 2); + ctx.drawImage(img, border, border * 2); + ctx.drawImage(img, 0, border * 2); + ctx.drawImage(img, 0, border); + + ctx.globalCompositeOperation = 'destination-out'; + ctx.drawImage(img, border, border); + + out = newCanvas(fb.add(border * 2)); + ctx = out.getContext('2d'); + ctx.drawImage(hi, 0, 0); + ctx.globalCompositeOperation = 'source-atop'; + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, out.width, out.height); + + return out; +}; + +SpriteMorph.prototype.getHighlight = function () { + var highlights = this.children.slice(0).reverse().filter(child => + child instanceof SpriteHighlightMorph + ); + if (highlights.length !== 0) { + return highlights[0]; + } + return null; +}; + +// SpriteMorph nesting events + +SpriteMorph.prototype.mouseEnterDragging = function () { + var obj; + if (!this.enableNesting) {return; } + obj = this.world().hand.children[0]; + if (this.wantsDropOf(obj)) { + this.addHighlight(); + } +}; + +SpriteMorph.prototype.mouseLeave = function () { + this.receiveUserInteraction('mouse-departed'); + if (!this.enableNesting) {return; } + this.removeHighlight(); +}; + +SpriteMorph.prototype.wantsDropOf = function (morph) { + // allow myself to be the anchor of another sprite + // by drag & drop + return this.enableNesting + && morph instanceof SpriteIconMorph + && !contains(morph.object.allParts(), this); +}; + +SpriteMorph.prototype.reactToDropOf = function (morph, hand) { + this.removeHighlight(); + this.attachPart(morph.object); + this.world().add(morph); + morph.slideBackTo(hand.grabOrigin); +}; + +// SpriteMorph screenshots + +SpriteMorph.prototype.newCostumeName = function (name, ignoredCostume) { + var ix = name.indexOf('('), + stem = (ix < 0) ? name : name.substring(0, ix), + count = 1, + newName = stem, + all = this.costumes.asArray().filter(each => + each !== ignoredCostume + ).map(each => each.name), + exist = e => snapEquals(e, newName); + while (all.some(exist)) { + count += 1; + newName = stem + '(' + count + ')'; + } + return newName; +}; + +SpriteMorph.prototype.doScreenshot = function (imgSource, data) { + var canvas, + stage = this.parentThatIsA(StageMorph), + costume; + data = this.newCostumeName(data); + if (imgSource[0] === undefined) { + return; + } + if (imgSource[0] === "pen trails") { + canvas = stage.trailsCanvas; + costume = new Costume(canvas, data).copy(); // prevent mutation + } else if (imgSource[0] === "stage image") { + canvas = stage.fullImage(); + costume = new Costume(canvas, data); + } + this.addCostume(costume); +}; + +// SpriteMorph adding sounds + +SpriteMorph.prototype.newSoundName = function (name, ignoredSound) { + var ix = name.indexOf('('), + stem = (ix < 0) ? name : name.substring(0, ix), + count = 1, + newName = stem, + all = this.sounds.asArray().filter(each => + each !== ignoredSound + ).map(each => each.name), + exist = e => snapEquals(e, newName); + while (all.some(exist)) { + count += 1; + newName = stem + '(' + count + ')'; + } + return newName; +}; + +// SpriteMorph recording and synching user edits + +SpriteMorph.prototype.recordUserEdit = function (...details) { + var ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.recordUnsavedChanges( + this.name, + Array.from(details).concat(details[0] === 'scripts' ? + [this.scriptsOnlyXML()] + : [] + ) + ); + } +}; + +SpriteMorph.prototype.scriptsOnlyXML = function () { + var serializer = this.parentThatIsA(IDE_Morph)?.serializer || + new SnapSerializer(); + return '' + + serializer.serialize(this.scripts) + + ''; +}; + +SpriteMorph.prototype.synchScriptsFrom = function (xml) { + var serializer = this.parentThatIsA(IDE_Morph)?.serializer || + new SnapSerializer(), + bak = this.scripts.children; + try { + this.scripts.children = []; + serializer.loadScripts( + this, + this.scripts, + serializer.parse(xml, true) + ); + this.scripts.changed(); + this.recordUserEdit( + 'sprite', + 'synch', + 'scripts', + xml + ); + } catch (err) { + this.scripts.children = bak; + throw(err); + } +}; + +// SpriteHighlightMorph ///////////////////////////////////////////////// + +// SpriteHighlightMorph inherits from Morph: + +SpriteHighlightMorph.prototype = new Morph(); +SpriteHighlightMorph.prototype.constructor = SpriteHighlightMorph; +SpriteHighlightMorph.uber = Morph.prototype; + +// SpriteHighlightMorph instance creation: + +function SpriteHighlightMorph() { + this.init(); +} + +SpriteHighlightMorph.prototype.init = function () { + SpriteHighlightMorph.uber.init.call(this); + this.isCachingImage = true; +}; + +// StageMorph ///////////////////////////////////////////////////////// + +/* + I inherit from FrameMorph and copy from SpriteMorph. +*/ + +// StageMorph inherits from FrameMorph: + +StageMorph.prototype = new FrameMorph(); +StageMorph.prototype.constructor = StageMorph; +StageMorph.uber = FrameMorph.prototype; + +// StageMorph preferences settings + +StageMorph.prototype.dimensions = new Point(480, 360); // fallback unscaled ext + +StageMorph.prototype.isCachingPrimitives + = SpriteMorph.prototype.isCachingPrimitives; + +StageMorph.prototype.sliderColor + = SpriteMorph.prototype.sliderColor; + +StageMorph.prototype.paletteTextColor + = SpriteMorph.prototype.paletteTextColor; + +StageMorph.prototype.hiddenPrimitives = {}; +StageMorph.prototype.codeMappings = {}; +StageMorph.prototype.codeHeaders = {}; +StageMorph.prototype.enableCodeMapping = false; +StageMorph.prototype.enableInheritance = true; +StageMorph.prototype.enableSublistIDs = false; +StageMorph.prototype.enablePenLogging = false; // for SVG generation + +// StageMorph instance creation + +function StageMorph(globals) { + this.init(globals); +} + +StageMorph.prototype.init = function (globals) { + this.name = localize('Stage'); + this.dimensions = new Point(480, 360); // unscaled extent + this.instrument = null; + this.threads = new ThreadManager(); + this.variables = new VariableFrame(globals || null, this); + this.scripts = new ScriptsMorph(); + this.customBlocks = []; + this.globalBlocks = []; + this.costumes = new List(); + this.costumes.type = 'costume'; + this.costume = null; + this.sounds = new List(); + this.sounds.type = 'sound'; + this.version = Date.now(); // for observers + this.isFastTracked = false; + this.enableCustomHatBlocks = true; + this.cloneCount = 0; + + this.timerStart = Date.now(); + this.tempo = 60; // bpm + this.lastMessage = ''; + + // volume and stereo-pan support + this.volume = 100; + this.gainNode = null; // must be lazily initialized in Chrome, sigh... + this.pan = 0; + this.pannerNode = null; // must be lazily initialized in Chrome, sigh... + + // frequency player, experimental + this.freqPlayer = null; // Note, to be lazily initialized + + this.watcherUpdateFrequency = 2; + this.lastWatcherUpdate = Date.now(); + + this.scale = 1; // for display modes, do not persist + + this.cachedColorDimensions = [0, 0, 0]; // bg color support, not serialized + + this.keysPressed = {}; // for handling keyboard events, do not persist + this.primitivesCache = {}; // not to be serialized (!) + this.paletteCache = {}; // not to be serialized (!) + this.categoriesCache = null; // not to be serialized (!) + this.lastAnswer = ''; // last user input, do not persist + this.activeSounds = []; // do not persist + + this.trailsCanvas = null; + this.trailsLog = []; // each line being [p1, p2, color, width, cap] + this.isThreadSafe = false; + + this.microphone = new Microphone(); // audio input, do not persist + + this.graphicsValues = { + 'color': 0, + 'fisheye': 0, + 'whirl': 0, + 'pixelate': 0, + 'mosaic': 0, + 'duplicate': 0, + 'negative': 0, + 'comic': 0, + 'confetti': 0, + 'saturation': 0, + 'brightness': 0 + }; + + this.cachedPenTrailsMorph = null; // optimization, do not persist + + this.remixID = null; + + // projection layer - for video, maps, 3D extensions etc., transient + this.projectionSource = null; // offscreen DOM element for video, maps, 3D + this.getProjectionImage = null; // function to return a blittable image + this.stopProjectionSource = null; // function to turn off video stream etc. + this.continuousProjection = false; // turn ON for video + this.projectionCanvas = null; + this.projectionTransparency = 50; + + // video motion detection, transient + this.mirrorVideo = true; + this.videoMotion = null; + + // world map client, transient + this.worldMap = new WorldMap(); + + // Snap! API event listeners, transient + this.messageCallbacks = {}; // name : [functions] + + StageMorph.uber.init.call(this); + + this.setExtent(this.dimensions); + this.isCachingImage = true; + this.cachedColorDimensions = this.color[ + SpriteMorph.prototype.penColorModel + ](); + this.acceptsDrops = false; + this.setColor(new Color(255, 255, 255)); +}; + +// StageMorph scaling + +StageMorph.prototype.setScale = function (number) { + var delta = number / this.scale, + pos = this.position(), + relativePos, + bubble; + + if (delta === 1) {return; } + this.cachedPenTrailsMorph = null; + this.scale = number; + this.setExtent(this.dimensions.multiplyBy(number)); + + // first resize my speech balloon, if any + bubble = this.talkBubble(); + if (bubble) { + bubble.setScale(number); + this.positionTalkBubble(); + } + + // now move and resize all children - sprites, bubbles, watchers etc.. + this.children.forEach(morph => { + relativePos = morph.position().subtract(pos); + morph.fixLayout(); + morph.setPosition( + relativePos.multiplyBy(delta).add(pos), + true // just me (for nested sprites) + ); + if (morph instanceof SpriteMorph) { + morph.rerender(); + bubble = morph.talkBubble(); + if (bubble) { + bubble.setScale(number); + morph.positionTalkBubble(); + } + } else if (morph instanceof StagePrompterMorph) { + if (this.scale < 1) { + morph.setWidth(this.width() - 10); + } else { + morph.setWidth(this.dimensions.x - 20); + } + morph.setCenter(this.center()); + morph.setBottom(this.bottom()); + } else if (morph instanceof StagePickerMorph) { + morph.createItems(number); + morph.popup(this, morph.position()); + } + }); +}; + +StageMorph.prototype.moveBy = function (delta) { + // override the inherited method to skip attached sprite parts, + // because they are also level-1 children of the stage and thus + // will be moved individually + var children = this.children, + i = children.length; + this.changed(); + this.bounds = this.bounds.translateBy(delta); + this.changed(); + for (i; i > 0; i -= 1) { + children[i - 1].moveBy(delta, true); // justMe - skip sprite parts + } +}; + +// StageMorph rendering + +StageMorph.prototype.render = function (ctx) { + ctx.save(); + ctx.fillStyle = this.color.toString(); + ctx.fillRect(0, 0, this.width(), this.height()); + if (this.costume && !(this.costume.loaded instanceof Function)) { + ctx.scale(this.scale, this.scale); + ctx.drawImage( + this.costume.contents, + (this.width() / this.scale - this.costume.width()) / 2, + (this.height() / this.scale - this.costume.height()) / 2 + ); + this.applyGraphicsEffects(this.cachedImage); + } + ctx.restore(); + this.version = Date.now(); // for observer optimization +}; + +StageMorph.prototype.drawOn = function (ctx, rect) { + // draw pen trails and webcam layers + var clipped = rect.intersect(this.bounds), + pos, src, w, h, sl, st, ws, hs; + + if (!this.isVisible || !clipped.extent().gt(ZERO)) { + return; + } + + // costume, if any, and background color + StageMorph.uber.drawOn.call(this, ctx, rect); + + pos = this.position(); + src = clipped.translateBy(pos.neg()); + sl = src.left(); + st = src.top(); + w = src.width(); + h = src.height(); + ws = w / this.scale; + hs = h / this.scale; + + ctx.save(); + ctx.scale(this.scale, this.scale); + + // projection layer (e.g. webcam) + if (this.projectionSource) { + ctx.globalAlpha = 1 - (this.projectionTransparency / 100); + ctx.drawImage( + this.projectionLayer(), + sl / this.scale, + st / this.scale, + ws, + hs, + clipped.left() / this.scale, + clipped.top() / this.scale, + ws, + hs + ); + this.version = Date.now(); // update watcher icons + } + + // pen trails + ctx.globalAlpha = 1; + ctx.drawImage( + this.penTrails(), + sl / this.scale, + st / this.scale, + ws, + hs, + clipped.left() / this.scale, + clipped.top() / this.scale, + ws, + hs + ); + + ctx.restore(); +}; + +StageMorph.prototype.clearPenTrails = function () { + this.cachedPenTrailsMorph = null; + this.trailsCanvas = newCanvas(this.dimensions, null, this.trailsCanvas); + this.trailsLog = []; + this.changed(); +}; + +StageMorph.prototype.penTrails = function () { + if (!this.trailsCanvas) { + this.trailsCanvas = newCanvas(this.dimensions); + } + return this.trailsCanvas; +}; + +StageMorph.prototype.penTrailsMorph = function () { + // for collision detection purposes + var morph, trails, ctx; + + if (this.cachedPenTrailsMorph) { + return this.cachedPenTrailsMorph; + } + morph = new Morph(); + morph.isCachingImage = true; + trails = this.penTrails(); + morph.bounds = this.bounds.copy(); + morph.cachedImage = newCanvas(this.extent(), true); + ctx = morph.cachedImage.getContext('2d'); + ctx.drawImage( + trails, + 0, + 0, + trails.width, + trails.height, + 0, + 0, + this.width(), + this.height() + ); + this.cachedPenTrailsMorph = morph; + return morph; +}; + +StageMorph.prototype.projectionLayer = function () { + if (!this.projectionCanvas) { + this.projectionCanvas = newCanvas(this.dimensions, true); + } + return this.projectionCanvas; +}; + +StageMorph.prototype.clearProjectionLayer = function () { + this.projectionCanvas = null; + this.changed(); +}; + +// StageMorph video capture + +StageMorph.prototype.startVideo = function() { + var myself = this; + + function noCameraSupport() { + var dialog = new DialogBoxMorph(); + dialog.inform( + localize('Camera not supported'), + localize('Please make sure your web browser is up to date\n' + + 'and your camera is properly configured. \n\n' + + 'Some browsers also require you to access Snap!\n' + + 'through HTTPS to use the camera.\n\n' + + 'Please replace the "http://" part of the address\n' + + 'in your browser by "https://" and try again.'), + this.world + ); + dialog.fixLayout(); + if (myself.projectionSource) { + myself.projectionSource.remove(); + myself.projectionSource = null; + } + } + if (this.projectionSource) { // video capture has already been started + return; + } + + this.projectionSource = document.createElement('video'); + this.projectionSource.width = this.dimensions.x; + this.projectionSource.height = this.dimensions.y; + this.projectionSource.hidden = true; + document.body.appendChild(this.projectionSource); + if (!this.videoMotion) { + this.videoMotion = new VideoMotion( + this.dimensions.x, + this.dimensions.y + ); + } + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + navigator.mediaDevices.getUserMedia({ video: true }) + .then(function(stream) { + myself.getProjectionImage = myself.getVideoImage; + myself.stopProjectionSource = myself.stopVideo; + myself.continuousProjection = true; + myself.projectionSource.srcObject = stream; + myself.projectionSource.play().catch(noCameraSupport); + myself.projectionSource.stream = stream; + }) + .catch(noCameraSupport); + } +}; + +StageMorph.prototype.getVideoImage = function () { + return this.projectionSource; +}; + +StageMorph.prototype.stopVideo = function() { + if (this.projectionSource && this.projectionSource.stream) { + this.projectionSource.stream.getTracks().forEach(track => + track.stop() + ); + } + this.videoMotion = null; +}; + +StageMorph.prototype.stopProjection = function () { + if (this.projectionSource) { + this.stopProjectionSource(); + this.projectionSource.remove(); + this.projectionSource = null; + this.continuousProjection = false; + } + this.clearProjectionLayer(); +}; + +StageMorph.prototype.projectionSnap = function (target) { + var snap = newCanvas(this.dimensions, true), + ctx = snap.getContext('2d'); + ctx.drawImage(this.projectionLayer(), 0, 0); + return new Costume(snap, (target || this).newCostumeName(localize('snap'))); +}; + +// StageMorph pixel access: + +StageMorph.prototype.getPixelColor = function (aPoint) { + var point, context, data; + if (this.trailsCanvas) { + point = aPoint.subtract(this.bounds.origin); + context = this.penTrailsMorph().getImage().getContext('2d'); + data = context.getImageData(point.x, point.y, 1, 1); + if (data.data[3] === 0) { + if (this.projectionCanvas) { + point = point.divideBy(this.scale); + context = this.projectionCanvas.getContext('2d'); + data = context.getImageData(point.x, point.y, 1, 1); + return new Color( + data.data[0], + data.data[1], + data.data[2], + data.data[3] / 255 + ); + } + return StageMorph.uber.getPixelColor.call(this, aPoint); + } + return new Color( + data.data[0], + data.data[1], + data.data[2], + data.data[3] / 255 + ); + } +}; + +// StageMorph accessing + +StageMorph.prototype.watchers = function (leftPos) { +/* + answer an array of all currently visible watchers. + If leftPos is specified, filter the list for all + shown or hidden watchers whose left side equals + the given border (for automatic positioning) +*/ + return this.children.filter(morph => { + if (morph instanceof WatcherMorph) { + if (leftPos) { + return morph.left() === leftPos; + } + return morph.isVisible; + } + return false; + }); +}; + +// StageMorph timer + +StageMorph.prototype.resetTimer = function () { + this.timerStart = Date.now(); +}; + +StageMorph.prototype.getTimer = function () { + var elapsed = Math.floor((Date.now() - this.timerStart) / 100); + return elapsed / 10; +}; + +// StageMorph tempo + +StageMorph.prototype.setTempo = function (bpm) { + this.tempo = Math.max(20, (+bpm || 0)); +}; + +StageMorph.prototype.changeTempo = function (delta) { + this.setTempo(this.getTempo() + (+delta || 0)); +}; + +StageMorph.prototype.getTempo = function () { + return +this.tempo; +}; + +// StageMorph messages + +StageMorph.prototype.getLastMessage = function () { + return this.lastMessage || ''; +}; + +// StageMorph Mouse Coordinates + +StageMorph.prototype.reportMouseX = function () { + var world = this.world(); + if (world) { + return (world.hand.position().x - this.center().x) / this.scale; + } + return 0; +}; + +StageMorph.prototype.reportMouseY = function () { + var world = this.world(); + if (world) { + return (this.center().y - world.hand.position().y) / this.scale; + } + return 0; +}; + +// StageMorph drag & drop + +StageMorph.prototype.wantsDropOf = function (aMorph) { + return aMorph instanceof SpriteMorph || + aMorph instanceof WatcherMorph || + aMorph instanceof ListWatcherMorph || + aMorph instanceof SpriteIconMorph; +}; + +StageMorph.prototype.reactToDropOf = function (morph, hand) { + if (morph instanceof SpriteIconMorph) { // detach sprite from anchor + if (morph.object.anchor) { + morph.object.anchor.detachPart(morph.object); + } + this.world().add(morph); + morph.slideBackTo(hand.grabOrigin); + } +}; + +// StageMorph stepping + +StageMorph.prototype.step = function () { + var current, elapsed, leftover, ide, world = this.world(); + + // handle keyboard events + if (world.keyboardFocus === null) { + world.keyboardFocus = this; + } + if (world.currentKey === null) { + this.keyPressed = null; + } + + // manage threads + if (this.enableCustomHatBlocks) { + this.stepGenericConditions(); + } + if (this.isFastTracked && this.threads.processes.length) { + while (this.isFastTracked && (Date.now() - this.lastTime) < 15) { + this.threads.step(); // approx. 67 fps + } + this.changed(); + } else { + this.threads.step(); + + // single-stepping hook: + if (this.threads.wantsToPause) { + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.controlBar.pauseButton.refresh(); + } + } + } + + // update watchers + current = Date.now(); + elapsed = current - this.lastWatcherUpdate; + leftover = (1000 / this.watcherUpdateFrequency) - elapsed; + if (leftover < 1) { + this.watchers().forEach(w => w.update()); + this.lastWatcherUpdate = Date.now(); + } + + // projection layer update (e.g. video frame capture) + if (this.continuousProjection && this.projectionSource) { + this.updateProjection(); + } +}; + +StageMorph.prototype.updateProjection = function () { + var context = this.projectionLayer().getContext('2d'); + context.save(); + if (this.mirrorVideo) { + context.translate(this.dimensions.x, 0); + context.scale(-1, 1); + } + context.drawImage( + this.getProjectionImage(), + 0, + 0, + this.projectionSource.width, + this.projectionSource.height + ); + if (this.videoMotion) { + this.videoMotion.addFrame( + context.getImageData( + 0, + 0, + this.projectionSource.width, + this.projectionSource.height + ).data + ); + } + context.restore(); + this.changed(); +}; + +StageMorph.prototype.stepGenericConditions = function (stopAll) { + var hatCount = 0, + ide; + this.children.concat(this).forEach(morph => { + if (isSnapObject(morph)) { + morph.allGenericHatBlocks().forEach(block => { + hatCount += 1; + this.threads.doWhen(block, morph, stopAll); + }); + } + }); + if (!hatCount) { + this.enableCustomHatBlocks = false; + ide = this.parentThatIsA(IDE_Morph); + if (ide) { + ide.controlBar.stopButton.refresh(); + } + } +}; + +StageMorph.prototype.developersMenu = function () { + var menu = StageMorph.uber.developersMenu.call(this); + menu.addItem( + "stop", + () => this.threads.stopAll(), + 'terminate all running threads' + ); + return menu; +}; + +// StageMorph keyboard events + +StageMorph.prototype.processKeyDown = function (event) { + this.processKeyEvent( + event, + this.fireKeyEvent + ); +}; + +StageMorph.prototype.processKeyUp = function (event) { + this.processKeyEvent( + event, + this.removePressedKey + ); +}; + +StageMorph.prototype.processKeyEvent = function (event, action) { + var keyName; + + // this.inspectKeyEvent(event); + switch (event.keyCode) { + case 13: + keyName = 'enter'; + if (event.ctrlKey || event.metaKey) { + keyName = 'ctrl enter'; + } else if (event.shiftKey) { + keyName = 'shift enter'; + } + break; + case 27: + keyName = 'esc'; + break; + case 32: + keyName = 'space'; + break; + case 37: + keyName = 'left arrow'; + break; + case 39: + keyName = 'right arrow'; + break; + case 38: + keyName = 'up arrow'; + break; + case 40: + keyName = 'down arrow'; + break; + default: + keyName = event.key || String.fromCharCode( + event.keyCode || event.charCode + ); + if (event.ctrlKey || event.metaKey) { + keyName = + (keyName === 'Control' || keyName === 'Meta' ? '' : 'ctrl ') + + (event.shiftKey ? 'shift ' : '') + keyName; + } + } + action.call(this, keyName); +}; + +StageMorph.prototype.fireKeyEvent = function (key) { + var evt = key.toLowerCase(), + procs = [], + ide = this.parentThatIsA(IDE_Morph); + + this.keysPressed[evt] = true; + if (evt === 'ctrl enter' && !ide.isAppMode) { + return this.fireGreenFlagEvent(); + } + if (evt === 'shift enter') { + return this.editScripts(); + } + if (evt === 'ctrl f') { + if (!ide.isAppMode) {ide.currentSprite.searchBlocks(); } + return; + } + if (evt === 'ctrl z') { + if (!ide.isAppMode) {ide.currentSprite.scripts.undrop(); } + return; + } + if (evt === 'ctrl shift z' || (evt === 'ctrl y')) { + if (!ide.isAppMode) {ide.currentSprite.scripts.redrop(); } + return; + } + if (evt === 'ctrl n') { + if (!ide.isAppMode) {ide.createNewProject(); } + return; + } + if (evt === 'ctrl o') { + if (!ide.isAppMode) {ide.openProjectsBrowser(); } + return; + } + if (evt === 'ctrl s') { + if (!ide.isAppMode) {ide.save(); } + return; + } + if (evt === 'ctrl shift s') { + if (!ide.isAppMode) {return ide.saveProjectsBrowser(); } + return; + } + if (evt === 'esc' && !ide.isAppMode) { + return ide.stopAllScripts(); + } + this.children.concat(this).forEach(morph => { + if (isSnapObject(morph)) { + morph.allHatBlocksForKey(evt).forEach(block => { + var varName = block.inputs()[1].evaluate()[0], + varFrame; + if (varName) { + varFrame = new VariableFrame(); + varFrame.addVar( + varName, + key === 'space' ? ' ' : key // not lowercased + ); + } + procs.push(this.threads.startProcess( + block, + morph, + true, // ignore running scripts, was: myself.isThreadSafe + null, // exportResult (bool) + null, // callback + null, // isClicked + null, // rightAway + null, // atomic + varFrame + )); + }); + } + }); + return procs; +}; + +StageMorph.prototype.removePressedKey = function (key) { + delete this.keysPressed[key.toLowerCase()]; +}; + +StageMorph.prototype.processKeyPress = function (event) { + nop(event); +}; + +StageMorph.prototype.inspectKeyEvent + = CursorMorph.prototype.inspectKeyEvent; + +StageMorph.prototype.fireChangeOfSceneEvent = function (message, data) { + var procs = []; + + // remove all clones when the green flag event is broadcast + if (message === '__shout__go__') { + this.removeAllClones(); + } + + this.children.concat(this).forEach(morph => { + if (isSnapObject(morph)) { + morph.allHatBlocksFor(message).forEach(block => { + var choice, varName, varFrame; + if (block.selector === 'receiveMessage') { + varName = block.inputs()[1].evaluate()[0]; + if (varName) { + varFrame = new VariableFrame(); + choice = block.inputs()[0].evaluate(); + if (choice instanceof Array && + choice[0].indexOf('any') === 0) { + varFrame.addVar( + varName, + data !== '' ? + new List([message, data]) + : message + ); + } else { + varFrame.addVar(varName, data); + } + } + procs.push(this.threads.startProcess( + block, + morph, + this.isThreadSafe || // make "any msg" threadsafe + block.inputs()[0].evaluate() instanceof Array, + null, // exportResult (bool) + null, // callback + null, // isClicked + null, // rightAway + null, // atomic + varFrame + )); + } else { + procs.push(this.threads.startProcess( + block, + morph, + this.isThreadSafe + )); + } + }); + } + }); + return procs; +}; + +StageMorph.prototype.fireUserEditEvent = function ( + spriteName, + details, + timestamp +) { + var procs = []; + this.children.concat(this).forEach(morph => { + if (isSnapObject(morph)) { + morph.allHatBlocksForUserEdit(spriteName).forEach(block => { + var varName = block.inputs()[1].evaluate()[0], + varFrame; + if (varName) { + varFrame = new VariableFrame(); + varFrame.addVar( + varName, + new List( + [spriteName].concat( + details + ).concat([timestamp]) + ) + ); + } + procs.push(this.threads.startProcess( + block, + morph, + false, // ignore running scripts, was: myself.isThreadSafe + null, // exportResult (bool) + null, // callback + null, // isClicked + null, // rightAway + null, // atomic + varFrame + )); + }); + } + }); + return procs; +}; + +StageMorph.prototype.fireGreenFlagEvent = function () { + var procs = [], + ide = this.parentThatIsA(IDE_Morph); + + this.removeAllClones(); + this.children.concat(this).forEach(morph => { + if (isSnapObject(morph)) { + morph.allHatBlocksFor('__shout__go__').forEach(block => { + var varName, varFrame; + + if (block.selector === 'receiveMessage') { + varName = block.inputs()[1].evaluate()[0]; + if (varName) { + varFrame = new VariableFrame(); + varFrame.addVar(varName, ''); // empty + } + } + + procs.push(this.threads.startProcess( + block, + morph, + this.isThreadSafe, + null, // exportResult (bool) + null, // callback + null, // isClicked + null, // rightAway + null, // atomic + varFrame + )); + }); + } + }); + if (ide) { + ide.controlBar.pauseButton.refresh(); + } + return procs; +}; + +StageMorph.prototype.runStopScripts = function () { + // Allow each sprite to run one last step before termination + // usage example: Stop a robot or device associated with the sprite + this.receiveUserInteraction('stopped', true, true); + this.children.forEach(morph => { + if (morph instanceof SpriteMorph) { + morph.receiveUserInteraction('stopped', true, true); + } + }); +}; + +StageMorph.prototype.removeAllClones = function () { + var clones = this.children.filter(morph => + morph instanceof SpriteMorph && morph.isTemporary + ); + clones.forEach(clone => { + this.threads.stopAllForReceiver(clone); + clone.detachFromAnchor(); + clone.corpsify(); + clone.destroy(); + }); + this.cloneCount = 0; +}; + +StageMorph.prototype.editScripts = function () { + var ide = this.parentThatIsA(IDE_Morph), + scripts, + sorted; + if (ide.isAppMode || !ScriptsMorph.prototype.enableKeyboard) {return; } + scripts = this.parentThatIsA( + IDE_Morph + ).currentSprite.scripts.selectForEdit(); // shadow on edit, if inherited + scripts.edit(scripts.position()); + sorted = scripts.focus.sortedScripts(); + if (sorted.length) { + scripts.focus.element = sorted[0]; + if (scripts.focus.element instanceof HatBlockMorph) { + scripts.focus.nextCommand(); + } + } else { + scripts.focus.moveBy(new Point(50, 50)); + } + scripts.focus.fixLayout(); +}; + +// StageMorph controlling generic WHEN hats + +StageMorph.prototype.pauseGenericHatBlocks = function () { + var ide = this.parentThatIsA(IDE_Morph); + if (this.hasGenericHatBlocks() || + ide.sprites.asArray().some(any => any.hasGenericHatBlocks())) { + this.enableCustomHatBlocks = true; + this.threads.pauseCustomHatBlocks = true; + ide.controlBar.stopButton.refresh(); + } +}; + +// StageMorph block templates + +StageMorph.prototype.blockTemplates = function ( + category = 'motion', + all = false // include hidden blocks +) { + var blocks = [], myself = this, varNames, txt; + + function block(selector) { + if (myself.hiddenPrimitives[selector] && !all) { + return null; + } + var newBlock = SpriteMorph.prototype.blockForSelector(selector, true); + newBlock.isTemplate = true; + return newBlock; + } + + function variableBlock(varName, isLocal) { + var newBlock = SpriteMorph.prototype.variableBlock(varName, isLocal); + newBlock.isDraggable = false; + newBlock.isTemplate = true; + return newBlock; + } + + + function watcherToggle(selector) { + if (myself.hiddenPrimitives[selector]) { + return null; + } + var info = SpriteMorph.prototype.blocks[selector]; + return new ToggleMorph( + 'checkbox', + this, + function () { + myself.toggleWatcher( + selector, + localize(info.spec), + myself.blockColor[info.category] + ); + }, + null, + function () { + return myself.showingWatcher(selector); + }, + null + ); + } + + function variableWatcherToggle(varName, isGlobal) { + return new ToggleMorph( + 'checkbox', + this, + function () { + myself.toggleVariableWatcher(varName, isGlobal); + }, + null, + function () { + return myself.showingVariableWatcher(varName, isGlobal); + }, + null + ); + } + + + SnapExtensions.buttons.palette.forEach(buttonDescriptor => { + if (buttonDescriptor.category === category) { + blocks.push(this.customPaletteButton(buttonDescriptor)); + } + }); + + if (category === 'motion') { + + txt = new TextMorph(localize('Stage selected:\nno motion primitives')); + txt.fontSize = 9; + txt.setColor(this.paletteTextColor); + txt.hideWithCategory = true; // hide txt when category names are hidden + blocks.push(txt); + + } else if (category === 'looks') { + + blocks.push(block('doSwitchToCostume')); + blocks.push(block('doWearNextCostume')); + blocks.push(watcherToggle('getCostumeIdx')); + blocks.push(block('getCostumeIdx')); + blocks.push('-'); + blocks.push(block('doSayFor')); + blocks.push(block('bubble')); + blocks.push('-'); + blocks.push(block('reportGetImageAttribute')); + blocks.push(block('reportNewCostumeStretched')); + blocks.push(block('reportNewCostume')); + blocks.push('-'); + blocks.push(block('changeEffect')); + blocks.push(block('setEffect')); + blocks.push(block('clearEffects')); + blocks.push(block('getEffect')); + blocks.push('-'); + blocks.push(block('show')); + blocks.push(block('hide')); + blocks.push(watcherToggle('reportShown')); + blocks.push(block('reportShown')); + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('log')); + blocks.push(block('alert')); + blocks.push('-'); + blocks.push(block('doScreenshot')); + } + + } else if (category === 'sound') { + + blocks.push(block('playSound')); + blocks.push(block('doPlaySoundUntilDone')); + blocks.push(block('doStopAllSounds')); + blocks.push('-'); + blocks.push(block('doPlaySoundAtRate')); + blocks.push(block('reportGetSoundAttribute')); + blocks.push(block('reportNewSoundFromSamples')); + blocks.push('-'); + blocks.push(block('doRest')); + blocks.push(block('doPlayNote')); + blocks.push(block('doSetInstrument')); + blocks.push('-'); + blocks.push(block('doChangeTempo')); + blocks.push(block('doSetTempo')); + blocks.push(watcherToggle('getTempo')); + blocks.push(block('getTempo')); + blocks.push('-'); + blocks.push(block('changeVolume')); + blocks.push(block('setVolume')); + blocks.push(watcherToggle('getVolume')); + blocks.push(block('getVolume')); + blocks.push('-'); + blocks.push(block('changePan')); + blocks.push(block('setPan')); + blocks.push(watcherToggle('getPan')); + blocks.push(block('getPan')); + blocks.push('-'); + blocks.push(block('playFreq')); + blocks.push(block('stopFreq')); + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('doPlayFrequency')); + } + + } else if (category === 'pen') { + + blocks.push(block('clear')); + blocks.push('-'); + blocks.push(block('setBackgroundColor')); + blocks.push(block('changeBackgroundColorDimension')); + blocks.push(block('setBackgroundColorDimension')); + blocks.push('-'); + blocks.push(block('write')); + blocks.push('-'); + blocks.push(block('reportPenTrailsAsCostume')); + blocks.push('-'); + blocks.push(block('doPasteOn')); + blocks.push(block('doCutFrom')); + + } else if (category === 'control') { + + blocks.push(block('receiveGo')); + blocks.push(block('receiveKey')); + blocks.push(block('receiveInteraction')); + blocks.push(block('receiveCondition')); + blocks.push('-'); + blocks.push(block('receiveMessage')); + blocks.push(block('doBroadcast')); + blocks.push(block('doBroadcastAndWait')); + blocks.push('-'); + blocks.push(block('doWarp')); + blocks.push('-'); + blocks.push(block('doWait')); + blocks.push(block('doWaitUntil')); + blocks.push('-'); + blocks.push(block('doForever')); + blocks.push(block('doRepeat')); + blocks.push(block('doUntil')); + blocks.push(block('doFor')); + blocks.push('-'); + // blocks.push(block('doVariadicIf')); + blocks.push(block('doIf')); + blocks.push(block('doIfElse')); + blocks.push(block('reportIfElse')); + blocks.push('-'); + blocks.push(block('doReport')); + blocks.push(block('doStopThis')); + blocks.push('-'); + blocks.push(block('doRun')); + blocks.push(block('fork')); + blocks.push(block('evaluate')); + blocks.push(block('reportPipe')); + blocks.push('-'); + blocks.push(block('doTellTo')); + blocks.push(block('reportAskFor')); + blocks.push('-'); + blocks.push(block('createClone')); + blocks.push(block('newClone')); + blocks.push('-'); + blocks.push(block('doPauseAll')); + blocks.push(block('doSwitchToScene')); + blocks.push('-'); + blocks.push(block('receiveUserEdit')); + blocks.push(block('doDefineBlock')); + blocks.push(block('doDeleteBlock')); + blocks.push(block('doSetBlockAttribute')); + blocks.push(block('reportBlockAttribute')); + blocks.push(block('reportEnvironment')); + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(watcherToggle('getLastMessage')); + blocks.push(block('getLastMessage')); + // deprecated - superseded by reportEnviornment - retained for legacy + blocks.push('-'); + blocks.push(block('doCallCC')); + blocks.push(block('reportCallCC')); + } + + } else if (category === 'sensing') { + + blocks.push(block('doAsk')); + blocks.push(watcherToggle('getLastAnswer')); + blocks.push(block('getLastAnswer')); + blocks.push('-'); + blocks.push(block('reportMousePosition')); + blocks.push(watcherToggle('reportMouseX')); + blocks.push(block('reportMouseX')); + blocks.push(watcherToggle('reportMouseY')); + blocks.push(block('reportMouseY')); + blocks.push(block('reportMouseDown')); + blocks.push('-'); + blocks.push(block('reportKeyPressed')); + blocks.push('-'); + blocks.push(block('reportAspect')); + blocks.push('-'); + blocks.push(block('doResetTimer')); + blocks.push(watcherToggle('getTimer')); + blocks.push(block('getTimer')); + blocks.push(block('reportDate')); + blocks.push('-'); + blocks.push(block('reportAttributeOf')); + + if (SpriteMorph.prototype.enableFirstClass) { + blocks.push(block('reportGet')); + } + + blocks.push(block('reportObject')); + blocks.push('-'); + blocks.push(block('reportURL')); + blocks.push(block('reportAudio')); + blocks.push(block('reportVideo')); + blocks.push(block('doSetVideoTransparency')); + blocks.push('-'); + blocks.push(block('reportGlobalFlag')); + blocks.push(block('doSetGlobalFlag')); + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(watcherToggle('reportThreadCount')); + blocks.push(block('reportThreadCount')); + blocks.push(block('reportStackSize')); + blocks.push(block('reportFrameCount')); + blocks.push(block('reportYieldCount')); + } + } + if (category === 'operators') { + + blocks.push(block('reifyScript')); + blocks.push(block('reifyReporter')); + blocks.push(block('reifyPredicate')); + blocks.push('#'); + blocks.push('-'); + blocks.push(block('reportVariadicSum')); + blocks.push(block('reportDifference')); + blocks.push(block('reportVariadicProduct')); + blocks.push(block('reportQuotient')); + blocks.push(block('reportPower')); + blocks.push('-'); + blocks.push(block('reportModulus')); + blocks.push(block('reportVariadicMin')); + blocks.push(block('reportVariadicMax')); + blocks.push('-'); + blocks.push(block('reportRound')); + blocks.push(block('reportMonadic')); + blocks.push(block('reportAtan2')); + blocks.push(block('reportRandom')); + blocks.push('-'); + blocks.push(block('reportVariadicLessThan')); + blocks.push(block('reportVariadicEquals')); + blocks.push(block('reportVariadicGreaterThan')); + blocks.push('-'); + blocks.push(block('reportVariadicAnd')); + blocks.push(block('reportVariadicOr')); + blocks.push(block('reportNot')); + blocks.push(block('reportBoolean')); + blocks.push('-'); + blocks.push(block('reportJoinWords')); + blocks.push(block('reportTextSplit')); + blocks.push(block('reportLetter')); + blocks.push(block('reportTextAttribute')); + blocks.push('-'); + blocks.push(block('reportUnicode')); + blocks.push(block('reportUnicodeAsLetter')); + blocks.push('-'); + blocks.push(block('reportIsA')); + blocks.push(block('reportVariadicIsIdentical')); + + if (Process.prototype.enableJS) { // (Process.prototype.enableJS) { + blocks.push('-'); + blocks.push(block('reportJSFunction')); + if (Process.prototype.enableCompiling) { + blocks.push(block('reportCompiled')); + } + } + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('reportTypeOf')); + blocks.push(block('reportTextFunction')); + } + + } + if (category === 'variables') { + + blocks.push(this.makeVariableButton()); + if (this.variables.allNames().length > 0) { + blocks.push(this.deleteVariableButton()); + } + blocks.push('-'); + + varNames = this.allGlobalVariableNames(true, all); + if (varNames.length > 0) { + varNames.forEach(name => { + blocks.push(variableWatcherToggle(name, true)); + blocks.push(variableBlock(name)); + }); + blocks.push('-'); + } + + varNames = this.allLocalVariableNames(true, all); + if (varNames.length > 0) { + varNames.forEach(name => { + blocks.push(variableWatcherToggle(name)); + blocks.push(variableBlock(name, true)); + }); + blocks.push('-'); + } + + blocks.push(block('doSetVar')); + blocks.push(block('doChangeVar')); + blocks.push(block('doShowVar')); + blocks.push(block('doHideVar')); + blocks.push(block('doDeclareVariables')); + blocks.push('='); + blocks.push(block('reportNewList')); + blocks.push(block('reportNumbers')); + blocks.push('-'); + blocks.push(block('reportCONS')); + blocks.push(block('reportListItem')); + blocks.push(block('reportCDR')); + blocks.push('-'); + blocks.push(block('reportListAttribute')); + blocks.push(block('reportListIndex')); + blocks.push(block('reportListContainsItem')); + blocks.push(block('reportListIsEmpty')); + blocks.push('-'); + blocks.push(block('reportMap')); + blocks.push(block('reportKeep')); + blocks.push(block('reportFindFirst')); + blocks.push(block('reportCombine')); + blocks.push('-'); + blocks.push(block('doForEach')); + blocks.push('-'); + blocks.push(block('doAddToList')); + blocks.push(block('doDeleteFromList')); + blocks.push(block('doInsertInList')); + blocks.push(block('doReplaceInList')); + blocks.push('-'); + blocks.push(block('reportConcatenatedLists')); + blocks.push(block('reportReshape')); + blocks.push(block('reportCrossproduct')); + + if (SpriteMorph.prototype.showingExtensions) { + blocks.push('='); + blocks.push(block('doApplyExtension')); + blocks.push(block('reportApplyExtension')); + } + + if (StageMorph.prototype.enableCodeMapping) { + blocks.push('='); + blocks.push(block('doMapCodeOrHeader')); + blocks.push(block('doMapValueCode')); + blocks.push(block('doMapListCode')); + blocks.push('-'); + blocks.push(block('reportMappedCode')); + } + + // for debugging: /////////////// + if (this.world().isDevMode) { + blocks.push('-'); + blocks.push(this.devModeText()); + blocks.push('-'); + blocks.push(block('doShowTable')); + } + } + + return blocks; +}; + +// StageMorph primitives + +StageMorph.prototype.clear = function () { + this.clearPenTrails(); +}; + +// StageMorph user menu + +StageMorph.prototype.userMenu = function () { + var ide = this.parentThatIsA(IDE_Morph), + menu = new MenuMorph(this); + + if (ide && (ide.isAppMode || ide.config.noSpriteEdits)) { + // menu.addItem('help', 'nop'); + return menu; + } + menu.addItem("edit", 'edit'); + menu.addItem("show all", 'showAll'); + menu.addItem( + "pic...", + () => ide.saveCanvasAs(this.fullImage(), this.name), + 'save a picture\nof the stage' + ); + menu.addLine(); + menu.addItem( + 'pen trails', + () => { + var costume = ide.currentSprite.reportPenTrailsAsCostume().copy(); + ide.currentSprite.addCostume(costume); + ide.currentSprite.wearCostume(costume); + ide.hasChangedMedia = true; + ide.spriteBar.tabBar.tabTo('costumes'); + }, + ide.currentSprite instanceof SpriteMorph ? + 'turn all pen trails and stamps\n' + + 'into a new costume for the\ncurrently selected sprite' + : 'turn all pen trails and stamps\n' + + 'into a new background for the stage' + ); + if (this.trailsLog.length) { + menu.addItem( + 'svg...', + 'exportTrailsLogAsSVG', + 'export pen trails\nline segments as SVG' + ); + } + return menu; +}; + +StageMorph.prototype.showAll = function () { + this.children.forEach(m => { + if (m instanceof SpriteMorph) { + if (!m.anchor) { + m.show(); + m.keepWithin(this); + } + } else { + m.show(); + m.keepWithin(this); + if (m.fixLayout) {m.fixLayout(); } + } + }); +}; + +StageMorph.prototype.edit = SpriteMorph.prototype.edit; + +StageMorph.prototype.fullImage = Morph.prototype.fullImage; + +// StageMorph thumbnail + +StageMorph.prototype.thumbnail = function (extentPoint, recycleMe, noWatchers) { + // answer a new Canvas of extentPoint dimensions containing + // my thumbnail representation keeping the originial aspect ratio + // a "recycleMe canvas can be passed for re-use + return this.fancyThumbnail(extentPoint, null, false, recycleMe, noWatchers); +}; + +StageMorph.prototype.fancyThumbnail = function ( + extentPoint, + excludedSprite, + nonRetina, + recycleMe, + noWatchers +) { + var src = this.getImage(), + scale = Math.min( + (extentPoint.x / src.width), + (extentPoint.y / src.height) + ), + trg = newCanvas(extentPoint, nonRetina, recycleMe), + ctx = trg.getContext('2d'), + fb, + fimg; + + ctx.save(); + ctx.scale(scale, scale); + ctx.drawImage( + src, + 0, + 0 + ); + ctx.drawImage( + this.penTrails(), + 0, + 0, + this.dimensions.x * this.scale, + this.dimensions.y * this.scale + ); + if (this.projectionSource) { + ctx.save(); + ctx.globalAlpha = 1 - (this.projectionTransparency / 100); + ctx.drawImage( + this.projectionLayer(), + 0, + 0, + this.dimensions.x * this.scale, + this.dimensions.y * this.scale + ); + ctx.restore(); + } + this.children.forEach(morph => { + if ((isSnapObject(morph) || !noWatchers) && + morph.isVisible && (morph !== excludedSprite) + ) { + fb = morph.fullBounds(); + fimg = morph.fullImage(); + if (fimg.width && fimg.height) { + ctx.drawImage( + morph.fullImage(), + fb.origin.x - this.bounds.origin.x, + fb.origin.y - this.bounds.origin.y + ); + } + } + }); + ctx.restore(); + return trg; +}; + +// StageMorph - exporting the pen trails as SVG + +StageMorph.prototype.exportTrailsLogAsSVG = function () { + var ide = this.parentThatIsA(IDE_Morph); + + ide.saveFileAs( + this.trailsLogAsSVG().src, + 'image/svg', + ide.projectName || this.name + ); +}; + +StageMorph.prototype.trailsLogAsSVG = function () { + var bottomLeft = this.trailsLog[0][0], + topRight = bottomLeft, + maxWidth = this.trailsLog[0][3], + shift, + box, + p1, p2, + svg; + + // determine bounding box and max line width + this.trailsLog.forEach(line => { + bottomLeft = bottomLeft.min(line[0]); + bottomLeft = bottomLeft.min(line[1]); + topRight = topRight.max(line[0]); + topRight = topRight.max(line[1]); + maxWidth = Math.max(maxWidth, line[3]); + }); + box = bottomLeft.corner(topRight).expandBy(maxWidth / 2); + shift = new Point(-bottomLeft.x, topRight.y).translateBy(maxWidth / 2); + svg = ''; + svg += ''; + + // for debugging the viewBox: + // svg += '' + + this.trailsLog.forEach(line => { + p1 = this.normalizePoint(line[0]).translateBy(shift); + p2 = this.normalizePoint(line[1]).translateBy(shift); + svg += ''; + }); + svg += ''; + return { + src : svg, + rot : new Point(-box.origin.x, box.corner.y) + }; +}; + +StageMorph.prototype.normalizePoint = SpriteMorph.prototype.normalizePoint; + +// StageMorph hiding and showing: + +/* + override the inherited behavior to recursively hide/show all + children. +*/ + +StageMorph.prototype.hide = function () { + this.isVisible = false; + this.changed(); +}; + +StageMorph.prototype.show = function () { + this.isVisible = true; + this.changed(); +}; + +StageMorph.prototype.reportShown = SpriteMorph.prototype.reportShown; + +// StageMorph cloning override + +StageMorph.prototype.createClone = nop; +StageMorph.prototype.newClone = nop; + +// StageMorph background color setting + +StageMorph.prototype.setColorDimension = function (idx, num) { + var n = +num; + + idx = +idx; + if (idx < 0 || idx > 3) {return; } + if (idx === 0) { + if (n < 0 || n > 100) { // wrap the hue + n = (n < 0 ? 100 : 0) + n % 100; + } + } else { + n = Math.min(100, Math.max(0, n)); + } + if (idx === 3) { + this.color.a = 1 - n / 100; + } else { + this.cachedColorDimensions[idx] = n / 100; + this.color['set_' + SpriteMorph.prototype.penColorModel].apply( + this.color, + this.cachedColorDimensions + ); + } + this.rerender(); +}; + +// StageMorph writing on the trails canvas + +StageMorph.prototype.write = function (text, size) { + var fontSize = Math.max(3, +size || 1) * this.scale, + textMorph, ctx, img; + + // make sure text can be printed + if (typeof text !== 'string' && typeof text !== 'number') { + throw new Error( + localize('can only write text or numbers, not a') + ' ' + + typeof text + ); + } + + // use a TextMorph for layout + textMorph = new TextMorph( + text, + fontSize, + null, // fontStyle + null, // bold - this.bubbleFontIsBold, + null, // italic + null, // alignment 'center' + this.width() - fontSize + ); + + // try to contrast the background + textMorph.setColor(this.getColorDimension(2) > 50 ? BLACK : WHITE); + + // stamp the text onstage + ctx = this.penTrails().getContext('2d'); + img = textMorph.getImage(); + if (img.width < 1 || (img.height < 1)) { + // too small to draw + return; + } + ctx.save(); + ctx.scale(1 / this.scale, 1 / this.scale); + ctx.drawImage( + img, + fontSize / 2, + Math.min(0, (this.height() - img.height - fontSize / 2)) + ); + ctx.restore(); + this.changed(); + this.cachedPenTrailsMorph = null; +}; + +// StageMorph "pen" attributes for the background + +StageMorph.prototype.getColorDimension = + SpriteMorph.prototype.getColorDimension; + +StageMorph.prototype.changeColorDimension = + SpriteMorph.prototype.changeColorDimension; + +StageMorph.prototype.setColorRGBA = + SpriteMorph.prototype.setColorRGBA; + +StageMorph.prototype.changeColorRGBA = + SpriteMorph.prototype.changeColorRGBA; + +StageMorph.prototype.setColor = function (aColor) { + if (!this.color.eq(aColor, true)) { // observeAlpha + this.color = aColor.copy(); + this.rerender(); + this.cachedColorDimensions = this.color[ + SpriteMorph.prototype.penColorModel + ](); + } +}; + +StageMorph.prototype.setBackgroundColor = StageMorph.prototype.setColor; + +StageMorph.prototype.getPenAttribute + = SpriteMorph.prototype.getPenAttribute; + +// StageMorph printing on another sprite: + +StageMorph.prototype.blitOn = SpriteMorph.prototype.blitOn; + +// StageMorph pseudo-inherited behavior + +StageMorph.prototype.categories = SpriteMorph.prototype.categories; +StageMorph.prototype.blockColor = SpriteMorph.prototype.blockColor; +StageMorph.prototype.paletteColor = SpriteMorph.prototype.paletteColor; +StageMorph.prototype.setName = SpriteMorph.prototype.setName; +StageMorph.prototype.reporterize = SpriteMorph.prototype.reporterize; +StageMorph.prototype.variableBlock = SpriteMorph.prototype.variableBlock; +StageMorph.prototype.showingWatcher = SpriteMorph.prototype.showingWatcher; +StageMorph.prototype.addVariable = SpriteMorph.prototype.addVariable; +StageMorph.prototype.deleteVariable = SpriteMorph.prototype.deleteVariable; +StageMorph.prototype.renameVariable = SpriteMorph.prototype.renameVariable; +StageMorph.prototype.flashScope = SpriteMorph.prototype.flashScope; +StageMorph.prototype.unflashScope = SpriteMorph.prototype.unflashScope; +StageMorph.prototype.visibleScopeFor = SpriteMorph.prototype.visibleScopeFor; + + +// StageMorph Palette Utilities + +StageMorph.prototype.makeBlock = SpriteMorph.prototype.makeBlock; +StageMorph.prototype.helpMenu = SpriteMorph.prototype.helpMenu; +StageMorph.prototype.makeBlockButton = SpriteMorph.prototype.makeBlockButton; +StageMorph.prototype.customPaletteButton + = SpriteMorph.prototype.customPaletteButton; + +StageMorph.prototype.makeVariableButton + = SpriteMorph.prototype.makeVariableButton; + +StageMorph.prototype.categoryText = SpriteMorph.prototype.categoryText; +StageMorph.prototype.devModeText = SpriteMorph.prototype.devModeText; + +StageMorph.prototype.deleteVariableButton + = SpriteMorph.prototype.deleteVariableButton; + +StageMorph.prototype.customBlockTemplatesForCategory + = SpriteMorph.prototype.customBlockTemplatesForCategory; + +StageMorph.prototype.getPrimitiveTemplates + = SpriteMorph.prototype.getPrimitiveTemplates; + +StageMorph.prototype.palette = SpriteMorph.prototype.palette; +StageMorph.prototype.freshPalette = SpriteMorph.prototype.freshPalette; +StageMorph.prototype.blocksMatching = SpriteMorph.prototype.blocksMatching; +StageMorph.prototype.searchBlocks = SpriteMorph.prototype.searchBlocks; + +// StageMorph utilities for showing & hiding blocks in the palette + +StageMorph.prototype.allPaletteBlocks + = SpriteMorph.prototype.allPaletteBlocks; + +StageMorph.prototype.isHidingBlock = SpriteMorph.prototype.isHidingBlock; +StageMorph.prototype.isDisablingBlock = SpriteMorph.prototype.isDisablingBlock; + +StageMorph.prototype.changeBlockVisibility + = SpriteMorph.prototype.changeBlockVisibility; + +StageMorph.prototype.changePrimitiveVisibility + = SpriteMorph.prototype.changePrimitiveVisibility; + +StageMorph.prototype.changeCustomBlockVisibility + = SpriteMorph.prototype.changeCustomBlockVisibility; + +StageMorph.prototype.changeVarBlockVisibility + = SpriteMorph.prototype.changeVarBlockVisibility; + +StageMorph.prototype.emptyCategories = + SpriteMorph.prototype.emptyCategories; + +StageMorph.prototype.hasPrimitiveCategories = + SpriteMorph.prototype.hasPrimitiveCategories; + +// StageMorph neighbor detection + +StageMorph.prototype.neighbors = SpriteMorph.prototype.neighbors; +StageMorph.prototype.perimeter = SpriteMorph.prototype.perimeter; + +// StageMorph block rendering + +StageMorph.prototype.doScreenshot = SpriteMorph.prototype.doScreenshot; +StageMorph.prototype.newCostumeName = SpriteMorph.prototype.newCostumeName; +StageMorph.prototype.blockForSelector = SpriteMorph.prototype.blockForSelector; + +// StageMorph variable watchers (for palette checkbox toggling) + +StageMorph.prototype.findVariableWatcher + = SpriteMorph.prototype.findVariableWatcher; + +StageMorph.prototype.toggleVariableWatcher + = SpriteMorph.prototype.toggleVariableWatcher; + +StageMorph.prototype.showingVariableWatcher + = SpriteMorph.prototype.showingVariableWatcher; + +StageMorph.prototype.deleteVariableWatcher + = SpriteMorph.prototype.deleteVariableWatcher; + +// StageMorph background management + +StageMorph.prototype.addCostume + = SpriteMorph.prototype.addCostume; + +StageMorph.prototype.wearCostume + = SpriteMorph.prototype.wearCostume; + +StageMorph.prototype.getCostumeIdx + = SpriteMorph.prototype.getCostumeIdx; + +StageMorph.prototype.doWearNextCostume + = SpriteMorph.prototype.doWearNextCostume; + +StageMorph.prototype.doWearPreviousCostume + = SpriteMorph.prototype.doWearPreviousCostume; + +StageMorph.prototype.doSwitchToCostume + = SpriteMorph.prototype.doSwitchToCostume; + +StageMorph.prototype.reportCostumes + = SpriteMorph.prototype.reportCostumes; + +// StageMorph graphic effects + +StageMorph.prototype.graphicsChanged + = SpriteMorph.prototype.graphicsChanged; + +StageMorph.prototype.applyGraphicsEffects + = SpriteMorph.prototype.applyGraphicsEffects; + +StageMorph.prototype.setEffect + = SpriteMorph.prototype.setEffect; + +StageMorph.prototype.getEffect + = SpriteMorph.prototype.getEffect; + +StageMorph.prototype.getGhostEffect + = SpriteMorph.prototype.getGhostEffect; + +StageMorph.prototype.changeEffect + = SpriteMorph.prototype.changeEffect; + +StageMorph.prototype.clearEffects + = SpriteMorph.prototype.clearEffects; + +// StageMorph talk bubble + +StageMorph.prototype.stopTalking = SpriteMorph.prototype.stopTalking; + +StageMorph.prototype.bubble = function (data) { + var bubble; + this.stopTalking(); + if (data === '' || isNil(data)) {return; } + bubble = new StageBubbleMorph(data, this); + this.add(bubble); + this.positionTalkBubble(); +}; + +StageMorph.prototype.talkBubble = SpriteMorph.prototype.talkBubble; + +StageMorph.prototype.positionTalkBubble = function () { + var bubble = this.talkBubble(); + if (!bubble) {return null; } + bubble.show(); + bubble.keepWithin(this); +}; + +StageMorph.prototype.doThink = StageMorph.prototype.bubble; + +// StageMorph sound management + +StageMorph.prototype.addSound + = SpriteMorph.prototype.addSound; + +StageMorph.prototype.doPlaySound + = SpriteMorph.prototype.doPlaySound; + +StageMorph.prototype.stopAllActiveSounds = function () { + this.activeSounds.forEach(audio => audio.pause()); + this.activeSounds = []; + if (this.microphone.modifier && this.microphone.isReady) { + this.microphone.stop(); + } +}; + +StageMorph.prototype.pauseAllActiveSounds = function () { + this.activeSounds.forEach(audio => audio.pause()); +}; + +StageMorph.prototype.resumeAllActiveSounds = function () { + this.activeSounds.forEach(audio => audio.play()); +}; + +StageMorph.prototype.reportSounds + = SpriteMorph.prototype.reportSounds; + +StageMorph.prototype.newSoundName + = SpriteMorph.prototype.newSoundName; + +// StageMorph volume + +StageMorph.prototype.setVolume + = SpriteMorph.prototype.setVolume; + +StageMorph.prototype.changeVolume + = SpriteMorph.prototype.changeVolume; + +StageMorph.prototype.getVolume + = SpriteMorph.prototype.getVolume; + +StageMorph.prototype.getGainNode + = SpriteMorph.prototype.getGainNode; + +StageMorph.prototype.audioContext + = SpriteMorph.prototype.audioContext; + +// StageMorph stereo panning + +StageMorph.prototype.setPan + = SpriteMorph.prototype.setPan; + +StageMorph.prototype.changePan + = SpriteMorph.prototype.changePan; + +StageMorph.prototype.getPan + = SpriteMorph.prototype.getPan; + +StageMorph.prototype.getPannerNode + = SpriteMorph.prototype.getPannerNode; + +// StageMorph frequency player + +StageMorph.prototype.playFreq + = SpriteMorph.prototype.playFreq; + +StageMorph.prototype.stopFreq + = SpriteMorph.prototype.stopFreq; + +// StageMorph non-variable watchers + +StageMorph.prototype.toggleWatcher + = SpriteMorph.prototype.toggleWatcher; + +StageMorph.prototype.showingWatcher + = SpriteMorph.prototype.showingWatcher; + +StageMorph.prototype.watcherFor = + SpriteMorph.prototype.watcherFor; + +StageMorph.prototype.getLastAnswer + = SpriteMorph.prototype.getLastAnswer; + +StageMorph.prototype.reportThreadCount + = SpriteMorph.prototype.reportThreadCount; + +// StageMorph coordinate conversion + +StageMorph.prototype.snapPoint + = SpriteMorph.prototype.snapPoint; + +StageMorph.prototype.worldPoint = + SpriteMorph.prototype.worldPoint; + +// StageMorph dimension getters + +StageMorph.prototype.xCenter = function () { + return 0; +}; + +StageMorph.prototype.yCenter = function () { + return 0; +}; + +StageMorph.prototype.xLeft = function () { + return this.dimensions.x * -0.5; +}; + +StageMorph.prototype.xRight = function () { + return this.dimensions.x / 2; +}; + +StageMorph.prototype.yTop = function () { + return this.dimensions.y / 2; +}; + +StageMorph.prototype.yBottom = function () { + return this.dimensions.y * -0.5; +}; + +// StageMorph message broadcasting + +StageMorph.prototype.allMessageNames + = SpriteMorph.prototype.allMessageNames; + +StageMorph.prototype.allSendersOf + = SpriteMorph.prototype.allSendersOf; + +StageMorph.prototype.allHatBlocksFor + = SpriteMorph.prototype.allHatBlocksFor; + +StageMorph.prototype.allHatBlocksForKey + = SpriteMorph.prototype.allHatBlocksForKey; + +StageMorph.prototype.allHatBlocksForInteraction + = SpriteMorph.prototype.allHatBlocksForInteraction; + +StageMorph.prototype.allHatBlocksForUserEdit = + SpriteMorph.prototype.allHatBlocksForUserEdit; + +StageMorph.prototype.hasGenericHatBlocks + = SpriteMorph.prototype.hasGenericHatBlocks; + +StageMorph.prototype.allGenericHatBlocks + = SpriteMorph.prototype.allGenericHatBlocks; + +StageMorph.prototype.allScripts + = SpriteMorph.prototype.allScripts; + +// StageMorph events + +StageMorph.prototype.mouseClickLeft + = SpriteMorph.prototype.mouseClickLeft; + +StageMorph.prototype.mouseEnter + = SpriteMorph.prototype.mouseEnter; + +StageMorph.prototype.mouseLeave = function () { + this.receiveUserInteraction('mouse-departed'); +}; + +StageMorph.prototype.mouseDownLeft + = SpriteMorph.prototype.mouseDownLeft; + +StageMorph.prototype.mouseScroll + = SpriteMorph.prototype.mouseScroll; + +StageMorph.prototype.receiveUserInteraction + = SpriteMorph.prototype.receiveUserInteraction; + +// StageMorph custom blocks + +StageMorph.prototype.deleteAllBlockInstances + = SpriteMorph.prototype.deleteAllBlockInstances; + +StageMorph.prototype.allBlockInstances + = SpriteMorph.prototype.allBlockInstances; + +StageMorph.prototype.allBlockInstancesInData = function (definition) { + var blocks = []; + this.allContextsUsing(definition).forEach(context => { + if (context.expression instanceof BlockMorph) { + context.expression.allChildren().forEach(c => { + if (c.isCustomBlock && (c.definition === definition)) { + blocks.push(c); + } + }); + } + }); + return blocks; +}; + +StageMorph.prototype.allContextsUsing = function (definition) { + var objects, + contexts = [], + charted = []; + + if (!definition.isGlobal) {return []; } + + function scanVariables(varFrame) { + varFrame.names().forEach(vname => { + var value = varFrame.getVar(vname); + if (value instanceof Context) { + scanContext(value); + } else if (value instanceof List) { + scanList(value); + } + }); + } + + function scanContext(context) { + if (!charted.includes(context)) { + charted.push(context); + } + if (context.expression instanceof BlockMorph && + context.expression.allChildren().some(c => + c.isCustomBlock && (c.definition === definition)) + ) { + contexts.push(context); + } + } + + function scanList(list) { + if (!charted.includes(list)) { + charted.push(list); + if (!list.canBeJSON()) { + list.map(each => { + if (each instanceof Context) { + scanContext(each); + } else if (each instanceof List) { + scanList(each); + } + }); + } + } + } + + objects = this.children.filter(morph => morph instanceof SpriteMorph); + objects.push(this); + scanVariables(this.globalVariables()); + objects.forEach(sprite => scanVariables(sprite.variables)); + this.threads.processes.forEach(proc => { + if (proc.context instanceof Context) { + scanContext(proc.context); + } + }); + return contexts; +}; + +StageMorph.prototype.allBlockInvocationsInData = function (oldSpec, receiver) { + var blocks = []; + this.allContextsInvoking(oldSpec, receiver).forEach(context => { + if (context.expression instanceof BlockMorph) { + context.expression.allChildren().forEach(c => { + if (c.isCustomBlock && + !c.isGlobal && + (c.blockSpec === oldSpec) + ) { + blocks.push(c); + } + }); + } + }); + return blocks; +}; + +StageMorph.prototype.allContextsInvoking = function (oldSpec, receiver) { + var objects, + contexts = [], + charted = []; + + function scanVariables(varFrame) { + varFrame.names().forEach(vname => { + var value = varFrame.getVar(vname); + if (value instanceof Context) { + scanContext(value); + } else if (value instanceof List) { + scanList(value); + } + }); + } + + function scanContext(context) { + if (!charted.includes(context)) { + charted.push(context); + } + if ((context.receiver === receiver || context.receiver === null) && + context.expression instanceof BlockMorph && + context.expression.allChildren().some(c => + c.isCustomBlock && !c.isGlobal && (c.blockSpec === oldSpec) + ) + ) { + contexts.push(context); + } + } + + function scanList(list) { + if (!charted.includes(list)) { + charted.push(list); + list.map(each => { + if (each instanceof Context) { + scanContext(each); + } else if (each instanceof List) { + scanList(each); + } + }); + } + } + + objects = this.children.filter(morph => morph instanceof SpriteMorph); + objects.push(this); + scanVariables(this.globalVariables()); + objects.forEach(sprite => scanVariables(sprite.variables)); + this.threads.processes.forEach(proc => { + if (proc.context instanceof Context) { + scanContext(proc.context); + } + }); + return contexts; +}; + +StageMorph.prototype.allLocalBlockInstances + = SpriteMorph.prototype.allLocalBlockInstances; + +StageMorph.prototype.allEditorBlockInstances + = SpriteMorph.prototype.allEditorBlockInstances; + +StageMorph.prototype.paletteBlockInstance + = SpriteMorph.prototype.paletteBlockInstance; + +StageMorph.prototype.usesBlockInstance + = SpriteMorph.prototype.usesBlockInstance; + +StageMorph.prototype.doubleDefinitionsFor + = SpriteMorph.prototype.doubleDefinitionsFor; + +StageMorph.prototype.replaceDoubleDefinitionsFor + = SpriteMorph.prototype.replaceDoubleDefinitionsFor; + +StageMorph.prototype.allInvocationsOf + = SpriteMorph.prototype.allInvocationsOf; + +StageMorph.prototype.allIndependentInvocationsOf + = SpriteMorph.prototype.allInvocationsOf; + +StageMorph.prototype.allDependentInvocationsOf + = SpriteMorph.prototype.allInvocationsOf; + +// StageMorph inheritance support - general + +StageMorph.prototype.specimens = function () { + return []; +}; + +StageMorph.prototype.allSpecimens = function () { + return []; +}; + +StageMorph.prototype.shadowAttribute = nop; + +// StageMorph inheritance support - attributes + +StageMorph.prototype.inheritsAttribute = function () { + return false; +}; + +// StageMorph inheritance support - variables + +StageMorph.prototype.globalVariables + = SpriteMorph.prototype.globalVariables; + +StageMorph.prototype.inheritedVariableNames = function () { + return []; +}; + +StageMorph.prototype.deletableVariableNames = function () { + return this.variables.allNames(); +}; + +StageMorph.prototype.allLocalVariableNames + = SpriteMorph.prototype.allLocalVariableNames; + +StageMorph.prototype.allGlobalVariableNames + = SpriteMorph.prototype.allGlobalVariableNames; + +// StageMorph inheritance - custom blocks + +StageMorph.prototype.getMethod + = SpriteMorph.prototype.getMethod; + +StageMorph.prototype.getLocalMethod + = SpriteMorph.prototype.getLocalMethod; + +StageMorph.prototype.ownBlocks + = SpriteMorph.prototype.ownBlocks; + +StageMorph.prototype.allBlocks = function (valuesOnly) { + var dict = this.ownBlocks(); + if (valuesOnly) { + return Object.keys(dict).map(key => dict[key]); + } + return dict; +}; + +StageMorph.prototype.inheritedBlocks = function () { + return []; +}; + +// StageMorph recording and synching user edits + +StageMorph.prototype.recordUserEdit = + SpriteMorph.prototype.recordUserEdit; + +StageMorph.prototype.scriptsOnlyXML = + SpriteMorph.prototype.scriptsOnlyXML; + +StageMorph.prototype.synchScriptsFrom = + SpriteMorph.prototype.synchScriptsFrom; + +// StageMorph pen trails as costume + +StageMorph.prototype.reportPenTrailsAsCostume = function () { + return new Costume( + this.trailsCanvas, + this.newCostumeName(localize('Background')) + ); +}; + +// StageMorph scanning global custom blocks for message sends + +StageMorph.prototype.globalBlocksSending = function (message, receiverName) { + // "transitive hull" + var all = this.globalBlocks.filter( + def => def.isSending(message, receiverName) + ); + this.globalBlocks.forEach(def => { + if (def.collectDependencies([], []).some(dep => contains(all, dep))) { + all.push(def); + } + }); + return all; +}; + +// StageMorph serialization & exporting utils + +StageMorph.prototype.toXMLString = function () { + // answer an xml string representation of this sprite and all parts + // attached to it, including all dependencies (global custom blocks). + var ide = this.parentThatIsA(IDE_Morph), + dependencies = [], + categories = [], + blocksXML = '', + conversion, + xml; + + function collect(item, array) { + // only once + if (!contains(array, item)) { + array.push(item); + } + } + + function collectAll(items, array) { + items.forEach(item => collect(item, array)); + } + + // collect all dependencies and custom categories. + // only collect global custom block dependencies, because the locals + // will be included in each sprite's serialization code + + // global block definition in scripts + this.scripts.children.filter( + morph => morph instanceof BlockMorph + ).forEach(script => + collectAll( + script.dependencies(true), + dependencies + ) + ); + + // global block definitions referenced in local block definitions + this.customBlocks.forEach(def => { + collect(def.category, categories); + collectAll( + def.collectDependencies([], [], this) + .filter(each => each.isGlobal), + dependencies + ); + }); + + // encode both parts of the export-file: + // the blocks library and the sprites + + if (dependencies.length || categories.length) { + blocksXML = ide.blocksLibraryXML(dependencies, categories); + } + + conversion = this.toXML; + this.toXML = this.toSpriteXML; + xml = '' + + blocksXML + + ide.serializer.serialize([this]) + + ''; + this.toXML = conversion; + return xml; +}; + +// SpriteBubbleMorph //////////////////////////////////////////////////////// + +/* + I am a sprite's scaleable speech bubble. I rely on SpriteMorph + for my preferences settings +*/ + +// SpriteBubbleMorph inherits from SpeechBubbleMorph: + +SpriteBubbleMorph.prototype = new SpeechBubbleMorph(); +SpriteBubbleMorph.prototype.constructor = SpriteBubbleMorph; +SpriteBubbleMorph.uber = SpeechBubbleMorph.prototype; + +// SpriteBubbleMorph instance creation: + +function SpriteBubbleMorph(data, stage, isThought, isQuestion) { + this.init(data, stage, isThought, isQuestion); +} + +SpriteBubbleMorph.prototype.init = function ( + data, + stage, + isThought, + isQuestion +) { + var sprite = SpriteMorph.prototype; + this.stage = stage; + this.scale = stage ? stage.scale : 1; + this.data = data; + this.isQuestion = isQuestion; + this.bubbleFontColor = BLACK; + this.bubbleFontSize = sprite.bubbleFontSize; + this.bubbleFontIsBold = sprite.bubbleFontIsBold; + this.bubbleFontAlignment = 'center'; + this.bubbleCorner = sprite.bubbleCorner; + this.bubbleBorder = sprite.bubbleBorder; + this.bubblePadding = this.bubbleCorner / 2; + this.maxTextWidth = sprite.bubbleMaxTextWidth; + + SpriteBubbleMorph.uber.init.call( + this, + this.data, + sprite.bubbleColor, + null, + null, + isQuestion ? sprite.blockColor.sensing : sprite.bubbleBorderColor, + null, + isThought, + true // no shadow + ); + + this.isCachingImage = true; + this.rerender(); +}; + +// SpriteBubbleMorph contents formatting + +SpriteBubbleMorph.prototype.dataAsMorph = function (data) { + var contents, + scroller, + sprite = SpriteMorph.prototype, + maxHeight = (this.stage?.dimensions?.y || 360) * this.scale - + (this.border + this.padding + 1) * 2, + isText, + img, + scaledImg, + width; + + if (data instanceof Morph) { + if (isSnapObject(data)) { + img = data.thumbnail(new Point(40, 40)); + contents = new Morph(); + contents.isCachingImage = true; + contents.bounds.setWidth(img.width); + contents.bounds.setHeight(img.height); + contents.cachedImage = img; + contents.version = data.version; + contents.step = function () { + if (this.version !== data.version) { + img = data.thumbnail(new Point(40, 40), this.cachedImage); + this.cachedImage = img; + this.version = data.version; + this.changed(); + } + }; + } else { + contents = data; + } + } else if (isString(data)) { + isText = true; + contents = new TextMorph( + data, + this.bubbleFontSize * this.scale, + null, // fontStyle + this.bubbleFontIsBold, + false, // italic + this.bubbleFontAlignment + ); + + // support exporting text / numbers directly from speech balloons: + contents.userMenu = function () { + var menu = new MenuMorph(this), + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + if (ide.isAppMode) {return; } + menu.addItem( + 'export', + () => ide.saveFileAs( + data, + 'text/plain;charset=utf-8', + localize('data') + ) + ); + return menu; + }; + + } else if (typeof data === 'boolean') { + img = sprite.booleanMorph(data).fullImage(); + contents = new Morph(); + contents.isCachingImage = true; + contents.bounds.setWidth(img.width); + contents.bounds.setHeight(img.height); + contents.cachedImage = img; + } else if (data instanceof Costume) { + img = data.thumbnail(new Point(40, 40)); + contents = new Morph(); + contents.isCachingImage = true; + contents.bounds.setWidth(img.width); + contents.bounds.setHeight(img.height); + contents.cachedImage = img; + + // support costumes to be dragged out of speech balloons: + contents.isDraggable = !sprite.disableDraggingData; + + contents.selectForEdit = function () { + var cst = data.copy(), + icon, + prepare, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + cst.name = ide.currentSprite.newCostumeName(cst.name); + icon = new CostumeIconMorph(cst); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + icon.setCenter(this.center()); + return icon; + }; + + // support exporting costumes directly from speech balloons: + contents.userMenu = function () { + var menu = new MenuMorph(this), + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + if (ide.isAppMode) {return; } + menu.addItem( + 'export', + () => { + if (data instanceof SVG_Costume) { + // don't show SVG costumes in a new tab (shows text) + ide.saveFileAs( + data.contents.src, + 'text/svg', + data.name + ); + } else { // rasterized Costume + ide.saveCanvasAs(data.contents, data.name); + } + } + ); + return menu; + }; + + } else if (data instanceof Sound) { + contents = new SymbolMorph('notes', 30); + + // support sounds to be dragged out of speech balloons: + contents.isDraggable = !sprite.disableDraggingData; + + contents.selectForEdit = function () { + var snd = data.copy(), + icon, + prepare, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + snd.name = ide.currentSprite.newSoundName(snd.name); + icon = new SoundIconMorph(snd); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + icon.setCenter(this.center()); + return icon; + }; + + // support exporting sounds directly from speech balloons: + contents.userMenu = function () { + var menu = new MenuMorph(this), + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + if (ide.isAppMode) {return; } + menu.addItem( + 'export', + () => ide.saveAudioAs(data.audio, data.name) + ); + return menu; + }; + + } else if (data instanceof HTMLCanvasElement) { + img = data; + contents = new Morph(); + contents.isCachingImage = true; + contents.bounds.setWidth(img.width); + contents.bounds.setHeight(img.height); + contents.cachedImage = img; + } else if (data instanceof List) { + if (data.isTable()) { + contents = new TableFrameMorph(new TableMorph(data, 10)); + if (this.stage) { + contents.expand(this.stage.extent().translateBy( + -2 * (this.edge + this.border + this.padding) + )); + } + } else { + contents = new ListWatcherMorph(data); + contents.update(true); + contents.step = contents.update; + if (this.stage) { + contents.expand(this.stage.extent().translateBy( + -2 * (this.edge + this.border + this.padding) + )); + } + } + contents.isDraggable = false; + } else if (data instanceof Context) { + img = data.image(); + contents = new Morph(); + contents.isCachingImage = true; + contents.bounds.setWidth(img.width); + contents.bounds.setHeight(img.height); + contents.cachedImage = img; + contents.version = data.version; + contents.step = function () { + if (this.version !== data.version) { + img = data.image(); + this.cachedImage = img; + this.version = data.version; + this.changed(); + } + }; + + // support blocks to be dragged out of speech balloons: + contents.isDraggable = !sprite.disableDraggingData; + + contents.selectForEdit = function () { + var script = data.toUserBlock(), + prepare = script.prepareToBeGrabbed, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + script.prepareToBeGrabbed = function (hand) { + prepare.call(this, hand); + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + script.setPosition(this.position()); + return script; + }; + } else { + contents = new TextMorph( + data.toString(), + this.bubbleFontSize * this.scale, + null, // fontStyle + this.bubbleFontIsBold, + false, // italic + 'center' + ); + + // support exporting text / numbers directly from speech balloons: + contents.userMenu = function () { + var menu = new MenuMorph(this), + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + if (ide.isAppMode) {return; } + menu.addItem( + 'export', + () => ide.saveFileAs( + data.toString(), + 'text/plain;charset=utf-8', + localize('data') + ) + ); + return menu; + }; + + } + if (contents instanceof TextMorph) { + // reflow text boundaries + width = Math.max( + contents.width(), + sprite.bubbleCorner * 2 * this.scale + ); + if (isText) { + width = Math.min(width, this.maxTextWidth * this.scale); + } + contents.color = this.bubbleFontColor; + contents.setWidth(width); + + if (contents.height() > maxHeight) { // scroll + scroller = new ScrollFrameMorph(); + scroller.acceptsDrops = false; + scroller.contents.acceptsDrops = false; + scroller.bounds.setWidth(contents.width()); + scroller.bounds.setHeight(maxHeight); + scroller.addContents(contents); + scroller.color = new Color(0, 0, 0, 0); + + // scroll to the bottom: + scroller.scrollY(scroller.bottom() - contents.bottom()); + scroller.adjustScrollBars(); + + contents = scroller; + } + + } else if (!(data instanceof List)) { + // scale contents image + scaledImg = newCanvas(contents.extent().multiplyBy(this.scale)); + scaledImg.getContext('2d').drawImage( + contents.getImage(), + 0, + 0, + scaledImg.width, + scaledImg.height + ); + contents.cachedImage = scaledImg; + contents.bounds = contents.bounds.scaleBy(this.scale); + } + return contents; +}; + +// SpriteBubbleMorph scaling + +SpriteBubbleMorph.prototype.setScale = function (scale) { + this.scale = scale; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +// SpriteBubbleMorph layout: + +SpriteBubbleMorph.prototype.fixLayout = function () { + // scale my settings + this.edge = this.bubbleCorner * this.scale; + this.border = this.bubbleBorder * this.scale; + this.padding = this.bubblePadding * this.scale; + + // rebuild my contents + if (!(this.contentsMorph instanceof ListWatcherMorph || + this.contentsMorph instanceof TableFrameMorph)) { + this.contentsMorph.destroy(); + this.contentsMorph = this.dataAsMorph(this.data); + } + this.add(this.contentsMorph); + + // adjust my dimensions + this.adjustDimensions(); + + // position my contents + this.contentsMorph.setPosition(this.position().add( + new Point( + this.padding || this.edge, + this.border + this.padding + 1 + ) + )); +}; + +SpriteBubbleMorph.prototype.adjustDimensions = function () { + this.bounds.setWidth(this.contentsMorph.width() + + (this.padding ? this.padding * 2 : this.edge * 2)); + this.bounds.setHeight(this.contentsMorph.height() + + this.edge + + this.border * 2 + + this.padding * 2 + + 2); +}; + +// StageBubbleMorph //////////////////////////////////////////////////////// + +/* + I am a stage's scaleable speech bubble. I rely on SpriteMorph + for my preferences settings and quasi-inherit from SpriteBubbleMorph +*/ + +// StageBubbleMorph inherits from SpeechBubbleMorph: + +StageBubbleMorph.prototype = new SpeechBubbleMorph(); +StageBubbleMorph.prototype.constructor = StageBubbleMorph; +StageBubbleMorph.uber = SpeechBubbleMorph.prototype; + +// StageBubbleMorph instance creation: + +function StageBubbleMorph(data, stage) { + this.init(data, stage); +} + +StageBubbleMorph.prototype.init = function (data, stage) { + var sprite = SpriteMorph.prototype; + this.stage = stage; + this.scale = stage ? stage.scale : 1; + this.data = data; + this.bubbleFontColor = BLACK; + this.bubbleFontSize = sprite.bubbleFontSize; + this.bubbleFontIsBold = false; // sprite.bubbleFontIsBold; + this.bubbleCorner = sprite.bubbleCorner; + this.bubbleBorder = sprite.bubbleBorder; + this.bubblePadding = this.bubbleCorner / 2; + this.maxTextWidth = stage.dimensions.x - sprite.bubbleCorner; + this.bubbleFontAlignment = 'left'; + + StageBubbleMorph.uber.init.call( + this, + this.data, + sprite.bubbleColor, + null, + null, + sprite.bubbleBorderColor, + null, + null, // isThought + true // no shadow + ); + + this.isCachingImage = true; + this.rerender(); +}; + +// SpriteBubbleMorph contents formatting + +StageBubbleMorph.prototype.dataAsMorph = + SpriteBubbleMorph.prototype.dataAsMorph; + +// SpriteBubbleMorph scaling + +StageBubbleMorph.prototype.setScale = SpriteBubbleMorph.prototype.setScale; + +// SpriteBubbleMorph layout: + +StageBubbleMorph.prototype.fixLayout = SpriteBubbleMorph.prototype.fixLayout; + +StageBubbleMorph.prototype.adjustDimensions = function () { + this.bounds.setWidth(this.contentsMorph.width() + + (this.padding ? this.padding * 2 : this.edge * 2)); + this.bounds.setHeight(this.contentsMorph.height() + + this.edge + + this.border * 2); +}; + +StageBubbleMorph.prototype.outlinePath = BoxMorph.prototype.outlinePath; + +// Costume ///////////////////////////////////////////////////////////// + +/* + I am a picture that's "wearable" by a sprite. My rotationCenter is + relative to my contents position. I can also contain embedded data + (a string), e.g. for sharing a CSV or JSON or serialized blocks, + sprites, scenes in XML format. +*/ + +// Costume instance creation + +function Costume(canvas, name, rotationCenter, noFit, maxExtent) { + this.contents = canvas ? normalizeCanvas(canvas, true) + : newCanvas(null, true); + if (!noFit) {this.shrinkToFit(maxExtent || this.maxExtent()); } + this.name = name || null; + this.rotationCenter = rotationCenter || this.center(); + this.embeddedData = null; // must be a string or null + this.version = Date.now(); // for observer optimization + this.loaded = null; // for de-serialization only +} + +Costume.prototype.maxDimensions = new Point(480, 360); + +Costume.prototype.maxExtent = function () { + // return StageMorph.prototype.dimensions; + return this.maxDimensions; +}; + +Costume.prototype.toString = function () { + return 'a Costume(' + this.name + ')'; +}; + +// Costume dimensions - all relative + +Costume.prototype.extent = function () { + return new Point(this.contents.width, this.contents.height); +}; + +Costume.prototype.center = function () { + return this.extent().divideBy(2); +}; + +Costume.prototype.width = function () { + return this.contents.width; +}; + +Costume.prototype.height = function () { + return this.contents.height; +}; + +Costume.prototype.bounds = function () { + return new Rectangle(0, 0, this.width(), this.height()); +}; + +// Costume shrink-wrapping + +Costume.prototype.shrinkWrap = function () { + // adjust my contents' bounds to my visible bounding box + var bb = this.boundingBox(), + ext = bb.extent(), + pic = newCanvas(ext, true), + ctx = pic.getContext('2d'); + + ctx.drawImage( + this.contents, + bb.origin.x, + bb.origin.y, + ext.x, + ext.y, + 0, + 0, + ext.x, + ext.y + ); + this.rotationCenter = this.rotationCenter.subtract(bb.origin); + this.contents = pic; + this.version = Date.now(); +}; + +Costume.prototype.canvasBoundingBox = function (pic) { + // answer the rectangle surrounding my contents' non-transparent pixels + var row, + col, + w = pic.width, + h = pic.height, + ctx = pic.getContext('2d'), + dta = ctx.getImageData(0, 0, w, h); + + function getAlpha(x, y) { + return dta.data[((y * w * 4) + (x * 4)) + 3]; + } + + function getLeft() { + for (col = 0; col < w; col += 1) { + for (row = 0; row < h; row += 1) { + if (getAlpha(col, row)) { + return col; + } + } + } + return 0; + } + + function getTop() { + for (row = 0; row < h; row += 1) { + for (col = 0; col < w; col += 1) { + if (getAlpha(col, row)) { + return row; + } + } + } + return 0; + } + + function getRight() { + for (col = w - 1; col >= 0; col -= 1) { + for (row = h - 1; row >= 0; row -= 1) { + if (getAlpha(col, row)) { + return Math.min(col + 1, w); + } + } + } + return w; + } + + function getBottom() { + for (row = h - 1; row >= 0; row -= 1) { + for (col = w - 1; col >= 0; col -= 1) { + if (getAlpha(col, row)) { + return Math.min(row + 1, h); + } + } + } + return h; + } + + return new Rectangle(getLeft(), getTop(), getRight(), getBottom()); +}; + +Costume.prototype.boundingBox = function () { + return this.canvasBoundingBox(this.contents); +}; + +// Costume duplication + +Costume.prototype.copy = function () { + var canvas = newCanvas(this.extent(), true), + cpy, + ctx; + ctx = canvas.getContext('2d'); + ctx.drawImage(this.contents, 0, 0); + cpy = new Costume(canvas, this.name ? copy(this.name) : null); + cpy.rotationCenter = this.rotationCenter.copy(); + return cpy; +}; + +// Costume flipping & stretching + +Costume.prototype.flipped = function () { +/* + answer a copy of myself flipped horizontally + (mirrored along a vertical axis), used for + SpriteMorph's rotation style type 2 +*/ + var canvas = newCanvas(this.extent(), true), + ctx = canvas.getContext('2d'), + flipped; + + ctx.translate(this.width(), 0); + ctx.scale(-1, 1); + ctx.drawImage(this.contents, 0, 0); + flipped = new Costume( + canvas, + this.name, + new Point( + this.width() - this.rotationCenter.x, + this.rotationCenter.y + ), + true // no shrink-wrap + ); + return flipped; +}; + +Costume.prototype.stretched = function (w, h) { + w = (Math.sign(w) || 1) * Math.max(1, Math.abs(w)); + h = (Math.sign(h) || 1) * Math.max(1, Math.abs(h)); + + var canvas = newCanvas(new Point(Math.abs(w), Math.abs(h)), true), + ctx = canvas.getContext('2d'), + xRatio = w / this.width(), + yRatio = h / this.height(), + center = this.rotationCenter.multiplyBy(new Point(xRatio, yRatio)), + stretched; + + if (xRatio < 0) { + center.x = canvas.width - Math.abs(center.x); + } + if (yRatio < 0) { + center.y = canvas.height - Math.abs(center.y); + } + + ctx.translate(Math.abs(Math.min(w, 0)), Math.abs(Math.min(h, 0))); + ctx.scale(xRatio, yRatio); + // first rasterize in case it's an SVG and in case it's on Firefox + // because Firefox prevents stretching of SVGs with locked aspect ratios + ctx.drawImage(this.rasterized().contents, 0, 0); + stretched = new Costume( + canvas, + this.name, + center, + true + ); + return stretched; +}; + +// Costume actions + +Costume.prototype.edit = function (aWorld, anIDE, isnew, oncancel, onsubmit) { + var editor = new PaintEditorMorph(); + editor.oncancel = oncancel || nop; + editor.openIn( + aWorld, + isnew ? + newCanvas(anIDE.stage.dimensions, true) : + this.contents, + isnew ? + null : + this.rotationCenter, + (img, rc) => { + this.contents = img; + this.rotationCenter = rc; + this.version = Date.now(); + aWorld.changed(); + if (anIDE) { + if (anIDE.currentSprite instanceof SpriteMorph) { + // don't shrinkwrap stage costumes + this.shrinkWrap(); + } + anIDE.currentSprite.wearCostume(this, true); // don't shadow + anIDE.hasChangedMedia = true; + } + (onsubmit || nop)(); + }, + anIDE + ); +}; + +Costume.prototype.editRotationPointOnly = function (aWorld, anIDE) { + var editor = new CostumeEditorMorph(this), + action, + dialog, + txt; + + editor.fixLayout(); + action = () => { + editor.accept(); + anIDE.currentSprite.wearCostume(this, true); // don't shadow + }; + dialog = new DialogBoxMorph(this, action); + txt = new TextMorph( + localize('click or drag crosshairs to move the rotation center'), + dialog.fontSize, + dialog.fontStyle, + true, + false, + 'center', + null, + null, + new Point(1, 1), + WHITE + ); + + dialog.labelString = 'Costume Editor'; + dialog.createLabel(); + dialog.setPicture(editor); + dialog.addBody(txt); + dialog.addButton('ok', 'Ok'); + dialog.addButton('cancel', 'Cancel'); + dialog.fixLayout(); + dialog.popUp(aWorld); +}; + +// Costume thumbnail + +Costume.prototype.shrinkToFit = function (extentPoint) { + if (extentPoint.x < this.width() || (extentPoint.y < this.height())) { + this.contents = this.thumbnail(extentPoint, null, true); + } +}; + +Costume.prototype.thumbnail = function (extentPoint, recycleMe, noPadding) { + // answer a new Canvas of extentPoint dimensions containing + // my thumbnail representation keeping the originial aspect ratio + // a "recycleMe canvas can be passed for re-use + // if "noPadding" is "true" the resulting thumbnail fits inside the + // given extentPoint without padding it, i.e. one of the dimensions + // is likely to be lesser than that of the extentPoint + var src = this.contents, + w = src ? src.width : 1, // could be an asynchronously loading SVG + h = src ? src.height : 1, // could be an asynchronously loading SVG + scale = Math.min( + (extentPoint.x / w), + (extentPoint.y / h) + ), + xOffset = noPadding ? 0 + : Math.floor((extentPoint.x - (w * scale)) / 2), + yOffset = noPadding ? 0 + : Math.floor((extentPoint.y - (h * scale)) / 2), + trg, ctx; + + trg = newCanvas( + noPadding ? new Point(this.width() * scale, this.height() * scale) + : extentPoint, + true, // non-retina + recycleMe + ); + if (!src || src.width + src.height === 0) {return trg; } + ctx = trg.getContext('2d'); + ctx.save(); + ctx.scale(scale, scale); + ctx.drawImage( + src, + Math.floor(xOffset / scale), + Math.floor(yOffset / scale) + ); + ctx.restore(); + return trg; +}; + +// Costume pixel access + +Costume.prototype.rasterized = function () { + return this; +}; + +Costume.prototype.pixels = function () { + var pixels = [], + src, + i; + + if (!this.contents.width || !this.contents.height) { + return pixels; + } + src = this.contents.getContext('2d').getImageData( + 0, + 0, + this.contents.width, + this.contents.height + ); + for (i = 0; i < src.data.length; i += 4) { + pixels.push(new List([ + src.data[i], + src.data[i + 1], + src.data[i + 2], + src.data[i + 3] + ])); + } + return new List(pixels); +}; + +// Costume catching "tainted" canvases + +Costume.prototype.isTainted = function () { + // find out whether the canvas has been tainted by cross-origin data + // assumes that if reading image data throws an error it is tainted + try { + this.contents.getContext('2d').getImageData( + 0, + 0, + this.contents.width, + this.contents.height + ); + } catch (err) { + return true; + } + return false; +}; + +// Costume storing blocks code in PNG exports + +Costume.prototype.pngData = function () { + return embedMetadataPNG(this.contents, this.embeddedData); +}; + +// SVG_Costume ///////////////////////////////////////////////////////////// + +/* + I am a costume containing an SVG image. +*/ + +// SVG_Costume inherits from Costume: + +SVG_Costume.prototype = new Costume(); +SVG_Costume.prototype.constructor = SVG_Costume; +SVG_Costume.uber = Costume.prototype; + +// SVG_Costume instance creation + +function SVG_Costume(svgImage, name, rotationCenter) { + this.contents = svgImage; + this.shapes = []; + this.shrinkToFit(this.maxExtent()); + this.name = name || null; + this.rotationCenter = rotationCenter || this.center(); + this.version = Date.now(); // for observer optimization + this.loaded = null; // for de-serialization only +} + +SVG_Costume.prototype.toString = function () { + return 'an SVG_Costume(' + this.name + ')'; +}; + +// SVG_Costume duplication + +SVG_Costume.prototype.copy = function () { + var img = new Image(), + cpy; + img.src = this.contents.src; + cpy = new SVG_Costume(img, this.name ? copy(this.name) : null); + cpy.rotationCenter = this.rotationCenter.copy(); + cpy.shapes = this.shapes.map(shape => shape.copy()); + return cpy; +}; + +// SVG_Costume flipping + +/* + Flipping is currently inherited from Costume, which rasterizes it. + Therefore flipped SVG costumes may appear pixelated until we add + a method to either truly flip SVGs or change the Sprite's render() + method to scale the costume before flipping it. + + Stretching, OTOH, is achieved with real scaling and thus produces + smooth, albeit rasterized results for vector graphics. +*/ + +// SVG_Costume thumbnail + +SVG_Costume.prototype.shrinkToFit = function (extentPoint) { + // overridden for unrasterized SVGs + nop(extentPoint); + return; +}; + +SVG_Costume.prototype.parseShapes = function () { + // I try to parse my SVG as an editable collection of shapes + var element = new XML_Element(), + // remove 'data:image/svg+xml, ' from src + contents = this.contents.src.replace(/^data:image\/.*?, */, ''); + + if (this.contents.src.indexOf('base64') > -1) { + contents = atob(contents); + } + + element.parseString(contents); + + if (this.shapes.length === 0 && element.attributes.snap) { + this.shapes = element.children.map(child => + window[child.attributes.prototype].fromSVG(child) + ); + } +}; + +SVG_Costume.prototype.edit = function ( + aWorld, + anIDE, + isnew, + oncancel, + onsubmit +) { + var editor = new VectorPaintEditorMorph(), + myself = this; + + editor.oncancel = oncancel || nop; + editor.openIn( + aWorld, + isnew ? newCanvas(anIDE.stage.dimensions) : this.contents, + isnew ? new Point(240, 180) : this.rotationCenter, + (img, rc, shapes) => { + myself.contents = img; + myself.rotationCenter = rc; + myself.shapes = shapes; + myself.version = Date.now(); + aWorld.changed(); + if (anIDE) { + if (isnew) {anIDE.currentSprite.addCostume(myself); } + anIDE.currentSprite.wearCostume(myself); + anIDE.hasChangedMedia = true; + } + (onsubmit || nop)(); + }, + anIDE, + this.shapes || [] + ); +}; + +// SVG_Costume pixel access + +SVG_Costume.prototype.rasterized = function () { + var canvas = newCanvas(this.extent(), true), + ctx = canvas.getContext('2d'), + rasterized; + + ctx.drawImage(this.contents, 0, 0); + rasterized = new Costume( + canvas, + this.name, + this.rotationCenter.copy() + ); + return rasterized; +}; + +// CostumeEditorMorph //////////////////////////////////////////////////////// + +// CostumeEditorMorph inherits from Morph: + +CostumeEditorMorph.prototype = new Morph(); +CostumeEditorMorph.prototype.constructor = CostumeEditorMorph; +CostumeEditorMorph.uber = Morph.prototype; + +// CostumeEditorMorph preferences settings: +CostumeEditorMorph.prototype.size = Costume.prototype.maxExtent(); + +// CostumeEditorMorph instance creation + +function CostumeEditorMorph(costume) { + this.init(costume); +} + +CostumeEditorMorph.prototype.init = function (costume) { + this.costume = costume || new Costume(); + this.rotationCenter = this.costume.rotationCenter.copy(); + this.margin = ZERO; + CostumeEditorMorph.uber.init.call(this); +}; + +// CostumeEditorMorph edit ops + +CostumeEditorMorph.prototype.accept = function () { + this.costume.rotationCenter = this.rotationCenter.copy(); + this.costume.version = Date.now(); +}; + +// CostumeEditorMorph displaying + +CostumeEditorMorph.prototype.fixLayout = function () { + this.bounds.setExtent(this.size); +}; + +CostumeEditorMorph.prototype.render = function (ctx) { + var rp; + + this.margin = this.size.subtract(this.costume.extent()).divideBy(2); + rp = this.rotationCenter.add(this.margin); + + + // draw the background + if (!this.cachedTexture) { + this.cachedTexture = this.createTexture(); + + } + this.renderCachedTexture(ctx); + + /* + pattern = ctx.createPattern(this.background, 'repeat'); + ctx.fillStyle = pattern; + ctx.fillRect(0, 0, this.size.x, this.size.y); + */ + + // draw the costume + ctx.drawImage(this.costume.contents, this.margin.x, this.margin.y); + + // draw crosshairs: + ctx.globalAlpha = 0.5; + + // circle around center: + ctx.fillStyle = 'white'; + ctx.beginPath(); + ctx.arc( + rp.x, + rp.y, + 20, + radians(0), + radians(360), + false + ); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + ctx.beginPath(); + ctx.arc( + rp.x, + rp.y, + 10, + radians(0), + radians(360), + false + ); + ctx.stroke(); + + // horizontal line: + ctx.beginPath(); + ctx.moveTo(0, rp.y); + ctx.lineTo(this.costume.width() + this.margin.x * 2, rp.y); + ctx.stroke(); + + // vertical line: + ctx.beginPath(); + ctx.moveTo(rp.x, 0); + ctx.lineTo(rp.x, this.costume.height() + this.margin.y * 2); + ctx.stroke(); +}; + +CostumeEditorMorph.prototype.createTexture = function () { + var size = 5, + texture = newCanvas(new Point(size * 2, size * 2)), + ctx = texture.getContext('2d'), + grey = new Color(230, 230, 230); + + ctx.fillStyle = 'white'; + ctx.fillRect(0, 0, size * 2, size * 2); + ctx.fillStyle = grey.toString(); + ctx.fillRect(0, 0, size, size); + ctx.fillRect(size, size, size, size); + return texture; +}; + + +// CostumeEditorMorph events + +CostumeEditorMorph.prototype.mouseDownLeft = function (pos) { + this.rotationCenter = pos.subtract( + this.position().add(this.margin) + ); + this.rerender(); +}; + +CostumeEditorMorph.prototype.mouseMove + = CostumeEditorMorph.prototype.mouseDownLeft; + +// Sound ///////////////////////////////////////////////////////////// + +// Sound instance creation + +function Sound(audio, name) { + this.audio = audio; // mandatory + this.name = name || "Sound"; + + // cached samples, don't persist + this.cachedSamples = null; + + // internal for decoding, don't persist + this.audioBuffer = null; // for decoding ops + this.isDecoding = false; + + // internal for deserializing, don't persist + this.loaded = null; // for de-serialization only +} + +Sound.prototype.play = function () { + // return an instance of an audio element which can be terminated + // externally (i.e. by the stage) + // Note: only to be used by the GUI, not by scripts, + // because no effects like volume or panning are applied + var aud = document.createElement('audio'); + aud.src = this.audio.src; + aud.play(); + return aud; +}; + +Sound.prototype.copy = function () { + var snd = document.createElement('audio'), + cpy; + + snd.src = this.audio.src; + cpy = new Sound(snd, this.name ? copy(this.name) : null); + return cpy; +}; + +Sound.prototype.toDataURL = function () { + return this.audio.src; +}; + +// Note ///////////////////////////////////////////////////////// + +// I am a single musical note. +// alternatively I can be used to play a frequency in hz + +// Note instance creation + +function Note(pitch) { + this.pitch = pitch === 0 ? 0 : pitch || 69; + this.frequency = null; // alternative for playing a non-note frequency + this.setupContext(); + this.oscillator = null; + this.fader = null; // gain node for suppressing clicks + this.ended = false; // for active sounds management +} + +// Note shared properties + +Note.prototype.audioContext = null; + +Note.prototype.fadeIn = new Float32Array(2); +Note.prototype.fadeIn[0] = [0.0]; +Note.prototype.fadeIn[1] = [0.2]; + +Note.prototype.fadeOut = new Float32Array(2); +Note.prototype.fadeOut[0] = [0.2]; +Note.prototype.fadeOut[1] = [0.0]; + +Note.prototype.fadeTime = 0.01; + +// Note audio context + +Note.prototype.setupContext = function () { + if (this.audioContext) { return; } + var AudioContext = (function () { + // cross browser some day? + var ctx = window.AudioContext || + window.mozAudioContext || + window.msAudioContext || + window.oAudioContext || + window.webkitAudioContext; + if (!ctx.prototype.createGain) { + ctx.prototype.createGain = ctx.prototype.createGainNode; + } + return ctx; + }()); + if (!AudioContext) { + throw new Error('Web Audio API is not supported\nin this browser'); + } + Note.prototype.audioContext = new AudioContext(); +}; + +Note.prototype.getAudioContext = function () { + // lazily initializes and shares the Note prototype's audio context + // to be used by all other Snap! objects requiring audio, + // e.g. the microphone, the sprites, etc. + if (!this.audioContext) { + this.setupContext(); + } + this.audioContext.resume(); + return this.audioContext; +}; + +// Note playing + +Note.prototype.play = function (type, gainNode, pannerNode) { + if (!gainNode) { + gainNode = this.audioContext.createGain(); + } + this.fader = this.audioContext.createGain(); + this.oscillator = this.audioContext.createOscillator(); + if (!this.oscillator.start) { + this.oscillator.start = this.oscillator.noteOn; + } + if (!this.oscillator.stop) { + this.oscillator.stop = this.oscillator.noteOff; + } + this.setInstrument(type); + this.oscillator.frequency.value = isNil(this.frequency) ? + Math.pow(2, (this.pitch - 69) / 12) * 440 : this.frequency; + this.oscillator.connect(this.fader); + this.fader.connect(gainNode); + if (pannerNode) { + gainNode.connect(pannerNode); + pannerNode.connect(this.audioContext.destination); + } else { + gainNode.connect(this.audioContext.destination); + } + this.ended = false; + this.fader.gain.setValueCurveAtTime( + this.fadeIn, + this.audioContext.currentTime, + this.fadeTime + ); + this.oscillator.start(0); +}; + +Note.prototype.setInstrument = function (type) { + // private - make sure the oscillator node has been initialized before + if (this.oscillator) { + this.oscillator.type = [ + 'sine', + 'square', + 'sawtooth', + 'triangle' + ][(type || 1) - 1]; + } +}; + +Note.prototype.stop = function (immediately) { + // set "immediately" to true to terminate instantly + // needed for widgets like the PianoKeyboard + var fade = !immediately; + if (immediately && this.oscillator) { + this.oscillator.stop(0); + return; + } + if (this.fader) { + try { + this.fader.gain.setValueCurveAtTime( + this.fadeOut, + this.audioContext.currentTime, + this.fadeTime + ); + } catch (err) { + fade = false; + } + } + if (this.oscillator) { + this.oscillator.stop( + fade ? + this.audioContext.currentTime + this.fadeTime + : 0 + ); + this.oscillator = null; + } + this.ended = true; +}; + +Note.prototype.pause = function () { + // emulate a sound for active sounds mngmt + this.stop(); +}; + +// Microphone ///////////////////////////////////////////////////////// + +// I am a microphone and know about volume, note, pitch, as well as +// signals and frequencies. +// mostly meant to be a singleton of the stage +// I stop when I'm not queried something for 5 seconds +// to free up system resources +// +// modifying and metering output is currently experimental +// and only fully works in Chrome. Modifiers work in Firefox, but only with +// a significant lag, metering output is currently not supported by Firefox. +// Safari... well, let's not talk about Safari :-) + +function Microphone() { + // web audio components: + this.audioContext = null; // shared with Note.prototype.audioContext + this.sourceStream = null; + this.processor = null; + this.analyser = null; + + // parameters: + this.resolution = 2; + this.GOOD_ENOUGH_CORRELATION = 0.96; + + // modifier + this.modifier = null; + this.compiledModifier = null; + this.compilerProcess = null; + + // memory alloc + this.correlations = []; + this.wrapper = new List([0]); + this.outChannels = []; + + // metered values: + this.volume = 0; + this.signals = []; + this.output = []; + this.frequencies = []; + this.pitch = -1; + + // asynch control: + this.isStarted = false; + this.isReady = false; + + // idling control: + this.isAutoStop = (location.protocol !== 'file:'); + this.lastTime = Date.now(); +} + +Microphone.prototype.isOn = function () { + if (this.isReady) { + this.lastTime = Date.now(); + return true; + } + this.start(); + return false; +}; + +// Microphone shared properties + +Microphone.prototype.binSizes = [256, 512, 1024, 2048, 4096]; + +// Microphone resolution + +Microphone.prototype.binSize = function () { + return this.binSizes[this.resolution - 1]; +}; + +Microphone.prototype.setResolution = function (num) { + if (contains([1, 2, 3, 4], num)) { + if (this.isReady) { + this.stop(); + } + this.resolution = num; + } +}; + +// Microphone ops + +Microphone.prototype.start = function () { + if (this.isStarted) {return; } + this.isStarted = true; + this.isReady = false; + this.audioContext = Note.prototype.getAudioContext(); + + navigator.mediaDevices.getUserMedia( + { + "audio": { + "mandatory": { + "googEchoCancellation": "false", + "googAutoGainControl": "false", + "googNoiseSuppression": "false", + "googHighpassFilter": "false" + }, + "optional": [] + }, + } + ).then( + stream => this.setupNodes(stream) + ).catch(nop); +}; + +Microphone.prototype.stop = function () { + this.processor.onaudioprocess = null; + this.sourceStream.getTracks().forEach(track => track.stop()); + this.processor.disconnect(); + this.analyser.disconnect(); + this.processor = null; + this.analyser = null; + this.audioContext = null; + this.isReady = false; + this.isStarted = false; +}; + +// Microphone initialization + +Microphone.prototype.setupNodes = function (stream) { + this.sourceStream = stream; + this.createProcessor(); + this.createAnalyser(); + this.analyser.connect(this.processor); + this.processor.connect(this.audioContext.destination); + this.audioContext.createMediaStreamSource(stream).connect(this.analyser); + this.lastTime = Date.now(); +}; + +Microphone.prototype.createAnalyser = function () { + var bufLength; + this.analyser = this.audioContext.createAnalyser(); + this.analyser.fftSize = this.binSizes[this.resolution]; + bufLength = this.analyser.frequencyBinCount; + this.frequencies = new Uint8Array(bufLength); + + // setup pitch detection correlations: + this.correlations = new Array(Math.floor(bufLength/2)); +}; + +Microphone.prototype.createProcessor = function () { + var myself = this; + this.processor = this.audioContext.createScriptProcessor( + this.binSizes[this.resolution - 1] + ); + + this.processor.onaudioprocess = function (event) { + myself.stepAudio(event); + }; + + this.processor.clipping = false; + this.processor.lastClip = 0; + this.processor.clipLevel = 0.98; + this.processor.averaging = 0.95; + this.processor.clipLag = 750; +}; + +// Microphone stepping + +Microphone.prototype.stepAudio = function (event) { + var channels, i; + if (this.isAutoStop && + ((Date.now() - this.lastTime) > 5000) && + !this.modifier + ) { + this.stop(); + return; + } + + // signals: + this.signals = event.inputBuffer.getChannelData(0); + + // output: + if (this.modifier) { + channels = event.outputBuffer.numberOfChannels; + if (this.outChannels.length !== channels) { + this.outChannels = new Array(channels); + } + for (i = 0; i < channels; i += 1) { + this.outChannels[i] = event.outputBuffer.getChannelData(i); + } + this.output = this.outChannels[0]; + } else { + this.output = event.outputBuffer.getChannelData(0); + } + + // frequency bins: + this.analyser.getByteFrequencyData(this.frequencies); + + // pitch & volume: + this.pitch = this.detectPitchAndVolume( + this.signals, + this.audioContext.sampleRate + ); + + // note: + if (this.pitch > 0) { + this.note = Math.round( + 12 * (Math.log(this.pitch / 440) / Math.log(2)) + ) + 69; + } + + this.isReady = true; + this.isStarted = false; +}; + +Microphone.prototype.detectPitchAndVolume = function (buf, sampleRate) { + // https://en.wikipedia.org/wiki/Autocorrelation + // thanks to Chris Wilson: + // https://plus.google.com/+ChrisWilson/posts/9zHsF9PCDAL + // https://github.com/cwilso/PitchDetect/ + + var SIZE = buf.length, + MAX_SAMPLES = Math.floor(SIZE/2), + best_offset = -1, + best_correlation = 0, + rms = 0, + foundGoodCorrelation = false, + correlations = this.correlations, + channels = this.outChannels.length, + correlation, + lastCorrelation, + offset, + shift, + i, + k, + val, + modified; + + for (i = 0; i < SIZE; i += 1) { + val = buf[i]; + if (Math.abs(val) >= this.processor.clipLevel) { + this.processor.clipping = true; + this.processor.lastClip = window.performance.now(); + } + rms += val * val; + + // apply modifier, if any + if (this.modifier) { + this.wrapper.contents[0] = val; + modified = invoke( + this.compiledModifier, + this.wrapper, + null, + null, + null, + null, + this.compilerProcess + ); + for (k = 0; k < channels; k += 1) { + this.outChannels[k][i] = modified; + } + } + } + rms = Math.sqrt(rms/SIZE); + this.volume = Math.max(rms, this.volume * this.processor.averaging); + if (rms < 0.01) + return this.pitch; + + lastCorrelation = 1; + for (offset = 1; offset < MAX_SAMPLES; offset += 1) { + correlation = 0; + + for (i = 0; i < MAX_SAMPLES; i += 1) { + correlation += Math.abs((buf[i]) - (buf[i + offset])); + } + correlation = 1 - (correlation/MAX_SAMPLES); + correlations[offset] = correlation; + if ((correlation > this.GOOD_ENOUGH_CORRELATION) + && (correlation > lastCorrelation) + ) { + foundGoodCorrelation = true; + if (correlation > best_correlation) { + best_correlation = correlation; + best_offset = offset; + } + } else if (foundGoodCorrelation) { + shift = (correlations[best_offset + 1] - + correlations[best_offset - 1]) / + correlations[best_offset]; + return sampleRate / (best_offset + (8 * shift)); + } + lastCorrelation = correlation; + } + if (best_correlation > 0.01) { + return sampleRate / best_offset; + } + return this.pitch; +}; + +// CellMorph ////////////////////////////////////////////////////////// + +/* + I am a spreadsheet style cell that can display either a string, + a Morph, a Canvas or a toString() representation of anything else. + I can be used in variable watchers or list view element cells. +*/ + +// CellMorph inherits from BoxMorph: + +CellMorph.prototype = new BoxMorph(); +CellMorph.prototype.constructor = CellMorph; +CellMorph.uber = BoxMorph.prototype; + +// CellMorph instance creation: + +function CellMorph(contents, color, idx, parentCell) { + this.init(contents, color, idx, parentCell); +} + +CellMorph.prototype.init = function (contents, color, idx, parentCell) { + this.contents = (contents === 0 ? 0 + : contents === false ? false + : contents || ''); + this.isEditable = isNil(idx) ? false : true; + this.idx = idx || null; // for list watchers + this.parentCell = parentCell || null; // for list circularity detection + CellMorph.uber.init.call( + this, + SyntaxElementMorph.prototype.corner, + 1, + WHITE + ); + this.color = color || new Color(255, 140, 0); + this.isBig = false; + this.version = null; // only for observing sprites + this.fixLayout(); +}; + +// CellMorph accessing: + +CellMorph.prototype.big = function () { + this.isBig = true; + this.changed(); + if (this.contentsMorph instanceof TextMorph) { + this.contentsMorph.setFontSize( + SyntaxElementMorph.prototype.fontSize * 1.5 + ); + } + this.fixLayout(true); + this.rerender(); +}; + +CellMorph.prototype.normal = function () { + this.isBig = false; + this.changed(); + if (this.contentsMorph instanceof TextMorph) { + this.contentsMorph.setFontSize( + SyntaxElementMorph.prototype.fontSize + ); + } + this.fixLayout(true); + this.rerender(); +}; + +// CellMorph circularity testing: + + +CellMorph.prototype.isCircular = function (list) { + if (!this.parentCell) {return false; } + if (list instanceof List) { + return this.contents === list || this.parentCell.isCircular(list); + } + return this.parentCell.isCircular(this.contents); +}; + +// CellMorph layout: + +CellMorph.prototype.fixLayout = function (justMe) { + var isSameList = this.contentsMorph instanceof ListWatcherMorph + && (this.contentsMorph.list === this.contents), + isSameTable = this.contentsMorph instanceof TableFrameMorph + && (this.contentsMorph.tableMorph.table === this.contents), + listwatcher; + + if (justMe) {return; } + + this.createContents(); + + // adjust my dimensions + this.bounds.setHeight(this.contentsMorph.height() + + this.edge + + this.border * 2); + this.bounds.setWidth(Math.max( + this.contentsMorph.width() + this.edge * 2, + (this.contents instanceof Context || + this.contents instanceof List ? 0 : + SyntaxElementMorph.prototype.fontSize * 3.5) + )); + + // position my contents + if (!isSameList && !isSameTable) { + this.contentsMorph.setCenter(this.center()); + } + + if (this.parent) { + this.parent.changed(); + this.parent.fixLayout(); + this.parent.rerender(); + listwatcher = this.parentThatIsA(ListWatcherMorph); + if (listwatcher) { + listwatcher.changed(); + listwatcher.fixLayout(); + listwatcher.rerender(); + } + } +}; + +CellMorph.prototype.createContents = function () { + // re-build my contents + var txt, + img, + myself = this, + fontSize = SyntaxElementMorph.prototype.fontSize, + isSameList = this.contentsMorph instanceof ListWatcherMorph + && (this.contentsMorph.list === this.contents), + isSameTable = this.contentsMorph instanceof TableFrameMorph + && (this.contentsMorph.tableMorph.table === this.contents); + + if (this.isBig) { + fontSize = fontSize * 1.5; + } + + if (this.contentsMorph && !isSameList && !isSameTable) { + this.contentsMorph.destroy(); + this.version = null; + } + + if (!isSameList && !isSameTable) { + if (this.contents instanceof Morph) { + if (isSnapObject(this.contents)) { + img = this.contents.thumbnail(new Point(40, 40)); + } else { + img = this.contents.fullImage(); + } + this.contentsMorph = new Morph(); + this.contentsMorph.isCachingImage = true; + this.contentsMorph.bounds.setWidth(img.width); + this.contentsMorph.bounds.setHeight(img.height); + this.contentsMorph.cachedImage = img; + this.version = this.contents.version; + } else if (isString(this.contents)) { + txt = this.contents.length > 500 ? + this.contents.slice(0, 500) + '...' : this.contents; + this.contentsMorph = new TextMorph( + txt, + fontSize, + null, + true, + false, + 'left' // was formerly 'center', reverted b/c of code-mapping + ); + if (this.isEditable) { + this.contentsMorph.isEditable = true; + this.contentsMorph.enableSelecting(); + } + this.contentsMorph.setColor(WHITE); + } else if (typeof this.contents === 'boolean') { + img = SpriteMorph.prototype.booleanMorph.call( + null, + this.contents + ).fullImage(); + this.contentsMorph = new Morph(); + this.contentsMorph.isCachingImage = true; + this.contentsMorph.bounds.setWidth(img.width); + this.contentsMorph.bounds.setHeight(img.height); + this.contentsMorph.cachedImage = img; + } else if (this.contents instanceof HTMLCanvasElement) { + img = this.contents; + this.contentsMorph = new Morph(); + this.contentsMorph.isCachingImage = true; + this.contentsMorph.bounds.setWidth(img.width); + this.contentsMorph.bounds.setHeight(img.height); + this.contentsMorph.cachedImage = img; + } else if (this.contents instanceof Context) { + img = this.contents.image(); + this.contentsMorph = new Morph(); + this.contentsMorph.isCachingImage = true; + this.contentsMorph.bounds.setWidth(img.width); + this.contentsMorph.bounds.setHeight(img.height); + this.contentsMorph.cachedImage = img; + this.version = this.contents.version; + + // support blocks to be dragged out of watchers: + this.contentsMorph.isDraggable = + !SpriteMorph.prototype.disableDraggingData; + + this.contentsMorph.selectForEdit = function () { + var script = myself.contents.toUserBlock(), + prepare = script.prepareToBeGrabbed, + ide = this.parentThatIsA(IDE_Morph) || + this.world().childThatIsA(IDE_Morph); + + script.prepareToBeGrabbed = function (hand) { + prepare.call(this, hand); + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + script.setPosition(this.position()); + return script; + }; + } else if (this.contents instanceof Costume) { + img = this.contents.thumbnail(new Point(40, 40)); + this.contentsMorph = new Morph(); + this.contentsMorph.isCachingImage = true; + this.contentsMorph.bounds.setWidth(img.width); + this.contentsMorph.bounds.setHeight(img.height); + this.contentsMorph.cachedImage = img; + + // support costumes to be dragged out of watchers: + this.contentsMorph.isDraggable = + !SpriteMorph.prototype.disableDraggingData; + + this.contentsMorph.selectForEdit = function () { + var cst = myself.contents.copy(), + icon, + prepare, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + cst.name = ide.currentSprite.newCostumeName(cst.name); + icon = new CostumeIconMorph(cst); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + icon.setCenter(this.center()); + return icon; + }; + } else if (this.contents instanceof Sound) { + this.contentsMorph = new SymbolMorph('notes', 30); + + // support sounds to be dragged out of watchers: + this.contentsMorph.isDraggable = + !SpriteMorph.prototype.disableDraggingData; + + this.contentsMorph.selectForEdit = function () { + var snd = myself.contents.copy(), + icon, + prepare, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + snd.name = ide.currentSprite.newCostumeName(snd.name); + icon = new SoundIconMorph(snd); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + icon.setCenter(this.center()); + return icon; + }; + } else if (this.contents instanceof List) { + if (this.contents.isTable()) { + this.contentsMorph = new TableFrameMorph(new TableMorph( + this.contents, + 10 + )); + this.contentsMorph.expand(new Point(200, 150)); + } else { + if (this.isCircular()) { + this.contentsMorph = new TextMorph( + '(...)', + fontSize, + null, + false, // bold + true, // italic + 'center' + ); + this.contentsMorph.setColor(WHITE); + } else { + this.contentsMorph = new ListWatcherMorph( + this.contents, + this + ); + } + } + this.contentsMorph.isDraggable = false; + } else { + this.contentsMorph = new TextMorph( + !isNil(this.contents) ? this.contents.toString() : '', + fontSize, + null, + true, + false, + 'center' + ); + if (this.isEditable) { + this.contentsMorph.isEditable = true; + this.contentsMorph.enableSelecting(); + } + this.contentsMorph.setColor(WHITE); + } + this.add(this.contentsMorph); + } +}; + +// CellMorph drawing: + +CellMorph.prototype.update = function () { + // special case for observing sprites + if (!isSnapObject(this.contents) && + !(this.contents instanceof Costume) && + !(this.contents instanceof Context) + ) { + return; + } + if (this.version !== this.contents.version) { + this.fixLayout(); + this.rerender(); + this.version = this.contents.version; + } +}; + +CellMorph.prototype.render = function (ctx) { + // draw my outline + if ((this.edge === 0) && (this.border === 0)) { + BoxMorph.uber.render.call(this, ctx); + return null; + } + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + this.outlinePath( + ctx, + Math.max(this.edge - this.border, 0), + this.border + ); + ctx.closePath(); + ctx.fill(); + if (this.border > 0 && !MorphicPreferences.isFlat) { + ctx.lineWidth = this.border; + ctx.strokeStyle = this.borderColor.toString(); + ctx.beginPath(); + this.outlinePath(ctx, this.edge, this.border / 2); + ctx.closePath(); + ctx.stroke(); + + if (useBlurredShadows) { + ctx.shadowOffsetX = this.border; + ctx.shadowOffsetY = this.border; + ctx.shadowBlur = this.border; + ctx.shadowColor = this.color.darker(80).toString(); + this.drawShadow(ctx, this.edge, 0); + } + } +}; + +CellMorph.prototype.drawShadow = function (context, radius, inset) { + var offset = radius + inset, + w = this.width(), + h = this.height(); + + // bottom left: + context.beginPath(); + context.moveTo(0, h - offset); + context.lineTo(0, offset); + + // top left: + context.arc( + offset, + offset, + radius, + radians(-180), + radians(-90), + false + ); + + // top right: + context.lineTo(w - offset, 0); + context.stroke(); +}; + +// CellMorph editing (inside list watchers): + +CellMorph.prototype.layoutChanged = function () { + var listWatcher = this.parentThatIsA(ListWatcherMorph); + + // adjust my layout + this.bounds.setHeight(this.contentsMorph.height() + + this.edge + + this.border * 2); + this.bounds.setWidth(Math.max( + this.contentsMorph.width() + this.edge * 2, + (this.contents instanceof Context || + this.contents instanceof List ? 0 : this.height() * 2) + )); + + // position my contents + this.contentsMorph.setCenter(this.center()); + this.rerender(); + + if (listWatcher) { + listWatcher.fixLayout(); + } +}; + +CellMorph.prototype.reactToEdit = function (textMorph) { + var listWatcher; + if (!isNil(this.idx)) { + listWatcher = this.parentThatIsA(ListWatcherMorph); + if (listWatcher) { + listWatcher.list.put( + textMorph.text, + this.idx + listWatcher.start - 1 + ); + } + } +}; + +CellMorph.prototype.mouseClickLeft = function (pos) { + if (this.isEditable && this.contentsMorph instanceof TextMorph) { + this.contentsMorph.selectAllAndEdit(); + } else { + this.escalateEvent('mouseClickLeft', pos); + } +}; + +CellMorph.prototype.mouseDoubleClick = function (pos) { + if (List.prototype.enableTables && + this.currentValue instanceof List) { + new TableDialogMorph(this.contents).popUp(this.world()); + } else { + this.escalateEvent('mouseDoubleClick', pos); + } +}; + +// WatcherMorph ////////////////////////////////////////////////////////// + +/* + I am a little window which observes some value and continuously + updates itself accordingly. + + My target can be either a SpriteMorph or a VariableFrame. +*/ + +// WatcherMorph inherits from BoxMorph: + +WatcherMorph.prototype = new BoxMorph(); +WatcherMorph.prototype.constructor = WatcherMorph; +WatcherMorph.uber = BoxMorph.prototype; + +// WatcherMorph instance creation: + +function WatcherMorph(label, color, target, getter, isHidden) { + this.init(label, color, target, getter, isHidden); +} + +WatcherMorph.prototype.init = function ( + label, + color, + target, + getter, + isHidden +) { + // additional properties + this.labelText = label || ''; + this.version = null; + this.objName = ''; + this.isGhosted = false; // transient, don't persist + + // initialize inherited properties + WatcherMorph.uber.init.call( + this, + SyntaxElementMorph.prototype.rounding, + 1.000001, // shadow bug in Chrome, + new Color(120, 120, 120) + ); + + // override inherited behavior + this.color = new Color(220, 220, 220); + this.readoutColor = color; + this.style = 'normal'; + this.target = target || null; // target obj (Sprite) or VariableFrame + this.getter = getter || null; // callback or variable name (string) + this.currentValue = null; + this.labelMorph = null; + this.sliderMorph = null; + this.cellMorph = null; + this.isDraggable = true; + this.fixLayout(); + this.update(); + if (isHidden) { // for de-serializing + this.hide(); + } +}; + +// WatcherMorph accessing: + +WatcherMorph.prototype.isTemporary = function () { + var stage = this.parentThatIsA(StageMorph); + if (this.target instanceof VariableFrame) { + if (stage) { + if (this.target === stage.variables.parentFrame) { + return false; // global + } + } + return this.target.owner === null; + } + return false; +}; + +WatcherMorph.prototype.object = function () { + // answer the actual sprite I refer to + return this.target instanceof VariableFrame ? + this.target.owner : this.target; +}; + +WatcherMorph.prototype.isGlobal = function (selector) { + return contains( + ['getLastAnswer', 'getLastMessage', 'getTempo', 'getTimer', + 'reportMouseX', 'reportMouseY', 'reportThreadCount'], + selector + ); +}; + +// WatcherMorph slider accessing: + +WatcherMorph.prototype.setSliderMin = function (num, noUpdate) { + if (this.target instanceof VariableFrame) { + this.sliderMorph.setSize(1, noUpdate); + this.sliderMorph.setStart(num, noUpdate); + this.sliderMorph.setSize(this.sliderMorph.rangeSize() / 5, noUpdate); + } +}; + +WatcherMorph.prototype.setSliderMax = function (num, noUpdate) { + if (this.target instanceof VariableFrame) { + this.sliderMorph.setSize(1, noUpdate); + this.sliderMorph.setStop(num, noUpdate); + this.sliderMorph.setSize(this.sliderMorph.rangeSize() / 5, noUpdate); + } +}; + +// WatcherMorph updating: + +WatcherMorph.prototype.update = function () { + var newValue, sprite, num, att, + isInherited = false; + + if (this.target && this.getter) { + this.updateLabel(); + if (this.target instanceof VariableFrame) { + newValue = this.target.vars[this.getter] ? + this.target.vars[this.getter].value : undefined; + if (newValue === undefined && this.target.owner) { + sprite = this.target.owner; + if (contains(sprite.inheritedVariableNames(), this.getter)) { + newValue = this.target.getVar(this.getter); + // ghost cell color + this.cellMorph.setColor( + SpriteMorph.prototype.blockColor.variables + .lighter(35) + ); + } else { + this.destroy(); + return; + } + } else { + // un-ghost the cell color + this.cellMorph.setColor( + SpriteMorph.prototype.blockColor.variables + ); + } + } else { + newValue = this.target[this.getter](); + + // determine whether my getter is an inherited attribute + att = { + xPosition: 'x position', + yPosition: 'y position', + direction: 'direction', + getCostumeIdx: 'costume #', + getScale: 'size', + getVolume: 'volume', + getPan: 'balance', + reportShown: 'shown?', + getPenDown: 'pen down?' + } [this.getter]; + isInherited = att ? this.target.inheritsAttribute(att) : false; + } + if (newValue !== '' && !isNil(newValue)) { + num = +newValue; + if (typeof newValue !== 'boolean' && !isNaN(num)) { + newValue = Math.round(newValue * 1000000) / 1000000; + } + } + if (newValue === undefined) { + // console.log('removing watcher for', this.labelText); + this.destroy(); + return; + } + if (newValue !== this.currentValue || + isInherited !== this.isGhosted || + (!isNil(newValue) && + newValue.version && + (newValue.version !== this.version) + ) + ) { + this.changed(); + this.cellMorph.contents = newValue; + this.isGhosted = isInherited; + if (isSnapObject(this.target)) { + if (isInherited) { + this.cellMorph.setColor(this.readoutColor.lighter(35)); + } else { + this.cellMorph.setColor(this.readoutColor); + } + } + this.cellMorph.fixLayout(); + if (!isNaN(newValue)) { + this.sliderMorph.value = newValue; + this.sliderMorph.fixLayout(); + } + this.fixLayout(); + if (this.currentValue && this.currentValue.version) { + this.version = this.currentValue.version; + } else { + this.version = Date.now(); + } + this.currentValue = newValue; + } + } + if (this.cellMorph.contentsMorph instanceof ListWatcherMorph) { + this.cellMorph.contentsMorph.update(); + } else if (isSnapObject(this.cellMorph.contents)) { + this.cellMorph.update(); + } +}; + +WatcherMorph.prototype.updateLabel = function () { + // check whether the target object's name has been changed + var obj = this.object(); + + if (!obj || this.isGlobal(this.getter)) { return; } + if (obj.version !== this.version) { + this.objName = obj.name ? obj.name + ' ' : ' '; + if (this.labelMorph) { + this.labelMorph.destroy(); + this.labelMorph = null; + this.fixLayout(); + } + } +}; + +// WatcherMorph layout: + +WatcherMorph.prototype.fixLayout = function () { + var fontSize = SyntaxElementMorph.prototype.fontSize, isList, + myself = this; + + // create my parts + if (this.labelMorph === null) { + this.labelMorph = new StringMorph( + this.objName + this.labelText, + fontSize, + null, + true, + false, + false, + MorphicPreferences.isFlat ? new Point() : new Point(1, 1), + WHITE + ); + this.add(this.labelMorph); + } + if (this.cellMorph === null) { + this.cellMorph = new CellMorph('', this.readoutColor); + this.add(this.cellMorph); + } + if (this.sliderMorph === null) { + this.sliderMorph = new SliderMorph( + 0, + 100, + 0, + 20, + 'horizontal' + ); + this.sliderMorph.alpha = 1; + this.sliderMorph.button.color = this.color.darker(); + this.sliderMorph.color = this.color.lighter(60); + this.sliderMorph.button.highlightColor = this.color.darker(); + this.sliderMorph.button.highlightColor.b += 50; + this.sliderMorph.button.pressColor = this.color.darker(); + this.sliderMorph.button.pressColor.b += 100; + this.sliderMorph.setHeight(fontSize); + this.sliderMorph.action = function (num) { + myself.target.setVar( + myself.getter, + Math.round(num), + myself.target.owner + ); + }; + this.add(this.sliderMorph); + } + + // adjust my layout + isList = this.cellMorph.contents instanceof List; + if (isList) { this.style = 'normal'; } + + if (this.style === 'large') { + this.labelMorph.hide(); + this.sliderMorph.hide(); + this.cellMorph.big(); + this.cellMorph.setPosition(this.position()); + this.bounds.setExtent(this.cellMorph.extent().subtract(1)); + return; + } + + this.labelMorph.show(); + this.sliderMorph.show(); + this.cellMorph.normal(); + this.labelMorph.setPosition(this.position().add(new Point( + this.edge, + this.border + SyntaxElementMorph.prototype.typeInPadding + ))); + + if (isList) { + this.cellMorph.setPosition(this.labelMorph.bottomLeft().add( + new Point(0, SyntaxElementMorph.prototype.typeInPadding) + )); + } else { + this.cellMorph.setPosition(this.labelMorph.topRight().add(new Point( + fontSize / 3, + 0 + ))); + this.labelMorph.setTop( + this.cellMorph.top() + + (this.cellMorph.height() - this.labelMorph.height()) / 2 + ); + } + + if (this.style === 'slider') { + this.sliderMorph.setPosition(new Point( + this.labelMorph.left(), + this.cellMorph.bottom() + + SyntaxElementMorph.prototype.typeInPadding + )); + this.sliderMorph.setWidth(this.cellMorph.right() + - this.labelMorph.left()); + this.bounds.setHeight( + this.cellMorph.height() + + this.sliderMorph.height() + + this.border * 2 + + SyntaxElementMorph.prototype.typeInPadding * 3 + ); + } else { + this.sliderMorph.hide(); + this.bounds.corner.y = this.cellMorph.bottom() + + this.border + + SyntaxElementMorph.prototype.typeInPadding; + } + this.bounds.corner.x = Math.max( + this.cellMorph.right(), + this.labelMorph.right() + ) + this.edge + + SyntaxElementMorph.prototype.typeInPadding; +}; + +// WatcherMorph events: + +WatcherMorph.prototype.mouseDoubleClick = function (pos) { + if (List.prototype.enableTables && + this.currentValue instanceof List) { + new TableDialogMorph(this.currentValue).popUp(this.world()); + } else { + this.escalateEvent('mouseDoubleClick', pos); + } +}; + +// WatcherMorph dragging and dropping: + +WatcherMorph.prototype.rootForGrab = function () { + // prevent watchers to be dragged in presentation mode + var ide = this.parentThatIsA(IDE_Morph); + if (ide && ide.isAppMode) { + return ide; + } + return this; +}; + +/* +// Scratch-like watcher-toggling, commented out b/c we have a drop-down menu + +WatcherMorph.prototype.mouseClickLeft = function () { + if (this.style === 'normal') { + if (this.target instanceof VariableFrame) { + this.style = 'slider'; + } else { + this.style = 'large'; + } + } else if (this.style === 'slider') { + this.style = 'large'; + } else { + this.style = 'normal'; + } + this.fixLayout(); +}; +*/ + +// WatcherMorph user menu: + +WatcherMorph.prototype.userMenu = function () { + var myself = this, + ide = this.parentThatIsA(IDE_Morph), + shiftClicked = (this.world().currentKey === 16), + menu = new MenuMorph(this), + on = '\u25CF', + off = '\u25CB', + vNames; + + function monitor(vName) { + var stage = myself.parentThatIsA(StageMorph), + varFrame = myself.currentValue.outerContext.variables; + menu.addItem( + vName + '...', + function () { + var watcher = detect( + stage.children, + (morph) => morph instanceof WatcherMorph + && morph.target === varFrame + && morph.getter === vName + ), + others; + if (watcher !== null) { + watcher.show(); + watcher.fixLayout(); // re-hide hidden parts + return; + } + watcher = new WatcherMorph( + vName + ' ' + localize('(temporary)'), + SpriteMorph.prototype.blockColor.variables, + varFrame, + vName + ); + watcher.setPosition(stage.position().add(10)); + others = stage.watchers(watcher.left()); + if (others.length > 0) { + watcher.setTop(others[others.length - 1].bottom()); + } + stage.add(watcher); + watcher.fixLayout(); + } + ); + } + + if (ide && ide.isAppMode) { // prevent context menu in app mode + return; + } + + menu.addItem( + (this.style === 'normal' ? on : off) + ' ' + localize('normal'), + 'styleNormal' + ); + menu.addItem( + (this.style === 'large' ? on : off) + ' ' + localize('large'), + 'styleLarge' + ); + if (this.target instanceof VariableFrame) { + menu.addItem( + (this.style === 'slider' ? on : off) + ' ' + localize('slider'), + 'styleSlider' + ); + menu.addLine(); + menu.addItem( + 'slider min...', + 'userSetSliderMin' + ); + menu.addItem( + 'slider max...', + 'userSetSliderMax' + ); + menu.addLine(); + menu.addItem( + 'import...', + 'importData' + ); + menu.addItem( + 'raw data...', + () => this.importData(true), + 'import without attempting to\nparse or format data'//, + ); + if (shiftClicked) { + if (this.currentValue instanceof List && + this.currentValue.canBeCSV()) { + menu.addItem( + 'export as CSV...', + () => ide.saveFileAs( + this.currentValue.asCSV(), + 'text/csv;charset=utf-8', // RFC 4180 + this.getter // variable name + ), + null, + new Color(100, 0, 0) + ); + } + if (this.currentValue instanceof List && + this.currentValue.canBeJSON()) { + menu.addItem( + 'export as JSON...', + () => ide.saveFileAs( + this.currentValue.asJSON(true), // guess objects + 'text/json;charset=utf-8', + this.getter // variable name + ), + null, + new Color(100, 0, 0) + ); + } + } + if (isString(this.currentValue) || !isNaN(+this.currentValue)) { + if (shiftClicked) { + menu.addItem( + 'parse', + 'parseTxt', + 'try to convert\nraw data into a list', + new Color(100, 0, 0) + ); + } + menu.addItem( + 'export...', + () => ide.saveFileAs( + this.currentValue.toString(), + 'text/plain;charset=utf-8', + this.getter // variable name + ) + ); + } else if (this.currentValue instanceof Costume) { + menu.addItem( + 'export...', + () => { + if (this.currentValue instanceof SVG_Costume) { + // don't show SVG costumes in a new tab (shows text) + ide.saveFileAs( + this.currentValue.contents.src, + 'text/svg', + this.currentValue.name + ); + } else { // rasterized Costume + ide.saveCanvasAs( + this.currentValue.contents, + this.currentValue.name + ); + } + } + ); + } else if (this.currentValue instanceof Sound) { + menu.addItem( + 'export...', + () => ide.saveAudioAs( + this.currentValue.audio, + this.currentValue.name + ) + ); + } else if (this.currentValue instanceof List && + this.currentValue.canBeCSV()) { + menu.addItem( + 'export...', + () => ide.saveFileAs( + this.currentValue.asCSV(), + 'text/csv;charset=utf-8', // RFC 4180 + this.getter // variable name + ) + ); + if (this.currentValue.canBeJSON()) { + menu.addItem( + 'blockify', + () => { + var world = ide.world(); + this.currentValue.blockify().pickUp(world); + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + ); + } + } else if (this.currentValue instanceof List && + this.currentValue.canBeJSON()) { + menu.addItem( + 'export...', + () => ide.saveFileAs( + this.currentValue.asJSON(true), // guessObjects + 'text/json;charset=utf-8', + this.getter // variable name + ) + ); + } else if (this.currentValue instanceof Context) { + vNames = this.currentValue.outerContext.variables.names(); + if (vNames.length) { + menu.addLine(); + vNames.forEach(vName => monitor(vName)); + } + } + } + return menu; +}; + +WatcherMorph.prototype.importData = function (raw) { + // raw is a Boolean flag selecting to keep the data unparsed + var inp = document.createElement('input'), + ide = this.parentThatIsA(IDE_Morph), + myself = this; + + function userImport() { + + function txtOnlyMsg(ftype, anyway) { + ide.confirm( + localize( + 'Snap! can only import "text" files. ' + + 'You selected a file of type "' + + ftype + + '".' + ) + '\n\n' + localize('Open anyway?'), + 'Unable to import', + anyway // callback + ); + } + + function readText(aFile) { + var frd = new FileReader(), + ext = aFile.name.split('.').pop().toLowerCase(); + + function isTextFile(aFile) { + // special cases for Windows + // check the file extension for text-like-ness + return aFile.type.indexOf('text') !== -1 || + contains(['txt', 'csv', 'xml', 'json', 'tsv'], ext); + } + + function isType(aFile, string) { + return aFile.type.indexOf(string) !== -1 || (ext === string); + } + + frd.onloadend = function (e) { + if (!raw && isType(aFile, 'csv')) { + myself.target.setVar( + myself.getter, + Process.prototype.parseCSV(e.target.result) + ); + } else if (!raw && isType(aFile, 'json')) { + myself.target.setVar( + myself.getter, + Process.prototype.parseJSON(e.target.result) + ); + } else { + myself.target.setVar( + myself.getter, + e.target.result + ); + } + }; + + if (raw || isTextFile(aFile)) { + frd.readAsText(aFile); + } else { + // show a warning and an option + // letting the user load the file anyway + txtOnlyMsg( + aFile.type, + () => frd.readAsText(aFile) + ); + } + } + + document.body.removeChild(inp); + ide.filePicker = null; + if (inp.files.length > 0) { + readText(inp.files[inp.files.length - 1]); + } + } + + if (ide.filePicker) { + document.body.removeChild(ide.filePicker); + ide.filePicker = null; + } + inp.type = 'file'; + inp.style.color = "transparent"; + inp.style.backgroundColor = "transparent"; + inp.style.border = "none"; + inp.style.outline = "none"; + inp.style.position = "absolute"; + inp.style.top = "0px"; + inp.style.left = "0px"; + inp.style.width = "0px"; + inp.style.height = "0px"; + inp.style.display = "none"; + inp.addEventListener( + "change", + userImport, + false + ); + document.body.appendChild(inp); + ide.filePicker = inp; + inp.click(); +}; + +WatcherMorph.prototype.parseTxt = function () { + // experimental! + var src = this.target.vars[this.getter].value; + this.target.setVar( + this.getter, + src.indexOf('\[') === 0 ? + Process.prototype.parseJSON(src) + : Process.prototype.parseCSV(src) + ); +}; + +WatcherMorph.prototype.setStyle = function (style) { + this.style = style; + this.changed(); + this.fixLayout(); + this.rerender(); +}; + +WatcherMorph.prototype.styleNormal = function () { + this.setStyle('normal'); +}; + +WatcherMorph.prototype.styleLarge = function () { + this.setStyle('large'); +}; + +WatcherMorph.prototype.styleSlider = function () { + this.setStyle('slider'); +}; + +WatcherMorph.prototype.userSetSliderMin = function () { + new DialogBoxMorph( + this, + this.setSliderMin, + this + ).prompt( + "Slider minimum value", + this.sliderMorph.start.toString(), + this.world(), + null, // pic + null, // choices + null, // read only + true // numeric + ); +}; + +WatcherMorph.prototype.userSetSliderMax = function () { + new DialogBoxMorph( + this, + this.setSliderMax, + this + ).prompt( + "Slider maximum value", + this.sliderMorph.stop.toString(), + this.world(), + null, // pic + null, // choices + null, // read only + true // numeric + ); +}; + +// WatcherMorph drawing: + +WatcherMorph.prototype.render = function (ctx) { + var gradient; + if (MorphicPreferences.isFlat || (this.edge === 0 && this.border === 0)) { + BoxMorph.uber.render.call(this, ctx); + return; + } + gradient = ctx.createLinearGradient(0, 0, 0, this.height()); + gradient.addColorStop(0, this.color.lighter().toString()); + gradient.addColorStop(1, this.color.darker().toString()); + ctx.fillStyle = gradient; + ctx.beginPath(); + this.outlinePath( + ctx, + Math.max(this.edge - this.border, 0), + this.border + ); + ctx.closePath(); + ctx.fill(); + if (this.border > 0) { + gradient = ctx.createLinearGradient(0, 0, 0, this.height()); + gradient.addColorStop(0, this.borderColor.lighter().toString()); + gradient.addColorStop(1, this.borderColor.darker().toString()); + ctx.lineWidth = this.border; + ctx.strokeStyle = gradient; + ctx.beginPath(); + this.outlinePath(ctx, this.edge, this.border / 2); + ctx.closePath(); + ctx.stroke(); + } +}; + +// StagePrompterMorph //////////////////////////////////////////////////////// + +/* + I am a sensor-category-colored input box at the bottom of the stage + which lets the user answer to a question. If I am opened from within + the context of a sprite, my question can be anything that is displayable + in a SpeechBubble and will be, if I am opened from within the stage + my question will be shown as a single line of text within my label morph. +*/ + +// StagePrompterMorph inherits from BoxMorph: + +StagePrompterMorph.prototype = new BoxMorph(); +StagePrompterMorph.prototype.constructor = StagePrompterMorph; +StagePrompterMorph.uber = BoxMorph.prototype; + +// StagePrompterMorph instance creation: + +function StagePrompterMorph(question) { + this.init(question); +} + +StagePrompterMorph.prototype.init = function (question) { + // question is optional in case the Stage is asking + + // additional properties + this.answer = null; + this.isDone = false; + if (question) { + this.label = new StringMorph( + question, + SpriteMorph.prototype.bubbleFontSize, + null, // fontStyle + SpriteMorph.prototype.bubbleFontIsBold, + false, // italic + 'left' + ); + } else { + this.label = null; + } + this.inputField = new InputFieldMorph(); + this.button = new PushButtonMorph( + null, + () => this.accept(), + '\u2713' + ); + + // initialize inherited properties + StagePrompterMorph.uber.init.call( + this, + SyntaxElementMorph.prototype.rounding, + SpriteMorph.prototype.bubbleBorder, + SpriteMorph.prototype.blockColor.sensing + ); + + // override inherited behavior + this.color = WHITE; + if (this.label) {this.add(this.label); } + this.add(this.inputField); + this.add(this.button); + this.fixLayout(); +}; + +// StagePrompterMorph layout: + +StagePrompterMorph.prototype.fixLayout = function () { + var y = 0; + if (this.label) { + this.label.setPosition(new Point( + this.left() + this.edge, + this.top() + this.edge + )); + y = this.label.bottom() - this.top(); + } + this.inputField.setPosition(new Point( + this.left() + this.edge, + this.top() + y + this.edge + )); + this.inputField.setWidth( + this.width() + - this.edge * 2 + - this.button.width() + - this.border + ); + this.button.setCenter(this.inputField.center()); + this.button.setLeft(this.inputField.right() + this.border); + this.bounds.setHeight( + this.inputField.bottom() + - this.top() + + this.edge + ); +}; + +// StagePrompterMorph events: + +StagePrompterMorph.prototype.mouseClickLeft = function () { + this.inputField.edit(); +}; + +StagePrompterMorph.prototype.accept = function () { + this.answer = this.inputField.getValue(); + this.isDone = true; +}; + +// StagePickerMorph //////////////////////////////////////////////////////// + +/* + I am a sensor-category-colored input box which lets the user pick one + from a list of options. +*/ + +// StagePickerMorph inherits from MenuMorph: + +StagePickerMorph.prototype = new MenuMorph(); +StagePickerMorph.prototype.constructor = StagePickerMorph; +StagePickerMorph.uber = MenuMorph.prototype; + +// StagePickerMorph instance creation: + +function StagePickerMorph(options) { + this.init(options); +} + +StagePickerMorph.prototype.init = function (options) { + var first = options.at(1), + isSubmenu = this.isSubmenu(options), + title = isSubmenu ? first : null, + items = isSubmenu ? options.at(2) : options; + + // additional properties + this.answer = null; + this.isDone = false; + this.scale = 1; + + // initialize inherited properties + StagePickerMorph.uber.init.call( + this, + choice => { + var root = this.rootMenu(); + root.answer = choice; + root.isDone = true; + }, + title, // title + this, // environment + null // font size + ); + + // override inherited behavior + + // create items + items.map(each => { + var key, value, isLine; + if (this.isSubmenu(each)) { + this.addMenu( + each.at(1), // label + new StagePickerMorph(each.at(2)), // aMenu + null, // indicator + true // verbatim, don't translate + ); + } else { + key = each; + value = each; + if (each instanceof List) { // treat as pair + isLine = each.isEmpty(); + if (this.isLeftQuote(each)) { + value = each.at(1); + key = new SpriteBubbleMorph(value); + } else if (this.isRightQuote(each)) { + value = each.at(2); + key = new SpriteBubbleMorph(value); + key.isPointingRight = false; + } else { + key = each.at(1); + if (key instanceof List) { + if (this.isLeftQuote(key)) { + key = new SpriteBubbleMorph(key.at(1)); + } else if (this.isRightQuote(key)) { + key = new SpriteBubbleMorph(key.at(2)); + key.isPointingRight = false; + } else if (this.isShortcut(key)) { + this.addPair( + key.at(1).toString(), + each.at(2), + key.at(2).toString() + ); + return; + } else { + key = key.itemsArray(); + } + } + value = each.at(2); + } + } + if (isLine) { + this.addLine(); + } else { + this.addItem( + key, + value, + null, // hint + null, // color + null, // bold + null, // italic + null, // doubleClickAction + null, // shortcut + true // verbatim? don't translate + ); + } + } + }); + +}; + +StagePickerMorph.prototype.isSubmenu = function (options) { + var first; + if (!(options instanceof List)) { + return false; + } + first = options.at(1); + return (isString(first) || !isNaN(+first)) && + first.toString().length && + options.length() === 2 && + options.rank() > 1; +}; + +StagePickerMorph.prototype.isLeftQuote = function (options) { + return options instanceof List && !options.isEmpty() && !options.at(2); +}; + +StagePickerMorph.prototype.isRightQuote = function (options) { + return options instanceof List && + !options.isEmpty() && + !options.at(1) && + (options.at(1) !== false); +}; + +StagePickerMorph.prototype.isShortcut = function (key) { + var types = ['text', 'number']; + return key instanceof List && + (key.length() === 2) && + key.at(1) && + key.at(2) && + contains(types, Process.prototype.reportTypeOf(key.at(1))) && + contains(types, Process.prototype.reportTypeOf(key.at(2))); +}; + +StagePickerMorph.prototype.dataRepresentation = function (data) { + var sym, img; + if (data instanceof SpeechBubbleMorph) { + data.bubbleFontSize = 12; + data.bubbleFontIsBold = false; + data.bubbleCorner = 5; + data.bubbleBorder = 0; // 1.5; + data.bubblePadding = 0; + data.scale = this.scale; + data.bubbleFontColor = data.isPointingRight ? BLACK : WHITE; + data.color = data.isPointingRight ? new Color(220, 220, 220) + : SpriteMorph.prototype.blockColor.sensing; + data.fixLayout(); + data.rerender(); + sym = data.fullImage(); + if (data.isPointingRight) { + return sym; + } + img = newCanvas(new Point( + (SpriteMorph.prototype.bubbleMaxTextWidth + 10) * this.scale, + sym.height + )); + img.getContext('2d').drawImage(sym, img.width - sym.width, 0); + return img; + } + switch (Process.prototype.reportTypeOf(data)) { + case 'costume': + case 'sprite': + case 'stage': + return data.thumbnail(new Point(40, 40).multiplyBy(this.scale)); + case 'command': + case 'reporter': + case 'predicate': + return data.image(); + case 'Boolean': + sym = new BooleanSlotMorph(data); + sym.fontSize *= this.scale; + sym.edge *= this.scale; + sym.fixLayout(); + return sym.fullImage(); + case 'sound': + return (new SymbolMorph('notes', 30 * this.scale)).fullImage(); + default: + return data.toString(); + } +}; + +StagePickerMorph.prototype.addItem = function ( + labelString, + action, + hint, + color, + bold, // bool + italic, // bool + doubleClickAction, // optional, when used as list contents + shortcut, // optional string, icon (Morph or Canvas) or tuple [icon, string] + verbatim // optional bool, don't translate if true +) { + /* + labelString is normally a single-line string. But it can also be one + of the following: + + * a multi-line string (containing line breaks) + * an icon (either a Morph or a Canvas) + * a tuple of format: [icon, string] + */ + this.items.push([ + verbatim ? labelString : localize(labelString), + action === 0 ? 0 : action || nop, + hint, + color, + bold || false, + italic || false, + doubleClickAction, + shortcut, + verbatim]); +}; + +// StagePickerMorph popping up + +StagePickerMorph.prototype.popup = function (stage, pos) { + var scroller; + + this.setPosition(pos); + this.keepWithin(stage); + + if (this.bottom() > stage.bottom()) { + // scroll menu items if the menu is taller than the stage + scroller = this.scroll(); + this.bounds.corner.y = stage.bottom() - 2; + scroller.setHeight(stage.bottom() - scroller.top() - this.edge - 2); + scroller.adjustScrollBars(); + } + + if (this.items.length < 1 && !this.title) { // don't show empty menus + return; + } + stage.add(this); + this.fullChanged(); +}; + +StagePickerMorph.prototype.createLabel = function () { + var text; + if (this.label !== null) { + this.label.destroy(); + } + text = new TextMorph( + this.title.toString(), + SpriteMorph.prototype.bubbleFontSize * this.scale, + null, // MorphicPreferences.menuFontName, + true, + false, + 'center' + ); + text.alignment = 'center'; + text.color = WHITE; + text.backgroundColor = this.borderColor; + text.fixLayout(); + + // reflow text boundaries + text.setWidth(Math.min( + text.width(), + SpriteMorph.prototype.bubbleMaxTextWidth * this.scale * 2 + )); + + this.label = new BoxMorph(this.edge, 0); + this.label.color = this.borderColor; + this.label.borderColor = this.borderColor; + + this.label.outlinePath = function (ctx, corner, inset) { + // modify to only draw the top corners rounded + var w = this.width(), + h = this.height(), + radius = Math.min(corner, (Math.min(w, h) - inset) / 2), + offset = radius + inset; + + // top left: + ctx.arc( + offset, + offset, + radius, + radians(-180), + radians(-90), + false + ); + + // top right: + ctx.arc( + w - offset, + offset, + radius, + radians(-90), + radians(-0), + false + ); + + // bottom right: + ctx.lineTo(w, h); + + // bottom left: + ctx.lineTo(0, h); + }; + + this.label.setExtent(text.extent().add(this.edge)); + this.label.add(text); + this.label.text = text; +}; + +StagePickerMorph.prototype.createItems = function (scale) { + var item, + x, + y, + isLine = false; + + this.scale = scale; + this.children.forEach(m => m.destroy()); + this.children = []; + this.edge = SyntaxElementMorph.prototype.rounding * this.scale; + this.border = SpriteMorph.prototype.bubbleBorder * this.scale; + this.color = WHITE; + this.borderColor = SpriteMorph.prototype.blockColor.sensing; + this.setExtent(new Point(0, 0)); + + y = this.border; + x = this.left() + this.border; + if (this.title) { + this.createLabel(); + this.label.setPosition(this.bounds.origin); + this.add(this.label); + y = this.label.bottom(); + } else { + y = this.top() + this.edge; + } + y += 1; + this.items.forEach(tuple => { + isLine = false; + if (tuple[0] === 0) { + isLine = true; + item = new Morph(); + item.color = this.borderColor; + item.setHeight(tuple[1] * this.scale); + } else { + item = new StagePickerItemMorph( + this.target, + tuple[1], + tuple[0] instanceof Array ? + [this.dataRepresentation(tuple[0][0]), tuple[0][1]] + : this.dataRepresentation(tuple[0]), + SpriteMorph.prototype.bubbleFontSize * this.scale, + null, // MorphicPreferences.menuFontName, + this.environment, + tuple[2], // bubble help hint + tuple[3], // color + tuple[4], // bold + tuple[5], // italic + tuple[6], // doubleclick action + tuple[7], // shortcut + this.scale + ); + } + if (isLine) { + y += 1; + } + item.setPosition(new Point(x, y)); + this.add(item); + y = y + item.height(); + if (isLine) { + y += 1; + } + }); + + this.adjustWidths(); + this.setExtent( + this.fullBounds().extent().add(new Point(this.border, this.edge)) + ); + if (this.label) { + this.label.setWidth(this.width()); + this.label.text.setPosition( + this.label.center().subtract( + this.label.text.extent().floorDivideBy(2) + ) + ); + } +}; + +StagePickerMorph.prototype.maxWidth = function () { + var w = 0; + + if (this.parent instanceof FrameMorph) { + if (this.parent.scrollFrame instanceof ScrollFrameMorph) { + w = this.parent.scrollFrame.width(); + } + } + this.children.forEach(item => { + if (item instanceof MenuItemMorph) { + w = Math.max( + w, + item.label.width() + this.edge + + (item.shortcut ? item.shortcut.width() + this.border : 0) + ); + } + }); + if (this.label) { + w = Math.max(w, this.label.width() - this.border); + } + return w; +}; + +StagePickerMorph.prototype.adjustWidths = function () { + var w = this.maxWidth(); + this.children.forEach(item => { + item.setWidth(w); + item.fixLayout(); + }); +}; + +// StagePickerMorph removing + +StagePickerMorph.prototype.destroy = function () { + MenuMorph.uber.destroy.call(this); +}; + +// StagePickerMorph submenus + +StagePickerMorph.prototype.closeSubmenu = function () { + if (this.submenu) { + this.submenu.destroy(); + this.submenu = null; + this.unselectAllItems(); + } +}; + +StagePickerMorph.prototype.rootMenu = function () { + return (this.parent instanceof StagePickerMorph) ? + this.parent.rootMenu() + : this; +}; + +// StagePickerItemMorph //////////////////////////////////////////////////////// + +/* + I am an option that can be clicked inside a StagePickerMorph. +*/ + +// StagePickerItemMorph inherits from MenuItemMorph: + +StagePickerItemMorph.prototype = new MenuItemMorph(); +StagePickerItemMorph.prototype.constructor = StagePickerItemMorph; +StagePickerItemMorph.uber = MenuItemMorph.prototype; + +// StagePickerItemMorph instance creation: + +function StagePickerItemMorph( + target, + action, + labelString, // can also be a Morph or a Canvas or a tuple: [icon, string] + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction, // optional when used as list morph item + shortcut, // optional string, Morph, Canvas or tuple: [icon, string] + scale +) { + this.shortcutString = shortcut || null; + this.shortcut = null; + this.scale = scale || 1; + this.init( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction + ); + + this.highlightColor = SpriteMorph.prototype.blockColor.sensing.lighter(75); + this.pressColor = SpriteMorph.prototype.blockColor.sensing.lighter(25); + if (this.shortcut) { + this.shortcut.setColor(SpriteMorph.prototype.blockColor.sensing); + } +} + +StagePickerItemMorph.prototype.createLabelString = function (string) { + var lbl = new TextMorph( + string, + this.fontSize, + this.fontStyle, + this.labelBold, + this.labelItalic + ); + // reflow text boundaries + lbl.setWidth(Math.min( + lbl.width(), + SpriteMorph.prototype.bubbleMaxTextWidth * this.scale * 2 + )); + lbl.setColor(this.labelColor); + return lbl; +}; + +// StagePickerItemMorph submenus: + +StagePickerItemMorph.prototype.popUpSubmenu = function () { + var menu = this.parentThatIsA(MenuMorph), + stage = this.parentThatIsA(StageMorph), + scroller; + + if (!(this.action instanceof MenuMorph)) {return; } + this.action.createItems(menu.scale); + this.action.setPosition(this.topRight().subtract(new Point(0, 5))); + this.action.keepWithin(stage); + if (this.action.items.length < 1 && !this.action.title) {return; } + + if (this.action.bottom() > stage.bottom()) { + // scroll menu items if the menu is taller than the world + scroller = this.action.scroll(); + this.action.bounds.corner.y = stage.bottom() - 2; + scroller.setHeight( + stage.bottom() - scroller.top() - this.action.edge - 2 + ); + scroller.adjustScrollBars(); + } + + menu.add(this.action); + menu.submenu = this.action; + this.action.fullChanged(); +}; diff --git a/elements/pl-snap/Snap/src/paint.js b/elements/pl-snap/Snap/src/paint.js new file mode 100644 index 00000000..10a19177 --- /dev/null +++ b/elements/pl-snap/Snap/src/paint.js @@ -0,0 +1,1112 @@ +/* + paint.js + + a paint editor for Snap! + inspired by the Scratch paint editor. + + written by Kartik Chandra + Copyright (C) 2019 by Kartik Chandra + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + PaintEditorMorph + PaintColorPickerMorph + PaintCanvasMorph + + + credits + ------- + Nathan Dinsmore contributed a fully working prototype, + Nathan's brilliant flood-fill tool has been more or less + directly imported into this paint implementation. + + Jens Mönig has contributed icons and bugfixes and says he has probably + introduced many other bugs in that process. :-) + + + revision history + ---------------- + May 10 - first full release (Kartik) + May 14 - bugfixes, Snap integration (Jens) + May 16 - flat design adjustments (Jens) + July 12 - pipette tool, code formatting adjustments (Jens) + Sept 16 - flood fill freeze fix (Kartik) + Jan 08 - mouse leave dragging fix (Kartik) + Feb 11 - dynamically adjust to stage dimensions (Jens) + Apr 30 - localizations (Manuel) + June 3 - transformations (Kartik) + June 4 - tweaks (Jens) + Aug 24 - floodfill alpha-integer issue (Kartik) + Sep 29 - tweaks (Jens) + Sep 28 [of the following year :)] - Try to prevent antialiasing (Kartik) + Oct 02 - revert disable smoothing (Jens) + Dec 15 - center rotation point on costume creating (Craxic) + Jan 18 - avoid pixel collision detection in PaintCanvas (Jens) + Mar 22 - fixed automatic rotation center point mechanism (Jens) + May 10 - retina display support adjustments (Jens) + 2017 + Apr 10 - getGlobalPixelColor adjustment for Chrome & retina (Jens) + 2018 + Jan 22 - floodfill alpha tweak (Bernat) + Mar 19 - vector paint editor (Bernat) + + 2020 Apr 14 - Morphic2 migration (Jens) + 2020 May 17 - Pipette alpha fix (Joan) + 2020 Jul 13 - modified scale buttons (Jadga) + + 2021 Mar 17 - moved stage dimension handling to scenes (Jens) +*/ + +/*global Point, Rectangle, DialogBoxMorph, AlignmentMorph, PushButtonMorph, nop, +Color, SymbolMorph, newCanvas, Morph, StringMorph, Costume, SpriteMorph, isNil, +localize, InputFieldMorph, SliderMorph, ToggleMorph, ToggleButtonMorph, modules, +BoxMorph, radians, MorphicPreferences, getDocumentPositionOf, SVG_Costume*/ + +/*jshint esversion: 6*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.paint = '2023-May-24'; + +// Declarations + +var PaintEditorMorph; +var PaintCanvasMorph; +var PaintColorPickerMorph; + +// PaintEditorMorph ////////////////////////// + +// A complete paint editor + +PaintEditorMorph.prototype = new DialogBoxMorph(); +PaintEditorMorph.prototype.constructor = PaintEditorMorph; +PaintEditorMorph.uber = DialogBoxMorph.prototype; + +PaintEditorMorph.prototype.padding = 10; + +function PaintEditorMorph() { + this.init(); +} + +PaintEditorMorph.prototype.init = function () { + // additional properties: + this.ide = null; + this.paper = null; // paint canvas + this.oncancel = null; + + // initialize inherited properties: + PaintEditorMorph.uber.init.call(this); + + // override inherited properties: + this.labelString = "Paint Editor"; + this.createLabel(); + + // building the contents happens when I am opened with an IDE + // so my extent can be adjusted accordingly (jens) + // this.buildContents(); +}; + +PaintEditorMorph.prototype.buildContents = function () { + var myself = this; + + this.paper = new PaintCanvasMorph(function () {return myself.shift; }); + this.paper.setExtent(this.ide.stage.dimensions); + + this.addBody(new AlignmentMorph('row', this.padding)); + this.controls = new AlignmentMorph('column', this.padding / 2); + this.controls.alignment = 'center'; + + this.edits = new AlignmentMorph('row', this.padding / 2); + this.buildEdits(); + this.controls.add(this.edits); + + this.body.color = this.color; + + this.body.add(this.controls); + this.body.add(this.paper); + + this.toolbox = new BoxMorph(); + this.toolbox.color = SpriteMorph.prototype.paletteColor.lighter(8); + this.toolbox.borderColor = this.toolbox.color.lighter(40); + if (MorphicPreferences.isFlat) { + this.toolbox.edge = 0; + } + + this.buildToolbox(); + this.controls.add(this.toolbox); + + this.scaleBox = new AlignmentMorph('row', this.padding / 2); + this.buildScaleBox(); + this.controls.add(this.scaleBox); + + this.propertiesControls = { + colorpicker: null, + penSizeSlider: null, + penSizeField: null, + primaryColorButton: null, + primaryColorViewer: null, + constrain: null + }; + this.populatePropertiesMenu(); + + this.addButton("ok", "OK"); + this.addButton("cancel", "Cancel"); + + this.refreshToolButtons(); + this.fixLayout(); +}; + +PaintEditorMorph.prototype.buildToolbox = function () { + var tools = { + brush: + "Paintbrush tool\n(free draw)", + rectangle: + "Stroked Rectangle\n(shift: square)", + circle: + "Stroked Ellipse\n(shift: circle)", + eraser: + "Eraser tool", + crosshairs: + "Set the rotation center", + + line: + "Line tool\n(shift: vertical/horizontal)", + rectangleSolid: + "Filled Rectangle\n(shift: square)", + circleSolid: + "Filled Ellipse\n(shift: circle)", + paintbucket: + "Fill a region", + pipette: + "Pipette tool\n(pick a color anywhere)" + }, + myself = this, + left = this.toolbox.left(), + top = this.toolbox.top(), + padding = 2, + inset = 5, + x = 0, + y = 0; + + Object.keys(tools).forEach(function (tool) { + var btn = myself.toolButton(tool, tools[tool]); + btn.setPosition(new Point( + left + x, + top + y + )); + x += btn.width() + padding; + if (tool === "crosshairs") { + x = 0; + y += btn.height() + padding; + myself.paper.drawcrosshair(); + } + myself.toolbox[tool] = btn; + myself.toolbox.add(btn); + }); + + this.toolbox.bounds = this.toolbox.fullBounds().expandBy(inset * 2); +}; + +PaintEditorMorph.prototype.buildEdits = function () { + var myself = this, + paper = this.paper; + + this.edits.add(this.pushButton( + "undo", + function () {paper.undo(); } + )); + + this.edits.add(this.pushButton( + "clear", + function () {paper.clearCanvas(); } + )); + this.edits.add(this.pushButton( + 'Vector', + function () { + if (myself.paper.undoBuffer.length > 0) { + myself.ide.confirm( + 'This will erase your current drawing. ' + + 'Are you sure you want to continue?', + 'Switch to vector editor?', + () => { + setTimeout(() => {myself.switchToVector(); }); + } + ); + } else { + myself.switchToVector(); + } + } + )); + + this.edits.fixLayout(); +}; + +PaintEditorMorph.prototype.buildScaleBox = function () { + var paper = this.paper; + this.scaleBox.add(this.pushButton( + new SymbolMorph('grow', 18), + function () {paper.scale(0.05, 0.05); }, + 'grow' + )); + this.scaleBox.add(this.pushButton( + new SymbolMorph('shrink', 18), + function () {paper.scale(-0.05, -0.05); }, + 'shrink' + )); + this.scaleBox.add(this.pushButton( + new SymbolMorph('flipHorizontal', 18), + function () {paper.scale(-2, 0); }, + 'flip horizontal' + )); + this.scaleBox.add(this.pushButton( + new SymbolMorph('flipVertical', 18), + function () {paper.scale(0, -2); }, + 'flip vertical' + )); + this.scaleBox.fixLayout(); +}; + +PaintEditorMorph.prototype.openIn = function ( + world, + oldim, + oldrc, + callback, + anIDE +) { + var myself = this; + // Open the editor in a world with an optional image to edit + this.oldim = oldim; + this.callback = callback || nop; + this.ide = anIDE; + + this.buildContents(); + + this.processKeyUp = function () { + myself.shift = false; + myself.propertiesControls.constrain.refresh(); + }; + + this.processKeyDown = function () { + myself.shift = myself.world().currentKey === 16; + myself.propertiesControls.constrain.refresh(); + }; + //merge oldim: + if (this.oldim) { + this.paper.automaticCrosshairs = isNil(oldrc); + this.paper.centermerge(this.oldim, this.paper.paper); + this.paper.rotationCenter = + (oldrc || new Point(0, 0)).add( + new Point( + (this.paper.paper.width - this.oldim.width) / 2, + (this.paper.paper.height - this.oldim.height) / 2 + ) + ); + this.paper.drawNew(); + } + + this.key = 'paint'; + this.popUp(world); +}; + +PaintEditorMorph.prototype.fixLayout = function () { + this.changed(); + if (this.paper) { + this.paper.buildContents(); + this.paper.drawNew(); + } + if (this.controls) {this.controls.fixLayout(); } + if (this.body) {this.body.fixLayout(); } + PaintEditorMorph.uber.fixLayout.call(this); + this.changed(); +}; + +PaintEditorMorph.prototype.refreshToolButtons = function () { + this.toolbox.children.forEach(function (toggle) { + toggle.refresh(); + }); +}; + +PaintEditorMorph.prototype.ok = function () { + this.paper.updateAutomaticCenter(); + this.callback( + this.paper.paper, + this.paper.rotationCenter + ); + this.destroy(); +}; + +PaintEditorMorph.prototype.cancel = function () { + if (this.oncancel) {this.oncancel(); } + this.destroy(); +}; + +PaintEditorMorph.prototype.switchToVector = function () { + + this.object = new SVG_Costume(new Image(), '', new Point(0,0)); + this.object.edit( + this.world(), + this.ide, + true + ); +}; + +PaintEditorMorph.prototype.populatePropertiesMenu = function () { + var c = this.controls, + myself = this, + pc = this.propertiesControls, + alpen = new AlignmentMorph("row", this.padding), + brushControl = new AlignmentMorph("column", 3); + + brushControl.alignment = "left"; + + pc.primaryColorViewer = new Morph(); + pc.primaryColorViewer.isCachingImage = true; + + pc.primaryColorViewer.render = function (ctx) { + var color = myself.paper.settings.primarycolor, + i, + j; + if (color === "transparent") { + for (i = 0; i < 180; i += 5) { + for (j = 0; j < 15; j += 5) { + ctx.fillStyle = + ((j + i) / 5) % 2 === 0 ? + "rgba(0, 0, 0, 0.2)" : + "rgba(0, 0, 0, 0.5)"; + ctx.fillRect(i, j, 5, 5); + + } + } + } else { + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, 180, 15); + } + ctx.strokeStyle = "black"; + ctx.lineWidth = Math.min(myself.paper.settings.linewidth, 20); + ctx.beginPath(); + ctx.lineCap = "round"; + ctx.moveTo(20, 30); + ctx.lineTo(160, 30); + ctx.stroke(); + }; + + pc.primaryColorViewer.setExtent(new Point(180, 40)); + pc.primaryColorViewer.color = new Color(0, 0, 0); + + pc.colorpicker = new PaintColorPickerMorph( + new Point(180, 100), + function (color) { + myself.paper.settings.primarycolor = color; + pc.primaryColorViewer.rerender(); + } + ); + pc.colorpicker.isCachingImage = true; + pc.colorpicker.action(new Color(0, 0, 0)); + + pc.penSizeSlider = new SliderMorph(0, 20, 5, 5); + pc.penSizeSlider.orientation = "horizontal"; + pc.penSizeSlider.setHeight(15); + pc.penSizeSlider.setWidth(150); + pc.penSizeSlider.action = function (num) { + if (pc.penSizeField) { + pc.penSizeField.setContents(num); + } + myself.paper.settings.linewidth = num; + pc.colorpicker.action(myself.paper.settings.primarycolor); + }; + + pc.penSizeField = new InputFieldMorph("5", true, null, false); + pc.penSizeField.contents().minWidth = 20; + pc.penSizeField.setWidth(25); + pc.penSizeField.accept = function () { + var val = parseFloat(pc.penSizeField.getValue()); + pc.penSizeSlider.value = val; + pc.penSizeSlider.updateValue(); + this.setContents(val); + myself.paper.settings.linewidth = val; + this.world().keyboardFocus = myself; + pc.colorpicker.action(myself.paper.settings.primarycolor); + }; + + alpen.add(pc.penSizeSlider); + alpen.add(pc.penSizeField); + alpen.color = myself.color; + alpen.fixLayout(); + + pc.penSizeField.fixLayout(); + pc.constrain = new ToggleMorph( + "checkbox", + this, + function () {myself.shift = !myself.shift; }, + "Constrain proportions of shapes?\n(you can also hold shift)", + function () {return myself.shift; } + ); + pc.constrain.label.isBold = false; + + c.add(pc.colorpicker); + //c.add(pc.primaryColorButton); + c.add(pc.primaryColorViewer); + brushControl.add( + new StringMorph(localize("Brush size") + ":", 10, null, true) + ); + brushControl.add(alpen); + brushControl.add(pc.constrain); + brushControl.fixLayout(); + c.add(brushControl); +}; + +PaintEditorMorph.prototype.toolButton = function (icon, hint) { + var button, myself = this; + + button = new ToggleButtonMorph( + null, + this, + function () { // action + myself.paper.currentTool = icon; + myself.paper.toolChanged(icon); + myself.refreshToolButtons(); + if (icon === 'pipette') { + myself.getUserColor(); + } + }, + new SymbolMorph(icon, 18), + function () {return myself.paper.currentTool === icon; } + ); + + button.hint = hint; + return button; +}; + +PaintEditorMorph.prototype.pushButton = function (title, action, hint) { + return new PushButtonMorph( + this, + action, + title, + null, + hint + ); +}; + +PaintEditorMorph.prototype.getUserColor = function () { + var myself = this, + world = this.world(), + hand = world.hand, + posInDocument = getDocumentPositionOf(world.worldCanvas), + mouseMoveBak = hand.processMouseMove, + mouseDownBak = hand.processMouseDown, + mouseUpBak = hand.processMouseUp; + + hand.processMouseMove = function (event) { + var color; + hand.setPosition(new Point( + event.pageX - posInDocument.x, + event.pageY - posInDocument.y + )); + color = world.getGlobalPixelColor(hand.position()); + if (!color.a) { + // ignore transparent, + // needed for retina-display support + return; + } + color.a = 1; + myself.propertiesControls.colorpicker.action(color); + }; + + hand.processMouseDown = nop; + + hand.processMouseUp = function () { + myself.paper.currentTool = 'brush'; + myself.paper.toolChanged('brush'); + myself.refreshToolButtons(); + hand.processMouseMove = mouseMoveBak; + hand.processMouseDown = mouseDownBak; + hand.processMouseUp = mouseUpBak; + }; +}; + +// AdvancedColorPickerMorph ////////////////// + +// A large hsl color picker + +PaintColorPickerMorph.prototype = new Morph(); +PaintColorPickerMorph.prototype.constructor = PaintColorPickerMorph; +PaintColorPickerMorph.uber = Morph.prototype; + +function PaintColorPickerMorph(extent, action) { + this.init(extent, action); +} + +PaintColorPickerMorph.prototype.init = function (extent, action) { + this.isCachingImage = true; + this.setExtent(extent || new Point(200, 100)); + this.action = action || nop; +}; + +PaintColorPickerMorph.prototype.render = function (ctx) { + var x = 0, + y = 0, + colorselection, + r; + for (x = 0; x < this.width(); x += 1) { + for (y = 0; y < this.height() - 20; y += 1) { + ctx.fillStyle = "hsl(" + + (360 * x / this.width()) + + "," + + "100%," + + (y * 100 / (this.height() - 20)) + + "%)"; + ctx.fillRect(x, y, 1, 1); + } + } + for (x = 0; x < this.width(); x += 1) { + r = Math.floor(255 * x / this.width()); + ctx.fillStyle = "rgb(" + r + ", " + r + ", " + r + ")"; + ctx.fillRect(x, this.height() - 20, 1, 10); + } + colorselection = ["black", "white", "gray"]; + for (x = 0; x < colorselection.length; x += 1) { + ctx.fillStyle = colorselection[x]; + ctx.fillRect( + x * this.width() / colorselection.length, + this.height() - 10, + this.width() / colorselection.length, + 10 + ); + } + for (x = this.width() * 2 / 3; x < this.width(); x += 2) { + for (y = this.height() - 10; y < this.height(); y += 2) { + if ((x + y) / 2 % 2 === 0) { + ctx.fillStyle = "#DDD"; + ctx.fillRect(x, y, 2, 2); + } + } + } +}; + +PaintColorPickerMorph.prototype.mouseDownLeft = function (pos) { + if ((pos.subtract(this.position()).x > this.width() * 2 / 3) && + (pos.subtract(this.position()).y > this.height() - 10)) { + this.action("transparent"); + } else { + this.action(this.getPixelColor(pos)); + } +}; + +PaintColorPickerMorph.prototype.mouseMove = + PaintColorPickerMorph.prototype.mouseDownLeft; + +// PaintCanvasMorph /////////////////////////// +/* + A canvas which reacts to drag events to + modify its image, based on a 'tool' property. +*/ + +PaintCanvasMorph.prototype = new Morph(); +PaintCanvasMorph.prototype.constructor = PaintCanvasMorph; +PaintCanvasMorph.uber = Morph.prototype; + +function PaintCanvasMorph(shift) { + this.init(shift); +} + +PaintCanvasMorph.prototype.init = function (shift) { + this.rotationCenter = new Point(240, 180); + this.dragRect = null; + this.previousDragPoint = null; + this.currentTool = "brush"; + this.dragRect = new Rectangle(); + // rectangle with origin being the starting drag position and + // corner being the current drag position + this.mask = null; // Temporary canvas + this.paper = null; // Actual canvas + this.erasermask = null; // eraser memory + this.background = null; // checkers + this.settings = { + "primarycolor": new Color(0, 0, 0, 255), // usually fill color + "secondarycolor": new Color(0, 0, 0, 255), // (unused) + "linewidth": 3 // stroke width + }; + this.brushBuffer = []; + this.undoBuffer = []; + this.isShiftPressed = shift || function () { + var key = this.world().currentKey; + return (key === 16); + }; + // should we calculate the center of the image ourselves, + // or use the user position + this.automaticCrosshairs = true; + this.isCachingImage = true; + this.buildContents(); + this.drawNew(); +}; + +// Calculate the center of all the non-transparent pixels on the canvas. +PaintCanvasMorph.prototype.calculateCanvasCenter = function(canvas) { + var canvasBounds = Costume.prototype.canvasBoundingBox(canvas); + if (canvasBounds === null) { + return null; + } + // Can't use canvasBounds.center(), it rounds down. + return new Point( + (canvasBounds.origin.x + canvasBounds.corner.x) / 2, + (canvasBounds.origin.y + canvasBounds.corner.y) / 2 + ); +}; + +// If we are in automaticCrosshairs mode, recalculate the rotationCenter. +PaintCanvasMorph.prototype.updateAutomaticCenter = function () { + if (this.automaticCrosshairs) { + // Calculate this.rotationCenter from this.paper + var rotationCenter = this.calculateCanvasCenter(this.paper); + if (rotationCenter !== null) { + this.rotationCenter = rotationCenter; + } + } +}; + +PaintCanvasMorph.prototype.scale = function (x, y) { + this.updateAutomaticCenter(); + this.mask = newCanvas(this.extent(), true); + var c = newCanvas(this.extent(), true); + c.getContext("2d").save(); + c.getContext("2d").translate( + this.rotationCenter.x, + this.rotationCenter.y + ); + c.getContext("2d").scale(1 + x, 1 + y); + c.getContext("2d").drawImage( + this.paper, + -this.rotationCenter.x, + -this.rotationCenter.y + ); + c.getContext("2d").restore(); + this.paper = c; + this.drawNew(); + this.changed(); +}; + +PaintCanvasMorph.prototype.cacheUndo = function () { + var cachecan = newCanvas(this.extent(), true); + this.merge(this.paper, cachecan); + this.undoBuffer.push(cachecan); +}; + +PaintCanvasMorph.prototype.undo = function () { + if (this.undoBuffer.length > 0) { + this.paper = newCanvas(this.extent(), true); + this.mask.width = this.mask.width + 1 - 1; + this.merge(this.undoBuffer.pop(), this.paper); + this.drawNew(); + this.changed(); + } +}; + +PaintCanvasMorph.prototype.merge = function (a, b) { + b.getContext("2d").drawImage(a, 0, 0); +}; + +PaintCanvasMorph.prototype.centermerge = function (a, b) { + b.getContext("2d").drawImage( + a, + (b.width - a.width) / 2, + (b.height - a.height) / 2 + ); +}; + +PaintCanvasMorph.prototype.clearCanvas = function () { + this.buildContents(); + this.drawNew(); + this.changed(); +}; + +PaintCanvasMorph.prototype.toolChanged = function (tool) { + this.mask = newCanvas(this.extent(), true, this.mask); + if (tool === "crosshairs") { + this.updateAutomaticCenter(); + this.drawcrosshair(); + } + this.drawNew(); + this.changed(); +}; + +PaintCanvasMorph.prototype.drawcrosshair = function (context) { + var ctx = context || this.mask.getContext("2d"), + rp = this.rotationCenter; + + ctx.save(); + ctx.lineWidth = 1; + ctx.strokeStyle = 'black'; + ctx.clearRect(0, 0, this.mask.width, this.mask.height); + + // draw crosshairs: + ctx.globalAlpha = 0.5; + + // circle around center: + ctx.fillStyle = 'white'; + ctx.beginPath(); + ctx.arc( + rp.x, + rp.y, + 20, + radians(0), + radians(360), + false + ); + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + ctx.beginPath(); + ctx.arc( + rp.x, + rp.y, + 10, + radians(0), + radians(360), + false + ); + ctx.stroke(); + + // horizontal line: + ctx.beginPath(); + ctx.moveTo(0, rp.y); + ctx.lineTo(this.mask.width, rp.y); + ctx.stroke(); + + // vertical line: + ctx.beginPath(); + ctx.moveTo(rp.x, 0); + ctx.lineTo(rp.x, this.mask.height); + ctx.stroke(); + + ctx.restore(); + + this.drawNew(); +}; + +PaintCanvasMorph.prototype.floodfill = function (sourcepoint) { + var width = this.paper.width, + height = this.paper.height, + ctx = this.paper.getContext("2d"), + img = ctx.getImageData(0, 0, width, height), + data = img.data, + stack = [Math.round(Math.round(sourcepoint.y) * width + sourcepoint.x)], + currentpoint, + read, + sourcecolor, + checkpoint; + read = function (p) { + var d = p * 4; + return [data[d], data[d + 1], data[d + 2], data[d + 3]]; + }; + sourcecolor = read(stack[0]); + checkpoint = function (p) { + return p[0] === sourcecolor[0] && + p[1] === sourcecolor[1] && + p[2] === sourcecolor[2] && + p[3] === sourcecolor[3]; + }; + + // if already filled, abort + if (sourcecolor[3] === 0 && + this.settings.primarycolor === "transparent") { + return; + } + if (sourcecolor[0] === this.settings.primarycolor.r && + sourcecolor[1] === this.settings.primarycolor.g && + sourcecolor[2] === this.settings.primarycolor.b && + sourcecolor[3] === this.settings.primarycolor.a * 255) { + return; + } + if (sourcecolor[3] === 0 && this.settings.primarycolor.a === 0) { + return; + } + + while (stack.length > 0) { + currentpoint = stack.pop(); + if (checkpoint(read(currentpoint))) { + if (currentpoint % width > 1) { + stack.push(currentpoint + 1); + stack.push(currentpoint - 1); + } + if (currentpoint > 0 && currentpoint < height * width) { + stack.push(currentpoint + width); + stack.push(currentpoint - width); + } + } + if (this.settings.primarycolor === "transparent") { + data[currentpoint * 4 + 3] = 0; + } else { + data[currentpoint * 4] = this.settings.primarycolor.r; + data[currentpoint * 4 + 1] = this.settings.primarycolor.g; + data[currentpoint * 4 + 2] = this.settings.primarycolor.b; + data[currentpoint * 4 + 3] = this.settings.primarycolor.a * 255; + } + } + ctx.putImageData(img, 0, 0); + this.drawNew(); + this.changed(); +}; + +PaintCanvasMorph.prototype.mouseDownLeft = function (pos) { + this.cacheUndo(); + this.dragRect.origin = pos.subtract(this.bounds.origin); + this.dragRect.corner = pos.subtract(this.bounds.origin); + this.previousDragPoint = this.dragRect.corner.copy(); + if (this.currentTool === 'crosshairs') { + this.rotationCenter = pos.subtract(this.bounds.origin); + this.drawcrosshair(); + return; + } + if (this.currentTool === "paintbucket") { + return this.floodfill(pos.subtract(this.bounds.origin)); + } + if (this.settings.primarycolor === "transparent" && + this.currentTool !== "crosshairs") { + this.erasermask = newCanvas(this.extent(), true, this.erasermask); + this.merge(this.paper, this.erasermask); + } +}; + +PaintCanvasMorph.prototype.mouseMove = function (pos) { + if (this.currentTool === "paintbucket") { + return; + } + + var relpos = pos.subtract(this.bounds.origin), + mctx = this.mask.getContext("2d"), + pctx = this.paper.getContext("2d"), + x = this.dragRect.origin.x, // original drag X + y = this.dragRect.origin.y, // original drag y + p = relpos.x, // current drag x + q = relpos.y, // current drag y + w = (p - x) / 2, // half the rect width + h = (q - y) / 2, // half the rect height + i, // iterator number + width = this.paper.width; + + mctx.save(); + function newW() { + return Math.max(Math.abs(w), Math.abs(h)) * (w / Math.abs(w)); + } + function newH() { + return Math.max(Math.abs(w), Math.abs(h)) * (h / Math.abs(h)); + } + this.brushBuffer.push([p, q]); + mctx.lineWidth = this.settings.linewidth; + mctx.clearRect(0, 0, this.bounds.width(), this.bounds.height()); // mask + + this.dragRect.corner = relpos.subtract(this.dragRect.origin); // reset crn + + if (this.settings.primarycolor === "transparent" && + this.currentTool !== "crosshairs") { + this.merge(this.erasermask, this.mask); + pctx.clearRect(0, 0, this.bounds.width(), this.bounds.height()); + mctx.globalCompositeOperation = "destination-out"; + } else { + mctx.fillStyle = this.settings.primarycolor.toString(); + mctx.strokeStyle = this.settings.primarycolor.toString(); + } + switch (this.currentTool) { + case "rectangle": + if (this.isShiftPressed()) { + mctx.strokeRect(x, y, newW() * 2, newH() * 2); + } else { + mctx.strokeRect(x, y, w * 2, h * 2); + } + break; + case "rectangleSolid": + if (this.isShiftPressed()) { + mctx.fillRect(x, y, newW() * 2, newH() * 2); + } else { + mctx.fillRect(x, y, w * 2, h * 2); + } + break; + case "brush": + mctx.lineCap = "round"; + mctx.lineJoin = "round"; + mctx.beginPath(); + mctx.moveTo(this.brushBuffer[0][0], this.brushBuffer[0][1]); + for (i = 0; i < this.brushBuffer.length; i += 1) { + mctx.lineTo(this.brushBuffer[i][0], this.brushBuffer[i][1]); + } + mctx.stroke(); + break; + case "line": + mctx.beginPath(); + mctx.moveTo(x, y); + if (this.isShiftPressed()) { + if (Math.abs(h) > Math.abs(w)) { + mctx.lineTo(x, q); + } else { + mctx.lineTo(p, y); + } + } else { + mctx.lineTo(p, q); + } + mctx.stroke(); + break; + case "circle": + case "circleSolid": + mctx.beginPath(); + if (this.isShiftPressed()) { + mctx.arc( + x, + y, + new Point(x, y).distanceTo(new Point(p, q)), + 0, + Math.PI * 2, + false + ); + } else { + for (i = 0; i < width; i += 1) { + mctx.lineTo( + i, + (2 * h) * Math.sqrt(2 - Math.pow( + (i - x) / (2 * w), + 2 + )) + y + ); + } + for (i = width; i > 0; i -= 1) { + mctx.lineTo( + i, + -1 * (2 * h) * Math.sqrt(2 - Math.pow( + (i - x) / (2 * w), + 2 + )) + y + ); + } + } + mctx.closePath(); + if (this.currentTool === "circleSolid") { + mctx.fill(); + } else { + if (this.currentTool === "circle") { + mctx.stroke(); + } + } + break; + case "crosshairs": + // Disable automatic crosshairs: + // user has now chosen where they should be. + this.automaticCrosshairs = false; + this.rotationCenter = relpos.copy(); + this.drawcrosshair(mctx); + break; + case "eraser": + this.merge(this.paper, this.mask); + mctx.save(); + mctx.globalCompositeOperation = "destination-out"; + mctx.beginPath(); + mctx.moveTo(this.brushBuffer[0][0], this.brushBuffer[0][1]); + for (i = 0; i < this.brushBuffer.length; i += 1) { + mctx.lineTo(this.brushBuffer[i][0], this.brushBuffer[i][1]); + } + mctx.stroke(); + mctx.restore(); + this.paper = newCanvas(this.extent(), true); + this.merge(this.mask, this.paper); + break; + default: + nop(); + } + this.previousDragPoint = relpos; + this.drawNew(); + mctx.restore(); + this.changed(); +}; + +PaintCanvasMorph.prototype.mouseClickLeft = function () { + if (this.currentTool !== "crosshairs") { + this.merge(this.mask, this.paper); + } + this.brushBuffer = []; +}; + +PaintCanvasMorph.prototype.mouseLeaveDragging + = PaintCanvasMorph.prototype.mouseClickLeft; + +PaintCanvasMorph.prototype.buildContents = function () { + this.background = newCanvas(this.extent(), false, this.background); + this.paper = newCanvas(this.extent(), true, this.paper); + this.mask = newCanvas(this.extent(), true, this.mask); + this.erasermask = newCanvas(this.extent(), true, this.erasermask); + var i, j, bkctx = this.background.getContext("2d"); + for (i = 0; i < this.background.width; i += 5) { + for (j = 0; j < this.background.height; j += 5) { + if ((i + j) / 5 % 2 === 1) { + bkctx.fillStyle = "rgba(255, 255, 255, 1)"; + } else { + bkctx.fillStyle = "rgba(255, 255, 255, 0.3)"; + } + bkctx.fillRect(i, j, 5, 5); + } + } +}; + +PaintCanvasMorph.prototype.drawNew = function () { + var can = newCanvas(this.extent(), true, this.cachedImage); + this.merge(this.background, can); + this.merge(this.paper, can); + this.merge(this.mask, can); + this.cachedImage = can; + this.drawFrame(); +}; + +PaintCanvasMorph.prototype.rerender // ugly hack, but hey, it works ;-) jens + = PaintCanvasMorph.prototype.drawNew; + +PaintCanvasMorph.prototype.drawFrame = function () { + var context, borderColor; + + context = this.cachedImage.getContext('2d'); + if (this.parent) { + this.color = this.parent.color.lighter(this.contrast * 0.75); + borderColor = this.parent.color; + } else { + borderColor = new Color(120, 120, 120); + } + context.fillStyle = this.color.toString(); + + // cache my border colors + this.cachedClr = borderColor.toString(); + this.cachedClrBright = borderColor.lighter(this.contrast) + .toString(); + this.cachedClrDark = borderColor.darker(this.contrast).toString(); + this.drawRectBorder(context); +}; + +PaintCanvasMorph.prototype.drawRectBorder + = InputFieldMorph.prototype.drawRectBorder; + +PaintCanvasMorph.prototype.edge + = InputFieldMorph.prototype.edge; + +PaintCanvasMorph.prototype.fontSize + = InputFieldMorph.prototype.fontSize; + +PaintCanvasMorph.prototype.typeInPadding + = InputFieldMorph.prototype.typeInPadding; + +PaintCanvasMorph.prototype.contrast + = InputFieldMorph.prototype.contrast; diff --git a/elements/pl-snap/Snap/src/scenes.js b/elements/pl-snap/Snap/src/scenes.js new file mode 100644 index 00000000..4a1a88c7 --- /dev/null +++ b/elements/pl-snap/Snap/src/scenes.js @@ -0,0 +1,259 @@ +/* + + scenes.js + + multi-scene support for Snap! + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2022 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js and objects.js + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + Project + Scene + + credits + ------- + scenes have been inspired by Ted Kaehlers's personal demos of HyperCard + and many discussions with Ted about the design and practice of HyperCard, + and by personal discussions with Wolfgang Slany about his design of + scenes in Catrobat/PocketCode, which I love and admire. + +*/ + +/*global modules, VariableFrame, StageMorph, SpriteMorph, Process, List, +normalizeCanvas, SnapSerializer, Costume, ThreadManager, IDE_Morph*/ + +/*jshint esversion: 6*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.scenes = '2022-November-29'; + +// Projecct ///////////////////////////////////////////////////////// + +// I am a container for a set of one or more Snap! scenes, +// the IDE operates on an instance of me + +// Project instance creation: + +function Project(scenes, current) { + var projectScene; + + this.scenes = scenes || new List(); + this.currentScene = current; + + // proxied for display + this.name = null; + this.notes = null; + this.thumbnail = null; + + projectScene = this.scenes.at(1); + if (projectScene) { + this.name = projectScene.name; + this.notes = projectScene.notes; + this.thumbnail = normalizeCanvas( + projectScene.stage.thumbnail(SnapSerializer.prototype.thumbnailSize) + ); + } + + // for deserializing - do not persist + this.sceneIdx = null; + + // for undeleting scenes - do not persist + this.trash = []; +} + +Project.prototype.initialize = function () { + // initialize after deserializing + // only to be called by store + this.currentScene = this.scenes.at(+this.sceneIdx || 1); + return this; +}; + +Project.prototype.addDefaultScene = function () { + var scene = new Scene(); + scene.addDefaultSprite(); + this.scenes.add(scene); +}; + +// Scene ///////////////////////////////////////////////////////// + +// I am a container for a Snap! stage, scene-global variables +// and its associated settings. +// I can be used as a slide in a presentation, a chapter in a narrative, +// a level in a game, etc. + +// Scene instance creation: + +function Scene(aStageMorph) { + this.name = ''; + this.notes = ''; + this.globalVariables = aStageMorph ? + aStageMorph.globalVariables() : new VariableFrame(); + this.stage = aStageMorph || new StageMorph(this.globalVariables); + this.hasUnsavedEdits = false; + this.unifiedPalette = false; + this.showCategories = true; + this.showPaletteButtons = true; + + // cached IDE state + this.sprites = new List(); + this.currentSprite = null; + + // global settings (shared) + this.hiddenPrimitives = {}; + this.codeMappings = {}; + this.codeHeaders = {}; + this.customCategories = new Map(); // key: name, value: color + + // global settings (copied) + this.enableCodeMapping = false; + this.enableInheritance = true; + this.enableSublistIDs = false; + this.enablePenLogging = false; + this.useFlatLineEnds = false; + this.enableLiveCoding = false; + this.enableHyperOps = true; + this.disableClickToRun = false; + this.disableDraggingData = false; + this.penColorModel = 'hsv'; // can also bei 'hsl' + + // for deserializing - do not persist + this.spritesDict = {}; + this.targetStage = null; + this.spriteIdx = null; + + // for undeleting sprites - do not persist + this.trash = []; +} + +Scene.prototype.initialize = function () { + // initialize after deserializing + // only to be called by store + var objs = this.stage.children.filter( + child => child instanceof SpriteMorph + ); + objs.sort((x, y) => x.idx - y.idx); + this.sprites = new List(objs); + if (this.spriteIdx === null && this.sprites.length() > 0) { + this.currentSprite = this.sprites.at(1); + } else if (this.spriteIdx === 0) { + this.currentSprite = this.stage; + } else { + this.currentSprite = this.sprites.at(this.spriteIdx) || + this.stage; + } + return this; +}; + +Scene.prototype.addDefaultSprite = function () { + var sprite = new SpriteMorph(this.globalVariables); + sprite.setPosition( + this.stage.center().subtract( + sprite.extent().divideBy(2) + ) + ); + this.stage.add(sprite); + this.sprites.add(sprite); + this.currentSprite = sprite; + return sprite; +}; + +// Scene - capturing global state locally: + +Scene.prototype.captureGlobalSettings = function () { + this.hiddenPrimitives = StageMorph.prototype.hiddenPrimitives; + this.codeMappings = StageMorph.prototype.codeMappings; + this.codeHeaders = StageMorph.prototype.codeHeaders; + this.enableCodeMapping = StageMorph.prototype.enableCodeMapping; + this.enableInheritance = StageMorph.prototype.enableInheritance; + this.enableSublistIDs = StageMorph.prototype.enableSublistIDs; + this.enablePenLogging = StageMorph.prototype.enablePenLogging; + this.useFlatLineEnds = SpriteMorph.prototype.useFlatLineEnds; + this.enableLiveCoding = Process.prototype.enableLiveCoding; + this.enableHyperOps = Process.prototype.enableHyperOps; + this.customCategories = SpriteMorph.prototype.customCategories; + this.disableClickToRun = ThreadManager.prototype.disableClickToRun; + this.disableDraggingData = SpriteMorph.prototype.disableDraggingData; + this.penColorModel = SpriteMorph.prototype.penColorModel; +}; + +Scene.prototype.applyGlobalSettings = function () { + Costume.prototype.maxDimensions = this.stage.dimensions; + StageMorph.prototype.hiddenPrimitives = this.hiddenPrimitives; + StageMorph.prototype.codeMappings = this.codeMappings; + StageMorph.prototype.codeHeaders = this.codeHeaders; + StageMorph.prototype.enableCodeMapping = this.enableCodeMapping; + StageMorph.prototype.enableInheritance = this.enableInheritance; + StageMorph.prototype.enableSublistIDs = this.enableSublistIDs; + StageMorph.prototype.enablePenLogging = this.enablePenLogging; + SpriteMorph.prototype.useFlatLineEnds = this.useFlatLineEnds; + Process.prototype.enableLiveCoding = this.enableLiveCoding; + Process.prototype.enableHyperOps = this.enableHyperOps; + SpriteMorph.prototype.customCategories = this.customCategories; + ThreadManager.prototype.disableClickToRun = this.disableClickToRun; + SpriteMorph.prototype.disableDraggingData = this.disableDraggingData; + SpriteMorph.prototype.penColorModel = this.penColorModel; +}; + +// Scene ops: + +Scene.prototype.updateTrash = function () { + this.trash = this.trash.filter(sprite => sprite.isCorpse); +}; + +Scene.prototype.stop = function (forGood) { + var ide; + if (this.stage.enableCustomHatBlocks || forGood) { + this.stage.threads.pauseCustomHatBlocks = forGood ? true + : !this.stage.threads.pauseCustomHatBlocks; + } else { + this.stage.threads.pauseCustomHatBlocks = false; + } + this.stage.stopAllActiveSounds(); + this.stage.threads.resumeAll(this.stage); + this.stage.keysPressed = {}; + this.stage.runStopScripts(); + this.stage.threads.stopAll(); + if (this.stage.projectionSource) { + this.stage.stopProjection(); + } + this.stage.stopTalking(); + this.stage.children.forEach(morph => { + if (morph.stopTalking) { + morph.stopTalking(); + } + }); + this.stage.removeAllClones(); + ide = this.stage.parentThatIsA(IDE_Morph); + if (ide) { + ide.controlBar.pauseButton.refresh(); + ide.controlBar.stopButton.refresh(); + } +}; diff --git a/elements/pl-snap/Snap/src/sha512.js b/elements/pl-snap/Snap/src/sha512.js new file mode 100644 index 00000000..f9cf3132 --- /dev/null +++ b/elements/pl-snap/Snap/src/sha512.js @@ -0,0 +1,347 @@ +/* + + sha512.js + + encryption for SNAP! + This file is derived from crypto-js. + + © 2009–2012 by Jeff Mott. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer. + Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation or other materials provided with the distribution. + Neither the name CryptoJS nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS," AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +var hex_sha512 = (function (hex_sha512) { + + var hexcase = 0; + + function hex_sha512(s) + { + return CryptoJS.SHA512(str2rstr_utf8(s)).toString(CryptoJS.enc.Hex); + } + + function rstr_sha512(s) + { + return binb2rstr(binb_sha512(rstr2binb(s), s.length * 8)); + } + + var CryptoJS=CryptoJS||function(a,g){var m={},e=m.lib={},q=e.Base=function(){function a(){}return{extend:function(b){a.prototype=this;var d=new a;b&&d.mixIn(b);d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var k in a)a.hasOwnProperty(k)&&(this[k]=a[k]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.$super.extend(this)}}}(),r=e.WordArray=q.extend({init:function(a,b){a= + this.words=a||[];this.sigBytes=b!=g?b:4*a.length},toString:function(a){return(a||n).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes,a=a.sigBytes;this.clamp();if(c%4)for(var i=0;i>>2]|=(d[i>>>2]>>>24-8*(i%4)&255)<<24-8*((c+i)%4);else if(65535>>2]=d[i>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var k=this.words,b=this.sigBytes;k[b>>>2]&=4294967295<<32-8*(b%4);k.length=a.ceil(b/4)},clone:function(){var a= + q.clone.call(this);a.words=this.words.slice(0);return a},random:function(k){for(var b=[],d=0;d>>2]>>>24-8*(c%4)&255;d.push((i>>>4).toString(16));d.push((i&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>3]|=parseInt(a.substr(c,2),16)<<24-4*(c%8);return r.create(d,b/2)}},l=y.Latin1={stringify:function(a){for(var b= + a.words,a=a.sigBytes,d=[],c=0;c>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return r.create(d,b)}},da=y.Utf8={stringify:function(a){try{return decodeURIComponent(escape(l.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return l.parse(unescape(encodeURIComponent(a)))}},h=e.BufferedBlockAlgorithm=q.extend({reset:function(){this._data= + r.create();this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=da.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(k){var b=this._data,d=b.words,c=b.sigBytes,i=this.blockSize,l=c/(4*i),l=k?a.ceil(l):a.max((l|0)-this._minBufferSize,0),k=l*i,c=a.min(4*k,c);if(k){for(var h=0;hl;l++)n[l]=a()})();e=e.SHA512=m.extend({_doReset:function(){this._hash=r.create([a(1779033703,4089235720),a(3144134277,2227873595),a(1013904242,4271175723),a(2773480762,1595750129),a(1359893119,2917565137),a(2600822924,725511199),a(528734635,4215389547),a(1541459225,327033209)])},_doProcessBlock:function(a,e){for(var h=this._hash.words,g=h[0],k=h[1],b=h[2],d=h[3],c=h[4],i=h[5],m= + h[6],h=h[7],q=g.high,r=g.low,W=k.high,K=k.low,X=b.high,L=b.low,Y=d.high,M=d.low,Z=c.high,N=c.low,$=i.high,O=i.low,aa=m.high,P=m.low,ba=h.high,Q=h.low,t=q,o=r,E=W,C=K,F=X,D=L,T=Y,G=M,u=Z,p=N,R=$,H=O,S=aa,I=P,U=ba,J=Q,v=0;80>v;v++){var z=n[v];if(16>v)var s=z.high=a[e+2*v]|0,f=z.low=a[e+2*v+1]|0;else{var s=n[v-15],f=s.high,w=s.low,s=(w<<31|f>>>1)^(w<<24|f>>>8)^f>>>7,w=(f<<31|w>>>1)^(f<<24|w>>>8)^(f<<25|w>>>7),B=n[v-2],f=B.high,j=B.low,B=(j<<13|f>>>19)^(f<<3|j>>>29)^f>>>6,j=(f<<13|j>>>19)^(j<<3|f>>>29)^ + (f<<26|j>>>6),f=n[v-7],V=f.high,A=n[v-16],x=A.high,A=A.low,f=w+f.low,s=s+V+(f>>>0>>0?1:0),f=f+j,s=s+B+(f>>>0>>0?1:0),f=f+A,s=s+x+(f>>>0>>0?1:0);z.high=s;z.low=f}var V=u&R^~u&S,A=p&H^~p&I,z=t&E^t&F^E&F,fa=o&C^o&D^C&D,w=(o<<4|t>>>28)^(t<<30|o>>>2)^(t<<25|o>>>7),B=(t<<4|o>>>28)^(o<<30|t>>>2)^(o<<25|t>>>7),j=y[v],ga=j.high,ca=j.low,j=J+((u<<18|p>>>14)^(u<<14|p>>>18)^(p<<23|u>>>9)),x=U+((p<<18|u>>>14)^(p<<14|u>>>18)^(u<<23|p>>>9))+(j>>>0>>0?1:0),j=j+A,x=x+V+(j>>>0>>0?1:0),j=j+ca,x=x+ga+ + (j>>>0>>0?1:0),j=j+f,x=x+s+(j>>>0>>0?1:0),f=B+fa,z=w+z+(f>>>0>>0?1:0),U=S,J=I,S=R,I=H,R=u,H=p,p=G+j|0,u=T+x+(p>>>0>>0?1:0)|0,T=F,G=D,F=E,D=C,E=t,C=o,o=j+f|0,t=x+z+(o>>>0>>0?1:0)|0}r=g.low=r+o|0;g.high=q+t+(r>>>0>>0?1:0)|0;K=k.low=K+C|0;k.high=W+E+(K>>>0>>0?1:0)|0;L=b.low=L+D|0;b.high=X+F+(L>>>0>>0?1:0)|0;M=d.low=M+G|0;d.high=Y+T+(M>>>0>>0?1:0)|0;N=c.low=N+p|0;c.high=Z+u+(N>>>0

>>0?1:0)|0;O=i.low=O+H|0;i.high=$+R+(O>>>0>>0?1:0)|0;P=m.low=P+I|0;m.high=aa+S+(P>>>0>> + 0?1:0)|0;Q=h.low=Q+J|0;h.high=ba+U+(Q>>>0>>0?1:0)|0},_doFinalize:function(){var a=this._data,e=a.words,h=8*this._nDataBytes,g=8*a.sigBytes;e[g>>>5]|=128<<24-g%32;e[(g+128>>>10<<5)+31]=h;a.sigBytes=4*e.length;this._process();this._hash=this._hash.toX32()},blockSize:32});g.SHA512=m._createHelper(e);g.HmacSHA512=m._createHmacHelper(e)})(); + + function rstr2hex(input) + { + try { hexcase } catch(e) { hexcase=0; } + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var output = ""; + var x; + for(var i = 0; i < input.length; i++) + { + x = input.charCodeAt(i); + output += hex_tab.charAt((x >>> 4) & 0x0F) + + hex_tab.charAt( x & 0x0F); + } + return output; + } + + function str2rstr_utf8(input) + { + var output = ""; + var i = -1; + var x, y; + + while(++i < input.length) + { + x = input.charCodeAt(i); + y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; + if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) + { + x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); + i++; + } + + if(x <= 0x7F) + output += String.fromCharCode(x); + else if(x <= 0x7FF) + output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), + 0x80 | ( x & 0x3F)); + else if(x <= 0xFFFF) + output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), + 0x80 | ((x >>> 6 ) & 0x3F), + 0x80 | ( x & 0x3F)); + else if(x <= 0x1FFFFF) + output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), + 0x80 | ((x >>> 12) & 0x3F), + 0x80 | ((x >>> 6 ) & 0x3F), + 0x80 | ( x & 0x3F)); + } + return output; + } + + function rstr2binb(input) + { + var output = Array(input.length >> 2); + for(var i = 0; i < output.length; i++) + output[i] = 0; + for(var i = 0; i < input.length * 8; i += 8) + output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32); + return output; + } + + function binb2rstr(input) + { + var output = ""; + for(var i = 0; i < input.length * 32; i += 8) + output += String.fromCharCode((input[i>>5] >>> (24 - i % 32)) & 0xFF); + return output; + } + + var sha512_k; + function binb_sha512(x, len) + { + if(sha512_k == undefined) + { + sha512_k = new Array( + new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd), + new int64(-1245643825, -330482897), new int64(-373957723, -2121671748), + new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031), + new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736), + new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe), + new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302), + new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1), + new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428), + new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3), + new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65), + new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483), + new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459), + new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210), + new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340), + new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395), + new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70), + new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926), + new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473), + new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8), + new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b), + new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023), + new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30), + new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910), + new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8), + new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53), + new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016), + new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893), + new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397), + new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60), + new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec), + new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047), + new int64(-1090935817, -1295615723), new int64(-965641998, -479046869), + new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207), + new int64(-354779690, -840897762), new int64(-176337025, -294727304), + new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026), + new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b), + new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493), + new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620), + new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430), + new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)); + } + + var H = new Array( + new int64(0x6a09e667, -205731576), + new int64(-1150833019, -2067093701), + new int64(0x3c6ef372, -23791573), + new int64(-1521486534, 0x5f1d36f1), + new int64(0x510e527f, -1377402159), + new int64(-1694144372, 0x2b3e6c1f), + new int64(0x1f83d9ab, -79577749), + new int64(0x5be0cd19, 0x137e2179)); + + var T1 = new int64(0, 0), + T2 = new int64(0, 0), + a = new int64(0,0), + b = new int64(0,0), + c = new int64(0,0), + d = new int64(0,0), + e = new int64(0,0), + f = new int64(0,0), + g = new int64(0,0), + h = new int64(0,0), + + s0 = new int64(0, 0), + s1 = new int64(0, 0), + Ch = new int64(0, 0), + Maj = new int64(0, 0), + r1 = new int64(0, 0), + r2 = new int64(0, 0), + r3 = new int64(0, 0); + var j, i; + var W = new Array(80); + for(i=0; i<80; i++) + W[i] = new int64(0, 0); + + x[len >> 5] |= 0x80 << (24 - (len & 0x1f)); + x[((len + 128 >> 10)<< 5) + 31] = len; + + for(i = 0; i>> shift) | (x.h << (32-shift)); + dst.h = (x.h >>> shift) | (x.l << (32-shift)); + } + + function int64revrrot(dst, x, shift) + { + dst.l = (x.h >>> shift) | (x.l << (32-shift)); + dst.h = (x.l >>> shift) | (x.h << (32-shift)); + } + + function int64shr(dst, x, shift) + { + dst.l = (x.l >>> shift) | (x.h << (32-shift)); + dst.h = (x.h >>> shift); + } + + function int64add(dst, x, y) + { + var w0 = (x.l & 0xffff) + (y.l & 0xffff); + var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16); + var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16); + var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16); + dst.l = (w0 & 0xffff) | (w1 << 16); + dst.h = (w2 & 0xffff) | (w3 << 16); + } + + function int64add4(dst, a, b, c, d) + { + var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff); + var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16); + var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16); + var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16); + dst.l = (w0 & 0xffff) | (w1 << 16); + dst.h = (w2 & 0xffff) | (w3 << 16); + } + + function int64add5(dst, a, b, c, d, e) + { + var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff); + var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16); + var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16); + var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16); + dst.l = (w0 & 0xffff) | (w1 << 16); + dst.h = (w2 & 0xffff) | (w3 << 16); + } + + return hex_sha512; + +})({}); diff --git a/elements/pl-snap/Snap/src/sketch.js b/elements/pl-snap/Snap/src/sketch.js new file mode 100644 index 00000000..c9bca85d --- /dev/null +++ b/elements/pl-snap/Snap/src/sketch.js @@ -0,0 +1,2142 @@ +/* + sketch.js + + a vector paint editor for Snap! + inspired by the Snap bitmap paint editor and the Scratch vector editor. + + written by Carles Paredes and Bernat Romagosa + Copyright (C) 2017 by Carles Paredes and Bernat Romagosa + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + prerequisites: + -------------- + needs paint.js, blocks.js, gui.js, threads.js, objects.js and morphic.js + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + VectorShape + VectorRectangle + VectorLine + VectorEllipse + VectorPolygon + VectorSelection + VectorPaintEditorMorph + VectorPaintCanvasMorph + + credits + ------- + Carles Paredes wrote the first working prototype in 2015 + Bernat Romagosa rewrote most of the code in 2017 + + revision history + ----------------- + 2018, June 5 (Jens): + - fixed initial rotation center for an existing costume + - fixed initial rendering, so costumes can be re-opened after saving + 2018, June 20 (Jens): + - select primary color with right-click (in addition to shift-click) + 2020, April 15 (Jens): + - migrated to new Morphic2 architecture + 2021, March 17 (Jens): + - moved stage dimension handling to scenes +*/ + +/*global Point, Object, Rectangle, AlignmentMorph, Morph, XML_Element, localize, +PaintColorPickerMorph, Color, SliderMorph, InputFieldMorph, ToggleMorph, isNil, +TextMorph, Image, newCanvas, PaintEditorMorph, Costume, nop, PaintCanvasMorph, +StringMorph, detect, modules*/ + +/*jshint esversion: 6*/ + +modules.sketch = '2023-May-24'; + +// Declarations + +var VectorShape; +var VectorRectangle; +var VectorLine; +var VectorEllipse; +var VectorPolygon; +var VectorSelection; +var VectorPaintEditorMorph; +var VectorPaintCanvasMorph; + +// VectorShape + +VectorShape.prototype = {}; +VectorShape.prototype.constructor = VectorShape; +VectorShape.uber = Object.prototype; + +function VectorShape (borderWidth, borderColor, fillColor) { + this.init(borderWidth, borderColor, fillColor); +} + +VectorShape.prototype.init = function (borderWidth, borderColor, fillColor) { + this.borderWidth = (borderColor && borderColor.a) ? borderWidth : 0; + this.borderColor = borderColor || new Color(0,0,0,0); + this.fillColor = fillColor || new Color(0,0,0,0); + this.image = newCanvas(); + this.isPolygon = false; + this.isSelection = false; + this.isCrosshair = false; + this.origin = new Point(); + this.destination = new Point(); +}; + +VectorShape.prototype.toString = function () { + return 'a ' + + (this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]); +}; + +VectorShape.prototype.asSVG = function (tagName) { + var svg = new XML_Element(tagName); + + if (this.borderColor && this.borderColor.a) { + // if border is not transparent + svg.attributes.stroke = this.borderColor.toRGBstring(); + svg.attributes['stroke-linejoin'] = 'miter'; + svg.attributes['stroke-width'] = this.borderWidth; + } else { + svg.attributes.stroke = 'none'; + } + + if (this.fillColor && this.fillColor.a) { + // if fill color is not transparent + svg.attributes.fill = this.fillColor.toRGBstring(); + } else { + svg.attributes.fill = 'none'; + } + + svg.attributes.prototype = this.constructor.name; + + return svg; +}; + +VectorShape.prototype.imageURL = function () { + var svg = new XML_Element('svg'), + bounds = this.bounds(); + + svg.attributes.xmlns = 'http://www.w3.org/2000/svg'; + svg.attributes.version = '1.1'; + svg.attributes.preserveAspectRatio = 'xMinYMin meet'; + svg.attributes.viewBox = + bounds.left() + ' ' + bounds.top() + ' ' + + (bounds.right() - bounds.left()) + ' ' + + (bounds.bottom() - bounds.top()); + svg.attributes.width = (bounds.right() - bounds.left()); + svg.attributes.height = (bounds.bottom() - bounds.top()); + + svg.children = [ this.asSVG() ]; + + return 'data:image/svg+xml;base64,' + svg; +}; + +VectorShape.prototype.copy = function (newShape) { + var shape = + newShape || + new VectorShape( + this.borderWidth, + this.borderColor, + this.fillColor + ); + shape.image.width = this.image.width; + shape.image.height = this.image.height; + shape.image.getContext('2d').drawImage(this.image,0,0); + return shape; +}; + +VectorShape.prototype.bounds = function() { + return new Rectangle( + Math.min(this.origin.x, this.destination.x) - (this.borderWidth / 2), + Math.min(this.origin.y, this.destination.y) - (this.borderWidth / 2), + Math.max(this.origin.x, this.destination.x) + (this.borderWidth / 2), + Math.max(this.origin.y, this.destination.y) + (this.borderWidth / 2) + ); +}; + +VectorShape.prototype.containsPoint = function (aPoint) { + return this.bounds().containsPoint(aPoint); +}; + +VectorShape.prototype.update = function (newPoint, constrain) { + this.destination = constrain ? this.constraintPoint(newPoint) : newPoint; +}; + +VectorShape.prototype.constraintPoint = function (aPoint) { + var newPoint = aPoint, + delta = newPoint.subtract(this.origin), + constraintPos = new Point( + Math.max( + Math.abs(delta.x), + Math.abs(delta.y)) * (delta.x / Math.abs(delta.x) + ), + Math.max( + Math.abs(delta.x), + Math.abs(delta.y)) * (delta.y / Math.abs(delta.y) + ) + ); + + newPoint = this.origin.add(constraintPos); + return newPoint; +}; + +VectorShape.prototype.setColor = function (color, isSecondary) { + if (isSecondary) { + this.borderColor = color; + } else { + this.fillColor = color; + } +}; + +VectorShape.prototype.setBorderWidth = function (width) { + if (this.borderColor && this.borderColor.a) { + this.borderWidth = width; + } +}; + +VectorShape.prototype.moveBy = function (delta) { + this.origin = this.origin.add(delta); + this.destination = this.destination.add(delta); +}; + +VectorShape.prototype.resizeBy = function (delta, origin) { + this.origin = this.origin.subtract(origin).multiplyBy(delta).add(origin); + this.destination = this.destination.subtract(origin).multiplyBy(delta).add( + origin + ); +}; + +// Generic drawOn method that stamps the shape SVG into its image canvas +// with position relative to aCanvasMorph's and asks it to redraw itself +VectorShape.prototype.drawOn = function (aCanvasMorph) { + var myself = this, + origin = this.bounds().origin.subtract(aCanvasMorph.position()), + img = new Image(); + + this.image = newCanvas(aCanvasMorph.extent()); + + img.onload = function () { + myself.image.getContext('2d').drawImage(img, origin.x, origin.y); + aCanvasMorph.redraw = true; + }; + + img.src = this.imageURL(); +}; + +// VectorRectangle + +VectorRectangle.prototype = new VectorShape(); +VectorRectangle.prototype.constructor = VectorRectangle; +VectorRectangle.uber = VectorShape.prototype; + +function VectorRectangle ( + borderWidth, + borderColor, + fillColor, + origin, + destination +) { + VectorRectangle.uber.init.call(this, borderWidth, borderColor, fillColor); + this.init(origin, destination); +} + +VectorRectangle.prototype.init = function (origin, destination) { + this.origin = origin; + this.destination = destination; +}; + +VectorRectangle.fromSVG = function (svg) { + var attributes = svg.attributes; + + return new VectorRectangle( + parseInt(attributes['stroke-width']), // borderWidth + attributes.stroke === 'none' ? null : + Color.fromString(attributes.stroke), // borderColor + attributes.fill === 'none' ? null : + Color.fromString(attributes.fill), // fillColor + new Point( // origin + parseInt(attributes.x), parseInt(attributes.y) + ), + new Point( // destination + parseInt(attributes.x) + parseInt(attributes.width), + parseInt(attributes.y) + parseInt(attributes.height) + ) + ); +}; + +VectorRectangle.prototype.copy = function () { + var newRectangle = new VectorRectangle( + this.borderWidth, + this.borderColor, + this.fillColor, + this.origin.copy(), + this.destination.copy() + ); + return VectorRectangle.uber.copy.call(this, newRectangle); +}; + +VectorRectangle.prototype.toString = function () { + return VectorRectangle.uber.toString.call(this) + this.bounds().toString(); +}; + +VectorRectangle.prototype.width = function () { + return Math.abs(this.origin.x - this.destination.x); +}; + +VectorRectangle.prototype.height = function () { + return Math.abs(this.origin.y - this.destination.y); +}; + +VectorRectangle.prototype.x = function () { + return Math.min(this.origin.x, this.destination.x); +}; + +VectorRectangle.prototype.y = function () { + return Math.min(this.origin.y, this.destination.y); +}; + +VectorRectangle.prototype.asSVG = function () { + var svg = VectorRectangle.uber.asSVG.call(this, 'rect'); + svg.attributes.width = this.width(); + svg.attributes.height = this.height(); + svg.attributes.x = this.x(); + svg.attributes.y = this.y(); + return svg; +}; + +VectorRectangle.prototype.drawOn = function (aCanvasMorph) { + var context, + canvasPosition = aCanvasMorph.position(); + + this.image = newCanvas(aCanvasMorph.extent()); + + context = this.image.getContext('2d'); + + context.beginPath(); + context.rect( + this.x() - canvasPosition.x, + this.y() - canvasPosition.y, + this.width(), + this.height() + ); + + if (this.fillColor.a > 0) { + context.fillStyle = this.fillColor.toRGBstring(); + context.fill(); + } + + if (this.borderColor.a > 0) { + context.lineWidth = this.borderWidth; + context.strokeStyle = this.borderColor.toRGBstring(); + context.stroke(); + } + + aCanvasMorph.redraw = true; +}; + +// VectorLine + +VectorLine.prototype = new VectorShape(); +VectorLine.prototype.constructor = VectorLine; +VectorLine.uber = VectorShape.prototype; + +function VectorLine (borderWidth, borderColor, origin, destination) { + VectorLine.uber.init.call(this, borderWidth, borderColor); + this.init(origin, destination); +} + +VectorLine.prototype.init = function(origin, destination) { + this.origin = origin; + this.destination = destination; +}; + +VectorLine.fromSVG = function (svg) { + var attributes = svg.attributes; + return new VectorLine( + parseInt(attributes['stroke-width']), // borderWidth + Color.fromString(attributes.stroke), // borderColor + new Point(parseInt(attributes.x1), parseInt(attributes.y1)), // origin + new Point(parseInt(attributes.x2), parseInt(attributes.y2)) // dest. + ); +}; + +VectorLine.prototype.copy = function () { + var newLine = new VectorLine( + this.borderWidth, + this.borderColor.copy(), + this.origin.copy(), + this.destination.copy() + ); + return VectorLine.uber.copy.call(this, newLine); +}; + +VectorLine.prototype.containsPoint = function (aPoint) { + var lineLength = this.origin.distanceTo(this.destination), + distancesSum = aPoint.distanceTo(this.origin) + + aPoint.distanceTo(this.destination); + + return Math.abs(lineLength - distancesSum) <= + Math.sqrt(this.borderWidth / 2) / 2; +}; + +VectorLine.prototype.constraintPoint = function (aPoint) { + var angle, + newPoint = aPoint; + + angle = newPoint.subtract(this.origin).abs().degrees(); + if (angle < 22.5) { + // horizontal line + newPoint.y = this.origin.y; + } else if (angle > 67.5) { + // vertical line + newPoint.x = this.origin.x; + } else { + // line at 45º + newPoint = VectorLine.uber.constraintPoint.call(this, aPoint); + } + + return newPoint; +}; + +VectorLine.prototype.setColor = function (color, isSecondary) { + VectorLine.uber.setColor.call(this, color, !isSecondary); +}; + +VectorLine.prototype.toString = function () { + return VectorLine.uber.toString.call(this) + this.bounds().toString(); +}; + +VectorLine.prototype.asSVG = function() { + var svg = VectorLine.uber.asSVG.call(this, 'line'); + svg.attributes.x1 = this.origin.x; + svg.attributes.y1 = this.origin.y; + svg.attributes.x2 = this.destination.x; + svg.attributes.y2 = this.destination.y; + return svg; +}; + +VectorLine.prototype.drawOn = function (aCanvasMorph) { + var context, + origin = this.origin.subtract(aCanvasMorph.position()), + destination = this.destination.subtract(aCanvasMorph.position()); + + this.image = newCanvas(aCanvasMorph.extent()); + + context = this.image.getContext('2d'); + + context.beginPath(); + + if (this.borderColor.a > 0) { + context.lineWidth = this.borderWidth; + context.strokeStyle = this.borderColor.toRGBstring(); + context.moveTo(origin.x, origin.y); + context.lineTo(destination.x, destination.y); + context.stroke(); + } + + aCanvasMorph.redraw = true; +}; + +// VectorEllipse + +VectorEllipse.prototype = new VectorShape(); +VectorEllipse.prototype.constructor = VectorEllipse; +VectorEllipse.uber = VectorShape.prototype; + +function VectorEllipse ( + borderWidth, + borderColor, + fillColor, + origin, + destination) +{ + VectorEllipse.uber.init.call(this, borderWidth, borderColor, fillColor); + this.init(origin, destination); +} + +VectorEllipse.prototype.init = function (origin, destination) { + this.origin = origin; + this.destination = destination; +}; + +VectorEllipse.fromSVG = function (svg) { + var attributes = svg.attributes; + + return new VectorEllipse( + parseInt(attributes['stroke-width']), // borderWidth + attributes.stroke === 'none' ? null : + Color.fromString(attributes.stroke), // borderColor + attributes.fill === 'none' ? null : + Color.fromString(attributes.fill), // fillColor + new Point(parseInt(attributes.cx), parseInt(attributes.cy)), // origin + new Point( + parseInt(attributes.cx) + parseInt(attributes.rx), + parseInt(attributes.cy) + parseInt(attributes.ry)) // destination + ); +}; + +VectorEllipse.prototype.copy = function () { + var newEllipse = new VectorEllipse( + this.borderWidth, + this.borderColor, + this.fillColor, + this.origin.copy(), + this.destination.copy() + ); + return VectorEllipse.uber.copy.call(this, newEllipse); +}; + +VectorEllipse.prototype.hRadius = function () { + return Math.abs(this.destination.x - this.origin.x); +}; + +VectorEllipse.prototype.vRadius = function () { + return Math.abs(this.destination.y - this.origin.y); +}; + +VectorEllipse.prototype.toString = function () { + return VectorEllipse.uber.toString.call(this) + + ' center: ' + this.origin.toString() + + ' radii: ' + this.hRadius().toString() + ',' + + this.vRadius().toString(); +}; + +VectorEllipse.prototype.bounds = function () { + var hRadius = this.hRadius(), + vRadius = this.vRadius(); + + return new Rectangle( + this.origin.x - hRadius - (this.borderWidth / 2), + this.origin.y - vRadius - (this.borderWidth / 2), + this.origin.x + hRadius + (this.borderWidth / 2), + this.origin.y + vRadius + (this.borderWidth / 2) + ); +}; + +VectorEllipse.prototype.containsPoint = function (aPoint) { + return ( + Math.pow(aPoint.x - this.origin.x, 2) / + Math.pow(this.hRadius() + this.borderWidth / 2, 2) + + + Math.pow(aPoint.y - this.origin.y, 2) / + Math.pow(this.vRadius() + this.borderWidth / 2, 2) + ) < 1; +}; + +VectorEllipse.prototype.asSVG = function () { + var svg = VectorEllipse.uber.asSVG.call(this, 'ellipse'); + svg.attributes.cx = this.origin.x; + svg.attributes.cy = this.origin.y; + svg.attributes.rx = this.hRadius(); + svg.attributes.ry = this.vRadius(); + return svg; +}; + +VectorEllipse.prototype.drawOn = function (aCanvasMorph) { + var context, + canvasPosition = aCanvasMorph.position(); + + this.image = newCanvas(aCanvasMorph.extent()); + context = this.image.getContext('2d'); + context.beginPath(); + context.ellipse( + this.origin.x - canvasPosition.x, + this.origin.y - canvasPosition.y, + this.hRadius(), + this.vRadius(), + 0, + 0, + 2 * Math.PI, + true); + + if (this.fillColor && this.fillColor.a > 0) { + context.fillStyle = this.fillColor.toRGBstring(); + context.fill(); + } + + if (this.borderColor.a > 0) { + context.lineWidth = this.borderWidth; + context.strokeStyle = this.borderColor.toRGBstring(); + context.stroke(); + } + + aCanvasMorph.redraw = true; +}; + + +// VectorPolygon + +VectorPolygon.prototype = new VectorShape(); +VectorPolygon.prototype.constructor = VectorPolygon; +VectorPolygon.uber = VectorShape.prototype; + +function VectorPolygon ( + borderWidth, + borderColor, + fillColor, + points, + isClosed, + isFreeHand +) { + VectorPolygon.uber.init.call(this, borderWidth, borderColor, fillColor); + this.init(points, isClosed, isFreeHand); +} + +VectorPolygon.prototype.init = function (points, isClosed, isFreeHand) { + this.points = points || [ ]; + this.isClosed = isClosed; + this.isFreeHand = isFreeHand; + this.isPolygon = true; +}; + +VectorPolygon.fromSVG = function (svg) { + var attributes = svg.attributes, + points = attributes.d.slice(1).split(/L */).map( + function (pointString) { + var pointArray = pointString.split(' '); + return new Point( + parseInt(pointArray[0]), + parseInt(pointArray[1])); + } + ); + + return new VectorPolygon( + parseInt(attributes['stroke-width']), // borderWidth + attributes.stroke === 'none' ? null : + Color.fromString(attributes.stroke), // borderColor + attributes.fill === 'none' ? null : + Color.fromString(attributes.fill), // fillColor + points, // points + points[0].eq(points[points.length - 1]), // isClosed + false // isFreeHand, does only matter when drawing it + ); +}; + +VectorPolygon.prototype.copy = function () { + var newPolygon = new VectorPolygon( + this.borderWidth, + this.borderColor, + this.fillColor, + this.points.map(function (point) { return point.copy(); }), + this.isClosed, + this.isFreeHand + ); + return VectorPolygon.uber.copy.call(this, newPolygon); +}; + +VectorPolygon.prototype.toString = function () { + return VectorPolygon.uber.toString.call(this) + this.points; +}; + +VectorPolygon.prototype.bounds = function () { + var left = this.points[0].x, + top = this.points[0].y, + right = this.points[this.points.length - 1].x, + bottom = this.points[this.points.length - 1].y; + + this.points.forEach(function (point) { + left = Math.min(left, point.x); + top = Math.min(top, point.y); + right = Math.max(right, point.x); + bottom = Math.max(bottom, point.y); + }); + + return new Rectangle( + left - (this.borderWidth / 2), + top - (this.borderWidth / 2), + right + (this.borderWidth / 2), + bottom + (this.borderWidth / 2) + ); +}; + +VectorPolygon.prototype.containsPoint = function (aPoint) { + var myself = this, + pointCount = this.points.length, + inside = false, + i, j; + + for (i = 1; i < pointCount; i += 1) { + if (pointIsBetween(this.points[i - 1], this.points[i])) { + return true; + } + } + + if (this.isClosed) { + for (i = 0, j = pointCount - 1; i < pointCount; i += 1) { + if ( + (this.points[i].y > aPoint.y) !== + (this.points[j].y > aPoint.y) && + aPoint.x < + (this.points[j].x - this.points[i].x) * + (aPoint.y - this.points[i].y) / + (this.points[j].y - this.points[i].y) + this.points[i].x + ) { + inside = !inside; + } + j = i; + } + return inside; + } + + function pointIsBetween (a, b) { + return Math.abs(a.distanceTo(b) - + (aPoint.distanceTo(a) + aPoint.distanceTo(b))) <= + Math.sqrt(myself.borderWidth / 2) / 2; + } + + return false; +}; + +VectorPolygon.prototype.update = function (newPoint, constrain) { + if (this.isFreeHand || this.points.length === 1) { + this.points.push(newPoint); + } else if (!this.isFreeHand) { + if (constrain) { + // we reuse origin to store the previous point and perform the + // constraint calculations as if we were drawing a single line + this.origin = this.points[this.points.length - 2]; + newPoint = VectorLine.prototype.constraintPoint.call( + this, + newPoint + ); + } + this.points[this.points.length - 1] = newPoint; + } +}; + +VectorPolygon.prototype.setColor = function (color, isSecondary) { + VectorPolygon.uber.setColor.call( + this, + color, + !this.isClosed || isSecondary + ); +}; + +VectorPolygon.prototype.moveBy = function (delta) { + this.points.forEach(function (eachPoint) { + eachPoint.x += delta.x; + eachPoint.y += delta.y; + }); +}; + +VectorPolygon.prototype.resizeBy = function (delta, origin) { + this.points = this.points.map(function (point) { + return point.subtract(origin).multiplyBy(delta).add(origin); + }); +}; + +VectorPolygon.prototype.close = function () { + if (this.isClosed) { + this.points.push(this.points[0].copy()); + } +}; + +VectorPolygon.prototype.asSVG = function () { + var svg = VectorPolygon.uber.asSVG.call(this, 'path'); + + svg.attributes['stroke-linejoin'] = 'round'; + svg.attributes['stroke-linecap'] = 'round'; + + // M stands for MoveTo and defines the starting point + svg.attributes.d = 'M' + this.points[0].x + ' ' + this.points[0].y; + + // L stands for LineTo and defines the rest of the points + this.points.slice(1).forEach(function (point) { + svg.attributes.d += ' L ' + point.x + ' ' + point.y; + }); + + return svg; +}; + +VectorPolygon.prototype.drawOn = function (aCanvasMorph) { + var context, + points = + this.points.map( + function (eachPoint) { + return eachPoint.subtract(aCanvasMorph.position()); + } + ); + + this.image = newCanvas(aCanvasMorph.extent()); + context = this.image.getContext('2d'); + + context.lineCap = 'round'; + context.lineJoin = 'round'; + + context.beginPath(); + context.moveTo(points[0].x, points[0].y); + + points.slice(1).forEach(function (point) { + context.lineTo(point.x, point.y); + }); + + if (this.fillColor && this.fillColor.a > 0) { + context.fillStyle = this.fillColor.toRGBstring(); + context.fill(); + } + + if (this.borderColor.a > 0) { + context.lineWidth = this.borderWidth; + context.strokeStyle = this.borderColor.toRGBstring(); + context.stroke(); + } else if (this.points.length === 2) { + // This is a polygon in construction, we should at least draw + // a thin line between its first two points + context.lineWidth = 1; + context.strokeStyle = this.fillColor.toRGBstring(); + context.stroke(); + } + + aCanvasMorph.redraw = true; +}; + + +// VectorSelection + +VectorSelection.prototype = new VectorRectangle(); +VectorSelection.prototype.constructor = VectorSelection; +VectorSelection.uber = VectorRectangle.prototype; + +function VectorSelection (origin, destination) { + VectorRectangle.uber.init.call( + this, + 1, // borderWidth + new Color(0, 0, 0, 255), // borderColor + null // fillColor + ); + this.init(origin, destination); +} + +VectorSelection.prototype.init = function (origin, destination) { + VectorSelection.uber.init.call(this, origin, destination); + this.isSelection = true; + this.threshold = 5; +}; + +VectorSelection.prototype.corners = function () { + var bounds = this.bounds(); + return [ + bounds.topLeft(), + bounds.topRight(), + bounds.bottomLeft(), + bounds.bottomRight() + ]; +}; + +VectorSelection.prototype.cornerAt = function (aPoint) { + var threshold = this.threshold; + + return this.corners().find(function(corner) { + return aPoint.distanceTo(corner) <= threshold; + }); +}; + +VectorSelection.prototype.cornerOppositeTo = function (aPoint) { + return this.corners().reduce(function(a, b) { + return (aPoint.distanceTo(a) > aPoint.distanceTo(b)) ? a : b; + }); +}; + +VectorSelection.prototype.drawOn = function (aCanvasMorph) { + var context, + bounds = this.bounds(), + canvasPosition = aCanvasMorph.position(), + origin = bounds.origin.subtract(canvasPosition), + circleRadius = this.threshold; + + this.image = newCanvas(aCanvasMorph.extent()); + + context = this.image.getContext('2d'); + + context.rect(origin.x, origin.y, this.width(), this.height()); + context.setLineDash([5]); + context.stroke(); + + context.setLineDash([]); + + function drawCircle (x, y) { + context.beginPath(); + context.arc( + x - canvasPosition.x, + y - canvasPosition.y, + circleRadius, + 0, + 2 * Math.PI + ); + context.stroke(); + } + + drawCircle(bounds.left(), bounds.top()); + drawCircle(bounds.left(), bounds.bottom()); + drawCircle(bounds.right(), bounds.top()); + drawCircle(bounds.right(), bounds.bottom()); + + aCanvasMorph.redraw = true; +}; + +// Crosshair +// For convenience, we'll inherit from VectorShape + +Crosshair.prototype = VectorShape; +Crosshair.prototype.constructor = Crosshair; +Crosshair.uber = VectorShape.prototype; + +function Crosshair (center, paper) { + this.init(center, paper); +} + +Crosshair.prototype.init = function (center, paper) { + this.center = center; + this.paper = paper; + this.image = newCanvas(); + this.isCrosshair = true; +}; + +Crosshair.prototype.update = function (newPosition) { + this.center = newPosition.subtract(this.paper.position()); +}; + +Crosshair.prototype.moveBy = function (delta) { + this.center = this.center.add(delta); +}; + +Crosshair.prototype.drawOn = function (aCanvasMorph) { + this.image = newCanvas(aCanvasMorph.extent()); + aCanvasMorph.rotationCenter = this.center.copy(); + aCanvasMorph.drawcrosshair(this.image.getContext('2d')); + aCanvasMorph.redraw = true; +}; + +/////////// VectorPaintEditorMorph ////////////////////////// + +VectorPaintEditorMorph.prototype = new PaintEditorMorph(); +VectorPaintEditorMorph.prototype.constructor = VectorPaintEditorMorph; +VectorPaintEditorMorph.uber = PaintEditorMorph.prototype; + +function VectorPaintEditorMorph() { + this.init(); +} + +VectorPaintEditorMorph.prototype.init = function () { + // additional properties: + this.paper = null; // paint canvas + this.shapes = []; + this.selection = []; // currently selected objects + this.selecting = false; + this.originalSelection = null; // see VectorPaintEditorMorph >> dragSelection + this.moving = false; + this.resizing = false; + this.lastDragPosition = null; + this.history = []; // shapes history, for undo purposes + this.clipboard = []; // copied objects ready to be pasted + this.currentShape = null; // object being currently edited + + VectorPaintEditorMorph.uber.init.call(this); + + this.labelString = 'Vector Paint Editor'; + this.createLabel(); + this.fixLayout(); +}; + +VectorPaintEditorMorph.prototype.buildEdits = function () { + var myself = this; + + this.edits.add( + this.pushButton( + 'undo', + function () { + myself.undo(); + } + ) + ); + + this.edits.add( + this.pushButton( + 'clear', + function () { + myself.paper.clearCanvas(); + } + ) + ); + + this.edits.add( + this.pushButton( + 'Bitmap', + function () { + if (myself.shapes.length > 0) { + myself.ide.confirm( + 'This will convert your vector objects into ' + + 'bitmaps, and you will not be able to convert ' + + 'them back into vector drawings. ' + + 'Are you sure you want to continue?', + 'Convert to bitmap?', + () => { + setTimeout(() => {myself.convertToBitmap(); }); + } + ); + } else { + myself.convertToBitmap(); + } + } + ) + ); + + this.edits.fixLayout(); +}; + +VectorPaintEditorMorph.prototype.convertToBitmap = function () { + var canvas = newCanvas(this.ide.stage.dimensions), + myself = this; + + this.object = new Costume(); + + this.shapes.forEach(function(each) { + canvas.getContext('2d').drawImage(each.image, 0, 0); + }); + + this.object.rotationCenter = this.paper.rotationCenter.copy(); + this.object.contents = canvas; + this.object.edit( + this.world(), + this.ide, + false, + null, + () => { + myself.ide.currentSprite.shadowAttribute('costumes'); + myself.ide.currentSprite.addCostume(myself.object); + myself.ide.spriteEditor.updateList(); + if (myself.ide) { + myself.ide.currentSprite.wearCostume(myself.object); + } + } + ); +}; + +VectorPaintEditorMorph.prototype.buildScaleBox = function () { + var myself = this; + ['Top', 'Bottom', 'Up', 'Down'].forEach(function (label) { + myself.scaleBox.add( + myself.pushButton( + label, + function () { + myself.changeSelectionLayer(label.toLowerCase()); + } + ) + ); + }); + + this.scaleBox.fixLayout(); +}; + +VectorPaintEditorMorph.prototype.openIn = function ( + world, + oldim, + oldrc, + callback, + anIDE, + shapes +) { + var myself = this, + isEmpty = isNil(shapes) || shapes.length === 0; + + VectorPaintEditorMorph.uber.openIn.call( + this, + world, + null, + oldrc, + callback, + anIDE + ); + this.ide = anIDE; + this.paper.drawNew(); + this.paper.changed(); + + // make sure shapes are initialized and can be rendered + shapes.forEach(function (shape) { + shape.drawOn(myself.paper); + }); + // copy the shapes for editing and re-render the copies + this.shapes = shapes.map(function (eachShape) { + return eachShape.copy(); + }); + this.shapes.forEach(function (shape) { + shape.drawOn(myself.paper); + }); + // init the rotation center, if any + if (oldrc && !isEmpty) { + this.paper.automaticCrosshairs = false; + this.paper.rotationCenter = this.getBounds(this.shapes).origin.subtract( + this.paper.bounds.origin + ).add(oldrc); + } else { + this.paper.automaticCrosshairs = true; + } + + this.updateHistory(); + + this.processKeyUp = function () { + myself.shift = false; + myself.ctrl = false; + myself.propertiesControls.constrain.refresh(); + }; + + this.processKeyDown = function (event) { + + var pos; + + myself.shift = myself.world().currentKey === 16; + myself.ctrl = event.ctrlKey; + + switch (myself.world().currentKey) { + /* Del and backspace keys */ + case 46: + case 8: + myself.sortSelection(); + myself.selection.slice().reverse().forEach(function (shape) { + myself.shapes.splice(myself.shapes.indexOf(shape), 1); + }); + myself.clearSelection(); + myself.updateHistory(); + break; + /* Enter key */ + case 13: + if (myself.currentShape && myself.currentShape.isPolygon) { + myself.currentShape.close(); + myself.currentShape.drawOn(myself.paper); + myself.shapes.push(myself.currentShape); + myself.currentShape = null; + myself.updateHistory(); + } + break; + /* Page Up key */ + case 33: + myself.changeSelectionLayer('up'); + break; + /* Page Down key */ + case 34: + myself.changeSelectionLayer('down'); + break; + /* End key */ + case 35: + myself.changeSelectionLayer('bottom'); + break; + + /* Home key */ + case 36: + myself.changeSelectionLayer('top'); + break; + case 90: + /* Ctrl + Z */ + if (myself.ctrl) { + myself.undo(); + } + break; + case 67: + /* Ctrl + C */ + if (myself.ctrl && myself.selection.length) { + myself.clipboard = + myself.selection.map(function (each) { + return each.copy(); + } + ); + } + break; + case 86: + /* Ctrl + V */ + pos = myself.world().hand.position(); + if (myself.ctrl && myself.paper.bounds.containsPoint(pos)) { + myself.paper.pasteAt(pos); + myself.updateHistory(); + } + break; + case 65: + /* Ctrl + A */ + if (myself.ctrl) { + myself.paper.currentTool = 'selection'; + myself.paper.toolChanged('selection'); + myself.refreshToolButtons(); + myself.paper.selectShapes(myself.shapes); + } + break; + case 27: + /* Escape key */ + myself.clearSelection(); + break; + case 37: + /* Left arrow */ + myself.moveSelectionBy(new Point(-1, 0)); + myself.updateHistory(); + break; + case 38: + /* Up arrow */ + myself.moveSelectionBy(new Point(0, -1)); + myself.updateHistory(); + break; + case 39: + /* Right arrow */ + myself.moveSelectionBy(new Point(1, 0)); + myself.updateHistory(); + break; + case 40: + /* Down arrow */ + myself.moveSelectionBy(new Point(0, 1)); + myself.updateHistory(); + break; + default: + nop(); + } + myself.propertiesControls.constrain.refresh(); + }; +}; + +VectorPaintEditorMorph.prototype.buildContents = function() { + var myself = this; + + VectorPaintEditorMorph.uber.buildContents.call(this); + + this.paper.destroy(); + this.paper = new VectorPaintCanvasMorph(myself.shift); + this.paper.setExtent(this.ide.stage.dimensions); + this.body.add(this.paper); + + this.refreshToolButtons(); + this.fixLayout(); +}; + +VectorPaintEditorMorph.prototype.buildToolbox = function () { + var tools = { + brush: + 'Paintbrush tool\n(free draw)', + rectangle: + 'Rectangle\n(shift: square)', + ellipse: + 'Ellipse\n(shift: circle)', + selection: + 'Selection tool', + crosshairs: + 'Set the rotation center', + line: + 'Line tool\n(shift: constrain to 45º)', + closedBrush: + 'Closed brush\n(free draw)', + polygon: + 'Polygon', + paintbucket: + 'Paint a shape\n(shift: edge color)', + pipette: + 'Pipette tool\n(pick a color from anywhere\nshift: fill color)' + }, + myself = this, + left = this.toolbox.left(), + top = this.toolbox.top(), + padding = 2, + inset = 5, + x = 0, + y = 0; + + Object.keys(tools).forEach(function (toolName) { + var button = myself.toolButton(toolName, tools[toolName]); + button.setPosition(new Point( + left + x, + top + y + )); + x += button.width() + padding; + if (toolName === 'crosshairs') { /* this tool marks the newline */ + x = 0; + y += button.height() + padding; + myself.paper.drawcrosshair(); + } + myself.toolbox[toolName] = button; + myself.toolbox.add(button); + }); + + this.toolbox.bounds = this.toolbox.fullBounds().expandBy(inset * 2); +}; + +// TODO :'( +VectorPaintEditorMorph.prototype.populatePropertiesMenu = function () { + var c = this.controls, + myself = this, + pc = this.propertiesControls, + alpen = new AlignmentMorph("row", this.padding), + alignColor = new AlignmentMorph("row", this.padding), + alignNames = new AlignmentMorph("row", this.padding), + brushControl = new AlignmentMorph("column", 3); + + brushControl.alignment = "left"; + + pc.primaryColorViewer = new Morph(); + pc.primaryColorViewer.color = new Color(0, 0, 0); + pc.primaryColorViewer.setExtent(new Point(85, 15)); // 40 = height primary & brush size + + pc.primaryColorViewer.render = function (ctx) { + myself.renderColorSelection(ctx, myself.paper.settings.primaryColor); + }; + + pc.secondaryColorViewer = new Morph(); + pc.secondaryColorViewer.color = new Color(0, 0, 0); + pc.secondaryColorViewer.setExtent(new Point(85, 15)); // 20 = height secondaryColor box + + pc.secondaryColorViewer.render = function (ctx) { + myself.renderColorSelection(ctx, myself.paper.settings.secondaryColor); + }; + + pc.colorpicker = new PaintColorPickerMorph( + new Point(180, 100), + function (color, isSecondary) { + myself.selectColor(color, !isSecondary); + } + ); + + // allow right-click on the color picker to select the fill color + pc.colorpicker.mouseDownRight = function (pos) { + if ((pos.subtract(this.position()).x > this.width() * 2 / 3) && + (pos.subtract(this.position()).y > this.height() - 10)) { + this.action("transparent", true); + } else { + this.action(this.getPixelColor(pos), true); + } + }; + + // also allow selecting the fill color via touch-hold + pc.colorpicker.mouseClickRight = pc.colorpicker.mouseDownRight; + + pc.colorpicker.action(new Color(0, 0, 0)); // secondary color + pc.colorpicker.action('transparent', true); + + pc.penSizeSlider = new SliderMorph(0, 20, 5, 5); + pc.penSizeSlider.orientation = "horizontal"; + pc.penSizeSlider.setHeight(15); + pc.penSizeSlider.setWidth(150); + pc.penSizeSlider.action = function (num) { + if (pc.penSizeField) { + pc.penSizeField.setContents(num); + } + myself.paper.settings.lineWidth = num; + myself.selection.forEach(function (shape) { + shape.setBorderWidth(num); + shape.drawOn(myself.paper); + myself.paper.updateSelection(); + }); + myself.updateHistory(); + }; + pc.penSizeField = new InputFieldMorph("3", true, null, false); + pc.penSizeField.contents().minWidth = 20; + pc.penSizeField.setWidth(25); + pc.penSizeField.accept = function (num) { + var val = parseFloat(pc.penSizeField.getValue()); + pc.penSizeSlider.value = val; + pc.penSizeSlider.updateValue(); + this.setContents(val); + myself.paper.settings.lineWidth = val; + this.world().keyboardFocus = myself; + myself.selection.forEach(function (shape) { + shape.setBorderWidth(num); + shape.drawOn(myself.paper); + myself.paper.updateSelection(); + }); + myself.updateHistory(); + }; + alpen.add(pc.penSizeSlider); + alpen.add(pc.penSizeField); + alpen.color = myself.color; + alpen.fixLayout(); + + pc.constrain = new ToggleMorph( + "checkbox", + this, + function () { myself.shift = !myself.shift; }, + "Constrain proportions of shapes?\n(you can also hold shift)", + function () { return myself.shift; } + ); + + pc.constrain.label.isBold = false; + alignColor.add(pc.secondaryColorViewer); + alignColor.add(pc.primaryColorViewer); + alignColor.fixLayout(); + + alignNames.add(new TextMorph(localize('Edge color\n(left click)'), + 10, null, null, null, + 'center', 85)); + alignNames.add(new TextMorph(localize('Fill color\n(right click)'), + 10, null, null, null, + 'center', 85)); + alignNames.fixLayout(); + c.add(pc.colorpicker); + c.add(alignNames); + c.add(alignColor); + brushControl.add( + new StringMorph(localize("Brush size") + ":", 10, null, true) + ); + brushControl.add(alpen); + brushControl.add(pc.constrain); + brushControl.fixLayout(); + c.add(brushControl); +}; + +VectorPaintEditorMorph.prototype.selectColor = function (color, secondary) { + var myself = this, + isSecondary = this.paper.isShiftPressed() ? false : secondary, + propertyName = (isSecondary ? 'secondary' : 'primary') + 'Color'; + + this.paper.settings[(propertyName)] = color; + + if (this.selection.length) { + this.selection.forEach(function (shape) { + shape.setColor(color, isSecondary); + shape.drawOn(myself.paper); + }); + this.updateHistory(); + } + + this.propertiesControls[propertyName + 'Viewer'].rerender(); +}; + +VectorPaintEditorMorph.prototype.renderColorSelection = function ( + ctx, + color = 'transparent' +) { + var i, j; + + if (color === 'transparent' || color.a === 0) { + for (i = 0; i < 180; i += 5) { + for (j = 0; j < 15; j += 5) { + ctx.fillStyle = + ((j + i) / 5) % 2 === 0 ? + 'rgba(0, 0, 0, 0.2)' + :'rgba(0, 0, 0, 0.5)'; + ctx.fillRect(i, j, 5, 5); + } + } + } else { + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, 180, 15); + } +}; + +VectorPaintEditorMorph.prototype.changeSelectionLayer = function (destination) { + // I move the selected shapes across the z axis + var myself = this; + + this.sortSelection(); + + switch (destination) { + case 'top': + this.selection.forEach(function (shape) { + myself.shapes.splice(myself.shapes.indexOf(shape), 1); + myself.shapes.push(shape); + }); + break; + case 'bottom': + this.selection.slice().reverse().forEach(function (shape) { + myself.shapes.splice(myself.shapes.indexOf(shape), 1); + myself.shapes.splice(0, 0, shape); + }); + break; + case 'up': + this.selection.forEach(function (shape) { + var index = myself.shapes.indexOf(shape); + myself.shapes.splice(index, 1); + myself.shapes.splice(index + myself.selection.length, 0, shape); + }); + break; + case 'down': + if (this.shapes[0] !== this.selection[0]) { + this.selection.forEach(function (shape) { + var index = myself.shapes.indexOf(shape); + myself.shapes.splice(index, 1); + myself.shapes.splice(index - 1, 0, shape); + }); + } + break; + } + + this.updateHistory(); + this.paper.redraw = true; +}; + +VectorPaintEditorMorph.prototype.dragSelection = function (pos) { + var origin, + ratio, + delta; + + if (this.lastDragPosition) { + if (this.moving) { + delta = pos.subtract(this.lastDragPosition); + this.moveSelectionBy(delta); + } else if (this.resizing) { + if (this.shift) { + // constrain delta if shift is pressed + origin = this.originalSelection.origin; + ratio = Math.max( + (pos.x - origin.x) / + (this.originalSelection.destination.x - origin.x), + (pos.y - origin.y) / + (this.originalSelection.destination.y - origin.y) + ); + pos = this.originalSelection.destination.subtract( + origin + ).multiplyBy(ratio).add(origin); + } + // this.currentShape holds the selection shape + delta = (pos.subtract(this.currentShape.origin)).divideBy( + this.lastDragPosition.subtract(this.currentShape.origin)); + this.resizeSelectionBy(delta); + } + } else if (this.resizing) { + // we save the selection as it was before we started resizing so that + // we can use it to constrain its proportions later + this.originalSelection = this.currentShape.copy(); + } + + this.lastDragPosition = pos; +}; + +VectorPaintEditorMorph.prototype.moveSelectionBy = function (delta) { + var paper = this.paper; + + this.selection.forEach(function (shape) { + shape.moveBy(delta); + shape.drawOn(paper); + }); + + if (this.currentShape && this.currentShape.isSelection) { + this.currentShape.moveBy(delta); + this.currentShape.drawOn(paper); + } +}; + +VectorPaintEditorMorph.prototype.resizeSelectionBy = function (delta) { + var paper = this.paper, + selectionShape; + + if (this.currentShape && this.currentShape.isSelection) { + selectionShape = this.currentShape; + + this.selection.forEach(function (shape) { + shape.resizeBy(delta, selectionShape.origin); + shape.drawOn(paper); + }); + + selectionShape.resizeBy(delta, selectionShape.origin); + selectionShape.drawOn(paper); + } +}; + +VectorPaintEditorMorph.prototype.sortSelection = function () { + var myself = this; + this.selection.sort(function (a, b) { + return myself.shapes.indexOf(a) > myself.shapes.indexOf(b); + }); +}; + +VectorPaintEditorMorph.prototype.clearSelection = function () { + this.currentShape = null; + this.selection = []; + this.paper.redraw = true; +}; + +VectorPaintEditorMorph.prototype.getSVG = function () { + var svg = new XML_Element('svg'), + bounds = this.getBounds(this.shapes); + + svg.attributes.xmlns = 'http://www.w3.org/2000/svg'; + svg.attributes.snap = 'http://snap.berkeley.edu/run'; + svg.attributes.version = '1.1'; + svg.attributes.preserveAspectRatio = 'none meet'; + svg.attributes.viewBox = + bounds.left() + ' ' + bounds.top() + ' ' + + (bounds.right() - bounds.left()) + ' ' + + (bounds.bottom() - bounds.top()); + svg.attributes.width = (bounds.right() - bounds.left()); + svg.attributes.height = (bounds.bottom() - bounds.top()); + + svg.children = this.shapes.map(function (shape) { return shape.asSVG(); }); + + return window.btoa(svg); +}; + +VectorPaintEditorMorph.prototype.getBounds = function (shapeCollection) { + var shapeBounds = shapeCollection.map(function(each) { + return each.bounds(); + }); + + if (shapeBounds.length === 0) {return null; } + + return shapeBounds.reduce( + function(previous, current) { + return new Rectangle( + Math.min(previous.left(), current.left()), + Math.min(current.top(), previous.top()), + Math.max(previous.right(), current.right()), + Math.max(previous.bottom(), current.bottom()) + ); + } + ); +}; + +VectorPaintEditorMorph.prototype.silentMoveBy = function (delta) { + VectorPaintEditorMorph.uber.silentMoveBy.call(this, delta); + if (this.currentShape) { + this.currentShape.moveBy(delta); + } + this.shapes.forEach(function (shape) { + shape.moveBy(delta); + }); +}; + +VectorPaintEditorMorph.prototype.ok = function () { + var myself = this, + img = new Image(), + shapeOrigin, + originDelta; + + if (this.shapes.length === 0) { + this.cancel(); + return; + } + + shapeOrigin = this.getBounds(this.shapes).origin; + originDelta = shapeOrigin.subtract(this.paper.bounds.origin); + + this.paper.updateAutomaticCenter(); + + img.src = 'data:image/svg+xml;base64,' + this.getSVG().toString(); + + img.onload = function() { + myself.callback( + img, + myself.paper.rotationCenter.subtract(originDelta), + myself.shapes + ); + }; + + this.destroy(); +}; + +// Undo support + +VectorPaintEditorMorph.prototype.updateHistory = function () { + this.history.push(this.shapes.map(function (shape) { + return shape.copy(); + })); +}; + +VectorPaintEditorMorph.prototype.undo = function () { + var paper = this.paper, + oldSum = this.checksum(), + newSum = oldSum; + + function draw(shape) { + shape.drawOn(paper); + } + + while (this.shapes.length && oldSum == newSum) { + this.shapes = this.history.pop() || []; + this.shapes.forEach(draw); + newSum = this.checksum(); + } + + this.clearSelection(); +}; + +VectorPaintEditorMorph.prototype.checksum = function () { + return JSON.stringify(this.shapes).split('').reduce( + function (previousSum, currentChar) { + return previousSum + currentChar.charCodeAt(0); + }, + 0); +}; + +// VectorPaintCanvasMorph ////////////////////////// + +VectorPaintCanvasMorph.prototype = new PaintCanvasMorph(); +VectorPaintCanvasMorph.prototype.constructor = VectorPaintCanvasMorph; +VectorPaintCanvasMorph.uber = PaintCanvasMorph.prototype; + +function VectorPaintCanvasMorph (shift) { + this.init(shift); +} + +VectorPaintCanvasMorph.prototype.init = function (shift) { + VectorPaintCanvasMorph.uber.init.call(this, shift); + this.isCachingImage = true; + this.pointBuffer = []; + this.currentTool = 'brush'; + this.settings = { + primaryColor: new Color(0, 0, 0, 0), + secondaryColor: new Color(0, 0, 0, 255), + lineWidth: 3 + }; +}; + +VectorPaintCanvasMorph.prototype.calculateCanvasCenter = function () { + var canvasBounds = this.bounds; + + // Can't use canvasBounds.center(), it rounds down. + return new Point( + (canvasBounds.width()) / 2, + (canvasBounds.height()) / 2); +}; + +VectorPaintCanvasMorph.prototype.updateAutomaticCenter = function () { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + shapeBounds = editor.getBounds(editor.shapes), + relativePosition; + + if (this.automaticCrosshairs && shapeBounds) { + relativePosition = shapeBounds.origin.subtract(this.bounds.origin); + this.rotationCenter = + (new Point( + (shapeBounds.width()) / 2, + (shapeBounds.height()) / 2)).add(relativePosition); + } else if (this.automaticCrosshairs) { + this.calculateCanvasCenter(); + } +}; + +VectorPaintCanvasMorph.prototype.clearCanvas = function () { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + editor.updateHistory(); + editor.shapes = []; + editor.clearSelection(); + this.mask.getContext('2d').clearRect( + 0, + 0, + this.bounds.width(), + this.bounds.height() + ); + this.redraw = true; +}; + +VectorPaintCanvasMorph.prototype.toolChanged = function (tool) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + VectorPaintCanvasMorph.uber.toolChanged.call(this, tool); + + if (editor.currentShape && editor.currentShape.isPolygon) { + editor.currentShape.close(); + editor.currentShape.drawOn(this); + editor.shapes.push(editor.currentShape); + } + + if (tool === 'crosshairs') { + editor.clearSelection(); + editor.currentShape = new Crosshair(this.rotationCenter, this); + editor.currentShape.drawOn(this); + this.automaticCrosshairs = false; + } else if (tool === 'pipette' && editor.selection) { + return; + } else { + editor.clearSelection(); + editor.currentShape = null; + } +}; + +VectorPaintCanvasMorph.prototype.drawNew = function () { + var myself = this, + editor = this.parentThatIsA(VectorPaintEditorMorph), + canvas = newCanvas(this.extent(), false, this.cachedImage); + + this.merge(this.background, canvas); + this.merge(this.paper, canvas); + + if (editor) { + editor.shapes.forEach(function(each) { + myself.merge(each.image, canvas); + }); + + if (editor.currentShape) { + this.merge(editor.currentShape.image, canvas); + } + } + + this.cachedImage = canvas; + this.drawFrame(); +}; + +VectorPaintCanvasMorph.prototype.render = + VectorPaintCanvasMorph.prototype.drawNew; + +VectorPaintCanvasMorph.prototype.step = function () { + if (this.redraw) { + this.drawNew(); + this.changed(); + this.redraw = false; + } +}; + +VectorPaintCanvasMorph.prototype.mouseMove = function (pos) { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + primaryColor = this.settings.primaryColor, + secondaryColor = this.settings.secondaryColor, + borderWidth = this.settings.lineWidth, + selectionCorner, + oppositeCorner; + + if (this.currentTool === 'paintbucket') { + return; + + } else if (editor.currentShape && editor.currentShape.isSelection + && !editor.selecting) { + + selectionCorner = editor.currentShape.cornerAt(pos); + + if (editor.resizing || editor.moving) { + editor.dragSelection(pos); + } else if (selectionCorner) { + oppositeCorner = editor.currentShape.cornerOppositeTo( + selectionCorner + ); + editor.currentShape = new VectorSelection( + oppositeCorner, + selectionCorner + ); + editor.currentShape.drawOn(this); + editor.resizing = true; + document.body.style.cursor = 'move'; + } else if (editor.currentShape.containsPoint(pos)) { + editor.moving = true; + document.body.style.cursor = 'move'; + } + + } else if (!editor.currentShape || editor.currentShape.isSelection + && !editor.selecting) { + this.beginShape(borderWidth, primaryColor, secondaryColor, pos); + editor.currentShape.drawOn(this); + } else { + editor.currentShape.update(pos, editor.shift); + editor.currentShape.drawOn(this); + } +}; + +VectorPaintCanvasMorph.prototype.mouseEnter = function () { + if (this.currentTool === 'selection') { + document.body.style.cursor = 'crosshair'; + } else { + document.body.style.cursor = 'default'; + } +}; + +VectorPaintCanvasMorph.prototype.mouseLeave = function () { + document.body.style.cursor = 'default'; +}; + +VectorPaintCanvasMorph.prototype.mouseClickLeft = function (pos) { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + shape = editor.currentShape; + + if (shape) { + if (shape.isPolygon && !shape.isFreeHand) { + shape.points.push(shape.points[shape.points.length - 1].copy()); + } else if (shape.isPolygon) { + shape.close(); + shape.drawOn(this); + editor.shapes.push(shape); + editor.currentShape = null; + } else if (shape.isSelection) { + if (editor.selecting) { + shape.destination = pos; + this.selectInside(shape); + editor.selecting = false; + } else if (editor.moving || editor.resizing) { + editor.moving = false; + editor.resizing = false; + this.updateSelection(); + } else { + this.selectAtPoint(pos); + } + } else if (shape.isCrosshair) { + this.rotationCenter = pos.subtract(this.bounds.origin); + } else { + shape.update(pos, editor.shift); + editor.shapes.push(shape); + editor.currentShape = null; + } + } else if (this.currentTool === 'selection') { + this.selectAtPoint(pos); + } + + editor.lastDragPosition = null; + this.mouseEnter(); + editor.updateHistory(); +}; + +VectorPaintCanvasMorph.prototype.mouseDoubleClick = function (pos) { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + shape = editor.currentShape; + + if (shape && shape.isPolygon) { + shape.close(); // if it applies + shape.drawOn(this); + editor.shapes.push(shape); + editor.currentShape = null; + editor.updateHistory(); + } +}; + +VectorPaintCanvasMorph.prototype.beginShape = function ( + borderWidth, + primaryColor, + secondaryColor, + pos +) { + switch (this.currentTool) { + case 'brush': + this.beginPolygon( // unclosed, freehanded + borderWidth, + secondaryColor, + null, + pos, + false, + true + ); + break; + case 'line': + this.beginLine(borderWidth, secondaryColor, pos); + break; + case 'rectangle': + this.beginRectangle(borderWidth, secondaryColor, primaryColor, pos); + break; + case 'ellipse': + this.beginEllipse(borderWidth, secondaryColor, primaryColor, pos); + break; + case 'polygon': + this.beginPolygon( // closed, point-based + borderWidth, + secondaryColor, + primaryColor, + pos, + true, + false + ); + break; + case 'closedBrush': + this.beginPolygon( // closed, freehanded + borderWidth, + secondaryColor, + primaryColor, + pos, + true, + true + ); + break; + case 'selection': + this.beginSelection(pos); + break; + // pipette is defined in PaintCanvasMorph >> toolButton + } +}; + +VectorPaintCanvasMorph.prototype.beginPolygon = function ( + borderWidth, + borderColor, + fillColor, + origin, + isClosed, + isFreeHand +) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + editor.currentShape = new VectorPolygon( + borderWidth, + borderColor, + fillColor, + [origin], + isClosed, + isFreeHand + ); +}; + +VectorPaintCanvasMorph.prototype.beginLine = function ( + borderWidth, + borderColor, + origin +) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + editor.currentShape = new VectorLine( + borderWidth, + borderColor, + origin, + origin + ); +}; + +VectorPaintCanvasMorph.prototype.beginRectangle = function ( + borderWidth, + borderColor, + fillColor, + origin +) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + editor.currentShape = new VectorRectangle( + borderWidth, + borderColor, + fillColor, + origin, + origin + ); +}; + +VectorPaintCanvasMorph.prototype.beginEllipse = function ( + borderWidth, + borderColor, + fillColor, + origin +) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + editor.currentShape = new VectorEllipse( + borderWidth, + borderColor, + fillColor, + origin, + origin + ); +}; + +VectorPaintCanvasMorph.prototype.beginSelection = function (origin) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + editor.currentShape = new VectorSelection(origin, origin); + editor.selecting = true; +}; + +VectorPaintCanvasMorph.prototype.selectInside = function (selectionShape) { + // I find and select all shapes contained inside + // the bounds of selectionShape + var selectionBounds = selectionShape.bounds(), + editor = this.parentThatIsA(VectorPaintEditorMorph); + + editor.selection = editor.shapes.filter(function (eachShape) { + return selectionBounds.containsRectangle(eachShape.bounds()); + }); + + if (editor.selection.length > 0) { + selectionBounds = editor.getBounds(editor.selection); + selectionShape.origin = selectionBounds.topLeft(); + selectionShape.destination = selectionBounds.bottomRight(); + selectionShape.drawOn(this); + } else { + editor.currentShape = null; + this.redraw = true; + } +}; + +VectorPaintCanvasMorph.prototype.selectAtPoint = function (position) { + // I find and select the topmost shape at position + var editor = this.parentThatIsA(VectorPaintEditorMorph), + shape = this.shapeAt(position), + bounds, + index; + + if (shape) { + if (editor.shift) { + index = editor.selection.indexOf(shape); + if (index > -1) { + editor.selection.splice(index, 1); + } else { + editor.selection.push(shape); + } + } else { + editor.selection = [ shape ]; + } + bounds = editor.getBounds(editor.selection); + } + + if (bounds) { + editor.currentShape = new VectorSelection( + bounds.topLeft(), + bounds.bottomRight() + ); + editor.currentShape.drawOn(this); + } else { + editor.clearSelection(); + } +}; + +VectorPaintCanvasMorph.prototype.selectShapes = function (shapes) { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + bounds; + + if (shapes.length > 0) { + bounds = editor.getBounds(shapes); + editor.selection = shapes; + editor.currentShape = new VectorSelection( + bounds.topLeft(), + bounds.bottomRight() + ); + editor.currentShape.drawOn(this); + } +}; + +VectorPaintCanvasMorph.prototype.updateSelection = function () { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + this.selectShapes(editor.selection); +}; + +VectorPaintCanvasMorph.prototype.shapeAt = function (position) { + var editor = this.parentThatIsA(VectorPaintEditorMorph); + return detect( + editor.shapes.slice().reverse(), + function (shape) { + return shape.containsPoint(position); + }); +}; + +VectorPaintCanvasMorph.prototype.pasteAt = function (position) { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + myself = this, + clipboard = editor.clipboard, + delta, + copies = []; + + if (clipboard.length > 0) { + // Each shape is positioned according to the difference between + // the first shape's original position and the paste position + delta = position.subtract(clipboard[0].bounds().origin); + } + + clipboard.forEach(function (shape) { + var copy = shape.copy(); + copy.moveBy(delta); + editor.selection.push(copy); + editor.shapes.push(copy); + copy.drawOn(myself); + copies.push(copy); + }); + + if (copies.length > 0) { + this.selectShapes(copies); + editor.updateHistory(); + } +}; + +VectorPaintCanvasMorph.prototype.floodfill = function (sourcepoint) { + var editor = this.parentThatIsA(VectorPaintEditorMorph), + shape = this.shapeAt(sourcepoint.add(this.position())); + + if (shape) { + shape.setColor( + editor.shift ? + this.settings.secondaryColor + : this.settings.primaryColor, editor.shift + ); + shape.drawOn(this); + } +}; + diff --git a/elements/pl-snap/Snap/src/snap_logo_sm.png b/elements/pl-snap/Snap/src/snap_logo_sm.png new file mode 100644 index 00000000..500559b0 Binary files /dev/null and b/elements/pl-snap/Snap/src/snap_logo_sm.png differ diff --git a/elements/pl-snap/Snap/src/store.js b/elements/pl-snap/Snap/src/store.js new file mode 100644 index 00000000..78a587c9 --- /dev/null +++ b/elements/pl-snap/Snap/src/store.js @@ -0,0 +1,2577 @@ +/* + + store.js + + saving and loading Snap! projects + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2023 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js, xml.js, scenes.js and most of Snap!'s other modules + + + hierarchy + --------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + XML_Serializer + SnapSerializer + + + credits + ------- + Nathan Dinsmore contributed to the design and implemented a first + working version of a complete XMLSerializer. I have taken much of the + overall design and many of the functions and methods in this file from + Nathan's fine original prototype. + +*/ + +/*global modules, XML_Element, VariableFrame, StageMorph, SpriteMorph, console, +WatcherMorph, Point, CustomBlockDefinition, Context, ReporterBlockMorph, Sound, +CommandBlockMorph, detect, CustomCommandBlockMorph, CustomReporterBlockMorph, +Color, List, newCanvas, Costume, Audio, IDE_Morph, ScriptsMorph, ArgLabelMorph, +BlockMorph, ArgMorph, InputSlotMorph, TemplateSlotMorph, CommandSlotMorph, +FunctionSlotMorph, MultiArgMorph, ColorSlotMorph, nop, CommentMorph, isNil, +localize, SVG_Costume, MorphicPreferences, Process, isSnapObject, Variable, +SyntaxElementMorph, BooleanSlotMorph, normalizeCanvas, contains, Scene, +Project*/ + +/*jshint esversion: 11*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.store = '2023-July-27'; + +// XML_Serializer /////////////////////////////////////////////////////// +/* + I am an abstract protype for my heirs. + + I manage object identities and keep track of circular data structures. + Objects are "touched" and a property named "serializationID" is added + to each, representing an index integer in the list, starting with 1. +*/ + +// XML_Serializer instance creation: + +function XML_Serializer() { + this.contents = []; + this.media = []; + this.root = {}; + this.isCollectingMedia = false; + this.isExportingBlocksLibrary = false; +} + +// XML_Serializer preferences settings: + +XML_Serializer.prototype.idProperty = 'serializationID'; +XML_Serializer.prototype.mediaIdProperty = 'serializationMediaID'; +XML_Serializer.prototype.mediaDetectionProperty = 'isMedia'; +XML_Serializer.prototype.version = 2; // increment on structural change + +// XML_Serializer accessing: + +XML_Serializer.prototype.serialize = function (object, forBlocksLibrary) { + // public: answer an XML string representing the given object + var xml; + this.flush(); // in case an error occurred in an earlier attempt + this.flushMedia(); + this.isExportingBlocksLibrary = forBlocksLibrary; + xml = this.store(object); + this.flush(); + return xml; +}; + +XML_Serializer.prototype.store = function (object, mediaID) { + // private - mediaID is optional + if (isNil(object) || !object.toXML) { + // unsupported type, to be checked before calling store() + // when debugging, be sure to throw an error at this point + return ''; + } + if (object instanceof Scene) { + this.root = object; + } + if (this.isCollectingMedia && object[this.mediaDetectionProperty]) { + this.addMedia(object, mediaID); + return this.format( + '', + object[this.mediaIdProperty] + ); + } + if (object[this.idProperty]) { + return this.format('', object[this.idProperty]); + } + this.add(object); + return object.toXML(this, mediaID).replace( + '~', + this.format('id="@"', object[this.idProperty]) + ); +}; + +XML_Serializer.prototype.mediaXML = function () { + // answer a project's collected media module as XML + var xml = ''; + this.media.forEach(object => { + var str = object.toXML(this).replace( + '~', + this.format('mediaID="@"', object[this.mediaIdProperty]) + ); + xml = xml + str; + }); + return xml + ''; +}; + +XML_Serializer.prototype.add = function (object) { + // private - mark the object with a serializationID property and add it + if (object[this.idProperty]) { // already present + return -1; + } + this.contents.push(object); + object[this.idProperty] = this.contents.length; + return this.contents.length; +}; + +XML_Serializer.prototype.addMedia = function (object, mediaID) { + // private - mark the object with a serializationMediaID property + // and add it to media + // if a mediaID is given, take it, otherwise generate one + if (object[this.mediaIdProperty]) { // already present + return -1; + } + this.media.push(object); + if (mediaID) { + object[this.mediaIdProperty] = mediaID + '_' + object.name; + } else { + object[this.mediaIdProperty] = this.media.length; + } + return this.media.length; +}; + +XML_Serializer.prototype.at = function (integer) { + // private + return this.contents[integer - 1]; +}; + +XML_Serializer.prototype.flush = function () { + // private - free all objects and empty my contents + this.contents.forEach(obj => delete obj[this.idProperty]); + this.contents = []; + this.root = {}; +}; + +XML_Serializer.prototype.flushMedia = function () { + // private - free all media objects and empty my media + if (this.media instanceof Array) { + this.media.forEach(obj => delete obj[this.mediaIdProperty]); + } + this.media = []; + this.isExportingBlocksLibrary = false; +}; + +// XML_Serializer formatting: + +XML_Serializer.prototype.escape = XML_Element.prototype.escape; +XML_Serializer.prototype.unescape = XML_Element.prototype.unescape; + + +XML_Serializer.prototype.format = function (string) { + // private + var i = -1, + values = arguments, + value; + + return string.replace(/[@$%]([\d]+)?/g, (spec, index) => { + index = parseInt(index, 10); + + if (isNaN(index)) { + i += 1; + value = values[i + 1]; + } else { + value = values[index + 1]; + } + // original line of code - now frowned upon by JSLint: + // value = values[(isNaN(index) ? (i += 1) : index) + 1]; + + return spec === '@' ? + this.escape(value) + : spec === '$' ? + this.escape(value, true) + : value; + }); +}; + +// XML_Serializer loading: + +XML_Serializer.prototype.load = function (xmlString) { + // answer a new object which is represented by the given XML string. + nop(xmlString); + throw new Error( + 'loading should be implemented in heir of XML_Serializer' + ); +}; + +XML_Serializer.prototype.parse = function (xmlString, assertVersion) { + // answer an XML_Element representing the given XML String + // optional assertVersion parameter for asserting a top-level + // node to be consistent with the current serializer version + var element = new XML_Element(); + element.parseString(xmlString); + if (assertVersion) { + if (+element.attributes.version > this.version) { + throw 'Module uses newer version of Serializer'; + } + } + return element; +}; + +// SnapSerializer //////////////////////////////////////////////////////////// + +var SnapSerializer; + +// SnapSerializer inherits from XML_Serializer: + +SnapSerializer.prototype = new XML_Serializer(); +SnapSerializer.prototype.constructor = SnapSerializer; +SnapSerializer.uber = XML_Serializer.prototype; + +// SnapSerializer constants: + +SnapSerializer.prototype.app = 'Snap! 9.0, https://snap.berkeley.edu'; + +SnapSerializer.prototype.thumbnailSize = new Point(160, 120); + +SnapSerializer.prototype.watcherLabels = { + xPosition: 'x position', + yPosition: 'y position', + direction: 'direction', + getScale: 'size', + reportShown: 'shown?', + getTempo: 'tempo', + getVolume: 'volume', + getPan: 'balance', + getPenDown: 'pen down?', + getLastAnswer: 'answer', + getLastMessage: 'message', + getTimer: 'timer', + getCostumeIdx: 'costume #', + reportMouseX: 'mouse x', + reportMouseY: 'mouse y', + reportThreadCount: 'processes' +}; + +// SnapSerializer instance creation: + +function SnapSerializer() { + this.init(); +} + +// SnapSerializer initialization: + +SnapSerializer.prototype.init = function () { + this.scene = new Scene(); + this.objects = {}; + this.mediaDict = {}; +}; + +// SnapSerializer saving: + +XML_Serializer.prototype.mediaXML = function (name) { + // under construction.... + var xml = ''; + this.media.forEach(object => { + var str = object.toXML(this).replace( + '~', + this.format('mediaID="@"', object[this.mediaIdProperty]) + ); + xml = xml + str; + }); + return xml + ''; +}; + +// SnapSerializer loading: + +SnapSerializer.prototype.load = function (xmlString, ide) { + // public - answer a new Project represented by the given XML String + return this.loadProjectModel(this.parse(xmlString), ide); +}; + +SnapSerializer.prototype.loadProjectModel = function (xmlNode, ide, remixID) { + // public - answer a new Project represented by the given XML top node + // show a warning if the origin apps differ + + var appInfo = xmlNode.attributes.app, + app = appInfo ? appInfo.split(' ')[0] : null, + appVersion = appInfo ? parseFloat(appInfo.split(' ')[1]) || 0 : 0, + scenesModel = xmlNode.childNamed('scenes'), + project = new Project(); + + if (ide && app && app !== this.app.split(' ')[0]) { + ide.inform( + app + ' Project', + 'This project has been created by a different app:\n\n' + + app + + '\n\nand may be incompatible or fail to load here.' + ).nag = true; + } + if (scenesModel) { + if (scenesModel.attributes.select) { + project.sceneIdx = +scenesModel.attributes.select; + } + scenesModel.childrenNamed('scene').forEach(model => { + ide.scene.captureGlobalSettings(); + project.scenes.add(this.loadScene(model, appVersion)); + ide.scene.applyGlobalSettings(); + }); + } else { + project.scenes.add(this.loadScene(xmlNode, appVersion, remixID)); + } + return project.initialize(); +}; + +SnapSerializer.prototype.loadScene = function (xmlNode, appVersion, remixID) { + // private + var scene = new Scene(), + model, + hidden, + nameID; + + this.scene = scene; + + model = {scene: xmlNode }; + if (+xmlNode.attributes.version > this.version) { + throw 'Project uses newer version of Serializer'; + } + + /* Project Info */ + + this.objects = {}; + scene.name = model.scene.attributes.name; + if (!scene.name) { + nameID = 1; + while ( + Object.prototype.hasOwnProperty.call( + localStorage, + '-snap-project-Untitled ' + nameID + ) + ) { + nameID += 1; + } + scene.name = 'Untitled ' + nameID; + } + scene.unifiedPalette = model.scene.attributes.palette === 'single'; + scene.showCategories = model.scene.attributes.categories !== 'false'; + scene.showPaletteButtons = model.scene.attributes.buttons !== 'false'; + scene.disableClickToRun = model.scene.attributes.clickrun === 'false'; + scene.disableDraggingData = model.scene.attributes.dragdata === 'false'; + scene.penColorModel = model.scene.attributes.colormodel === 'hsl' ? + 'hsl' : 'hsv'; + model.notes = model.scene.childNamed('notes'); + if (model.notes) { + scene.notes = model.notes.contents; + } + model.palette = model.scene.childNamed('palette'); + if (model.palette) { + scene.customCategories = this.loadPalette(model.palette); + SpriteMorph.prototype.customCategories = scene.customCategories; + } + model.globalVariables = model.scene.childNamed('variables'); + + /* Stage */ + + model.stage = model.scene.require('stage'); + scene.stage.remixID = remixID; + + if (Object.prototype.hasOwnProperty.call( + model.stage.attributes, + 'id' + )) { + this.objects[model.stage.attributes.id] = scene.stage; + } + if (model.stage.attributes.name) { + scene.stage.name = model.stage.attributes.name; + } + if (model.stage.attributes.color) { + scene.stage.color = this.loadColor(model.stage.attributes.color); + scene.stage.cachedColorDimensions = scene.stage.color[ + SpriteMorph.prototype.penColorModel + ](); + } + if (model.stage.attributes.volume) { + scene.stage.volume = +model.stage.attributes.volume; + } + if (model.stage.attributes.pan) { + scene.stage.pan = +model.stage.attributes.pan; + } + if (model.stage.attributes.penlog) { + scene.enablePenLogging = + (model.stage.attributes.penlog === 'true'); + } + + model.pentrails = model.stage.childNamed('pentrails'); + if (model.pentrails) { + scene.pentrails = new Image(); + scene.pentrails.onload = function () { + if (scene.stage.trailsCanvas) { // work-around a bug in FF + normalizeCanvas(scene.stage.trailsCanvas); + var context = scene.stage.trailsCanvas.getContext('2d'); + context.drawImage(scene.pentrails, 0, 0); + scene.stage.changed(); + } + }; + scene.pentrails.src = model.pentrails.contents; + } + scene.stage.setTempo(model.stage.attributes.tempo); + if (model.stage.attributes.width) { + scene.stage.dimensions.x = + Math.max(+model.stage.attributes.width, 240); + } + if (model.stage.attributes.height) { + scene.stage.dimensions.y = + Math.max(+model.stage.attributes.height, 180); + } + scene.stage.setExtent(scene.stage.dimensions); + scene.useFlatLineEnds = + model.stage.attributes.lines === 'flat'; + BooleanSlotMorph.prototype.isTernary = + model.stage.attributes.ternary !== 'false'; + scene.enableHyperOps = + model.stage.attributes.hyperops !== 'false'; + scene.stage.isThreadSafe = + model.stage.attributes.threadsafe === 'true'; + scene.enableCodeMapping = + model.stage.attributes.codify === 'true'; + scene.enableInheritance = + model.stage.attributes.inheritance !== 'false'; + scene.enableSublistIDs = + model.stage.attributes.sublistIDs === 'true'; + + model.hiddenPrimitives = model.scene.childNamed('hidden'); + if (model.hiddenPrimitives) { + hidden = model.hiddenPrimitives.contents.split(' ').filter(word => + word.length > 0); + if (hidden.length) { + hidden.forEach( + sel => { + var selector, migration; + if (sel) { + migration = SpriteMorph.prototype.blockMigrations[sel]; + selector = migration ? migration.selector : sel; + scene.hiddenPrimitives[selector] = true; + } + } + ); + + // hide new primitives that have been added to the palette + // since the project has been last saved + SpriteMorph.prototype.newPrimitivesSince(appVersion).forEach( + sel => { + var selector, migration; + if (sel) { + migration = SpriteMorph.prototype.blockMigrations[sel]; + selector = migration ? migration.selector : sel; + scene.hiddenPrimitives[selector] = true; + } + } + ); + } + } + + model.codeHeaders = model.scene.childNamed('headers'); + if (model.codeHeaders) { + model.codeHeaders.children.forEach( + xml => scene.codeHeaders[xml.tag] = xml.contents + ); + } + + model.codeMappings = model.scene.childNamed('code'); + if (model.codeMappings) { + model.codeMappings.children.forEach( + xml => scene.codeMappings[xml.tag] = xml.contents + ); + } + + model.globalBlocks = model.scene.childNamed('blocks'); + if (model.globalBlocks) { + this.loadCustomBlocks(scene.stage, model.globalBlocks, true); + this.populateCustomBlocks( + scene.stage, + model.globalBlocks, + true + ); + } + this.loadObject(scene.stage, model.stage); + + /* Sprites */ + + model.sprites = model.stage.require('sprites'); + if (model.sprites.attributes.select) { + scene.spriteIdx = +model.sprites.attributes.select; + } + scene.spritesDict[scene.stage.name] = scene.stage; + model.sprites.childrenNamed('sprite').forEach( + model => this.loadValue(model) + ); + + // restore inheritance and nesting associations + this.scene.stage.children.forEach(sprite => { + var exemplar, anchor; + if (sprite.inheritanceInfo) { // only sprites can inherit + exemplar = this.scene.spritesDict[ + sprite.inheritanceInfo.exemplar + ]; + if (exemplar) { + sprite.setExemplar(exemplar); + } + sprite.inheritedAttributes = sprite.inheritanceInfo.delegated || []; + sprite.updatePropagationCache(); + } + if (sprite.nestingInfo) { // only sprites may have nesting info + anchor = this.scene.spritesDict[sprite.nestingInfo.anchor]; + if (anchor) { + anchor.attachPart(sprite); + } + sprite.rotatesWithAnchor = (sprite.nestingInfo.synch === 'true'); + } + }); + this.scene.stage.children.forEach(sprite => { + var costume; + if (sprite.nestingInfo) { // only sprites may have nesting info + sprite.nestingScale = +(sprite.nestingInfo.scale || sprite.scale); + delete sprite.nestingInfo; + } + ['scripts', 'costumes', 'sounds'].forEach(att => { + if (sprite.inheritsAttribute(att)) { + sprite.refreshInheritedAttribute(att); + } + }); + if (sprite.inheritsAttribute('costumes')) { + if (sprite.inheritsAttribute('costume #')) { + costume = sprite.exemplar.costume; + } else { + costume = sprite.costumes.asArray()[ + sprite.inheritanceInfo.costumeNumber - 1 + ]; + } + if (costume) { + if (costume.loaded) { + sprite.wearCostume(costume, true); + } else { + costume.loaded = function () { + this.loaded = true; + sprite.wearCostume(costume, true); + }; + } + } + } + delete sprite.inheritanceInfo; + }); + + /* Global Variables */ + + if (model.globalVariables) { + this.loadVariables( + scene.globalVariables, + model.globalVariables + ); + } + + this.objects = {}; + + /* Watchers */ + + model.sprites.childrenNamed('watcher').forEach(model => { + var watcher, color, target, hidden, extX, extY; + + color = this.loadColor(model.attributes.color); + target = Object.prototype.hasOwnProperty.call( + model.attributes, + 'scope' + ) ? scene.spritesDict[model.attributes.scope] : null; + + // determine whether the watcher is hidden, slightly + // complicated to retain backward compatibility + // with former tag format: hidden="hidden" + // now it's: hidden="true" + hidden = Object.prototype.hasOwnProperty.call( + model.attributes, + 'hidden' + ) && (model.attributes.hidden !== 'false'); + + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'var' + )) { + watcher = new WatcherMorph( + model.attributes['var'], + color, + isNil(target) ? scene.globalVariables + : target.variables, + model.attributes['var'], + hidden + ); + } else { + watcher = new WatcherMorph( + localize(this.watcherLabels[model.attributes.s]), + color, + target, + model.attributes.s, + hidden + ); + } + watcher.setStyle(model.attributes.style || 'normal'); + if (watcher.style === 'slider') { + watcher.setSliderMin(model.attributes.min || '1', true); + watcher.setSliderMax(model.attributes.max || '100', true); + } + watcher.setPosition( + scene.stage.topLeft().add(new Point( + +model.attributes.x || 0, + +model.attributes.y || 0 + )).multiplyBy(scene.stage.scale) + ); + scene.stage.add(watcher); + watcher.onNextStep = function () {this.currentValue = null; }; + + // set watcher's contentsMorph's extent if it is showing a list and + // its monitor dimensions are given + if (watcher.currentValue instanceof List && + watcher.cellMorph.contentsMorph) { + extX = model.attributes.extX; + if (extX) { + watcher.cellMorph.contentsMorph.setWidth(+extX); + } + extY = model.attributes.extY; + if (extY) { + watcher.cellMorph.contentsMorph.setHeight(+extY); + } + // adjust my contentsMorph's handle position + watcher.cellMorph.contentsMorph.handle.fixLayout(); + } + }); + + // clear sprites' inherited methods caches, if any + this.scene.stage.children.forEach( + sprite => sprite.inheritedMethodsCache = [] + ); + + this.objects = {}; + return scene.initialize(); +}; + +SnapSerializer.prototype.loadBlocks = function (xmlString, targetStage) { + // public - answer a new dictionary of custom block definitions + // represented by the given XML String + var model = this.parse(xmlString); + if (+model.attributes.version > this.version) { + throw 'Module uses newer version of Serializer'; + } + return this.loadBlocksModel(model, targetStage); +}; + +SnapSerializer.prototype.loadBlocksModel = function (model, targetStage) { + // public - answer a new dictionary of custom block definitions + // represented by the given already parsed XML Node + var stage, varModel, varFrame, localVarFrame; + + this.scene = new Scene(); + this.scene.targetStage = targetStage; // for secondary block def look-up + stage = this.scene.stage; + model.palette = model.childNamed('palette'); + if (model.palette) { + this.loadPalette(model.palette).forEach((value, key) => + SpriteMorph.prototype.customCategories.set(key, value) + ); + } + model.removeChild(model.palette); + this.loadCustomBlocks(stage, model, true); // global + this.populateCustomBlocks(stage, model, true); // global + model.local = model.childNamed('local'); + if (model.local) { + this.loadCustomBlocks(stage, model.local, false); // not global + this.populateCustomBlocks( stage, model.local, false); // not global + } + varModel = model.childNamed('variables'); + if (varModel) { + varFrame = new VariableFrame(); + this.loadVariables(varFrame, varModel); + } + varModel = model.childNamed('local-variables'); + if (varModel) { + localVarFrame = new VariableFrame(); + this.loadVariables(localVarFrame, varModel); + } + this.objects = {}; + stage.globalBlocks.forEach(def => def.receiver = null); + this.objects = {}; + this.scene = new Scene(); + this.mediaDict = {}; + return { + global : stage.globalBlocks, + local : stage.customBlocks, + data : varFrame, + localData : localVarFrame + }; +}; + +SnapSerializer.prototype.loadSpritesModel = function (xmlNode, ide) { + // public - import a set of sprites represented by an xml model + // into the current scene of the ide + var model = xmlNode, + scene; + + this.scene = new Scene(ide.stage); + scene = this.scene; + scene.spritesDict[scene.stage.name] = scene.stage; + + model.childrenNamed('sprite').forEach(model => { + var sprite = new SpriteMorph(scene.globalVariables); + + if (model.attributes.id) { + this.objects[model.attributes.id] = sprite; + } + if (model.attributes.name) { + sprite.name = ide.newSpriteName(model.attributes.name); + scene.spritesDict[sprite.name] = sprite; + } + if (model.attributes.color) { + sprite.color = this.loadColor(model.attributes.color); + sprite.cachedColorDimensions = sprite.color[sprite.penColorModel](); + } + if (model.attributes.pen) { + sprite.penPoint = model.attributes.pen; + } + if (model.attributes.volume) { + sprite.volume = +model.attributes.volume; + } + if (model.attributes.pan) { + sprite.pan = +model.attributes.pan; + } + scene.stage.add(sprite); + ide.sprites.add(sprite); + sprite.scale = parseFloat(model.attributes.scale || '1'); + sprite.rotationStyle = parseFloat( + model.attributes.rotation || '1' + ); + sprite.isDraggable = model.attributes.draggable !== 'false'; + sprite.isVisible = model.attributes.hidden !== 'true'; + sprite.heading = parseFloat(model.attributes.heading) || 0; + sprite.gotoXY(+model.attributes.x || 0, +model.attributes.y || 0); + this.loadObject(sprite, model); + sprite.fixLayout(); + sprite.pauseGenericHatBlocks(); + }); + + // restore inheritance and nesting associations + scene.stage.children.forEach(sprite => { + var exemplar, anchor; + if (sprite.inheritanceInfo) { // only sprites can inherit + exemplar = scene.spritesDict[ + sprite.inheritanceInfo.exemplar + ]; + if (exemplar) { + sprite.setExemplar(exemplar); + } + } + if (sprite.nestingInfo) { // only sprites may have nesting info + anchor = scene.spritesDict[sprite.nestingInfo.anchor]; + if (anchor) { + anchor.attachPart(sprite); + } + sprite.rotatesWithAnchor = (sprite.nestingInfo.synch === 'true'); + } + }); + scene.stage.children.forEach(sprite => { + delete sprite.inheritanceInfo; + if (sprite.nestingInfo) { // only sprites may have nesting info + sprite.nestingScale = +(sprite.nestingInfo.scale || sprite.scale); + delete sprite.nestingInfo; + } + }); + + this.objects = {}; + this.scene = new Scene(); + this.mediaDict = {}; + + ide.stage.fixLayout(); + ide.stage.rerender(); + ide.createCorral(); + ide.fixLayout(); + ide.toggleAppMode(ide.isAppMode); +}; + +SnapSerializer.prototype.loadMedia = function (xmlString) { + // public - load the media represented by xmlString into memory + // to be referenced by a media-less project later + return this.loadMediaModel(this.parse(xmlString)); +}; + +SnapSerializer.prototype.loadMediaModel = function (xmlNode) { + // public - load the media represented by xmlNode into memory + // to be referenced by a media-less project later + var model = xmlNode; + this.mediaDict = {}; + if (+model.attributes.version > this.version) { + throw 'Module uses newer version of Serializer'; + } + model.children.forEach(model => this.loadValue(model)); + return this.mediaDict; +}; + +SnapSerializer.prototype.loadObject = function (object, model) { + // private + var blocks = model.require('blocks'), + dispatches = model.childNamed('dispatches'), + node, + costume; + + // load the instrument + if (model.attributes.instrument) { + object.instrument = +model.attributes.instrument; + } + + this.loadInheritanceInfo(object, model); + this.loadNestingInfo(object, model); + + // load the costume that's not in the wardrobe, if any + node = model.childNamed('wear'); + if (node) { + node = node.childNamed('costume') || node.childNamed('ref'); + if (!node) { + console.log(object.name + ': missing costume to wear'); + } else { + costume = this.loadValue(node, object); + if (costume.loaded) { + object.wearCostume(costume, true); + } else { + costume.loaded = function () { + this.loaded = true; + object.wearCostume(costume, true); + }; + } + } + } + + // load costumes unless they're inherited + if (!(object.inheritanceInfo && + (object.inheritanceInfo.delegated instanceof Array) && + contains(object.inheritanceInfo.delegated, 'costumes'))) { + this.loadCostumes(object, model); + } + + // load sounds unless they're inherited + if (!(object.inheritanceInfo && + (object.inheritanceInfo.delegated instanceof Array) && + contains(object.inheritanceInfo.delegated, 'sounds'))) { + this.loadSounds(object, model); + } + + this.loadCustomBlocks(object, blocks); + if (dispatches) { + this.loadCustomBlocks(object, dispatches, false, true); + } + this.populateCustomBlocks(object, blocks); + this.loadVariables(object.variables, model.require('variables'), object); + + // load scripts unless they're inherited + if (!(object.inheritanceInfo && + (object.inheritanceInfo.delegated instanceof Array) && + contains(object.inheritanceInfo.delegated, 'scripts'))) { + this.loadScripts(object, object.scripts, model.require('scripts')); + } + + // note: the dispatches cache isn't cleared until after + // *all* objects are loaded + + // load the "solution" sprite if it exists + node = model.childNamed('solution'); + if (node) { + node = node.childNamed('sprite'); + if (node) { + object.solution = this.loadValue(node, object, true); // silently + } + } + +}; + +SnapSerializer.prototype.loadInheritanceInfo = function (object, model) { + // private + var info = model.childNamed('inherit'), + delegated; + if (info) { + object.inheritanceInfo = info.attributes; + delegated = info.childNamed('list'); + if (delegated) { + object.inheritanceInfo.delegated = + this.loadValue(delegated).asArray(); + } + object.inheritanceInfo.costumeNumber = model.attributes.costume; + } +}; + +SnapSerializer.prototype.loadNestingInfo = function (object, model) { + // private + var info = model.childNamed('nest'); + if (info) { + object.nestingInfo = info.attributes; + } +}; + +SnapSerializer.prototype.loadCostumes = function (object, model) { + // private + var costumes = model.childNamed('costumes'), + costume; + if (costumes) { + object.costumes = this.loadValue(costumes.require( + 'list', + function () { + console.log(object.name + ': missing required costumes list, ' + + 'improvising...'); + return new XML_Element('list'); + } + )); + object.costumes.type = 'costume'; + } + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'costume' + )) { + costume = object.costumes.asArray()[model.attributes.costume - 1]; + if (costume) { + if (costume.loaded) { + object.wearCostume(costume, true); + } else { + costume.loaded = function () { + this.loaded = true; + object.wearCostume(costume, true); + }; + } + } + } +}; + +SnapSerializer.prototype.loadSounds = function (object, model) { + // private + var sounds = model.childNamed('sounds'); + if (sounds) { + // object.sounds = this.loadValue(sounds.require('list')); + object.sounds = this.loadValue(sounds.require( + 'list', + function () { + console.log(object.name + ': missing required sounds list, ' + + 'improvising...'); + return new XML_Element('list'); + } + )); + + object.sounds.type = 'sound'; + } +}; + +SnapSerializer.prototype.loadVariables = function (varFrame, element, object) { + // private + element.children.forEach(child => { + var v, value; + if (child.tag !== 'variable') { + return; + } + value = child.children[0]; + v = new Variable(); + v.isTransient = (child.attributes.transient === 'true'); + v.isHidden = (child.attributes.hidden === 'true'); + v.value = (v.isTransient || !value ) ? 0 + : this.loadValue(value, object); + varFrame.vars[child.attributes.name] = v; + }); +}; + +SnapSerializer.prototype.loadCustomBlocks = function ( + object, + element, + isGlobal, + isDispatch +) { + // private + element.children.forEach(child => { + var definition, names, inputs, vars, header, code, trans, comment, i; + if (child.tag !== 'block-definition') { + return; + } + definition = new CustomBlockDefinition( + child.attributes.s || '', + object + ); + definition.category = child.attributes.category || 'other'; + if (!SpriteMorph.prototype.allCategories().includes( + definition.category + )) { + definition.category = 'other'; + } + definition.type = child.attributes.type || 'command'; + definition.isHelper = (child.attributes.helper === 'true') || false; + definition.isGlobal = (isGlobal === true); + if (isDispatch) { + object.inheritedMethodsCache.push(definition); + } else { + if (definition.isGlobal) { + object.globalBlocks.push(definition); + } else { + object.customBlocks.push(definition); + } + } + + names = definition.parseSpec(definition.spec).filter( + str => str.charAt(0) === '%' && str.length > 1 + ).map(str => str.substr(1)); + + definition.names = names; + inputs = child.childNamed('inputs'); + if (inputs) { + i = -1; + inputs.children.forEach(child => { + var options = child.childNamed('options'); + if (child.tag !== 'input') { + return; + } + i += 1; + definition.declarations.set( + names[i], + [ + child.attributes.type, + contains(['%b', '%boolUE'], child.attributes.type) ? + (child.contents ? child.contents === 'true' : null) + : child.contents, + options ? options.contents : undefined, + child.attributes.readonly === 'true', + child.attributes.irreplaceable === 'true', + child.attributes.separator + ] + ); + }); + } + + vars = child.childNamed('variables'); + if (vars) { + definition.variableNames = this.loadValue( + vars.require('list') + ).asArray(); + } + + header = child.childNamed('header'); + if (header) { + definition.codeHeader = header.contents; + } + + code = child.childNamed('code'); + if (code) { + definition.codeMapping = code.contents; + } + + trans = child.childNamed('translations'); + if (trans) { + definition.updateTranslations(trans.contents); + } + + comment = child.childNamed('comment'); + if (comment) { + definition.comment = this.loadComment(comment); + } + }); +}; + +SnapSerializer.prototype.populateCustomBlocks = function ( + object, + element, + isGlobal +) { + // private + element.children.forEach((child, index) => { + var definition, script, scripts; + if (child.tag !== 'block-definition') { + return; + } + definition = isGlobal ? object.globalBlocks[index] + : object.customBlocks[index]; + script = child.childNamed('script'); + if (script) { + definition.body = new Context( + null, + script ? this.loadScript(script, object) : null, + null, + object + ); + definition.body.inputs = definition.names.slice(0); + definition.body.comment = definition.comment?.text(); + } + scripts = child.childNamed('scripts'); + if (scripts) { + definition.scripts = this.loadScriptsArray(scripts, object); + } + + delete definition.names; + }); +}; + +SnapSerializer.prototype.loadScripts = function (object, scripts, model) { + // private + var scale = SyntaxElementMorph.prototype.scale; + scripts.cachedTexture = IDE_Morph.prototype.scriptsPaneTexture; + model.children.forEach(child => { + var element; + if (child.tag === 'script') { + element = this.loadScript(child, object); + if (!element) { + return; + } + element.setPosition(new Point( + (+child.attributes.x || 0) * scale, + (+child.attributes.y || 0) * scale + ).add(scripts.topLeft())); + scripts.add(element); + element.fixBlockColor(null, true); // force zebra coloring + element.allComments().forEach(comment => comment.align(element)); + } else if (child.tag === 'comment') { + element = this.loadComment(child); + if (!element) { + return; + } + element.setPosition(new Point( + (+child.attributes.x || 0) * scale, + (+child.attributes.y || 0) * scale + ).add(scripts.topLeft())); + scripts.add(element); + } + }); +}; + +SnapSerializer.prototype.loadScriptsArray = function (model, object) { + // private - answer an array containting the model's scripts + var scale = SyntaxElementMorph.prototype.scale, + scripts = []; + model.children.forEach(child => { + var element; + if (child.tag === 'script') { + element = this.loadScript(child, object); + if (!element) { + return; + } + element.setPosition(new Point( + (+child.attributes.x || 0) * scale, + (+child.attributes.y || 0) * scale + )); + scripts.push(element); + element.fixBlockColor(null, true); // force zebra coloring + } else if (child.tag === 'comment') { + element = this.loadComment(child); + if (!element) { + return; + } + element.setPosition(new Point( + (+child.attributes.x || 0) * scale, + (+child.attributes.y || 0) * scale + )); + scripts.push(element); + } + }); + return scripts; +}; + +SnapSerializer.prototype.loadScriptModel = function (model, object) { + // return a new script represented by the given xml model, + // note: custom block definitions referenced here must be loaded before + var script; + this.scene = new Scene(object.parentThatIsA(StageMorph)); + script = this.loadScript(model, object); + this.scene = new Scene(); + return script; +}; + +SnapSerializer.prototype.loadScript = function (model, object) { + // private + var topBlock, block, nextBlock; + + // Check whether we're importing a single script, not a script as part of a + // whole scene + if (!this.scene.stage) { + this.scene.stage = object.parentThatIsA(StageMorph); + this.scene.targetStage = this.scene.stage; + } + + model.children.forEach(child => { + nextBlock = this.loadBlock(child, false, object); + if (!nextBlock) { + return; + } + if (block) { + if (block.nextBlock && (nextBlock instanceof CommandBlockMorph)) { + block.nextBlock(nextBlock); + } else { + console.log( + 'SNAP: expecting a command but getting a reporter:\n' + + ' ' + block.blockSpec + '\n' + + ' ' + nextBlock.blockSpec + ); + return topBlock; + } + } else { + topBlock = nextBlock; + } + block = nextBlock; + }); + return topBlock; +}; + +SnapSerializer.prototype.loadComment = function (model) { + // private + var comment = new CommentMorph(model.contents), + scale = SyntaxElementMorph.prototype.scale; + comment.isCollapsed = (model.attributes.collapsed === 'true'); + comment.setTextWidth(+model.attributes.w * scale); + return comment; +}; + +SnapSerializer.prototype.loadBlock = function (model, isReporter, object) { + // private + var block, info, inputs, isGlobal, receiver, migration, + migrationOffset = 0, + migratoToVariadic = false; + + if (model.tag === 'block') { + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'var' + )) { + block = SpriteMorph.prototype.variableBlock( + model.attributes['var'] + ); + } else { + block = SpriteMorph.prototype.blockForSelector(model.attributes.s); + migration = SpriteMorph.prototype.blockMigrations[ + model.attributes.s + ]; + if (migration) { + migrationOffset = migration.offset || 0; + migratoToVariadic = migration.variadic; + } + } + } else if (model.tag === 'custom-block') { + isGlobal = model.attributes.scope ? false : true; + receiver = isGlobal ? this.scene.stage : object; + if (isGlobal) { + info = detect( + receiver.globalBlocks, + block => block.blockSpec() === model.attributes.s + ); + if (!info && this.scene.targetStage) { // importing block files + info = detect( + this.scene.targetStage.globalBlocks, + block => block.blockSpec() === model.attributes.s + ); + } + } else { + // lookup in inherited methods + info = detect( + receiver.customBlocks, + block => block.blockSpec() === model.attributes.s + ) || ( + receiver.inheritedMethodsCache ? + detect( + receiver.inheritedMethodsCache, + block => block.blockSpec() === model.attributes.s + ) + : null + ); + } + if (!info || !contains( + // catch other forks' blocks + SpriteMorph.prototype.allCategories(), info.category + )) { + return this.obsoleteBlock(isReporter); + } + block = info.type === 'command' ? new CustomCommandBlockMorph( + info, + false + ) : new CustomReporterBlockMorph( + info, + info.type === 'predicate', + false + ); + } + if (block === null) { + block = this.obsoleteBlock(isReporter); + } + block.isDraggable = true; + inputs = block.inputs(); + model.children.forEach((child, i) => { + if (child.tag === 'variables') { + this.loadVariables(block.variables, child, object); + } else if (child.tag === 'comment') { + block.comment = this.loadComment(child); + block.comment.block = block; + } else if (child.tag === 'receiver') { + nop(); // ignore + } else { + if (migratoToVariadic) { + // assume all formerly single inputs are now part of the first + // one which is variadic and already expanded to hold them + // example: migrate old infix addition to new variadic infix sum + this.loadInput( + child, + inputs[0].inputs()[i], + inputs[0], + object + ); + } else { + this.loadInput( + child, + inputs[i + migrationOffset], + block, + object + ); + } + } + }); + block.cachedInputs = null; + return block; +}; + +SnapSerializer.prototype.obsoleteBlock = function (isReporter) { + // private + var block = isReporter ? new ReporterBlockMorph() + : new CommandBlockMorph(); + block.selector = 'errorObsolete'; + block.color = new Color(200, 0, 20); + block.setSpec('Undefined!'); + block.isDraggable = true; + return block; +}; + +SnapSerializer.prototype.loadInput = function (model, input, block, object) { + // private + var inp, val, i; + if (isNil(input)) { + return; + } + if (model.tag === 'script') { + inp = this.loadScript(model, object); + if (inp) { + if (block.selector === 'reifyReporter' || + block.selector === 'reifyPredicate') { + input.replaceInput(input.children[0], inp); + input.fixLayout(); + } else { + input.add(inp); + input.fixLayout(); + } + } + } else if (model.tag === 'autolambda' && model.children[0]) { + inp = this.loadBlock(model.children[0], true, object); + if (inp) { + input.replaceInput(input.children[0], inp); + input.fixLayout(); + } + } else if (model.tag === 'list') { + while (input.inputs().length > 0 && input.removeInput) { + input.removeInput(); + } + model.children.forEach(item => { + input.addInput(); + this.loadInput( + item, + input.children[input.children.length - 2], + input, + object + ); + }); + input.fixLayout(); + for (i = input.inputs().length; i < input.minInputs; i += 1) { + input.addInput(); + } + } else if (model.tag === 'block' || model.tag === 'custom-block') { + if (input.slotSpec === '%rcv') { + // special case for migrating former SEND block inputs to + // newer BROADCAST expansion slots for receivers + // this can be removed once all SEND blocks have been + // converted to v7 + input.replaceInput( + input.inputs()[0], + this.loadBlock(model, true, object) + ); + } else { + block.replaceInput(input, this.loadBlock(model, true, object)); + } + } else if (model.tag === 'color') { + input.setColor(this.loadColor(model.contents)); + } else { + val = this.loadValue(model); + if (!isNil(val) && !isNil(input) && input.setContents) { + // checking whether "input" is nil should not + // be necessary, but apparently is after retina support + // was added. + input.setContents(val); + } + } +}; + +SnapSerializer.prototype.loadValue = function (model, object, silently) { + // private + var v, i, lst, items, el, center, image, name, audio, option, bool, origin, + wish, def, + myself = this; + + function record() { + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'id' + )) { + myself.objects[model.attributes.id] = v; + } + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'mediaID' + )) { + myself.mediaDict[model.attributes.mediaID] = v; + } + } + + switch (model.tag) { + case 'ref': + if (Object.prototype.hasOwnProperty.call(model.attributes, 'id')) { + return this.objects[model.attributes.id]; + } + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'mediaID' + )) { + return this.mediaDict[model.attributes.mediaID]; + } + throw new Error('expecting a reference id'); + case 'l': + option = model.childNamed('option'); + if (option) { + return [option.contents]; + } + bool = model.childNamed('bool'); + if (bool) { + return this.loadValue(bool); + } + wish = model.childNamed('wish'); + if (wish) { + return this.loadValue(wish); + } + return model.contents; + case 'bool': + return model.contents === 'true'; + case 'list': + if (model.attributes.hasOwnProperty('linked')) { + if (model.attributes.struct === 'atomic') { + v = Process.prototype.parseCSV(model.contents); + v.becomeLinked(); + record(); + return v; + } + v = new List(); + v.isLinked = true; + record(); + lst = v; + items = model.childrenNamed('item'); + items.forEach((item, i) => { + var value = item.children[0]; + if (!value) { + v.first = 0; + } else { + v.first = this.loadValue(value, object); + } + var tail = model.childNamed('list') || + model.childNamed('ref'); + if (tail) { + v.rest = this.loadValue(tail, object); + } else { + if (i < (items.length - 1)) { + v.rest = new List(); + v = v.rest; + v.isLinked = true; + } + } + }); + return lst; + } + if (model.attributes.struct === 'atomic') { + v = Process.prototype.parseCSV(model.contents); + record(); + return v; + } + v = new List(); + record(); + v.contents = model.childrenNamed('item').map(item => { + var value = item.children[0]; + if (!value) { + return 0; + } + return this.loadValue(value, object); + }); + return v; + case 'sprite': + v = new SpriteMorph(this.scene.globalVariables); + if (model.attributes.id) { + this.objects[model.attributes.id] = v; + } + if (model.attributes.name) { + v.name = model.attributes.name; + this.scene.spritesDict[model.attributes.name] = v; + } + if (model.attributes.idx) { + v.idx = +model.attributes.idx; + } + if (model.attributes.color) { + v.color = this.loadColor(model.attributes.color); + v.cachedColorDimensions = v.color[v.penColorModel](); + } + if (model.attributes.pen) { + v.penPoint = model.attributes.pen; + } + if (model.attributes.volume) { + v.volume = +model.attributes.volume; + } + if (model.attributes.pan) { + v.pan = +model.attributes.pan; + } + if (!silently) { + this.scene.stage.add(v); + } + v.scale = parseFloat(model.attributes.scale || '1'); + v.rotationStyle = parseFloat( + model.attributes.rotation || '1' + ); + v.isDraggable = model.attributes.draggable !== 'false'; + v.isVisible = model.attributes.hidden !== 'true'; + v.heading = parseFloat(model.attributes.heading) || 0; + if (!silently) { + v.gotoXY(+model.attributes.x || 0, +model.attributes.y || 0); + } + this.loadObject(v, model); + v.fixLayout(); + + return v; + case 'context': + v = new Context(null); + record(); + v.comment = model.childNamed('remark')?.contents; + el = model.childNamed('origin'); + if (el) { + el = el.childNamed('ref') || el.childNamed('sprite'); + if (el) { + v.origin = this.loadValue(el); + } + } + el = model.childNamed('receiver'); + if (el) { + el = el.childNamed('ref') || el.childNamed('sprite'); + if (el) { + v.receiver = this.loadValue(el); + } + } + origin = v.origin || v.receiver || object; // for local blocks look up + el = model.childNamed('script'); + if (el) { + v.expression = this.loadScript(el, origin); + } else { + el = model.childNamed('block') || + model.childNamed('custom-block'); + if (el) { + v.expression = this.loadBlock(el, null, origin); + } else { + el = model.childNamed('l'); + if (el) { + bool = el.childNamed('bool'); + if (bool) { + v.expression = new BooleanSlotMorph( + this.loadValue(bool) + ); + } else { + v.expression = new InputSlotMorph(el.contents); + } + } + } + } + if (v.expression instanceof BlockMorph) { + // bind empty slots to implicit formal parameters + i = 0; + v.expression.allEmptySlots().forEach(slot => { + i += 1; + if (slot instanceof MultiArgMorph) { + slot.bindingID = ['arguments']; + } else { + slot.bindingID = i; + } + }); + // and remember the number of detected empty slots + v.emptySlots = i; + } + el = model.childNamed('inputs'); + if (el) { + el.children.forEach(item => { + if (item.tag === 'input') { + v.inputs.push(item.contents); + } + }); + } + el = model.childNamed('variables'); + if (el) { + this.loadVariables(v.variables, el, origin); + } + el = model.childNamed('context'); + if (el) { + v.outerContext = this.loadValue(el, origin); + } + if (v.outerContext && v.receiver && + !v.outerContext.variables.parentFrame) { + v.outerContext.variables.parentFrame = v.receiver.variables; + } + return v; + case 'costume': + center = new Point(); + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'center-x' + )) { + center.x = parseFloat(model.attributes['center-x']); + } + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'center-y' + )) { + center.y = parseFloat(model.attributes['center-y']); + } + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'name' + )) { + name = model.attributes.name; + } + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'image' + )) { + image = new Image(); + if (model.attributes.image.indexOf('data:image/svg+xml') === 0 + && !MorphicPreferences.rasterizeSVGs) { + v = new SVG_Costume(null, name, center); + image.onload = function () { + v.contents = image; + v.version = +new Date(); + if (typeof v.loaded === 'function') { + v.loaded(); + } else { + v.loaded = true; + } + }; + } else { + v = new Costume(null, name, center); + image.onload = function () { + var canvas = newCanvas( + new Point(image.width, image.height), + true // nonRetina + ), + context = canvas.getContext('2d'); + context.drawImage(image, 0, 0); + v.contents = canvas; + v.version = +new Date(); + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'embed' + )) { + v.embeddedData = model.attributes.embed; + } + if (typeof v.loaded === 'function') { + v.loaded(); + } else { + v.loaded = true; + } + }; + } + image.src = model.attributes.image; + } + record(); + return v; + case 'sound': + audio = new Audio(); + v = new Sound(audio, model.attributes.name); + audio.oncanplaythrough = () => v.loaded = true; + audio.src = model.attributes.sound; + if (Object.prototype.hasOwnProperty.call( + model.attributes, + 'mediaID' + )) { + this.mediaDict[model.attributes.mediaID] = v; + } + record(); + return v; + case 'wish': + def = new CustomBlockDefinition(model.attributes.s); + def.type = model.attributes.type; + def.category = model.attributes.category; + def.storedSemanticSpec = model.attributes.s; + def.updateTranslations(model.contents); + return def.blockInstance(true); // include translations + } + return undefined; +}; + +SnapSerializer.prototype.loadColor = function (colorString) { + // private + var c = (colorString || '').split(','); + return new Color( + parseFloat(c[0]), + parseFloat(c[1]), + parseFloat(c[2]), + parseFloat(c[3]) + ); +}; + +SnapSerializer.prototype.loadPalette = function (model) { + // private + var p = new Map(); + model.childrenNamed('category').forEach(node => + p.set(node.attributes.name, this.loadColor(node.attributes.color)) + ); + return p; +}; + +// SnapSerializer XML-representation of objects: + +SnapSerializer.prototype.paletteToXML = function (aMap) { + var xml; + if (aMap.size === 0) {return ''; } + xml = ''; + aMap.forEach((value, key) => { + xml += this.format( + '', + key, + value.r, + value.g, + value.b, + value.a + ); + }); + xml += ''; + return xml; +}; + +// Generics + +Array.prototype.toXML = function (serializer) { + return this.reduce( + (xml, item) => xml + serializer.store(item), + '' + ); +}; + +// Scenes & multi-scene projects + +Project.prototype.toXML = function (serializer) { + var thumbdata; + + // thumb data catch cross-origin tainting exception when using SVG costumes + try { + thumbdata = this.thumbnail.toDataURL('image/png'); + } catch (error) { + thumbdata = null; + } + + return serializer.format( + '' + + '$' + + '$' + + '%' + + '', + this.name || localize('Untitled'), + serializer.app, + serializer.version, + this.notes || '', + thumbdata, + this.scenes.asArray().indexOf( + this.currentScene) + 1, + serializer.store(this.scenes.itemsArray()) + ); +}; + +Scene.prototype.toXML = function (serializer) { + var xml; + + function code(key) { + var str = ''; + Object.keys(StageMorph.prototype[key]).forEach( + selector => { + str += ( + '<' + selector + '>' + + XML_Element.prototype.escape( + StageMorph.prototype[key][selector] + ) + + '' + ); + } + ); + return str; + } + + serializer.scene = this; // keep the order of sprites in the corral + + xml = serializer.format( + '' + + '$' + + '%' + + '$' + + '%' + + '%' + + '%' + + '%' + // stage + '%' + + '', + this.name || localize('Untitled'), + this.unifiedPalette ? ' palette="single"' : '', + this.unifiedPalette && !this.showCategories ? + ' categories="false"' : '', + this.unifiedPalette && !this.showPaletteButtons ? + ' buttons="false"' : '', + this.disableClickToRun ? ' clickrun="false"' : '', + this.disableDraggingData ? ' dragdata="false"' : '', + this.penColorModel === 'hsl' ? ' colormodel="hsl"' : '', + this.notes || '', + serializer.paletteToXML(this.customCategories), + Object.keys(this.hiddenPrimitives).reduce( + (a, b) => a + ' ' + b, + '' + ), + code('codeHeaders'), + code('codeMappings'), + serializer.store(this.stage.globalBlocks), + serializer.store(this.stage), + serializer.store(this.globalVariables) + ); + return xml; +}; + +// Sprites + +StageMorph.prototype.toXML = function (serializer) { + var costumeIdx = this.getCostumeIdx(); + + this.removeAllClones(); + return serializer.format( + '' + + '$' + + '%' + // current costume, if it's not in the wardrobe + '%' + + '%' + + '%' + + '%' + + '%' + + '%' + + '', + this.name, + this.dimensions.x, + this.dimensions.y, + costumeIdx, + this.color.r, + this.color.g, + this.color.b, + this.color.a, + this.getTempo(), + this.isThreadSafe, + this.enablePenLogging, + this.instrument ? + ' instrument="' + parseInt(this.instrument) + '" ' : '', + this.volume, + this.pan, + SpriteMorph.prototype.useFlatLineEnds ? 'flat' : 'round', + BooleanSlotMorph.prototype.isTernary, + Process.prototype.enableHyperOps === true, + this.enableCodeMapping, + this.enableInheritance, + this.enableSublistIDs, + normalizeCanvas(this.trailsCanvas, true).toDataURL('image/png'), + + // current costume, if it's not in the wardrobe + !costumeIdx && this.costume ? + '' + serializer.store(this.costume) + '' + : '', + + serializer.store(this.costumes, this.name + '_cst'), + serializer.store(this.sounds, this.name + '_snd'), + serializer.store(this.variables), + serializer.store(this.customBlocks), + serializer.store(this.scripts), + serializer.root.sprites.asArray().indexOf( + serializer.root.currentSprite) + 1, + serializer.store(this.children) + ); +}; + +StageMorph.prototype.toSpriteXML = function (serializer) { + // special case: export the stage as a sprite, so it can be + // imported into another project or scene + var costumeIdx = this.getCostumeIdx(); + + return serializer.format( + '' + + '%' + // current costume + '%' + + '%' + + '%' + + '%' + + '%' + + '', + this.name, + this.volume, + this.pan, + this.instrument ? + ' instrument="' + parseInt(this.instrument) + '" ' : '', + costumeIdx, + + // current costume, if it's not in the wardrobe + !costumeIdx && this.costume ? + '' + serializer.store(this.costume) + '' + : '', + + serializer.store(this.costumes, this.name + '_cst'), + serializer.store(this.sounds, this.name + '_snd'), + !this.customBlocks ? '' : serializer.store(this.customBlocks), + serializer.store(this.variables), + serializer.store(this.scripts) + ); +}; + +SpriteMorph.prototype.toXML = function (serializer) { + var idx = serializer.scene.sprites.asArray().indexOf(this) + 1, + costumeIdx = this.getCostumeIdx(), + noCostumes = this.inheritsAttribute('costumes'), + noSounds = this.inheritsAttribute('sounds'), + noScripts = this.inheritsAttribute('scripts'); + + return serializer.format( + '' + + '%' + // solution info + '%' + // inheritance info + '%' + // nesting info + '%' + // current costume + (noCostumes ? '%' : '%') + + (noSounds ? '%' : '%') + + '%' + + '%' + + (this.exemplar ? '%' : '%') + + (noScripts ? '%' : '%') + + '', + this.name, + idx, + this.xPosition(), + this.yPosition(), + this.heading, + this.scale, + this.volume, + this.pan, + this.rotationStyle, + this.instrument ? + ' instrument="' + parseInt(this.instrument) + '" ' : '', + this.isDraggable, + this.isVisible ? '' : ' hidden="true"', + costumeIdx, + this.color.r, + this.color.g, + this.color.b, + this.color.a, + this.penPoint, + + // solution info + this.solution + ? '' + serializer.store(this.solution) + '' + : '', + + // inheritance info + this.exemplar + ? '' + + (this.inheritedAttributes.length ? + serializer.store(new List(this.inheritedAttributes)) + : '') + + '' + : '', + + // nesting info + this.anchor + ? '' + : '', + + // current costume, if it's not in the wardrobe + !costumeIdx && this.costume ? + '' + serializer.store(this.costume) + '' + : '', + + noCostumes ? '' : serializer.store(this.costumes, this.name + '_cst'), + noSounds ? '' : serializer.store(this.sounds, this.name + '_snd'), + !this.customBlocks ? '' : serializer.store(this.customBlocks), + serializer.store(this.variables), + this.exemplar ? serializer.store(this.inheritedMethods()) : '', + noScripts ? '' : serializer.store(this.scripts) + ); +}; + +Costume.prototype[XML_Serializer.prototype.mediaDetectionProperty] = true; + +Costume.prototype.toXML = function (serializer) { + return serializer.format( + '', + this.name, + this.rotationCenter.x, + this.rotationCenter.y, + this instanceof SVG_Costume ? this.contents.src + : normalizeCanvas(this.contents).toDataURL('image/png'), + this.embeddedData ? serializer.format(' embed="@"', this.embeddedData) + : '' + ); +}; + +Sound.prototype[XML_Serializer.prototype.mediaDetectionProperty] = true; + +Sound.prototype.toXML = function (serializer) { + return serializer.format( + '', + this.name, + this.toDataURL() + ); +}; + +VariableFrame.prototype.toXML = function (serializer) { + return Object.keys(this.vars).reduce((vars, v) => { + var val = this.vars[v].value, + transient = this.vars[v].isTransient, + hidden = this.vars[v].isHidden, + dta; + + if (transient || val === undefined || val === null) { + dta = serializer.format( + '

@
' + + '@' + + '@' + + '%%%' + + '', + this.spec, + this.type, + this.category || 'other', + this.isHelper ? ' helper="true"' : '', + this.comment ? this.comment.toXML(serializer) : '', + (this.variableNames.length ? + serializer.store(new List(this.variableNames)) : ''), + this.codeHeader || '', + this.codeMapping || '', + this.translationsAsText(), + Array.from(this.declarations.keys()).reduce((xml, decl) => { + // to be refactored now that we've moved to ES6 Map: + return xml + serializer.format( + '$%', + this.declarations.get(decl)[0], + this.declarations.get(decl)[3] ? + ' readonly="true"' : '', + this.declarations.get(decl)[4] ? + ' irreplaceable="true"' : '', + this.declarations.get(decl)[5] ? + ' separator="' + + this.declarations.get(decl)[5] + + '"' + : '', + this.declarations.get(decl)[1], + this.declarations.get(decl)[2] ? + serializer.format( + '@', + this.declarations.get(decl)[2] + ) : '' + ); + }, ''), + this.body ? serializer.store(this.body.expression) : '', + this.scripts.length > 0 ? + '' + encodeScripts(this.scripts) + '' + : '' + ); +}; + +// Scripts - Inputs + +ArgMorph.prototype.toXML = function () { + return ''; // empty by default +}; + +BooleanSlotMorph.prototype.toXML = function () { + return (typeof this.value === 'boolean') ? + '' + this.value + '' + : ''; + +}; + +InputSlotMorph.prototype.toXML = function (serializer) { + if (this.selectedBlock) { + return serializer.format( + '@', + this.selectedBlock.semanticSpec, + this.selectedBlock instanceof CommandBlockMorph ? 'command' + : (this.selectedBlock.isPredicate ? 'predicate' : 'reporter'), + this.selectedBlock.category, + this.selectedBlock.storedTranslations + ); + } + if (this.constant) { + return serializer.format( + '', + this.constant + ); + } + return serializer.format('$', this.contents().text); +}; + +TemplateSlotMorph.prototype.toXML = function (serializer) { + return serializer.format('$', this.contents()); +}; + +CommandSlotMorph.prototype.toXML = function (serializer) { + var block = this.nestedBlock(); + if (block instanceof BlockMorph) { + if (block instanceof ReporterBlockMorph) { + return serializer.format( + '%', + serializer.store(block) + ); + } + return serializer.store(block); + } + return ''; +}; + +FunctionSlotMorph.prototype.toXML = CommandSlotMorph.prototype.toXML; + +MultiArgMorph.prototype.toXML = function (serializer) { + return serializer.format( + '%', + serializer.store(this.inputs()) + ); +}; + +ArgLabelMorph.prototype.toXML = function (serializer) { + return serializer.format( + '%', + serializer.store(this.inputs()[0]) + ); +}; + +ColorSlotMorph.prototype.toXML = function (serializer) { + return serializer.format( + '$,$,$,$', + this.color.r, + this.color.g, + this.color.b, + this.color.a + ); +}; + +// Values + +List.prototype.toXML = function (serializer, mediaContext) { + // mediaContext is an optional name-stub + // when collecting media into a separate module + var xml, value; + + if (this.hasOnlyAtomicData() && + (!this.isLinked || !StageMorph.prototype.enableSublistIDs)) { + // special case for a less cluttered format + return serializer.format( + '@', + this.asCSV() + ); + } + + if (this.isLinked) { + if (StageMorph.prototype.enableSublistIDs) { + // recursively nest tails: + xml = ''; + value = this.first; + if (!isNil(value)) { + xml += serializer.format( + '%', + typeof value === 'object' ? + (isSnapObject(value) ? '' + : serializer.store(value, mediaContext)) + : typeof value === 'boolean' ? + serializer.format('$', value) + : serializer.format('$', value) + ); + } + if (!isNil(this.rest)) { + xml += serializer.store(this.rest, mediaContext); + } + return xml + ''; + } + // else shallow copy as array and mark as linked: + return serializer.format( + '%', + this.itemsArray().reduce((xml, item) => { + return xml + serializer.format( + '%', + typeof item === 'object' ? + (isSnapObject(item) ? '' + : serializer.store(item, mediaContext)) + : typeof item === 'boolean' ? + serializer.format('$', item) + : serializer.format('$', item) + ); + }, '') + ); + } + // dynamic array: + return serializer.format( + '%', + this.contents.reduce((xml, item) => { + return xml + serializer.format( + '%', + typeof item === 'object' ? + (isSnapObject(item) ? '' + : serializer.store(item, mediaContext)) + : typeof item === 'boolean' ? + serializer.format('$', item) + : serializer.format('$', item) + ); + }, '') + ); +}; + +Context.prototype.toXML = function (serializer) { + if (this.isContinuation) { // continuations are transient in Snap! + return ''; + } + return serializer.format( + '%%%' + + '%%%%', + this.inputs.reduce( + (xml, input) => xml + (input.toXML ? + serializer.format( + '%', + input.toXML(serializer) + ) : serializer.format('$', input)), + '' + ), + this.variables ? serializer.store(this.variables) : '', + this.comment ? + '' + serializer.escape(this.comment) + '' + : '', + this.expression ? serializer.store(this.expression) : '', + this.receiver ? serializer.store(this.receiver) : '', + this.receiver ? serializer.store(this.origin) : '', + this.outerContext ? serializer.store(this.outerContext) : '' + ); +}; + +// Comments + +CommentMorph.prototype.toXML = function (serializer) { + var position, + scale = SyntaxElementMorph.prototype.scale; + + if (this.block) { // attached to a block + return serializer.format( + '%', + this.textWidth() / scale, + this.isCollapsed, + serializer.escape(this.text()) + ); + } + + // free-floating, determine my save-position + if (this.parent) { + position = this.topLeft().subtract(this.parent.topLeft()); + } else { + position = this.topLeft(); + } + return serializer.format( + '%', + position.x / scale, + position.y / scale, + this.textWidth() / scale, + this.isCollapsed, + serializer.escape(this.text()) + ); +}; diff --git a/elements/pl-snap/Snap/src/symbols.js b/elements/pl-snap/Snap/src/symbols.js new file mode 100644 index 00000000..e07d2b34 --- /dev/null +++ b/elements/pl-snap/Snap/src/symbols.js @@ -0,0 +1,2446 @@ +/* + + symbols.js + + graphical GUI-symbols for for morphic.js and Snap! + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js + + + credits: + -------- + additional symbols have been contributed by members of the Snap! + open-source community, especially by Bernat Romagosa + +*/ + +/*global modules, Morph, Point, radians, ZERO, BLACK*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.symbols = '2024-January-18'; + +var SymbolMorph; + +// SymbolMorph ////////////////////////////////////////////////////////// + +/* + I display graphical symbols, such as special letters. I have been + called into existence out of frustration about not being able to + consistently use Unicode characters to the same ends. + + Symbols can also display costumes, if one is specified in lieu + of a name property, although this feature is currently not being + used because of asynchronous image loading issues. + */ + +// SymbolMorph inherits from Morph: + +SymbolMorph.prototype = new Morph(); +SymbolMorph.prototype.constructor = SymbolMorph; +SymbolMorph.uber = Morph.prototype; + +// SymbolMorph available symbols: + +SymbolMorph.prototype.names = [ + 'square', + 'pointRight', + 'stepForward', + 'gears', + 'gearPartial', + 'gearBig', + 'file', + 'fullScreen', + 'grow', + 'normalScreen', + 'shrink', + 'smallStage', + 'normalStage', + 'turtle', + 'turtleOutline', + 'stage', + 'pause', + 'flag', + 'octagon', + 'cloud', + 'cloudGradient', + 'cloudOutline', + 'turnRight', + 'turnLeft', + 'turnAround', + 'storage', + 'poster', + 'flash', + 'brush', + 'tick', + 'checkedBox', + 'rectangle', + 'rectangleSolid', + 'circle', + 'circleSolid', + 'dot', + 'ellipse', + 'line', + 'cross', + 'crosshairs', + 'paintbucket', + 'eraser', + 'pipette', + 'speechBubble', + 'speechBubbleOutline', + 'loop', + 'turnBack', + 'turnForward', + 'arrowUp', + 'arrowUpOutline', + 'arrowUpThin', + 'arrowUpDownThin', + 'arrowLeft', + 'arrowLeftOutline', + 'arrowLeftThin', + 'arrowLeftRightThin', + 'arrowDown', + 'arrowDownOutline', + 'arrowDownThin', + 'arrowRight', + 'arrowRightOutline', + 'arrowRightThin', + 'robot', + 'magnifyingGlass', + 'magnifierOutline', + 'selection', + 'polygon', + 'closedBrush', + 'notes', + 'camera', + 'location', + 'footprints', + 'keyboard', + 'keyboardFilled', + 'globe', + 'globeBig', + 'list', + 'listNarrow', + 'verticalEllipsis', + 'flipVertical', + 'flipHorizontal', + 'trash', + 'trashFull' +]; + +// SymbolMorph instance creation: + +function SymbolMorph(name, size, color, shadowOffset, shadowColor, bg) { + this.init(name, size, color, shadowOffset, shadowColor, bg); +} + +SymbolMorph.prototype.init = function ( + name, + size, + color, + shadowOffset, + shadowColor, + bg +) { + this.isProtectedLabel = false; // participate in zebraing + this.isReadOnly = true; + this.name = name || 'square'; + this.size = size || 50; + this.shadowOffset = shadowOffset || ZERO; + this.shadowColor = shadowColor || null; + SymbolMorph.uber.init.call(this); + this.color = color || BLACK; + this.backgroundColor = bg || null; + this.fixLayout(); + this.rerender(); +}; + +// SymbolMorph string representation: 'a SymbolMorph: "square"' + +SymbolMorph.prototype.toString = function () { + return 'a ' + + (this.constructor.name || + this.constructor.toString().split(' ')[1].split('(')[0]) + + ': "' + + this.name + + '" ' + + this.bounds; +}; + +// SymbolMorph zebra coloring: + +SymbolMorph.prototype.setLabelColor = function ( + textColor, + shadowColor, + shadowOffset +) { + this.shadowOffset = shadowOffset || new Point(); + this.shadowColor = shadowColor; + this.setColor(textColor); +}; + +// SymbolMorph dynamic coloring: + +SymbolMorph.prototype.getShadowRenderColor = function () { + // answer the shadow rendering color, can be overridden for my children + return this.shadowColor; +}; + +// SymbolMorph layout: + +SymbolMorph.prototype.setExtent = function (aPoint) { + if (this.size === aPoint.y) {return; } + this.changed(); + this.size = aPoint.y; + this.fixLayout(); + this.rerender(); +}; + +SymbolMorph.prototype.fixLayout = function () { + // determine my extent + this.bounds.setWidth(this.symbolWidth() + Math.abs(this.shadowOffset.x)); + this.bounds.setHeight(this.size + Math.abs(this.shadowOffset.y)); +}; + +// SymbolMorph displaying: + +SymbolMorph.prototype.render = function (ctx) { + var sx = this.shadowOffset.x < 0 ? 0 : this.shadowOffset.x, + sy = this.shadowOffset.y < 0 ? 0 : this.shadowOffset.y, + x = this.shadowOffset.x < 0 ? Math.abs(this.shadowOffset.x) : 0, + y = this.shadowOffset.y < 0 ? Math.abs(this.shadowOffset.y) : 0; + + if (this.backgroundColor) { + ctx.save(); + ctx.fillStyle = this.backgroundColor.toString(); + ctx.fillRect(0, 0, this.symbolWidth(), this.size); + ctx.restore(); + } + if (this.shadowColor) { + ctx.save(); + ctx.translate(sx, sy); + this.renderShape(ctx, this.getShadowRenderColor()); + ctx.restore(); + } + ctx.save(); + ctx.translate(x, y); + this.renderShape(ctx, this.getRenderColor()); + ctx.restore(); +}; + +SymbolMorph.prototype.renderShape = function (ctx, aColor) { + // private + switch (this.name) { + case 'square': + this.renderSymbolStop(ctx, aColor); + break; + case 'pointRight': + this.renderSymbolPointRight(ctx, aColor); + break; + case 'stepForward': + this.renderSymbolStepForward(ctx, aColor); + break; + case 'gears': + this.renderSymbolGears(ctx, aColor); + break; + case 'gearBig': + this.renderSymbolGearBig(ctx, aColor); + break; + case 'gearPartial': + this.renderSymbolGearPartial(ctx, aColor); + break; + case 'file': + this.renderSymbolFile(ctx, aColor); + break; + case 'fullScreen': + this.renderSymbolFullScreen(ctx, aColor); + break; + case 'grow': + this.renderSymbolGrow(ctx, aColor); + break; + case 'normalScreen': + this.renderSymbolNormalScreen(ctx, aColor); + break; + case 'smallStage': + this.renderSymbolSmallStage(ctx, aColor); + break; + case 'normalStage': + this.renderSymbolNormalStage(ctx, aColor); + break; + case 'shrink': + this.renderSymbolShrink(ctx, aColor); + break; + case 'turtle': + this.renderSymbolTurtle(ctx, aColor); + break; + case 'turtleOutline': + this.renderSymbolTurtleOutline(ctx, aColor); + break; + case 'stage': + this.renderSymbolStop(ctx, aColor); + break; + case 'pause': + this.renderSymbolPause(ctx, aColor); + break; + case 'flag': + this.renderSymbolFlag(ctx, aColor); + break; + case 'octagon': + this.renderSymbolOctagon(ctx, aColor); + break; + case 'cloud': + this.renderSymbolCloud(ctx, aColor); + break; + case 'cloudGradient': + this.renderSymbolCloudGradient(ctx, aColor); + break; + case 'cloudOutline': + this.renderSymbolCloudOutline(ctx, aColor); + break; + case 'turnRight': + this.renderSymbolTurnRight(ctx, aColor); + break; + case 'turnLeft': + this.renderSymbolTurnLeft(ctx, aColor); + break; + case 'turnAround': + this.renderSymbolTurnAround(ctx, aColor); + break; + case 'storage': + this.renderSymbolStorage(ctx, aColor); + break; + case 'poster': + this.renderSymbolPoster(ctx, aColor); + break; + case 'flash': + this.renderSymbolFlash(ctx, aColor); + break; + case 'brush': + this.renderSymbolBrush(ctx, aColor); + break; + case 'tick': + this.renderSymbolTick(ctx, aColor); + break; + case 'checkedBox': + this.renderSymbolCheckedBox(ctx, aColor); + break; + case 'rectangle': + this.renderSymbolRectangle(ctx, aColor); + break; + case 'rectangleSolid': + this.renderSymbolRectangleSolid(ctx, aColor); + break; + case 'circle': + this.renderSymbolCircle(ctx, aColor); + break; + case 'circleSolid': + this.renderSymbolCircleSolid(ctx, aColor); + break; + case 'dot': + this.renderSymbolCircleSolid(ctx, aColor); + break; + case 'ellipse': + this.renderSymbolCircle(ctx, aColor); + break; + case 'line': + this.renderSymbolLine(ctx, aColor); + break; + case 'cross': + this.renderSymbolCross(ctx, aColor); + break; + case 'crosshairs': + this.renderSymbolCrosshairs(ctx, aColor); + break; + case 'paintbucket': + this.renderSymbolPaintbucket(ctx, aColor); + break; + case 'eraser': + this.renderSymbolEraser(ctx, aColor); + break; + case 'pipette': + this.renderSymbolPipette(ctx, aColor); + break; + case 'speechBubble': + this.renderSymbolSpeechBubble(ctx, aColor); + break; + case 'speechBubbleOutline': + this.renderSymbolSpeechBubbleOutline(ctx, aColor); + break; + case 'loop': + this.renderSymbolLoop(ctx, aColor); + break; + case 'turnBack': + this.renderSymbolTurnBack(ctx, aColor); + break; + case 'turnForward': + this.renderSymbolTurnForward(ctx, aColor); + break; + case 'arrowUp': + this.renderSymbolArrowUp(ctx, aColor); + break; + case 'arrowUpOutline': + this.renderSymbolArrowUpOutline(ctx, aColor); + break; + case 'arrowUpThin': + this.renderSymbolArrowUpThin(ctx, aColor); + break; + case 'arrowUpDownThin': + this.renderSymbolArrowUpDownThin(ctx, aColor); + break; + case 'arrowLeft': + this.renderSymbolArrowLeft(ctx, aColor); + break; + case 'arrowLeftOutline': + this.renderSymbolArrowLeftOutline(ctx, aColor); + break; + case 'arrowLeftThin': + this.renderSymbolArrowLeftThin(ctx, aColor); + break; + case 'arrowLeftRightThin': + this.renderSymbolArrowLeftRightThin(ctx, aColor); + break; + case 'arrowDown': + this.renderSymbolArrowDown(ctx, aColor); + break; + case 'arrowDownOutline': + this.renderSymbolArrowDownOutline(ctx, aColor); + break; + case 'arrowDownThin': + this.renderSymbolArrowDownThin(ctx, aColor); + break; + case 'arrowRight': + this.renderSymbolArrowRight(ctx, aColor); + break; + case 'arrowRightOutline': + this.renderSymbolArrowRightOutline(ctx, aColor); + break; + case 'arrowRightThin': + this.renderSymbolArrowRightThin(ctx, aColor); + break; + case 'robot': + this.renderSymbolRobot(ctx, aColor); + break; + case 'magnifyingGlass': + this.renderSymbolMagnifyingGlass(ctx, aColor); + break; + case 'magnifierOutline': + this.renderSymbolMagnifierOutline(ctx, aColor); + break; + case 'selection': + this.renderSymbolSelection(ctx, aColor); + break; + case 'polygon': + this.renderSymbolOctagonOutline(ctx, aColor); + break; + case 'closedBrush': + this.renderSymbolClosedBrushPath(ctx, aColor); + break; + case 'notes': + this.renderSymbolNotes(ctx, aColor); + break; + case 'camera': + this.renderSymbolCamera(ctx, aColor); + break; + case 'location': + this.renderSymbolLocation(ctx, aColor); + break; + case 'footprints': + this.renderSymbolFootprints(ctx, aColor); + break; + case 'keyboard': + this.renderSymbolKeyboard(ctx, aColor); + break; + case 'keyboardFilled': + this.renderSymbolKeyboardFilled(ctx, aColor); + break; + case 'globe': + this.renderSymbolGlobe(ctx, aColor); + break; + case 'globeBig': + this.renderSymbolGlobeBig(ctx, aColor); + break; + case 'list': + case 'listNarrow': + this.renderSymbolList(ctx, aColor); + break; + case 'verticalEllipsis': + this.renderSymbolVerticalEllipsis(ctx, aColor); + break; + case 'flipVertical': + this.renderSymbolFlipVertical(ctx, aColor); + break; + case 'flipHorizontal': + this.renderSymbolFlipHorizontal(ctx, aColor); + break; + case 'trash': + this.renderSymbolTrash(ctx, aColor); + break; + case 'trashFull': + this.renderSymbolTrashFull(ctx, aColor); + break; + default: + throw new Error('unknown symbol name: "' + this.name + '"'); + } +}; + +SymbolMorph.prototype.symbolWidth = function () { + // private + var size = this.size; + + switch (this.name) { + case 'pointRight': + return Math.sqrt(size * size - Math.pow(size / 2, 2)); + case 'verticalEllipsis': + return size * 0.2; + case 'dot': + return size * 0.4; + case 'listNarrow': + return size * 0.5; + case 'location': + return size * 0.6; + case 'flash': + case 'file': + case 'list': + return size * 0.8; + case 'smallStage': + case 'normalStage': + return size * 1.2; + case 'turtle': + case 'turtleOutline': + case 'stage': + return size * 1.3; + case 'cloud': + case 'cloudGradient': + case 'cloudOutline': + case 'turnBack': + case 'turnForward': + case 'keyboard': + case 'keyboardFilled': + return size * 1.6; + case 'turnRight': + case 'turnLeft': + return size / 3 * 2; + case 'loop': + return size * 2; + default: + return size; + } +}; + +SymbolMorph.prototype.renderSymbolStop = function (ctx, color) { + // draw a vertically centered square + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, this.symbolWidth(), this.size); +}; + +SymbolMorph.prototype.renderSymbolPointRight = function (ctx, color) { + // draw a right-pointing, equilateral triangle + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(this.symbolWidth(), Math.round(this.size / 2)); + ctx.lineTo(0, this.size); + ctx.lineTo(0, 0); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolStepForward = function (ctx, color) { + // draw a right-pointing triangle + // followed by a vertical bar + var w = this.symbolWidth(), + h = this.size; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w * 0.75, Math.round(h / 2)); + ctx.lineTo(0, h); + ctx.lineTo(0, 0); + ctx.closePath(); + ctx.fill(); + ctx.fillRect( + w * 0.75, + 0, + w * 0.25, + h + ); +}; + +SymbolMorph.prototype.renderSymbolGears = function (ctx, color) { + // draw gears + var w = this.symbolWidth(), + r = w / 2, + spikes = 8, + off = 8, + shift = 10, + angle, turn, i; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + + // draw the spiked outline + ctx.moveTo(w, r); + angle = 360 / spikes; + turn = angle * 0.5; + for (i = 0; i < spikes; i += 1) { + ctx.arc( + r, + r, + r, + radians(i * angle + turn), + radians(i * angle + off + turn) + ); + ctx.arc( + r, + r, + r * 0.7, + radians(i * angle - shift + angle * 0.5 + turn), + radians(i * angle + shift + angle * 0.5 + turn) + ); + ctx.arc( + r, + r, + r, + radians((i + 1) * angle - off + turn), + radians((i + 1) * angle + turn) + ); + } + ctx.lineTo(w, r); + + // draw the hole in the middle + ctx.arc(r, r, r * 0.3, radians(0), radians(360)); + + // fill + ctx.clip('evenodd'); + ctx.fillRect(0, 0, w, w); +}; + +SymbolMorph.prototype.renderSymbolGearBig = function (ctx, color) { + // draw a large gear + var w = this.symbolWidth(), + r = w / 2, + spikes = 10, + off = 7, + shift = 8, + angle, i; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + + // draw the spiked outline + ctx.moveTo(w, r); + angle = 360 / spikes; + for (i = 0; i < spikes; i += 1) { + ctx.arc( + r, + r, + r, + radians(i * angle), + radians(i * angle + off) + ); + ctx.arc( + r, + r, + r * 0.8, + radians(i * angle - shift + angle * 0.5), + radians(i * angle + shift + angle * 0.5) + ); + ctx.arc( + r, + r, + r, + radians((i + 1) * angle - off), + radians((i + 1) * angle) + ); + } + ctx.lineTo(w, r); + + // draw the holes in the middle + ctx.arc(r, r, r * 0.6, radians(0), radians(360)); + ctx.arc(r, r, r * 0.2, radians(0), radians(360)); + + // fill + ctx.clip('evenodd'); + ctx.fillRect(0, 0, w, w); +}; + +SymbolMorph.prototype.renderSymbolGearPartial = function (ctx, color) { + // draw gears + var w = this.symbolWidth(), + r = w * 0.75, + spikes = 8, + off = 8, + shift = 10, + angle, turn, i; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + + // draw the spiked outline + ctx.moveTo(w, r); + angle = 360 / spikes; + turn = angle * 0.5; + for (i = 0; i < spikes; i += 1) { + ctx.arc( + r, + r, + r, + radians(i * angle + turn), + radians(i * angle + off + turn) + ); + ctx.arc( + r, + r, + r * 0.7, + radians(i * angle - shift + angle * 0.5 + turn), + radians(i * angle + shift + angle * 0.5 + turn) + ); + ctx.arc( + r, + r, + r, + radians((i + 1) * angle - off + turn), + radians((i + 1) * angle + turn) + ); + } + ctx.lineTo(w, r); + + // draw the hole in the middle + ctx.arc(r, r, r * 0.3, radians(0), radians(360)); + + // fill + ctx.clip('evenodd'); + ctx.fillRect(0, 0, w, w); +}; + +SymbolMorph.prototype.renderSymbolFile = function (ctx, color) { + // draw a page symbol + var height = this.size, + width = this.symbolWidth(), + w = Math.min(width, height) / 2; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w, 0); + ctx.lineTo(w, w); + ctx.lineTo(width, w); + ctx.lineTo(width, height); + ctx.lineTo(0, height); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.darker(25).toString(); + ctx.beginPath(); + ctx.moveTo(w, 0); + ctx.lineTo(width, w); + ctx.lineTo(w, w); + ctx.lineTo(w, 0); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolFullScreen = function (ctx, color) { + // draw two arrows pointing diagonally outwards + var h = this.size, + width = this.symbolWidth(), + c = width / 2, + off = width / 20, + w = width / 2; + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = width / 5; + ctx.beginPath(); + ctx.moveTo(c - off, c + off); +// ctx.lineTo(0, h); + ctx.lineTo(off * 2, h - off * 2); + ctx.stroke(); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = width / 5; + ctx.beginPath(); + ctx.moveTo(c + off, c - off); + ctx.lineTo(h - off * 2, off * 2); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, h); + ctx.lineTo(0, h - w); + ctx.lineTo(w, h); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(h, 0); + ctx.lineTo(h - w, 0); + ctx.lineTo(h, w); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolGrow = function (ctx, color) { + + var h = this.size, + width = this.symbolWidth(), + c = width / 2, + off = width / 20, + w = width / 3; + + function arrows() { + ctx.strokeStyle = color.toString(); + ctx.lineWidth = width / 7; + ctx.beginPath(); + ctx.moveTo(c - off * 3, c + off * 3); + ctx.lineTo(off * 2, h - off * 2); + ctx.stroke(); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = width / 7; + ctx.beginPath(); + ctx.moveTo(c + off * 3 , c - off * 3); + ctx.lineTo(h - off * 2, off * 2); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, h); + ctx.lineTo(0, h - w); + ctx.lineTo(w, h); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(h, 0); + ctx.lineTo(h - w, 0); + ctx.lineTo(h, w); + ctx.closePath(); + ctx.fill(); + } + + // draw four arrows pointing diagonally outwards + arrows(); + ctx.translate(this.size, 0); + ctx.rotate(radians(90)); + arrows(); +}; + + +SymbolMorph.prototype.renderSymbolNormalScreen = function (ctx, color) { + var h = this.size, + w = this.symbolWidth(), + c = w / 2, + off = w / 20; + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = w / 5; + ctx.beginPath(); + ctx.moveTo(c - off * 3, c + off * 3); + ctx.lineTo(off, h - off); + ctx.stroke(); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = w / 5; + ctx.beginPath(); + ctx.moveTo(c + off * 3, c - off * 3); + ctx.lineTo(h - off, off); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(c + off, c - off); + ctx.lineTo(w, c - off); + ctx.lineTo(c + off, 0); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(c - off, c + off); + ctx.lineTo(0, c + off); + ctx.lineTo(c - off, w); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolShrink = function (ctx, color) { + // draw 4 arrows pointing diagonally inwards + var h = this.size, + w = this.symbolWidth(), + c = w / 2, + off = w / 20; + + function arrows() { + ctx.strokeStyle = color.toString(); + ctx.lineWidth = w / 8; + ctx.beginPath(); + ctx.moveTo(c - off * 3, c + off * 3); + ctx.lineTo(off, h - off); + ctx.stroke(); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = w / 8; + ctx.beginPath(); + ctx.moveTo(c + off * 3, c - off * 3); + ctx.lineTo(h - off, off); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(c + off * 2, c - off * 2); + ctx.lineTo(w - off, c - off * 2); + ctx.lineTo(c + off * 2, 0 + off); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(c - off * 2, c + off * 2); + ctx.lineTo(0 + off, c + off * 2); + ctx.lineTo(c - off * 2, w - off); + ctx.closePath(); + ctx.fill(); + } + + arrows(); + ctx.translate(this.size, 0); + ctx.rotate(radians(90)); + arrows(); +}; + +SymbolMorph.prototype.renderSymbolSmallStage = function (ctx, color) { + // draw a stage toggling symbol + var w = this.symbolWidth(), + h = this.size, + w2 = w / 2, + h2 = h / 2; + + ctx.fillStyle = color.darker(50).toString(); + ctx.fillRect(0, 0, w, h); + + ctx.fillStyle = color.toString(); + ctx.fillRect(w2, 0, w2, h2); + +}; + +SymbolMorph.prototype.renderSymbolNormalStage = function (ctx, color) { + // draw a stage toggling symbol + var w = this.symbolWidth(), + h = this.size, + w2 = w / 2, + h2 = h / 2; + + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, w, h); + + ctx.fillStyle = color.darker(50).toString(); + ctx.fillRect(w2, 0, w2, h2); +}; + +SymbolMorph.prototype.renderSymbolTurtle = function (ctx, color) { + // draw a LOGO turtle + var w = this.symbolWidth(), + h = this.size; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w, h / 2); + ctx.lineTo(0, h); + ctx.lineTo(h / 2, h / 2); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolTurtleOutline = function (ctx, color) { + // draw a LOGO turtle + var w = this.symbolWidth(), + h = this.size; + + ctx.strokeStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w, h / 2); + ctx.lineTo(0, h); + ctx.lineTo(h / 2, h / 2); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolPause = function (ctx, color) { + // draw two parallel rectangles + var w = this.symbolWidth() / 5, + h = this.size; + + ctx.fillStyle = color.toString(); + ctx.fillRect(0, 0, w * 2, h); + ctx.fillRect(w * 3, 0, w * 2, h); +}; + +SymbolMorph.prototype.renderSymbolFlag = function (ctx, color) { + // draw a flag + var w = this.symbolWidth(), + h = this.size, + l = Math.max(w / 12, 1); + + ctx.lineWidth = l; + ctx.strokeStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(l / 2, 0); + ctx.lineTo(l / 2, h); + ctx.stroke(); + + ctx.lineWidth = h / 2; + ctx.beginPath(); + ctx.moveTo(0, h / 4); + ctx.bezierCurveTo( + w * 0.8, + h / 4, + w * 0.1, + h * 0.5, + w, + h * 0.5 + ); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolOctagon = function (ctx, color) { + // draw an octagon + var side = this.symbolWidth(), + vert = (side - (side * 0.383)) / 2; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(vert, 0); + ctx.lineTo(side - vert, 0); + ctx.lineTo(side, vert); + ctx.lineTo(side, side - vert); + ctx.lineTo(side - vert, side); + ctx.lineTo(vert, side); + ctx.lineTo(0, side - vert); + ctx.lineTo(0, vert); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolCloud = function (ctx, color) { + // draw a cloud + var w = this.symbolWidth(), + h = this.size, + r1 = h * 2 / 5, + r2 = h / 4, + r3 = h * 3 / 10, + r4 = h / 5; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.arc(r2, h - r2, r2, radians(90), radians(259), false); + ctx.arc(w / 20 * 5, h / 9 * 4, r4, radians(165), radians(300), false); + ctx.arc(w / 20 * 11, r1, r1, radians(200), radians(357), false); + ctx.arc(w - r3, h - r3, r3, radians(269), radians(90), false); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolCloudGradient = function (ctx, color) { + // draw a cloud + var w = this.symbolWidth(), + h = this.size, + gradient, + r1 = h * 2 / 5, + r2 = h / 4, + r3 = h * 3 / 10, + r4 = h / 5; + + gradient = ctx.createRadialGradient( + 0, + 0, + 0, + 0, + 0, + w + ); + gradient.addColorStop(0, color.lighter(25).toString()); + gradient.addColorStop(1, color.darker(25).toString()); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc(r2, h - r2, r2, radians(90), radians(259), false); + ctx.arc(w / 20 * 5, h / 9 * 4, r4, radians(165), radians(300), false); + ctx.arc(w / 20 * 11, r1, r1, radians(200), radians(357), false); + ctx.arc(w - r3, h - r3, r3, radians(269), radians(90), false); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolCloudOutline = function (ctx, color) { + // draw cloud + var w = this.symbolWidth(), + h = this.size, + r1 = h * 2 / 5, + r2 = h / 4, + r3 = h * 3 / 10, + r4 = h / 5; + + ctx.strokeStyle = color.toString(); + ctx.beginPath(); + ctx.arc(r2 + 1, h - r2 - 1, r2, radians(90), radians(180), false); + ctx.arc(w / 20 * 5, h / 9 * 4, r4, radians(150), radians(300), false); + ctx.arc(w / 20 * 11, r1 + 1, r1, radians(210), radians(335), false); + ctx.arc(w - r3 - 1, h - r3 - 1, r3, radians(280), radians(90), false); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolTurnRight = function (ctx, color) { + // draw a right-turning arrow + var w = this.symbolWidth(), + l = Math.max(w / 10, 1), + r = w / 2; + + ctx.lineWidth = l; + ctx.strokeStyle = color.toString(); + ctx.beginPath(); + ctx.arc(r, r * 2, r - l / 2, radians(0), radians(-90), false); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(w, r); + ctx.lineTo(r, 0); + ctx.lineTo(r, r * 2); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolTurnLeft = function (ctx, color) { + // draw a left-turning arrow + var w = this.symbolWidth(), + l = Math.max(w / 10, 1), + r = w / 2; + + ctx.lineWidth = l; + ctx.strokeStyle = color.toString(); + ctx.beginPath(); + ctx.arc(r, r * 2, r - l / 2, radians(180), radians(-90), true); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, r); + ctx.lineTo(r, 0); + ctx.lineTo(r, r * 2); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolTurnAround = function (ctx, color) { + // draw a right-around-turning arrow + var w = this.symbolWidth(), + l = Math.max(w / 10, 1), + r = w / 2; + + ctx.lineWidth = l; + ctx.strokeStyle = color.toString(); + ctx.beginPath(); + ctx.arc(r, r, r - l / 2, radians(-45), radians(225), false); + ctx.stroke(); + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, r * 0.1); + ctx.lineTo(r * 0.8, 0); + ctx.lineTo(r * 0.7, r * 0.7); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolStorage = function (ctx, color) { + // draw a stack of three disks + var w = this.symbolWidth(), + h = this.size, + r = h, + unit = h / 11; + + function drawDisk(bottom) { + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.arc(w / 2, bottom - h, r, radians(60), radians(120), false); + ctx.lineTo(0, bottom - unit * 2); + ctx.arc( + w / 2, + bottom - h - unit * 2, + r, + radians(120), + radians(60), + true + ); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.darker(25).toString(); + ctx.beginPath(); + ctx.arc( + w / 2, + bottom + unit * 6 + 1, + r, + radians(-120), // 60 + radians(-60), // 120 + false // true + ); + ctx.stroke(); + } + + ctx.strokeStyle = color.toString(); + drawDisk(h); + drawDisk(h - unit * 3); + drawDisk(h - unit * 6); +}; + +SymbolMorph.prototype.renderSymbolPoster = function (ctx, color) { + // draw a poster stand + var w = this.symbolWidth(), + h = this.size, + bottom = h * 0.75, + edge = h / 5; + + ctx.fillStyle = color.toString(); + ctx.strokeStyle = color.toString(); + + ctx.lineWidth = w / 15; + + ctx.beginPath(); + ctx.moveTo(w / 2, h / 3); + ctx.lineTo(w / 6, h); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(w / 2, h / 3); + ctx.lineTo(w / 2, h); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(w / 2, h / 3); + ctx.lineTo(w * 5 / 6, h); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w, 0); + ctx.lineTo(w, bottom - edge); + ctx.lineTo(w - edge, bottom - edge); + ctx.lineTo(w - edge, bottom); + ctx.lineTo(0, bottom); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.darker(25).toString(); + ctx.beginPath(); + ctx.moveTo(w, bottom - edge); + ctx.lineTo(w - edge, bottom - edge); + ctx.lineTo(w - edge, bottom); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolFlash = function (ctx, color) { + // draw a lightning bolt + var w = this.symbolWidth(), + h = this.size, + w3 = w / 3, + h3 = h / 3, + off = h3 / 3; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(w3, 0); + ctx.lineTo(0, h3); + ctx.lineTo(w3, h3); + ctx.lineTo(0, h3 * 2); + ctx.lineTo(w3, h3 * 2); + ctx.lineTo(0, h); + ctx.lineTo(w, h3 * 2 - off); + ctx.lineTo(w3 * 2, h3 * 2 - off); + ctx.lineTo(w, h3 - off); + ctx.lineTo(w3 * 2, h3 - off); + ctx.lineTo(w, 0); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolBrush = function (ctx, color) { + // draw a paintbrush + var w = this.symbolWidth(), + h = this.size, + l = Math.max(w / 30, 0.5); + + ctx.fillStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(w / 8 * 3, h / 2); + ctx.quadraticCurveTo(0, h / 2, l, h - l); + ctx.quadraticCurveTo(w / 2, h, w / 2, h / 8 * 5); + ctx.closePath(); + ctx.fill(); + + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + ctx.strokeStyle = color.toString(); + + ctx.moveTo(w / 8 * 3, h / 2); + ctx.lineTo(w * 0.75, l); + ctx.quadraticCurveTo(w, 0, w - l, h * 0.25); + ctx.stroke(); + + ctx.moveTo(w / 2, h / 8 * 5); + ctx.lineTo(w - l, h * 0.25); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolTick = function (ctx, color) { + // draw a check mark + var w = this.symbolWidth(), + h = this.size; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(w * 0.2, h * 0.5); + ctx.lineTo(w * 0.5, h); + ctx.lineTo(w * 0.8, h * 0.3); + ctx.lineTo(w, 0); + ctx.lineTo(w * 0.65, h * 0.2); + ctx.lineTo(w * 0.5, h * 0.65); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolCheckedBox = function (ctx, color) { + // draw a rectangle with a check mark + this.renderSymbolRectangle(ctx, color); + this.renderSymbolTick(ctx, color); +}; + +SymbolMorph.prototype.renderSymbolRectangle = function (ctx, color) { + // draw a rectangle + var w = this.symbolWidth(), + h = this.size, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(l, l); + ctx.lineTo(w - l, l); + ctx.lineTo(w - l, h - l); + ctx.lineTo(l, h - l); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolRectangleSolid = function (ctx, color) { + // draw a solid rectangle + var w = this.symbolWidth(), + h = this.size; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(w, 0); + ctx.lineTo(w, h); + ctx.lineTo(0, h); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolCircle = function (ctx, color) { + // draw a circle + var w = this.symbolWidth(), + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.arc(w / 2, w / 2, w / 2 - l, radians(0), radians(360), false); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolCircleSolid = function (ctx, color) { + // draw a solid circle + var w = this.symbolWidth(), + h = this.size; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.arc(w / 2, h / 2, w / 2, radians(0), radians(360), false); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolLine = function (ctx, color) { + // draw a plus sign cross + var w = this.symbolWidth(), + h = this.size, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.lineCap = 'round'; + ctx.beginPath(); + ctx.moveTo(l, l); + ctx.lineTo(w - l, h - l); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolCross = function (ctx, color) { + // draw a diagonal line + var w = this.symbolWidth(), + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.lineCap = 'round'; + ctx.beginPath(); + ctx.moveTo(l, w / 2); + ctx.lineTo(w - l, w / 2); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(w / 2, l); + ctx.lineTo(w / 2, w - l); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolCrosshairs = function (ctx, color) { + // draw a crosshairs + var w = this.symbolWidth(), + h = this.size, + l = 0.5; + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(l, h / 2); + ctx.lineTo(w - l, h / 2); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(w / 2, l); + ctx.lineTo(w / 2, h - l); + ctx.stroke(); + ctx.beginPath(); + ctx.moveTo(w / 2, h / 2); + ctx.arc(w / 2, w / 2, w / 3 - l, radians(0), radians(360), false); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolPaintbucket = function (ctx, color) { + // draw a paint bucket + var w = this.symbolWidth(), + h = this.size, + n = w / 5, + l = Math.max(w / 30, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(n * 2, n); + ctx.lineTo(n * 4, n * 3); + ctx.lineTo(n * 3, n * 4); + ctx.quadraticCurveTo(n * 2, h, n, n * 4); + ctx.quadraticCurveTo(0, n * 3, n, n * 2); + ctx.closePath(); + ctx.stroke(); + + ctx.lineWidth = l; + ctx.moveTo(n * 2, n * 2.5); + ctx.arc(n * 2, n * 2.5, l, radians(0), radians(360), false); + ctx.stroke(); + + ctx.moveTo(n * 2, n * 2.5); + ctx.lineTo(n * 2, n / 2 + l); + ctx.stroke(); + + ctx.arc(n * 1.5, n / 2 + l, n / 2, radians(0), radians(180), true); + ctx.stroke(); + + ctx.moveTo(n, n / 2 + l); + ctx.lineTo(n, n * 2); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(n * 3.5, n * 3.5); + ctx.quadraticCurveTo(w, n * 3.5, w - l, h); + ctx.lineTo(w, h); + ctx.quadraticCurveTo(w, n * 2, n * 2.5, n * 1.5); + ctx.lineTo(n * 4, n * 3); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolEraser = function (ctx, color) { + // draw an eraser + var w = this.symbolWidth(), + h = this.size, + n = w / 4, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(n * 3, l); + ctx.lineTo(l, n * 3); + ctx.quadraticCurveTo(n, h, n * 2, n * 3); + ctx.lineTo(w - l, n); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(n * 3, 0); + ctx.lineTo(n * 1.5, n * 1.5); + ctx.lineTo(n * 2.5, n * 2.5); + ctx.lineTo(w, n); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolPipette = function (ctx, color) { + // draw an eyedropper + var w = this.symbolWidth(), + h = this.size, + n = w / 4, + n2 = n / 2, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(l, h - l); + ctx.quadraticCurveTo(n2, h - n2, n2, h - n); + ctx.lineTo(n * 2, n * 1.5); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(l, h - l); + ctx.quadraticCurveTo(n2, h - n2, n, h - n2); + ctx.lineTo(n * 2.5, n * 2); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.arc(n * 3, n, n - l, radians(0), radians(360), false); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(n * 2, n); + ctx.lineTo(n * 3, n * 2); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolSpeechBubble = function (ctx, color) { + // draw a speech bubble + var w = this.symbolWidth(), + h = this.size, + n = w / 3, + l = Math.max(w / 20, 0.5); + + ctx.fillStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(n, n * 2); + ctx.quadraticCurveTo(l, n * 2, l, n); + ctx.quadraticCurveTo(l, l, n, l); + ctx.lineTo(n * 2, l); + ctx.quadraticCurveTo(w - l, l, w - l, n); + ctx.quadraticCurveTo(w - l, n * 2, n * 2, n * 2); + ctx.lineTo(n / 2, h - l); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolSpeechBubbleOutline = function ( + ctx, + color +) { + // draw a speech bubble + var w = this.symbolWidth(), + h = this.size, + n = w / 3, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(n, n * 2); + ctx.quadraticCurveTo(l, n * 2, l, n); + ctx.quadraticCurveTo(l, l, n, l); + ctx.lineTo(n * 2, l); + ctx.quadraticCurveTo(w - l, l, w - l, n); + ctx.quadraticCurveTo(w - l, n * 2, n * 2, n * 2); + ctx.lineTo(n / 2, h - l); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolLoop = function (ctx, aColor) { + var w = this.symbolWidth(), + h = this.size, + w2 = w / 2, + w4 = w2 / 2, + h2 = h / 2, + l = Math.max(h / 10, 0.5); + + ctx.lineWidth = l * 2; + ctx.strokeStyle = aColor.toString(); + ctx.beginPath(); + ctx.moveTo(0, h - l); + ctx.lineTo(w2, h - l); + ctx.arc(w2, h2, h2 - l, radians(90), radians(0), true); + ctx.stroke(); + ctx.fillStyle = aColor.toString(); + ctx.beginPath(); + ctx.moveTo(w4 * 3 - l, 0); + ctx.lineTo(w2 - l, h2); + ctx.lineTo(w, h2); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolTurnBack = function (ctx, aColor) { + var w = this.symbolWidth(), + h = this.size, + w2 = w / 2, + h2 = h / 2, + l = Math.max(w / 20, 0.5); + + ctx.fillStyle = aColor.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(0, h2); + ctx.lineTo(w2, 0); + ctx.lineTo(w2, h); + ctx.closePath(); + ctx.fill(); + ctx.lineWidth = l * 3; + ctx.strokeStyle = aColor.toString(); + ctx.beginPath(); + ctx.arc(w2, h, h2, radians(0), radians(-90), true); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolTurnForward = function (ctx, aColor) { + var w = this.symbolWidth(), + h = this.size, + w2 = w / 2, + h2 = h / 2, + l = Math.max(w / 20, 0.5); + + ctx.fillStyle = aColor.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(w, h2); + ctx.lineTo(w2, 0); + ctx.lineTo(w2, h); + ctx.closePath(); + ctx.fill(); + ctx.lineWidth = l * 3; + ctx.strokeStyle = aColor.toString(); + ctx.beginPath(); + ctx.arc(w2, h, h2, radians(-180), radians(-90), false); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolArrowUp = function (ctx, color) { + // draw an up arrow + var w = this.symbolWidth(), + h = this.size, + n = w / 2, + l = Math.max(w / 20, 0.5); + + ctx.fillStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(l, n); + ctx.lineTo(n, l); + ctx.lineTo(w - l, n); + ctx.lineTo(w * 0.65, n); + ctx.lineTo(w * 0.65, h - l); + ctx.lineTo(w * 0.35, h - l); + ctx.lineTo(w * 0.35, n); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolArrowUpOutline = function (ctx, color) { + // draw an up arrow + var w = this.symbolWidth(), + h = this.size, + n = w / 2, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(l, n); + ctx.lineTo(n, l); + ctx.lineTo(w - l, n); + ctx.lineTo(w * 0.65, n); + ctx.lineTo(w * 0.65, h - l); + ctx.lineTo(w * 0.35, h - l); + ctx.lineTo(w * 0.35, n); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolArrowUpThin = function (ctx, color) { + // draw a thin up arrow + var w = this.symbolWidth(), + h = this.size, + n = w / 3, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(w - n, n); + ctx.lineTo(w / 2, l * 2); + ctx.lineTo(n, n); + ctx.moveTo(w / 2, l * 2); + ctx.lineTo(w / 2, h - l); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolArrowUpDownThin = function (ctx, color) { + // draw a thin up-down arrow + var w = this.symbolWidth(), + h = this.size, + n = w / 3, + l = Math.max(w / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(w - n, n); + ctx.lineTo(w / 2, l * 2); + ctx.lineTo(n, n); + ctx.moveTo(w - n, h - n); + ctx.lineTo(w / 2, h - l * 2); + ctx.lineTo(n, h - n); + ctx.moveTo(w / 2, l * 2); + ctx.lineTo(w / 2, h - l * 2); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolArrowDown = function (ctx, color) { + // draw a down arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(w, w); + ctx.rotate(radians(180)); + this.renderSymbolArrowUp(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowDownOutline = function (ctx, color) { + // draw a down arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(w, w); + ctx.rotate(radians(180)); + this.renderSymbolArrowUpOutline(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowDownThin = function (ctx, color) { + // draw a thin down arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(w, w); + ctx.rotate(radians(180)); + this.renderSymbolArrowUpThin(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowLeft = function (ctx, color) { + // draw a left arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(0, w); + ctx.rotate(radians(-90)); + this.renderSymbolArrowUp(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowLeftOutline = function (ctx, color) { + // draw a left arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(0, w); + ctx.rotate(radians(-90)); + this.renderSymbolArrowUpOutline(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowLeftThin = function (ctx, color) { + // draw a thin left arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(0, w); + ctx.rotate(radians(-90)); + this.renderSymbolArrowUpThin(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowLeftRightThin = function (ctx, color) { + // draw a thin left-right arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(0, w); + ctx.rotate(radians(-90)); + this.renderSymbolArrowUpDownThin(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowRight = function (ctx, color) { + // draw a right arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(w, 0); + ctx.rotate(radians(90)); + this.renderSymbolArrowUp(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowRightOutline = function (ctx, color) { + // draw a right arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(w, 0); + ctx.rotate(radians(90)); + this.renderSymbolArrowUpOutline(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolArrowRightThin = function (ctx, color) { + // draw a thin right arrow + var w = this.symbolWidth(); + ctx.save(); + ctx.translate(w, 0); + ctx.rotate(radians(90)); + this.renderSymbolArrowUpThin(ctx, color); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolRobot = function (ctx, color) { + // draw a humanoid robot + var w = this.symbolWidth(), + h = this.size, + n = w / 6, + n2 = n / 2, + l = Math.max(w / 20, 0.5); + + ctx.fillStyle = color.toString(); + //ctx.lineWidth = l * 2; + + ctx.beginPath(); + ctx.moveTo(n + l, n); + ctx.lineTo(n * 2, n); + ctx.lineTo(n * 2.5, n * 1.5); + ctx.lineTo(n * 3.5, n * 1.5); + ctx.lineTo(n * 4, n); + ctx.lineTo(n * 5 - l, n); + ctx.lineTo(n * 4, n * 3); + ctx.lineTo(n * 4, n * 4 - l); + ctx.lineTo(n * 2, n * 4 - l); + ctx.lineTo(n * 2, n * 3); + ctx.closePath(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(n * 2.75, n + l); + ctx.lineTo(n * 2.4, n); + ctx.lineTo(n * 2.2, 0); + ctx.lineTo(n * 3.8, 0); + ctx.lineTo(n * 3.6, n); + ctx.lineTo(n * 3.25, n + l); + ctx.closePath(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(n * 2.5, n * 4); + ctx.lineTo(n, n * 4); + ctx.lineTo(n2 + l, h); + ctx.lineTo(n * 2, h); + ctx.closePath(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(n * 3.5, n * 4); + ctx.lineTo(n * 5, n * 4); + ctx.lineTo(w - (n2 + l), h); + ctx.lineTo(n * 4, h); + ctx.closePath(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(n, n); + ctx.lineTo(l, n * 1.5); + ctx.lineTo(l, n * 3.25); + ctx.lineTo(n * 1.5, n * 3.5); + ctx.closePath(); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(n * 5, n); + ctx.lineTo(w - l, n * 1.5); + ctx.lineTo(w - l, n * 3.25); + ctx.lineTo(n * 4.5, n * 3.5); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolMagnifyingGlass = function (ctx, color) { + // draw a magnifying glass + var w = this.symbolWidth(), + h = this.size, + gradient, + r = w * 0.3, + x = w * 2 / 3 - Math.sqrt(r), + y = h / 3 + Math.sqrt(r), + l = Math.max(w / 5, 0.5); + + ctx.strokeStyle = color.toString(); + + gradient = ctx.createRadialGradient( + x, + y, + 0, + x + r, + y + r, + w + ); + + gradient.addColorStop(0, color.inverted().lighter(50).toString()); + gradient.addColorStop(1, color.inverted().darker(25).toString()); + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc(x, y, r, radians(0), radians(360), false); + ctx.fill(); + + ctx.lineWidth = l / 2; + ctx.beginPath(); + ctx.arc(x, y, r, radians(0), radians(360), false); + ctx.stroke(); + + ctx.lineWidth = l; + ctx.beginPath(); + ctx.moveTo(l / 2, h - l / 2); + ctx.lineTo(x - Math.sqrt(r + l), y + Math.sqrt(r + l)); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolMagnifierOutline = function (ctx, color) { + // draw a magnifying glass + var w = this.symbolWidth(), + h = this.size, + r = w * 0.3, + x = w * 2 / 3 - Math.sqrt(r), + y = h / 3 + Math.sqrt(r), + l = Math.max(w / 5, 0.5); + + ctx.strokeStyle = color.toString(); + + ctx.lineWidth = l * 0.5; + ctx.beginPath(); + ctx.arc(x, y, r, radians(0), radians(360), false); + ctx.stroke(); + + ctx.lineWidth = l; + ctx.beginPath(); + ctx.moveTo(l / 2, h - l / 2); + ctx.lineTo(x - Math.sqrt(r + l), y + Math.sqrt(r + l)); + ctx.closePath(); + ctx.stroke(); +}; + + +SymbolMorph.prototype.renderSymbolSelection = function (ctx, color) { + // draw a filled arrow and a dashed rectangle + var w = this.symbolWidth(), + h = this.size; + + ctx.save(); + ctx.setLineDash([3]); + this.renderSymbolRectangle(ctx, color); + ctx.restore(); + + ctx.save(); + ctx.fillStyle = color.toString(); + ctx.translate(0.7 * w, 0.4 * h); + ctx.scale(0.5, 0.5); + ctx.rotate(radians(135)); + this.renderSymbolArrowDownOutline(ctx, color); + ctx.fill(); + ctx.restore(); +}; + +SymbolMorph.prototype.renderSymbolOctagonOutline = function (ctx, color) { + // draw an octagon + var side = this.symbolWidth(), + vert = (side - (side * 0.383)) / 2, + l = Math.max(side / 20, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + ctx.beginPath(); + ctx.moveTo(vert, l); + ctx.lineTo(side - vert, l); + ctx.lineTo(side - l, vert); + ctx.lineTo(side - l, side - vert); + ctx.lineTo(side - vert, side - l); + ctx.lineTo(vert, side - l); + ctx.lineTo(l, side - vert); + ctx.lineTo(l, vert); + ctx.closePath(); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolClosedBrushPath = + SymbolMorph.prototype.renderSymbolCloudOutline; + +SymbolMorph.prototype.renderSymbolNotes = function (ctx, color) { + // draw two musical notes + var size = this.symbolWidth(), + r = size / 6, + l = Math.max(r / 3, 1); + + ctx.strokeStyle = color.toString(); + ctx.fillStyle = color.toString(); + + ctx.beginPath(); + ctx.arc(r, size - r, r, radians(0), radians(360), false); + ctx.fill(); + ctx.beginPath(); + ctx.arc(size - r, size - (r * 2), r, radians(0), radians(360), false); + ctx.fill(); + + ctx.beginPath(); + ctx.moveTo(r * 2 - l, r); + ctx.lineTo(size, 0); + ctx.lineTo(size, r); + ctx.lineTo(r * 2 - l, r * 2); + ctx.closePath(); + ctx.fill(); + + ctx.lineWidth = l; + ctx.beginPath(); + ctx.moveTo(r * 2 - (l / 2), size - r); + ctx.lineTo(r * 2 - (l / 2), r + l); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(size - (l / 2), size - (r * 2)); + ctx.lineTo(size - (l / 2), l); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolCamera = function (ctx, color) { + // draw a camera + var w = this.symbolWidth(), + h = this.size, + r = w * 0.16, + l = Math.max(w / 20, 0.5); + + ctx.lineWidth = l * 2; + + // camera body + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(l, h * 5 / 6); + ctx.lineTo(w - l, h * 5 / 6); + ctx.lineTo(w - l, h / 4); + ctx.lineTo(w * 3 / 4 , h / 4); + ctx.lineTo(w * 5 / 8 , l); + ctx.lineTo(w * 3 / 8 , l); + ctx.lineTo(w / 4 , h / 4); + ctx.lineTo(l , h / 4); + ctx.lineTo(l, h * 5 / 6); + + // camera lens + ctx.arc(w / 2, h / 2, r, radians(0), radians(360), false); + + ctx.clip(); + ctx.fillRect(0, 0, w, h); +}; + +SymbolMorph.prototype.renderSymbolLocation = function (ctx, color) { + // draw a map pin + var w = this.symbolWidth(), + h = this.size, + r = w / 2; + + // pin + ctx.fillStyle = color.toString(); + ctx.beginPath(); + + ctx.moveTo(0, r); + ctx.arc(r, r, r, radians(-180), radians(0), false); + ctx.lineTo(r, h); + ctx.lineTo(0, r); + + // hole + ctx.arc(r, r, r * 0.5, radians(0), radians(360), false); + + ctx.clip('evenodd'); + ctx.fillRect(0, 0, w, h); +}; + +SymbolMorph.prototype.renderSymbolFootprints = function (ctx, color) { + // draw a pair of (shoe) footprints + var w = this.symbolWidth(), + u = w / 10, + r = u * 1.5; + + ctx.fillStyle = color.toString(); + + // left shoe + // tip + ctx.beginPath(); + ctx.arc(r, r, r, radians(-200), radians(0), false); + ctx.lineTo(r * 2, u * 5.5); + ctx.lineTo(u, u * 6); + ctx.closePath(); + ctx.fill(); + // heel + ctx.beginPath(); + ctx.arc(u * 2.25, u * 6.75, u , radians(-40), radians(-170), false); + ctx.closePath(); + ctx.fill(); + + // right shoe + // tip + ctx.beginPath(); + ctx.arc(w - r, u * 4.5, r, radians(-180), radians(20), false); + ctx.lineTo(w - u, u * 8.5); + ctx.lineTo(w - (r * 2), u * 8); + ctx.closePath(); + ctx.fill(); + // heel + ctx.beginPath(); + ctx.arc(w - (u * 2.25), u * 9, u, radians(0), radians(-150), false); + ctx.closePath(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolKeyboard = function (ctx, color) { + // draw a typing keyboard + var h = this.size, + u = h / 10, + k = h / 5, + row, col; + + ctx.fillStyle = color.toString(); + for (row = 0; row < 2; row += 1) { + for (col = 0; col < 5; col += 1) { + ctx.fillRect( + ((u + k) * col) + u, + ((u + k) * row) + u, + k, + k + ); + } + } + ctx.fillRect(u * 4, u * 7, k * 4, k); +}; + +SymbolMorph.prototype.renderSymbolKeyboardFilled = function (ctx, color) { + // draw a typing keyboard + var w = this.symbolWidth(), + h = this.size, + u = h / 10, + k = h / 5, + row, col; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.rect(0, 0, w, h); + for (row = 0; row < 2; row += 1) { + for (col = 0; col < 5; col += 1) { + ctx.rect( + ((u + k) * col) + u, + ((u + k) * row) + u, + k, + k + ); + } + } + ctx.rect(u * 4, u * 7, k * 4, k); + + ctx.clip('evenodd'); + ctx.fillRect(0, 0, w, h); +}; + +SymbolMorph.prototype.renderSymbolGlobeBig = function (ctx, color) { + this.renderSymbolGlobe(ctx, color, true); +}; + +SymbolMorph.prototype.renderSymbolGlobe = function (ctx, color, detailed) { + // draw a stylized globe + var w = this.symbolWidth(), + l = Math.max(w / 30, 0.5); + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = l * 2; + + ctx.beginPath(); + ctx.arc(w / 2, w / 2, w / 2 - l, radians(0), radians(360), false); + ctx.stroke(); + + if (detailed) { + ctx.moveTo(l * 3, w * 0.3); + ctx.lineTo(w - l * 3, w * 0.3); + ctx.stroke(); + ctx.moveTo(l * 3, w * 0.7); + ctx.lineTo(w - l * 3, w * 0.7); + ctx.stroke(); + } + + // single line version, looks better when small: + ctx.beginPath(); + ctx.moveTo(l, w / 2); + ctx.lineTo(w - l, w / 2); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(w / 2, l / 2); + ctx.arcTo(0, w / 2, w / 2, w, w * 0.75); + ctx.stroke(); + + ctx.beginPath(); + ctx.moveTo(w / 2, l / 2); + ctx.arcTo(w, w / 2, w / 2, w, w * 0.75); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolList = function (ctx, color) { + // draw a stylized list + var w = this.symbolWidth(), + h = this.size, + padding = h / 10, + item = h / 5, + row; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.rect(0, 0, w, h); + for (row = 0; row < 4; row += 1) { + ctx.rect( + padding, + ((padding + item) * row) + padding, + w - item, + item + ); + } + ctx.clip('evenodd'); + ctx.fillRect(0, 0, w, h); +}; + +SymbolMorph.prototype.renderSymbolVerticalEllipsis = function (ctx, color) { + // draw 3 solid circles + var r = this.symbolWidth() / 2; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.arc(r, r, r, radians(0), radians(360), false); + ctx.arc(r, r * 5, r, radians(0), radians(360), false); + ctx.arc(r, r * 9, r, radians(0), radians(360), false); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolFlipHorizontal = function (ctx, color) { + var w = this.symbolWidth(), + h = this.size, + c = w / 2, + off = w / 15; + + ctx.strokeStyle = color.toString(); + ctx.lineWidth = w / 15; + ctx.beginPath(); + ctx.moveTo(0 + off, h - off / 2); + ctx.lineTo(c - off * 1.2, h - off / 2); + ctx.lineTo(c - off * 1.2, off * 2); + ctx.closePath(); + ctx.stroke(); + + ctx.fillStyle = color.toString(); + ctx.lineWidth = w / 15; + ctx.beginPath(); + ctx.moveTo(w - off, h - off / 2); + ctx.lineTo(c + off * 1.2, h - off / 2); + ctx.lineTo(c + off * 1.2, off * 2); + ctx.closePath(); + ctx.stroke(); + ctx.fill(); +}; + +SymbolMorph.prototype.renderSymbolFlipVertical = function (ctx, color) { + ctx.translate(0, this.size); + ctx.rotate(radians(-90)); + this.renderSymbolFlipHorizontal(ctx, color); +}; + +SymbolMorph.prototype.renderSymbolTrash = function (ctx, color) { + var w = this.symbolWidth(), + h = this.size, + step = w / 10; + + function stripe(x) { + var half = step / 2; + ctx.moveTo(x - half, step * 4); + ctx.arc(x, step * 4, half, radians(180), radians(0)); + ctx.lineTo(x + half, step * 8.5); + ctx.arc(x, step * 8.5, half, radians(0), radians(180)); + ctx.lineTo(x - half, step * 4); + } + + // body of the can + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(step, step * 2.5); + ctx.lineTo(step * 1.5, step * 9.5); + ctx.lineTo(step * 2.5, h); + ctx.lineTo(step * 7.5, h); + ctx.lineTo(step * 8.5, step * 9.5); + ctx.lineTo(step * 9, step * 2.5); + ctx.lineTo(step, step * 2.5); + + // vertical stripes + stripe(w * 0.3); + stripe(w * 0.5); + stripe(w * 0.7); + + ctx.save(); + ctx.clip(); + ctx.fillRect(0, 0, w, h); + ctx.restore(); + + // the lid + ctx.lineWidth = step; + ctx.lineJoin = 'round'; + ctx.strokeStyle = color.toString(); + ctx.lineWidth = step; + ctx.beginPath(); + ctx.moveTo(step / 2, step * 1.5); + ctx.lineTo(step * 9.5, step * 1.5); + ctx.stroke(); + + // the handle on the lid + ctx.lineWidth = step / 2; + ctx.beginPath(); + ctx.moveTo(step * 3, step * 1.5); + ctx.lineTo(step * 4, step * 0.25); + ctx.lineTo(step * 6, step * 0.25); + ctx.lineTo(step * 7, step * 1.5); + ctx.stroke(); +}; + +SymbolMorph.prototype.renderSymbolTrashFull = function (ctx, color) { + var w = this.symbolWidth(), + h = this.size, + step = w / 10; + + function stripe(x) { + var half = step / 2; + ctx.moveTo(x - half, step * 5.5); + ctx.arc(x, step * 5.5, half, radians(180), radians(0)); + ctx.lineTo(x + half, step * 8.5); + ctx.arc(x, step * 8.5, half, radians(0), radians(180)); + ctx.lineTo(x - half, step * 5.5); + } + + // body of the can + ctx.fillStyle = color.toString(); + ctx.beginPath(); + ctx.moveTo(step, step * 4); + ctx.lineTo(step * 1.5, step * 9.5); + ctx.lineTo(step * 2.5, h); + ctx.lineTo(step * 7.5, h); + ctx.lineTo(step * 8.5, step * 9.5); + ctx.lineTo(step * 9, step * 4); + ctx.lineTo(step, step * 4); + + // vertical stripes + stripe(w * 0.3); + stripe(w * 0.5); + stripe(w * 0.7); + + ctx.save(); + ctx.clip(); + ctx.fillRect(0, 0, w, h); + ctx.restore(); + + // document + ctx.beginPath(); + ctx.moveTo(step * 2, 0); + ctx.lineTo(step * 6, 0); + ctx.lineTo(step * 8, step * 2); + ctx.lineTo(step * 8, step * 3.5); + ctx.lineTo(step * 2, step * 3.5); + ctx.closePath(); + ctx.fill(); + + ctx.fillStyle = color.darker(25).toString(); + ctx.beginPath(); + ctx.moveTo(step * 6, 0); + ctx.lineTo(step * 8, step * 2); + ctx.lineTo(step * 6, step * 2); + ctx.closePath(); + ctx.fill(); +}; + +/* +// register examples with the World demo menu +// comment out to shave off a millisecond loading speed ;-) + +(function () { + var bright = new Color(240, 240, 240), + dark = new Color(20, 20, 20), + offset = new Point(-1, -1); + + SymbolMorph.prototype.addToDemoMenu([ + 'Symbols', + SymbolMorph.prototype.names.map(sym => [ + new SymbolMorph( + sym, + 30, + bright, + offset, + dark + ), + sym + ]) + ]); +})(); +*/ diff --git a/elements/pl-snap/Snap/src/tables.js b/elements/pl-snap/Snap/src/tables.js new file mode 100644 index 00000000..fe851a9a --- /dev/null +++ b/elements/pl-snap/Snap/src/tables.js @@ -0,0 +1,1405 @@ +/* + + tables.js + + basic spreadsheet elements for Snap! + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2022 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js, list.js, widgets.js, byob.js, threads + + + I. hierarchy + ------------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + DialogBoxMorph** + TableDialogMorph + Morph* + FrameMorph* + TableMorph + TableCellMorph + TableFrameMorph + Table + + * from morphic.js + ** from widgets.js + + + II. toc + ------- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + Table + TableCellMorph + TableMorph + TableFrameMorph + TableDialogMorph + +*/ + +// Global settings ///////////////////////////////////////////////////// + +/*global modules, Point, Morph, fontHeight, SliderMorph, isString, detect, List, +MorphicPreferences, FrameMorph, HandleMorph, DialogBoxMorph, StringMorph, isNil, +SpriteMorph, Context, Costume, BlockEditorMorph, SymbolMorph, IDE_Morph, Sound, +SyntaxElementMorph, MenuMorph, SpriteBubbleMorph, SpeechBubbleMorph, CellMorph, +ListWatcherMorph, BoxMorph, Variable, isSnapObject, useBlurredShadows, +CostumeIconMorph, SoundIconMorph, localize*/ + +/*jshint esversion: 6*/ + +modules.tables = '2023-July-05'; + +var Table; +var TableCellMorph; +var TableMorph; +var TableFrameMorph; + +// Table ///////////////////////////////////////////////////////////// + +/* + Observable 2D data collections accessible by rows, columns and cells + with indices starting at 1. + currently only used for testing TableViews in Snap, because Snap + automatically displays 2D lists as tables. +*/ + +function Table(cols, rows) { + this.colCount = +cols; + this.rowCount = +rows; + this.colNames = []; + this.rowNames = []; + this.contents = new Array(+rows); + for (var i = 0; i < rows; i += 1) { + this.contents[i] = new Array(+cols); + } + this.lastChanged = Date.now(); +} + +// Table testing: + +Table.prototype.demo = function(aWorld) { + // new Table(50, 10000).demo(world) + var dlg; + this.fillWithTestData(); + dlg = new TableDialogMorph(this); + dlg.popUp (aWorld); +}; + +// Table updating: + +Table.prototype.changed = function () { + this.lastChanged = Date.now(); +}; + +// Table querying: + +Table.prototype.get = function (col, row) { + if (!col) { + if (!row) {return [this.rowCount]; } + return this.rowName(row); + } else if (!row) { + return this.colName(col); + } + if (col > this.colCount || row > this.rowCount) {return null; } + return (this.contents[row - 1] || [])[col - 1]; +}; + +Table.prototype.row = function(row) { + return this.contents[row - 1]; +}; + +Table.prototype.col = function(col) { + var dta = [], + c = col - 1, + i; + for (i = 0; i < this.rowCount; i += 1) { + dta.push(this.contents[i][c]); + } + return dta; +}; + +Table.prototype.colName = function (col) { + // answer the specified name or a capital letter A-Z + // repeated accordingly + if (col > this.colCount) {return null; } + var name = this.colNames[col - 1]; + if (name !== undefined) {return name; } + return String.fromCharCode(64 + ((col % 26) || 26)).repeat( + Math.floor((col - 1) / 26) + 1 + ); +}; + +Table.prototype.rowName = function (row) { + // answer the specified name or row number + if (row > this.rowCount) {return null; } + return this.rowNames[row - 1] || row; +}; + +Table.prototype.rows = function () { + return this.rowCount; +}; + +Table.prototype.cols = function () { + return this.colCount; +}; + +Table.prototype.columnNames = function () { + return this.colNames; +}; + +// Table setting: + +Table.prototype.set = function (data, col, row) { + this.contents[row - 1][col - 1] = data; + this.changed(); +}; + +Table.prototype.setRows = function (rowsArray, colNames, rowNames) { + this.contents = rowsArray; + if (colNames) {this.colNames = colNames; } + if (rowNames) {this.rowNames = rowNames; } + this.changed(); +}; + +Table.prototype.setCols = function (colsArray, colNames, rowNames) { + var r, c; + for (c = 0; c < this.colCount; c += 1) { + for (r = 0; r < this.rowCount; r += 1) { + this.contents[r][c] = colsArray[c][r]; + } + } + if (colNames) {this.colNames = colNames; } + if (rowNames) {this.rowNames = rowNames; } + this.changed(); +}; + +Table.prototype.setColNames = function (array) { + this.colNames = array || []; + this.changed(); +}; + +Table.prototype.setRowNames = function (array) { + this.rowNames = array || []; + this.changed(); +}; + +Table.prototype.setColName = function (col, name) { + this.colNames[col + 1] = name; + this.changed(); +}; + +Table.prototype.setRowName = function (row, name) { + this.rowNames[row + 1] = name; + this.changed(); +}; + +// Table growing: + +Table.prototype.addRow = function (array, name) { + if (array) { + this.contents[this.rowCount] = array; + } else { + this.contents[this.rowCount] = new Array(this.rowCount); + } + this.rowNames[this.rowCount] = name; + this.rowCount += 1; + this.changed(); +}; + +Table.prototype.addCol = function (array, name) { + var i; + if (array) { + for (i = 0; i < this.col; i += 1) { + this.contents[i][this.colCount] = array[i]; + } + } + this.colNames[this.colCount] = name; + this.colCount += 1; + this.changed(); +}; + +// Table converting: + +Table.prototype.toList = function () { + return new List( + this.contents.map(eachRow => new List(eachRow)) + ); +}; + +// Table testing + +Table.prototype.fillWithTestData = function () { + var c, r; + for (c = 1; c <= this.colCount; c += 1) { + for (r = 1; r <= this.rowCount; r += 1) { + this.set (this.colName(c) + this.rowName(r), c, r); + } + } +}; + +// TableCellMorph ///////////////////////////////////////////////////////// + +// basic fast data view, currently constrained to a single line of text + +// TableCellMorph inherits from Morph: + +TableCellMorph.prototype = new Morph(); +TableCellMorph.prototype.constructor = TableCellMorph; +TableCellMorph.uber = Morph.prototype; + +// TableCellMorph global setting: + +TableCellMorph.prototype.cachedListSymbol = null; + +TableCellMorph.prototype.listSymbol = function () { + if (!this.cachedListSymbol || this.cachedListSymbol.height() !== + SyntaxElementMorph.prototype.fontSize) { + this.cachedListSymbol = new SymbolMorph( + 'list', + SyntaxElementMorph.prototype.fontSize, + SpriteMorph.prototype.blockColor.lists.darker(50) + ); + } + return this.cachedListSymbol.getImage(); +}; + +// TableCellMorph instance creation: + +function TableCellMorph(data, extent, isLabel) { + this.init(data, extent, isLabel); +} + +TableCellMorph.prototype.init = function (data, extent, isLabel) { + // additional properties: + this.data = data; + this.isLabel = isLabel || false; + this.labelString = null; + + // initialize inherited properties: + TableCellMorph.uber.init.call(this, true); + + // override inherited properites: + if (extent) {this.bounds.setExtent(extent); } + this.fixLayout(); +}; + +TableCellMorph.prototype.setData = function (data, extent) { + this.data = data; + if (extent && (!extent.eq(this.extent()))) { + this.bounds.setExtent(extent); + } + this.rerender(); +}; + +TableCellMorph.prototype.getData = function () { + return this.data instanceof Array ? this.data[0] : this.data; +}; + +TableCellMorph.prototype.render = function (ctx) { + var dta = this.labelString || this.dataRepresentation(this.data), + raw = this.getData(), + fontSize = SyntaxElementMorph.prototype.fontSize, + empty = TableMorph.prototype.highContrast ? 'rgb(220, 220, 220)' + : 'transparent', + orphaned = 'rgb(217, 77, 17)', + fontStyle = this.isLabel ? + (this.data instanceof Array ? 'italic' : '') + : this.shouldBeList() ? 'bold' : '', + font = fontStyle + ' ' + fontSize + 'px Helvetica, Arial, sans-serif', + background = this.labelString ? 'rgb(220, 220, 250)' + : (this.isLabel ? empty + : (this.shouldBeList() ? orphaned + : (this.isOvershooting() ? 'white' + : (isNil(this.data) ? empty : 'white')))), + foreground = !this.isLabel && this.shouldBeList()? 'white' : 'black', + width = this.width(), + height = this.height(), + txtWidth, + txtHeight, + x, + y; + + this.isDraggable = !SpriteMorph.prototype.disableDraggingData && + ((raw instanceof Context) || + (raw instanceof Costume) || + (raw instanceof Sound)); + + ctx.fillStyle = background; + if (this.shouldBeList()) { + BoxMorph.prototype.outlinePath.call( + this, ctx, SyntaxElementMorph.prototype.corner + 1, 0 + ); + ctx.fill(); + } else if (this.isOvershooting()) { + this.raggedBoxPath(ctx); + ctx.fill(); + } else { + ctx.fillRect(0, 0, width, height); + } + + if (!dta) {return; } + if (dta instanceof HTMLCanvasElement) { + x = Math.max((width - dta.width) / 2, 0); + y = Math.max((height - dta.height) / 2, 0); + if (useBlurredShadows) { + ctx.shadowOffsetX = 4; + ctx.shadowOffsetY = 4; + ctx.shadowBlur = 4; + ctx.shadowColor = 'lightgray'; + } + ctx.drawImage(dta, x, y); + } else { // text + ctx.font = font; + ctx.textAlign = 'left'; + ctx.textBaseline = 'bottom'; + txtWidth = ctx.measureText(dta).width; + txtHeight = fontHeight(fontSize); + ctx.fillStyle = foreground; + x = Math.max((width - txtWidth) / 2, 0); + y = Math.max((height - txtHeight) / 2, 0); + ctx.fillText(dta, x, txtHeight + y); + } +}; + +TableCellMorph.prototype.dataRepresentation = function (dta) { + if (dta instanceof Morph) { + if (isSnapObject(dta)) { + return dta.thumbnail(new Point(40, 40), null, true); // no watchers + } else { + return dta.fullImage(); + } + } else if (isString(dta)) { + return dta.length > 100 ? dta.slice(0, 100) + '...' : dta; + } else if (typeof dta === 'number') { + return dta.toString(); + } else if (typeof dta === 'boolean') { + return SpriteMorph.prototype.booleanMorph.call( + null, + dta + ).fullImage(); + } else if (dta instanceof Array) { + return this.dataRepresentation(dta[0]); + } else if (dta instanceof Variable) { + return this.dataRepresentation(dta.value); + } else if (dta instanceof HTMLCanvasElement) { + return dta; + } else if (dta instanceof Context) { + return dta.image(); + } else if (dta instanceof Costume) { + return dta.thumbnail(new Point(40, 40)); + } else if (dta instanceof Sound) { + return new SymbolMorph( + 'notes', SyntaxElementMorph.prototype.fontSize + ).getImage(); + } else if (dta instanceof List) { + return this.listSymbol(); + } else { + return dta ? dta.toString() : (dta === 0 ? '0' : null); + } +}; + +TableCellMorph.prototype.raggedBoxPath = function (context) { + var width = this.width(), + height = this.height(), + x = width * 0.75, + step = height / 6, + y = 0; + context.beginPath(); + context.moveTo(0, 0); + context.lineTo(width, 0); + for (y = 0; y < height; y += (step * 2)) { + context.lineTo(x, y + step); + context.lineTo(width, y + (step * 2)); + } + context.lineTo(width, height); + context.lineTo(0, height); + context.closePath(); +}; + +TableCellMorph.prototype.shouldBeList = function () { + return this.data instanceof Array; +}; + +TableCellMorph.prototype.isOvershooting = function () { + return this.data instanceof Variable; +}; + +// TableCellMorph events: + +TableCellMorph.prototype.mouseDoubleClick = function (pos) { + if (this.data instanceof Table || this.data instanceof List) { + new TableDialogMorph(this.data).popUp(this.world()); + } else if (this.data instanceof Array && this.data[0] instanceof List) { + new TableDialogMorph(this.data[0]).popUp(this.world()); + } else { + this.escalateEvent('mouseDoubleClick', pos); + } +}; + +TableCellMorph.prototype.mouseEnter = function () { + var tm, x, c; + if (this.isLabel) { + tm = this.parentThatIsA(TableMorph); + x = tm.world().hand.left() - tm.left(); + c = tm.columnAt(x); + if (c > 0) { + this.labelString = c; + this.rerender(); + } + } +}; + +TableCellMorph.prototype.mouseLeave = function () { + if (this.isLabel) { + this.labelString = null; + this.rerender(); + } +}; + +TableCellMorph.prototype.selectForEdit = function () { + if (this.getData() instanceof Context) { + return this.selectContextForEdit(); + } + if (this.getData() instanceof Costume) { + return this.selectCostumeForEdit(); + } + if (this.getData() instanceof Sound) { + return this.selectSoundForEdit(); + } +}; + +TableCellMorph.prototype.selectContextForEdit = function () { + var script = this.getData().toUserBlock(), + prepare = script.prepareToBeGrabbed, + ide = this.parentThatIsA(IDE_Morph) || + this.world().childThatIsA(IDE_Morph); + + script.prepareToBeGrabbed = function (hand) { + prepare.call(this, hand); + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + script.setPosition(this.position()); + return script; +}; + +TableCellMorph.prototype.selectCostumeForEdit = function () { + var cst = this.getData().copy(), + icon, + prepare, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + cst.name = ide.currentSprite.newCostumeName(cst.name); + icon = new CostumeIconMorph(cst); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + icon.setCenter(this.center()); + return icon; +}; + +TableCellMorph.prototype.selectSoundForEdit = function () { + var snd = this.getData().copy(), + icon, + prepare, + ide = this.parentThatIsA(IDE_Morph)|| + this.world().childThatIsA(IDE_Morph); + + snd.name = ide.currentSprite.newSoundName(snd.name); + icon = new SoundIconMorph(snd); + prepare = icon.prepareToBeGrabbed; + + icon.prepareToBeGrabbed = function (hand) { + hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + this.prepareToBeGrabbed = prepare; + }; + + if (ide.isAppMode) {return; } + icon.setCenter(this.center()); + return icon; +}; + +// TableMorph ////////////////////////////////////////////////////////// + +// TableMorph inherits from FrameMorph: + +TableMorph.prototype = new FrameMorph(); +TableMorph.prototype.constructor = TableMorph; +TableMorph.uber = FrameMorph.prototype; + +// TableMorph preferences settings: + +TableMorph.prototype.highContrast = false; + +// TableMorph instance creation: + +function TableMorph( + table, + // optional parameters below this line + scrollBarSize, + extent, + startRow, + startCol, + globalColWidth, + colWidths, + rowHeight, + colLabelHeight, + padding +) { + this.init( + table, + scrollBarSize, + extent, + startRow, + startCol, + globalColWidth, + colWidths, + rowHeight, + colLabelHeight, + padding + ); +} + +TableMorph.prototype.init = function ( + table, + scrollBarSize, + extent, + startRow, + startCol, + globalColWidth, + colWidths, + rowHeight, + colLabelHeight, + padding +) { + // additional properties: + this.table = table; + this.scrollBarSize = scrollBarSize || MorphicPreferences.scrollBarSize; + this.startRow = startRow || 1; + this.startCol = startCol || 1; + this.textHeight = Math.ceil( + fontHeight(SyntaxElementMorph.prototype.fontSize) * 1.3 + ); + this.rowHeight = rowHeight || this.textHeight; + this.colWidths = colWidths || []; + this.globalColWidth = globalColWidth || Math.ceil(this.textHeight * 3.5); + this.colLabelHeight = colLabelHeight || this.textHeight; + this.padding = padding || SyntaxElementMorph.prototype.scale; //1; + this.tableVersion = this.table.lastChanged; + + // scroll bars: + this.hBar = null; + this.vBar = null; + + // cached properties (do not persist): + this.rowLabelWidth = 0; + this.columns = []; // relative left positions + this.rows = 0; + + // cached properties for scrolling and resizing (do not persist): + this.maxStartRow = null; + this.maxStartCol = null; + this.dragAnchor = null; + this.resizeAnchor = null; + this.resizeCol = null; + this.resizeRow = null; + + // cached property for updating (don not persist): + this.wantsUpdate = false; + + // initialize inherited properties: + // make sure not to draw anything just yet + // therefore omit FrameMorph's properties (not needed here) + // and only initialize properties inherited from Morph: + Morph.prototype.init.call(this, true); + + // override inherited properites: + // this.fps = 3; // this will slow down the sliders (!) + if (extent) {this.bounds.setExtent(extent); } + this.initScrollBars(); + this.fixLayout(); +}; + +TableMorph.prototype.initScrollBars = function () { + var myself = this; + + // horizontal scroll bar - scrolls columns + this.hBar = new SliderMorph( + 1, // start + null, // stop + null, // value + null, // size + 'horizontal' + ); + this.hBar.setHeight(this.scrollBarSize); + this.hBar.action = function (num) { + myself.showData(num, null, true); + }; + this.hBar.isDraggable = false; + this.add(this.hBar); + + // vertical scroll bar - scrolls rows + this.vBar = new SliderMorph( + 1, // start + null, // stop + null, // value + null, // size + 'vertical' + ); + this.vBar.setWidth(this.scrollBarSize); + this.vBar.action = function (num) { + myself.showData(null, num, true); + }; + this.vBar.isDraggable = false; + this.add(this.vBar); +}; + +TableMorph.prototype.updateScrollBars = function () { + if (this.maxStartCol === 1) { + this.hBar.hide(); + } else { + this.hBar.show(); + this.hBar.stop = this.maxStartCol; + this.hBar.value = this.startCol; + this.hBar.size = Math.max( + this.hBar.rangeSize() * this.columns.length / this.table.cols(), + this.hBar.rangeSize() / 10 + ); + this.hBar.fixLayout(); + } + + this.vBar.stop = this.maxStartRow; + this.vBar.value = this.startRow; + if (this.maxStartRow === 1) { + this.vBar.hide(); + } else { + this.vBar.show(); + this.vBar.size = Math.max( + this.vBar.rangeSize() * this.rows / this.table.rows(), + this.vBar.rangeSize() / 10 + ); + this.vBar.fixLayout(); + } +}; + +TableMorph.prototype.fixLayout = function () { + TableMorph.uber.fixLayout.call(this); + + // determine and cache layout information + this.rowLabelWidth = this.rowLabelsWidth(); + this.columns = this.columnsLayout(); + this.rows = this.visibleRows(); + + this.buildCells(); + + // fix scroll bars layout + this.hBar.setWidth(this.width() - this.vBar.width()); + this.hBar.setLeft(this.left()); + this.hBar.setBottom(this.bottom()); + this.vBar.setHeight(this.height() - this.hBar.height()); + this.vBar.setRight(this.right()); + this.vBar.setTop(this.top()); +}; + +TableMorph.prototype.render = function (ctx) { + var w, i; + ctx.fillStyle = 'rgb(220, 220, 220)'; + BoxMorph.prototype.outlinePath.call( + this, + ctx, SyntaxElementMorph.prototype.corner + 1, + 0 + ); + ctx.fill(); + + // optionally draw grid + if (this.highContrast && this.table.cols() > 1) { + w = this.padding; + for (i = this.startCol; i <= this.table.cols(); i += 1) { + w += (this.colWidth(i) + this.padding); + } + ctx.fillStyle = 'darkGray'; + ctx.fillRect( + this.padding + this.rowLabelWidth, + this.padding + this.colLabelHeight, + w, + (this.rowHeight + this.padding) * + (this.table.rows() + 1 - this.startRow) + + this.padding + ); + } +}; + +TableMorph.prototype.buildCells = function () { + // also populate cells with the correct data and + // arrange the layout of cells all in one pass + var cell, r, c, + pos = this.position(); + + // delete all existing cells + this.children = []; + + // create cells + for (c = 0; c <= this.columns.length; c += 1) { + for (r = 0; r <= this.rows; r += 1) { + cell = new TableCellMorph( + this.table.get( + !c ? c : c + this.startCol - 1, + !r ? r : r + this.startRow - 1 + ), + new Point( + !c ? this.rowLabelWidth + : this.colWidth(c + this.startCol - 1), + !r ? this.colLabelHeight : this.rowHeight + ), + !(r && c), // isLabel + false // should be list + ); + cell.setPosition( + new Point( + !c ? this.padding + : this.columns[c - 1], + !r ? this.padding : + this.padding * 2 + this.colLabelHeight + + ((r - 1) * (this.rowHeight + this.padding)) + ).add(pos) + ); + this.add(cell); + if (isSnapObject(cell.getData())) { + this.wantsUpdate = true; + } + } + } + this.add(this.hBar); + this.add(this.vBar); + this.updateScrollBars(); +}; + +TableMorph.prototype.drawData = function (noScrollUpdate) { + // redraw all cells with their current data or label + var cell, cellIdx = 0, r, c; + for (c = 0; c <= this.columns.length; c += 1) { + for (r = 0; r <= this.rows; r += 1) { + cell = this.children[cellIdx]; + cellIdx += 1; + cell.setData( + this.table.get( + !c ? c : c + this.startCol - 1, + !r ? r : r + this.startRow - 1 + ) + ); + if (isSnapObject(cell.getData())) { + this.wantsUpdate = true; + } + } + } + if (!noScrollUpdate) {this.updateScrollBars(); } + this.changed(); +}; + +// TableMorph scrolling + +TableMorph.prototype.scroll = function (xSteps, ySteps) { + this.showData( + Math.min( + this.maxStartCol, + Math.max(1, this.startCol + Math.round(xSteps)) + ), + Math.min( + this.maxStartRow, + Math.max(1, this.startRow + Math.round(ySteps)) + ) + ); + this.updateScrollBars(); +}; + +TableMorph.prototype.showData = function (startCol, startRow, noScrollUpdate) { + var c = startCol || this.startCol, + r = startRow || this.startRow; + if (c === this.startCol) { + if (r === this.startRow) {return; } // no change + this.startRow = r; + this.rows = this.visibleRows(); + this.drawData(noScrollUpdate); + } else { + this.startCol = c; + this.startRow = r; + this.rows = this.visibleRows(); + if (this.colWidths.length) { + this.columns = this.columnsLayout(); + this.buildCells(); + } else { + this.drawData(noScrollUpdate); + } + } +}; + +// TableMorph stepping + +TableMorph.prototype.step = function () { + if (this.dragAnchor) { + this.shiftCells(this.world().hand.position()); + } else if (this.resizeAnchor) { + this.resizeCells(this.world().hand.position()); + } + this.update(); +}; + +TableMorph.prototype.update = function () { + var oldCols, oldRows, + version = this.table instanceof List ? + this.table.version( + this.startRow, + this.rows, + this.startCol, + this.columns.length + ) : this.table.lastChanged; + if (this.tableVersion === version && !this.wantsUpdate) { + return; + } + this.wantsUpdate = false; + if (this.table instanceof List) { + oldCols = this.columns.length; + oldRows = this.rows; + this.rowLabelWidth = this.rowLabelsWidth(); + this.columns = this.columnsLayout(); + this.rows = this.visibleRows(); + if (this.columns.length !== oldCols || (this.rows !== oldRows)) { + this.buildCells(); + } else { + this.drawData(); + } + } else { // Table + this.drawData(); + } + this.tableVersion = version; +}; + +// TableMorph layout helpers (all private): + +TableMorph.prototype.rowLabelsWidth = function () { + var ctx = StringMorph.prototype.measureCtx; + ctx.font = 'italic ' + SyntaxElementMorph.prototype.fontSize + + 'px Helvetica, Arial, sans-serif'; + return Math.max( + 0, + Math.max.apply( + null, + this.table.columnNames().map( + name => name ? ctx.measureText(name).width : 0 + ) + ) + ) || ctx.measureText(this.table.rows().toString()).width + + (6 * SyntaxElementMorph.prototype.scale); +}; + +TableMorph.prototype.columnsLayout = function () { + // determines and maxStartCol and + // modifies startCol if needed + var c = [], + x = this.padding * 2 + this.rowLabelWidth, + colNum, + w; + + // determine maxStartCol + colNum = this.table.cols(); + w = x; + while (w < this.width() && colNum > 0) { + w += this.colWidth(colNum); + colNum -= 1; + } + if (colNum === 0 && (w < this.width())) { + this.maxStartCol = 1; + } else { + this.maxStartCol = Math.min(colNum + 2, this.table.cols()); + } + + // determine the left position of every shown column + this.startCol = Math.min(this.startCol, this.maxStartCol); + colNum = this.startCol; + while (x < this.width() && + (colNum < (this.table.cols() + this.startCol)) + ) { + w = this.colWidth(colNum); + c.push(x); + x += w; + x += this.padding; + colNum += 1; + } + return c; +}; + +TableMorph.prototype.colWidth = function (col) { + return this.colWidths[col - 1] || this.globalColWidth; +}; + +TableMorph.prototype.visibleRows = function () { + // determines maxStartRow and + // modifies startRow if needed + var rest = this.height() - this.colLabelHeight - this.padding, + possible; + if (rest < 0) {return 0; } + possible = Math.ceil(rest / (this.rowHeight + this.padding)); + this.maxStartRow = Math.max(1, this.table.rows() - possible + 2); + this.startRow = Math.min(this.startRow, this.maxStartRow); + return Math.min(this.table.rows(), possible); +}; + +TableMorph.prototype.globalExtent = function () { + var i, + w = this.rowLabelsWidth() + 2, + cols = this.table.cols(); + for (i = 0; i < cols; i += 1) { + w += this.colWidth(i + 1); + w += this.padding; + } + if (cols === 1) { + w += this.scrollBarSize; + w += this.padding * 2; + } + return new Point( + w + this.padding, + this.colLabelHeight + (this.padding * 2) + + ((this.rowHeight + this.padding) * this.table.rows()) + ); +}; + +// TableMorph events: + +TableMorph.prototype.mouseScroll = function (y, x) { + this.scroll( + -(+x * MorphicPreferences.mouseScrollAmount / 4), + -(+y * MorphicPreferences.mouseScrollAmount) + ); +}; + +TableMorph.prototype.mouseDownLeft = function (pos) { + var rel = pos.subtract(this.position()); + if (rel.x <= this.rowLabelWidth || (rel.y <= this.colLabelHeight)) { + // resize cells + if (this.world().currentKey === 16) { // shiftClicked + this.resizeCol = 0; + } else { + this.resizeCol = this.columnAt(rel.x); + } + this.resizeRow = (rel.y > (this.colLabelHeight)); + this.resizeAnchor = pos; + } else { + // shift the viewed portion + this.resizeRow = null; + this.dragAnchor = pos; + } +}; + +TableMorph.prototype.mouseClickLeft = function (pos) { + this.dragAnchor = null; + this.resizeAnchor = null; + this.resizeRow = null; +}; + +TableMorph.prototype.mouseLeaveDragging = function (pos) { + this.dragAnchor = null; + this.resizeAnchor = null; + this.resizeRow = null; +}; + +TableMorph.prototype.mouseDoubleClick = function (pos) { + if (this.parentThatIsA(TableDialogMorph)) { + this.escalateEvent('mouseDoubleClick', pos); + } else { + new TableDialogMorph( + this.table, + this.globalColWidth, + this.colWidths, + this.rowHeight + ).popUp(this.world()); + } +}; + +// TableMorph scrolling and resizing cells by "hand" + +TableMorph.prototype.shiftCells = function (pos) { + var delta = this.dragAnchor.subtract(pos), + scrollX = Math.round(delta.x / this.globalColWidth), + scrollY = Math.round(delta.y / this.rowHeight); + if (scrollX || scrollY) { + this.scroll(scrollX, scrollY); + this.dragAnchor = pos; + } +}; + +TableMorph.prototype.resizeCells = function (pos) { + var delta = pos.subtract(this.resizeAnchor), + i; + + if (this.resizeCol) { + this.colWidths[this.resizeCol - 1] = Math.max( + 16, + (this.colWidths[this.resizeCol - 1] || this.globalColWidth) + + delta.x + ); + } else if (this.resizeRow) { + this.rowHeight = Math.max(16, this.rowHeight + delta.y); + } else { + this.globalColWidth = Math.max(16, this.globalColWidth + delta.x); + for (i = 0; i < this.colWidths.length; i += 1) { + if (this.colWidths[i]) { + this.colWidths[i] = Math.max( + 16, + this.colWidths[i] + delta.x + ); + } + } + } + this.rowLabelWidth = this.rowLabelsWidth(); + this.columns = this.columnsLayout(); + this.rows = this.visibleRows(); + this.buildCells(); + this.resizeAnchor = pos; + this.changed(); +}; + +TableMorph.prototype.columnAt = function (relativeX) { + var c = 0; + if (relativeX < (this.columns[0])) { + return 0; + } + while (relativeX > this.columns[c]) { + c += 1; + } + return c + this.startCol - 1; +}; + +// TableMorph context menu + +TableMorph.prototype.userMenu = function () { + var menu = new MenuMorph(this), + world = this.world(), + ide = detect(world.children, m => m instanceof IDE_Morph); + + if (ide.isAppMode) {return; } + if (this.parentThatIsA(TableDialogMorph)) { + if (this.colWidths.length) { + menu.addItem('reset columns', 'resetColumns'); + menu.addLine(); + } + if (this.table instanceof List && this.table.canBeJSON()) { + menu.addItem( + 'blockify', + () => { + this.table.blockify().pickUp(world); + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + ); + menu.addItem( + 'export', + () => { + if (this.table.canBeCSV()) { + ide.saveFileAs( + this.table.asCSV(), + 'text/csv;charset=utf-8', // RFC 4180 + localize('data') // name + ); + } else { + ide.saveFileAs( + this.table.asJSON(true), // guessObjects + 'text/json;charset=utf-8', + localize('data') // name + ); + } + } + ); + } + menu.addItem('open in another dialog...', 'openInDialog'); + return menu; + } + + if (this.colWidths.length) { + menu.addItem('reset columns', 'resetColumns'); + } + menu.addItem('list view...', 'showListView'); + if (this.table instanceof List && this.table.canBeJSON()) { + menu.addItem( + 'blockify', + () => { + this.table.blockify().pickUp(world); + world.hand.grabOrigin = { + origin: ide.palette, + position: ide.palette.center() + }; + } + ); + menu.addItem( + 'export', + () => { + if (this.table.canBeCSV()) { + ide.saveFileAs( + this.table.asCSV(), + 'text/csv;charset=utf-8', // RFC 4180 + localize('data') // name + ); + } else { + ide.saveFileAs( + this.table.asJSON(true), // guessObjects + 'text/json;charset=utf-8', + localize('data') // name + ); + } + } + ); + } + menu.addLine(); + menu.addItem('open in dialog...', 'openInDialog'); + return menu; +}; + +TableMorph.prototype.resetColumns = function () { + this.colWidths = []; + this.rowLabelWidth = this.rowLabelsWidth(); + this.columns = this.columnsLayout(); + this.rows = this.visibleRows(); + this.buildCells(); + this.changed(); +}; + +TableMorph.prototype.openInDialog = function () { + new TableDialogMorph( + this.table, + this.globalColWidth, + this.colWidths, + this.rowHeight + ).popUp(this.world()); +}; + +TableMorph.prototype.showListView = function () { + var view = this.parentThatIsA( + SpriteBubbleMorph, + SpeechBubbleMorph, + CellMorph + ); + if (!view) {return; } + if (view instanceof SpriteBubbleMorph) { + view.changed(); + view.contentsMorph.destroy(); + view.contentsMorph = new ListWatcherMorph(this.table); + view.contentsMorph.step = view.contents.update; + view.contentsMorph.expand(this.extent()); + view.parent.positionTalkBubble(); + } else if (view instanceof SpeechBubbleMorph) { + view.contents = new ListWatcherMorph(this.table); + view.contents.step = view.contents.update; + view.contents.expand(this.extent()); + } else { // watcher cell + view.changed(); + view.contentsMorph.destroy(); + view.contentsMorph = new ListWatcherMorph(this.table); + view.add(view.contentsMorph); + view.contentsMorph.setPosition(this.position()); + view.contentsMorph.expand(this.extent()); + } + view.fixLayout(); + view.rerender(); +}; + +// TableMorph updating: + +TableMorph.prototype.show = function () { + TableMorph.uber.show.call(this); + this.updateScrollBars(); +}; + +// TableFrameMorph ///////////////////////////////////////////////////////// + +// a UI for table morphs, for re-sizing tables and their columns + +// TableFrameMorph inherits from Morph: + +TableFrameMorph.prototype = new Morph(); +TableFrameMorph.prototype.constructor = TableFrameMorph; +TableFrameMorph.uber = Morph.prototype; + +// TableFrameMorph instance creation: + +function TableFrameMorph(tableMorph, noResize) { + this.init(tableMorph, noResize); +} + +TableFrameMorph.prototype.init = function (tableMorph, noResize) { + // additional properties: + this.tableMorph = tableMorph; + this.handle = null; + + // initialize inherited properties: + TableFrameMorph.uber.init.call(this, true); + + // override inherited properites: + this.color = 'transparent'; + this.bounds = this.tableMorph.bounds.copy(); + this.add(this.tableMorph); + + if (!noResize) { + this.handle = new HandleMorph( + this, // target + 80, // minX + 25, // minY + null, // insetX + null // insetY + ); + } + + this.fixLayout(); +}; + +TableFrameMorph.prototype.fixLayout = function () { + var ext = this.extent(); + if (this.tableMorph.extent().eq(ext)) {return; } + this.tableMorph.setExtent(this.extent()); + if (this.parent) { + this.parent.changed(); + this.parent.fixLayout(); + this.parent.rerender(); + } +}; + +// TableFrameMorph result / speech balloon support: + +TableFrameMorph.prototype.expand = function (maxExtent) { + var ext = this.tableMorph.globalExtent(); + if (maxExtent) { + ext = ext.min(maxExtent); + } + this.setExtent(ext); + this.handle.setRight(this.right()); + this.handle.setBottom(this.bottom()); +}; + +// TableDialogMorph inherits from DialogBoxMorph: + +TableDialogMorph.prototype = new DialogBoxMorph(); +TableDialogMorph.prototype.constructor = TableDialogMorph; +TableDialogMorph.uber = DialogBoxMorph.prototype; + +// TableDialogMorph instance creation: + +function TableDialogMorph(data, globalColWidth, colWidths, rowHeight) { + this.init(data, globalColWidth, colWidths, rowHeight); +} + +TableDialogMorph.prototype.init = function ( + data, + globalColWidth, + colWidths, + rowHeight +) { + // additional properties: + this.handle = null; + this.data = data; + this.tableView = null; + + // initialize inherited properties: + TableDialogMorph.uber.init.call(this); + + // override inherited properites: + this.labelString = 'Table view'; + this.createLabel(); + + // build contents + this.buildContents(data, globalColWidth, colWidths, rowHeight); +}; + +TableDialogMorph.prototype.buildContents = function ( + data, + globalColWidth, + colWidths, + rowHeight +) { + this.tableView = new TableMorph( + data, + null, // scrollBarSize + null, // extent + null, // startRow + null, // startCol + globalColWidth, + colWidths, + rowHeight, + null, // colLabelHeight + null // padding + ); + this.addBody(new TableFrameMorph(this.tableView, true)); + this.addButton('ok', 'OK'); +}; + +TableDialogMorph.prototype.setInitialDimensions = function () { + var world = this.world(), + mex = world.extent().subtract(new Point(this.padding, this.padding)), + th = fontHeight(this.titleFontSize) + this.titlePadding * 3, // hm... + bh = this.buttons.height(); + this.setExtent( + this.tableView.globalExtent().add( + new Point(this.padding * 2, this.padding * 2 + th + bh) + ).min(mex).max(new Point(100, 100)) + ); + this.setCenter(this.world().center()); +}; + +TableDialogMorph.prototype.popUp = function (world) { + if (world) { + TableDialogMorph.uber.popUp.call(this, world); + this.setInitialDimensions(); + this.handle = new HandleMorph( + this, + 100, + 100, + this.corner, + this.corner + ); + } +}; + +TableDialogMorph.prototype.fixLayout = + BlockEditorMorph.prototype.fixLayout; diff --git a/elements/pl-snap/Snap/src/threads.js b/elements/pl-snap/Snap/src/threads.js new file mode 100644 index 00000000..9042bcb8 --- /dev/null +++ b/elements/pl-snap/Snap/src/threads.js @@ -0,0 +1,9518 @@ +/* + + threads.js + + a tail call optimized blocks-based programming language interpreter + based on morphic.js and blocks.js + inspired by Scratch, Scheme and Squeak + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2024 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs blocks.js and objects.js + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + ThreadManager + Process + Context + Variable + VariableFrame + JSCompiler + + credits + ------- + John Maloney and Dave Feinberg designed the original Scratch evaluator + Ivan Motyashov contributed initial porting from Squeak + +*/ + +// Global stuff //////////////////////////////////////////////////////// + +/*global ArgMorph, BlockMorph, CommandBlockMorph, CommandSlotMorph, Morph, ZERO, +MultiArgMorph, Point, ReporterBlockMorph, SyntaxElementMorph, contains, Costume, +degrees, detect, nop, radians, ReporterSlotMorph, CSlotMorph, RingMorph, Sound, +IDE_Morph, ArgLabelMorph, localize, XML_Element, hex_sha512, TableDialogMorph, +StageMorph, SpriteMorph, StagePrompterMorph, Note, modules, isString, copy, Map, +isNil, WatcherMorph, List, ListWatcherMorph, alert, console, TableMorph, BLACK, +TableFrameMorph, ColorSlotMorph, isSnapObject, newCanvas, Symbol, SVG_Costume, +SnapExtensions, AlignmentMorph, TextMorph, Cloud, HatBlockMorph, InputSlotMorph, +StagePickerMorph, CustomBlockDefinition, CommentMorph*/ + +/*jshint esversion: 11, bitwise: false, evil: true*/ + +modules.threads = '2024-January-18'; + +var ThreadManager; +var Process; +var Context; +var Variable; +var VariableFrame; +var JSCompiler; + +const NONNUMBERS = [true, false, '']; + +(function () { + // "zum Schneckengang verdorben, was Adlerflug geworden wäre" + // collecting edge-cases that somebody complained about + // on Github. Folks, take it easy and keep it fun, okay? + // Shit like this is patently ugly and slows Snap down. Tnx! + for (var i = 9; i <= 13; i += 1) { + NONNUMBERS.push(String.fromCharCode(i)); + } + NONNUMBERS.push(String.fromCharCode(160)); +})(); + +function snapEquals(a, b) { + // nil + if (isNil(a) || isNil(b)) { + return a === b; + } + + // lists, functions and blocks + if (a.equalTo || b.equalTo) { + if (a.constructor.name === b.constructor.name) { + return a.equalTo(b); + } + return false; + } + + var x = +a, + y = +b; + + // check for special values before coercing to numbers + if (isNaN(x) || isNaN(y) || + [a, b].some(any => contains(NONNUMBERS, any) || + (isString(any) && (any.indexOf(' ') > -1))) + ) { + x = a; + y = b; + } + + // handle text comparison case-insensitive. + if (isString(x) && isString(y)) { + if (Process.prototype.isCaseInsensitive) { + return x.toLowerCase() === y.toLowerCase(); + } + } + + return x === y; +} + +function invoke( + action, // a BlockMorph or a Context, a reified ("ringified") block + contextArgs, // optional List of arguments for the context, or null + receiver, // sprite or environment, optional for contexts + timeout, // msecs + timeoutErrorMsg, // string + suppressErrors, // bool + callerProcess, // optional for JS-functions + returnContext // bool +) { + // execute the given block or context synchronously without yielding. + // Apply context (not a block) to a list of optional arguments. + // Receiver (sprite, stage or environment), timeout etc. are optional. + // If a timeout (in milliseconds) is specified, abort execution + // after the timeout has been reached and throw an error. + // SuppressErrors (bool) if non-timeout errors occurring in the + // block are handled elsewhere. + // This is highly experimental. + // Caution: Kids, do not try this at home! + // Use ThreadManager::startProcess with a callback instead + + var proc = new Process(), + deadline = (timeout ? Date.now() + timeout : null); + + if (action instanceof Context) { + if (receiver) { // optional + action = proc.reportContextFor(receiver); + } + proc.initializeFor(action, contextArgs || new List()); + } else if (action instanceof BlockMorph) { + proc.topBlock = action; + if (receiver) { + proc.homeContext = new Context(); + proc.homeContext.receiver = receiver; + if (receiver.variables) { + proc.homeContext.variables.parentFrame = receiver.variables; + } + } else { + throw new Error('expecting a receiver but getting ' + receiver); + } + proc.context = new Context( + null, + action.blockSequence(), + proc.homeContext + ); + } else if (action.evaluate) { + return action.evaluate(); + } else if (action instanceof Function) { + return action.apply( + receiver, + contextArgs.itemsArray().concat(callerProcess) + ); + } else { + throw new Error('expecting a block or ring but getting ' + action); + } + if (suppressErrors) { + proc.isCatchingErrors = false; + } + while (proc.isRunning()) { + if (deadline && (Date.now() > deadline)) { + throw (new Error( + localize( + timeoutErrorMsg || + "a synchronous Snap! script has timed out") + ) + ); + } + proc.runStep(deadline); + } + return returnContext ? proc.homeContext : proc.homeContext.inputs[0]; +} + +// ThreadManager /////////////////////////////////////////////////////// + +function ThreadManager() { + this.processes = []; + this.wantsToPause = false; // single stepping support +} + +ThreadManager.prototype.pauseCustomHatBlocks = false; +ThreadManager.prototype.disableClickToRun = false; + +ThreadManager.prototype.toggleProcess = function (block, receiver) { + if (this.disableClickToRun) { + return; + } + var active = this.findProcess(block, receiver); + if (active) { + active.stop(); + } else { + return this.startProcess( + block, + receiver, + null, + null, + null, + true, // isClicked + null, + null, + this.clickFrameFor(block) // for upvars declared inside hat blocks + ); + } +}; + +ThreadManager.prototype.startProcess = function ( + block, + receiver, + isThreadSafe, + exportResult, // bool + callback, + isClicked, + rightAway, + atomic, // special option used (only) for "onStop" scripts + variables // optional variable frame, used for WHEN hats +) { + var top = block.topBlock(), + active = this.findProcess(top, receiver), + glow, + newProc; + if (active) { + if (isThreadSafe) { + return active; + } + active.stop(); + active.canBroadcast = true; // broadcasts to fire despite reentrancy + this.removeTerminatedProcesses(); + } + newProc = new Process(top, receiver, callback, isClicked); + newProc.exportResult = exportResult; + newProc.isClicked = isClicked || false; + newProc.isAtomic = atomic || false; + + // in case an optional variable frame has been passed, + // copy it into the new outer context. + // Relevance: When a predicate inside a generic WHEN hat block + // publishes an upvar, this code makes the upvar accessible + // to the script attached to the WHEN hat + if (variables instanceof VariableFrame) { + Object.keys(variables.vars).forEach(vName => + newProc.context.outerContext.variables.vars[vName] = + variables.vars[vName] + ); + } + + // show a highlight around the running stack + // if there are more than one active processes + // for a block, display the thread count + // next to it + glow = top.getHighlight(); + if (glow) { + glow.threadCount = this.processesForBlock(top).length + 1; + glow.updateReadout(); + } else { + top.addHighlight(); + } + + this.processes.push(newProc); + if (rightAway) { + newProc.runStep(); + } + return newProc; +}; + +ThreadManager.prototype.stopAll = function (excpt) { + // excpt is optional + this.processes.forEach(proc => { + if (proc !== excpt) { + proc.stop(); + } + }); +}; + +ThreadManager.prototype.stopAllForReceiver = function (rcvr, excpt) { + // excpt is optional + this.processes.forEach(proc => { + if (proc.homeContext.receiver === rcvr && proc !== excpt) { + proc.stop(); + if (rcvr.isTemporary) { + proc.isDead = true; + } + } + }); +}; + +ThreadManager.prototype.stopAllForBlock = function (aTopBlock) { + this.processesForBlock(aTopBlock, true).forEach(proc => + proc.stop() + ); +}; + +ThreadManager.prototype.stopProcess = function (block, receiver) { + var active = this.findProcess(block, receiver); + if (active) { + active.stop(); + } +}; + +ThreadManager.prototype.pauseAll = function (stage) { + this.processes.forEach(proc => proc.pause()); + if (stage) { + stage.pauseAllActiveSounds(); + } +}; + +ThreadManager.prototype.isPaused = function () { + return detect( + this.processes, + proc => proc.isPaused + ) !== null; +}; + +ThreadManager.prototype.resumeAll = function (stage) { + this.processes.forEach(proc => proc.resume()); + if (stage) { + stage.resumeAllActiveSounds(); + } +}; + +ThreadManager.prototype.step = function () { + // run each process until it gives up control, skipping processes + // for sprites that are currently picked up, then filter out any + // processes that have been terminated + + var isInterrupted; + if (Process.prototype.enableSingleStepping) { + this.processes.forEach(proc => { + if (proc.isInterrupted) { + proc.runStep(); + isInterrupted = true; + } else { + proc.lastYield = Date.now(); + } + }); + this.wantsToPause = (Process.prototype.flashTime > 0.5); + if (isInterrupted) { + if (this.wantsToPause) { + this.pauseAll(); + } + return; + } + } + + this.processes.forEach(proc => { + if (!proc.homeContext.receiver.isPickedUp() && !proc.isDead) { + proc.runStep(); + } + }); + this.removeTerminatedProcesses(); +}; + +ThreadManager.prototype.removeTerminatedProcesses = function () { + // and un-highlight their scripts + var remaining = [], + count; + this.processes.forEach(proc => { + var result, + glow; + if ((!proc.isRunning() && !proc.errorFlag) || proc.isDead) { + if (proc.topBlock instanceof BlockMorph) { + proc.unflash(); + // adjust the thread count indicator, if any + count = this.processesForBlock(proc.topBlock).length; + if (count) { + glow = proc.topBlock.getHighlight() || + proc.topBlock.addHighlight(); + glow.threadCount = count; + glow.updateReadout(); + } else { + proc.topBlock.removeHighlight(); + } + } + if (proc.prompter) { + proc.prompter.destroy(); + if (proc.homeContext.receiver.stopTalking) { + proc.homeContext.receiver.stopTalking(); + } + } + if (proc.topBlock instanceof ReporterBlockMorph || + proc.isShowingResult || proc.exportResult) { + result = proc.homeContext.inputs[0]; + if (proc.onComplete instanceof Function) { + proc.onComplete(result); + } else { + if (result instanceof List) { + proc.topBlock.showBubble( + result.isTable() ? + new TableFrameMorph( + new TableMorph(result, 10) + ) + : new ListWatcherMorph(result), + proc.exportResult, + proc.receiver + ); + } else { + proc.topBlock.showBubble( + result, + proc.exportResult, + proc.receiver + ); + } + } + } else if (proc.onComplete instanceof Function) { + proc.onComplete(); + } + } else { + remaining.push(proc); + } + }); + this.processes = remaining; +}; + +ThreadManager.prototype.findProcess = function (block, receiver) { + var top = block.topBlock(); + return detect( + this.processes, + each => each.topBlock === top && (each.receiver === receiver) + ); +}; + +ThreadManager.prototype.processesForBlock = function (block, only) { + var top = only ? block : block.topBlock(); + return this.processes.filter(each => + each.topBlock === top && + each.isRunning() && + !each.isDead + ); +}; + +ThreadManager.prototype.doWhen = function (block, receiver, stopIt) { + if (this.pauseCustomHatBlocks) {return; } + if ((!block) || this.findProcess(block, receiver)) { + return; + } + var pred = block.inputs()[0], world, test; + if (block.removeHighlight()) { + world = block.world(); + if (world) { + world.hand.destroyTemporaries(); + } + } + if (stopIt) {return; } + try { + test = invoke( + pred, + null, + receiver, + 50, // timeout in msecs + 'the predicate takes\ntoo long for a\ncustom hat block', + true, // suppress errors => handle them right here instead + null, // caller process for JS-functions + true // return the whole home context instead of just he result + ); + } catch (error) { + block.addErrorHighlight(); + block.showBubble( + error.name + + '\n' + + error.message + ); + } + // since we're asking for the whole context instead of just the result + // of the computation, we need to look at the result-context's first + // input to find out whether the condition is met + if (test === true || (test && test.inputs && test.inputs[0] === true)) { + this.startProcess( + block, + receiver, + null, // isThreadSafe + null, // exportResult + null, // callback + null, // isClicked + true, // rightAway + null, // atomic + test.variables // make the test-context's variables available + ); + } +}; + +ThreadManager.prototype.toggleSingleStepping = function () { + Process.prototype.enableSingleStepping = + !Process.prototype.enableSingleStepping; + if (!Process.prototype.enableSingleStepping) { + this.processes.forEach(proc => { + if (!proc.isPaused) { + proc.unflash(); + } + }); + } +}; + +ThreadManager.prototype.clickFrameFor = function (block) { + // private - answer a variable frame or null containing upvar declarations + // in certain hat blocks if the user manually clicks on them + var name, frame; + if (block instanceof HatBlockMorph) { + if (block.selector === 'receiveKey' || + block.selector === 'receiveMessage') { + name = block.inputs()[1].evaluate()[0]; + if (name) { + frame = new VariableFrame(); + frame.addVar(name, ''); + return frame; + } + } + } + return null; +}; + +// Process ///////////////////////////////////////////////////////////// + +/* + A Process is what brings a stack of blocks to life. The process + keeps track of which block to run next, evaluates block arguments, + handles control structures, and so forth. + + The ThreadManager is the (passive) scheduler, telling each process + when to run by calling its runStep() method. The runStep() method + will execute some number of blocks, then voluntarily yield control + so that the ThreadManager can run another process. + + The Scratch etiquette is that a process should yield control at the + end of every loop iteration, and while it is running a timed command + (e.g. "wait 5 secs") or a synchronous command (e.g. "broadcast xxx + and wait"). Since Snap also has lambda and custom blocks Snap adds + yields at the beginning of each non-atomic custom command block + execution, and - to let users escape infinite loops and recursion - + whenever the process runs into a timeout. + + a Process runs for a receiver, i.e. a sprite or the stage or any + blocks-scriptable object that we'll introduce. + + structure: + + topBlock the stack's first block, of which all others + are children + receiver object (sprite) to which the process applies, + cached from the top block + instrument musical instrument type, cached from the receiver, + so a single sprite can play several instruments + at once + context the Context describing the current state + of this process + homeContext stores information relevant to the whole process, + i.e. its receiver, result etc. + isPaused boolean indicating whether to pause + readyToYield boolean indicating whether to yield control to + another process + readyToTerminate boolean indicating whether the stop method has + been called + isDead boolean indicating a terminated clone process + timeout msecs after which to force yield + lastYield msecs when the process last yielded + isFirstStep boolean indicating whether on first step - for clones + errorFlag boolean indicating whether an error was encountered + prompter active instance of StagePrompterMorph + httpRequest active instance of an HttpRequest or null + pauseOffset msecs between the start of an interpolated operation + and when the process was paused + isClicked boolean flag indicating whether the process was + initiated by a user-click on a block + isShowingResult boolean flag indicating whether a "report" command + has been executed in a user-clicked process + exportResult boolean flag indicating whether a picture of the top + block along with the result bubble shoud be exported + onComplete an optional callback function to be executed when + the process is done + procedureCount number counting procedure call entries, + used to tag custom block calls, so "stop block" + invocations can catch them + flashingContext for single stepping + isInterrupted boolean, indicates intra-step flashing of blocks + canBroadcast boolean, used to control reentrancy & "when stopped" +*/ + +Process.prototype = {}; +Process.prototype.constructor = Process; +Process.prototype.timeout = 500; // msecs after which to force yield +Process.prototype.isCatchingErrors = true; +Process.prototype.isCaseInsensitive = true; // text comparison +Process.prototype.enableHyperOps = true; +Process.prototype.enableLiveCoding = false; // experimental +Process.prototype.enableSingleStepping = false; +Process.prototype.enableCompiling = false; // experimental +Process.prototype.flashTime = 0; +Process.prototype.enableJS = false; + +function Process(topBlock, receiver, onComplete, yieldFirst) { + this.topBlock = topBlock || null; + this.receiver = receiver; + this.instrument = receiver ? receiver.instrument : null; + this.readyToYield = false; + this.readyToTerminate = false; + this.isDead = false; + this.isClicked = false; + this.isShowingResult = false; + this.errorFlag = false; + this.context = null; + this.homeContext = new Context(null, null, null, receiver); + this.lastYield = Date.now(); + this.isFirstStep = true; + this.isAtomic = false; + this.prompter = null; + this.httpRequest = null; + this.isPaused = false; + this.pauseOffset = null; + this.currentTime = Date.now(); // keeping track of time between yields + this.frameCount = 0; // only used for profiling and debugging + this.stepFrameCount = 0; // keeping track of when to keep time + this.yieldCount = 0; // only used for profiling and debugging + this.exportResult = false; + this.onComplete = onComplete || null; + this.procedureCount = 0; + this.flashingContext = null; // for single-stepping + this.isInterrupted = false; // for single-stepping + this.canBroadcast = true; // used to control "when I am stopped" + + if (topBlock) { + this.homeContext.variables.parentFrame = + this.homeContext.receiver.variables; + this.context = new Context( + null, + topBlock.blockSequence(), + this.homeContext + ); + if (yieldFirst) { + this.pushContext('doYield'); // highlight top block + } + } +} + +// Process accessing + +Process.prototype.isRunning = function () { + return !this.readyToTerminate && (this.context || this.isPaused); +}; + +// Process entry points + +Process.prototype.runStep = function (deadline) { + // a step is an an uninterruptable 'atom', it can consist + // of several contexts, even of several blocks + + if (this.isPaused) { // allow pausing in between atomic steps: + return this.pauseStep(); + } + this.readyToYield = false; + this.isInterrupted = false; + + // repeatedly evaluate the next context (stack frame) until + // it's time to yield. In case of WARP or infinite recursive + // reporters (or long HOFs) emergency-yield every 500 ms. + // Since looking up the current time at every stack frame puts + // an amazing strain on performance, only check the system time + // every n (=100) contexts. + // This is happens over at evaluateContext(). + while (!this.readyToYield && !this.isInterrupted + && this.context + && (this.currentTime - this.lastYield < this.timeout) + ) { + // also allow pausing inside atomic steps - for PAUSE block primitive: + if (this.isPaused) { + return this.pauseStep(); + } + if (deadline && (this.currentTime > deadline)) { + if (this.isAtomic && + this.homeContext.receiver && + this.homeContext.receiver.endWarp) { + this.homeContext.receiver.endWarp(); + } + return; + } + this.evaluateContext(); + } + + this.stepFrameCount = 0; + this.yieldCount += 1; + this.lastYield = Date.now(); + this.isFirstStep = false; + + // make sure to redraw atomic things + if (this.isAtomic && + this.homeContext.receiver && + this.homeContext.receiver.endWarp) { + this.homeContext.receiver.endWarp(); + this.homeContext.receiver.startWarp(); + } + + if (this.readyToTerminate) { + while (this.context) { + this.popContext(); + } + if (this.homeContext.receiver) { + if (this.homeContext.receiver.endWarp) { + // pen optimization + this.homeContext.receiver.endWarp(); + } + } + } +}; + +Process.prototype.stop = function () { + this.readyToYield = true; + this.readyToTerminate = true; + this.errorFlag = false; + if (this.context) { + this.context.stopMusic(); + } + this.canBroadcast = false; +}; + +Process.prototype.pause = function () { + if (this.readyToTerminate) { + return; + } + this.isPaused = true; + this.flashPausedContext(); + if (this.context && this.context.startTime) { + this.pauseOffset = Date.now() - this.context.startTime; + } +}; + +Process.prototype.resume = function () { + if (!this.enableSingleStepping) { + this.unflash(); + } + this.isPaused = false; + this.pauseOffset = null; +}; + +Process.prototype.pauseStep = function () { + this.lastYield = Date.now(); + if (this.context && this.context.startTime) { + this.context.startTime = this.lastYield - this.pauseOffset; + } +}; + +// Process evaluation + +Process.prototype.evaluateContext = function () { + var exp = this.context.expression; + + // keep track of overall frames for profiling purposes. + // also keep track of frames inside the current atomic step. + // In order to let Snap! behave similarly on a wide range of + // differently performant hardware decide when to yield inside + // a WARPed script or an infinitely recursive reporter + // by how much time has elapsed since the last yield, but since + // looking up the system time is surprisingly costly only look it + // up every 100 frames. + this.frameCount += 1; + this.stepFrameCount += 1; + if (this.stepFrameCount > 100) { + this.currentTime = Date.now(); + this.stepFrameCount = 0; + } + + if (this.context.tag === 'exit') { + this.expectReport(); + } + if (exp instanceof Array) { + return this.evaluateSequence(exp); + } + if (exp instanceof MultiArgMorph) { + return this.evaluateMultiSlot(exp, exp.inputs().length); + } + if (exp instanceof ArgLabelMorph) { + return this.evaluateArgLabel(exp); + } + if (exp instanceof ArgMorph || (exp && exp.bindingID)) { + return this.evaluateInput(exp); + } + if (exp instanceof BlockMorph) { + return this.evaluateBlock(exp, exp.inputs().length); + } + if (isString(exp)) { + return this[exp].apply(this, this.context.inputs); + } + if (exp instanceof Variable) { // special case for empty reporter rings + this.returnValueToParentContext(exp.value); + } + this.popContext(); // default: just ignore it +}; + +Process.prototype.evaluateBlock = function (block, argCount) { + var rcvr, inputs, + selector = block.selector; + + // check for special forms + if (selector === 'reportVariadicOr' || + selector === 'reportVariadicAnd' || + selector === 'doIf' || + selector === 'reportIfElse' || + selector === 'doReport') { + if (this.isCatchingErrors) { + try { + return this[selector](block); + } catch (error) { + this.handleError(error, block); + } + } else { + return this[selector](block); + } + } + + // first evaluate all inputs, then apply the primitive + rcvr = this.context.receiver || this.receiver; + inputs = this.context.inputs; + + if (argCount > inputs.length) { + // this.evaluateNextInput(block); + this.evaluateNextInputSet(block); // frame-optimized version + } else { + if (this.flashContext()) {return; } // yield to flash the block + if (this[selector]) { + rcvr = this; + } + if (this.isCatchingErrors) { + try { + this.returnValueToParentContext( + rcvr[selector].apply(rcvr, inputs) + ); + this.popContext(); + } catch (error) { + this.handleError(error, block); + } + } else { + this.returnValueToParentContext( + rcvr[selector].apply(rcvr, inputs) + ); + this.popContext(); + } + } +}; + +// Process: Primitive Extensions (for libraries etc.) + +Process.prototype.doApplyExtension = function (prim, args) { + this.reportApplyExtension(prim, args); +}; + +Process.prototype.reportApplyExtension = function (prim, args) { + var ext = SnapExtensions.primitives.get(prim); + if (isNil(ext)) { + throw new Error( + localize('missing / unspecified extension') + ': ' + prim + ); + } + return ext.apply( + this.blockReceiver(), + args.itemsArray().concat([this]) + ); +}; + +// Process: Special Forms Blocks Primitives + +Process.prototype.reportVariadicOr = function (block) { + this.reportAssociativeBool( + block, + this.reportBasicOr, // base op + true // short-circuit return value + ); +}; + +Process.prototype.reportVariadicAnd = function (block) { + this.reportAssociativeBool( + block, + this.reportBasicAnd, // base op + false // short-circuit return value + ); +}; + +Process.prototype.reportAssociativeBool = function (block, baseOp, short) { + // private - evaluate special form variadic associative Boolean operations + // such as AND, OR + // baseOp - dyadic base operation (AND, OR) + // short - value at which to immediately return (short circuit) + var inputs = this.context.inputs, + tests = block.inputs()[0], + inline = tests instanceof MultiArgMorph, + outer = this.context.outerContext, + acc = this.context.accumulator, + check = slot => { + if (slot instanceof List || typeof slot === 'boolean') { + inputs.push(slot); + } else { + this.pushContext(); + this.evaluate(slot); + } + }; + if (inputs.length < 1) { + if (inline) { + acc = this.context.accumulator = { + slots: tests.inputs(), + len: tests.inputs().length, + pc: 1 + }; + if (acc.slots.length) { + this.pushContext(acc.slots[0], outer); + } else { + this.context.addInput(!short); + } + } else { // tests is an ArgLabelMorph + this.pushContext(tests.argMorph(), outer); + } + } else if (inputs.length === 1) { + if (acc) { // inline - acc has been initialized + if (inputs[0] === short) { + if (this.flashContext()) {return; } + this.returnValueToParentContext(short); + this.popContext(); + } else if (acc.pc >= acc.len) { + if (this.flashContext()) {return; } + this.returnValueToParentContext( + inputs[0] === null ? !short : inputs[0] + ); + this.popContext(); + } else { + if (inline) { + this.pushContext(acc.slots[acc.pc], outer); + } else { + check(acc.slots[acc.pc]); + } + } + } else { // "with input list" variant + this.context.accumulator = { + slots: inputs[0].itemsArray(), + len: inputs[0].length(), + pc: 1 + }; + inputs.pop(); + check(this.context.accumulator.slots[0]); + } + } else { + if (this.flashContext()) {return; } + inputs.push(this.hyper( + baseOp, + inputs.pop(), + inputs.pop() + )); + acc.pc += 1; + } +}; + +Process.prototype.reportBasicOr = function (a, b) { + return a || b; +}; + +Process.prototype.reportBasicAnd = function (a, b) { + return a && b; +}; + +Process.prototype.doReport = function (block) { + var outer = this.context.outerContext; + if (this.flashContext()) {return; } // flash the block here, special form + if (this.isClicked && (block.topBlock() === this.topBlock)) { + this.isShowingResult = true; + } + if (block.partOfCustomCommand) { + this.doStopCustomBlock(); + this.popContext(); + } else { + while (this.context && this.context.tag !== 'exit') { + if (this.context.expression === 'doStopWarping') { + this.doStopWarping(); + } else { + this.popContext(); + } + } + if (this.context) { + if (this.context.expression === 'expectReport') { + // pop off inserted top-level exit context + this.popContext(); + } else { + // un-tag and preserve original caller + this.context.tag = null; + } + } + } + // in any case evaluate (and ignore) + // the input, because it could be + // an HTTP Request for a hardware extension + this.pushContext(block.inputs()[0], outer); + this.context.isCustomCommand = block.partOfCustomCommand; +}; + +// Process: Non-Block evaluation + +Process.prototype.evaluateMultiSlot = function (multiSlot, argCount) { + // first evaluate all subslots, then return a list of their values + var inputs = this.context.inputs, + ans; + if (multiSlot.bindingID) { + if (this.isCatchingErrors) { + try { + ans = this.context.variables.getVar(multiSlot.bindingID); + } catch (error) { + this.handleError(error, multiSlot); + } + } else { + ans = this.context.variables.getVar(multiSlot.bindingID); + } + this.returnValueToParentContext(ans); + this.popContext(); + } else { + if (argCount > inputs.length) { + // this.evaluateNextInput(multiSlot); + this.evaluateNextInputSet(multiSlot); // frame-optimized version + } else { + this.returnValueToParentContext(new List(inputs)); + this.popContext(); + } + } +}; + +Process.prototype.evaluateArgLabel = function (argLabel) { + // perform the ID function on an ArgLabelMorph element + var inputs = this.context.inputs; + if (inputs.length < 1) { + this.evaluateNextInput(argLabel); + } else { + this.returnValueToParentContext(inputs[0]); + this.popContext(); + } +}; + +Process.prototype.evaluateInput = function (input) { + // evaluate the input unless it is bound to an implicit parameter + var ans; + if (this.flashContext()) {return; } // yield to flash the current argMorph + if (input.bindingID) { + if (this.isCatchingErrors) { + try { + ans = this.context.variables.getVar(input.bindingID); + } catch (error) { + this.handleError(error, input); + } + } else { + ans = this.context.variables.getVar(input.bindingID); + } + } else { + ans = input.evaluate(); + if (ans) { + if (input.constructor === CommandSlotMorph || + input.constructor === ReporterSlotMorph || + (input instanceof CSlotMorph && + (!input.isStatic || input.isLambda))) { + // I know, this still needs yet to be done right.... + ans = this.reify(ans, new List()); + } + } + } + this.returnValueToParentContext(ans); + this.popContext(); +}; + +Process.prototype.evaluateSequence = function (arr) { + var pc = this.context.pc, + outer = this.context.outerContext, + isCustomBlock = this.context.isCustomBlock; + if (pc === (arr.length - 1)) { // tail call elimination + this.context = new Context( + this.context.parentContext, + arr[pc], + this.context.outerContext, + this.context.receiver + ); + this.context.isCustomBlock = isCustomBlock; + } else { + if (pc >= arr.length) { + this.popContext(); + } else { + this.context.pc += 1; + this.pushContext(arr[pc], outer); + } + } +}; + +/* +// version w/o tail call optimization: +-------------------------------------- +Caution: we cannot just revert to this version of the method, because to make +tail call elimination work many tweaks had to be done to various primitives. +For the most part these tweaks are about schlepping the outer context (for +the variable bindings) and the isCustomBlock flag along, and are indicated +by a short comment in the code. But to really revert would take a good measure +of trial and error as well as debugging. In the developers file archive there +is a version of threads.js dated 120119(2) which basically resembles the +last version before introducing tail call optimization on 120123. + +Process.prototype.evaluateSequence = function (arr) { + var pc = this.context.pc; + if (pc >= arr.length) { + this.popContext(); + } else { + this.context.pc += 1; + this.pushContext(arr[pc]); + } +}; +*/ + +Process.prototype.evaluateNextInput = function (element) { + var nxt = this.context.inputs.length, + args = element.inputs(), + exp = args[nxt], + sel = this.context.expression.selector, + outer = this.context.outerContext; // for tail call elimination + + if (exp.isUnevaluated) { + if (exp.isUnevaluated === true || exp.isUnevaluated()) { + // just return the input as-is + /* + Note: we only reify the input here, if it's not an + input to a reification primitive itself (THE BLOCK, + THE SCRIPT), because those allow for additional + explicit parameter bindings. + */ + if (sel === 'reify' || sel === 'reportScript') { + this.context.addInput(exp); + } else { + this.context.addInput(this.reify(exp, new List())); + } + } else { + this.pushContext(exp, outer); + } + } else { + this.pushContext(exp, outer); + } +}; + +Process.prototype.evaluateNextInputSet = function (element) { + // Optimization to use instead of evaluateNextInput(), bums out a few + // frames and function calls to save some milliseconds. + // the idea behind this optimization is to keep evaluating the inputs + // while we know for sure that we aren't going to yield anyway + var args = element.inputs(), + sel = this.context.expression?.selector, + outer = this.context.outerContext, // for tail call elimination + exp, ans; + + while (args.length > this.context.inputs.length) { + exp = args[this.context.inputs.length]; + if (exp.isUnevaluated) { + if (exp.isUnevaluated === true || exp.isUnevaluated()) { + if (sel === 'reify' || sel === 'reportScript') { + this.context.addInput(exp); + } else { + this.context.addInput(this.reify(exp, new List())); + } + } else { + this.pushContext(exp, outer); + break; + } + } else { + if (exp instanceof MultiArgMorph || exp instanceof ArgLabelMorph || + exp instanceof BlockMorph) { + this.pushContext(exp, outer); + break; + } else { // asuming an ArgMorph + if (this.flashContext()) {return; } // yield to flash + if (exp.bindingID) { + if (this.isCatchingErrors) { + try { + ans = this.context.variables.getVar(exp.bindingID); + } catch (error) { + this.handleError(error, exp); + } + } else { + ans = this.context.variables.getVar(exp.bindingID); + } + } else { + ans = exp.evaluate(); + if (ans) { + if (exp.constructor === CommandSlotMorph || + exp.constructor === ReporterSlotMorph || + (exp instanceof CSlotMorph && + (!exp.isStatic || exp.isLambda))) { + ans = this.reify(ans, new List()); + } + } + } + this.context.addInput(ans); + } + } + } +}; + +Process.prototype.doYield = function () { + this.popContext(); + if (!this.isAtomic) { + this.readyToYield = true; + } +}; + +Process.prototype.expectReport = function () { + this.handleError(new Error("reporter didn't report")); +}; + +// Process Exception Handling + +Process.prototype.throwError = function (error, element) { + var m = element, + ide = this.homeContext.receiver.parentThatIsA(IDE_Morph); + this.stop(); + this.errorFlag = true; + this.topBlock.addErrorHighlight(); + if (ide.isAppMode) { + ide.showMessage(localize(error.name) + '\n' + error.message); + } else { + if (isNil(m) || isNil(m.world())) {m = this.topBlock; } + m.showBubble( + this.errorBubble(error, element), + this.exportResult, + this.receiver + ); + } +}; + +Process.prototype.tryCatch = function (action, exception, errVarName) { + var next = this.context.continuation(); + + this.handleError = function(error) { + this.resetErrorHandling(); + if (exception.expression instanceof CommandBlockMorph) { + exception.expression = exception.expression.blockSequence(); + } + exception.pc = 0; + exception.outerContext.variables.addVar(errVarName); + exception.outerContext.variables.setVar(errVarName, error.message); + this.context = exception; + this.evaluate(next, new List(), true); + }; + + this.evaluate(action, new List(), true); +}; + +Process.prototype.resetErrorHandling = function () { + this.handleError = this.throwError; +}; + +Process.prototype.resetErrorHandling(); + +Process.prototype.errorObsolete = function () { + throw new Error('a custom block definition is missing'); +}; + +Process.prototype.errorBubble = function (error, element) { + // Return a morph containing an image of the elment causing the error + // above the text of error. + var errorMorph = new AlignmentMorph('column', 5), + errorIsNested = !!element && isNil(element.world()), + errorPrefix = errorIsNested ? `${localize('Inside a custom block')}\n` + : '', + errorMessage = new TextMorph( + `${errorPrefix}${localize(error.name)}\n${localize(error.message)}`, + SyntaxElementMorph.prototype.fontSize + ), + blockToShow = element; + + errorMorph.add(errorMessage); + + if (errorIsNested && error.cause !== 'user') { + if (blockToShow.selector === 'reportGetVar') { + // if I am a single variable, show my caller in the output. + blockToShow = blockToShow.parent || blockToShow; + } + errorMorph.children[0].text += `\n${localize('The question came up at')}`; + errorMorph.children[0].fixLayout(); + errorMorph.add(blockToShow.fullCopy()); + } + + errorMorph.fixLayout(); + return errorMorph; +}; + +Process.prototype.variableError = function (varName) { + throw new Error( + localize('a variable of name') + + ' \'' + + varName + + '\'\n' + + localize('does not exist in this context') + ); +}; + +// Process Lambda primitives + +Process.prototype.reify = function (topBlock, parameterNames, isCustomBlock) { + var context = new Context( + null, + null, + this.context ? this.context.outerContext : null + ), + i = 0; + + if (this.context?.expression instanceof RingMorph) { + context.comment = this.context.expression?.comment?.text(); + } + if (topBlock) { + context.expression = this.enableLiveCoding || + this.enableSingleStepping ? + topBlock : topBlock.fullCopy(); + context.expression.show(); // be sure to make visible if in app mode + + if (!isCustomBlock && !parameterNames.length()) { + // mark all empty slots with an identifier + context.expression.allEmptySlots().forEach(slot => { + i += 1; + if (slot instanceof MultiArgMorph) { + slot.bindingID = Symbol.for('arguments'); + } else { + slot.bindingID = i; + } + }); + // and remember the number of detected empty slots + context.emptySlots = i; + } + } else { + context.expression = this.enableLiveCoding || + this.enableSingleStepping ? [this.context.expression] + : [this.context.expression.fullCopy()]; + } + + context.inputs = parameterNames.itemsArray(); + context.receiver + = this.context ? this.context.receiver : this.receiver; + context.origin = context.receiver; // for serialization + + return context; +}; + +Process.prototype.reportScript = function (parameterNames, topBlock) { + return this.reify(topBlock, parameterNames); +}; + +Process.prototype.reifyScript = function (topBlock, parameterNames) { + return this.reify(topBlock, parameterNames); +}; + +Process.prototype.reifyReporter = function (topBlock, parameterNames) { + return this.reify(topBlock, parameterNames); +}; + +Process.prototype.reifyPredicate = function (topBlock, parameterNames) { + return this.reify(topBlock, parameterNames); +}; + +Process.prototype.reportJSFunction = function (parmNames, body) { + if (!this.enableJS) { + throw new Error('JavaScript extensions for Snap!\nare turned off'); + } + return Function.apply( + null, + parmNames.itemsArray().concat([body]) + ); +}; + +Process.prototype.doRun = function (context, args) { + return this.evaluate(context, args, true); +}; + +Process.prototype.evaluate = function ( + context, + args = new List(), + isCommand = false +) { + if (!context) { + return this.returnValueToParentContext(null); + } + if (context instanceof Function) { + return context.apply( + this.blockReceiver(), + args.itemsArray().concat([this]) + ); + } + if (context.isContinuation) { + return this.runContinuation(context, args); + } + if (context instanceof List) { + return this.hyperEval(context, args); + } + if (!(context instanceof Context)) { + throw new Error('expecting a ring but getting ' + context); + } + + var outer = new Context(null, null, context.outerContext), + caller = this.context.parentContext, + cont = this.context.rawContinuation(!isCommand), + exit, + runnable, + expr, + parms = args.itemsArray(), + i, + value; + + if (!outer.receiver) { + outer.receiver = context.receiver; // for custom blocks + } + runnable = new Context( + this.context.parentContext, + context.expression, + outer, + context.receiver + ); + runnable.isCustomCommand = isCommand; // for short-circuiting HTTP requests + this.context.parentContext = runnable; + + if (context.expression instanceof ReporterBlockMorph) { + // auto-"warp" nested reporters + this.readyToYield = (this.currentTime - this.lastYield > this.timeout); + } + + // assign a self-reference for introspection and recursion + outer.variables.addVar(Symbol.for('self'), context); + + // capture the dynamic scope in "this caller" + outer.variables.addVar(Symbol.for('caller'), this.context); + + // capture the current continuation + outer.variables.addVar(Symbol.for('continuation'), cont); + + // assign arguments to parameters + + // assign the actual arguments list to the special + // parameter ID Symbol.for('arguments'), to be used for variadic inputs + outer.variables.addVar(Symbol.for('arguments'), args); + + // assign arguments that are actually passed + if (parms.length > 0) { + + // assign formal parameters + for (i = 0; i < context.inputs.length; i += 1) { + value = 0; + if (!isNil(parms[i])) { + value = parms[i]; + } + outer.variables.addVar(context.inputs[i], value); + } + + // assign implicit parameters if there are no formal ones + if (context.inputs.length === 0) { + // in case there is only one input + // assign it to all empty slots... + if (parms.length === 1) { + // ... unless it's an empty reporter ring, + // in which special case it gets treated as the ID-function; + // experimental feature jens is not at all comfortable with + if (!context.emptySlots) { + expr = context.expression; + if (expr instanceof Array && + expr.length === 1 && + expr[0].selector && + expr[0].selector === 'reifyReporter' && + !expr[0].contents()) { + runnable.expression = new Variable(parms[0]); + } + } else { + for (i = 1; i <= context.emptySlots; i += 1) { + outer.variables.addVar(i, parms[0]); + } + } + // otherwise match the inputs sequentially to the empty slots, + // disregard unmatched or excess inputs or slots + } else { + for (i = 1; i <= parms.length; i += 1) { + outer.variables.addVar(i, parms[i - 1]); + } + } + } + } + + if (runnable.expression instanceof CommandBlockMorph) { + runnable.expression = runnable.expression.blockSequence(); + if (!isCommand) { + if (caller) { + // tag caller, so "report" can catch it later + caller.tag = 'exit'; + } else { + // top-level context, insert a tagged exit context + // which "report" can catch later + exit = new Context( + runnable.parentContext, + 'expectReport', + outer, + outer.receiver + ); + exit.tag = 'exit'; + runnable.parentContext = exit; + } + } + } +}; + +Process.prototype.hyperEval = function (context, args) { + // hyper-monadic deep-map + // note: currently only literal inputs are supported in hyper-calls + var mapBlock = SpriteMorph.prototype.blockForSelector('reportMap'), + callBlock = SpriteMorph.prototype.blockForSelector('evaluate'), + varBlock = SpriteMorph.prototype.variableBlock('fn'), + argsBlock = this.assertType(args, 'JSON').blockify(), + funArg; + + callBlock.replaceInput(callBlock.inputs()[0], varBlock); + callBlock.replaceInput(callBlock.inputs()[1], argsBlock); + funArg = this.reify(callBlock, new List(['fn'])); + + this.popContext(); + this.pushContext(mapBlock); + this.context.inputs = [funArg, context]; + this.pushContext(); +}; + +Process.prototype.fork = function (context, args) { + if (this.readyToTerminate) {return; } + var proc = new Process(), + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + proc.instrument = this.instrument; + proc.receiver = this.receiver; + proc.initializeFor(context, args); + // proc.pushContext('doYield'); + stage.threads.processes.push(proc); +}; + +Process.prototype.initializeFor = function (context, args) { + // used by Process.fork() and global invoke() + if (context.isContinuation) { + throw new Error( + 'continuations cannot be forked' + ); + } + if (!(context instanceof Context)) { + throw new Error( + localize('expecting a') + ' ' + + localize('ring') + ' ' + + localize('but getting a') + ' ' + + localize(this.reportTypeOf(context)) + ); + } + + var outer = new Context(null, null, context.outerContext), + runnable = new Context(null, + context.expression, + outer + ), + parms = args.itemsArray(), + i, + value; + + // remember the receiver + this.context = context.receiver; + + // assign arguments to parameters + + // assign the actual arguments list to the special + // parameter ID Symbol.for('arguments'), to be used for variadic inputs + outer.variables.addVar(Symbol.for('arguments'), args); + + // assign arguments that are actually passed + if (parms.length > 0) { + + // assign formal parameters + for (i = 0; i < context.inputs.length; i += 1) { + value = 0; + if (!isNil(parms[i])) { + value = parms[i]; + } + outer.variables.addVar(context.inputs[i], value); + } + + // assign implicit parameters if there are no formal ones + if (context.inputs.length === 0) { + // in case there is only one input + // assign it to all empty slots + if (parms.length === 1) { + for (i = 1; i <= context.emptySlots; i += 1) { + outer.variables.addVar(i, parms[0]); + } + + // otherwise match the inputs sequentially to the empty slots, + // disregard unmatched or excess inputs or slots + } else { + for (i = 1; i <= parms.length; i += 1) { + outer.variables.addVar(i, parms[i - 1]); + } + } + } + } + + if (runnable.expression instanceof CommandBlockMorph) { + runnable.expression = runnable.expression.blockSequence(); + } + + this.homeContext = new Context(); // context.outerContext; + this.homeContext.receiver = context.outerContext.receiver; + this.topBlock = context.expression; + this.context = runnable; +}; + +// Process introspection + +Process.prototype.reportEnvironment = function (choice, trgt = this.context) { + switch (this.inputOption(choice)) { + case 'caller': + return this.reportCaller(trgt); + case 'continuation': + return this.reportContinuation(trgt); + case 'inputs': + return this.reportInputs(trgt); + default: + return this.reportSelf(trgt); + } +}; + +Process.prototype.reportSelf = function (trgt) { + var sym = Symbol.for('self'), + frame = trgt.variables.silentFind(sym), + ctx; + if (frame) { + ctx = copy(frame.vars[sym].value); + } else { + ctx = this.topBlock.reify(); + } + ctx.outerContext = trgt.outerContext; + if (ctx.outerContext) { + ctx.variables.parentFrame = ctx.outerContext.variables; + } + return ctx; +}; + +Process.prototype.reportCaller = function (trgt) { + var sym = Symbol.for('caller'), + frame = trgt.variables.silentFind(sym), + ctx, nb; + if (frame) { + ctx = copy(frame.vars[sym].value); + // ctx.expression = ctx.expression?.topBlock().fullCopy(); + ctx.expression = ctx.expression?.fullCopy(); + nb = ctx.expression?.nextBlock ? ctx.expression.nextBlock() : null; + if (nb) { + nb.destroy(); + } + ctx.inputs = []; + return ctx; + } + return this.blockReceiver(); +}; + +Process.prototype.reportContinuation = function (trgt) { + var sym = Symbol.for('continuation'), + frame = trgt.variables.silentFind(sym), + cont; + if (frame) { + cont = frame.vars[sym].value; + cont = cont.copyForContinuation(); + cont.tag = null; + cont.isContinuation = true; + } else { + cont = new Context( + null, + 'popContext' + ); + cont.isContinuation = true; + } + return cont; +}; + +Process.prototype.reportInputs = function (trgt) { + var sym = Symbol.for('arguments'), + frame = trgt.variables.silentFind(sym); + return frame ? frame.vars[sym].value : new List(); +}; + +// Process stopping blocks primitives + +Process.prototype.doStopBlock = function () { + var target = this.context.expression.exitTag; + if (isNil(target)) { + return this.doStopCustomBlock(); + } + while (this.context && + (isNil(this.context.tag) || (this.context.tag > target))) { + if (this.context.expression === 'doStopWarping') { + this.doStopWarping(); + } else { + this.popContext(); + } + } + this.pushContext(); +}; + +Process.prototype.doStopCustomBlock = function () { + // fallback solution for "report" blocks inside + // custom command definitions and untagged "stop" blocks + while (this.context && !this.context.isCustomBlock) { + if (this.context.expression === 'doStopWarping') { + this.doStopWarping(); + } else { + this.popContext(); + } + } +}; + +// Process continuations primitives + +Process.prototype.doCallCC = function (aContext, isReporter) { + this.evaluate( + aContext, + new List([this.context.continuation(isReporter)]), + !isReporter + ); +}; + +Process.prototype.reportCallCC = function (aContext) { + this.doCallCC(aContext, true); +}; + +Process.prototype.runContinuation = function (aContext, args) { + var parms = args.itemsArray(); + + // determine whether the continuations is to show the result + // in a value-balloon becuse the user has directly clicked on a reporter + if (aContext.expression === 'expectReport' && parms.length) { + this.stop(); + this.homeContext.inputs[0] = parms[0]; + return; + } + + this.context.parentContext = aContext.copyForContinuationCall(); + // passing parameter if any was passed + if (parms.length === 1) { + this.context.parentContext.outerContext.variables.addVar( + 1, + parms[0] + ); + } +}; + +// Process custom block primitives + +Process.prototype.evaluateCustomBlock = function () { + var caller = this.context.parentContext, + block = this.context.expression, + method = block.isGlobal ? block.definition + : this.blockReceiver().getMethod(block.semanticSpec), + context = method.body, + declarations = method.declarations, + cont = this.context.rawContinuation(method.type !== 'command'), + args = new List(this.context.inputs), + parms = args.itemsArray(), + runnable, + exit, + i, + value, + outer; + + if (!context) {return null; } + this.procedureCount += 1; + outer = new Context(); + outer.receiver = this.context.receiver; + + outer.variables.parentFrame = block.variables; + + // block (instance) var support: + // only splice in block vars if any are defined, because block vars + // can cause race conditions in global block definitions that + // access sprite-local variables at the same time. + if (method.variableNames.length) { + block.variables.parentFrame = outer.receiver ? + outer.receiver.variables : null; + } else { + // original code without block variables: + outer.variables.parentFrame = outer.receiver ? + outer.receiver.variables : null; + } + + runnable = new Context( + this.context.parentContext, + context.expression, + outer, + outer.receiver + ); + runnable.isCustomBlock = true; + this.context.parentContext = runnable; + + // passing parameters if any were passed + if (parms.length > 0) { + + // assign formal parameters + for (i = 0; i < context.inputs.length; i += 1) { + value = 0; + if (!isNil(parms[i])) { + value = parms[i]; + } + outer.variables.addVar(context.inputs[i], value); + + // if the parameter is an upvar, + // create a reference to the variable it points to + if (declarations.get(context.inputs[i])[0] === '%upvar') { + this.context.outerContext.variables.vars[value] = + outer.variables.vars[context.inputs[i]]; + } + } + } + + // tag return target + if (method.type !== 'command') { + // clear previous exit tags, if any + runnable.expression.tagExitBlocks(undefined, false); + if (caller) { + // tag caller, so "report" can catch it later + caller.tag = 'exit'; + } else { + // top-level context, insert a tagged exit context + // which "report" can catch later + exit = new Context( + runnable.parentContext, + 'expectReport', + outer, + outer.receiver + ); + exit.tag = 'exit'; + runnable.parentContext = exit; + } + // auto-"warp" nested reporters + this.readyToYield = (this.currentTime - this.lastYield > this.timeout); + } else { + // tag all "stop this block" blocks with the current + // procedureCount as exitTag, and mark all "report" blocks + // as being inside a custom command definition + runnable.expression.tagExitBlocks(this.procedureCount, true); + + // tag the caller with the current procedure count, so + // "stop this block" blocks can catch it, but only + // if the caller hasn't been tagged already + if (caller && !caller.tag) { + caller.tag = this.procedureCount; + } + // yield commands unless explicitly "warped" or directly recursive + if (!this.isAtomic && method.isDirectlyRecursive()) { + this.readyToYield = true; + } + } + + // keep track of the environment for recursion and introspection + outer.variables.addVar(Symbol.for('self'), context); + outer.variables.addVar(Symbol.for('caller'), this.context); + outer.variables.addVar(Symbol.for('continuation'), cont); + outer.variables.addVar(Symbol.for('arguments'), args); + + runnable.expression = runnable.expression.blockSequence(); +}; + +// Process variables primitives + +Process.prototype.doDeclareVariables = function (varNames) { + var varFrame = this.context.outerContext.variables; + varNames.itemsArray().forEach(name => + varFrame.addVar(name) + ); +}; + +Process.prototype.doSetVar = function (varName, value) { + var varFrame = this.context.variables, + name = varName; + if (name instanceof Context) { + if (name.expression.selector === 'reportGetVar') { + name.variables.setVar( + name.expression.blockSpec, + value, + this.blockReceiver() + ); + return; + } + this.doSet(name, value); + return; + } + if (name instanceof Array) { + this.doSet(name, value); + return; + } + varFrame.setVar(name, value, this.blockReceiver()); +}; + +Process.prototype.doChangeVar = function (varName, value) { + var varFrame = this.context.variables, + name = varName; + this.assertType(value, 'number', ''); + if (name instanceof Context) { + if (name.expression.selector === 'reportGetVar') { + name.variables.changeVar( + name.expression.blockSpec, + value, + this.blockReceiver() + ); + return; + } + } + varFrame.changeVar(name, value, this.blockReceiver()); +}; + +Process.prototype.reportGetVar = function () { + // assumes a getter block whose blockSpec is a variable name + return this.context.variables.getVar( + this.context.expression.blockSpec + ); +}; + +Process.prototype.doShowVar = function (varName, context) { + // context is an optional start-context to be used by extensions + var varFrame = (context || (this.context || this.homeContext)).variables, + stage, + watcher, + target, + label, + others, + isGlobal, + name = varName; + + if (name instanceof Context) { + if (name.expression.selector === 'reportGetVar') { + name = name.expression.blockSpec; + } else { + this.blockReceiver().changeBlockVisibility(name.expression, false); + return; + } + } + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + target = varFrame.silentFind(name); + if (!target) {return; } + // first try to find an existing (hidden) watcher + watcher = detect( + stage.children, + morph => morph instanceof WatcherMorph && + morph.target === target && + morph.getter === name + ); + if (watcher !== null) { + watcher.show(); + watcher.fixLayout(); // re-hide hidden parts + return; + } + // if no watcher exists, create a new one + isGlobal = contains( + this.homeContext.receiver.globalVariables().names(), + varName + ); + if (isGlobal || target.owner) { + label = name; + } else { + label = name + ' ' + localize('(temporary)'); + } + watcher = new WatcherMorph( + label, + SpriteMorph.prototype.blockColor.variables, + target, + name + ); + watcher.setPosition(stage.position().add(10)); + others = stage.watchers(watcher.left()); + if (others.length > 0) { + watcher.setTop(others[others.length - 1].bottom()); + } + stage.add(watcher); + watcher.fixLayout(); + watcher.rerender(); + } + } +}; + +Process.prototype.doHideVar = function (varName, context) { + // if no varName is specified delete all watchers on temporaries + // context is an optional start-context to be used by extensions + var varFrame = (context || this.context).variables, + stage, + watcher, + target, + name = varName; + + if (name instanceof Context) { + if (name.expression.selector === 'reportGetVar') { + name = name.expression.blockSpec; + } else { + this.blockReceiver().changeBlockVisibility(name.expression, true); + return; + } + } + if (!name) { + this.doRemoveTemporaries(); + return; + } + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + target = varFrame.find(name); + watcher = detect( + stage.children, + morph => morph instanceof WatcherMorph && + morph.target === target && + morph.getter === name + ); + if (watcher !== null) { + if (watcher.isTemporary()) { + watcher.destroy(); + } else { + watcher.hide(); + } + } + } + } +}; + +Process.prototype.doRemoveTemporaries = function () { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.watchers().forEach(watcher => { + if (watcher.isTemporary()) { + watcher.destroy(); + } + }); + } + } +}; + +// Process sprite inheritance primitives + +Process.prototype.doDeleteAttr = function (attrName) { + var name = attrName, + rcvr = this.blockReceiver(); + if (name instanceof Context) { + if (name.expression.selector === 'reportGetVar') { + name = name.expression.blockSpec; + } else { // attribute + name = { + xPosition: 'x position', + yPosition: 'y position', + direction: 'direction', + getCostumeIdx: 'costume #', + size: 'size' + }[name.expression.selector]; + if (!isNil(name)) { + rcvr.inheritAttribute(name); + } + return; // error: cannot delete attribute... + } + } + if (name instanceof Array) { + return rcvr.inheritAttribute(this.inputOption(name)); + } + if (contains(rcvr.inheritedVariableNames(true), name)) { + rcvr.deleteVariable(name); + } +}; + +// message passing primitives + +Process.prototype.doTellTo = function (sprite, context, args) { + this.doRun( + this.reportAttributeOf(context, sprite), + args + ); +}; + +Process.prototype.reportAskFor = function (sprite, context, args) { + this.evaluate( + this.reportAttributeOf(context, sprite), + args + ); +}; + +// Process lists primitives + +Process.prototype.reportNewList = function (elements) { + return elements; +}; + +Process.prototype.reportCONS = function (car, cdr) { + this.assertType(cdr, 'list'); + return new List().cons(car, cdr); +}; + +Process.prototype.reportCDR = function (list) { + this.assertType(list, 'list'); + return list.cdr(); +}; + +Process.prototype.doAddToList = function (element, list) { + this.assertType(list, 'list'); + if (list.type) { + this.assertType(element, list.type); + list = this.shadowListAttribute(list); + } + list.add(element); +}; + +Process.prototype.doDeleteFromList = function (index, list) { + var idx = index; + this.assertType(list, 'list'); + if (list.type) { + list = this.shadowListAttribute(list); + } + if (this.inputOption(index) === 'all') { + return list.clear(); + } + if (index === '') { + return null; + } + if (this.inputOption(index) === 'last') { + idx = list.length(); + } + list.forget(idx); +}; + +Process.prototype.doInsertInList = function (element, index, list) { + var idx = index; + this.assertType(list, 'list'); + if (list.type) { + this.assertType(element, list.type); + list = this.shadowListAttribute(list); + } + if (index === '') { + return null; + } + if (index instanceof Array) { + if (index[0] === 'random') { + idx = this.reportBasicRandom(1, list.length() + 1); + } else if (index[0] === 'last') { + idx = list.length() + 1; + } else { + idx = list.length() + 1; + } + } + if (parseFloat(idx) !== +idx) { // treat as alphanumerical index + return list.bind(idx, element); + } + list.add(element, idx); +}; + +Process.prototype.doReplaceInList = function (index, list, element) { + var idx = index; + this.assertType(list, 'list'); + if (list.type) { + this.assertType(element, list.type); + list = this.shadowListAttribute(list); + } + if (index === '') { + return null; + } + if (index instanceof Array) { + if (index[0] === 'random') { + idx = this.reportBasicRandom(1, list.length() + 1); + } else if (index[0] === 'last') { + idx = list.length(); + } else { + idx = 0; + } + } + list.bind(idx, element); +}; + +Process.prototype.shadowListAttribute = function (list) { + // private - check whether the list is an attribute that needs to be + // shadowed. Use only on typed lists for performance. + var rcvr; + if (list.type === 'costume' || list.type === 'sound') { + rcvr = this.blockReceiver(); + if (list === rcvr.costumes) { + rcvr.shadowAttribute('costumes'); + list = rcvr.costumes; + } else if (list === rcvr.sounds) { + rcvr.shadowAttribute('sounds'); + list = rcvr.sounds; + } + } + return list; +}; + +// Process accessing list elements - hyper dyadic + +Process.prototype.reportListItem = function (index, list) { + this.assertType(list, 'list'); + if (index === '') { + return ''; + } + if (index instanceof Array) { + if (index[0] === 'random') { + return list.at(this.reportBasicRandom(1, list.length())); + } + if (index[0] === 'last') { + return list.at(list.length()); + } + return ''; + } + if (index instanceof List && this.enableHyperOps) { + return list.query(index); + } + return list.lookup(index); +}; + +// Process - tabular list ops + +Process.prototype.reportTranspose = function (list) { + this.assertType(list, 'list'); + return list.transpose(); +}; + +Process.prototype.reportCrossproduct = function (lists) { + this.assertType(lists, 'list'); + if (lists.isEmpty()) { + return lists.cons(new List(), lists); + } + this.assertType(lists.at(1), 'list'); + return lists.crossproduct(); +}; + +Process.prototype.reportReshape = function (list, shape) { + this.assertType(shape, 'list'); + list = list instanceof List ? list : new List([list]); + return list.reshape(shape); +}; + +Process.prototype.reportSlice = function (list, indices) { + // currently not in use + this.assertType(list, 'list'); + this.assertType(indices, 'list'); + return list.slice(indices); +}; + +// Process - other basic list accessors + +Process.prototype.reportListAttribute = function (choice, list) { + var option = this.inputOption(choice); + switch (option) { + case 'length': + this.assertType(list, 'list'); + return list.length(); + case 'size': + this.assertType(list, 'list'); + return list.size(); + case 'rank': + return this.reportRank(list); + case 'dimensions': + return this.reportDimensions(list); + case 'flatten': + return list instanceof List ? list.ravel() : new List([list]); + case 'columns': + this.assertType(list, 'list'); + return list.columns(); + case 'transpose': + this.assertType(list, 'list'); + return list.transpose(); + case 'uniques': + this.assertType(list, 'list'); + if (list.canBeCSV()) { + return this.reportListAttribute( + 'distribution', + list + ).columns().at(1); + } + return this.reportUniqueValues(list); + case 'distribution': + this.assertType(list, 'list'); + if (list.canBeJSON()) { + // support computing the frequency distribution of nested lists + // if all leaf items have atomic data, + // observe case-sensitivity setting + return list.map(row => { + let entry = row instanceof List ? + '__json__' + row.asJSON() // internally tag as list + : row; + return isString(entry) && Process.prototype.isCaseInsensitive ? + entry.toLowerCase() + : entry; + }).distribution().map(row => { + let item = row.at(1); + return new List([ + isString(item) && item.startsWith('__json__') ? + this.parseJSON(item.slice(8)) + : item, + row.at(2) + ]); + }); + } + return this.reportDistribution(list); + case 'sorted': + this.assertType(list, 'list'); + return this.reportSorted(list); + case 'shuffled': + this.assertType(list, 'list'); + return this.reportShuffled(list); + case 'reverse': + this.assertType(list, 'list'); + return list.reversed(); + case 'text': + this.assertType(list, 'list'); + if (list.canBeWords()) { + return list.asWords(); + } + throw new Error( + localize('unable to convert to') + ' ' + localize('text') + ); + case 'lines': + this.assertType(list, 'list'); + if (list.canBeTXT()) { + return list.asTXT(); + } + throw new Error( + localize('unable to convert to') + ' ' + localize('lines') + ); + case 'csv': + this.assertType(list, 'list'); + if (list.canBeCSV()) { + return list.asCSV(); + } + throw new Error( + localize('unable to convert to') + ' ' + localize('CSV') + ); + case 'json': + this.assertType(list, 'list'); + if (list.canBeJSON()) { + return list.asJSON(); + } + throw new Error( + localize('unable to convert to') + ' ' + localize('JSON') + ); + default: + return 0; + } +}; + +Process.prototype.reportListLength = function (list) { + this.assertType(list, 'list'); + return list.length(); +}; + +Process.prototype.reportListIndex = function(element, list) { + this.assertType(list, 'list'); + return list.indexOf(element); +}; + +Process.prototype.reportListContainsItem = function (list, element) { + this.assertType(list, 'list'); + return list.contains(element); +}; + +Process.prototype.reportListIsEmpty = function (list) { + this.assertType(list, 'list'); + return list.isEmpty(); +}; + +Process.prototype.reportRank = function (data) { + return data instanceof List ? data.rank() : 0; +}; + +Process.prototype.reportQuickRank = function (data) { + // private - assume a regularly shaped nested list + return data instanceof List ? data.quickRank() : 0; +}; + +Process.prototype.reportDimensions = function (data) { + return data instanceof List ? data.shape() : new List(); +}; + +Process.prototype.doShowTable = function (list) { + // experimental + this.assertType(list, 'list'); + new TableDialogMorph(list).popUp(this.blockReceiver().world()); +}; + +// process - analyzing sorting and shuffling a list (general utility) + +Process.prototype.reportUniqueValues = function (list) { + // Filter - answer a new list representing the set of unique values + // in the list based on equality, + // interpolated so it can be interrupted by the user + // because snapEquals() can be a lot slower than identity comparison + var next; + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + idx : 0, + target : [] + }; + } + if (this.context.accumulator.idx === list.length()) { + this.returnValueToParentContext( + new List(this.context.accumulator.target) + ); + return; + } + this.context.accumulator.idx += 1; + next = list.at(this.context.accumulator.idx); + if (!this.context.accumulator.target.some(any => snapEquals(any, next))) { + this.context.accumulator.target.push(next); + } + this.pushContext(); +}; + +Process.prototype.reportDistribution = function (list) { + // answer a new list with an entry for each unique value and the + // number of its occurrences in the source list, + // interpolated so it can be interrupted by the user + // because snapEquals() can be a lot slower than identity comparison + var next, record; + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + idx : 0, + target : [] + }; + } + if (this.context.accumulator.idx === list.length()) { + this.returnValueToParentContext( + new List(this.context.accumulator.target.map(row => new List(row))) + ); + return; + } + this.context.accumulator.idx += 1; + next = list.at(this.context.accumulator.idx); + + record = this.context.accumulator.target.find(row => + snapEquals(row[0], next) + ); + if (record !== undefined) { + record[1] += 1; + } else { + this.context.accumulator.target.push([next, 1]); + } + this.pushContext(); +}; + +Process.prototype.reportSorted = function (data) { + return new List(data.itemsArray().slice().sort((a, b) => + this.reportIsBefore(a, b) ? - 1 : 1 + )); +}; + +Process.prototype.reportIsBefore = function (a, b) { + // private - this is an elaborate version of reportBasicLessThan() + // that is similar to snapEquals in that it will work with heterogeneous + // data types but is too slow for everyday use. Therefore it is currently + // only used for the generalized sorting of arbitrary data (lists) + // and not exposed as the (better) semantics behind "<" + var order = [ + 'list', + 'text', + 'number', + 'Boolean', + 'command', + 'reporter', + 'predicate', + 'costume', + 'sound', + 'sprite', + 'stage', + 'nothing', + 'undefined' + ], + typeA = this.reportTypeOf(a), + typeB = this.reportTypeOf(b), + lenA, lenB; + + if (typeA !== typeB) { + return order.indexOf(typeA) < order.indexOf(typeB); + } + switch (typeA) { + case 'list': + // primary: length of list descending (!) + // secondary: contents of columns from left to right + // recursive, hope this doesn't crash on large tables + lenA = a.length(); + lenB = b.length(); + return lenA > lenB || ( + lenA === lenB && ( + !lenA || + this.reportIsBefore(a.at(1), b.at(1)) || + (snapEquals(a.at(1), b.at(1)) && + this.reportIsBefore(a.cdr(), b.cdr())) + ) + ); + case 'command': + case 'reporter': + case 'predicate': + return a.expression.abstractBlockSpec() < + b.expression.abstractBlockSpec(); + case 'costume': + case 'sound': + case 'sprite': + case 'stage': + return a.name < b.name; + default: + // number, Boolean, text or other + return this.reportBasicLessThan(a, b); + } +}; + +Process.prototype.reportShuffled = function (data) { + // Fisher-Yates algorithm + var array = [...data.itemsArray()], + i, k, tmp; + for (i = array.length - 1; i > 0; i -= 1) { + k = Math.floor(Math.random() * (i + 1)); + tmp = array[i]; + array[i] = array[k]; + array[k] = tmp; + } + return new List(array); +}; + +// Process non-HOF list primitives + +Process.prototype.reportNumbers = function (start, end) { + // hyper-dyadic + return this.hyper( + (strt, stp) => this.reportBasicNumbers(strt, stp), + start, + end + ); +}; + +Process.prototype.reportBasicNumbers = function (start, end) { + // answer a new arrayed list containing an linearly ascending progression + // of integers beginning at start to end. + var result, len, i, + s = +start, + e = +end, + n = s; + + this.assertType(s, 'number'); + this.assertType(e, 'number'); + + if (e > s) { + len = Math.floor(e - s); + result = new Array(len); + for(i = 0; i <= len; i += 1) { + result[i] = n; + n += 1; + } + } else { + len = Math.floor(s - e); + result = new Array(len); + for(i = 0; i <= len; i += 1) { + result[i] = n; + n -= 1; + } + } + return new List(result); +}; + +Process.prototype.reportListCombination = function (choice, lists) { + // experimental, currently not in use + var option = this.inputOption(choice); + switch (option) { + case 'append': + return this.reportConcatenatedLists(lists); + case 'cross product': + return this.reportCrossproduct(lists); + default: + return 0; + } +}; + +Process.prototype.reportConcatenatedLists = function (lists) { + var first, result, rows, row, rowIdx, cols, col; + this.assertType(lists, 'list'); + if (lists.isEmpty()) { + return lists; + } + first = lists.at(1); + this.assertType(first, 'list'); + if (first.isLinked) { // link everything + return this.concatenateLinkedLists(lists); + } + + // in case the first sub-list is arrayed + result = []; + rows = lists.length(); + for (rowIdx = 1; rowIdx <= rows; rowIdx += 1) { + row = lists.at(rowIdx); + this.assertType(row, 'list'); + cols = row.length(); + for (col = 1; col <= cols; col += 1) { + result.push(row.at(col)); + } + } + return new List(result); +}; + +Process.prototype.concatenateLinkedLists = function (lists) { + var first; + if (lists.isEmpty()) { + return lists; + } + first = lists.at(1); + this.assertType(first, 'list'); + if (lists.length() === 1) { + return first; + } + if (first.isEmpty()) { + return this.concatenateLinkedLists(lists.cdr()); + } + return lists.cons( + first.at(1), + this.concatenateLinkedLists( + lists.cons( + first.cdr(), + lists.cdr() + ) + ) + ); +}; + +// Process interpolated non-HOF list primitives + +Process.prototype.reportLinkedNumbers = function (start, end) { + // - currently not in use - + // answer a new linked list containing an linearly ascending progression + // of integers beginning at start to end. + // this is interpolated so it can handle big ranges of numbers + // without blocking the UI + + var dta; + if (this.context.accumulator === null) { + this.assertType(start, 'number'); + this.assertType(end, 'number'); + this.context.accumulator = { + target : new List(), + end : null, + idx : +start, + step: +end > +start ? +1 : -1 + }; + this.context.accumulator.target.isLinked = true; + this.context.accumulator.end = this.context.accumulator.target; + } + dta = this.context.accumulator; + if (dta.step === 1 ? dta.idx > +end : dta.idx < +end) { + dta.end.rest = new List(); + this.returnValueToParentContext(dta.target.cdr()); + return; + } + dta.end.rest = dta.target.cons(dta.idx); + dta.end = dta.end.rest; + dta.idx += dta.step; + this.pushContext(); +}; + +// Process conditionals primitives + +/* // original non-variadic non-special form version + // retained for documentation +Process.prototype.doIf = function () { + var args = this.context.inputs, + outer = this.context.outerContext, // for tail call elimination + isCustomBlock = this.context.isCustomBlock; + + // this.assertType(args[0], ['Boolean']); + this.popContext(); + if (args[0]) { + if (args[1]) { + this.pushContext(args[1].blockSequence(), outer); + this.context.isCustomBlock = isCustomBlock; + } + } + this.pushContext(); +}; +*/ + +Process.prototype.doIfElse = function () { + var args = this.context.inputs, + outer = this.context.outerContext, // for tail call elimination + isCustomBlock = this.context.isCustomBlock; + + // this.assertType(args[0], ['Boolean']); + this.popContext(); + if (args[0]) { + if (args[1]) { + this.pushContext(args[1].blockSequence(), outer); + } + } else { + if (args[2]) { + this.pushContext(args[2].blockSequence(), outer); + } else { + this.pushContext('doYield'); + } + } + if (this.context) { + this.context.isCustomBlock = isCustomBlock; + } + + this.pushContext(); +}; + +Process.prototype.doIf = function (block) { + // special form - experimental + var args = this.context.inputs, + inps = block.inputs(), + outer = this.context.outerContext, + acc = this.context.accumulator, + isCustomBlock = this.context.isCustomBlock; + + if (!acc) { + acc = this.context.accumulator = { + args: inps.slice(0, 2).concat(inps[2].inputs()) + }; + } + if (!args.length) { + if (acc.args.length) { + this.pushContext(acc.args.shift(), outer); + this.context.isCustomBlock = isCustomBlock; + return; + } + this.popContext(); + return; + } + if (args.pop()) { + this.popContext(); + this.pushContext(acc.args.shift().evaluate()?.blockSequence(), outer); + this.context.isCustomBlock = isCustomBlock; + return; + } + acc.args.shift(); +}; + +Process.prototype.reportIfElse = function (block) { + var inputs = this.context.inputs, + accumulator, + condition, + expression, + trueIsBlock, + falseIsBlock; + + if (inputs.length < 1) { + // evaluate the first input, either a Boolean or a (nested) list + this.evaluateNextInput(block); + return; + } + + if (inputs[0] instanceof List && this.enableHyperOps) { + // hyperize a (nested) list of Booleans + if (this.context.accumulator === null) { + // cache literal true/false cases for optimized evaluation + trueIsBlock = block.inputs()[1] instanceof BlockMorph; + falseIsBlock = block.inputs()[2] instanceof BlockMorph; + this.context.accumulator = { + results : [], + trueIsLiteral : !trueIsBlock, + trueCase : trueIsBlock ? null : block.inputs()[1].evaluate(), + falseIsLiteral : !falseIsBlock, + falseCase : falseIsBlock ? null : block.inputs()[2].evaluate() + }; + // optimize if both true-/false- cases are literals + // for atomic conditions: + if (!trueIsBlock && !falseIsBlock) { + this.returnValueToParentContext(inputs[0].deepMap( + leaf => leaf ? this.context.accumulator.trueCase + : this.context.accumulator.falseCase) + ); + this.popContext(); + return; + } + } else if (inputs.length > 1) { + // retrieve & remember previous result & remove it from the inputs + this.context.accumulator.results.push(inputs.pop()); + } + accumulator = this.context.accumulator; + if (accumulator.results.length === inputs[0].length()) { + // done with all the conditions in the current list + this.returnValueToParentContext( + new List(accumulator.results) + ); + this.popContext(); + return; + } + condition = inputs[0].at(accumulator.results.length + 1); + + // optimize single literal true-/false- cases for atomic conditions: + if (!(condition instanceof List)) { + if (condition && accumulator.trueIsLiteral) { + accumulator.results.push(accumulator.trueCase); + return; + } + if (!condition && accumulator.falseIsLiteral) { + accumulator.results.push(accumulator.falseCase); + return; + } + } + + this.pushContext(block); // recursive call + this.context.addInput(condition); + // optimize evaluation of literals: + this.context.accumulator = copy(accumulator); + this.context.accumulator.results = []; + return; + } + + // handle a scalar condition + if (inputs.length > 1) { + // done with evaluating a case, retrieve and return its result + if (this.flashContext()) {return; } + this.returnValueToParentContext(inputs.pop()); + this.popContext(); + return; + } + // this.assertType(inputs[0], ['Boolean']); + if (inputs[0]) { + expression = block.inputs()[1]; // true block + } else { + expression = block.inputs()[2]; // false block + } + this.pushContext(expression); +}; + +// Process process related primitives + +Process.prototype.doStop = function () { + this.stop(); +}; + +Process.prototype.doStopAll = function () { + var ide; + if (this.homeContext.receiver) { + ide = this.homeContext.receiver.parentThatIsA(IDE_Morph); + ide.scene.stop(); + } +}; + +Process.prototype.doStopAllScenes = function () { + var ide; + if (this.homeContext.receiver) { + ide = this.homeContext.receiver.parentThatIsA(IDE_Morph); + ide.scenes.map(scn => scn.stop(true)); + } +}; + +Process.prototype.doStopThis = function (choice) { + switch (this.inputOption(choice)) { + case 'all': + this.doStopAll(); + break; + case 'all scenes': + this.doStopAllScenes(); + break; + case 'this script': + this.doStop(); + break; + case 'this block': + this.doStopBlock(); + break; + default: + this.doStopOthers(choice); + } +}; + +Process.prototype.doStopOthers = function (choice) { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + switch (this.inputOption(choice)) { + case 'all but this script': + stage.threads.stopAll(this); + break; + case 'other scripts in sprite': + stage.threads.stopAllForReceiver( + this.context.outerContext.receiver, + // this.homeContext.receiver, + this + ); + break; + default: + nop(); + } + } + } +}; + +Process.prototype.doWarp = function (body) { + // execute my contents block atomically (more or less) + var outer = this.context.outerContext, // for tail call elimination + isCustomBlock = this.context.isCustomBlock, + stage; + + this.popContext(); + + if (body) { + if (this.homeContext.receiver) { + if (this.homeContext.receiver.startWarp) { + // pen optimization + this.homeContext.receiver.startWarp(); + } + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + } + + // this.pushContext('doYield'); // no longer needed in Morphic2 + this.pushContext('popContext'); // instead we do this... + + if (this.context) { + this.context.isCustomBlock = isCustomBlock; + } + if (!this.isAtomic) { + this.pushContext('doStopWarping'); + } + this.pushContext(body.blockSequence(), outer); + this.isAtomic = true; + } + this.pushContext(); +}; + +Process.prototype.doStopWarping = function () { + var stage; + this.popContext(); + this.isAtomic = false; + if (this.homeContext.receiver) { + if (this.homeContext.receiver.endWarp) { + // pen optimization + this.homeContext.receiver.endWarp(); + } + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + } +}; + +Process.prototype.reportIsFastTracking = function () { + var ide; + if (this.homeContext.receiver) { + ide = this.homeContext.receiver.parentThatIsA(IDE_Morph); + if (ide) { + return ide.stage.isFastTracked; + } + } + return false; +}; + +Process.prototype.doSetGlobalFlag = function (name, bool) { + var stage = this.homeContext.receiver.parentThatIsA(StageMorph); + name = this.inputOption(name); + this.assertType(bool, 'Boolean'); + switch (name) { + case 'turbo mode': + this.doSetFastTracking(bool); + break; + case 'case sensitivity': + Process.prototype.isCaseInsensitive = !bool; + break; + case 'flat line ends': + SpriteMorph.prototype.useFlatLineEnds = bool; + break; + case 'log pen vectors': + StageMorph.prototype.enablePenLogging = bool; + break; + case 'video capture': + if (bool) { + this.startVideo(stage); + } else { + stage.stopProjection(); + } + break; + case 'mirror video': + stage.mirrorVideo = bool; + break; + } +}; + +Process.prototype.reportGlobalFlag = function (name) { + var stage = this.homeContext.receiver.parentThatIsA(StageMorph); + name = this.inputOption(name); + switch (name) { + case 'turbo mode': + return this.reportIsFastTracking(); + case 'case sensitivity': + return !Process.prototype.isCaseInsensitive; + case 'flat line ends': + return SpriteMorph.prototype.useFlatLineEnds; + case 'log pen vectors': + return StageMorph.prototype.enablePenLogging; + case 'video capture': + return !isNil(stage.projectionSource) && + stage.projectionLayer() + .getContext('2d') + .getImageData(0, 0, 1, 1) + .data[3] > 0; + case 'mirror video': + return stage.mirrorVideo; + default: + return ''; + } +}; + +Process.prototype.doSetFastTracking = function (bool) { + var ide; + if (!this.reportIsA(bool, 'Boolean')) { + return; + } + if (this.homeContext.receiver) { + ide = this.homeContext.receiver.parentThatIsA(IDE_Morph); + if (ide) { + if (bool) { + ide.startFastTracking(); + } else { + ide.stopFastTracking(); + } + } + } +}; + +Process.prototype.doPauseAll = function () { + var stage, ide; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.threads.pauseAll(stage); + } + ide = stage.parentThatIsA(IDE_Morph); + if (ide) {ide.controlBar.pauseButton.refresh(); } + } +}; + +// Process loop primitives + +Process.prototype.doForever = function (body) { + this.context.inputs = []; // force re-evaluation of C-slot + this.pushContext('doYield'); + if (body) { + this.pushContext(body.blockSequence()); + } + this.pushContext(); +}; + +Process.prototype.doRepeat = function (counter, body) { + var block = this.context.expression, + outer = this.context.outerContext, // for tail call elimination + isCustomBlock = this.context.isCustomBlock; + + if (isNaN(counter) || counter < 1) { + // was '=== 0', which caused infinite loops on non-ints + return null; + } + this.popContext(); + this.pushContext(block, outer); + this.context.isCustomBlock = isCustomBlock; + this.context.addInput(counter - 1); + this.pushContext('doYield'); + if (body) { + this.pushContext(body.blockSequence()); + } + this.pushContext(); +}; + +Process.prototype.doUntil = function (goalCondition, body) { + // this.assertType(goalCondition, ['Boolean']); + if (goalCondition) { + this.popContext(); + this.pushContext('doYield'); + return null; + } + this.context.inputs = []; + this.pushContext('doYield'); + if (body) { + this.pushContext(body.blockSequence()); + } + this.pushContext(); +}; + +Process.prototype.doWaitUntil = function (goalCondition) { + // this.assertType(goalCondition, ['Boolean']); + if (goalCondition) { + this.popContext(); + this.pushContext('doYield'); + return null; + } + this.context.inputs = []; + this.pushContext('doYield'); + this.pushContext(); +}; + +// Process interpolated iteration primitives + +Process.prototype.doForEach = function (upvar, list, script) { + // perform a script for each element of a list, assigning the + // current iteration's element to a variable with the name + // specified in the "upvar" parameter, so it can be referenced + // within the script. + // Distinguish between linked and arrayed lists. + + var next; + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + source : list, + remaining : list.length(), + idx : 0 + }; + } + if (this.context.accumulator.remaining === 0) { + return; + } + this.context.accumulator.remaining -= 1; + if (this.context.accumulator.source.isLinked) { + next = this.context.accumulator.source.at(1); + this.context.accumulator.source = + this.context.accumulator.source.cdr(); + } else { // arrayed + this.context.accumulator.idx += 1; + next = this.context.accumulator.source.at(this.context.accumulator.idx); + } + this.pushContext('doYield'); + this.pushContext(); + this.context.outerContext.variables.addVar(upvar); + this.context.outerContext.variables.setVar(upvar, next); + this.evaluate(script, new List(/*[next]*/), true); +}; + +Process.prototype.doFor = function (upvar, start, end, script) { + // perform a script for every integer step between start and stop, + // assigning the current iteration index to a variable with the + // name specified in the "upvar" parameter, so it can be referenced + // within the script. + + var vars = this.context.outerContext.variables, + dta = this.context.accumulator; + if (dta === null) { + this.assertType(start, 'number'); + this.assertType(end, 'number'); + dta = this.context.accumulator = { + test : +start < +end ? + (() => vars.getVar(upvar) > +end) + : (() => vars.getVar(upvar) < +end), + step : +start < +end ? 1 : -1, + parms : new List() // empty parameters, reusable to avoid GC + }; + vars.addVar(upvar); + vars.setVar(upvar, Math.floor(+start)); + } else { + vars.changeVar(upvar, dta.step); + } + if (dta.test()) {return; } + this.pushContext('doYield'); + this.pushContext(); + this.evaluate(script, dta.parms, true); +}; + +// Process interpolated HOF primitives + +/* + this.context.inputs: + [0] - reporter + [1] - list (original source) + ----------------------------- + [2] - last reporter evaluation result + + these primitives used to store the accumulated data in the unused parts + of the context's input-array. For reasons obscure to me this led to + JS stack overflows when used on large lists (> 150 k items). As a remedy + aggregations are now accumulated in the "accumulator" property slot + of Context. Why this speeds up execution by orders of magnitude while + "fixing" the stack-overflow issue eludes me. -Jens +*/ + +Process.prototype.reportMap = function (reporter, list) { + // answer a new list containing the results of the reporter applied + // to each value of the given list. Distinguish between linked and + // arrayed lists. + // if the reporter uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - element + // #2 - optional | index + // #3 - optional | source list + + var next, index, parms; + if (list.isLinked) { + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + source : list, + idx : 1, + target : new List(), + end : null, + remaining : list.length() + }; + this.context.accumulator.target.isLinked = true; + this.context.accumulator.end = this.context.accumulator.target; + } else if (this.context.inputs.length > 2) { + this.context.accumulator.end.rest = list.cons( + this.context.inputs.pop() + ); + this.context.accumulator.end = this.context.accumulator.end.rest; + this.context.accumulator.idx += 1; + this.context.accumulator.remaining -= 1; + } + if (this.context.accumulator.remaining === 0) { + this.context.accumulator.end.rest = list.cons( + this.context.inputs[2] + ).cdr(); + this.returnValueToParentContext( + this.context.accumulator.target.cdr() + ); + return; + } + index = this.context.accumulator.idx; + next = this.context.accumulator.source.at(1); + this.context.accumulator.source = this.context.accumulator.source.cdr(); + } else { // arrayed + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = []; + } else if (this.context.inputs.length > 2) { + this.context.accumulator.push(this.context.inputs.pop()); + } + if (this.context.accumulator.length === list.length()) { + this.returnValueToParentContext( + new List(this.context.accumulator) + ); + return; + } + index = this.context.accumulator.length + 1; + next = list.at(index); + } + this.pushContext(); + parms = [next]; + if (reporter instanceof Context) { // can also be a list of rings + if (reporter.inputs.length > 1) { + parms.push(index); + } + if (reporter.inputs.length > 2) { + parms.push(list); + } + } + return this.evaluate(reporter, new List(parms)); +}; + +Process.prototype.reportKeep = function (predicate, list) { + // Filter - answer a new list containing the items of the list for which + // the predicate evaluates TRUE. + // Distinguish between linked and arrayed lists. + // if the predicate uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - element + // #2 - optional | index + // #3 - optional | source list + + var next, index, parms; + if (list.isLinked) { + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + source : list, + idx: 1, + target : new List(), + end : null, + remaining : list.length() + }; + this.context.accumulator.target.isLinked = true; + this.context.accumulator.end = this.context.accumulator.target; + } else if (this.context.inputs.length > 2) { + if (this.context.inputs.pop() === true) { + this.context.accumulator.end.rest = list.cons( + this.context.accumulator.source.at(1) + ); + this.context.accumulator.end = + this.context.accumulator.end.rest; + } + this.context.accumulator.remaining -= 1; + this.context.accumulator.idx += 1; + this.context.accumulator.source = + this.context.accumulator.source.cdr(); + } + if (this.context.accumulator.remaining === 0) { + this.context.accumulator.end.rest = new List(); + this.returnValueToParentContext( + this.context.accumulator.target.cdr() + ); + return; + } + index = this.context.accumulator.idx; + next = this.context.accumulator.source.at(1); + } else { // arrayed + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + idx : 0, + target : [] + }; + } else if (this.context.inputs.length > 2) { + if (this.context.inputs.pop() === true) { + this.context.accumulator.target.push( + list.at(this.context.accumulator.idx) + ); + } + } + if (this.context.accumulator.idx === list.length()) { + this.returnValueToParentContext( + new List(this.context.accumulator.target) + ); + return; + } + this.context.accumulator.idx += 1; + index = this.context.accumulator.idx; + next = list.at(index); + } + this.pushContext(); + parms = [next]; + if (predicate instanceof Context) { // can also be a list of rings + if (predicate.inputs.length > 1) { + parms.push(index); + } + if (predicate.inputs.length > 2) { + parms.push(list); + } + } + return this.evaluate(predicate, new List(parms)); +}; + +Process.prototype.reportFindFirst = function (predicate, list) { + // Find - answer the first item of the list for which + // the predicate evaluates TRUE. + // Distinguish between linked and arrayed lists. + // if the predicate uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - element + // #2 - optional | index + // #3 - optional | source list + + var next, index, parms; + if (list.isLinked) { + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + source : list, + idx : 1, + remaining : list.length() + }; + } else if (this.context.inputs.length > 2) { + if (this.context.inputs.pop() === true) { + this.returnValueToParentContext( + this.context.accumulator.source.at(1) + ); + return; + } + this.context.accumulator.remaining -= 1; + this.context.accumulator.idx += 1; + this.context.accumulator.source = + this.context.accumulator.source.cdr(); + } + if (this.context.accumulator.remaining === 0) { + this.returnValueToParentContext(''); + return; + } + index = this.context.accumulator.idx; + next = this.context.accumulator.source.at(1); + } else { // arrayed + if (this.context.accumulator === null) { + this.assertType(list, 'list'); + this.context.accumulator = { + idx : 0, + current : null + }; + } else if (this.context.inputs.length > 2) { + if (this.context.inputs.pop() === true) { + this.returnValueToParentContext( + this.context.accumulator.current + ); + return; + } + } + if (this.context.accumulator.idx === list.length()) { + this.returnValueToParentContext(''); + return; + } + this.context.accumulator.idx += 1; + index = this.context.accumulator.idx; + next = list.at(index); + this.context.accumulator.current = next; + } + this.pushContext(); + parms = [next]; + if (predicate instanceof Context) { // can also be a list of rings + if (predicate.inputs.length > 1) { + parms.push(index); + } + if (predicate.inputs.length > 2) { + parms.push(list); + } + } + return this.evaluate(predicate, new List(parms)); +}; + +Process.prototype.reportCombine = function (list, reporter) { + // Fold - answer an aggregation of all list items from "left to right" + // Distinguish between linked and arrayed lists. + // if the reporter uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - accumulator + // #2 - element + // #3 - optional | index + // #4 - optional | source list + + var next, current, index, parms; + this.assertType(list, 'list'); + if (list.isLinked) { + if (this.context.accumulator === null) { + // check for special cases to speed up + if (reporter instanceof Context && + this.canRunOptimizedForCombine(reporter)) { + return this.reportListAggregation( + list, + reporter.expression.selector + ); + } + + // test for base cases + if (list.length() < 2) { + this.returnValueToParentContext( + list.length() ? + list.at(1) + : (reporter.expression.selector === 'reportJoinWords' ? + '' + : 0) + ); + return; + } + + // initialize the accumulator + this.context.accumulator = { + source : list.cdr(), + idx : 1, + target : list.at(1), + remaining : list.length() - 1 + }; + } else if (this.context.inputs.length > 2) { + this.context.accumulator.target = this.context.inputs.pop(); + this.context.accumulator.remaining -= 1; + this.context.accumulator.idx += 1; + this.context.accumulator.source = + this.context.accumulator.source.cdr(); + } + if (this.context.accumulator.remaining === 0) { + this.returnValueToParentContext(this.context.accumulator.target); + return; + } + next = this.context.accumulator.source.at(1); + } else { // arrayed + if (this.context.accumulator === null) { + // check for special cases to speed up + if (reporter instanceof Context && + this.canRunOptimizedForCombine(reporter)) { + return this.reportListAggregation( + list, + reporter.expression.selector + ); + } + + // test for base cases + if (list.length() < 2) { + this.returnValueToParentContext( + list.length() ? + list.at(1) + : (reporter.expression.selector === 'reportJoinWords' ? + '' + : 0) + ); + return; + } + + // initialize the accumulator + this.context.accumulator = { + idx : 1, + target : list.at(1) + }; + } else if (this.context.inputs.length > 2) { + this.context.accumulator.target = this.context.inputs.pop(); + } + if (this.context.accumulator.idx === list.length()) { + this.returnValueToParentContext(this.context.accumulator.target); + return; + } + this.context.accumulator.idx += 1; + next = list.at(this.context.accumulator.idx); + } + index = this.context.accumulator.idx; + current = this.context.accumulator.target; + this.pushContext(); + parms = [current, next]; + if (reporter instanceof Context) { // can also be a list of rings + if (reporter.inputs.length > 2) { + parms.push(index); + } + if (reporter.inputs.length > 3) { + parms.push(list); + } + } + return this.evaluate(reporter, new List(parms)); +}; + +Process.prototype.reportListAggregation = function (list, selector) { + // private - used by reportCombine to optimize certain commutative + // operations such as sum, product, min, max hyperized all at once + var len = list.length(), + result, i, op; + op = { + reportVariadicSum: 'reportSum', + reportVariadicProduct: 'reportProduct', + reportVariadicMin: 'reportMin', + reportVariadicMax: 'reportMax' + }[selector] || selector; + if (len === 0) { + switch (op) { + case 'reportProduct': + return 1; + case 'reportMin': + return Infinity; + case 'reportMax': + return -Infinity; + default: // reportSum + return 0; + } + } + result = list.at(1); + if (len > 1) { + for (i = 2; i <= len; i += 1) { + result = this[op](result, list.at(i)); + } + } + return result; +}; + +Process.prototype.canRunOptimizedForCombine = function (aContext) { + // private - used by reportCombine to check for optimizable + // special cases + var op = aContext.expression.selector, + slots, + eligible; + if (!op) { + return false; + } + eligible = [ + 'reportVariadicSum', + 'reportVariadicProduct', + 'reportVariadicMin', + 'reportVariadicMax' + ]; + if (!contains(eligible, op)) { + return false; + } + + // scan the expression's inputs, + // make sure there are exactly two and none is + // a non-empty input slot or a variable getter whose name doesn't + // correspond to an input of the context. + // make sure the context has either no or exactly two inputs. + slots = aContext.expression.inputs()[0].inputs(); + if (slots.length !== 2) { + return false; + } + if (aContext.inputs.length === 0) { + return slots.every(each => each.bindingID); + } + if (aContext.inputs.length !== 2) { + return false; + } + return slots.every(each => + each.selector === 'reportGetVar' && + contains(aContext.inputs, each.blockSpec) + ); +}; + +Process.prototype.reportPipe = function (value, reporterList) { + // Pipe - answer an aggregation of channeling an initial value + // through a sequence of monadic functions + var next, current; + this.assertType(reporterList, 'list'); + + if (this.context.accumulator === null) { + // test for base cases + if (reporterList.length() < 1) { + this.returnValueToParentContext(value); + return; + } + + // initialize the accumulator + this.context.accumulator = { + idx : 0, + result : value + }; + } else if (this.context.inputs.length > 2) { + this.context.accumulator.result = this.context.inputs.pop(); + } + if (this.context.accumulator.idx === reporterList.length()) { + this.returnValueToParentContext(this.context.accumulator.result); + return; + } + this.context.accumulator.idx += 1; + next = reporterList.at(this.context.accumulator.idx); + this.assertType(next, ['command', 'reporter', 'predicate']); + current = this.context.accumulator.result; + this.pushContext(); + this.evaluate(next, new List([current])); +}; + +// Process interpolated primitives + +Process.prototype.doWait = function (secs) { + if (!this.context.startTime) { + this.context.startTime = Date.now(); + } + if ((Date.now() - this.context.startTime) >= (secs * 1000)) { + if (!this.isAtomic && (secs === 0)) { + // "wait 0 secs" is a plain "yield" + // that can be overridden by "warp" + this.readyToYield = true; + } + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.doGlide = function (secs, endX, endY) { + if (!this.context.startTime) { + this.context.startTime = Date.now(); + this.context.startValue = new Point( + this.blockReceiver().xPosition(), + this.blockReceiver().yPosition() + ); + } + if ((Date.now() - this.context.startTime) >= (secs * 1000)) { + this.blockReceiver().gotoXY(endX, endY); + return null; + } + this.blockReceiver().glide( + secs * 1000, + endX, + endY, + Date.now() - this.context.startTime, + this.context.startValue + ); + + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.doSayFor = function (data, secs) { + if (!this.context.startTime) { + this.context.startTime = Date.now(); + this.blockReceiver().bubble(data); + } + if ((Date.now() - this.context.startTime) >= (secs * 1000)) { + this.blockReceiver().stopTalking(); + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.doThinkFor = function (data, secs) { + if (!this.context.startTime) { + this.context.startTime = Date.now(); + this.blockReceiver().doThink(data); + } + if ((Date.now() - this.context.startTime) >= (secs * 1000)) { + this.blockReceiver().stopTalking(); + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.blockReceiver = function () { + return this.context ? this.context.receiver || this.homeContext.receiver + : this.homeContext.receiver || this.receiver; +}; + +// Process sound primitives (interpolated) + +Process.prototype.playSound = function (name) { + if (name instanceof List) { + // use the microphone's default sample rate in case it has been + // initialized before, otherwise 44.1 kHz + return this.doPlaySoundAtRate( + name, + this.blockReceiver().parentThatIsA(StageMorph) + .microphone?.audioContext?.sampleRate || 44100 + ); + } + return this.blockReceiver().doPlaySound(name); +}; + +Process.prototype.doPlaySoundUntilDone = function (name) { + if (this.context.activeAudio === null) { + this.context.activeAudio = this.playSound(name); + } + if (name === null || this.context.activeAudio.ended + || this.context.activeAudio.terminated) { + if (this.context.activeAudio && this.context.activeAudio.remove) { + this.context.activeAudio.currentSrc = null; + this.context.activeAudio.src = ""; + this.context.activeAudio.srcObject = null; + this.context.activeAudio.remove(); + } + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.doStopAllSounds = function () { + var stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.threads.processes.forEach(thread => { + if (thread.context) { + thread.context.stopMusic(); + if (thread.context.activeAudio) { + thread.context.activeAudio.currentSrc = null; + thread.context.activeAudio.src = ""; + thread.context.activeAudio.srcObject = null; + thread.context.activeAudio.remove(); + thread.popContext(); + } + } + }); + stage.stopAllActiveSounds(); + } +}; + +Process.prototype.doPlaySoundAtRate = function (name, rate) { + var sound, samples, ctx, gain, pan, source, rcvr; + + if (!(name instanceof List)) { + sound = name instanceof Sound ? name + : (typeof name === 'number' ? this.blockReceiver().sounds.at(name) + : detect( + this.blockReceiver().sounds.asArray(), + s => snapEquals(s.name, name.toString()) + ) + ); + if (!sound.audioBuffer) { + this.decodeSound(sound); + return; + } + samples = this.reportGetSoundAttribute('samples', sound); + } else { + samples = name; + } + + rcvr = this.blockReceiver(); + ctx = rcvr.audioContext(); + gain = rcvr.getGainNode(); + pan = rcvr.getPannerNode(); + source = this.encodeSound(samples, rate); + rcvr.setVolume(rcvr.volume); + source.connect(gain); + if (pan) { + gain.connect(pan); + pan.connect(ctx.destination); + rcvr.setPan(rcvr.pan); + } else { + gain.connect(ctx.destination); + } + source.pause = source.stop; + source.ended = false; + source.onended = () => source.ended = true; + source.start(); + rcvr.parentThatIsA(StageMorph).activeSounds.push(source); + return source; +}; + +Process.prototype.reportGetSoundAttribute = function (choice, soundName) { + var sound = soundName instanceof Sound ? soundName + : (typeof soundName === 'number' ? + this.blockReceiver().sounds.at(soundName) + : (soundName instanceof List ? this.encodeSound(soundName) + : detect( + this.blockReceiver().sounds.asArray(), + s => snapEquals(s.name, soundName.toString()) + ) + ) + ), + option = this.inputOption(choice); + + if (option === 'name') { + return sound.name; + } + + if (!sound.audioBuffer) { + this.decodeSound(sound); + return; + } + + switch (option) { + case 'samples': + if (!sound.cachedSamples) { + sound.cachedSamples = function (sound, untype) { + var buf = sound.audioBuffer, + result, i; + if (buf.numberOfChannels > 1) { + result = new List(); + for (i = 0; i < buf.numberOfChannels; i += 1) { + result.add(new List(untype(buf.getChannelData(i)))); + } + return result; + } + return new List(untype(buf.getChannelData(0))); + } (sound, this.untype); + } + return sound.cachedSamples; + case 'sample rate': + return sound.audioBuffer.sampleRate; + case 'duration': + return sound.audioBuffer.duration; + case 'length': + return sound.audioBuffer.length; + case 'number of channels': + return sound.audioBuffer.numberOfChannels; + default: + return 0; + } +}; + +Process.prototype.decodeSound = function (sound, callback) { + // private - callback is optional and invoked with sound as argument + var base64, binaryString, len, bytes, i, arrayBuffer, audioCtx; + + if (sound.audioBuffer) { + return (callback || nop)(sound); + } + if (!sound.isDecoding) { + base64 = sound.audio.src.split(',')[1]; + binaryString = window.atob(base64); + len = binaryString.length; + bytes = new Uint8Array(len); + for (i = 0; i < len; i += 1) { + bytes[i] = binaryString.charCodeAt(i); + } + arrayBuffer = bytes.buffer; + audioCtx = Note.prototype.getAudioContext(); + sound.isDecoding = true; + audioCtx.decodeAudioData( + arrayBuffer, + buffer => { + sound.audioBuffer = buffer; + sound.isDecoding = false; + }, + err => { + sound.isDecoding = false; + this.handleError(err); + } + ); + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.encodeSound = function (samples, rate) { + // private + var rcvr = this.blockReceiver(), + ctx = rcvr.audioContext(), + channels = (samples.at(1) instanceof List) ? samples.length() : 1, + frameCount = (channels === 1) ? + samples.length() + : samples.at(1).length(), + arrayBuffer = ctx.createBuffer(channels, frameCount, +rate || 44100), + i, + source; + + if (!arrayBuffer.copyToChannel) { + arrayBuffer.copyToChannel = function (src, channel) { + var buffer = this.getChannelData(channel); + for (i = 0; i < src.length; i += 1) { + buffer[i] = src[i]; + } + }; + } + if (channels === 1) { + arrayBuffer.copyToChannel( + Float32Array.from(samples.itemsArray()), + 0, + 0 + ); + } else { + for (i = 0; i < channels; i += 1) { + arrayBuffer.copyToChannel( + Float32Array.from(samples.at(i + 1).itemsArray()), + i, + 0 + ); + } + } + source = ctx.createBufferSource(); + source.buffer = arrayBuffer; + source.audioBuffer = source.buffer; + return source; +}; + +// Process first-class sound creation from samples, interpolated + +Process.prototype.reportNewSoundFromSamples = function (samples, rate) { + // this method inspired by: https://github.com/Jam3/audiobuffer-to-wav + // https://www.russellgood.com/how-to-convert-audiobuffer-to-audio-file + + var audio, blob, reader; + + if (isNil(this.context.accumulator)) { + this.assertType(samples, 'list'); // check only the first time + this.context.accumulator = { + audio: null + }; + audio = new Audio(); + blob = new Blob( + [ + this.audioBufferToWav( + this.encodeSound(samples, rate || 44100).audioBuffer + ) + ], + {type: "audio/wav"} + ); + reader = new FileReader(); + reader.onload = () => { + audio.src = reader.result; + this.context.accumulator.audio = audio; + }; + reader.readAsDataURL(blob); + } + if (this.context.accumulator.audio) { + return new Sound( + this.context.accumulator.audio, + this.blockReceiver().newSoundName(localize('sound')) + ); + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.audioBufferToWav = function (buffer, opt) { + var numChannels = buffer.numberOfChannels, + sampleRate = buffer.sampleRate, + format = (opt || {}).float32 ? 3 : 1, + bitDepth = format === 3 ? 32 : 16, + result; + + function interleave(inputL, inputR) { + var length = inputL.length + inputR.length, + result = new Float32Array(length), + index = 0, + inputIndex = 0; + + while (index < length) { + result[index++] = inputL[inputIndex]; + result[index++] = inputR[inputIndex]; + inputIndex += 1; + } + return result; + } + + if (numChannels === 2) { + result = interleave( + buffer.getChannelData(0), + buffer.getChannelData(1) + ); + } else { + result = buffer.getChannelData(0); + } + return this.encodeWAV(result, format, sampleRate, numChannels, bitDepth); +}; + +Process.prototype.encodeWAV = function ( + samples, + format, + sampleRate, + numChannels, + bitDepth +) { + var bytesPerSample = bitDepth / 8, + blockAlign = numChannels * bytesPerSample, + buffer = new ArrayBuffer(44 + samples.length * bytesPerSample), + view = new DataView(buffer); + + function writeFloat32(output, offset, input) { + for (var i = 0; i < input.length; i += 1, offset += 4) { + output.setFloat32(offset, input[i], true); + } + } + + function floatTo16BitPCM(output, offset, input) { + var i, s; + for (i = 0; i < input.length; i += 1, offset += 2) { + s = Math.max(-1, Math.min(1, input[i])); + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true); + } + } + + function writeString(view, offset, string) { + for (var i = 0; i < string.length; i += 1) { + view.setUint8(offset + i, string.charCodeAt(i)); + } + } + + writeString(view, 0, 'RIFF'); // RIFF identifier + // RIFF chunk length: + view.setUint32(4, 36 + samples.length * bytesPerSample, true); + writeString(view, 8, 'WAVE'); // RIFF type + writeString(view, 12, 'fmt '); // format chunk identifier + view.setUint32(16, 16, true); // format chunk length + view.setUint16(20, format, true); // sample format (raw) + view.setUint16(22, numChannels, true); // channel count + view.setUint32(24, sampleRate, true); // sample rate + // byte rate (sample rate * block align): + view.setUint32(28, sampleRate * blockAlign, true); + // block align (channel count * bytes per sample): + view.setUint16(32, blockAlign, true); + view.setUint16(34, bitDepth, true); // bits per sample + writeString(view, 36, 'data'); // data chunk identifier + // data chunk length: + view.setUint32(40, samples.length * bytesPerSample, true); + if (format === 1) { // Raw PCM + floatTo16BitPCM(view, 44, samples); + } else { + writeFloat32(view, 44, samples); + } + return buffer; +}; + +// Process audio input (interpolated) + +Process.prototype.reportAudio = function (choice) { + var stage = this.blockReceiver().parentThatIsA(StageMorph), + selection = this.inputOption(choice); + if (selection === 'resolution') { + return stage.microphone.binSize(); + } + if (selection === 'modifier') { + return stage.microphone.modifier; + } + if (stage.microphone.isOn()) { + switch (selection) { + case 'volume': + return stage.microphone.volume * 100; + case 'frequency': + return stage.microphone.pitch; + case 'note': + return stage.microphone.note; + case 'samples': + return new List(this.untype(stage.microphone.signals)); + case 'sample rate': + return stage.microphone.audioContext.sampleRate; + case 'output': + return new List(this.untype(stage.microphone.output)); + case 'spectrum': + return new List(this.untype(stage.microphone.frequencies)); + default: + return null; + } + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.untype = function (typedArray) { + var len = typedArray.length, + arr = new Array(len), + i; + for (i = 0; i < len; i += 1) { + arr[i] = typedArray[i]; + } + return arr; +}; + +Process.prototype.setMicrophoneModifier = function (modifier) { + var stage = this.blockReceiver().parentThatIsA(StageMorph), + invalid = [ + 'sprite', + 'stage', + 'list', + 'costume', + 'sound', + 'number', + 'text', + 'Boolean' + ]; + if (!modifier || contains(invalid, this.reportTypeOf(modifier))) { + stage.microphone.modifier = null; + stage.microphone.stop(); + return; + } + stage.microphone.modifier = modifier; + stage.microphone.compiledModifier = this.reportCompiled(modifier, 1); + stage.microphone.compilerProcess = this; +}; + +// Process user prompting primitives (interpolated) + +Process.prototype.doAsk = function (data) { + var stage = this.homeContext.receiver.parentThatIsA(StageMorph), + rcvr = this.blockReceiver(), + isStage = rcvr instanceof StageMorph, + isHiddenSprite = rcvr instanceof SpriteMorph && !rcvr.isVisible, + activePrompter, + leftSpace, + rightSpace; + + stage.keysPressed = {}; + if (this.readyToTerminate) { + return; + } + if (!data) { + // terminate all other processes currently asking a question + // or waiting to ask one + stage.threads.processes.filter(proc => + (proc.prompter && !proc.prompter.isDone) || + (proc?.context?.expression?.selector === 'doAsk' && proc !== this) + ).forEach(proc => proc.stop()); + stage.lastAnswer = ''; + return; + } + if (!this.prompter) { + activePrompter = detect( + stage.children, + morph => morph instanceof StagePrompterMorph || + morph instanceof StagePickerMorph + ); + if (!activePrompter) { + if (data instanceof List) { + rcvr.stopTalking(); + this.prompter = new StagePickerMorph(data); + this.prompter.createItems(stage.scale); + leftSpace = rcvr.left() - stage.left(); + rightSpace = stage.right() - rcvr.right(); + if (isStage) { + this.prompter.popup( + stage, + stage.center().subtract( + this.prompter.extent().floorDivideBy(2) + ) + ); + } else { + this.prompter.popup( + stage, + rightSpace > this.prompter.width() || + rightSpace >= leftSpace ? + rcvr.topRight() + : rcvr.topLeft().subtract( + new Point(this.prompter.width(), 0) + ) + ); + } + } else { + if (!isStage && !isHiddenSprite) { + rcvr.bubble(data, false, true); + } else if (isStage) { + rcvr.stopTalking(); + } + this.prompter = new StagePrompterMorph( + isStage || isHiddenSprite ? data : null + ); + if (stage.scale < 1) { + this.prompter.setWidth(stage.width() - 10); + } else { + this.prompter.setWidth(stage.dimensions.x - 20); + } + this.prompter.fixLayout(); + this.prompter.setCenter(stage.center()); + this.prompter.setBottom(stage.bottom() - this.prompter.border); + stage.add(this.prompter); + this.prompter.inputField.edit(); + stage.changed(); + } + } + } else { + if (this.prompter.isDone) { + stage.lastAnswer = this.prompter.answer; + this.prompter.destroy(); + this.prompter = null; + if (!isStage) {rcvr.stopTalking(); } + return null; + } + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.reportLastAnswer = function () { + return this.homeContext.receiver.parentThatIsA(StageMorph).lastAnswer; +}; + +// Process URI retrieval (interpolated) + +Process.prototype.reportURL = function (url) { + var response; + url = decodeURI(url); + this.checkURLAllowed(url); + if (!this.httpRequest) { + // use the location protocol unless the user specifies otherwise + if (url.indexOf('//') < 0 || url.indexOf('//') > 8) { + if (location.protocol === 'file:') { + // allow requests from locally loaded sources + url = 'https://' + url; + } else { + url = location.protocol + '//' + url; + } + } + this.httpRequest = new XMLHttpRequest(); + this.httpRequest.open("GET", url, true); + // cache-control, commented out for now + // added for Snap4Arduino but has issues with local robot servers + // this.httpRequest.setRequestHeader('Cache-Control', 'max-age=0'); + this.httpRequest.send(null); + if (this.context.isCustomCommand) { + // special case when ignoring the result, e.g. when + // communicating with a robot to control its motors + this.httpRequest = null; + return null; + } + } else if (this.httpRequest.readyState === 4) { + response = this.httpRequest.responseText; + this.httpRequest = null; + return response; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.checkURLAllowed = function (url) { + if ([ 'users', 'logout', 'projects', 'collections' ].some( + pathPart => { + // Check out whether we're targeting one of the remote domains + return Object.values(Cloud.prototype.knownDomains).filter( + each => each.includes('snap') + ).some( + domain => url.match( + // Check only against the host -not the protocol, path or + // port- of the domain + new RegExp(`${(new URL(domain)).host}.*${pathPart}`, 'i')) + ); + } + )) { + throw new Error('Request blocked'); + } +}; + +// Process event messages primitives + +Process.prototype.doBroadcast = function (message, options) { + var stage = this.homeContext.receiver.parentThatIsA(StageMorph), + target = this.inputOption(options.at(1) || ['all']), + payload = options.at(2), + thisObj, + msg = this.inputOption(message), + rcvrs, + procs = []; + if (!this.canBroadcast) { + return []; + } + + // remove all clones when the green flag event is broadcast to all + if (msg === '__shout__go__' && target === 'all') { + stage.removeAllClones(); + } + + // determine the receivers + thisObj = this.blockReceiver(); + if (target === 'all') { + rcvrs = stage.children.concat(stage); + } else if (isSnapObject(target)) { + rcvrs = [target]; + } else if (isString(target)) { + // assume the string to be the name of a sprite or the stage + if (target === stage.name) { + rcvrs = [stage]; + } else { + rcvrs = [this.getOtherObject(target, thisObj, stage)]; + } + } else if (target instanceof List) { + // assume all elements to be sprites or sprite names + rcvrs = target.itemsArray().map(each => + this.getOtherObject(each, thisObj, stage) + ); + } else { + return; // abort + } + + // transmit the message + if (msg !== '') { + stage.lastMessage = message; // retained for backwards compatibility + rcvrs.forEach(morph => { + if (isSnapObject(morph)) { + morph.allHatBlocksFor(msg).forEach(block => { + var choice, varName, varFrame; + if (block.selector === 'receiveMessage') { + varName = block.inputs()[1].evaluate()[0]; + if (varName) { + varFrame = new VariableFrame(); + choice = block.inputs()[0].evaluate(); + if (choice instanceof Array && + choice[0].indexOf('any') === 0) { + varFrame.addVar( + varName, + payload !== '' ? + new List([message, payload]) + : message + ); + } else { + varFrame.addVar(varName, payload); + } + } + procs.push(stage.threads.startProcess( + block, + morph, + stage.isThreadSafe, + // commented out for now to enable tail recursion: + // || // make "any msg" threadsafe + // block.inputs()[0].evaluate() instanceof Array, + null, // exportResult (bool) + null, // callback + null, // isClicked + null, // rightAway + null, // atomic + varFrame + )); + } else { + procs.push(stage.threads.startProcess( + block, + morph, + stage.isThreadSafe + )); + } + }); + } + }); + (stage.messageCallbacks[''] || []).forEach(callback => + callback(msg) // for "any" message, pass it along as argument + ); + (stage.messageCallbacks[msg] || []).forEach(callback => + callback(payload) // for a particular message + ); + } + return procs; +}; + +Process.prototype.doBroadcastAndWait = function (message, target) { + if (!this.context.activeSends) { + this.context.activeSends = this.doBroadcast(message, target); + if (this.isRunning()) { + this.context.activeSends.forEach(proc => + proc.runStep() + ); + } + } + this.context.activeSends = this.context.activeSends.filter(proc => + proc.isRunning() + ); + if (this.context.activeSends.length === 0) { + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.getLastMessage = function () { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + return stage.getLastMessage(); + } + } + return ''; +}; + +// Process type inference + +Process.prototype.reportIsA = function (thing, typeString) { + var choice = this.inputOption(typeString); + switch (choice) { + case 'agent': + return isSnapObject(thing); + case 'script': + return thing instanceof Context; + default: + return this.reportTypeOf(thing) === choice; + } +}; + +Process.prototype.assertType = function (thing, typeString, ...exempt) { + // make sure "thing" is a particular type or any of a number of types + // or a particular exempt value and raise an error if not + // use responsibly wrt performance implications + var thingType = this.reportTypeOf(thing); + if (thingType === typeString) {return thing; } + if (typeString instanceof Array && contains(typeString, thingType)) { + return thing; + } + if (exempt.length && contains(exempt, thing)) {return thing; } + if (typeString === 'JSON' && thing instanceof List && thing.canBeJSON()) { + return thing; + } + throw new Error( + localize('expecting a') + ' ' + + (typeString instanceof Array ? + typeString.reduce((a, b) => localize(a) + ' / ' + localize(b)) + : localize(typeString)) + + ' ' + + localize('but getting a') + ' ' + + localize(thingType) + ); +}; + +Process.prototype.assertAlive = function (thing) { + if (thing && thing.isCorpse) { + throw new Error('cannot operate on a deleted sprite'); + } +}; + +Process.prototype.reportTypeOf = function (thing) { + // answer a string denoting the argument's type + var exp; + if (thing === null || (thing === undefined)) { + return 'nothing'; + } + if (thing === true || (thing === false)) { + return 'Boolean'; + } + if (thing instanceof List) { + return 'list'; + } + if (parseFloat(thing) === +thing) { // I hate this! -Jens + return 'number'; + } + if (isString(thing)) { + return 'text'; + } + if (thing instanceof SpriteMorph) { + return 'sprite'; + } + if (thing instanceof StageMorph) { + return 'stage'; + } + if (thing instanceof Costume) { + return 'costume'; + } + if (thing instanceof Sound) { + return 'sound'; + } + if (thing instanceof Context) { + if (thing.expression instanceof RingMorph) { + return thing.expression.dataType(); + } + if (thing.expression instanceof ReporterBlockMorph) { + if (thing.expression.isPredicate) { + return 'predicate'; + } + return 'reporter'; + } + + if (thing.expression instanceof Array) { + exp = thing.expression[thing.pc || 0]; + if (exp.isPredicate) { + return 'predicate'; + } + if (exp instanceof RingMorph) { + return exp.dataType(); + } + if (exp instanceof ReporterBlockMorph) { + return 'reporter'; + } + if (exp instanceof CommandBlockMorph) { + return 'command'; + } + return 'reporter'; // 'ring'; + } + + if (thing.expression instanceof CommandBlockMorph) { + return 'command'; + } + return 'reporter'; // 'ring'; + } + return 'undefined'; +}; + +// Process math primtives - hyper + +Process.prototype.hyper = function (fn, ...args) { + // enable monadic and dyadic operations to be performed on dimensional data + // use this as entry point + if (this.enableHyperOps) { + if (args.length === 1) { + return this.hyperMonadic(fn, args[0]); + } else if (args.length === 2) { + return this.hyperDyadic(fn, args[0], args[1]); + } + } + return fn.apply(null, args); +}; + +Process.prototype.hyperMonadic = function (baseOp, arg) { + // enable monadic operations to be performed on lists and tables + if (arg instanceof List) { + return arg.map(each => this.hyperMonadic(baseOp, each)); + } + return baseOp(arg); +}; + +Process.prototype.hyperDyadic = function (baseOp, a, b) { + var match = Math.min(this.reportQuickRank(a), this.reportQuickRank(b)); + return this.hyperZip(baseOp, a, b, match, match); +}; + +Process.prototype.hyperZip = function (baseOp, a, b, zipa, zipb) { + // enable dyadic operations to be performed on lists and tables + // allowing to specify the ranks that are to be matched. + // this allows to write 2d matrix convolutions for 3+d inputs with + // 2d kernels e.g. for image processing without having to first + // reshape the kernel matrix to match the broadcast shape. + var arank = this.reportQuickRank(a), + brank = this.reportQuickRank(b), + len, i, result; + if (arank === brank || (arank <= zipa && brank <= zipb)) { + if (arank + brank === 0) { + return baseOp(a, b); + } + if (brank === 0) { + return a.map(each => this.hyperZip(baseOp, each, b, zipa, zipb)); + } + if (arank === 0) { + return b.map(each => this.hyperZip(baseOp, a, each, zipa, zipb)); + } + // zip both arguments ignoring out-of-bounds indices + a = a.itemsArray(); + b = b.itemsArray(); + len = Math.min(a.length, b.length); + result = new Array(len); + for (i = 0; i < len; i += 1) { + result[i] = this.hyperZip(baseOp, a[i], b[i], zipa, zipb); + } + return new List(result); + } + if (arank > zipa) { + return a.map(each => this.hyperZip(baseOp, each, b, zipa, zipb)); + } + if (brank > zipb) { + return b.map(each => this.hyperZip(baseOp, a, each, zipa, zipb)); + } + if (arank > brank) { + return a.map(each => this.hyperZip(baseOp, each, b, zipa, zipb)); + } + return b.map(each => this.hyperZip(baseOp, a, each, zipa, zipb)); +}; + +Process.prototype.packCoordinates = function (list) { + // convert all numerical 2-item sub-lists into a variable to they + // can be handled as atomic by hyperDyadic(), + // remember to let the baseOp unpack them. + return this.isCoordinate(list) ? new Variable(list) + : list.map(each => each instanceof List ? this.packCoordinates(each) + : each); +}; + +// Process dyadic math primtives - arithmetic +/* + Note: the "basic" versions are required so the abonomable "bignums" + library can overload them, a library so sloppily written, so ill maintained + and devoid of love, building on a terrible monstrosity of a mechanism + I don't even want to think about it, but here we are -jens +*/ + +Process.prototype.reportVariadicSum = function (numbers) { + if (!isNaN(+numbers)) {return +numbers; } + this.assertType(numbers, 'list'); + return this.reportListAggregation(numbers, 'reportSum'); +}; + +Process.prototype.reportSum = function (a, b) { + return this.hyper(this.reportBasicSum, a, b); +}; + +Process.prototype.reportBasicSum = function (a, b) { + return +a + (+b); +}; + +Process.prototype.reportDifference = function (a, b) { + return this.hyper(this.reportBasicDifference, a, b); +}; + +Process.prototype.reportBasicDifference = function (a, b) { + return +a - +b; +}; + +Process.prototype.reportVariadicProduct = function (numbers) { + this.assertType(numbers, 'list'); + return this.reportListAggregation(numbers, 'reportProduct'); +}; + +Process.prototype.reportProduct = function (a, b) { + return this.hyper(this.reportBasicProduct, a, b); +}; + +Process.prototype.reportBasicProduct = function (a, b) { + return +a * +b; +}; + +Process.prototype.reportQuotient = function (a, b) { + return this.hyper(this.reportBasicQuotient, a, b); +}; + +Process.prototype.reportBasicQuotient = function (a, b) { + return +a / +b; +}; + +Process.prototype.reportPower = function (a, b) { + return this.hyper(this.reportBasicPower, a, b); +}; + +Process.prototype.reportBasicPower = function (a, b) { + return Math.pow(+a, +b); +}; + +Process.prototype.reportRandom = function (a, b) { + return this.hyper(this.reportBasicRandom, a, b); +}; + +Process.prototype.reportBasicRandom = function (min, max) { + var floor = Math.min(+min, +max), + ceil = Math.max(+min, +max); + if ((floor % 1 !== 0) || (ceil % 1 !== 0)) { + return Math.random() * (ceil - floor) + floor; + } + return Math.floor(Math.random() * (ceil - floor + 1)) + floor; +}; + +Process.prototype.reportModulus = function (a, b) { + return this.hyper(this.reportBasicModulus, a, b); +}; + +Process.prototype.reportBasicModulus = function (a, b) { + return ((+a % +b) + (+b)) % +b; +}; + +Process.prototype.reportAtan2 = function (a, b) { + return this.hyper(this.reportBasicAtan2, a, b); +}; + +Process.prototype.reportBasicAtan2 = function (a, b) { + return degrees(Math.atan2(+a, +b)); +}; + +Process.prototype.reportVariadicMin = function (numbers) { + this.assertType(numbers, 'list'); + return this.reportListAggregation(numbers, 'reportMin'); +}; + +Process.prototype.reportMin = function (a, b) { + return this.hyper(this.reportBasicMin, a, b); +}; + +Process.prototype.reportBasicMin = function (a, b) { + // return Math.min(+a, +b); // enhanced to also work with text + var x = +a, + y = +b; + if (isNaN(x) || isNaN(y)) { + x = a; + y = b; + } + return x < y ? x : y; +}; + +Process.prototype.reportVariadicMax = function (numbers) { + this.assertType(numbers, 'list'); + return this.reportListAggregation(numbers, 'reportMax'); +}; + +Process.prototype.reportMax = function (a, b) { + return this.hyper(this.reportBasicMax, a, b); +}; + +Process.prototype.reportBasicMax = function (a, b) { + // return Math.max(+a, +b); // enhanced to also work with text + var x = +a, + y = +b; + if (isNaN(x) || isNaN(y)) { + x = a; + y = b; + } + return x > y ? x : y; +}; + +// Process logic primitives - hyper-variadic applicative order + +Process.prototype.reportVariadicLessThan = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportLessThan(a, b), + items + ); +}; + +Process.prototype.reportVariadicGreaterThan = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportGreaterThan(a, b), + items + ); +}; + +Process.prototype.reportVariadicLessThanOrEquals = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportLessThanOrEquals(a, b), + items + ); +}; + +Process.prototype.reportVariadicGreaterThanOrEquals = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportGreaterThanOrEquals(a, b), + items + ); +}; + +Process.prototype.reportVariadicEquals = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportEquals(a, b), + items, + true // not hyper + ); +}; + +Process.prototype.reportVariadicNotEquals = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportNotEquals(a, b), + items, + true // not hyper + ); +}; + +Process.prototype.reportVariadicIsIdentical = function (items) { + return this.reportSequentialComparison( + (a, b) => this.reportIsIdentical(a, b), + items, + true // not hyper + ); +}; + +Process.prototype.reportSequentialComparison = function (op, items, notHyper) { + // private - apply a comparison op to a sequence of values + var len = items.length(), + step, result, i; + if (len < 2) {return true; } + for (i = 1; i < len; i += 1) { + step = op(items.at(i), items.at(i + 1)); + if (isNil(result)) { + result = step; + } else if (notHyper) { + result = result && step; + } else { + result = this.hyper( + (a, b) => a && b, + result, + step + ); + } + } + return result; +}; + +// Process logic primitives - hyper where applicable + +Process.prototype.reportLessThan = function (a, b) { + return this.hyper(this.reportBasicLessThan, a, b); +}; + +Process.prototype.reportLessThanOrEquals = function (a, b) { + return this.hyper( + (a, b) => !this.reportBasicGreaterThan(a, b), + a, + b + ); +}; + +Process.prototype.reportBasicLessThan = function (a, b) { + var x = +a, + y = +b; + if (isNaN(x) || isNaN(y)) { + x = a; + y = b; + } + return x < y; +}; + +Process.prototype.reportGreaterThan = function (a, b) { + return this.hyper(this.reportBasicGreaterThan, a, b); +}; + +Process.prototype.reportGreaterThanOrEquals = function (a, b) { + return this.hyper( + (a, b) => !this.reportBasicLessThan(a, b), + a, + b + ); +}; + +Process.prototype.reportBasicGreaterThan = function (a, b) { + var x = +a, + y = +b; + if (isNaN(x) || isNaN(y)) { + x = a; + y = b; + } + return x > y; +}; + +Process.prototype.reportEquals = function (a, b) { + return snapEquals(a, b); +}; + +Process.prototype.reportNotEquals = function (a, b) { + return !snapEquals(a, b); +}; + +Process.prototype.reportNot = function (bool) { + return this.hyper(val => !val, bool); +}; + +Process.prototype.reportIsIdentical = function (a, b) { + var tag = 'idTag'; + if (isString(a) && isString(b)) { + // compare texts case-sentitive + return a === b; + } + if (this.isImmutable(a) || this.isImmutable(b)) { + return snapEquals(a, b); + } + + function clear() { + if (Object.prototype.hasOwnProperty.call(a, tag)) { + delete a[tag]; + } + if (Object.prototype.hasOwnProperty.call(b, tag)) { + delete b[tag]; + } + } + + clear(); + a[tag] = Date.now(); + if (b[tag] === a[tag]) { + clear(); + return true; + } + clear(); + return false; +}; + +Process.prototype.isImmutable = function (obj) { + // private + var type = this.reportTypeOf(obj); + return type === 'nothing' || + type === 'Boolean' || + type === 'text' || + type === 'number' || + type === 'undefined'; +}; + +Process.prototype.reportBoolean = function (bool) { + return bool; +}; + +// Process monadic primitives + +Process.prototype.reportRound = function (n) { + return this.hyper(this.reportBasicRound, n); +}; + +Process.prototype.reportBasicRound = function (n) { + return Math.round(+n); +}; + +Process.prototype.reportMonadic = function (fname, n) { + return this.hyper( + num => this.reportBasicMonadic(fname, num), + n + ); +}; + +Process.prototype.reportBasicMonadic = function (fname, n) { + var x = +n, + result = 0; + + switch (this.inputOption(fname)) { + case 'abs': + result = Math.abs(x); + break; + // case '\u2212': // minus-sign + case 'neg': + result = n * -1; + break; + case 'sign': + result = Math.sign(x); + break; + case 'ceiling': + result = Math.ceil(x); + break; + case 'floor': + result = Math.floor(x); + break; + case 'sqrt': + result = Math.sqrt(x); + break; + case 'sin': + result = Math.sin(radians(x)); + break; + case 'cos': + result = Math.cos(radians(x)); + break; + case 'tan': + result = Math.tan(radians(x)); + break; + case 'asin': + result = degrees(Math.asin(x)); + break; + case 'acos': + result = degrees(Math.acos(x)); + break; + case 'atan': + result = degrees(Math.atan(x)); + break; + case 'ln': + result = Math.log(x); + break; + case 'log': // base 10 + result = Math.log10(x); + break; + case 'lg': // base 2 + result = Math.log2(x); + break; + case 'e^': + result = Math.exp(x); + break; + case '10^': + result = Math.pow(10, x); + break; + case '2^': + result = Math.pow(2, x); + break; + case 'id': + return n; + default: + nop(); + } + return result; +}; + +// Process - non hyper-monadic text primitives + +Process.prototype.reportTextFunction = function (fname, string) { + // currently in dev mode only, not hyper-monadic + var x = (isNil(string) ? '' : string).toString(), + result = ''; + + switch (this.inputOption(fname)) { + case 'encode URI': + result = encodeURI(x); + break; + case 'decode URI': + result = decodeURI(x); + break; + case 'encode URI component': + result = encodeURIComponent(x); + break; + case 'decode URI component': + result = decodeURIComponent(x); + break; + case 'XML escape': + result = new XML_Element().escape(x); + break; + case 'XML unescape': + result = new XML_Element().unescape(x); + break; + case 'JS escape': + result = JSCompiler.prototype.escape(x); + break; + case 'hex sha512 hash': + result = hex_sha512(x); + break; + default: + nop(); + } + return result; +}; + +Process.prototype.reportJoin = function (a, b) { + var x = (isNil(a) ? '' : a).toString(), + y = (isNil(b) ? '' : b).toString(); + return x.concat(y); +}; + +Process.prototype.reportJoinWords = function (aList) { + if (aList instanceof List) { + if (this.isAST(aList)) { + return this.assemble(aList); + } + return aList.asText(); + } + return (aList || '').toString(); +}; + +Process.prototype.isAST = function (aList) { + var first = aList.at(1); + if (first instanceof Context) { + return true; + } + if (first instanceof List) { + return first.at(1) instanceof Context; + } + return false; +}; + +// Process string ops - hyper + +Process.prototype.reportLetter = function (idx, string) { + return this.hyper( + (ix, str) => this.reportBasicLetter(ix, str), + idx, + string + ); +}; + +Process.prototype.reportBasicLetter = function (idx, string) { + var str, i; + + str = isNil(string) ? '' : string.toString(); + if (this.inputOption(idx) === 'random') { + idx = this.reportBasicRandom(1, str.length); + } + if (this.inputOption(idx) === 'last') { + idx = str.length; + } + i = +(idx || 0); + return str[i - 1] || ''; +}; + +Process.prototype.reportTextAttribute = function (choice, text) { + var option = this.inputOption(choice); + switch (option) { + case 'length': + return this.reportStringSize(text); + case 'lower case': + return this.hyper( + str => isString(str) ? str.toLowerCase() : str, + text + ); + case 'upper case': + return this.hyper( + str => isString(str) ? str.toUpperCase() : str, + text + ); + default: + return 0; + } +}; + +Process.prototype.reportStringSize = function (data) { + return this.hyper( + str => isString(str) ? str.length + : (parseFloat(str) === +str ? str.toString().length : 0), + // proposed scheme by Michael to address text with emojis, has + // memory issue when the stringd get very large: + // str => isNil(data) ? 0 : Array.from(str.toString()).length, + data + ); +}; + +Process.prototype.reportUnicode = function (string) { + // special case to report a list of numbers for a string of characters, + // hence this is NOT using hyper() + var str, unicodeList; + + if (this.enableHyperOps) { + if (string instanceof List) { + return string.map(each => this.reportUnicode(each)); + } + str = isNil(string) ? '\u0000' : string.toString(); + // unicodeList = Array.from(str); // emoji-friendly version + unicodeList = str.split(''); + if (unicodeList.length > 1) { + return this.reportUnicode(new List(unicodeList)); + } + } else { + str = isNil(string) ? '\u0000' : string.toString(); + } + if (str.codePointAt) { // support for Unicode in newer browsers. + return str.codePointAt(0) || 0; + } + return str.charCodeAt(0) || 0; +}; + +Process.prototype.reportUnicodeAsLetter = function (num) { + return this.hyper(this.reportBasicUnicodeAsLetter, num); +}; + +Process.prototype.reportBasicUnicodeAsLetter = function (num) { + var code = +(num || 0); + + if (String.fromCodePoint) { // support for Unicode in newer browsers. + return String.fromCodePoint(code); + } + return String.fromCharCode(code); +}; + +Process.prototype.reportTextSplit = function (string, delimiter) { + if (this.inputOption(delimiter) === 'blocks') { + this.assertType(string, ['command', 'reporter', 'predicate']); + return string.components(); + } + return this.hyper( + (str, delim) => this.reportBasicTextSplit(str, delim), + string, + delimiter + ); +}; + +Process.prototype.reportBasicTextSplit = function (string, delimiter) { + var types = ['text', 'number'], + strType = this.reportTypeOf(string), + delType = this.reportTypeOf(this.inputOption(delimiter)), + str, + del; + if (!contains(types, strType)) { + throw new Error( + localize('expecting a') + ' ' + + localize('text') + ' ' + + localize('but getting a') + ' ' + + localize(strType) + ); + } + if (!contains(types, delType)) { + throw new Error( + localize('expecting a') + ' ' + + localize('text') + ' ' + + localize('but getting a') + ' ' + + localize(delType) + ); + } + str = isNil(string) ? '' : string.toString(); + switch (this.inputOption(delimiter)) { + case 'line': + // Unicode compliant line splitting (platform independent) + // http://www.unicode.org/reports/tr18/#Line_Boundaries + del = /\r\n|[\n\v\f\r\x85\u2028\u2029]/; + break; + case 'tab': + del = '\t'; + break; + case 'cr': + del = '\r'; + break; + case 'word': + case 'whitespace': + str = str.trim(); + del = /\s+/; + break; + case '': + case 'letter': + // return new List(Array.from(str)); // proposed by Michael for emojis + return new List(str.split('')); + case 'csv': + return this.parseCSV(string); + case 'json': + return this.parseJSON(string); + /* + case 'csv records': + return this.parseCSVrecords(string); + case 'csv fields': + return this.parseCSVfields(string); + */ + default: + del = delimiter.toString(); + if (this.isCaseInsensitive) { + del = new RegExp( + del.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'), + "ig" + ); + } + } + return new List(str.split(del)); +}; + +// Process - parsing primitives + +Process.prototype.parseCSV = function (text) { + // try to address the kludge that Excel sometimes uses commas + // and sometimes semi-colons as delimiters, try to find out + // which makes more sense by examining the first line + return this.rawParseCSV(text, this.guessDelimiterCSV(text)); +}; + +Process.prototype.guessDelimiterCSV = function (text) { + // assumes that the first line contains the column headers. + // report the first delimiter for which parsing the header + // yields more than a single field, otherwise default to comma + var delims = [',', ';', '|', '\t'], + len = delims.length, + firstLine = text.split('\n')[0], + i; + for (i = 0; i < len; i += 1) { + if (this.rawParseCSV(firstLine, delims[i]).length() > 1) { + return delims[i]; + } + } + return delims[0]; +}; + +Process.prototype.rawParseCSV = function (text, delim) { + // RFC 4180 + // parse a csv table into a two-dimensional list. + // if the table contains just a single row return it a one-dimensional + // list of fields instead (for backwards-compatibility) + var prev = '', + fields = [''], + records = [fields], + col = 0, + r = 0, + esc = true, + len = text.length, + idx, + char; + delim = delim || ','; + for (idx = 0; idx < len; idx += 1) { + char = text[idx]; + if (char === '\"') { + if (esc && char === prev) { + fields[col] += char; + } + esc = !esc; + } else if (char === delim && esc) { + char = ''; + col += 1; + fields[col] = char; + } else if (char === '\r' && esc) { + r += 1; + records[r] = ['']; + fields = records[r]; + col = 0; + } else if (char === '\n' && esc) { + if (prev !== '\r') { + r += 1; + records[r] = ['']; + fields = records[r]; + col = 0; + } + } else { + fields[col] += char; + } + prev = char; + } + + // remove the last record, if it is empty + if (records[records.length - 1].length === 1 && + records[records.length - 1][0] === '') + { + records.pop(); + } + + // convert arrays to Snap! Lists + records = new List( + records.map(row => new List(row)) + ); + + // for backwards compatibility return the first row if it is the only one + if (records.length() === 1) { + return records.at(1); + } + return records; +}; + +Process.prototype.parseJSON = function (string) { + // Bernat's original Snapi contribution + function listify(jsonObject) { + if (jsonObject instanceof Array) { + return new List( + jsonObject.map(function(eachElement) { + return listify(eachElement); + }) + ); + } else if (jsonObject instanceof Object) { + return new List( + Object.keys(jsonObject).map(function(eachKey) { + return new List([ + eachKey, + listify(jsonObject[eachKey]) + ]); + }) + ); + } else { + return jsonObject; + } + } + + return listify(JSON.parse(string)); +}; + +// Process syntax analysis + +Process.prototype.assemble = function (blocks) { + var first; + if (!(blocks instanceof List)) { + return blocks; + } + first = blocks.at(1); + if (first instanceof Context) { + return first.copyWithInputs( + blocks.cdr().map(each => this.assemble(each)) + ); + } + if (blocks.isEmpty()) { + return blocks; + } + if (this.reportIsA(blocks.at(1), 'number')) { + return blocks.map(each => this.assemble(each)); + } + return blocks.map(each => this.assemble(each)).itemsArray().reduce( + (a, b) => a.copyWithNext(b) + ); +}; + +// Process debugging + +Process.prototype.alert = function (data) { + // debugging primitives only work in dev mode, otherwise they're nop + var world; + if (this.homeContext.receiver) { + world = this.homeContext.receiver.world(); + if (world.isDevMode) { + alert('Snap! ' + data.itemsArray()); + } + } +}; + +Process.prototype.log = function (data) { + // debugging primitives only work in dev mode, otherwise they're nop + var world; + if (this.homeContext.receiver) { + world = this.homeContext.receiver.world(); + if (world.isDevMode) { + console.log('Snap! ' + data.itemsArray()); + } + } +}; + +// Process motion primitives + +Process.prototype.getOtherObject = function (name, thisObj, stageObj) { + // private, find the sprite indicated by the given name + // either onstage or in the World's hand + + // deal with first-class sprites + if (isSnapObject(name)) { + return name; + } + + if (this.inputOption(name) === 'myself') { + return thisObj; + } + var stage = isNil(stageObj) ? + thisObj.parentThatIsA(StageMorph) : stageObj, + thatObj = null; + if (stage) { + // find the corresponding sprite on the stage + thatObj = detect( + stage.children, + morph => snapEquals(morph.name, name) + ); + if (!thatObj) { + // check if the sprite in question is currently being + // dragged around + thatObj = detect( + stage.world().hand.children, + morph => morph instanceof SpriteMorph && + morph.name === name + ); + } + } + return thatObj; +}; + +Process.prototype.getObjectsNamed = function (name, thisObj, stageObj) { + // private, find all sprites and their clones indicated + // by the given name either onstage or in the World's hand + + var stage = isNil(stageObj) ? + thisObj.parentThatIsA(StageMorph) : stageObj, + those = []; + + function check(obj) { + return obj instanceof SpriteMorph && obj.isTemporary ? + obj.cloneOriginName === name : obj.name === name; + } + + if (stage) { + // find the corresponding sprite on the stage + those = stage.children.filter(check); + if (!those.length) { + // check if a sprite in question is currently being + // dragged around + those = stage.world().hand.children.filter(check); + } + } + return those; +}; + +Process.prototype.setHeading = function (direction) { + var thisObj = this.blockReceiver(); + + if (thisObj) { + if (this.inputOption(direction) === 'random') { + direction = this.reportBasicRandom(1, 36000) / 100; + } + thisObj.setHeading(direction); + } +}; + +Process.prototype.doFaceTowards = function (name) { + var thisObj = this.blockReceiver(), + thatObj; + + if (thisObj) { + if (this.inputOption(name) === 'center') { + thisObj.faceToXY(0, 0); + } else if (this.inputOption(name) === 'mouse-pointer') { + thisObj.faceToXY(this.reportMouseX(), this.reportMouseY()); + } else if (this.inputOption(name) === 'random position') { + thisObj.setHeading(this.reportBasicRandom(1, 36000) / 100); + } else { + if (name instanceof List) { + thisObj.faceToXY( + name.at(1), + name.at(2) + ); + return; + } + thatObj = this.getOtherObject(name, this.homeContext.receiver); + if (thatObj) { + thisObj.faceToXY( + thatObj.xPosition(), + thatObj.yPosition() + ); + } + } + } +}; + +Process.prototype.doGotoObject = function (name) { + var thisObj = this.blockReceiver(), + thatObj, + stage; + + if (thisObj) { + if (this.inputOption(name) === 'center') { + thisObj.gotoXY(0, 0); + } else if (this.inputOption(name) === 'mouse-pointer') { + thisObj.gotoXY(this.reportMouseX(), this.reportMouseY()); + } else if (this.inputOption(name) === 'random position') { + stage = thisObj.parentThatIsA(StageMorph); + if (stage) { + thisObj.setCenter(new Point( + this.reportBasicRandom(stage.left(), stage.right()), + this.reportBasicRandom(stage.top(), stage.bottom()) + )); + } + } else { + if (name instanceof List) { + thisObj.gotoXY( + name.at(1), + name.at(2) + ); + return; + } + thatObj = this.getOtherObject(name, this.homeContext.receiver); + if (thatObj) { + thisObj.gotoXY( + thatObj.xPosition(), + thatObj.yPosition() + ); + } + } + } +}; + +// Process layering primitives + +Process.prototype.goToLayer = function (name) { + var option = this.inputOption(name), + thisObj = this.blockReceiver(); + if (thisObj instanceof SpriteMorph) { + if (option === 'front') { + thisObj.comeToFront(); + } else if (option === 'back') { + thisObj.goToBack(); + } + } +}; + +// Process scene primitives + +Process.prototype.doSwitchToScene = function (id, transmission) { + var rcvr = this.blockReceiver(), + idx = 0, + message = this.inputOption(transmission.at(1)), + payload = transmission.at(2), + ide, scenes, num, scene; + this.assertAlive(rcvr); + this.assertType(message, ['text', 'number', 'Boolean', 'list']); + this.assertType(payload, ['text', 'number', 'Boolean', 'list']); + if (message instanceof List) { + // make sure only atomic leafs are inside the list + // don't actually encode the list as json, though + if (message.canBeJSON()) { + message = message.deepMap(leaf => leaf); // deep copy the list + } else { + throw new Error(localize( + 'cannot send media,\nsprites or procedures\nto another scene' + )); + } + } + if (payload instanceof List) { + // make sure only atomic leafs are inside the list + // don't actually encode the list as json, though + if (payload.canBeJSON()) { + payload = payload.deepMap(leaf => leaf); // deep copy the list + } else { + throw new Error(localize( + 'cannot send media,\nsprites or procedures\nto another scene' + )); + } + } + if (this.readyToTerminate) { + // let the user press "stop" or "esc", + // prevent "when this scene starts" hat blocks from directly + // switching to another + return; + } + ide = rcvr.parentThatIsA(IDE_Morph); + scenes = ide.scenes; + + if (id instanceof Array) { // special named indices + switch (this.inputOption(id)) { + case 'next': + idx = scenes.indexOf(ide.scene) + 1; + if (idx > scenes.length()) { + idx = 1; + } + break; + case 'previous': + idx = scenes.indexOf(ide.scene) - 1; + if (idx < 1) { + idx = scenes.length(); + } + break; + /* + case 'last': + idx = scenes.length(); + break; + */ + case 'random': + idx = this.reportBasicRandom(1, scenes.length()); + break; + } + this.stop(); + // ide.onNextStep = () => // slow down scene switching, disabled for now + ide.switchToScene(scenes.at(idx), null, message, payload); + return; + } + + scene = detect(scenes.itemsArray(), scn => scn.name === id); + if (scene === null) { + num = parseFloat(id); + if (isNaN(num)) { + return; + } + scene = scenes.at(num); + } + + this.stop(); + ide.switchToScene(scene, null, message, payload); +}; + +// Process color primitives + +Process.prototype.setColorDimension = function (name, num) { + var options = ['hue', 'saturation', 'brightness', 'transparency'], + choice = this.inputOption(name); + if (choice === 'r-g-b(-a)') { + this.blockReceiver().setColorRGBA(num); + return; + } + this.blockReceiver().setColorDimension( + options.indexOf(choice), + +num + ); +}; + +Process.prototype.changeColorDimension = function (name, num) { + var options = ['hue', 'saturation', 'brightness', 'transparency'], + choice = this.inputOption(name); + if (choice === 'r-g-b(-a)') { + this.blockReceiver().changeColorRGBA(num); + return; + } + this.blockReceiver().changeColorDimension( + options.indexOf(choice), + +num + ); +}; + +Process.prototype.setPenColorDimension = + Process.prototype.setColorDimension; + +Process.prototype.changePenColorDimension = + Process.prototype.changeColorDimension; + +Process.prototype.setBackgroundColorDimension = + Process.prototype.setColorDimension; + +Process.prototype.changeBackgroundColorDimension = + Process.prototype.changeColorDimension; + +// Process cutting & pasting primitives + +Process.prototype.doPasteOn = function (name) { + this.blitOn(name, 'source-atop'); +}; + +Process.prototype.doCutFrom = function (name) { + this.blitOn(name, 'destination-out'); +}; + +Process.prototype.blitOn = function (name, mask, thisObj, stage) { + // allow for lists of sprites and also check for temparary clones, + // as in Scratch 2.0, + var those; + thisObj = thisObj || this.blockReceiver(); + stage = stage || thisObj.parentThatIsA(StageMorph); + if (stage.name === name) { + name = stage; + } + if (isSnapObject(name)) { + return thisObj.blitOn(name, mask); + } + if (name instanceof List) { // assume all elements to be sprites + those = name.itemsArray(); + } else { + those = this.getObjectsNamed(name, thisObj, stage); // clones + } + those.forEach(each => { + // only draw on same-named clones that don't dynamically the costume + if (!each.inheritsAttribute('costume #')) { + this.blitOn(each, mask, thisObj, stage); + } + }); +}; + +// Process temporary cloning (Scratch-style) + +Process.prototype.createClone = function (name) { + var thisObj = this.blockReceiver(), + thatObj; + + if (!name || this.readyToTerminate) {return; } + if (thisObj) { + if (this.inputOption(name) === 'myself') { + thisObj.createClone(!this.isFirstStep); + } else { + thatObj = this.getOtherObject(name, thisObj); + if (thatObj) { + thatObj.createClone(!this.isFirstStep); + } + } + } +}; + +Process.prototype.newClone = function (name) { + var thisObj = this.blockReceiver(), + thatObj; + + if (!name) {return; } + if (thisObj) { + if (this.inputOption(name) === 'myself') { + return thisObj.newClone(!this.isFirstStep); + } + thatObj = this.getOtherObject(name, thisObj); + if (thatObj) { + return thatObj.newClone(!this.isFirstStep); + } + } +}; + +// Process sensing primitives + +Process.prototype.reportTouchingObject = function (name) { + var thisObj = this.blockReceiver(); + + if (thisObj) { + return this.objectTouchingObject(thisObj, name); + } + return false; +}; + +Process.prototype.objectTouchingObject = function (thisObj, name) { + // helper function for reportTouchingObject() + // also check for temparary clones, as in Scratch 2.0, + // and for any parts (subsprites) + var those, + stage, + box, + coord; + + if (this.inputOption(name) === 'mouse-pointer') { + coord = thisObj.world().hand.position(); + if (thisObj.bounds.containsPoint(coord) && + !thisObj.isTransparentAt(coord)) { + return true; + } + } else if (this.isCoordinate(name)) { + coord = thisObj.worldPoint(new Point(name.at(1), name.at(2))); + if (thisObj.bounds.containsPoint(coord) && + !thisObj.isTransparentAt(coord)) { + return true; + } + } else { + stage = thisObj.parentThatIsA(StageMorph); + if (stage) { + if (this.inputOption(name) === 'edge') { + box = thisObj.bounds; + if (!thisObj.costume && thisObj.penBounds) { + box = thisObj.penBounds.translateBy(thisObj.position()); + } + if (!stage.bounds.containsRectangle(box)) { + return true; + } + } + if (this.inputOption(name) === 'pen trails' && + thisObj.isTouching(stage.penTrailsMorph())) { + return true; + } + if (isSnapObject(name)) { + return name.isVisible && thisObj.isTouching(name); + } + if (name instanceof List) { // assume all elements to be sprites + those = name.itemsArray(); + } else { + those = this.getObjectsNamed(name, thisObj, stage); // clones + } + if (those.some(any => any.isVisible && thisObj.isTouching(any) + // check collision with any part, performance issue + // commented out for now + /* + return any.allParts().some(function (part) { + return part.isVisible && thisObj.isTouching(part); + }) + */ + )) { + return true; + } + } + } + return thisObj.parts.some(any => + this.objectTouchingObject(any, name) + ); +}; + +Process.prototype.reportAspect = function (aspect, location) { + // sense colors and sprites anywhere, + // use sprites to read/write data encoded in colors. + // + // usage: + // ------ + // left input selects color/saturation/brightness/transparency or "sprites". + // right input selects "mouse-pointer", "myself" or name of another sprite. + // you can also embed a a reporter with a reference to a sprite itself + // or a list of two items representing x- and y- coordinates. + // + // what you'll get: + // ---------------- + // left input (aspect): + // + // 'hue' - hsl HUE on a scale of 0 - 100 + // 'saturation' - hsl SATURATION on a scale of 0 - 100 + // 'brightness' - hsl BRIGHTNESS on a scale of 0 - 100 + // 'transparency' - rgba ALPHA on a reversed (!) scale of 0 - 100 + // 'r-g-b-a' - list of rgba values on a scale of 0 - 255 each + // 'sprites' - a list of sprites at the location, empty if none + // + // right input (location): + // + // 'mouse-pointer' - color/sprites at mouse-pointer anywhere in Snap + // 'myself' - sprites at or color UNDERNEATH the rotation center + // sprite-name - sprites at or color UNDERNEATH sprites's rot-ctr. + // two-item-list - color/sprites at x-/y- coordinates on the Stage + // + // what does "underneath" mean? + // ---------------------------- + // the not-fully-transparent color of the top-layered sprite at the given + // location excluding the receiver sprite's own layer and all layers above + // it gets reported. + // + // color-aspect "underneath" a sprite means that the sprite's layer is + // relevant for what gets reported. Sprites can only sense colors in layers + // below themselves, not their own color and not colors in sprites above + // their own layer. + + if (this.enableHyperOps) { + if (location instanceof List && !this.isCoordinate(location)) { + return location.map(each => this.reportAspect(aspect, each)); + } + } + + var choice = this.inputOption(aspect), + target = this.inputOption(location), + options = ['hue', 'saturation', 'brightness', 'transparency'], + idx = options.indexOf(choice), + thisObj = this.blockReceiver(), + thatObj, + stage = thisObj.parentThatIsA(StageMorph), + world = thisObj.world(), + point, + clr; + + if (target === 'myself') { + if (choice === 'sprites') { + if (thisObj instanceof StageMorph) { + point = thisObj.center(); + } else { + point = thisObj.rotationCenter(); + } + return this.spritesAtPoint(point, stage); + } else { + clr = this.colorAtSprite(thisObj); + } + } else if (target === 'mouse-pointer') { + if (choice === 'sprites') { + return this.spritesAtPoint(world.hand.position(), stage); + } else { + clr = world.getGlobalPixelColor(world.hand.position()); + } + } else if (target instanceof List) { + point = new Point( + target.at(1) * stage.scale + stage.center().x, + stage.center().y - (target.at(2) * stage.scale) + ); + if (choice === 'sprites') { + return this.spritesAtPoint(point, stage); + } else { + clr = world.getGlobalPixelColor(point); + } + } else { + if (!target) {return; } + thatObj = this.getOtherObject(target, thisObj, stage); + if (thatObj) { + if (choice === 'sprites') { + point = thatObj instanceof SpriteMorph ? + thatObj.rotationCenter() : thatObj.center(); + return this.spritesAtPoint(point, stage); + } else { + clr = this.colorAtSprite(thatObj); + } + } else { + return; + } + + } + + if (choice === 'r-g-b-a') { + return new List([clr.r, clr.g, clr.b, Math.round(clr.a * 255)]); + } + if (idx < 0 || idx > 3) { + return; + } + if (idx === 3) { + return (1 - clr.a) * 100; + } + return clr[SpriteMorph.prototype.penColorModel]()[idx] * 100; +}; + +Process.prototype.colorAtSprite = function (sprite) { + // private - helper function for aspect of location + // answer the top-most color at the sprite's rotation center + // excluding the sprite itself + var point = sprite instanceof SpriteMorph ? sprite.rotationCenter() + : sprite.center(), + stage = sprite.parentThatIsA(StageMorph), + child, + i; + + if (!stage) {return BLACK; } + for (i = stage.children.length; i > 0; i -= 1) { + child = stage.children[i - 1]; + if ((child !== sprite) && + child.isVisible && + child.bounds.containsPoint(point) && + !child.isTransparentAt(point) + ) { + return child.getPixelColor(point); + } + } + if (stage.bounds.containsPoint(point)) { + return stage.getPixelColor(point); + } + return BLACK; +}; + +Process.prototype.colorBelowSprite = function (sprite) { + // private - helper function for aspect of location + // answer the color underneath the layer of the sprite's rotation center + // NOTE: layer-aware color sensing is currently unused + // in favor of top-layer detection because of user-observations + var point = sprite instanceof SpriteMorph ? sprite.rotationCenter() + : sprite.center(), + stage = sprite.parentThatIsA(StageMorph), + below = stage, + found = false, + child, + i; + + if (!stage) {return BLACK; } + for (i = 0; i < stage.children.length; i += 1) { + if (!found) { + child = stage.children[i]; + if (child === sprite) { + found = true; + } else if (child.isVisible && + child.bounds.containsPoint(point) && + !child.isTransparentAt(point) + ) { + below = child; + } + } + } + if (below.bounds.containsPoint(point)) { + return below.getPixelColor(point); + } + return BLACK; +}; + +Process.prototype.spritesAtPoint = function (point, stage) { + // private - helper function for aspect of location + // point argument is an absolute (Morphic) point + // answer a list of sprites, if any, at the given point + // ordered by their layer, i.e. top-layer is last in the list + return new List( + stage.children.filter(morph => + morph instanceof SpriteMorph && + morph.isVisible && + morph.bounds.containsPoint(point) && + !morph.isTransparentAt(point) + ) + ); +}; + +Process.prototype.reportRelationTo = function (relation, name) { + if (this.enableHyperOps) { + if (name instanceof List) { + // make all numerical 2-item lists atomic + name = this.packCoordinates(name); + } + return this.hyperDyadic( + (rel, nam) => this.reportBasicRelationTo(rel, nam), + relation, + name + ); + } + return this.reportBasicRelationTo(relation, name); +}; + +Process.prototype.reportBasicRelationTo = function (relation, name) { + var rel = this.inputOption(relation); + if (name instanceof Variable) { // atomic coordinate + name = name.value; + } + if (rel === 'distance') { + return this.reportDistanceTo(name); + } + if (rel === 'ray length') { + return this.reportRayLengthTo(name); + } + if (rel === 'direction') { + return this.reportDirectionTo(name); + } + if (this.reportTypeOf(rel) === 'number') { + return this.reportRayLengthTo(name, +rel); + } + return 0; +}; + +Process.prototype.isCoordinate = function (data) { + return data instanceof List && + (data.length() === 2) && + this.reportTypeOf(data.at(1)) === 'number' && + this.reportTypeOf(data.at(2)) === 'number'; +}; + +Process.prototype.reportDistanceTo = function (name) { + var thisObj = this.blockReceiver(), + thatObj, + stage, + rc, + point; + + if (thisObj) { + rc = thisObj.rotationCenter(); + point = rc; + if (this.inputOption(name) === 'mouse-pointer') { + point = thisObj.world().hand.position(); + } else if (this.inputOption(name) === 'center') { + return new Point(thisObj.xPosition(), thisObj.yPosition()) + .distanceTo(ZERO); + } else if (name instanceof List) { + return new Point(thisObj.xPosition(), thisObj.yPosition()) + .distanceTo(new Point(name.at(1), name.at(2))); + } + stage = thisObj.parentThatIsA(StageMorph); + thatObj = this.getOtherObject(name, thisObj, stage); + if (thatObj) { + point = thatObj.rotationCenter(); + } + return rc.distanceTo(point) / stage.scale; + } + return 0; +}; + +Process.prototype.reportRayLengthTo = function (name, relativeAngle = 0) { + // raycasting edge detection - answer the distance between the asking + // sprite's rotation center to the target sprite's outer edge (the first + // opaque pixel) in the asking sprite's current direction offset by + // an optional relative angle in degrees + var thisObj = this.blockReceiver(), + thatObj, + stage, + rc, + targetBounds, + intersections = [], + dir, + a, b, x, y, + top, bottom, left, right, + circa, hSect, vSect, + point, hit, + temp, + width, imageData; + + circa = (num) => Math.round(num * 10000000) / 10000000; // good enough + + hSect = (yLevel) => { + var theta = radians(dir); + b = rc.y - yLevel; + a = b * Math.tan(theta); + x = rc.x + a; + if ( + (circa(x) === circa(rc.x) && + ((dir === 180 && rc.y < yLevel) || + dir === 0 && rc.y > yLevel) + ) || + (x > rc.x && dir >= 0 && dir < 180) || + (circa(x) < circa(rc.x) && + dir >= 180 && dir < 360) + ) { + if (x >= left && x <= right) { + intersections.push(new Point(x, yLevel)); + } + } + }; + + vSect = (xLevel) => { + var theta = radians(360 - dir - 90); + b = rc.x - xLevel; + a = b * Math.tan(theta); + y = rc.y + a; + if ( + (circa(y) === circa(rc.y) && + ((dir === 90 && rc.x < xLevel) || + dir === 270 && rc.x > xLevel) + ) || + (y > rc.y && dir >= 90 && dir < 270) || + (y < rc.y && (dir >= 270 || dir < 90)) + ) { + if (y >= top && y <= bottom) { + intersections.push(new Point(xLevel, y)); + } + } + }; + + if (!thisObj) {return -1; } + rc = thisObj.rotationCenter(); + point = rc; + stage = thisObj.parentThatIsA(StageMorph); + thatObj = this.getOtherObject(name, thisObj, stage); + if (!(thatObj instanceof SpriteMorph)) {return -1; } + + // determine intersections with the target's bounding box + dir = thisObj.heading + relativeAngle; + dir = ((+dir % 360) + 360) % 360; + targetBounds = thatObj.bounds; + top = targetBounds.top(); + bottom = targetBounds.bottom(); + left = targetBounds.left(); + right = targetBounds.right() - 1; + + // test if already inside the target + if (targetBounds.containsPoint(rc)) { + intersections.push(rc); + hSect(top); + hSect(bottom); + vSect(left); + vSect(right); + if (intersections.length < 2) { + return -1; + } + } else { + hSect(top); + hSect(bottom); + vSect(left); + vSect(right); + if (intersections.length < 2) { + return -1; + } + // sort + if (dir !== 90) { + if (Math.sign(rc.x - intersections[0].x) !== + Math.sign(intersections[0].x - intersections[1].x) || + Math.sign(rc.y - intersections[0].y) !== + Math.sign(intersections[0].y - intersections[1].y) + ) { + temp = intersections[0]; + intersections[0] = intersections[1]; + intersections[1] = temp; + } + } + } + + // for debugging: + /* + return new List(intersections) + .map(point => thisObj.snapPoint(point)) + .map(point => new List([point.x, point.y])); + */ + + // convert intersections to local bitmap coordinates of the target + intersections = intersections.map(point => + point.subtract(targetBounds.origin).floorDivideBy(stage.scale) + ); + + // get image data + width = Math.floor(targetBounds.width() / stage.scale); + imageData = thatObj.getImageData(); + + // scan the ray along the coordinates of a Bresenham line + // for the first opaque pixel + function alphaAt(imageData, width, x, y) { + var idx = y * width + x; + return imageData[idx] && 0x000000FF; // alpha + } + + function isOpaque(x, y) { + return alphaAt(imageData, width, x, y) > 0; + } + + function scan(testFunc, x0, y0, x1, y1) { + // Bresenham's algorithm + var dx = Math.abs(x1 - x0), + sx = x0 < x1 ? 1 : -1, + dy = -Math.abs(y1 - y0), + sy = y0 < y1 ? 1 : -1, + err = dx + dy, + e2; + + while (true) { + if (testFunc(x0, y0)) { + return new Point(x0 * stage.scale, y0 * stage.scale); + } + if (x0 === x1 && y0 === y1) { + return -1; // not found + } + e2 = 2 * err; + if (e2 > dy) { + err += dy; + x0 += sx; + } + if (e2 < dx) { + err += dx; + y0 += sy; + } + } + } + + hit = scan( + isOpaque, + intersections[0].x, + intersections[0].y, + intersections[1].x, + intersections[1].y + ); + if (hit === -1) {return hit; } + return rc.distanceTo(hit.add(targetBounds.origin)) / stage.scale; +}; + +Process.prototype.reportDirectionTo = function (name) { + var thisObj = this.blockReceiver(), + thatObj; + + if (thisObj) { + if (this.inputOption(name) === 'mouse-pointer') { + return thisObj.angleToXY(this.reportMouseX(), this.reportMouseY()); + } + if (this.inputOption(name) === 'center') { + return thisObj.angleToXY(0, 0); + } + if (name instanceof List) { + return thisObj.angleToXY( + name.at(1), + name.at(2) + ); + } + thatObj = this.getOtherObject(name, this.homeContext.receiver); + if (thatObj) { + return thisObj.angleToXY( + thatObj.xPosition(), + thatObj.yPosition() + ); + } + return thisObj.direction(); + } + return 0; +}; + +Process.prototype.reportAttributeOf = function (attribute, name) { + // hyper-dyadic + // note: specifying strings in the left input only accesses + // sprite-local variables. Attributes such as "width", "direction" etc. + // can only be queried via the dropdown menu and are, therefore, not + // reachable as dyadic inputs + return this.hyper( + (att, obj) => this.reportBasicAttributeOf(att, obj), + attribute, + name + ); +}; + +Process.prototype.reportBasicAttributeOf = function (attribute, name) { + var thisObj = this.blockReceiver(), + thatObj, + stage; + + if (name instanceof Context && attribute instanceof Context) { + if (attribute?.expression.selector === 'reportEnvironment') { + this.returnValueToParentContext(this.reportEnvironment( + attribute.expression.inputs()[0].evaluate(), + name + )); + return; + } + return this.reportContextFor(attribute, name); + } + if (thisObj) { + this.assertAlive(thisObj); + stage = thisObj.parentThatIsA(StageMorph); + if (name instanceof Context) { + thatObj = name; + } else if (stage.name === name) { + thatObj = stage; + } else { + thatObj = this.getOtherObject(name, thisObj, stage); + } + if (isSnapObject(thatObj)) { + this.assertAlive(thatObj); + if (attribute instanceof BlockMorph) { // a "wish" + return this.reportContextFor( + this.reify( + thatObj.getMethod(attribute.semanticSpec) + .blockInstance(), + new List() + ), + thatObj + ); + } + if (attribute instanceof Context) { + return this.reportContextFor(attribute, thatObj); + } + if (isString(attribute)) { + return thatObj.variables.getVar(attribute); + } + switch (this.inputOption(attribute)) { + case 'position': + return thatObj.xPosition ? + new List([thatObj.xPosition(), thatObj.yPosition()]) + : ''; + case 'x position': + return thatObj.xPosition ? thatObj.xPosition() : ''; + case 'y position': + return thatObj.yPosition ? thatObj.yPosition() : ''; + case 'direction': + return thatObj.direction ? thatObj.direction() : ''; + case 'costume #': + return thatObj.getCostumeIdx(); + case 'costume name': + return thatObj.costume ? thatObj.costume.name + : thatObj instanceof SpriteMorph ? localize('Turtle') + : localize('Empty'); + case 'size': + return thatObj.getScale ? thatObj.getScale() : ''; + case 'volume': + return thatObj.getVolume(); + case 'balance': + return thatObj.getPan(); + case 'extent': + if (thatObj instanceof StageMorph) { + return new List([ + thatObj.dimensions.x, + thatObj.dimensions.y + ]); + } + this.assertType(thatObj, 'sprite'); + return new List([ + thatObj.width() / stage.scale, + thatObj.height() / stage.scale, + ]); + case 'width': + if (thatObj instanceof StageMorph) { + return thatObj.dimensions.x; + } + this.assertType(thatObj, 'sprite'); + return thatObj.width() / stage.scale; + case 'height': + if (thatObj instanceof StageMorph) { + return thatObj.dimensions.y; + } + this.assertType(thatObj, 'sprite'); + return thatObj.height() / stage.scale; + case 'left': + return thatObj.xLeft(); + case 'right': + return thatObj.xRight(); + case 'top': + return thatObj.yTop(); + case 'bottom': + return thatObj.yBottom(); + } + } + if (isString(attribute)) { + return thatObj.outerContext.variables.getVar(attribute); + } + if (this.inputOption(attribute) === 'variables') { + return new List((thatObj instanceof Context ? + thatObj.outerContext + : thatObj).variables.allNames() + ); + } + } + return ''; +}; + +Process.prototype.reportGet = function (query) { + // answer a reference to a first-class member + // or a list of first-class members + var thisObj = this.blockReceiver(), + stage, + objName; + + function allOtherSprites() { + var stage = thisObj.parentThatIsA(StageMorph), + sprites = stage.children.filter(each => + each instanceof SpriteMorph && each !== thisObj + ), + inHand = stage.world().hand.children[0]; + if (inHand instanceof SpriteMorph) { + sprites.push(inHand); + } + return sprites; + } + + if (thisObj) { + switch (this.inputOption(query)) { + case 'self' : + return thisObj; + case 'other sprites': + return new List(allOtherSprites()); + case 'parts': // shallow copy to disable side-effects + return new List((thisObj.parts || []).map(each => each)); + case 'anchor': + return thisObj.anchor || ''; + case 'parent': + return thisObj.exemplar || ''; + case 'children': + return new List(thisObj.specimens ? thisObj.specimens() : []); + case 'temporary?': + return thisObj.isTemporary || false; + case 'clones': + objName = thisObj.name || thisObj.cloneOriginName; + return new List( + allOtherSprites().filter(each => + each.isTemporary && (each.cloneOriginName === objName) + ) + ); + case 'other clones': + return thisObj.isTemporary ? + this.reportGet(['clones']) : new List(); + case 'neighbors': + // old rectangular, bounding-box-based algorithm + // deprecated in favor of a circular perimeter based newer one + /* + neighborhood = thisObj.bounds.expandBy(new Point( + thisObj.width(), + thisObj.height() + )); + return new List( + allOtherSprites.filter(each => + each.isVisible && each.bounds.intersects(neighborhood) + ) + ); + */ + return thisObj.neighbors(); + case 'dangling?': + return !thisObj.rotatesWithAnchor; + case 'draggable?': + return thisObj.isDraggable; + case 'rotation style': + return thisObj.rotationStyle || 0; + case 'rotation x': + return thisObj.xPosition(); + case 'rotation y': + return thisObj.yPosition(); + case 'center x': + return thisObj.xCenter(); + case 'center y': + return thisObj.yCenter(); + case 'left': + return thisObj.xLeft(); + case 'right': + return thisObj.xRight(); + case 'top': + return thisObj.yTop(); + case 'bottom': + return thisObj.yBottom(); + case 'name': + return thisObj.name; + case 'stage': + return thisObj.parentThatIsA(StageMorph); + case 'scripts': + return new List( + thisObj.scripts.sortedElements().filter( + each => each instanceof BlockMorph + ).map( + each => each.fullCopy().reify() + ) + ); + case 'solutions': + if (thisObj.solution) { + return new List( + thisObj.solution.scripts.sortedElements().filter( + each => each instanceof BlockMorph + ).map( + each => new List([ + each?.comment.text() || '', + each.fullCopy().reify() + ]) + ) + ); + } + return new List(); + case 'blocks': // palette unoordered without inherited methods + return new List( + thisObj.parentThatIsA(StageMorph).globalBlocks.concat( + thisObj.allBlocks(true) + ).filter( + def => !def.isHelper + ).map( + def => def.blockInstance().reify() + ).concat( + SpriteMorph.prototype.categories.reduce( + (blocks, category) => blocks.concat( + thisObj.getPrimitiveTemplates( + category + ).filter( + each => each instanceof BlockMorph && + !(each instanceof HatBlockMorph) + ).map(block => { + let instance = block.fullCopy(); + instance.isTemplate = false; + return instance.reify(); + }) + ), + [] + ) + ) + ); + case 'categories': + /* // localized version, commented out for now: + return new List(SpriteMorph.prototype.categories.map(cat => + localize(cat.charAt(0).toUpperCase() + cat.slice(1))).concat( + Array.from( + SpriteMorph.prototype.customCategories.keys() + ).sort() + ) + ); + */ + return new List(SpriteMorph.prototype.allCategories()); + case 'costume': + return thisObj.costume; + case 'costumes': + return thisObj.reportCostumes(); + case 'sounds': + return thisObj.sounds; + case 'width': + if (thisObj instanceof StageMorph) { + return thisObj.dimensions.x; + } + stage = thisObj.parentThatIsA(StageMorph); + return stage ? thisObj.width() / stage.scale : 0; + case 'height': + if (thisObj instanceof StageMorph) { + return thisObj.dimensions.y; + } + stage = thisObj.parentThatIsA(StageMorph); + return stage ? thisObj.height() / stage.scale : 0; + } + } + return ''; +}; + +Process.prototype.reportObject = function (name) { + // hyper-monadic + if (this.enableHyperOps) { + if (name instanceof List) { + return name.map(each => this.reportObject(each)); + } + } + + var thisObj = this.blockReceiver(), + thatObj, + stage; + + if (thisObj) { + this.assertAlive(thisObj); + stage = thisObj.parentThatIsA(StageMorph); + if (snapEquals(stage.name, name)) { + thatObj = stage; + } else { + thatObj = this.getOtherObject(name, thisObj, stage); + } + if (thatObj) { + this.assertAlive(thatObj); + } + return thatObj; + } +}; + +Process.prototype.doSet = function (attribute, value) { + // manipulate sprites' attributes + var name, rcvr, ide; + rcvr = this.blockReceiver(); + this.assertAlive(rcvr); + if (!(attribute instanceof Context || attribute instanceof Array) || + (attribute instanceof Context && + attribute.expression.selector !== 'reportGet')) { + throw new Error(localize('unsupported attribute')); + } + name = attribute instanceof Context ? + attribute.expression.inputs()[0].evaluate() + : attribute; + if (name instanceof Array) { + name = name[0]; + } + switch (name) { + case 'anchor': + case 'my anchor': + this.assertType(rcvr, 'sprite'); + if (value instanceof SpriteMorph) { + // avoid circularity here, because the GUI already checks for + // conflicts while the user drags parts over prospective targets + if (!rcvr.enableNesting || contains(rcvr.allParts(), value)) { + throw new Error( + localize('unable to nest\n(disabled or circular?)') + ); + } + value.attachPart(rcvr); + } else { + rcvr.detachFromAnchor(); + } + break; + case 'parent': + case 'my parent': + this.assertType(rcvr, 'sprite'); + value = value instanceof SpriteMorph ? value : null; + rcvr.setExemplar(value, true); // throw an error in case of circularity + break; + case 'temporary?': + case 'my temporary?': + this.assertType(rcvr, 'sprite'); + this.assertType(value, 'Boolean'); + if (value) { + rcvr.release(); + } else { + rcvr.perpetuate(); + } + break; + case 'name': + case 'my name': + this.assertType(rcvr, ['sprite', 'stage']); + this.assertType(value, ['text', 'number']); + ide = rcvr.parentThatIsA(IDE_Morph); + if (ide) { + rcvr.setName( + ide.newSpriteName(value.toString(), rcvr) + ); + ide.spriteBar.nameField.setContents( + ide.currentSprite.name.toString() + ); + } + break; + case 'dangling?': + case 'my dangling?': + this.assertType(rcvr, 'sprite'); + this.assertType(value, 'Boolean'); + rcvr.rotatesWithAnchor = !value; + rcvr.version = Date.now(); + break; + case 'draggable?': + case 'my draggable?': + this.assertType(rcvr, 'sprite'); + this.assertType(value, 'Boolean'); + rcvr.isDraggable = value; + // update padlock symbol in the IDE: + ide = rcvr.parentThatIsA(IDE_Morph); + if (ide) { + ide.spriteBar.children.forEach(each => { + if (each.refresh) { + each.refresh(); + } + }); + } + rcvr.version = Date.now(); + break; + case 'rotation style': + case 'my rotation style': + this.assertType(rcvr, 'sprite'); + this.assertType(+value, 'number'); + if (!contains([0, 1, 2], +value)) { + return; // maybe throw an error msg + } + rcvr.changed(); + rcvr.rotationStyle = +value; + rcvr.fixLayout(); + rcvr.rerender(); + // update padlock symbol in the IDE: + ide = rcvr.parentThatIsA(IDE_Morph); + if (ide) { + ide.spriteBar.children.forEach(each => { + if (each.refresh) { + each.refresh(); + } + }); + } + rcvr.version = Date.now(); + break; + case 'rotation x': + case 'my rotation x': + this.assertType(rcvr, 'sprite'); + this.assertType(value, 'number'); + rcvr.setRotationX(value); + break; + case 'rotation y': + case 'my rotation y': + this.assertType(rcvr, 'sprite'); + this.assertType(value, 'number'); + rcvr.setRotationY(value); + break; + case 'microphone modifier': + this.setMicrophoneModifier(value); + break; + default: + throw new Error( + '"' + localize(name) + '" ' + localize('is read-only') + ); + } +}; + +Process.prototype.reportContextFor = function (context, otherObj) { + // Private - return a copy of the context + // and bind it to another receiver + var result = copy(context), + receiverVars, + rootVars; + + if (otherObj instanceof Context) { + result.outerContext = otherObj.outerContext; + result.variables.parentFrame = otherObj.outerContext.variables; + result.receiver = otherObj.receiver; + return result; + } + + result.receiver = otherObj; + if (!result.outerContext) { + result.outerContext = new Context(); + result.variables.parentFrame = result.outerContext.variables; + } + result.outerContext = copy(result.outerContext); + result.outerContext.variables = copy(result.outerContext.variables); + result.outerContext.receiver = otherObj; + if (result.outerContext.variables.parentFrame) { + rootVars = result.outerContext.variables.parentFrame; + receiverVars = otherObj.variables.fullCopy(); + receiverVars.root().parentFrame = rootVars; + result.outerContext.variables.parentFrame = receiverVars; + result.variables = receiverVars; + } else { + result.outerContext.variables.parentFrame = otherObj.variables; + } + return result; +}; + +Process.prototype.reportMousePosition = function () { + var world, pos; + if (this.homeContext.receiver) { + world = this.homeContext.receiver.world(); + if (world) { + pos = this.homeContext.receiver.snapPoint(world.hand.position()); + return new List([pos.x, pos.y]); + } + } + return ''; +}; + +Process.prototype.reportMouseX = function () { + var world; + if (this.homeContext.receiver) { + world = this.homeContext.receiver.world(); + if (world) { + return this.homeContext.receiver.snapPoint(world.hand.position()).x; + } + } + return 0; +}; + +Process.prototype.reportMouseY = function () { + var world; + if (this.homeContext.receiver) { + world = this.homeContext.receiver.world(); + if (world) { + return this.homeContext.receiver.snapPoint(world.hand.position()).y; + } + } + return 0; +}; + +Process.prototype.reportMouseDown = function () { + var world; + if (this.homeContext.receiver) { + world = this.homeContext.receiver.world(); + if (world) { + return world.hand.mouseButton === 'left'; + } + } + return false; +}; + +Process.prototype.reportKeyPressed = function (keyString) { + // hyper-monadic + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + if (this.inputOption(keyString) === 'any key') { + return Object.keys(stage.keysPressed).length > 0; + } + if (keyString instanceof List && this.enableHyperOps) { + return keyString.map( + each => stage.keysPressed[each] !== undefined + ); + } + return stage.keysPressed[keyString] !== undefined; + } + } + return false; +}; + +Process.prototype.doResetTimer = function () { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.resetTimer(); + } + } +}; + +Process.prototype.reportTimer = function () { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + return stage.getTimer(); + } + } + return 0; +}; + +// Process Dates and times in Snap +Process.prototype.reportDate = function (datefn) { + var currDate, func, result, + inputFn = this.inputOption(datefn), + // Map block options to built-in functions + dateMap = { + 'year' : 'getFullYear', + 'month' : 'getMonth', + 'date': 'getDate', + 'day of week' : 'getDay', + 'hour' : 'getHours', + 'minute' : 'getMinutes', + 'second' : 'getSeconds', + 'time in milliseconds' : 'getTime' + }; + + if (!dateMap[inputFn]) { return ''; } + currDate = new Date(); + func = dateMap[inputFn]; + result = currDate[func](); + + // Show months as 1-12 and days as 1-7 + if (inputFn === 'month' || inputFn === 'day of week') { + result += 1; + } + return result; +}; + +// Process video motion detection primitives + +Process.prototype.doSetVideoTransparency = function(factor) { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.projectionTransparency = Math.max(0, Math.min(100, factor)); + } + } +}; + +Process.prototype.reportVideo = function(attribute, name) { + // hyper-monadic + var thisObj = this.blockReceiver(), + stage = thisObj.parentThatIsA(StageMorph), + thatObj; + + if (!stage.projectionSource || !stage.projectionSource.stream) { + // wait until video is turned on + if (!this.context.accumulator) { + this.context.accumulator = true; // started video + stage.startVideo(); + } + this.pushContext('doYield'); + this.pushContext(); + return; + } + + if (this.enableHyperOps) { + if (name instanceof List) { + return name.map(each => this.reportVideo(attribute, each)); + } + } + thatObj = this.getOtherObject(name, thisObj, stage); + switch (this.inputOption(attribute)) { + case 'motion': + if (thatObj instanceof SpriteMorph) { + stage.videoMotion.getLocalMotion(thatObj); + return thatObj.motionAmount; + } + stage.videoMotion.getStageMotion(); + return stage.videoMotion.motionAmount; + case 'direction': + if (thatObj instanceof SpriteMorph) { + stage.videoMotion.getLocalMotion(thatObj); + return thatObj.motionDirection; + } + stage.videoMotion.getStageMotion(); + return stage.videoMotion.motionDirection; + case 'snap': + if (thatObj instanceof SpriteMorph) { + return thatObj.projectionSnap(thisObj); + } + return stage.projectionSnap(thisObj); + } + return -1; +}; + +Process.prototype.startVideo = function(stage) { + // interpolated + if (this.reportGlobalFlag('video capture')) {return; } + if (!stage.projectionSource || !stage.projectionSource.stream) { + // wait until video is turned on + if (!this.context.accumulator) { + this.context.accumulator = true; // started video + stage.startVideo(); + } + } + this.pushContext('doYield'); + this.pushContext(); +}; + +// Process code mapping + +/* + for generating textual source code using + blocks - not needed to run or debug Snap +*/ + +Process.prototype.doMapCodeOrHeader = function (aContext, anOption, aString) { + if (this.inputOption(anOption) === 'code') { + return this.doMapCode(aContext, aString); + } + if (this.inputOption(anOption) === 'header') { + return this.doMapHeader(aContext, aString); + } + throw new Error( + ' \'' + anOption + '\'\n' + localize('is not a valid option') + ); +}; + +Process.prototype.doMapHeader = function (aContext, aString) { + if (aContext instanceof Context) { + if (aContext.expression instanceof SyntaxElementMorph) { + return aContext.expression.mapHeader(aString || ''); + } + } +}; + +Process.prototype.doMapCode = function (aContext, aString) { + if (aContext instanceof Context) { + if (aContext.expression instanceof SyntaxElementMorph) { + return aContext.expression.mapCode(aString || ''); + } + } +}; + +Process.prototype.doMapValueCode = function (type, aString) { + var tp = this.inputOption(type); + switch (tp) { + case 'String': + StageMorph.prototype.codeMappings.string = aString || '<#1>'; + break; + case 'Number': + StageMorph.prototype.codeMappings.number = aString || '<#1>'; + break; + case 'true': + StageMorph.prototype.codeMappings.boolTrue = aString || 'true'; + break; + case 'false': + StageMorph.prototype.codeMappings.boolFalse = aString || 'true'; + break; + default: + throw new Error( + localize('unsupported data type') + ': "' + tp + '"' + ); + } + +}; + +Process.prototype.doMapListCode = function (part, kind, aString) { + var key1 = '', + key2 = 'delim'; + + if (this.inputOption(kind) === 'parameters') { + key1 = 'parms_'; + } else if (this.inputOption(kind) === 'variables') { + key1 = 'tempvars_'; + } + + if (this.inputOption(part) === 'list') { + key2 = 'list'; + } else if (this.inputOption(part) === 'item') { + key2 = 'item'; + } + + StageMorph.prototype.codeMappings[key1 + key2] = aString || ''; +}; + +Process.prototype.reportMappedCode = function (aContext) { + return this.hyper( + ctx => { + var scripts; + if (ctx instanceof Context) { + if (ctx.expression instanceof SyntaxElementMorph) { + return ctx.expression.mappedCode(); + } + } else if (isSnapObject(ctx)) { + scripts = ctx.scripts.sortedElements().filter( + each => each instanceof BlockMorph + ).map( + each => each.mappedCode() + ); + return (scripts.length ? scripts : ['']).reduce((a, b) => + a + '\n\n' + b); + } + return ''; + }, + aContext + ); +}; + +// Process music primitives + +Process.prototype.doRest = function (beats) { + var tempo = this.reportTempo(); + this.doWait(60 / tempo * beats); +}; + +Process.prototype.reportTempo = function () { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + return stage.getTempo(); + } + } + return 0; +}; + +Process.prototype.doChangeTempo = function (delta) { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.changeTempo(delta); + } + } +}; + +Process.prototype.doSetTempo = function (bpm) { + var stage; + if (this.homeContext.receiver) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (stage) { + stage.setTempo(bpm); + } + } +}; + +Process.prototype.doPlayNote = function (pitch, beats) { + var tempo = this.reportTempo(); + this.doPlayNoteForSecs( + parseFloat(pitch || '0'), + 60 / tempo * parseFloat(beats || '0') + ); +}; + +Process.prototype.doPlayNoteForSecs = function (pitch, secs) { + // interpolated + var rcvr = this.blockReceiver(); + if (!this.context.startTime) { + rcvr.setVolume(rcvr.getVolume()); // b/c Chrome needs lazy init + rcvr.setPan(rcvr.getPan()); // b/c Chrome needs lazy initialization + this.context.startTime = Date.now(); + this.context.activeNote = new Note(pitch); + this.context.activeNote.play( + this.instrument, + rcvr.getGainNode(), + rcvr.getPannerNode() + ); + } + if ((Date.now() - this.context.startTime) >= (secs * 1000)) { + if (this.context.activeNote) { + this.context.activeNote.stop(); + this.context.activeNote = null; + } + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.doPlayFrequency = function (hz, secs) { + this.doPlayFrequencyForSecs( + parseFloat(hz || '0'), + parseFloat(secs || '0') + ); +}; + +Process.prototype.doPlayFrequencyForSecs = function (hz, secs) { + // interpolated + if (!this.context.startTime) { + this.context.startTime = Date.now(); + this.context.activeNote = new Note(); + this.context.activeNote.frequency = hz; + this.context.activeNote.play(this.instrument); + } + if ((Date.now() - this.context.startTime) >= (secs * 1000)) { + if (this.context.activeNote) { + this.context.activeNote.stop(); + this.context.activeNote = null; + } + return null; + } + this.pushContext('doYield'); + this.pushContext(); +}; + +Process.prototype.doSetInstrument = function (num) { + this.instrument = +num; + this.receiver.instrument = +num; + if (this.receiver.freqPlayer) { + this.receiver.freqPlayer.setInstrument(+num); + } +}; + +// Process image processing primitives + +Process.prototype.reportGetImageAttribute = function (choice, name) { + if (this.enableHyperOps) { + if (name instanceof List) { + return name.map(each => this.reportGetImageAttribute(choice, each)); + } + } + + var cst = this.costumeNamed(name) || new Costume(), + option = this.inputOption(choice); + + switch (option) { + case 'name': + return cst.name; + case 'width': + return cst.width(); + case 'height': + return cst.height(); + case 'pixels': + return cst.rasterized().pixels(); + default: + return cst; + } +}; + +Process.prototype.reportNewCostumeStretched = function (name, xP, yP) { + var cst; + if (name instanceof List) { + return this.reportNewCostume(name, xP, yP); + } + cst = this.costumeNamed(name); + if (!cst) { + return new Costume(); + } + if (!isFinite(+xP * +yP) || isNaN(+xP * +yP)) { + throw new Error( + 'expecting a finite number\nbut getting Infinity or NaN' + ); + } + return cst.stretched( + Math.round(cst.width() * +xP / 100), + Math.round(cst.height() * +yP / 100) + ); +}; + +Process.prototype.costumeNamed = function (name) { + // private + if (name instanceof Costume) { + return name; + } + if (typeof name === 'number') { + return this.blockReceiver().costumes.at(name); + } + if (this.inputOption(name) === 'current') { + return this.blockReceiver().costume; + } + return detect( + this.blockReceiver().costumes.asArray(), + c => snapEquals(c.name, name.toString()) + ); +}; + +Process.prototype.reportNewCostume = function (pixels, width, height, name) { + var rcvr, stage, canvas, ctx, shp, dim, src, dta, i, k, px; + + this.assertType(pixels, 'list'); + if (this.inputOption(width) === 'current') { + rcvr = this.blockReceiver(); + stage = rcvr.parentThatIsA(StageMorph); + width = rcvr.costume ? rcvr.costume.width() : stage.dimensions.x; + } + if (this.inputOption(height) === 'current') { + rcvr = rcvr || this.blockReceiver(); + stage = stage || rcvr.parentThatIsA(StageMorph); + height = rcvr.costume ? rcvr.costume.height() : stage.dimensions.y; + } + width = Math.abs(Math.floor(+width)); + height = Math.abs(Math.floor(+height)); + if (!isFinite(width * height) || isNaN(width * height)) { + throw new Error( + 'expecting a finite number\nbut getting Infinity or NaN' + ); + } + if (width <= 0 || height <= 0) { + // try to interpret the pixels as matrix + shp = pixels.quickShape(); + if (shp.at(2) > 4) { + height = shp.at(1); + width = shp.at(2); + dim = new List([height * width]); + if (shp.length() === 3) { + dim.add(shp.at(3)); + } + pixels = pixels.reshape(dim); + } else { + throw new Error( + 'cannot handle zero width or height' + ); + } + } + + canvas = newCanvas(new Point(width, height), true); + ctx = canvas.getContext('2d'); + src = pixels.itemsArray(); + dta = ctx.createImageData(width, height); + for (i = 0; i < src.length; i += 1) { + px = src[i] instanceof List ? src[i].itemsArray() : [src[i]]; + for (k = 0; k < 3; k += 1) { + dta.data[(i * 4) + k] = px[k] === undefined ? +px[0] : +px[k]; + } + dta.data[i * 4 + 3] = (px[3] === undefined ? 255 : +px[3]); + } + ctx.putImageData(dta, 0, 0); + return new Costume( + canvas, + name || (rcvr || this.blockReceiver()).newCostumeName( + localize('costume') + ) + ); +}; + +Process.prototype.reportPentrailsAsSVG = function () { + // interpolated + var rcvr, stage, svg, acc, offset; + + if (!this.context.accumulator) { + stage = this.homeContext.receiver.parentThatIsA(StageMorph); + if (!stage.trailsLog.length) { + throw new Error (localize( + 'there are currently no\nvectorizable pen trail segments' + )); + } + svg = stage.trailsLogAsSVG(); + this.context.accumulator = { + img : new Image(), + rot : svg.rot, + ready : false + }; + acc = this.context.accumulator; + acc.img.onload = () => acc.ready = true; + acc.img.src = 'data:image/svg+xml,' + svg.src; + acc.img.rot = svg.rotationShift; + } else if (this.context.accumulator.ready) { + offset = ZERO; + rcvr = this.blockReceiver(); + if (rcvr instanceof SpriteMorph) { + offset = new Point(rcvr.xPosition(), -rcvr.yPosition()); + } + this.returnValueToParentContext( + new SVG_Costume( + this.context.accumulator.img, + this.blockReceiver().newCostumeName(localize('Costume')), + this.context.accumulator.rot.translateBy(offset) + ) + ); + return; + } + this.pushContext(); +}; + +// Process constant input options + +Process.prototype.inputOption = function (dta) { + // private - for localization + return dta instanceof Array ? dta[0] : dta; +}; + +// Process stack + +Process.prototype.pushContext = function (expression, outerContext) { + this.context = new Context( + this.context, + expression, + outerContext || (this.context ? this.context.outerContext : null), + // for tail call elimination + this.context ? // check needed due to tail call elimination + this.context.receiver : this.homeContext.receiver + ); +}; + +Process.prototype.popContext = function () { + if (this.context) { + this.context.stopMusic(); + } + this.context = this.context ? this.context.parentContext : null; +}; + +Process.prototype.returnValueToParentContext = function (value) { + // if no parent context exists treat value as result + if (value !== undefined) { + var target = this.context ? // in case of tail call elimination + this.context.parentContext || this.homeContext + : this.homeContext; + target.addInput(value); + + // if the script has been clicked on by the user in visible stepping + // mode show the result of evaluating a reporter in a + // speech balloon. Thanks, Vic! + if (this.enableSingleStepping && + this.isClicked && + this.context.expression instanceof ReporterBlockMorph + ) { + let anchor = this.context.expression; + if (!anchor.world()) { + // find a place to display the result of custon reporters + anchor = this.topBlock; + } + if (value instanceof List) { + anchor.showBubble( + value.isTable() ? + new TableFrameMorph(new TableMorph(value, 10)) + : new ListWatcherMorph(value), + this.exportResult, + this.receiver + ); + } else { + anchor.showBubble( + value, + this.exportResult, + this.receiver + ); + } + } + } +}; + +Process.prototype.reportStackSize = function () { + return this.context ? this.context.stackSize() : 0; +}; + +Process.prototype.reportFrameCount = function () { + return this.frameCount; +}; + +Process.prototype.reportYieldCount = function () { + return this.yieldCount; +}; + +// Process single-stepping + +Process.prototype.flashContext = function () { + var expr = this.context.expression; + if (this.enableSingleStepping && + !this.isAtomic && + expr instanceof SyntaxElementMorph && + !(expr instanceof CommandSlotMorph) && + !this.context.isFlashing && + expr.world() && + !(expr instanceof ColorSlotMorph)) { + this.unflash(); + expr.flash(); + this.context.isFlashing = true; + this.flashingContext = this.context; + if (this.flashTime > 0 && (this.flashTime <= 0.5)) { + this.pushContext('doIdle'); + this.context.addInput(this.flashTime); + } else { + this.pushContext('doInterrupt'); + } + return true; + } + return false; +}; + +Process.prototype.flashPausedContext = function () { + var flashable = this.context ? this.context.lastFlashable() : null; + if (flashable) { + this.unflash(); + flashable.expression.flash(); + flashable.isFlashing = true; + this.flashingContext = flashable; + } +}; + +Process.prototype.doInterrupt = function () { + this.popContext(); + if (!this.isAtomic) { + this.isInterrupted = true; + } +}; + +Process.prototype.doIdle = function (secs) { + if (!this.context.startTime) { + this.context.startTime = Date.now(); + } + if ((Date.now() - this.context.startTime) < (secs * 1000)) { + this.pushContext('doInterrupt'); + return; + } + this.popContext(); +}; + +Process.prototype.unflash = function () { + if (this.flashingContext) { + this.flashingContext.expression.unflash(); + this.flashingContext.isFlashing = false; + this.flashingContext = null; + } +}; + +// Process - Block attributes, DEFINE and introspection prims + +Process.prototype.reportBlockAttribute = function (attribute, block) { + // hyper-dyadic + // note: attributes in the left slot + // can only be queried via the dropdown menu and are, therefore, not + // reachable as dyadic inputs + return this.hyper( + (att, obj) => this.reportBasicBlockAttribute(att, obj), + attribute, + block + ); +}; + +Process.prototype.reportBasicBlockAttribute = function (attribute, block) { + var choice = this.inputOption(attribute), + expr, body, slots, def, info, loc, cmt; + this.assertType(block, ['command', 'reporter', 'predicate']); + expr = block.expression; + switch (choice) { + case 'label': + return expr ? expr.abstractBlockSpec() : ''; + case 'comment': + if (block.comment) { + return block.comment; + } + cmt = expr?.comment?.text(); + if (cmt) { + return cmt; + } + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + return def.comment?.text() || expr?.comment?.text() || ''; + } + return ''; + case 'definition': + if (expr.isCustomBlock) { + if (expr.isGlobal) { + body = expr.definition.body || new Context(); + } else { + body = this.blockReceiver().getMethod(expr.semanticSpec).body || + new Context(); + } + } else { + body = new Context(); + } + if (body.expression && body.expression.selector === 'doReport' && + body.expression.inputs()[0] instanceof BlockMorph) { + return body.expression.inputs()[0].reify(body.inputs); + } + return body; + case 'category': + return expr ? + SpriteMorph.prototype.allCategories().indexOf(expr.category) + 1 + : 0; + case 'custom?': + return expr ? !!expr.isCustomBlock : false; + case 'global?': + return (expr && expr.isCustomBlock) ? !!expr.isGlobal : true; + case 'type': + return ['command', 'reporter', 'predicate'].indexOf( + this.reportTypeOf(block) + ) + 1; + case 'scope': + return expr.isCustomBlock ? (expr.isGlobal ? 1 : 2) : 0; + case 'slots': + if (expr.isCustomBlock) { + slots = []; + (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec) + ).declarations.forEach(value => slots.push(value[0])); + return new List(slots).map(spec => this.slotType(spec)); + } + return new List( + expr.inputs().map(each => + each instanceof ReporterBlockMorph ? + each.getSlotSpec() + : (each instanceof MultiArgMorph && + each.slotSpec instanceof Array ? + each.slotSpec + : each.getSpec()) + ) + ).map(spec => this.slotType(spec)); + case 'defaults': + slots = new List(); + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + def.declarations.forEach(value => slots.add(value[1])); + } else { + info = SpriteMorph.prototype.blocks[expr.selector]; + if (!info) {return slots; } + slots = new List(info.defaults); + } + return slots; + case 'menus': + slots = new List(); + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + def.declarations.forEach(value => slots.add( + isString(value[2]) ? + def.decodeChoices(def.parseChoices(value[2])) + : '' + )); + } else { + expr.inputs().forEach(slot => { + if (slot instanceof ReporterBlockMorph) { + slot = SyntaxElementMorph.prototype.labelPart( + slot.getSlotSpec() + ); + } + slots.add(slot instanceof InputSlotMorph ? + (isString(slot.choices) ? slot.choices + : CustomBlockDefinition.prototype.decodeChoices( + slot.choices + )) + : '' + ); + }); + } + return slots; + case 'editables': + slots = new List(); + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + def.declarations.forEach(value => slots.add(!value[3])); + } else { + expr.inputs().forEach(slot => { + if (slot instanceof ReporterBlockMorph) { + slot = SyntaxElementMorph.prototype.labelPart( + slot.getSlotSpec() + ); + } + slots.add(slot instanceof InputSlotMorph ? + !slot.isReadOnly : false + ); + }); + } + return slots; + case 'replaceables': + slots = new List(); + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + def.declarations.forEach(value => slots.add(!value[4])); + } else { + expr.inputs().forEach(slot => { + if (slot instanceof ReporterBlockMorph) { + slot = SyntaxElementMorph.prototype.labelPart( + slot.getSlotSpec() + ); + } + slots.add(!slot.isStatic); + }); + } + return slots; + case 'separators': + slots = new List(); + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + def.declarations.forEach(value => slots.add(value[5])); + } else { + expr.inputs().forEach(slot => { + if (slot instanceof ReporterBlockMorph) { + slot = SyntaxElementMorph.prototype.labelPart( + slot.getSlotSpec() + ); + } + slots.add(slot instanceof MultiArgMorph ? + slot.infix : '' + ); + }); + } + return slots; + case 'translations': + if (expr.isCustomBlock) { + def = (expr.isGlobal ? + expr.definition + : this.blockReceiver().getMethod(expr.semanticSpec)); + loc = new List(); + Object.keys(def.translations).forEach(lang => + loc.add(new List([lang, def.translations[lang]])) + ); + return loc; + } + return ''; + } + return ''; +}; + +Process.prototype.slotType = function (spec) { + // answer a number indicating the shape of a slot represented by its spec. + // Note: you can also use it to translate mnemonics into slot type numbers + if (spec instanceof Array) { + return new List(spec.map(each => this.slotType(each))); + } + + var shift = 0, + key = spec.toLowerCase(), + num; + + if (spec.startsWith('%')) { + key = spec.slice(1).toLowerCase(); + if (key.startsWith('mult')) { + shift = 100; + key = key.slice(5); + } + } else if (spec.endsWith('...')) { + shift = 100; + key = spec.slice(0, -3).toLowerCase(); + } + + num = { + '0': 0, + 's': 0, // spec + // mnemonics: + ' ': 0, + '_': 0, + 'a': 0, + 'any': 0, + + '1': 1, + 'n': 1, // spec + // mnemonics: + '#': 1, + 'num': 1, + 'number': 1, + + '2': 2, + 'b': 2, // spec + // mnemonics: + '?': 2, + 'tf': 2, + 'bool': 2, + 'boolean': 2, + + '3': 3, + 'l': 3, // spec + // mnemonics: + ':': 3, + 'lst': 3, + 'list': 3, + + '4': 4, + 'txt': 4, // spec + 'mlt': 4, // spec + 'code': 4, // spec + // mnemonics: + 'x': 4, + 'text': 4, + 'abc': 4, + + '5': 5, + 'c': 5, // spec + 'cs': 5, // spec + 'loop': 5, // spec + 'ca': 5, // spec + // mnemonics: + 'script': 5, + + '6': 6, + 'cmdring': 6, // spec + // mnemonics: + 'cmd': 6, + 'command': 6, + + '7': 7, + 'repring': 7, // spec + // mnemonics: + 'rep': 7, + 'reporter': 7, + + '8': 8, + 'predring': 8, // spec + // mnemonics: + 'pred': 8, + 'predicate': 8, + + '9': 9, + 'anyue': 9, // spec + // mnemonics: + 'unevaluated': 9, + + '10': 10, + 'boolue': 10, // spec + // mnemonics: none + + '11': 11, + 'obj': 11, // spec + // mnemonics: + 'o': 11, + 'object': 11, + + '12': 12, + 't': 12, // spec + 'upvar': 12, // spec + // mnemonics: + 'v': 12, + 'var': 12 + }[key]; + if (num === undefined) { + return spec; + } + return shift + num; +}; + +Process.prototype.slotSpec = function (num) { + // answer a spec indicating the shape of a slot represented by a number + // or by a textual mnemomic + var prefix = '', + id = this.reportIsA(num, 'text') ? this.slotType(num) : +num, + spec; + + if (id >= 100) { + prefix = '%mult'; + id -= 100; + } + + spec = ['s', 'n', 'b', 'l', 'mlt', 'cs', 'cmdRing', 'repRing', 'predRing', + 'anyUE', 'boolUE', 'obj', 'upvar'][id]; + + if (spec === undefined) { + return null; + } + if (spec === 'upvar' && id > 100) { + return null; + } + return prefix + '%' + spec; +}; + +Process.prototype.doSetBlockAttribute = function (attribute, block, val) { + var choice = this.inputOption(attribute), + rcvr = this.blockReceiver(), + ide = rcvr.parentThatIsA(IDE_Morph), + types = ['command', 'reporter', 'predicate'], + scopes = ['global', 'local'], + idx, oldSpec, expr, def, inData, template, oldType, type, loc; + + this.assertType(block, types); + expr = block.expression; + if (!expr.isCustomBlock) { + throw new Error('expecting a custom block\nbut getting a primitive'); + } + def = expr.isGlobal ? expr.definition : rcvr.getMethod(expr.semanticSpec); + oldSpec = def.blockSpec(); + + function isInUse() { + if (def.isGlobal) { + return ide.sprites.asArray().concat([ide.stage]).some((any, idx) => + any.usesBlockInstance(def, false, idx) + ) || ide.stage.allBlockInstancesInData(def).some(any => + !any.isUnattached() + ); + } + return rcvr.allDependentInvocationsOf(oldSpec).some(any => + !any.isUnattached() + ); + } + + function remove(arr, value) { + var idx = arr.indexOf(value); + if (idx > -1) { + arr.splice(idx, 1); + } + } + + function isMajorTypeChange() { + var rep = ['reporter', 'predicate']; + return (type === 'command' && rep.includes(oldType)) || + (oldType == 'command' && rep.includes(type)); + } + + switch (choice) { + case 'label': + def.setBlockLabel(val); + break; + case 'comment': + def.comment = new CommentMorph(val); + if (def.body) { + def.body.comment = val; + } + break; + case 'definition': + this.assertType(val, types); + def.setBlockDefinition(val); + break; + case 'category': + this.assertType(val, ['number', 'text']); + if (this.reportTypeOf(val) === 'text') { + idx = SpriteMorph.prototype.allCategories().map( + cat => cat.toLowerCase() + ).indexOf(val.toLowerCase()); + val = idx + 1; + } + def.category = SpriteMorph.prototype.allCategories()[+val - 1] || + 'other'; + break; + case 'type': + this.assertType(val, ['number', 'text']); + if (this.reportTypeOf(val) === 'text') { + type = val.toLowerCase(); + } else { + type = types[val - 1] || ''; + } + if (!types.includes(type)) {return;} + + if (rcvr.allBlockInstances(def).every(block => + block.isChangeableTo(type)) + ) { + oldType = def.type; + def.type = type; + } else { + throw new Error('cannot change this\nfor a block that is in use'); + } + if (isMajorTypeChange()) { + // since we've already scanned all contexts we know that those + // that contain block instances only contain single, unattached + // ones. Therefore we can simply replace them with new ones. + if (def.isGlobal) { + ide.stage.allContextsUsing(def).forEach(context => + context.expression = def.blockInstance() + ); + } else { + ide.stage.allContextsInvoking(def.blockSpec(), rcvr).forEach( + context => context.expression = def.blockInstance() + ); + } + } + break; + case 'scope': + if (isInUse()) { + throw new Error('cannot change this\nfor a block that is in use'); + } + this.assertType(val, ['number', 'text']); + if (this.reportTypeOf(val) === 'text') { + type = val.toLowerCase(); + } + if (scopes.includes(type)) { + type = scopes.indexOf(type) + 1; + } else { + type = +val; + } + if (type === 1 && !def.isGlobal) { + // make global + inData = ide.stage.allContextsInvoking(def.blockSpec(), rcvr); + def.isGlobal = true; + remove(rcvr.customBlocks, def); + ide.stage.globalBlocks.push(def); + } else if (type === 2 && def.isGlobal) { + // make local + inData = ide.stage.allContextsUsing(def); + def.isGlobal = false; + remove(ide.stage.globalBlocks, def); + rcvr.customBlocks.push(def); + } else { + return; + } + inData.forEach(context => { + context.expression = def.blockInstance(); + context.changed(); + }); + break; + case 'slots': + this.assertType(val, ['list', 'number', 'text']); + if (!(val instanceof List)) { + val = new List([val]); + } + def.inputNames().forEach((name, idx) => { + var info = def.declarations.get(name), + id = val.at(idx + 1); + if (id !== '') { + info[0] = this.slotSpec(id) || info[0]; + def.declarations.set(name, info); + } + }); + break; + case 'defaults': + this.assertType(val, ['list', 'Boolean', 'number', 'text']); + if (!(val instanceof List)) { + val = new List([val]); + } + def.inputNames().forEach((name, idx) => { + var info = def.declarations.get(name), + options = val.at(idx + 1); + this.assertType(options, ['Boolean', 'number', 'text']); + info[1] = options; + def.declarations.set(name, info); + }); + break; + case 'menus': + this.assertType(val, ['list', 'text', 'number']); + if (!(val instanceof List)) { + val = new List([val.toString()]); + } + def.inputNames().forEach((name, idx) => { + var info = def.declarations.get(name), + options = val.at(idx + 1); + if (options !== '') { + if (!(options instanceof List)) { + options = new List([options]); + } + info[2] = def.encodeChoices(options); + def.declarations.set(name, info); + } + }); + break; + case 'editables': + this.assertType(val, ['list', 'Boolean', 'number']); + if (!(val instanceof List)) { + val = new List([val]); + } + def.inputNames().forEach((name, idx) => { + var info = def.declarations.get(name), + options = val.at(idx + 1); + if ([true, false, 0, 1, '0', '1'].includes(options)) { + options = +options; + info[3] = !options; + def.declarations.set(name, info); + } + }); + break; + case 'replaceables': + this.assertType(val, ['list', 'Boolean', 'number']); + if (!(val instanceof List)) { + val = new List([val]); + } + def.inputNames().forEach((name, idx) => { + var info = def.declarations.get(name), + options = val.at(idx + 1); + if ([true, false, 0, 1, '0', '1'].includes(options)) { + options = +options; + info[4] = !options; + def.declarations.set(name, info); + } + }); + break; + case 'separators': + this.assertType(val, ['list', 'text', 'number']); + if (!(val instanceof List)) { + val = new List([val]); + } + def.inputNames().forEach((name, idx) => { + var info = def.declarations.get(name), + options = val.at(idx + 1); + info[5] = options.toString(); + def.declarations.set(name, info); + }); + break; + case 'translations': + this.assertType(val, 'list'); + loc = {}; + val.map(row => + loc[row.at(1).toString()] = row.at(2).toString() + ); + def.translations = loc; + break; + default: + return; + } + + // make sure the spec is unique + while (rcvr.doubleDefinitionsFor(def).length > 0) { + def.spec += (' (2)'); + } + + // update all block instances: + // refer to "updateDefinition()" of BlockEditorMorph: + template = rcvr.paletteBlockInstance(def); + + if (def.isGlobal) { + rcvr.allBlockInstances(def).reverse().forEach(block => block.refresh()); + ide.stage.allContextsUsing(def).forEach(context => context.changed()); + } else { + rcvr.allDependentInvocationsOf(oldSpec).reverse().forEach( + block => block.refresh(def) + ); + ide.stage.allContextsInvoking(def.blockSpec(), rcvr).forEach(context => + context.changed() + ); + } + if (template) { + template.refreshDefaults(); + } + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + rcvr.recordUserEdit( + 'scripts', + 'custom block', + def.isGlobal ? 'global' : 'local', + 'changed attribute', + def.abstractBlockSpec(), + choice + ); +}; + +Process.prototype.doDefineBlock = function (upvar, label, context) { + var rcvr = this.blockReceiver(), + ide = rcvr.parentThatIsA(IDE_Morph), + vars = this.context.outerContext.variables, + type = this.reportTypeOf(context), + count = 1, + matches, spec, def; + + this.assertType(label, 'text'); + label = label.trim(); + if (label === '') {return ''; } + this.assertType(context, ['command', 'reporter', 'predicate']); + + // replace upvar self references inside the definition body + // with "reportEnvironment" reporters + if (context.expression instanceof BlockMorph) { + this.compileBlockReferences(context, upvar); + } + + // identify global custom block matching the specified label + matches = ide.stage.globalBlocks.filter(def => + def.abstractBlockSpec() === label + ); + if (matches.length > 1) { + throw new Error( + 'several block definitions\nalready match this label' + ); + } else if (matches.length === 1) { + // update the existing global definition with the context body + def = matches[0]; + this.doSetBlockAttribute( + 'definition', + def.blockInstance().reify(), + context + ); + + // create the reference to the new block + vars.addVar(upvar); + vars.setVar(upvar, def.blockInstance().reify()); + return; + } + + // make a new custom block definition + def = new CustomBlockDefinition('BYOB'); // haha! + def.type = type; + def.category = 'other'; + def.isGlobal = true; + def.setBlockDefinition(context); + def.setBlockLabel(label); + ide.stage.globalBlocks.push(def); + + // make sure the spec is unique + spec = def.spec; + while (rcvr.doubleDefinitionsFor(def).length > 0) { + count += 1; + def.spec = spec + ' (' + count + ')'; + } + + // update the IDE + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + rcvr.recordUserEdit( + 'palette', + 'custom block', + def.isGlobal ? 'global' : 'local', + 'new', + def.abstractBlockSpec() + ); + + // create the reference to the new block + vars.addVar(upvar); + vars.setVar(upvar, def.blockInstance().reify()); +}; + +Process.prototype.compileBlockReferences = function (context, varName) { + // private - replace self references inside the definition body + // with "this script" reporters + var report, declare, assign, self; + + function block(selector) { + return SpriteMorph.prototype.blockForSelector(selector); + } + + if (context.expression.allChildren().some(any => + any.selector === 'reportGetVar' && any.parentThatIsA(RingMorph) + )) { + if (context.expression instanceof ReporterBlockMorph) { + // turn into a REPORT script + report = block('doReport'); + report.replaceInput( + report.inputs()[0], + context.expression.fullCopy() + ); + context.expression = report; + } + // add a script var to capture the outer definition + // don't replace any references, because they now should just work + self = block('reportEnvironment'); + self.inputs()[0].setContents(['script']); + declare = block('doDeclareVariables'); + declare.inputs()[0].setContents([varName]); + assign = block('doSetVar'); + assign.inputs()[0].setContents(varName); + assign.replaceInput(assign.inputs()[1], self); + declare.nextBlock(assign); + assign.nextBlock(context.expression.fullCopy()); + context.expression = declare; + return; + } + + if (context.expression instanceof BlockMorph) { + context.expression.forAllChildren(morph => { + var ref; + if (morph.selector === 'reportGetVar' && + (morph.blockSpec === varName)) + { + ref = block('reportEnvironment'); + ref.inputs()[0].setContents(['script']); + if (morph.parent instanceof SyntaxElementMorph) { + morph.parent.replaceInput(morph, ref); + } else { + context.expression = ref; + } + } + }); + } +}; + +Process.prototype.doDeleteBlock = function (context) { + var rcvr = this.blockReceiver(), + ide = rcvr.parentThatIsA(IDE_Morph), + stage = ide.stage, + expr, def, method, idx; + + this.assertType(context, ['command', 'reporter', 'predicate']); + expr = context.expression; + if (!expr.isCustomBlock) { + throw new Error('expecting a custom block\nbut getting a primitive'); + } + def = expr.isGlobal ? expr.definition : rcvr.getMethod(expr.semanticSpec); + rcvr.deleteAllBlockInstances(def); + if (def.isGlobal) { + idx = stage.globalBlocks.indexOf(def); + if (idx !== -1) { + stage.globalBlocks.splice(idx, 1); + } + } else { + // delete local definition + idx = rcvr.customBlocks.indexOf(def); + if (idx !== -1) { + rcvr.customBlocks.splice(idx, 1); + } + // refresh instances of inherited method, if any + method = rcvr.getMethod(def.blockSpec); + if (method) { + rcvr.allDependentInvocationsOf(method.blockSpec).forEach( + block => block.refresh(method) + ); + } + } + + // update the IDE + ide.flushPaletteCache(); + ide.categories.refreshEmpty(); + ide.refreshPalette(); + rcvr.recordUserEdit( + 'palette', + 'custom block', + def.isGlobal ? 'global' : 'local', + 'delete definition', + def.abstractBlockSpec() + ); +}; + +// Process: Compile (as of yet simple) block scripts to JS + +/* + with either only explicit formal parameters or a specified number of + implicit formal parameters mapped to empty input slots + *** highly experimental and heavily under construction *** +*/ + +Process.prototype.reportCompiled = function (context, implicitParamCount) { + // implicitParamCount is optional and indicates the number of + // expected parameters, if any. This is only used to handle + // implicit (empty slot) parameters and can otherwise be + // ignored + return new JSCompiler(this).compileFunction(context, implicitParamCount); +}; + +Process.prototype.capture = function (aContext) { + // private - answer a new process on a full copy of the given context + // while retaining the lexical variable scope + var proc = new Process(this.topBlock, this.receiver); + var clos = new Context( + aContext.parentContext, + aContext.expression, + aContext.outerContext, + aContext.receiver + ); + clos.variables = aContext.variables.fullCopy(); + clos.variables.root().parentFrame = proc.variables; + proc.context = clos; + return proc; +}; + +Process.prototype.getVarNamed = function (name) { + // private - special form for compiled expressions + // DO NOT use except in compiled methods! + // first check script vars, then global ones + var frame = this.homeContext.variables.silentFind(name) || + this.context.variables.silentFind(name), + value; + if (frame) { + value = frame.vars[name].value; + return (value === 0 ? 0 + : value === false ? false + : value === '' ? '' + : value || 0); // don't return null + } + this.variableError(name); +}; + +Process.prototype.setVarNamed = function (name, value) { + // private - special form for compiled expressions + // incomplete, currently only sets named vars + // DO NOT use except in compiled methods! + // first check script vars, then global ones + var frame = this.homeContext.variables.silentFind(name) || + this.context.variables.silentFind(name); + if (isNil(frame)) { + this.variableError(name); + } + frame.vars[name].value = value; +}; + +Process.prototype.incrementVarNamed = function (name, delta) { + // private - special form for compiled expressions + this.setVarNamed(name, this.getVarNamed(name) - (-delta)); +}; + +// Process: Atomic HOFs using experimental JIT-compilation + +Process.prototype.reportAtomicMap = function (reporter, list) { + // if the reporter uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - element + // #2 - optional | index + // #3 - optional | source list + + this.assertType(list, 'list'); + var result = [], + src = list.itemsArray(), + len = src.length, + formalParameterCount = reporter.inputs.length, + parms, + func, + i; + + // try compiling the reporter into generic JavaScript + // fall back to the morphic reporter if unsuccessful + try { + func = this.reportCompiled(reporter, 1); // a single expected input + } catch (err) { + console.log(err.message); + func = reporter; + } + + // iterate over the data in a single frame: + // to do: Insert some kind of user escape mechanism + + for (i = 0; i < len; i += 1) { + parms = [src[i]]; + if (formalParameterCount > 1) { + parms.push(i + 1); + } + if (formalParameterCount > 2) { + parms.push(list); + } + result.push( + invoke( + func, + new List(parms), + null, + null, + null, + null, + this.capture(reporter) // process + ) + ); + } + return new List(result); +}; + +Process.prototype.reportAtomicKeep = function (reporter, list) { + // if the reporter uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - element + // #2 - optional | index + // #3 - optional | source list + + this.assertType(list, 'list'); + var result = [], + src = list.itemsArray(), + len = src.length, + formalParameterCount = reporter.inputs.length, + parms, + func, + i; + + // try compiling the reporter into generic JavaScript + // fall back to the morphic reporter if unsuccessful + try { + func = this.reportCompiled(reporter, 1); // a single expected input + } catch (err) { + console.log(err.message); + func = reporter; + } + + // iterate over the data in a single frame: + // to do: Insert some kind of user escape mechanism + for (i = 0; i < len; i += 1) { + parms = [src[i]]; + if (formalParameterCount > 1) { + parms.push(i + 1); + } + if (formalParameterCount > 2) { + parms.push(list); + } + if ( + invoke( + func, + new List(parms), + null, + null, + null, + null, + this.capture(reporter) // process + ) + ) { + result.push(src[i]); + } + } + return new List(result); +}; + +Process.prototype.reportAtomicFindFirst = function (reporter, list) { + // if the reporter uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - element + // #2 - optional | index + // #3 - optional | source list + + this.assertType(list, 'list'); + var src = list.itemsArray(), + len = src.length, + formalParameterCount = reporter.inputs.length, + parms, + func, + i; + + // try compiling the reporter into generic JavaScript + // fall back to the morphic reporter if unsuccessful + try { + func = this.reportCompiled(reporter, 1); // a single expected input + } catch (err) { + console.log(err.message); + func = reporter; + } + + // iterate over the data in a single frame: + // to do: Insert some kind of user escape mechanism + for (i = 0; i < len; i += 1) { + parms = [src[i]]; + if (formalParameterCount > 1) { + parms.push(i + 1); + } + if (formalParameterCount > 2) { + parms.push(list); + } + if ( + invoke( + func, + new List(parms), + null, + null, + null, + null, + this.capture(reporter) // process + ) + ) { + return src[i]; + } + } + return ''; +}; + +Process.prototype.reportAtomicCombine = function (list, reporter) { + // if the reporter uses formal parameters instead of implicit empty slots + // there are two additional optional parameters: + // #1 - accumulator + // #2 - element + // #3 - optional | index + // #4 - optional | source list + + var result, src, len, formalParameterCount, parms, func, i; + this.assertType(list, 'list'); + + // check for special cases to speed up + if (this.canRunOptimizedForCombine(reporter)) { + return this.reportListAggregation( + list, + reporter.expression.selector + ); + } + + result = ''; + src = list.itemsArray(); + len = src.length; + formalParameterCount = reporter.inputs.length; + + if (len === 0) { + return result; + } + result = src[0]; + + // try compiling the reporter into generic JavaScript + // fall back to the morphic reporter if unsuccessful + try { + func = this.reportCompiled(reporter, 2); // a single expected input + } catch (err) { + console.log(err.message); + func = reporter; + } + + // iterate over the data in a single frame: + // to do: Insert some kind of user escape mechanism + for (i = 1; i < len; i += 1) { + parms = [result, src[i]]; + if (formalParameterCount > 2) { + parms.push(i + 1); + } + if (formalParameterCount > 3) { + parms.push(list); + } + result = invoke( + func, + new List(parms), + null, + null, + null, + null, + this.capture(reporter) // process + ); + } + return result; +}; + +Process.prototype.reportAtomicSort = function (list, reporter) { + this.assertType(list, 'list'); + var func; + + // try compiling the reporter into generic JavaScript + // fall back to the morphic reporter if unsuccessful + try { + func = this.reportCompiled(reporter, 2); // two inputs expected + } catch (err) { + console.log(err.message); + func = reporter; + } + + // iterate over the data in a single frame: + return new List( + list.itemsArray().slice().sort((a, b) => + invoke( + func, + new List([a, b]), + null, + null, + null, + null, + this.capture(reporter) // process + ) ? -1 : 1 + ) + ); +}; + +Process.prototype.reportAtomicGroup = function (list, reporter) { + this.assertType(list, 'list'); + var result = [], + dict = new Map(), + groupKey, + src = list.itemsArray(), + len = src.length, + func, + i; + + // try compiling the reporter into generic JavaScript + // fall back to the morphic reporter if unsuccessful + try { + func = this.reportCompiled(reporter, 1); // a single expected input + } catch (err) { + console.log(err.message); + func = reporter; + } + + // iterate over the data in a single frame: + // to do: Insert some kind of user escape mechanism + + for (i = 0; i < len; i += 1) { + groupKey = invoke( + func, + new List([src[i]]), + null, + null, + null, + null, + this.capture(reporter) // process + ); + if (dict.has(groupKey)) { + dict.get(groupKey).push(src[i]); + } else { + dict.set(groupKey, [src[i]]); + } + } + + dict.forEach((value, key) => + result.push(new List([key, value.length, new List(value)])) + ); + return new List(result); +}; + +// Context ///////////////////////////////////////////////////////////// + +/* + A Context describes the state of a Process. + + Each Process has a pointer to a Context containing its + state. Whenever the Process yields control, its Context + tells it exactly where it left off. + + structure: + + parentContext the Context to return to when this one has + been evaluated. + outerContext the Context holding my lexical scope + expression SyntaxElementMorph, an array of blocks to evaluate, + null or a String denoting a selector, e.g. 'doYield' + origin the object of origin, only used for serialization + receiver the object to which the expression applies, if any + variables the current VariableFrame, if any + inputs an array of input values computed so far + (if expression is a BlockMorph) + pc the index of the next block to evaluate + (if expression is an array) + isContinuation flag for marking a transient continuation context + startTime time when the context was first evaluated + startValue initial value for interpolated operations + activeAudio audio buffer for interpolated operations, don't persist + activeNote audio oscillator for interpolated ops, don't persist + activeSends forked processes waiting to be completed + isCustomBlock marker for return ops + isCustomCommand marker for interpolated blocking reporters (reportURL) + emptySlots caches the number of empty slots for reification + tag string or number to optionally identify the Context, + as a "return" target (for the "stop block" primitive) + isFlashing flag for single-stepping + accumulator slot for collecting data from reentrant visits +*/ + +function Context( + parentContext, + expression, + outerContext, + receiver +) { + this.outerContext = outerContext || null; + this.parentContext = parentContext || null; + this.expression = expression || null; + this.receiver = receiver || null; + this.origin = receiver || null; // only for serialization + this.variables = new VariableFrame(); + if (this.outerContext) { + this.variables.parentFrame = this.outerContext.variables; + this.receiver = this.outerContext.receiver; + } + this.inputs = []; + this.pc = 0; + this.comment = null; + this.isContinuation = false; + this.startTime = null; + this.activeSends = null; + this.activeAudio = null; + this.activeNote = null; + this.isCustomBlock = false; // marks the end of a custom block's stack + this.isCustomCommand = null; // used for ignoring URL reporters' results + this.emptySlots = 0; // used for block reification + this.tag = null; // lexical catch-tag for custom blocks + this.isFlashing = false; // for single-stepping + this.accumulator = null; + this.version = null; // for oberservers, don't serialize +} + +Context.prototype.toString = function () { + var expr = this.expression; + if (expr instanceof Array) { + if (expr.length > 0) { + expr = '[' + expr[0] + ']'; + } + } + return 'Context >> ' + expr + ' ' + this.variables; +}; + +Context.prototype.changed = function () { + // notify observers about a change of my state + this.version = Date.now(); +}; + +Context.prototype.image = function () { + var ring = this.toBlock(); + return ring.doWithAlpha(1, () => ring.fullImage()); +}; + +Context.prototype.toBlock = function () { + var ring = new RingMorph(), + block, + cmt, + cont; + + if (this.comment) { + cmt = new CommentMorph(this.comment); + cmt.block = ring; + ring.comment = cmt; + } + + if (this.expression instanceof Morph) { + block = this.expression.fullCopy(); + + // replace marked call/cc block with empty slot + if (this.isContinuation) { + cont = detect( + block.allInputs(), + inp => inp.bindingID === 1 + ); + if (cont) { + block.revertToDefaultInput(cont, true); + } + } + ring.embed(block, this.inputs); + ring.clearAlpha(); + return ring; + } + if (this.expression instanceof Array) { + block = this.expression[this.pc].fullCopy(); + if (block instanceof RingMorph && !block.contents()) { // empty ring + return block; + } + ring.embed(block, this.isContinuation ? [] : this.inputs); + return ring; + } + + // otherwise show an empty ring + ring.color = SpriteMorph.prototype.blockColor.other; + ring.setSpec('%rr %ringparms'); + + // also show my inputs, unless I'm a continuation + if (!this.isContinuation) { + this.inputs.forEach(inp => + ring.parts()[1].addInput(inp) + ); + } + return ring; +}; + +Context.prototype.toUserBlock = function () { + var ring = this.toBlock(), + block = ring.contents(); + if (!block || ring.inputNames().length) { + return ring; + } + return block; +}; + +// Context continuations: + +Context.prototype.rawContinuation = function (isReporter) { + var cont; + if (this.expression instanceof Array) { + return this; + } + if (this.parentContext) { + return this.parentContext; + } + cont = new Context( + null, + isReporter ? 'expectReport' : 'popContext' + ); + cont.isContinuation = true; + return cont; +}; + +Context.prototype.continuation = function (isReporter) { + // retained for legacy compatibility for deprecated run/cc and call/cc + var cont; + if (this.expression instanceof Array) { + cont = this; + } else if (this.parentContext) { + cont = this.parentContext; + } else { + cont = new Context( + null, + isReporter ? 'expectReport' : 'popContext' + ); + cont.isContinuation = true; + return cont; + } + cont = cont.copyForContinuation(); + cont.tag = null; + cont.isContinuation = true; + return cont; +}; + +Context.prototype.copyForContinuation = function () { + var cpy = copy(this), + cur = cpy, + isReporter = !(this.expression instanceof Array || + isString(this.expression)); + if (isReporter) { + cur.prepareContinuationForBinding(); + while (cur.parentContext) { + cur.parentContext = copy(cur.parentContext); + cur = cur.parentContext; + cur.inputs = []; + } + } + return cpy; +}; + +Context.prototype.copyForContinuationCall = function () { + var cpy = copy(this), + cur = cpy, + isReporter = !(this.expression instanceof Array || + isString(this.expression)); + if (isReporter) { + this.expression = this.expression.fullCopy(); + this.inputs = []; + while (cur.parentContext) { + cur.parentContext = copy(cur.parentContext); + cur = cur.parentContext; + cur.inputs = []; + } + } + return cpy; +}; + +Context.prototype.prepareContinuationForBinding = function () { + var pos = this.inputs.length, + slot; + this.expression = this.expression.fullCopy(); + slot = this.expression.inputs()[pos]; + if (slot) { + this.inputs = []; + // mark slot containing the call/cc reporter with an identifier + slot.bindingID = 1; + // and remember the number of detected empty slots + this.emptySlots = 1; + } +}; + +// Context accessing: + +Context.prototype.addInput = function (input) { + this.inputs.push(input); +}; + +// Context music + +Context.prototype.stopMusic = function () { + if (this.activeNote) { + this.activeNote.stop(); + this.activeNote = null; + } +}; + +// Context single-stepping: + +Context.prototype.lastFlashable = function () { + // for single-stepping when pausing + if (this.expression instanceof SyntaxElementMorph && + !(this.expression instanceof CommandSlotMorph)) { + return this; + } else if (this.parentContext) { + return this.parentContext.lastFlashable(); + } + return null; +}; + +// Context debugging + +Context.prototype.stackSize = function () { + if (!this.parentContext) { + return 1; + } + return 1 + this.parentContext.stackSize(); +}; + +Context.prototype.isInCustomBlock = function () { + if (this.isCustomBlock) { + return true; + } + if (this.parentContext) { + return this.parentContext.isInCustomBlock(); + } + return false; +}; + +// Context syntax analysis + +Context.prototype.components = function () { + var expr = this.expression; + if (expr && expr.components) { + expr = expr.components(this.inputs.slice()); + } else { + expr = new Context(); + expr.inputs = this.inputs.slice(); + } + return expr instanceof Context ? new List([expr]) : expr; +}; + +Context.prototype.equalTo = function (other) { + var c1 = this.components(), + c2 = other.components(); + if (this.emptyOrEqual(c1.cdr(), c2.cdr())) { + if (this.expression && this.expression.length === 1 && + other.expression && other.expression.length === 1) { + return snapEquals(this.expression[0], other.expression[0]); + } + return snapEquals(this.expression, other.expression); + } + return false; +}; + +Context.prototype.emptyOrEqual = function (list1, list2) { + // private - return TRUE if both lists are either equal + // or only contain empty items + return list1.equalTo(list2) || ( + list1.itemsArray().every(item => !item) && + list2.itemsArray().every(item => !item) + ); +}; + +Context.prototype.copyWithInputs = function (inputs) { + return this.expression ? + this.expression.copyWithInputs(inputs) + : this; +}; + +Context.prototype.copyWithNext = function (next) { + return this.expression.copyWithNext(next.expression, this.inputs.slice()); +}; + +Context.prototype.updateEmptySlots = function () { + this.emptySlots = this.expression.markEmptySlots(); +}; + +// Variable ///////////////////////////////////////////////////////////////// + +function Variable(value, isTransient, isHidden) { + this.value = value; + this.isTransient = isTransient || false; // prevent value serialization + this.isHidden = isHidden || false; // not shown in the blocks palette +} + +Variable.prototype.toString = function () { + return 'a ' + (this.isTransient ? 'transient ' : '') + + (this.isHidden ? 'hidden ' : '') + + 'Variable [' + this.value + ']'; +}; + +Variable.prototype.copy = function () { + return new Variable(this.value, this.isTransient, this.isHidden); +}; + +// VariableFrame /////////////////////////////////////////////////////// + +function VariableFrame(parentFrame, owner) { + this.vars = {}; + this.parentFrame = parentFrame || null; + this.owner = owner || null; +} + +VariableFrame.prototype.toString = function () { + return 'a VariableFrame {' + this.names() + '}'; +}; + +VariableFrame.prototype.copy = function () { + var frame = new VariableFrame(this.parentFrame); + this.names().forEach(vName => + frame.addVar(vName, this.getVar(vName)) + ); + return frame; +}; + +VariableFrame.prototype.fullCopy = function () { + var frame; + if (this.parentFrame) { + frame = new VariableFrame(this.parentFrame.fullCopy()); + } else { + frame = new VariableFrame(); + } + frame.vars = copy(this.vars); + return frame; +}; + +// Variable Frame forking and merging for libraries + +VariableFrame.prototype.fork = function (names = []) { + // answer a copy that only has entries for the given array of variable names + // and only has values for primitive data. + // used for including data dependencies in libraries. + var frame = new VariableFrame(); + this.names(true).forEach(vName => { + var v, val, typ; + if (names.includes(vName)) { + v = this.vars[vName]; + if (v.isTransient) { + val = ''; + } else { + typ = Process.prototype.reportTypeOf(v.value); + if (['text', 'number', 'Boolean'].includes(typ) || + (v.value instanceof List && + (v.value.canBeCSV() || v.value.canBeJSON())) + ) { + val = v.value; + } else { + val = ''; + } + } + frame.vars[vName] = new Variable(val, v.isTransient, v.isHidden); + } + }); + return frame; +}; + +VariableFrame.prototype.merge = function (otherFrame) { + // add another frame's variables overwriting existing values and + // settings (transient, hidden) if any. Merge only replaces and + // adds to the frame, does not delete any entries. + // used for handling data dependencies in libraries. + otherFrame.names(true).forEach(vName => + this.vars[vName] = otherFrame.vars[vName] + ); +}; + +// Variable Frame ops + +VariableFrame.prototype.root = function () { + if (this.parentFrame) { + return this.parentFrame.root(); + } + return this; +}; + +VariableFrame.prototype.find = function (name) { + // answer the closest variable frame containing + // the specified variable. otherwise throw an exception. + var frame = this.silentFind(name); + if (frame) {return frame; } + this.variableError(name); +}; + +VariableFrame.prototype.silentFind = function (name) { + // answer the closest variable frame containing + // the specified variable. Otherwise return null. + if (this.vars[name] instanceof Variable) { + return this; + } + if (this.parentFrame) { + return this.parentFrame.silentFind(name); + } + return null; +}; + +VariableFrame.prototype.setVar = function (name, value, sender) { + // change the specified variable if it exists + // else throw an error, because variables need to be + // declared explicitly (e.g. through a "script variables" block), + // before they can be accessed. + // if the found frame is inherited by the sender sprite + // shadow it (create an explicit one for the sender) + // before setting the value ("create-on-write") + + var frame = this.find(name); + if (frame) { + if (sender instanceof SpriteMorph && + (frame.owner instanceof SpriteMorph) && + (sender !== frame.owner)) { + sender.shadowVar(name, value); + } else { + frame.vars[name].value = value; + } + } +}; + +VariableFrame.prototype.changeVar = function (name, delta, sender) { + // change the specified variable if it exists + // else throw an error, because variables need to be + // declared explicitly (e.g. through a "script variables" block, + // before they can be accessed. + // if the found frame is inherited by the sender sprite + // shadow it (create an explicit one for the sender) + // before changing the value ("create-on-write") + + var frame = this.find(name), + value, + newValue; + if (frame) { + value = parseFloat(frame.vars[name].value); + newValue = isNaN(value) ? +delta : value + (+delta); + if (sender instanceof SpriteMorph && + (frame.owner instanceof SpriteMorph) && + (sender !== frame.owner)) { + sender.shadowVar(name, newValue); + } else { + frame.vars[name].value = newValue; + } + + } +}; + +VariableFrame.prototype.getVar = function (name) { + var frame = this.silentFind(name), + value; + if (frame) { + value = frame.vars[name].value; + return (value === 0 ? 0 + : value === false ? false + : value === '' ? '' + : value || 0); // don't return null + } + if (typeof name === 'number') { + // empty input with a Binding-ID called without an argument + return ''; + } + this.variableError(name); +}; + +VariableFrame.prototype.addVar = function (name, value) { + this.vars[name] = new Variable(value === 0 ? 0 + : value === false ? false + : value === '' ? '' : value || 0); +}; + +VariableFrame.prototype.deleteVar = function (name) { + var frame = this.find(name); + if (frame) { + delete frame.vars[name]; + } +}; + +VariableFrame.prototype.variableError = Process.prototype.variableError; + +// VariableFrame tools + +VariableFrame.prototype.names = function (includeHidden) { + var each, names = []; + for (each in this.vars) { + if (Object.prototype.hasOwnProperty.call(this.vars, each)) { + if (!this.vars[each].isHidden || includeHidden) { + names.push(each); + } + } + } + return names; +}; + +VariableFrame.prototype.allNamesDict = function (upTo, includeHidden) { + // "upTo" is an optional parent frame at which to stop, e.g. globals + var dict = {}, current = this; + + function addKeysToDict(srcDict, trgtDict) { + var eachKey; + for (eachKey in srcDict) { + if (Object.prototype.hasOwnProperty.call(srcDict, eachKey)) { + if (!srcDict[eachKey].isHidden || includeHidden) { + trgtDict[eachKey] = eachKey; + } + } + } + } + + while (current && (current !== upTo)) { + addKeysToDict(current.vars, dict); + current = current.parentFrame; + } + return dict; +}; + +VariableFrame.prototype.allNames = function (upTo, includeHidden) { +/* + only show the names of the lexical scope, hybrid scoping is + reserved to the daring ;-) + "upTo" is an optional parent frame at which to stop, e.g. globals +*/ + var answer = [], each, dict = this.allNamesDict(upTo, includeHidden); + + for (each in dict) { + if (Object.prototype.hasOwnProperty.call(dict, each)) { + answer.push(each); + } + } + return answer; +}; + +// JSCompiler //////////////////////////////////////////////////////////////// + +/* + *** don't use same JSCompiler object multiple times *** + Compile simple reporters + with either only explicit formal parameters or a specified number of + implicit formal parameters mapped to empty input slots + *** highly experimental and heavily under construction *** +*/ + +function JSCompiler(aProcess, outerScope) { + this.process = aProcess; + this.source = null; // a context + this.paramCount = 0; + this.params = 0; + this.gensymArgIndexes = new Map(); + this.scope = new Map(); + if (outerScope == null) { + this.scope.depth = 0; + this.scope.outerScope = null; + return; + } + this.scope.depth = 1 + outerScope.depth; + this.scope.outerScope = outerScope; +} + +JSCompiler.prototype.toString = () => 'a JSCompiler'; + +JSCompiler.prototype.gensymForVar = function (varName, argIndex) { + // argIndex -1 for script variables + var gensym = this.getGensym(varName), oldArgIndex; + if (gensym == null) { + gensym = '_' + this.scope.depth + '_' + this.scope.size; + this.scope.set(varName, gensym); + this.gensymArgIndexes.set(gensym, argIndex); + return gensym; + } + oldArgIndex = this.gensymArgIndexes.get(gensym); + if (oldArgIndex == null || oldArgIndex < argIndex) { + this.gensymArgIndexes.set(gensym, argIndex); + } + return gensym; +}; + +JSCompiler.prototype.getGensym = function (varName) { + var scope = this.scope, gensym; + while (null == (gensym = scope.get(varName)) && + null != (scope = scope.outerScope)); + return gensym; +}; + +JSCompiler.prototype.functionHead = function () { + var str1 = 'var ', str2 = ''; + this.gensymArgIndexes.forEach((argIndex, gensym) => { + if (argIndex === -1) { + str1 += gensym + '=0,'; + return; + } + str2 += ',' + argIndex + ':' + gensym; + }); + str1 += 'proc=params.pop();\n'; + if (this.params) { + str1 += 'while(' + this.params + '>params.length)params.push(0);\n'; + } + if (str2) { + str1 += 'var{' + str2.substring(1) + '}=params;\n'; + } + return str1; +}; + +JSCompiler.prototype.compileFunction = function () { + return window.eval(this.compileFunctionBody.apply(this, arguments)); +}; + +JSCompiler.prototype.findEmptySlot = function findEmptySlot(m) { + if (m.isEmptySlot != null && m.isEmptySlot()) { + return true; + } + if (m instanceof RingMorph) { + // don't look in rings (they are not current scope) + return false; + } + m = m.children; + var i = m.length; + while (i) { + if (findEmptySlot(m[--i])) { + return true; + } + } + return false; +}; + +JSCompiler.prototype.compileFunctionBody = function ( + aContext, + implicitParamCount +) { + var block = aContext.expression, + parameters = aContext.inputs, + hasEmptySlots, + code; + + if (block instanceof Array) { + throw new Error('can\'t compile empty ring'); + } + + this.source = aContext; + if (implicitParamCount === '' || isNil(implicitParamCount)) { + this.implicitParams = 1; + } else { + this.implicitParams = Math.floor(implicitParamCount); + if (!(this.implicitParams > 0 && this.implicitParams < 128)) { + // use 1 if implicitParamCount doesn't make sense + this.implicitParams = 1; + } + } + + // scan for empty input slots + hasEmptySlots = this.findEmptySlot(block); + + // translate formal parameters into gensyms + if (parameters.length) { + // test for conflicts + if (hasEmptySlots) { + throw new Error( + 'compiling does not yet support\n' + + 'mixing explicit formal parameters\n' + + 'with empty input slots' + ); + } + // map explicit formal parameters + this.params = parameters.length; + parameters.forEach(this.gensymForVar, this); + } else if (hasEmptySlots) { + this.params = this.implicitParams; + } + + // compile using gensyms + if (block instanceof CommandBlockMorph) { + code = this.compileSequence(block) + 'return "";\n'; + } else { + code = 'return ' + this.compileExpression(block) + ';\n'; + } + return '(function func(...params){\n' + this.functionHead() + code + '})'; +}; + +JSCompiler.prototype.compileExpression = function (block) { + var selector = block.selector, + inputs = block.inputs(), + target, + args; + + // first check for special forms and infix operators + switch (selector) { + case 'reportVariadicOr': + return this.compileInfix('||', inputs[0].inputs()); + case 'reportVariadicAnd': + return this.compileInfix('&&', inputs[0].inputs()); + case 'reportIfElse': + return '(' + + this.compileInput(inputs[0]) + + ' ? ' + + this.compileInput(inputs[1]) + + ' : ' + + this.compileInput(inputs[2]) + + ')'; + case 'evaluateCustomBlock': + throw new Error( + 'compiling does not yet support\n' + + 'custom blocks' + ); + // special evaluation primitives + case 'doRun': + case 'evaluate': + return 'invoke(' + this.compileInput(inputs[0]) + ',' + + this.compileInput(inputs[1]) + + ',proc.blockReceiver(),null,null,null,proc,null)'; + // special command forms + case 'doDeclareVariables': + block = ''; + inputs[0].inputs().forEach(x => { + block += this.gensymForVar(x.children[0].blockSpec, -1) + '='; + }); + return block + '0'; + case 'reportGetVar': + target = this.getGensym(block = block.blockSpec); + if (target == null) { + // redirect var to process + return 'proc.getVarNamed("' + this.escape(block) + '")'; + } + return target; + case 'doSetVar': + if (inputs[0] instanceof ArgMorph) { + target = this.getGensym(inputs[0].evaluate()); + if (target != null) { + return target + ' = ' + this.compileInput(inputs[1]); + } + } + // redirect var to process + return 'proc.setVarNamed(' + + this.compileInput(inputs[0]) + + ', ' + + this.compileInput(inputs[1]) + + ')'; + case 'doChangeVar': + if (inputs[0] instanceof ArgMorph) { + target = this.getGensym(inputs[0].evaluate()); + if (target != null) { + return target + ' -=- ' + this.compileInput(inputs[1]); + } + } + // redirect var to process + return 'proc.incrementVarNamed(' + + this.compileInput(inputs[0]) + + ', ' + + this.compileInput(inputs[1]) + + ')'; + case 'doReport': + return 'return ' + this.compileInput(inputs[0]); + case 'doIf': + return 'if (' + + this.compileInput(inputs[0]) + + ') {\n' + + this.compileSequence(inputs[1].evaluate()) + + '}' + + this.compileElseIf(inputs[2]); + case 'doIfElse': + return 'if (' + + this.compileInput(inputs[0]) + + ') {\n' + + this.compileSequence(inputs[1].evaluate()) + + '} else {\n' + + this.compileSequence(inputs[2].evaluate()) + + '}'; + case 'doWarp': + // synchronous javascript is already like warp + return this.compileSequence(inputs[0].evaluate()); + case 'reportBoolean': + case 'reportNewList': + return this.compileInput(inputs[0]); + case 'reportEnvironment': + return 'func'; + default: + target = this.process[selector] ? this.process + : (this.source.receiver || this.process.receiver); + args = this.compileInputs(inputs); + if (isSnapObject(target)) { + return 'proc.blockReceiver().' + selector + '(' + args + ')'; + } else { + return 'proc.' + selector + '(' + args + ')'; + } + } +}; + +JSCompiler.prototype.compileElseIf = function (multiArg) { + return (multiArg.inputs().map((slot, i) => i % 2 === 0 ? + ' else if (' + this.compileInput(slot) + ') ' + : '{\n' + this.compileSequence(slot.evaluate()) + '}' + ).join('')); +}; + +JSCompiler.prototype.compileSequence = function (commandBlock) { + if (commandBlock == null) return ''; + commandBlock = commandBlock.blockSequence(); + var l = commandBlock.length, i = 0, body = ''; + while (l > i) { + body += this.compileExpression(commandBlock[i++]) + ';\n'; + } + return body; +}; + +JSCompiler.prototype.compileInfix = function (operator, inputs) { + return inputs.map(each => + this.compileInput(each)).join(' ' + operator + ' '); +}; + +JSCompiler.prototype.compileInputs = function (array) { + var args = ''; + array.forEach(inp => { + if (args) { + args += ', '; + } + args += this.compileInput(inp); + }); + return args; +}; + +JSCompiler.prototype.compileInput = function (inp) { + var value, type; + + if (inp.isEmptySlot && inp.isEmptySlot()) { + // implicit formal parameter + if (this.implicitParams > 1) { + if (this.paramCount < this.implicitParams) { + return 'params[' + this.paramCount++ + ']'; + } + throw new Error( + localize('expecting') + ' ' + this.implicitParams + ' ' + + localize('input(s), but getting') + ' ' + + this.paramCount + ); + } + return 'params[0]'; + } + if (inp instanceof RingMorph) { + inp = inp.children; + return new JSCompiler(this.process,this.scope).compileFunctionBody({ + 'expression': inp[0].children[0], + 'inputs': inp[1].inputs().map(x => x.children[0].blockSpec), + 'receiver': this.source.receiver + }, ''); + } + if (inp instanceof MultiArgMorph) { + return 'new List([' + this.compileInputs(inp.inputs()) + '])'; + } + if (inp instanceof ArgLabelMorph) { + return this.compileInput(inp.argMorph()); + } + if (inp instanceof ArgMorph) { + // literal - evaluate inline + value = inp.evaluate(); + type = this.process.reportTypeOf(value); + switch (type) { + case 'number': + case 'Boolean': + return '' + value; + case 'text': + // escape and enclose in double quotes + return '"' + this.escape(value) + '"'; + case 'list': + return 'new List([' + this.compileInputs(value) + '])'; + default: + if (value instanceof Array) { + return '["' + this.escape(value[0]) + '"]'; + } + throw new Error( + 'compiling does not yet support\n' + + 'inputs of type\n' + + type + ); + } + } + if (inp instanceof BlockMorph) { + return this.compileExpression(inp); + } + throw new Error( + 'compiling does not yet support\n' + + 'input slots of type\n' + + inp.constructor.name + ); +}; + +JSCompiler.prototype.escape = string => { + // make sure string is a string + string += ''; + var len = string.length, i = 0, char, escaped = '', safe_chars = + ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$' + + "%&'()*+,-./:;<=>?@[]^_`{|}~"; + while (len > i) { + char = string.charAt(i++); + if (safe_chars.indexOf(char) === -1) { + escaped += '\\u' + (char.charCodeAt(0) | 0x10000) + .toString(16).substring(1); + } else { + escaped += char; + } + } + return escaped; +}; diff --git a/elements/pl-snap/Snap/src/video.js b/elements/pl-snap/Snap/src/video.js new file mode 100644 index 00000000..e4307df4 --- /dev/null +++ b/elements/pl-snap/Snap/src/video.js @@ -0,0 +1,390 @@ +/* + + video.js + + video motion detection for morphic.js and Snap! + + written by Josep Ferràndiz i Farré + https://github.com/jferran6 + + Copyright (C) 2019 by Josep Ferràndiz i Farré + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js + + + edit history: + -------------- + 2019-05-07 - optimized imageData caching (jens) + +*/ + +/*global modules, StageMorph*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.video = '2019-May-22'; + +var VideoMotion; + +// VideoMotion ///////////////////////////////////////////////////////////////// + +function VideoMotion(width, height) { +/* + * Calculate, based on two consecutive video frames, the amount of movement and + * direction of this movement both on the stage and on the sprite. + * It's based on Scratch 3 (optical flow algorithm). + */ + this.width = width; + this.height = height; + this.frameNumber = 0; + this.winSize = 8; + this.lastAnalyzedFrame = 0; + this.motionAmount = 0; + this.motionDirection = 0; + this.imageBuffer = new ArrayBuffer(this.width * this.height * 2); + this.curr = new Uint8ClampedArray( + this.imageBuffer, + 0, + this.width * this.height + ); + this.prev = new Uint8ClampedArray( + this.imageBuffer, + this.width * this.height, + this.width * this.height + ); + this.threshold = 30; + this.amountScale = 100; + this.toDegree = 180 / Math.PI; +} + +VideoMotion.prototype.reset = function(width, height){ +/* + * Reset videoElement and videoMotion dimensions. + * This function is called when stage dimensions change. + */ + this.width = width; + this.height = height; + this.frameNumber = 0; + this.lastAnalyzedFrame = 0; + this.imageBuffer = new ArrayBuffer(this.width * this.height * 2); + this.curr = new Uint8ClampedArray( + this.imageBuffer, + 0, + this.width * this.height + ); + this.prev = new Uint8ClampedArray( + this.imageBuffer, + this.width * this.height, + this.width * this.height + ); +}; + +VideoMotion.prototype.addFrame = function(imageData) { + var i, + temp = this.prev, + frame = new Uint32Array(imageData.buffer.slice(0)); //ABGR + this.frameNumber++; + this.prev = this.curr; + this.curr = temp; + for (i = 0; i < frame.length; i++) { + this.curr[i] = frame[i] & 0xff; + } +}; + +VideoMotion.prototype.getStageMotion = function() { + var uu = 0, // Accumulate 2d motion vectors from groups + vv = 0, // of pixels and average it later. + n = 0, + vector = { + u: 0, + v: 0 + }, + i, j, address, nextAddress, maxAddress, + winStep = this.winSize * 2 + 1, + wmax = this.width - this.winSize - 1, + hmax = this.height - this.winSize - 1, + // Optical Flow vars + A2, A1B2, B1, C1, C2, + gradX, gradY, gradT; + + if (!this.curr || !this.prev) { + this.motionAmount = this.motionDirection = -1; + // Don't have two frames to analyze yet + return; + } + // Return early if new data has not been received. + if (this.lastAnalyzedFrame === this.frameNumber) { + return; + } + this.lastAnalyzedFrame = this.frameNumber; + // Iterate over groups of cells building up the components to determine + // a motion vector for each cell instead of the whole frame to avoid + // integer overflows. + for (i = this.winSize + 1; i < hmax; i += winStep) { + for (j = this.winSize + 1; j < wmax; j += winStep) { + A2 = 0; + A1B2 = 0; + B1 = 0; + C1 = 0; + C2 = 0; + // This is a performance critical math region. + address = ((i - this.winSize) * this.width) + j - this.winSize; + nextAddress = address + winStep; + maxAddress = ((i + this.winSize) * this.width) + j + this.winSize; + for (; address <= maxAddress; address += this.width - winStep, + nextAddress += this.width) { + for (; address <= nextAddress; address += 1) { + // The difference in color between the last frame and + // the current frame. + gradT = ((this.prev[address]) - (this.curr[address])); + // The difference between the pixel to the left and the + // pixel to the right. + gradX = ((this.curr[address - 1]) - (this.curr[address + 1])); + // The difference between the pixel above and the pixel + // below. + gradY = (( + this.curr[address - this.width]) + - (this.curr[address + this.width])); + // Add the combined values of this pixel to previously + // considered pixels. + A2 += gradX * gradX; + A1B2 += gradX * gradY; + B1 += gradY * gradY; + C2 += gradX * gradT; + C1 += gradY * gradT; + } + } + // Use the accumalated values from the for loop to determine a + // motion direction. + vector = this.getMotionVector(A2, A1B2, B1, C2, C1); + // If u and v are within negative winStep to positive winStep, + // add them to a sum that will later be averaged. + if (-winStep < vector.u + && vector.u < winStep + && -winStep < vector.v + && vector.v < winStep) { + uu += vector.u; + vv += vector.v; + n++; + } + } + } + // Average the summed vector values of all of the motion groups. + uu /= n; + vv /= n; + // Scale the magnitude of the averaged UV vector. + this.motionAmount = Math.round(this.amountScale * Math.hypot(uu, vv)); + if (this.motionAmount > this.threshold) { + this.motionDirection = (((Math.atan2(vv, uu) * this.toDegree + 270) % 360) - 180) + .toFixed(2); // Snap direction + } +}; + +VideoMotion.prototype.getMotionVector = function(A2, A1B2, B1, C2, C1) { +/** + * Determine a motion vector combinations of the color component difference + * on the x axis, y axis, and temporal axis. + * A2 - a sum of x axis squared + * A1B2 - a sum of x axis times y axis + * B1 - a sum of y axis squared + * C2 - a sum of x axis times temporal axis + * C1 - a sum of y axis times temporal axis + * Returns a uv vector representing the motion for the given input + */ + // Compare sums of X * Y and sums of X squared and Y squared. + var norm, + IGradNorm, + delta = ((A1B2 * A1B2) - (A2 * B1)), + deltaX, deltaY, Idelta, + motionVector = { + u: 0, + v: 0 + }; + + if (delta) { + // System is not singular - solving by Kramer method. + deltaX = -((C1 * A1B2) - (C2 * B1)); + deltaY = -((A1B2 * C2) - (A2 * C1)); + Idelta = 8 / delta; + motionVector.u = deltaX * Idelta; + motionVector.v = deltaY * Idelta; + } else { + // Singular system - find optical flow in gradient direction. + norm = ((A1B2 + A2) * (A1B2 + A2)) + ((B1 + A1B2) * (B1 + A1B2)); + if (norm) { + IGradNorm = 8 / norm; + motionVector.u = (A1B2 + A2) * (-(C1 + C2) * IGradNorm); + motionVector.v = (B1 + A1B2) * (-(C1 + C2) * IGradNorm); + } else { + motionVector.u = 0; + motionVector.v = 0; + } + } + return motionVector; +}; + +VideoMotion.prototype.getLocalMotion = function(aSprite) { +/** + * Calculate motion amount and direction values based on stored frames + * (current and previous) that overlaps a given sprite. + */ + var stage = aSprite.parentThatIsA(StageMorph), + activePixelNum = 0, + i, j, xmin, xmax, ymin, ymax, gradT, gradX, gradY, + spriteWidth = Math.floor(aSprite.width() / stage.scale), + winSize = this.winSize, + vector = { + u: 0, + v: 0 + }, + A2 = 0, + A1B2 = 0, + B1 = 0, + C1 = 0, + C2 = 0, + localThreshold = this.threshold / 3, + localMaxAmount = 100, + localAmountScale = this.amountScale * 2e-4, + scaleFactor = 0, + address = 0, + spriteImage, + cb, + pixel; + + if (!this.curr || !this.prev) { + aSprite.motionAmount = aSprite.motionDirection = -1; + // Don't have two frames to analyze yet + return; + } + // Skip if the current frame has already been considered + // for this state. + if (aSprite.frameNumber !== this.frameNumber) { + spriteImage = aSprite.getImageData(); + // Consider only the area of the current frame overlapped + // with the given sprite. + cb = getClippedBounds(aSprite); + xmin = Math.max( + Math.floor((aSprite.left() - stage.left()) / stage.scale), + 0); + ymin = Math.max( + Math.floor((aSprite.top() - stage.top()) / stage.scale), + 0); + xmax = Math.min(cb.sw + xmin, stage.dimensions.x); + ymax = Math.min(cb.sh + ymin, stage.dimensions.y - 1); + // This is a performance critical math region. + pixel = cb.sy * spriteWidth + cb.sx; + for (i = ymin; i < ymax; i++, pixel += spriteWidth - cb.sw) { //rows + for (j = xmin; j < xmax; j++, ++pixel) { //cols + if (j > 0 && j < this.width && i > 0 && i < this.height + && (spriteImage[pixel] >> 24 & 0xff) == 0xff) { + address = (i * this.width) + j; + // The difference in color between the last frame and + // the current frame. + gradT = ((this.prev[address]) - (this.curr[address])); + // The difference between the pixel to the left and the + // pixel to the right. + gradX = ((this.curr[address - 1]) - (this.curr[address + 1])); + // The difference between the pixel above and the pixel + // below. + gradY = ( + (this.curr[address - this.width]) + - (this.curr[address + this.width])); + // Add the combined values of this pixel to previously + // considered pixels. + A2 += gradX * gradX; + A1B2 += gradX * gradY; + B1 += gradY * gradY; + C2 += gradX * gradT; + C1 += gradY * gradT; + scaleFactor++; + } + } + } + // Use the accumalated values from the for loop to determine a + // motion direction. + vector = this.getMotionVector(A2, A1B2, B1, C2, C1); + if (scaleFactor) { + // Store the area of the sprite in pixels + activePixelNum = scaleFactor; + scaleFactor /= (2 * winSize * 2 * winSize); + vector.u = vector.u / scaleFactor; + vector.v = vector.v / scaleFactor; + } + // Scale the magnitude of the averaged UV vector and the number of + // overlapping solid pixels. + aSprite.motionAmount = Math.round( + localAmountScale * activePixelNum + * Math.hypot(vector.u, vector.v) + ); + if (aSprite.motionAmount > localMaxAmount) { + // Clip all magnitudes greater than 100. + aSprite.motionAmount = Math.min(localMaxAmount, 100); + } + if (aSprite.motionAmount > localThreshold) { + // Snap direction. + aSprite.motionDirection = ((( + Math.atan2(vector.v, vector.u) + * this.toDegree + 270) % 360) - 180) + .toFixed(2); + } + // Skip future calls on this state until a new frame is added. + aSprite.frameNumber = this.frameNumber; + } + + /* + * Return sprite's visible part bounds + */ + function getClippedBounds(sprite) { + var stage = sprite.parentThatIsA(StageMorph), + scale = stage.scale, + bounds = { + sx: 0, + sy: 0, + sw: Math.floor(sprite.extent().x / scale), + sh: Math.floor(sprite.extent().y / scale) + }; + // Clipping X + if (sprite.left() < stage.left()) { // sprite outer left stage + bounds.sw = Math.max( + Math.floor((sprite.right() - stage.left()) / scale), + 0); + bounds.sx = Math.floor(sprite.width() / scale - bounds.sw); + } + if (sprite.right() > stage.right()) { // sprite outer right stage + bounds.sw = Math.max( + Math.floor((stage.right() - sprite.left()) / scale), + 0); + } + //Clipping Y + if (sprite.top() < stage.top()) { // sprite upper top + bounds.sh = Math.max( + Math.floor((sprite.bottom() - stage.top()) / scale), + 0); + bounds.sy = Math.floor(sprite.height() / scale - bounds.sh); + } + if (sprite.bottom() > stage.bottom()) { // sprite lower bottom + bounds.sh = Math.max( + Math.floor((stage.bottom() - sprite.top()) / scale), + 0); + } + return bounds; + } +}; diff --git a/elements/pl-snap/Snap/src/widgets.js b/elements/pl-snap/Snap/src/widgets.js new file mode 100644 index 00000000..fe4cafc0 --- /dev/null +++ b/elements/pl-snap/Snap/src/widgets.js @@ -0,0 +1,3848 @@ +/* + + widgets.js + + additional GUI elements for morphic.js + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2023 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs blocks.js and objects.js + + + credits + ------- + Lucas Karahadian contributed a first prototype of the piano keyboard + + + I. hierarchy + ------------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + Morph* + AlignmentMorph + DialogBoxMorph + InputFieldMorph + TriggerMorph* + MenuItemMorph* + PianoKeyMorph + PushButtonMorph + ToggleButtonMorph + TabMorph + ToggleMorph + ToggleElementMorph + MenuMorph* + PianoMenuMorph + + * from Morphic.js + + + II. toc + ------- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + PushButtonMorph + ToggleButtonMorph + TabMorph + ToggleMorph + ToggleElementMorph + DialogBoxMorph + AlignmentMorph + InputFieldMorph + PianoMenuMorph + PianoKeyMorph + +*/ + +// Global settings ///////////////////////////////////////////////////// + +/*global TriggerMorph, modules, Color, Point, BoxMorph, radians, ZERO, Note, +StringMorph, Morph, TextMorph, nop, detect, StringFieldMorph, ColorPaletteMorph, +HTMLCanvasElement, fontHeight, SymbolMorph, localize, SpeechBubbleMorph, isNil, +ArrowMorph, MenuMorph, isString, SliderMorph, MorphicPreferences, BLACK, WHITE, +ScrollFrameMorph, MenuItemMorph, useBlurredShadows, getDocumentPositionOf*/ + +/*jshint esversion: 6*/ + +modules.widgets = '2023-May-24'; + +var PushButtonMorph; +var ToggleButtonMorph; +var TabMorph; +var ToggleMorph; +var ToggleElementMorph; +var DialogBoxMorph; +var AlignmentMorph; +var InputFieldMorph; +var PianoMenuMorph; +var PianoKeyMorph; + +// PushButtonMorph ///////////////////////////////////////////////////// + +// I am a Button with rounded corners and 3D-ish graphical effects + +// PushButtonMorph inherits from TriggerMorph: + +PushButtonMorph.prototype = new TriggerMorph(); +PushButtonMorph.prototype.constructor = PushButtonMorph; +PushButtonMorph.uber = TriggerMorph.prototype; + +// PushButtonMorph preferences settings: + +PushButtonMorph.prototype.fontSize = 10; +PushButtonMorph.prototype.fontStyle = 'sans-serif'; +PushButtonMorph.prototype.labelColor = BLACK; +PushButtonMorph.prototype.labelShadowColor = WHITE; +PushButtonMorph.prototype.labelShadowOffset = new Point(1, 1); + +PushButtonMorph.prototype.color = new Color(220, 220, 220); +PushButtonMorph.prototype.pressColor = new Color(115, 180, 240); +PushButtonMorph.prototype.highlightColor + = PushButtonMorph.prototype.pressColor.lighter(50); +PushButtonMorph.prototype.outlineColor = new Color(30, 30, 30); +PushButtonMorph.prototype.outlineGradient = false; +PushButtonMorph.prototype.contrast = 60; + +PushButtonMorph.prototype.edge = 2; +PushButtonMorph.prototype.corner = 5; +PushButtonMorph.prototype.outline = 1; +PushButtonMorph.prototype.padding = 3; + +// PushButtonMorph instance creation: + +function PushButtonMorph( + target, + action, + labelString, + environment, + hint +) { + this.init( + target, + action, + labelString, + environment, + hint + ); +} + +PushButtonMorph.prototype.init = function ( + target, + action, + labelString, + environment, + hint +) { + // additional properties: + this.is3D = false; // for "flat" design exceptions + this.target = target || null; + this.action = action || null; + this.environment = environment || null; + this.labelString = labelString || null; + this.label = null; + this.labelMinExtent = ZERO; + this.hint = hint || null; + this.isDisabled = false; + this.hideable = true; // used for custom extensions + + // initialize inherited properties: + TriggerMorph.uber.init.call(this); + + // override inherited properites: + this.color = PushButtonMorph.prototype.color; + this.createLabel(); + this.fixLayout(); + this.rerender(); +}; + +// PushButtonMorph layout: + +PushButtonMorph.prototype.fixLayout = function () { + // make sure I at least encompass my label + if (this.label !== null) { + this.updateLabelColors(); + var padding = this.padding * 2 + this.outline * 2 + this.edge * 2; + this.bounds.setWidth( + Math.max(this.label.width(), this.labelMinExtent.x) + padding + ); + this.bounds.setHeight( + Math.max( + this.label instanceof StringMorph ? + this.label.rawHeight() : this.label.height(), + this.labelMinExtent.y + ) + padding + ); + this.label.setCenter(this.center()); + } +}; + +// PushButtonMorph events + +PushButtonMorph.prototype.mouseDownLeft = function () { + PushButtonMorph.uber.mouseDownLeft.call(this); + if (this.label) { + this.label.setCenter(this.center().add(1)); + } +}; + +PushButtonMorph.prototype.mouseClickLeft = function () { + if (this.isDisabled) {return; } + PushButtonMorph.uber.mouseClickLeft.call(this); + if (this.label) { + this.label.setCenter(this.center()); + } +}; + +PushButtonMorph.prototype.mouseLeave = function () { + PushButtonMorph.uber.mouseLeave.call(this); + if (this.label) { + this.label.setCenter(this.center()); + } +}; + +// PushButtonMorph drawing: + +PushButtonMorph.prototype.render = function (ctx) { + if (this.userState === 'highlight') { + this.drawOutline(ctx); + this.drawBackground(ctx, this.highlightColor); + this.drawEdges( + ctx, + this.highlightColor, + this.highlightColor.lighter(this.contrast), + this.highlightColor.darker(this.contrast) + ); + } else if (this.userState === 'pressed') { + this.drawOutline(ctx); + this.drawBackground(ctx, this.pressColor); + this.drawEdges( + ctx, + this.pressColor, + this.pressColor.darker(this.contrast), + this.pressColor.lighter(this.contrast) + ); + } else { + this.drawOutline(ctx); + this.drawBackground(ctx, this.color); + this.drawEdges( + ctx, + this.color, + this.color.lighter(this.contrast), + this.color.darker(this.contrast) + ); + } +}; + +PushButtonMorph.prototype.drawOutline = function (ctx) { + var outlineStyle, + isFlat = MorphicPreferences.isFlat && !this.is3D; + + if (!this.outline || isFlat) {return null; } + if (this.outlineGradient) { + outlineStyle = ctx.createLinearGradient( + 0, + 0, + 0, + this.height() + ); + outlineStyle.addColorStop(0, this.outlineColor.darker().toString()); + outlineStyle.addColorStop(1, 'white'); + } else { + outlineStyle = this.outlineColor.toString(); + } + ctx.fillStyle = outlineStyle; + ctx.beginPath(); + this.outlinePath( + ctx, + isFlat ? 0 : this.corner, + 0 + ); + ctx.closePath(); + ctx.fill(); +}; + +PushButtonMorph.prototype.drawBackground = function (ctx, color) { + var isFlat = MorphicPreferences.isFlat && !this.is3D; + + ctx.fillStyle = color.toString(); + ctx.beginPath(); + this.outlinePath( + ctx, + isFlat ? 0 : Math.max(this.corner - this.outline, 0), + this.outline + ); + ctx.closePath(); + ctx.fill(); + ctx.lineWidth = this.outline; +}; + +PushButtonMorph.prototype.drawEdges = function ( + ctx, + color, + topColor, + bottomColor +) { + if (MorphicPreferences.isFlat && !this.is3D) {return; } + var minInset = Math.max(this.corner, this.outline + this.edge), + w = this.width(), + h = this.height(), + gradient; + + // top: + gradient = ctx.createLinearGradient( + 0, + this.outline, + 0, + this.outline + this.edge + ); + gradient.addColorStop(0, topColor.toString()); + gradient.addColorStop(1, color.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.moveTo(minInset, this.outline + this.edge / 2); + ctx.lineTo(w - minInset, this.outline + this.edge / 2); + ctx.stroke(); + + // top-left corner: + gradient = ctx.createRadialGradient( + this.corner, + this.corner, + Math.max(this.corner - this.outline - this.edge, 0), + this.corner, + this.corner, + Math.max(this.corner - this.outline, 0) + ); + gradient.addColorStop(0, color.toString()); + gradient.addColorStop(1, topColor.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.arc( + this.corner, + this.corner, + Math.max(this.corner - this.outline - this.edge / 2, 0), + radians(180), + radians(270), + false + ); + ctx.stroke(); + + // left: + gradient = ctx.createLinearGradient( + this.outline, + 0, + this.outline + this.edge, + 0 + ); + gradient.addColorStop(0, topColor.toString()); + gradient.addColorStop(1, color.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.moveTo(this.outline + this.edge / 2, minInset); + ctx.lineTo(this.outline + this.edge / 2, h - minInset); + ctx.stroke(); + + // bottom: + gradient = ctx.createLinearGradient( + 0, + h - this.outline, + 0, + h - this.outline - this.edge + ); + gradient.addColorStop(0, bottomColor.toString()); + gradient.addColorStop(1, color.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.moveTo(minInset, h - this.outline - this.edge / 2); + ctx.lineTo(w - minInset, h - this.outline - this.edge / 2); + ctx.stroke(); + + // bottom-right corner: + gradient = ctx.createRadialGradient( + w - this.corner, + h - this.corner, + Math.max(this.corner - this.outline - this.edge, 0), + w - this.corner, + h - this.corner, + Math.max(this.corner - this.outline, 0) + ); + gradient.addColorStop(0, color.toString()); + gradient.addColorStop(1, bottomColor.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.arc( + w - this.corner, + h - this.corner, + Math.max(this.corner - this.outline - this.edge / 2, 0), + radians(0), + radians(90), + false + ); + ctx.stroke(); + + // right: + gradient = ctx.createLinearGradient( + w - this.outline, + 0, + w - this.outline - this.edge, + 0 + ); + gradient.addColorStop(0, bottomColor.toString()); + gradient.addColorStop(1, color.toString()); + + ctx.strokeStyle = gradient; + ctx.lineCap = 'round'; + ctx.lineWidth = this.edge; + ctx.beginPath(); + ctx.moveTo(w - this.outline - this.edge / 2, minInset); + ctx.lineTo(w - this.outline - this.edge / 2, h - minInset); + ctx.stroke(); +}; + +PushButtonMorph.prototype.outlinePath = BoxMorph.prototype.outlinePath; + +PushButtonMorph.prototype.createLabel = function () { + var shading = !MorphicPreferences.isFlat || this.is3D; + + if (this.label !== null) { + this.label.destroy(); + } + if (this.labelString instanceof SymbolMorph) { + this.label = this.labelString.fullCopy(); + if (shading) { + this.label.shadowOffset = this.labelShadowOffset; + this.label.shadowColor = this.labelShadowColor; + } + this.label.color = this.labelColor; + } else { + this.label = new StringMorph( + localize(this.labelString), + this.fontSize, + this.fontStyle, + true, + false, + false, + shading ? this.labelShadowOffset : null, + this.labelShadowColor, + this.labelColor + ); + } + this.add(this.label); +}; + +PushButtonMorph.prototype.updateLabelColors = function () { + var shading = !MorphicPreferences.isFlat || this.is3D; + if (this.label) { + this.label.color = this.labelColor; + this.label.fontSize = this.fontSize; + if (shading) { + this.label.shadowOffset = this.labelShadowOffset; + this.label.shadowColor = this.labelShadowColor; + } + this.label.fixLayout(true); // just me + } +}; + +// PushButtonMorph states + +PushButtonMorph.prototype.disable = function () { + this.isDisabled = true; + this.forAllChildren(child => + child.alpha = 0.3 + ); + this.rerender(); +}; + +PushButtonMorph.prototype.enable = function () { + this.isDisabled = false; + this.forAllChildren(child => + child.alpha = 1 + ); + this.rerender(); +}; + +// ToggleButtonMorph /////////////////////////////////////////////////////// + +/* + I am a two-state PushButton. When my state is "true" I keep my "pressed" + background color. I can also be set to not auto-layout my bounds, in + which case my label will left-align. +*/ + +// ToggleButtonMorph inherits from PushButtonMorph: + +ToggleButtonMorph.prototype = new PushButtonMorph(); +ToggleButtonMorph.prototype.constructor = ToggleButtonMorph; +ToggleButtonMorph.uber = PushButtonMorph.prototype; + +// ToggleButton settings + +ToggleButtonMorph.prototype.contrast = 30; +ToggleButtonMorph.prototype.labelPressColor = null; + +// ToggleButtonMorph instance creation: + +function ToggleButtonMorph( + colors, // color overrides, : [normal, highlight, pressed] + target, + action, // a toggle function + labelString, + query, // predicate/selector + environment, + hint, + minWidth, // optional, if specified label will left-align + hasPreview, // show press color on left edge (e.g. category) + isPicture // treat label as picture, i.e. don't apply typography +) { + this.init( + colors, + target, + action, + labelString, + query, + environment, + hint, + minWidth, + hasPreview, + isPicture + ); +} + +ToggleButtonMorph.prototype.init = function ( + colors, + target, + action, + labelString, + query, + environment, + hint, + minWidth, + hasPreview, + isPicture +) { + // additional properties: + this.state = false; + this.query = query || (() => true); + this.minWidth = minWidth || null; + this.hasPreview = hasPreview || false; + this.isPicture = isPicture || false; + this.hasNeutralBackground = false; + this.trueStateLabel = null; + + // initialize inherited properties: + ToggleButtonMorph.uber.init.call( + this, + target, + action, + labelString, + environment, + hint + ); + + // override default colors if others are specified + if (colors) { + this.color = colors[0]; + this.highlightColor = colors[1]; + this.pressColor = colors[2]; + } + + this.refresh(); + this.rerender(); +}; + +// ToggleButtonMorph events + +ToggleButtonMorph.prototype.mouseEnter = function () { + var contents = this.hint instanceof Function ? this.hint() : this.hint; + if (!this.state || this.hasNeutralBackground) { + this.userState = 'highlight'; + this.rerender(); + } + if (contents) { + this.bubbleHelp(contents); + } +}; + +ToggleButtonMorph.prototype.mouseLeave = function () { + if (!this.state || this.hasNeutralBackground) { + this.userState = 'normal'; + this.rerender(); + } + if (this.schedule) { + this.schedule.isActive = false; + } + if (this.hint) { + this.world().hand.destroyTemporaries(); + } +}; + +ToggleButtonMorph.prototype.mouseDownLeft = function () { + if (!this.state) { + this.userState = 'pressed'; + this.rerender(); + } +}; + +ToggleButtonMorph.prototype.mouseClickLeft = function () { + if (!this.state) { + this.userState = 'highlight'; + this.rerender(); + } + this.trigger(); // allow me to be triggered again to force-update others +}; + +// ToggleButtonMorph action + +ToggleButtonMorph.prototype.trigger = function () { + ToggleButtonMorph.uber.trigger.call(this); + this.refresh(); +}; + +ToggleButtonMorph.prototype.refresh = function () { +/* + if query is a function: + execute the query with target as environment (can be null) + for lambdafied (inline) actions + + else if query is a String: + treat it as function property of target and execute it + for selector-like queries +*/ + if (typeof this.query === 'function') { + this.state = this.query.call(this.target); + } else { // assume it's a String + this.state = this.target[this.query](); + } + if (this.state) { + this.userState = 'pressed'; + if (this.labelPressColor) { + this.label.setColor(this.labelPressColor); + } + if (this.trueStateLabel) { + this.label.hide(); + this.trueStateLabel.show(); + } + } else { + this.userState = 'normal'; + if (this.labelPressColor) { + this.label.setColor(this.labelColor); + } + if (this.trueStateLabel) { + this.label.show(); + this.trueStateLabel.hide(); + } + } + this.rerender(); +}; + +// ToggleButtonMorph layout: + +ToggleButtonMorph.prototype.fixLayout = function () { + if (this.label !== null) { + var padding = this.padding * 2 + this.outline * 2 + this.edge * 2, + lw; + + this.updateLabelColors(); + lw = Math.max(this.label.width(), this.labelMinExtent.x); + this.bounds.setWidth(this.minWidth ? + Math.max(this.minWidth, lw) + padding + : lw + padding + ); + this.bounds.setHeight( + Math.max(this.label instanceof StringMorph ? + this.label.rawHeight() : + this.label.height(), this.labelMinExtent.y) + padding + ); + this.label.setCenter(this.center()); + if (this.trueStateLabel) { + this.trueStateLabel.setCenter(this.center()); + } + if (this.minWidth) { // left-align along my corner + this.label.setLeft( + this.left() + + this.outline + + this.edge + + this.corner + + this.padding + ); + } + } +}; + +// ToggleButtonMorph drawing + +ToggleButtonMorph.prototype.render = function (ctx) { +/* + basically the same as inherited from PushButtonMorph, except for + not inverting the pressed 3D-ish border (because it stays that way), + and optionally coloring the left edge in the press-color, previewing + the selection color (e.g. in the case of Snap palette-category + selector. the latter is done in the drawEdges() method. +*/ + switch (this.userState) { + case 'highlight': + this.drawOutline(ctx); + this.drawBackground(ctx, this.highlightColor); + this.drawEdges( + ctx, + this.highlightColor, + this.highlightColor.lighter(this.contrast), + this.highlightColor.darker(this.contrast) + ); + break; + case 'pressed': + // note: don't invert the 3D-ish edges for 'pressed' state, because + // it will stay that way, and should not look inverted (or should it?) + this.drawOutline(ctx); + this.drawBackground(ctx, this.getPressRenderColor()); + this.drawEdges( + ctx, + this.pressColor, + this.pressColor.lighter(40), + this.pressColor.darker(40) + ); + break; + default: + this.drawOutline(ctx); + this.drawBackground(ctx, this.color); + this.drawEdges( + ctx, + this.color, + this.color.lighter(this.contrast), + this.color.darker(this.contrast) + ); + } +}; + +ToggleButtonMorph.prototype.getPressRenderColor = function () { + // can be overridden by my children + return this.pressColor; +}; + +ToggleButtonMorph.prototype.drawEdges = function ( + ctx, + color, + topColor, + bottomColor +) { + var gradient; + + ToggleButtonMorph.uber.drawEdges.call( + this, + ctx, + color, + topColor, + bottomColor + ); + + if (this.hasPreview) { // indicate the possible selection color + if (MorphicPreferences.isFlat && !this.is3D) { + ctx.fillStyle = this.pressColor.toString(); + ctx.fillRect( + this.outline, + this.outline, + this.corner, + this.height() - this.outline * 2 + ); + return; + } + gradient = ctx.createLinearGradient( + 0, + 0, + this.corner, + 0 + ); + gradient.addColorStop(0, this.pressColor.lighter(40).toString()); + gradient.addColorStop(1, this.pressColor.darker(40).toString()); + ctx.fillStyle = gradient; // this.pressColor.toString(); + ctx.beginPath(); + this.previewPath( + ctx, + Math.max(this.corner - this.outline, 0), + this.outline + ); + ctx.closePath(); + ctx.fill(); + } +}; + +ToggleButtonMorph.prototype.previewPath = function (ctx, radius, inset) { + var offset = radius + inset, + h = this.height(); + + // top left: + ctx.arc( + offset, + offset, + radius, + radians(-180), + radians(-90), + false + ); + // bottom left: + ctx.arc( + offset, + h - offset, + radius, + radians(90), + radians(180), + false + ); +}; + +ToggleButtonMorph.prototype.createLabel = function () { + var shading = !MorphicPreferences.isFlat || this.is3D; + + if (this.label !== null) { + this.label.destroy(); + } + if (this.trueStateLabel !== null) { + this.trueStateLabel.destroy(); + } + if (this.labelString instanceof Array && this.labelString.length === 2) { + if (this.labelString[0] instanceof SymbolMorph) { + this.label = this.labelString[0].fullCopy(); + this.trueStateLabel = this.labelString[1].fullCopy(); + if (!this.isPicture) { + this.label.shadowOffset = shading ? + this.labelShadowOffset : ZERO; + this.label.shadowColor = this.labelShadowColor; + this.label.color = this.labelColor; + this.label.fixLayout(); + this.label.rerender(); + + this.trueStateLabel.shadowOffset = shading ? + this.labelShadowOffset : ZERO; + this.trueStateLabel.shadowColor = this.labelShadowColor; + this.trueStateLabel.color = this.labelColor; + this.trueStateLabel.fixLayout(); + this.trueStateLabel.rerender(); + } + } else if (this.labelString[0] instanceof Morph) { + this.label = this.labelString[0].fullCopy(); + this.trueStateLabel = this.labelString[1].fullCopy(); + } else { + this.label = new StringMorph( + localize(this.labelString[0]), + this.fontSize, + this.fontStyle, + true, + false, + false, + shading ? this.labelShadowOffset : null, + this.labelShadowColor, + this.labelColor + ); + this.trueStateLabel = new StringMorph( + localize(this.labelString[1]), + this.fontSize, + this.fontStyle, + true, + false, + false, + shading ? this.labelShadowOffset : null, + this.labelShadowColor, + this.labelColor + ); + } + } else { + if (this.labelString instanceof SymbolMorph) { + this.label = this.labelString.fullCopy(); + if (!this.isPicture) { + this.label.shadowOffset = shading ? + this.labelShadowOffset : ZERO; + this.label.shadowColor = this.labelShadowColor; + this.label.color = this.labelColor; + this.label.fixLayout(); + this.label.rerender(); + } + } else if (this.labelString instanceof Morph) { + this.label = this.labelString.fullCopy(); + } else { + this.label = new StringMorph( + localize(this.labelString), + this.fontSize, + this.fontStyle, + true, + false, + false, + shading ? this.labelShadowOffset : ZERO, + this.labelShadowColor, + this.labelColor + ); + } + } + this.add(this.label); + if (this.trueStateLabel) { + this.add(this.trueStateLabel); + } +}; + +ToggleButtonMorph.prototype.updateLabelColors = function () { + var shading = !MorphicPreferences.isFlat || this.is3D; + ToggleButtonMorph.uber.updateLabelColors.call(this); + if (this.trueStateLabel) { + this.trueStateLabel.color = this.labelColor; + if (shading) { + this.trueStateLabel.shadowOffset = this.labelShadowOffset; + this.trueStateLabel.shadowColor = this.labelShadowColor; + } + this.trueStateLabel.fixLayout(true); // just me + } +}; + +// TabMorph /////////////////////////////////////////////////////// + +// TabMorph inherits from ToggleButtonMorph: + +TabMorph.prototype = new ToggleButtonMorph(); +TabMorph.prototype.constructor = TabMorph; +TabMorph.uber = ToggleButtonMorph.prototype; + +// TabMorph instance creation: + +function TabMorph( + colors, // color overrides, : [normal, highlight, pressed] + target, + action, // a toggle function + labelString, + query, // predicate/selector + environment, + hint +) { + this.init( + colors, + target, + action, + labelString, + query, + environment, + hint + ); +} + +// TabMorph layout: + +TabMorph.prototype.fixLayout = function () { + if (this.label !== null) { + this.updateLabelColors(); + this.setExtent(new Point( + this.label.width() + + this.padding * 2 + + this.corner * 3 + + this.edge * 2, + (this.label instanceof StringMorph ? + this.label.rawHeight() : this.label.height()) + + this.padding * 2 + + this.edge + )); + this.label.setCenter(this.center()); + } +}; + +// TabMorph action: + +TabMorph.prototype.refresh = function () { + if (this.state) { // bring to front + if (this.parent) { + this.parent.add(this); + } + } + TabMorph.uber.refresh.call(this); +}; + +// TabMorph drawing: + +TabMorph.prototype.drawBackground = function (context, color) { + var w = this.width(), + h = this.height(), + c = this.corner; + + context.fillStyle = color.toString(); + context.beginPath(); + context.moveTo(0, h); + context.bezierCurveTo(c, h, c, 0, c * 2, 0); + context.lineTo(w - c * 2, 0); + context.bezierCurveTo(w - c, 0, w - c, h, w, h); + context.closePath(); + context.fill(); +}; + +TabMorph.prototype.drawOutline = function () { + nop(); +}; + +TabMorph.prototype.drawEdges = function ( + context, + color, + topColor, + bottomColor +) { + if (MorphicPreferences.isFlat && !this.is3D) {return; } + + var w = this.width(), + h = this.height(), + c = this.corner, + e = this.edge, + eh = e / 2, + gradient; + + nop(color); // argument not needed here + + gradient = context.createLinearGradient(0, 0, w, 0); + gradient.addColorStop(0, topColor.toString()); + gradient.addColorStop(1, bottomColor.toString()); + + context.strokeStyle = gradient; + context.lineCap = 'round'; + context.lineWidth = e; + + context.beginPath(); + context.moveTo(0, h + eh); + context.bezierCurveTo(c, h, c, 0, c * 2, eh); + context.lineTo(w - c * 2, eh); + context.bezierCurveTo(w - c, 0, w - c, h, w, h + eh); + context.stroke(); +}; + +// ToggleMorph /////////////////////////////////////////////////////// + +/* + I am a PushButton which toggles a check mark (becoming check box) + or a bullet (becoming a radio button). I can have both or either an + additional label and an additional pictogram, whereas the pictogram + can be either an instance of (any) Morph, in which case the pictogram + will be an interactive toggle itself or a Canvas, in which case it + is just going to be a picture. +*/ + +// ToggleMorph inherits from PushButtonMorph: + +ToggleMorph.prototype = new PushButtonMorph(); +ToggleMorph.prototype.constructor = ToggleMorph; +ToggleMorph.uber = PushButtonMorph.prototype; + +// ToggleMorph instance creation: + +function ToggleMorph( + style, // 'checkbox' or 'radiobutton' + target, + action, // a toggle function + labelString, + query, // predicate/selector + environment, + hint, + element, // optional Morph or Canvas to display + builder // method which constructs the element (only for Morphs) +) { + this.init( + style, + target, + action, + labelString, + query, + environment, + hint, + element, + builder + ); +} + +ToggleMorph.prototype.init = function ( + style, + target, + action, + labelString, + query, + environment, + hint, + element, + builder +) { + // additional properties: + this.padding = 1; + style = style || 'checkbox'; + this.corner = (style === 'checkbox' ? + 0 : fontHeight(this.fontSize) / 2 + this.outline + this.padding); + this.state = false; + this.query = query || (() => true); + this.tick = null; + this.captionString = labelString || null; + this.labelAlignment = 'right'; + this.element = element || null; + this.builder = builder || null; + this.toggleElement = null; + + // initialize inherited properties: + ToggleMorph.uber.init.call( + this, + target, + action, + (style === 'checkbox' ? '\u2713' : '\u25CF'), + environment, + hint + ); + this.fixLayout(); + this.refresh(); +}; + +// ToggleMorph layout: + +ToggleMorph.prototype.fixLayout = function () { + var padding = this.padding * 2 + this.outline * 2, + y; + if (this.tick !== null) { + this.bounds.setHeight(this.tick.rawHeight() + padding); + this.bounds.setWidth(this.tick.width() + padding); + this.bounds.setWidth(Math.max(this.width(), this.height())); + this.bounds.setHeight(Math.max(this.width(), this.height())); + this.tick.setCenter(this.center()); + } + if (this.state) { + this.tick.show(); + } else { + this.tick.hide(); + } + if (this.toggleElement && (this.labelAlignment === 'right')) { + y = this.top() + (this.height() - this.toggleElement.height()) / 2; + this.toggleElement.setPosition(new Point( + this.right() + padding, + y + )); + } + if (this.label !== null) { + y = this.top() + (this.height() - this.label.height()) / 2; + if (this.labelAlignment === 'right') { + this.label.setPosition(new Point( + this.toggleElement ? + this.toggleElement instanceof ToggleElementMorph ? + this.toggleElement.right() + : this.toggleElement.right() + padding + : this.right() + padding, + y + )); + } else { + this.label.setPosition(new Point( + this.left() - this.label.width() - padding, + y + )); + } + } +}; + +ToggleMorph.prototype.createLabel = function () { + var shading = !MorphicPreferences.isFlat || this.is3D; + + if (this.label === null) { + if (this.captionString) { + this.label = new TextMorph( + localize(this.captionString), + this.fontSize, + this.fontStyle, + true + ); + this.add(this.label); + } + } + if (this.tick === null) { + this.tick = new StringMorph( + localize(this.labelString), + this.fontSize, + this.fontStyle, + true, + false, + false, + shading ? new Point(1, 1) : null, + new Color(240, 240, 240) + ); + this.add(this.tick); + } + if (this.toggleElement === null) { + if (this.element) { + if (this.element instanceof Morph) { + if (this.element.isTemplate) { + this.toggleElement = this.element; + if (!this.element.mouseDownLeft) { + this.element.mouseDownLeft = nop; + } + } else { + this.toggleElement = new ToggleElementMorph( + this.target, + this.action, + this.element, + this.query, + this.environment, + this.hint, + this.builder + ); + } + } else if (this.element instanceof HTMLCanvasElement) { + this.toggleElement = new Morph(); + this.toggleElement.isCachingImage = true; + this.toggleElement.bounds.setExtent(new Point( + this.element.width, + this.element.height + )); + this.toggleElement.cachedImage = this.element; + } + this.add(this.toggleElement); + } + } +}; + +// ToggleMorph action: + +ToggleMorph.prototype.trigger = function () { + ToggleMorph.uber.trigger.call(this); + this.refresh(); +}; + +ToggleMorph.prototype.refresh = function () { + /* + if query is a function: + execute the query with target as environment (can be null) + for lambdafied (inline) actions + + else if query is a String: + treat it as function property of target and execute it + for selector-like queries + */ + if (typeof this.query === 'function') { + this.state = this.query.call(this.target); + } else { // assume it's a String + this.state = this.target[this.query](); + } + if (this.state) { + this.tick.show(); + } else { + this.tick.hide(); + } + if (this.toggleElement && this.toggleElement.refresh && + !this.toggleElement.isToggleLabel) { + this.toggleElement.refresh(); + } +}; + +// ToggleMorph events + +ToggleMorph.prototype.mouseDownLeft = function () { + PushButtonMorph.uber.mouseDownLeft.call(this); + if (this.tick) { + this.tick.setCenter(this.center().add(1)); + } +}; + +ToggleMorph.prototype.mouseClickLeft = function () { + PushButtonMorph.uber.mouseClickLeft.call(this); + if (this.tick) { + this.tick.setCenter(this.center()); + } +}; + +ToggleMorph.prototype.mouseLeave = function () { + PushButtonMorph.uber.mouseLeave.call(this); + if (this.tick) { + this.tick.setCenter(this.center()); + } +}; + +// ToggleElementMorph ///////////////////////////////////////////////////// +/* + I am a picture of a Morph ("element") which acts as a toggle button. + I am different from ToggleButton in that I neither create a label nor + draw button outlines. Instead I display my element morph in specified + contrasts of a given color, symbolizing whether it is selected or not +*/ + +// ToggleElementMorph inherits from TriggerMorph: + +ToggleElementMorph.prototype = new TriggerMorph(); +ToggleElementMorph.prototype.constructor = ToggleElementMorph; +ToggleElementMorph.uber = TriggerMorph.prototype; + +// ToggleElementMorph preferences settings + +ToggleElementMorph.prototype.contrast = 50; +ToggleElementMorph.prototype.shadowOffset = new Point(2, 2); +ToggleElementMorph.prototype.shadowAlpha = 0.6; +ToggleElementMorph.prototype.fontSize = 10; // only for (optional) labels +ToggleElementMorph.prototype.inactiveColor = new Color(180, 180, 180); + +// ToggleElementMorph instance creation: + +function ToggleElementMorph( + target, + action, + element, + query, + environment, + hint, + builder, + labelString +) { + this.init( + target, + action, + element, + query, + environment, + hint, + builder, + labelString + ); +} + +ToggleElementMorph.prototype.init = function ( + target, + action, + element, // mandatory + query, + environment, + hint, + builder, // optional function name that rebuilds the element + labelString +) { + // additional properties: + this.target = target || null; + this.action = action || null; + this.element = element; + this.query = query || (() => true); + this.environment = environment || null; + this.hint = hint || null; + this.builder = builder || 'nop'; + this.captionString = labelString || null; + this.labelAlignment = 'right'; + this.state = false; + + // initialize inherited properties: + TriggerMorph.uber.init.call(this); + + // override inherited properties: + this.color = element.color; + this.createLabel(); +}; + +// ToggleElementMorph drawing: + +ToggleElementMorph.prototype.render = function (ctx) { + var shading = !MorphicPreferences.isFlat || this.is3D, + shadow = () => { + if (shading) { + this.element.addShadow( + this.shadowOffset, + this.userState === 'normal' ? 0 : this.shadowAlpha + ); + } + }; + + this.color = this.element.color; + this.element.removeShadow(); + this.element[this.builder](); + if (this.userState !== 'pressed') { + this.element.removeShadow(); + this.element.setColor(this.inactiveColor); + this.element[this.builder](this.contrast); + if (this.userState === 'highlight') { + this.element.removeShadow(); + this.element.setColor(this.color.lighter(this.contrast)); + this.element[this.builder](this.contrast); + } + } + if (this.element.doWithAlpha) { + ctx.drawImage( + this.element.doWithAlpha( + 1, + () => { + shadow(); + return this.element.fullImage(); + } + ), + 0, + 0 + ); + } else { + shadow(); + ctx.drawImage(this.element.fullImage(), 0, 0); + } + + // reset element + this.element.removeShadow(); + this.element.setColor(this.color); + this.element[this.builder](); +}; + +ToggleElementMorph.prototype.setColor = function (aColor) { + this.element.setColor(aColor); + this.fixLayout(); + this.refresh(); +}; + +// ToggleElementMorph layout: + +ToggleElementMorph.prototype.fixLayout = function () { + this.element.fixLayout(); + this.bounds.setExtent( + this.element.fullBounds().extent().add( + this.shadowBlur * 2 + ) + ); +}; + +ToggleElementMorph.prototype.createLabel = function () { + var y; + if (this.captionString) { + this.label = new StringMorph( + this.captionString, + this.fontSize, + this.fontStyle, + true + ); + this.add(this.label); + y = this.top() + (this.height() - this.label.height()) / 2; + if (this.labelAlignment === 'right') { + this.label.setPosition(new Point( + this.right(), + y + )); + } else { + this.label.setPosition(new Point( + this.left() - this.label.width(), + y + )); + } + } +}; + +// ToggleElementMorph action + +ToggleElementMorph.prototype.trigger + = ToggleButtonMorph.prototype.trigger; + +ToggleElementMorph.prototype.refresh + = ToggleButtonMorph.prototype.refresh; + +// ToggleElementMorph events + +ToggleElementMorph.prototype.mouseEnter + = ToggleButtonMorph.prototype.mouseEnter; + +ToggleElementMorph.prototype.mouseLeave + = ToggleButtonMorph.prototype.mouseLeave; + +ToggleElementMorph.prototype.mouseDownLeft + = ToggleButtonMorph.prototype.mouseDownLeft; + +ToggleElementMorph.prototype.mouseClickLeft + = ToggleButtonMorph.prototype.mouseClickLeft; + +// DialogBoxMorph ///////////////////////////////////////////////////// + +/* + I am a DialogBox frame. + + Note: + ----- + my key property keeps track of my purpose to prevent multiple instances + on the same or similar objects +*/ + +// DialogBoxMorph inherits from Morph: + +DialogBoxMorph.prototype = new Morph(); +DialogBoxMorph.prototype.constructor = DialogBoxMorph; +DialogBoxMorph.uber = Morph.prototype; + +// DialogBoxMorph preferences settings: + +DialogBoxMorph.prototype.fontSize = 12; +DialogBoxMorph.prototype.titleFontSize = 14; +DialogBoxMorph.prototype.fontStyle = 'sans-serif'; + +DialogBoxMorph.prototype.color = PushButtonMorph.prototype.color; +DialogBoxMorph.prototype.titleTextColor = WHITE; +DialogBoxMorph.prototype.titleBarColor + = PushButtonMorph.prototype.pressColor; + +DialogBoxMorph.prototype.contrast = 40; + +DialogBoxMorph.prototype.corner = 12; +DialogBoxMorph.prototype.padding = 14; +DialogBoxMorph.prototype.titlePadding = 6; + +DialogBoxMorph.prototype.buttonContrast = 50; +DialogBoxMorph.prototype.buttonFontSize = 12; +DialogBoxMorph.prototype.buttonCorner = 12; +DialogBoxMorph.prototype.buttonEdge = 6; +DialogBoxMorph.prototype.buttonPadding = 0; +DialogBoxMorph.prototype.buttonOutline = 3; +DialogBoxMorph.prototype.buttonOutlineColor + = PushButtonMorph.prototype.color; +DialogBoxMorph.prototype.buttonOutlineGradient = true; + +DialogBoxMorph.prototype.instances = {}; // prevent multiple instances + +// DialogBoxMorph instance creation: + +function DialogBoxMorph(target, action, environment) { + this.init(target, action, environment); +} + +DialogBoxMorph.prototype.init = function (target, action, environment) { + // additional properties: + this.is3D = false; // for "flat" design exceptions + this.target = target || null; + this.action = action || null; + this.environment = environment || null; + this.key = null; // keep track of my purpose to prevent mulitple instances + this.nag = false; // enable nag boxes that cannot be closed by the user + + this.labelString = null; + this.label = null; + this.head = null; + this.body = null; + this.buttons = null; + + // initialize inherited properties: + DialogBoxMorph.uber.init.call(this); + + // override inherited properites: + this.isDraggable = true; + this.noDropShadow = true; + this.fullShadowSource = false; + this.color = PushButtonMorph.prototype.color; + this.createLabel(); + this.createButtons(); + this.setExtent(new Point(300, 150)); +}; + +// DialogBoxMorph ops +DialogBoxMorph.prototype.inform = function ( + title, + textString, + world, + pic +) { + var txt = new TextMorph( + textString, + this.fontSize, + this.fontStyle, + true, + false, + 'center', + null, + null, + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE + ); + + if (!this.key) { + this.key = 'inform' + title + textString; + } + + txt.enableLinks = true; // let the user click on URLs to open in new tab + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + if (textString) { + this.addBody(txt); + } + this.addButton('ok', 'OK'); + this.fixLayout(); + this.popUp(world); + return this; +}; + +DialogBoxMorph.prototype.askYesNo = function ( + title, + textString, + world, + pic +) { + var txt = new TextMorph( + textString, + this.fontSize, + this.fontStyle, + true, + false, + 'center', + 300, // fixed width word wrap + null, + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE + ); + + if (!this.key) { + this.key = 'decide' + title + textString; + } + + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + this.addBody(txt); + this.addButton('ok', 'Yes'); + this.addButton('cancel', 'No'); + this.fixLayout(); + this.popUp(world); +}; + +DialogBoxMorph.prototype.prompt = function ( + title, + defaultString, + world, + pic, + choices, // optional dictionary for drop-down of choices + isReadOnly, // optional when using choices + isNumeric, // optional + sliderMin, // optional for numeric sliders + sliderMax, // optional for numeric sliders + sliderAction, // optional single-arg function for numeric slider + decimals = 2 // optional number of decimal digits +) { + var sld, + head, + precision = Math.pow(10, decimals), + txt = new InputFieldMorph( + defaultString, + isNumeric || false, // numeric? + choices || null, // drop-down dict, optional + choices ? isReadOnly || false : false + ); + txt.setWidth(250); + if (isNumeric) { + if (pic) { + head = new AlignmentMorph('column', this.padding); + pic.setPosition(head.position()); + head.add(pic); + } + if (!isNil(sliderMin) && !isNil(sliderMax)) { + sld = new SliderMorph( + sliderMin * precision, + sliderMax * precision, + parseFloat(defaultString) * precision, + (sliderMax - sliderMin) / 10 * precision, // knob size + 'horizontal' + ); + sld.alpha = 1; + sld.color = this.color.lighter(50); + sld.setHeight(txt.height() * 0.7); + sld.setWidth(txt.width()); + sld.action = num => { + if (sliderAction) { + sliderAction(num / precision); + } + txt.setContents(num / precision); + txt.edit(); + }; + if (!head) { + head = new AlignmentMorph('column', this.padding); + } + head.add(sld); + } + if (head) { + head.fixLayout(); + this.setPicture(head); + head.fixLayout(); + } + } else { + if (pic) {this.setPicture(pic); } + } + + this.reactToChoice = function (inp) { + if (sld) { + sld.value = inp * precision; + sld.fixLayout(); + sld.rerender(); + } + if (sliderAction) { + sliderAction(inp); + } + }; + + txt.reactToInput = function () { + var inp = txt.getValue(); + if (sld) { + inp = Math.max(inp, sliderMin); + sld.value = inp * precision; + sld.fixLayout(); + sld.rerender(); + } + if (sliderAction) { + sliderAction(inp); + } + }; + + this.labelString = title; + this.createLabel(); + + if (!this.key) { + this.key = 'prompt' + title + defaultString; + } + + this.addBody(txt); + txt.fixLayout(); + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + this.popUp(world); +}; + +DialogBoxMorph.prototype.promptCode = function ( + title, + defaultString, + world, + pic, + instructions +) { + var frame = new ScrollFrameMorph(), + text = new TextMorph(defaultString || ''), + bdy = new AlignmentMorph('column', this.padding), + size = pic ? Math.max(pic.width, 400) : 400; + + this.getInput = function () { + return text.text; + }; + + function remarkText(string) { + return new TextMorph( + localize(string), + 10, + null, // style + false, // bold + null, // italic + null, // alignment + null, // width + null, // font name + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE // shadowColor + ); + } + + frame.padding = 6; + frame.setWidth(size); + frame.acceptsDrops = false; + frame.contents.acceptsDrops = false; + + text.fontName = 'monospace'; + text.fontStyle = 'monospace'; + text.fontSize = 11; + text.setPosition(frame.topLeft().add(frame.padding)); + text.enableSelecting(); + text.isEditable = true; + + frame.setHeight(size / 4); + frame.fixLayout = nop; + frame.edge = InputFieldMorph.prototype.edge; + frame.fontSize = InputFieldMorph.prototype.fontSize; + frame.typeInPadding = InputFieldMorph.prototype.typeInPadding; + frame.contrast = InputFieldMorph.prototype.contrast; + frame.render = InputFieldMorph.prototype.render; + frame.drawRectBorder = InputFieldMorph.prototype.drawRectBorder; + + frame.addContents(text); + text.fixLayout(); + + if (pic) {this.setPicture(pic); } + + this.labelString = title; + this.createLabel(); + + if (!this.key) { + this.key = 'promptCode' + title + defaultString; + } + + bdy.setColor(this.color); + bdy.add(frame); + if (instructions) { + bdy.add(remarkText(instructions)); + } + bdy.fixLayout(); + this.addBody(bdy); + + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + this.popUp(world); + text.edit(); +}; + +DialogBoxMorph.prototype.promptVector = function ( + title, + point, + deflt, + xLabel, + yLabel, + world, + pic, + msg +) { + var vec = new AlignmentMorph('row', 4), + xInp = new InputFieldMorph(point.x.toString(), true), + yInp = new InputFieldMorph(point.y.toString(), true), + xCol = new AlignmentMorph('column', 2), + yCol = new AlignmentMorph('column', 2), + inp = new AlignmentMorph('column', 2), + bdy = new AlignmentMorph('column', this.padding); + + function labelText(string) { + return new TextMorph( + localize(string), + 10, + null, // style + false, // bold + null, // italic + null, // alignment + null, // width + null, // font name + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE // shadowColor + ); + } + + inp.alignment = 'left'; + inp.setColor(this.color); + bdy.setColor(this.color); + xCol.alignment = 'left'; + xCol.setColor(this.color); + yCol.alignment = 'left'; + yCol.setColor(this.color); + + xCol.add(labelText(xLabel)); + xCol.add(xInp); + yCol.add(labelText(yLabel)); + yCol.add(yInp); + vec.add(xCol); + vec.add(yCol); + inp.add(vec); + + if (msg) { + bdy.add(labelText(msg)); + } + + bdy.add(inp); + + vec.fixLayout(); + xCol.fixLayout(); + yCol.fixLayout(); + inp.fixLayout(); + bdy.fixLayout(); + + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + + this.addBody(bdy); + + this.addButton('ok', 'OK'); + + if (deflt instanceof Point) { + this.addButton( + () => { + xInp.setContents(deflt.x.toString()); + yInp.setContents(deflt.y.toString()); + }, + 'Default' + + ); + } + + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + + this.edit = function () { + xInp.edit(); + }; + + this.getInput = function () { + return new Point(xInp.getValue(), yInp.getValue()); + }; + + if (!this.key) { + this.key = 'vector' + title; + } + + this.popUp(world); +}; + +DialogBoxMorph.prototype.promptRGB = function ( + title, + color, + world, + pic, + msg +) { + var clr = new AlignmentMorph('row', 4), + iw = this.fontSize * 4, + rInp = new InputFieldMorph(color.r.toString(), true), + gInp = new InputFieldMorph(color.g.toString(), true), + bInp = new InputFieldMorph(color.b.toString(), true), + rCol = new AlignmentMorph('column', 2), + gCol = new AlignmentMorph('column', 2), + bCol = new AlignmentMorph('column', 2), + inp = new AlignmentMorph('column', 2), + bdy = new AlignmentMorph('column', this.padding); + + function labelText(string) { + return new TextMorph( + localize(string), + 10, + null, // style + false, // bold + null, // italic + null, // alignment + null, // width + null, // font name + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE // shadowColor + ); + } + + function constrain(num) { + return Math.max(0, Math.min(num, 255)); + } + + rInp.contents().minWidth = iw; + rInp.setWidth(iw); + gInp.contents().minWidth = iw; + gInp.setWidth(iw); + bInp.contents().minWidth = iw; + bInp.setWidth(iw); + + inp.alignment = 'left'; + inp.setColor(this.color); + bdy.setColor(this.color); + rCol.alignment = 'left'; + rCol.setColor(this.color); + gCol.alignment = 'left'; + gCol.setColor(this.color); + bCol.alignment = 'left'; + bCol.setColor(this.color); + + rCol.add(labelText('red')); + rCol.add(rInp); + gCol.add(labelText('green')); + gCol.add(gInp); + bCol.add(labelText('blue')); + bCol.add(bInp); + clr.add(rCol); + clr.add(gCol); + clr.add(bCol); + inp.add(clr); + + if (msg) { + bdy.add(labelText(msg)); + } + + bdy.add(inp); + + clr.fixLayout(); + rCol.fixLayout(); + gCol.fixLayout(); + bCol.fixLayout(); + inp.fixLayout(); + bdy.fixLayout(); + + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + + this.addBody(bdy); + + this.addButton('ok', 'OK'); + + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + + this.edit = function () { + rInp.edit(); + }; + + this.getInput = function () { + return new Color( + constrain(rInp.getValue()), + constrain(gInp.getValue()), + constrain(bInp.getValue()) + ); + }; + + if (!this.key) { + this.key = 'RGB' + title; + } + + this.popUp(world); +}; + +DialogBoxMorph.prototype.promptCategory = function ( + title, + name, + color, + world, + pic, + msg +) { + var row = new AlignmentMorph('row', 4), + field = new InputFieldMorph(name), + picker = new BoxMorph(2, 1), + inp = new AlignmentMorph('column', 2), + bdy = new AlignmentMorph('column', this.padding), + side; + + function labelText(string) { + return new TextMorph( + localize(string), + 10, + null, // style + false, // bold + null, // italic + null, // alignment + null, // width + null, // font name + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE // shadowColor + ); + } + + field.setWidth(160); + side = field.height() * 0.8; + picker.setExtent(new Point(side, side)); + picker.setColor(color); + + picker.mouseClickLeft = () => { + var hand = world.hand, + posInDocument = getDocumentPositionOf(world.worldCanvas), + mouseMoveBak = hand.processMouseMove, + mouseDownBak = hand.processMouseDown, + mouseUpBak = hand.processMouseUp, + pal = new ColorPaletteMorph(null, new Point(160, 100)); + + world.add(pal); + pal.setPosition(picker.topRight().add(new Point(this.edge,0))); + + hand.processMouseMove = (event) => { + var clr = world.getGlobalPixelColor(hand.position()); + hand.setPosition(new Point( + event.pageX - posInDocument.x, + event.pageY - posInDocument.y + )); + if (!clr.a) { + // ignore transparent, + // needed for retina-display support + return; + } + picker.setColor(clr); + }; + + hand.processMouseDown = nop; + + hand.processMouseUp = () => { + pal.destroy(); + hand.processMouseMove = mouseMoveBak; + hand.processMouseDown = mouseDownBak; + hand.processMouseUp = mouseUpBak; + }; + }; + + picker.mouseClickRight = () => { + new DialogBoxMorph( + this, + (clr) => picker.setColor(clr), + this + ).promptRGB( + "Category color", + picker.color, + this.world(), + null, // pic + null // msg + ); + }; + + inp.alignment = 'left'; + inp.setColor(this.color); + bdy.setColor(this.color); + row.setColor(this.color); + + row.add(field); + row.add(picker); + inp.add(row); + + if (msg) { + bdy.add(labelText(msg)); + } + + bdy.add(inp); + + row.fixLayout(); + field.fixLayout(); + picker.fixLayout(); + inp.fixLayout(); + bdy.fixLayout(); + + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + + this.addBody(bdy); + + this.addButton('ok', 'OK'); + + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + + this.edit = function () { + field.edit(); + }; + + this.getInput = function () { + return { + name: field.getValue(), + color: picker.color.copy() + }; + }; + + if (!this.key) { + this.key = 'category' + title; + } + + this.popUp(world); +}; + +DialogBoxMorph.prototype.promptCredentials = function ( + title, + purpose, + tosURL, + tosLabel, + prvURL, + prvLabel, + checkBoxLabel, + world, + pic, + msg +) { + var usr = new InputFieldMorph(), + bmn, + byr, + emlLabel, + eml = new InputFieldMorph(), + pw1 = new InputFieldMorph(), + pw2 = new InputFieldMorph(), + opw = new InputFieldMorph(), + agree = false, + chk, + dof = new AlignmentMorph('row', 4), + mCol = new AlignmentMorph('column', 2), + yCol = new AlignmentMorph('column', 2), + inp = new AlignmentMorph('column', 2), + lnk = new AlignmentMorph('row', 4), + bdy = new AlignmentMorph('column', this.padding), + years = {}, + currentYear = new Date().getFullYear(), + firstYear = currentYear - 20, + myself = this; + + function labelText(string) { + return new TextMorph( + localize(string), + 10, + null, // style + false, // bold + null, // italic + null, // alignment + null, // width + null, // font name + MorphicPreferences.isFlat ? null : new Point(1, 1), + WHITE // shadowColor + ); + } + + function linkButton(label, url) { + var btn = new PushButtonMorph( + myself, + () => window.open(url), + ' ' + localize(label) + ' ' + ); + btn.fontSize = 10; + btn.corner = myself.buttonCorner; + btn.edge = myself.buttonEdge; + btn.outline = myself.buttonOutline; + btn.outlineColor = myself.buttonOutlineColor; + btn.outlineGradient = myself.buttonOutlineGradient; + btn.padding = myself.buttonPadding; + btn.contrast = myself.buttonContrast; + btn.fixLayout(); + return btn; + } + + function age() { + var today = new Date().getFullYear() + new Date().getMonth() / 12, + year = +byr.getValue() || 0, + monthName = bmn.getValue(), + month, + birthday; + if (monthName instanceof Array) { // translatable + monthName = monthName[0]; + } + if (isNaN(year)) { + year = 0; + } + month = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December' + ].indexOf(monthName); + if (isNaN(month)) { + month = 0; + } + birthday = year + month / 12; + return today - birthday; + } + + bmn = new InputFieldMorph( + null, // text + false, // numeric? + { + 'January' : ['January'], + 'February' : ['February'], + 'March' : ['March'], + 'April' : ['April'], + 'May' : ['May'], + 'June' : ['June'], + 'July' : ['July'], + 'August' : ['August'], + 'September' : ['September'], + 'October' : ['October'], + 'November' : ['November'], + 'December' : ['December'] + }, + true // read-only + ); + for (currentYear; currentYear > firstYear; currentYear -= 1) { + years[currentYear.toString() + ' '] = currentYear; + } + years[firstYear + ' ' + localize('or before')] = '< ' + currentYear; + byr = new InputFieldMorph( + null, // text + false, // numeric? + years, + true // read-only + ); + + inp.alignment = 'left'; + inp.setColor(this.color); + bdy.setColor(this.color); + + mCol.alignment = 'left'; + mCol.setColor(this.color); + yCol.alignment = 'left'; + yCol.setColor(this.color); + + usr.setWidth(200); + bmn.setWidth(100); + byr.contents().minWidth = 80; + byr.setWidth(80); + eml.setWidth(200); + pw1.setWidth(200); + pw2.setWidth(200); + opw.setWidth(200); + pw1.contents().text.toggleIsPassword(); + pw2.contents().text.toggleIsPassword(); + opw.contents().text.toggleIsPassword(); + + if (purpose === 'login') { + inp.add(labelText('User name:')); + inp.add(usr); + } + + if (purpose === 'signup') { + inp.add(labelText('User name:')); + inp.add(usr); + mCol.add(labelText('Birth date:')); + mCol.add(bmn); + yCol.add(labelText('year:')); + yCol.add(byr); + dof.add(mCol); + dof.add(yCol); + inp.add(dof); + emlLabel = labelText('foo'); + inp.add(emlLabel); + inp.add(eml); + inp.add(labelText('Password:')); + inp.add(pw1); + inp.add(labelText('Repeat Password:')); + inp.add(pw2); + } + + if (purpose === 'login') { + inp.add(labelText('Password:')); + inp.add(pw1); + } + + if (purpose === 'changePassword') { + inp.add(labelText('Old password:')); + inp.add(opw); + inp.add(labelText('New password:')); + inp.add(pw1); + inp.add(labelText('Repeat new password:')); + inp.add(pw2); + } + + if (purpose === 'resetPassword' || purpose === 'resendVerification') { + inp.add(labelText('User name:')); + inp.add(usr); + } + + if (msg) { + bdy.add(labelText(msg)); + } + + bdy.add(inp); + + if (tosURL || prvURL) { + bdy.add(lnk); + } + if (tosURL) { + lnk.add(linkButton(tosLabel, tosURL)); + } + if (prvURL) { + lnk.add(linkButton(prvLabel, prvURL)); + } + + if (checkBoxLabel) { + chk = new ToggleMorph( + 'checkbox', + this, + () => agree = !agree, // action, + checkBoxLabel, + () => agree //query + ); + chk.edge = this.buttonEdge / 2; + chk.outline = this.buttonOutline / 2; + chk.outlineColor = this.buttonOutlineColor; + chk.outlineGradient = this.buttonOutlineGradient; + chk.contrast = this.buttonContrast; + chk.fixLayout(); + bdy.add(chk); + } + + dof.fixLayout(); + mCol.fixLayout(); + yCol.fixLayout(); + inp.fixLayout(); + lnk.fixLayout(); + bdy.fixLayout(); + + this.labelString = title; + this.createLabel(); + if (pic) {this.setPicture(pic); } + + this.addBody(bdy); + + this.addButton('ok', 'OK'); + this.addButton('cancel', 'Cancel'); + this.fixLayout(); + + function validInputs() { + var checklist, + empty, + em = eml.getValue(); + + function indicate(morph, string) { + var bubble = new SpeechBubbleMorph(localize(string)); + bubble.isPointingRight = false; + bubble.fixLayout(); + bubble.popUp( + world, + morph.leftCenter().subtract(new Point(bubble.width() + 2, 0)) + ); + if (morph.edit) { + morph.edit(); + } + } + + if (purpose === 'login') { + checklist = [usr, pw1]; + } else if (purpose === 'signup') { + checklist = [usr, bmn, byr, eml, pw1, pw2]; + } else if (purpose === 'changePassword') { + checklist = [opw, pw1, pw2]; + } else if (purpose === 'resetPassword' || + purpose === 'resendVerification') { + checklist = [usr]; + } + + empty = detect( + checklist, + inp => !inp.getValue() + ); + if (empty) { + indicate(empty, 'please fill out\nthis field'); + return false; + } + if (purpose === 'signup') { + if (usr.getValue().length < 4) { + indicate(usr, 'User name must be four\ncharacters or longer'); + return false; + } + if (em.indexOf(' ') > -1 || em.indexOf('@') === -1 + || em.indexOf('.') === -1 || em.length < 5) { + indicate(eml, 'please provide a valid\nemail address'); + return false; + } + } + if (purpose === 'changePassword' || purpose === 'signup') { + if (pw1.getValue().length < 6) { + indicate(pw1, 'password must be six\ncharacters or longer'); + return false; + } + if (pw1.getValue() !== pw2.getValue()) { + indicate(pw2, 'passwords do\nnot match'); + return false; + } + } + if (purpose === 'signup') { + if (!agree) { + indicate(chk, 'please agree to\nthe TOS'); + return false; + } + } + return true; + } + + this.accept = function () { + if (validInputs()) { + DialogBoxMorph.prototype.accept.call(myself); + } + }; + + this.edit = function () { + if (purpose === 'changePassword') { + opw.edit(); + } else { // 'signup', 'login', 'resetPassword', 'resendVerification' + usr.edit(); + } + }; + + this.getInput = function () { + return { + username: usr.getValue(), + email: eml.getValue(), + oldpassword: opw.getValue(), + password: pw1.getValue(), + passwordRepeat: pw2.getValue(), + choice: agree + }; + }; + + this.reactToChoice = function () { + if (purpose === 'signup') { + emlLabel.changed(); + emlLabel.text = age() <= 13 ? + 'E-mail address of parent or guardian:' + : 'E-mail address:'; + emlLabel.text = localize(emlLabel.text); + emlLabel.fixLayout(); + emlLabel.rerender(); + } + }; + + this.reactToChoice(); // initialize e-mail label + + if (!this.key) { + this.key = 'credentials' + title + purpose; + } + + this.popUp(world); +}; + +DialogBoxMorph.prototype.accept = function () { + /* + if target is a function, use it as callback: + execute target as callback function with action as argument + in the environment as optionally specified. + Note: if action is also a function, instead of becoming + the argument itself it will be called to answer the argument. + for selections, Yes/No Choices etc: + + else (if target is not a function): + + if action is a function: + execute the action with target as environment (can be null) + for lambdafied (inline) actions + + else if action is a String: + treat it as function property of target and execute it + for selector-like actions + */ + if (this.action) { + if (typeof this.target === 'function') { + if (typeof this.action === 'function') { + this.target.call(this.environment, this.action.call()); + } else { + this.target.call(this.environment, this.action); + } + } else { + if (typeof this.action === 'function') { + this.action.call(this.target, this.getInput()); + } else { // assume it's a String + this.target[this.action](this.getInput()); + } + } + } + this.destroy(); +}; + +DialogBoxMorph.prototype.withKey = function (key) { + this.key = key; + return this; +}; + +DialogBoxMorph.prototype.popUp = function (world) { + if (world) { + if (this.key) { + if (this.instances[world.stamp]) { + if (this.instances[world.stamp][this.key]) { + this.instances[world.stamp][this.key].destroy(); + } + this.instances[world.stamp][this.key] = this; + } else { + this.instances[world.stamp] = {}; + this.instances[world.stamp][this.key] = this; + } + } + world.add(this); + world.keyboardFocus = this; + this.setCenter(world.center()); + this.edit(); + } +}; + +DialogBoxMorph.prototype.destroy = function () { + DialogBoxMorph.uber.destroy.call(this); + if (this.key) { + delete this.instances[this.key]; + } +}; + +DialogBoxMorph.prototype.ok = function () { + this.accept(); +}; + +DialogBoxMorph.prototype.cancel = function () { + this.destroy(); +}; + +DialogBoxMorph.prototype.edit = function () { + this.children.forEach(c => { + if (c.edit) { + c.edit(); + } + }); +}; + +DialogBoxMorph.prototype.getInput = function () { + if (this.body instanceof InputFieldMorph) { + return this.body.getValue(); + } + return null; +}; + +DialogBoxMorph.prototype.justDropped = function (hand) { + hand.world.keyboardFocus = this; + this.edit(); +}; + +DialogBoxMorph.prototype.destroy = function () { + var world = this.world(); + world.keyboardFocus = null; + world.hand.destroyTemporaries(); + DialogBoxMorph.uber.destroy.call(this); +}; + +DialogBoxMorph.prototype.normalizeSpaces = function (string) { + var ans = '', i, c, flag = false; + + for (i = 0; i < string.length; i += 1) { + c = string[i]; + if (c === ' ') { + if (flag) { + ans += c; + flag = false; + } + } else { + ans += c; + flag = true; + } + } + return ans.trim(); +}; + +// DialogBoxMorph submorph construction + +DialogBoxMorph.prototype.createLabel = function () { + var shading = !MorphicPreferences.isFlat || this.is3D; + + if (this.label) { + this.label.destroy(); + } + if (this.labelString) { + this.label = new StringMorph( + localize(this.labelString), + this.titleFontSize, + this.fontStyle, + true, + false, + false, + shading ? new Point(2, 1) : null, + this.titleBarColor.darker(this.contrast) + ); + this.label.color = this.titleTextColor; + this.label.fixLayout(); + this.add(this.label); + } +}; + +DialogBoxMorph.prototype.createButtons = function () { + if (this.buttons) { + this.buttons.destroy(); + } + this.buttons = new AlignmentMorph('row', this.padding); + this.add(this.buttons); +}; + +DialogBoxMorph.prototype.addButton = function (action, label) { + var button = new PushButtonMorph( + this, + action || 'ok', + ' ' + localize((label || 'OK')) + ' ' + ); + button.fontSize = this.buttonFontSize; + button.corner = this.buttonCorner; + button.edge = this.buttonEdge; + button.outline = this.buttonOutline; + button.outlineColor = this.buttonOutlineColor; + button.outlineGradient = this.buttonOutlineGradient; + button.padding = this.buttonPadding; + button.contrast = this.buttonContrast; + button.fixLayout(); + this.buttons.add(button); + return button; +}; + +DialogBoxMorph.prototype.setPicture = function (aMorphOrCanvas) { + var morph; + if (aMorphOrCanvas instanceof Morph) { + morph = aMorphOrCanvas; + } else { + morph = new Morph(); + morph.isCachingImage = true; + morph.cachedImage = aMorphOrCanvas; + morph.bounds.setWidth(aMorphOrCanvas.width); + morph.bounds.setHeight(aMorphOrCanvas.height); + } + this.addHead(morph); +}; + +DialogBoxMorph.prototype.addHead = function (aMorph) { + if (this.head) { + this.head.destroy(); + } + this.head = aMorph; + this.add(this.head); +}; + +DialogBoxMorph.prototype.addBody = function (aMorph) { + if (this.body) { + this.body.destroy(); + } + this.body = aMorph; + this.add(this.body); +}; + +// DialogBoxMorph layout + +DialogBoxMorph.prototype.fixLayout = function () { + // determine by extent and arrange my components + var th = fontHeight(this.titleFontSize) + this.titlePadding * 2, w; + + if (this.head) { + this.head.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.bounds.setWidth(this.head.width() + this.padding * 2); + this.bounds.setHeight( + this.head.height() + + this.padding * 2 + + th + ); + } + + if (this.body) { + if (this.head) { + this.body.setPosition(this.head.bottomLeft().add(new Point( + 0, + this.padding + ))); + this.bounds.setWidth(Math.max( + this.width(), + this.body.width() + this.padding * 2 + )); + this.bounds.setHeight( + this.height() + + this.body.height() + + this.padding + ); + w = this.width(); + this.head.setLeft( + this.left() + + Math.round((w - this.head.width()) / 2) + ); + this.body.setLeft( + this.left() + + Math.round((w - this.body.width()) / 2) + ); + } else { + this.body.setPosition(this.position().add(new Point( + this.padding, + th + this.padding + ))); + this.bounds.setWidth(this.body.width() + this.padding * 2); + this.bounds.setHeight( + this.body.height() + + this.padding * 2 + + th + ); + } + } + + if (this.label) { + this.label.setCenter(this.center()); + this.label.setTop(this.top() + (th - this.label.height()) / 2); + } + + if (this.buttons && (this.buttons.children.length > 0)) { + this.buttons.fixLayout(); + this.bounds.setHeight( + this.height() + + this.buttons.height() + + this.padding + ); + this.bounds.setWidth(Math.max( + this.width(), + this.buttons.width() + + (2 * this.padding) + ) + ); + this.buttons.setCenter(this.center()); + this.buttons.setBottom(this.bottom() - this.padding); + } + + // refresh a shallow shadow + this.removeShadow(); + this.addShadow(); +}; + +// DialogBoxMorph keyboard events + +DialogBoxMorph.prototype.processKeyPress = nop; + +DialogBoxMorph.prototype.processKeyDown = function (event) { + // this.inspectKeyEvent(event); + switch (event.keyCode) { + case 13: + this.ok(); + break; + case 27: + this.cancel(); + break; + default: + nop(); + // this.inspectKeyEvent(event); + } +}; + +// DialogBoxMorph drawing + +DialogBoxMorph.prototype.render = function (ctx) { + var gradient, + w = this.width(), + h = this.height(), + th = Math.floor( + fontHeight(this.titleFontSize) + this.titlePadding * 2 + ), + shift = this.corner / 2, + x, + y, + isFlat = MorphicPreferences.isFlat && !this.is3D; + + // this.alpha = isFlat ? 0.9 : 1; + + // title bar + if (isFlat) { + ctx.fillStyle = this.titleBarColor.toString(); + } else { + gradient = ctx.createLinearGradient(0, 0, 0, th); + gradient.addColorStop( + 0, + this.titleBarColor.lighter(this.contrast / 2).toString() + ); + gradient.addColorStop( + 1, + this.titleBarColor.darker(this.contrast).toString() + ); + ctx.fillStyle = gradient; + } + ctx.beginPath(); + this.outlinePathTitle( + ctx, + isFlat ? 0 : this.corner + ); + ctx.closePath(); + ctx.fill(); + + // flat shape + // body + ctx.fillStyle = this.color.toString(); + ctx.beginPath(); + this.outlinePathBody( + ctx, + isFlat ? 0 : this.corner + ); + ctx.closePath(); + ctx.fill(); + + if (isFlat) { + return; + } + + // 3D-effect + // bottom left corner + gradient = ctx.createLinearGradient( + 0, + h - this.corner, + 0, + h + ); + gradient.addColorStop(0, this.color.toString()); + gradient.addColorStop(1, this.color.darker(this.contrast.toString())); + + ctx.lineWidth = this.corner; + ctx.lineCap = 'round'; + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(this.corner, h - shift); + ctx.lineTo(this.corner + 1, h - shift); + ctx.stroke(); + + // bottom edge + gradient = ctx.createLinearGradient( + 0, + h - this.corner, + 0, + h + ); + gradient.addColorStop(0, this.color.toString()); + gradient.addColorStop(1, this.color.darker(this.contrast.toString())); + + ctx.lineWidth = this.corner; + ctx.lineCap = 'butt'; + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(this.corner, h - shift); + ctx.lineTo(w - this.corner, h - shift); + ctx.stroke(); + + // right body edge + gradient = ctx.createLinearGradient( + w - this.corner, + 0, + w, + 0 + ); + gradient.addColorStop(0, this.color.toString()); + gradient.addColorStop(1, this.color.darker(this.contrast).toString()); + + ctx.lineWidth = this.corner; + ctx.lineCap = 'butt'; + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(w - shift, th); + ctx.lineTo(w - shift, h - this.corner); + ctx.stroke(); + + // bottom right corner + x = w - this.corner; + y = h - this.corner; + + gradient = ctx.createRadialGradient( + x, + y, + 0, + x, + y, + this.corner + ); + gradient.addColorStop(0, this.color.toString()); + gradient.addColorStop(1, this.color.darker(this.contrast.toString())); + + ctx.lineCap = 'butt'; + + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.arc( + x, + y, + shift, + radians(90), + radians(0), + true + ); + ctx.stroke(); + + // left body edge + gradient = ctx.createLinearGradient( + 0, + 0, + this.corner, + 0 + ); + gradient.addColorStop( + 0, + this.color.lighter(this.contrast).toString() + ); + gradient.addColorStop(1, this.color.toString()); + + ctx.lineCap = 'butt'; + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(shift, th); + ctx.lineTo(shift, h - this.corner * 2); + ctx.stroke(); + + // left vertical bottom corner + gradient = ctx.createLinearGradient( + 0, + 0, + this.corner, + 0 + ); + gradient.addColorStop( + 0, + this.color.lighter(this.contrast).toString() + ); + gradient.addColorStop(1, this.color.toString()); + + ctx.lineCap = 'round'; + ctx.strokeStyle = gradient; + + ctx.beginPath(); + ctx.moveTo(shift, h - this.corner * 2); + ctx.lineTo(shift, h - this.corner - shift); + ctx.stroke(); +}; + +DialogBoxMorph.prototype.outlinePathTitle = function (ctx, radius) { + var w = this.width(), + h = Math.ceil(fontHeight(this.titleFontSize)) + this.titlePadding * 2; + + // top left: + ctx.arc( + radius, + radius, + radius, + radians(-180), + radians(-90), + false + ); + // top right: + ctx.arc( + w - radius, + radius, + radius, + radians(-90), + radians(-0), + false + ); + // bottom right: + ctx.lineTo(w, h); + + // bottom left: + ctx.lineTo(0, h); +}; + +DialogBoxMorph.prototype.outlinePathBody = function (ctx, radius) { + var w = this.width(), + h = this.height(), + th = Math.floor(fontHeight(this.titleFontSize)) + + this.titlePadding * 2; + + // top left: + ctx.moveTo(0, th); + + // top right: + ctx.lineTo(w, th); + + // bottom right: + ctx.arc( + w - radius, + h - radius, + radius, + radians(0), + radians(90), + false + ); + // bottom left: + ctx.arc( + radius, + h - radius, + radius, + radians(90), + radians(180), + false + ); +}; + +// AlignmentMorph ///////////////////////////////////////////////////// + +// I am a reified layout, either a row or a column of submorphs + +// AlignmentMorph inherits from Morph: + +AlignmentMorph.prototype = new Morph(); +AlignmentMorph.prototype.constructor = AlignmentMorph; +AlignmentMorph.uber = Morph.prototype; + +// AlignmentMorph instance creation: + +function AlignmentMorph(orientation, padding) { + this.init(orientation, padding); +} + +AlignmentMorph.prototype.init = function (orientation, padding) { + // additional properties: + this.orientation = orientation || 'row'; // or 'column' + this.alignment = 'center'; // or 'left' in a column + this.padding = padding || 0; + this.respectHiddens = false; + + // initialize inherited properties: + AlignmentMorph.uber.init.call(this); + + // override inherited properites: +}; + +// AlignmentMorph displaying and layout + +AlignmentMorph.prototype.render = function (ctx) { + // override to not draw anything, as alignments are just containers + // for layout of their components + nop(ctx); +}; + +AlignmentMorph.prototype.fixLayout = function () { + var last = null, + newBounds; + if (this.children.length === 0) { + return null; + } + this.children.forEach(c => { + var cfb = c.fullBounds(), + lfb; + if (c.isVisible || this.respectHiddens) { + if (last) { + lfb = last.fullBounds(); + if (this.orientation === 'row') { + c.setPosition( + lfb.topRight().add(new Point( + this.padding, + (lfb.height() - cfb.height()) / 2 + )) + ); + } else { // orientation === 'column' + c.setPosition( + lfb.bottomLeft().add(new Point( + this.alignment === 'center' ? + (lfb.width() - cfb.width()) / 2 + : 0, + this.padding + )) + ); + } + cfb = c.fullBounds(); + newBounds = newBounds.merge(cfb); + } else { + newBounds = cfb; + } + last = c; + } + }); + this.bounds = newBounds; +}; + +// InputFieldMorph ////////////////////////////////////////////////////// + +// InputFieldMorph inherits from Morph: + +InputFieldMorph.prototype = new Morph(); +InputFieldMorph.prototype.constructor = InputFieldMorph; +InputFieldMorph.uber = Morph.prototype; + +// InputFieldMorph settings + +InputFieldMorph.prototype.edge = 2; +InputFieldMorph.prototype.fontSize = 12; +InputFieldMorph.prototype.typeInPadding = 2; +InputFieldMorph.prototype.contrast = 65; + +// InputFieldMorph instance creation: + +function InputFieldMorph(text, isNumeric, choiceDict, isReadOnly) { + this.init(text, isNumeric, choiceDict, isReadOnly); +} + +InputFieldMorph.prototype.init = function ( + text, + isNumeric, + choiceDict, + isReadOnly +) { + var contents = new StringFieldMorph( + text || '', + null, null, null, null, null, + isNumeric || false + ), + arrow = new ArrowMorph( + 'down', + 0, + Math.max(Math.floor(this.fontSize / 6), 1) + ); + + this.choices = choiceDict || null; // object, function or selector + this.isReadOnly = isReadOnly || false; + this.isNumeric = isNumeric || false; + + contents.alpha = 0; + contents.fontSize = this.fontSize; + contents.fixLayout(); + + this.oldContentsExtent = contents.extent(); + + InputFieldMorph.uber.init.call(this); + this.color = WHITE; + this.add(contents); + this.add(arrow); + contents.isDraggable = false; + this.fixLayout(); +}; + +// InputFieldMorph accessing: + +InputFieldMorph.prototype.contents = function () { + return detect( + this.children, + child => child instanceof StringFieldMorph + ); +}; + +InputFieldMorph.prototype.arrow = function () { + return detect( + this.children, + child => child instanceof ArrowMorph + ); +}; + +InputFieldMorph.prototype.setChoice = function (aStringOrFloat) { + this.setContents(aStringOrFloat); + this.escalateEvent('reactToChoice', aStringOrFloat); +}; + +InputFieldMorph.prototype.setContents = function (aStringOrFloat) { + var cnts = this.contents(); + cnts.text.text = aStringOrFloat; + if (aStringOrFloat === undefined) { + return null; + } + if (aStringOrFloat === null) { + cnts.text.text = ''; + } else if (aStringOrFloat.toString) { + cnts.text.text = aStringOrFloat.toString(); + } + cnts.text.fixLayout(); + cnts.changed(); + cnts.fixLayout(); + cnts.rerender(); +}; + +InputFieldMorph.prototype.edit = function () { + var c = this.contents(); + c.text.edit(); + c.text.selectAll(); +}; + +InputFieldMorph.prototype.setIsNumeric = function (bool) { + var value; + + this.isNumeric = bool; + this.contents().isNumeric = bool; + this.contents().text.isNumeric = bool; + + // adjust my shown value to conform with the numeric flag + value = this.getValue(); + if (this.isNumeric) { + value = parseFloat(value); + if (isNaN(value)) { + value = null; + } + } + this.setContents(value); +}; + +// InputFieldMorph drop-down menu: + +InputFieldMorph.prototype.dropDownMenu = function () { + var choices = this.choices, + key, + menu = new MenuMorph( + this.setChoice, + null, + this, + this.fontSize + ); + + if (choices instanceof Function) { + choices = choices.call(this); + } else if (isString(choices)) { + choices = this[choices](); + } + if (!choices) { + return null; + } + menu.addItem(' ', null); + if (choices instanceof Array) { + choices.forEach(choice => menu.addItem(choice[0], choice[1])); + } else { // assuming a dictionary + for (key in choices) { + if (Object.prototype.hasOwnProperty.call(choices, key)) { + if (key[0] === '~') { + menu.addLine(); + } else { + menu.addItem(key, choices[key]); + } + } + } + } + if (menu.items.length > 0) { + menu.popUpAtHand(this.world()); + } else { + return null; + } +}; + +// InputFieldMorph layout: + +InputFieldMorph.prototype.fixLayout = function () { + var contents = this.contents(), + arrow = this.arrow(); + + if (!contents) {return null; } + contents.isNumeric = this.isNumeric; + contents.isEditable = (!this.isReadOnly); + if (this.choices) { + arrow.setSize(this.fontSize); + arrow.show(); + } else { + arrow.setSize(0); + arrow.hide(); + } + this.bounds.setHeight( + contents.height() + + this.edge * 2 + + this.typeInPadding * 2 + ); + this.bounds.setWidth(Math.max( + contents.minWidth + + this.edge * 2 + + this.typeInPadding * 2, + this.width() + )); + + contents.setWidth( + this.width() - this.edge - this.typeInPadding - + (this.choices ? arrow.width() + this.typeInPadding : 0) + ); + + contents.setPosition(new Point( + this.edge, + this.edge + ).add(this.typeInPadding).add(this.position())); + + arrow.setPosition(new Point( + this.right() - arrow.width() - this.edge, + contents.top() + )); + +}; + +// InputFieldMorph events: + +InputFieldMorph.prototype.mouseClickLeft = function (pos) { + if (this.arrow().bounds.containsPoint(pos)) { + this.dropDownMenu(); + } else if (this.isReadOnly) { + this.dropDownMenu(); + } else { + this.escalateEvent('mouseClickLeft', pos); + } +}; + +// InputFieldMorph retrieving: + +InputFieldMorph.prototype.getValue = function () { +/* + answer my content's text string. If I am numerical convert that + string to a number. If the conversion fails answer the string + otherwise the numerical value. +*/ + var num, + contents = this.contents(); + if (this.isNumeric) { + num = parseFloat(contents.text.text); + if (!isNaN(num)) { + return num; + } + } + return this.normalizeSpaces(contents.string()); +}; + +InputFieldMorph.prototype.normalizeSpaces + = DialogBoxMorph.prototype.normalizeSpaces; + +// InputFieldMorph drawing: + +InputFieldMorph.prototype.render = function (ctx) { + var borderColor; + + if (this.parent) { + if (this.parent.color.eq(WHITE)) { + this.color = this.parent.color.darker(this.contrast * 0.1); + } else { + this.color = this.parent.color.lighter(this.contrast * 0.75); + } + borderColor = this.parent.color; + } else { + borderColor = new Color(120, 120, 120); + } + ctx.fillStyle = this.color.toString(); + + // cache my border colors + this.cachedClr = borderColor.toString(); + this.cachedClrBright = borderColor.lighter(this.contrast) + .toString(); + this.cachedClrDark = borderColor.darker(this.contrast).toString(); + + ctx.fillRect( + this.edge, + this.edge, + this.width() - this.edge * 2, + this.height() - this.edge * 2 + ); + + this.drawRectBorder(ctx); +}; + +InputFieldMorph.prototype.drawRectBorder = function (ctx) { + var shift = this.edge * 0.5, + gradient; + + if (MorphicPreferences.isFlat && !this.is3D) {return; } + + ctx.lineWidth = this.edge; + ctx.lineJoin = 'round'; + ctx.lineCap = 'round'; + + if (useBlurredShadows) { + ctx.shadowOffsetY = shift; + ctx.shadowBlur = this.edge * 4; + ctx.shadowColor = this.cachedClrDark; + } + + gradient = ctx.createLinearGradient( + 0, + 0, + 0, + this.edge + ); + + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.edge, shift); + ctx.lineTo(this.width() - this.edge - shift, shift); + ctx.stroke(); + + ctx.shadowOffsetY = 0; + + gradient = ctx.createLinearGradient( + 0, + 0, + this.edge, + 0 + ); + gradient.addColorStop(0, this.cachedClr); + gradient.addColorStop(1, this.cachedClrDark); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(shift, this.edge); + ctx.lineTo(shift, this.height() - this.edge - shift); + ctx.stroke(); + + ctx.shadowOffsetX = 0; + ctx.shadowOffsetY = 0; + ctx.shadowBlur = 0; + + gradient = ctx.createLinearGradient( + 0, + this.height() - this.edge, + 0, + this.height() + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.edge, this.height() - shift); + ctx.lineTo(this.width() - this.edge, this.height() - shift); + ctx.stroke(); + + gradient = ctx.createLinearGradient( + this.width() - this.edge, + 0, + this.width(), + 0 + ); + gradient.addColorStop(0, this.cachedClrBright); + gradient.addColorStop(1, this.cachedClr); + ctx.strokeStyle = gradient; + ctx.beginPath(); + ctx.moveTo(this.width() - shift, this.edge); + ctx.lineTo(this.width() - shift, this.height() - this.edge); + ctx.stroke(); +}; + +// PianoMenuMorph ////////////////////////////////////////////////////// +/* + I am a menu that looks like a piano keyboard. +*/ + +// PianoMenuMorph inherits from MenuMorph + +PianoMenuMorph.prototype = new MenuMorph(); +PianoMenuMorph.prototype.constructor = PianoMenuMorph; +PianoMenuMorph.uber = MenuMorph.prototype; + +// PianoMenuMorph instance creation: + +function PianoMenuMorph(target, environment, fontSize, soundType) { + this.init(target, environment, fontSize, soundType); +} + +PianoMenuMorph.prototype.init = function ( + target, + environment, + fontSize, + soundType // number 1 - 4: 'sine', 'square', 'sawtooth' or 'triangle' +) { + var choices, key; + this.soundType = soundType; + PianoMenuMorph.uber.init.call(this, target, null, environment, fontSize); + choices = { + 'C (48)' : 48, + 'D (50)' : 50, + 'C# (49)' : 49, + 'E (52)' : 52, + 'Eb (51)' : 51, + 'F (53)' : 53, + 'G (55)' : 55, + 'F# (54)' : 54, + 'A (57)' : 57, + 'G# (56)' : 56, + 'B (59)' : 59, + 'Bb (58)' : 58, + 'C (60)' : 60, + 'D (62)' : 62, + 'C# (61)' : 61, + 'E (64)' : 64, + 'Eb (63)' : 63, + 'F (65)' : 65, + 'G (67)' : 67, + 'F# (66)' : 66, + 'A (69)' : 69, + 'G# (68)' : 68, + 'B (71)' : 71, + 'Bb (70)' : 70, + 'C (72)' : 72 + }; + for (key in choices) { + if (Object.prototype.hasOwnProperty.call(choices, key)) { + this.addItem(key, choices[key]); + } + } +}; + +PianoMenuMorph.prototype.createItems = function () { + var item, + fb, + x, + y, + label, + blackkey, + key, + keycolor, + keywidth, + keyheight, + keyposition; + + this.children.forEach(m => m.destroy()); + this.children = []; + if (!this.isListContents) { + this.edge = MorphicPreferences.isFlat ? 0 : 5; + this.border = MorphicPreferences.isFlat ? 1 : 2; + } + this.color = WHITE; + this.borderColor = new Color(60, 60, 60); + this.bounds.setExtent(ZERO); + + x = this.left() + 1; + y = this.top() + (this.fontSize * 1.5) + 2; + label = new StringMorph('', this.fontSize); + this.items.forEach(tuple => { + blackkey = tuple[0][1] !== " "; + key = new BoxMorph(1, 1); + if (blackkey) { + keycolor = BLACK; + keywidth = this.fontSize; // 9; + keyheight = this.fontSize * 2.5; + keyposition = new Point(x + 2 - (this.fontSize * 2), y); + } else { + keycolor = WHITE; + keywidth = this.fontSize * 1.5; + keyheight = this.fontSize * 4; + keyposition = new Point(x + 1, y); + x += keywidth - 1; + } + key.setColor(keycolor); + key.setWidth(keywidth); + key.setHeight(keyheight); + item = new PianoKeyMorph( + this.target, + tuple[1], + [key, tuple[0]], + this.fontSize || MorphicPreferences.menuFontSize, + MorphicPreferences.menuFontName, + this.environment, + tuple[2], // bubble help hint + tuple[3], // color + tuple[4], // bold + tuple[5], // italic + tuple[6], // doubleclick action + label // String to change + ); + item.setPosition(keyposition); + this.add(item); + }); + fb = this.fullBounds(); + label.setPosition(new Point((fb.width() / 2) - this.fontSize, 2)); + this.add(label); + fb = this.fullBounds(); + this.bounds.setExtent(fb.extent().add(2)); +}; + +// PianoMenuMorph keyboard selecting a key: + +PianoMenuMorph.prototype.select = function(aPianoKeyItem) { + this.unselectAllItems(); + aPianoKeyItem.mouseEnter(); + this.selection = aPianoKeyItem; + this.world.keyboardFocus = this; + this.hasFocus = true; +}; + +PianoMenuMorph.prototype.unselectAllItems = function () { + this.children.forEach(item => { + if (item instanceof MenuItemMorph) { + item.mouseLeave(); + } + }); + this.changed(); +}; + +PianoMenuMorph.prototype.selectKey = function (midiNum) { + var key; + if (isNil(midiNum)) { + return; + } + key = detect( + this.children, + each => each.action === midiNum + ); + if (key) { + this.select(key); + } else { + this.selectKey(48); + } +}; + +// PianoMenuMorph keyboard navigation & entry: + +PianoMenuMorph.prototype.processKeyDown = function (event) { + // console.log(event.keyCode); + switch (event.keyCode) { + case 13: // 'enter' + case 32: // 'space' + if (this.selection) { + this.selection.mouseClickLeft(); + } + return; + case 27: // 'esc' + return this.destroy(); + case 37: // 'left arrow' + case 40: // 'down arrow' + case 189: // - + return this.selectDown(); + case 38: // 'up arrow' + case 39: // 'right arrow' + case 187: // + + case 220: // # + return this.selectUp(); + default: + switch(event.key) { + case 'C': + return this.selectKey(48); + case 'c': + return this.selectKey(60); + case 'D': + return this.selectKey(50); + case 'd': + return this.selectKey(62); + case 'E': + return this.selectKey(52); + case 'e': + return this.selectKey(64); + case 'F': + return this.selectKey(53); + case 'f': + return this.selectKey(65); + case 'G': + return this.selectKey(55); + case 'g': + return this.selectKey(67); + case 'A': + return this.selectKey(57); + case 'a': + return this.selectKey(69); + case 'B': + case 'H': + return this.selectKey(59); + case 'b': + case 'h': + return this.selectKey(71); + default: + nop(); + } + } +}; + +PianoMenuMorph.prototype.selectUp = function () { + var next = 48; + if (this.selection) { + next = this.selection.action + 1; + if (next > 72) { + next = 48; + } + } + this.selectKey(next); +}; + +PianoMenuMorph.prototype.selectDown = function () { + var next = 48; + if (this.selection) { + next = this.selection.action - 1; + if (next < 48) { + next = 72; + } + } + this.selectKey(next); +}; + +PianoMenuMorph.prototype.destroy = function () { + this.children.forEach(key => { + if (key.note) { + key.note.stop(); + } + }); + PianoMenuMorph.uber.destroy.call(this); +}; + + +// PianoKeyMorph /////////////////////////////////////////////////////// + +PianoKeyMorph.prototype = new MenuItemMorph(); +PianoKeyMorph.prototype.constructor = PianoKeyMorph; +PianoKeyMorph.uber = MenuItemMorph.prototype; + +function PianoKeyMorph( + target, + action, + labelString, // can also be a Morph or a Canvas or a tuple: [icon, string] + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction, // optional when used as list morph item + label +) { + this.init( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction, + label + ); + this.feedback = label; +} + +PianoKeyMorph.prototype.init = function ( + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction, + label +) { + // additional "note" property for sound output: + this.note = new Note(action); + PianoKeyMorph.uber.init.call( + this, + target, + action, + labelString, + fontSize, + fontStyle, + environment, + hint, + color, + bold, + italic, + doubleClickAction, + label + ); +}; + +PianoKeyMorph.prototype.createLabel = function () { + var icon; + if (this.label !== null) { + this.label.destroy(); + } + // assume its pattern is: [icon, string] + this.label = new Morph(); + icon = this.createIcon(this.labelString[0]); + this.label.add(icon); + this.bounds.setExtent(icon.extent()); + this.label.bounds = this.position().extent(this.label.extent()); + this.label.bounds.setExtent(ZERO); + this.add(this.label); +}; + +PianoKeyMorph.prototype.mouseEnter = function () { + var piano = this.parentThatIsA(PianoMenuMorph), + soundType = piano ? piano.soundType : 1; + if (piano) { + piano.unselectAllItems(); + piano.selection = this; + piano.world.keyboardFocus = piano; + piano.hasFocus = true; + } + this.label.children[0].hide(); + this.userState = 'highlight'; + this.rerender(); + this.feedback.text = this.labelString[1]; + this.feedback.fixLayout(); + this.note.play(soundType); + setTimeout( + () => this.note.stop(true), + 400 + ); +}; + +PianoKeyMorph.prototype.mouseLeave = function () { + this.note.stop(true); + this.label.children[0].show(); + this.userState = 'normal'; + this.rerender(); +}; diff --git a/elements/pl-snap/Snap/src/xml.js b/elements/pl-snap/Snap/src/xml.js new file mode 100644 index 00000000..761d65a7 --- /dev/null +++ b/elements/pl-snap/Snap/src/xml.js @@ -0,0 +1,391 @@ +/* + + xml.js + + a simple XML DOM, encoder and parser for morphic.js + + written by Jens Mönig + jens@moenig.org + + Copyright (C) 2020 by Jens Mönig + + This file is part of Snap!. + + Snap! is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + + prerequisites: + -------------- + needs morphic.js + + + hierarchy + --------- + the following tree lists all constructors hierarchically, + indentation indicating inheritance. Refer to this list to get a + contextual overview: + + Node* + XML_Element + ReadStream + + * defined in morphic.js + + + toc + --- + the following list shows the order in which all constructors are + defined. Use this list to locate code in this document: + + ReadStream + XML_Element + + + credits + ------- + Nathan Dinsmore contributed to the design and implemented a first + working version of a complete XMLSerializer. I have taken much of the + overall design and many of the functions and methods in this file from + Nathan's fine original prototype. Recently Nathan has once again + worked his magic on the parser and optimized it by an order of + magnitude. + +*/ + +/*global modules, detect, Node, isNil*/ + +/*jshint esversion: 6*/ + +// Global stuff //////////////////////////////////////////////////////// + +modules.xml = '2021-July-05'; + +// Declarations + +var ReadStream; +var XML_Element; + +// ReadStream //////////////////////////////////////////////////////////// + +// I am a sequential reading interface to an Array or String + +// ReadStream instance creation: + +function ReadStream(arrayOrString) { + this.contents = arrayOrString || ''; + this.index = 0; +} + +// ReadStream constants: + +ReadStream.prototype.nonSpace = /\S|$/g; +ReadStream.prototype.nonWord = /[\s\>\/\=]|$/g; + +// ReadStream accessing: + +ReadStream.prototype.next = function (count) { + var element, start; + if (count === undefined) { + element = this.contents[this.index]; + this.index += 1; + return element; + } + start = this.index; + this.index += count; + return this.contents.slice(start, this.index); +}; + +ReadStream.prototype.peek = function () { + return this.contents[this.index]; +}; + +ReadStream.prototype.skip = function (count) { + this.index += count || 1; +}; + +ReadStream.prototype.atEnd = function () { + return this.index > (this.contents.length - 1); +}; + +// ReadStream accessing String contents: + +ReadStream.prototype.upTo = function (str) { + var i = this.contents.indexOf(str, this.index); + return i === -1 ? '' : this.contents.slice(this.index, this.index = i); +}; + +ReadStream.prototype.peekUpTo = function (str) { + var i = this.contents.indexOf(str, this.index); + return i === -1 ? '' : this.contents.slice(this.index, i); +}; + +ReadStream.prototype.skipSpace = function () { + this.nonSpace.lastIndex = this.index; + var result = this.nonSpace.exec(this.contents); + if (result) this.index = result.index; +}; + +ReadStream.prototype.word = function () { + this.nonWord.lastIndex = this.index; + var result = this.nonWord.exec(this.contents); + return result ? this.contents.slice(this.index, this.index = result.index) : ''; +}; + +// XML_Element /////////////////////////////////////////////////////////// +/* + I am a DOM-Node which can encode itself to as well as parse itself + from a well-formed XML string. Note that there is no separate parser + object, all the parsing can be done in a single object. +*/ + +// XML_Element inherits from Node: + +XML_Element.prototype = Object.create(Node.prototype); +XML_Element.prototype.constructor = XML_Element; +XML_Element.uber = Node.prototype; + +// XML_Element preferences settings: + +XML_Element.prototype.indentation = ' '; + +// XML_Element instance creation: + +function XML_Element(tag, contents, parent) { + this.init(tag, contents, parent); +} + +XML_Element.prototype.init = function (tag, contents, parent) { + // additional properties: + this.tag = tag || 'unnamed'; + this.attributes = {}; + this.contents = contents || ''; + + // initialize inherited properties: + XML_Element.uber.init.call(this); + + // override inherited properties + if (parent) parent.addChild(this); +}; + +// XML_Element DOM navigation: (aside from what's inherited from Node) + +XML_Element.prototype.require = function (tagName, fallback) { + // answer the first direct child with the specified tagName. + // if it doesn't exist execute the fallback function or return the + // fallback value, otherwise throw an error + var child = this.childNamed(tagName); + if (!child) { + if (fallback instanceof Function) { + return fallback(); + } + if (!isNil(fallback)) { + return fallback; + } + throw new Error('Missing required element <' + tagName + '>!'); + } + return child; +}; + +XML_Element.prototype.childNamed = function (tagName) { + // answer the first direct child with the specified tagName, or null + return detect( + this.children, + child => child.tag === tagName + ); +}; + +XML_Element.prototype.childrenNamed = function (tagName) { + // answer all direct children with the specified tagName + return this.children.filter(child => child.tag === tagName); +}; + +XML_Element.prototype.parentNamed = function (tagName) { + // including myself + if (this.tag === tagName) { + return this; + } + if (!this.parent) { + return null; + } + return this.parent.parentNamed(tagName); +}; + +// XML_Element output: + +XML_Element.prototype.toString = function (isFormatted, indentationLevel) { + var result = '', + indent = '', + level = indentationLevel || 0, + key, + i; + + // spaces for indentation, if any + if (isFormatted) { + for (i = 0; i < level; i += 1) { + indent += this.indentation; + } + result += indent; + } + + // opening tag + result += ('<' + this.tag); + + // attributes, if any + for (key in this.attributes) { + if (Object.prototype.hasOwnProperty.call(this.attributes, key) + && this.attributes[key]) { + result += ' ' + key + '="' + this.escape(this.attributes[key]) + '"'; + } + } + + // contents, subnodes, and closing tag + if (!this.contents.length && !this.children.length) { + result += '/>'; + } else { + result += '>'; + result += this.escape(this.contents); + this.children.forEach(element => { + if (isFormatted) { + result += '\n'; + } + result += element.toString(isFormatted, level + 1); + }); + if (isFormatted && this.children.length) { + result += ('\n' + indent); + } + result += ''; + } + return result; +}; + +XML_Element.prototype.escape = function (string, ignoreQuotes) { + var src = isNil(string) ? '' : string.toString(), + result = '', + i, + ch; + for (i = 0; i < src.length; i += 1) { + ch = src[i]; + switch (ch) { + case '\'': + result += '''; + break; + case '\"': + result += ignoreQuotes ? ch : '"'; + break; + case '<': + result += '<'; + break; + case '>': + result += '>'; + break; + case '&': + result += '&'; + break; + case '\n': // escape CR b/c of export to URL feature + result += ' '; + break; + case '~': // escape tilde b/c it's overloaded in serializer.store() + result += '~'; + break; + default: + result += ch; + } + } + return result; +}; + +XML_Element.prototype.unescape = function (string) { + return string.replace(/&(amp|apos|quot|lt|gt|#xD|#126);/g, (_, name) => { + switch (name) { + case 'amp': return '&'; + case 'apos': return '\''; + case 'quot': return '"'; + case 'lt': return '<'; + case 'gt': return '>'; + case '#xD': return '\n'; + case '#126': return '~'; + default: console.warn('unreachable'); + } + }); +}; + +// XML_Element parsing: + +XML_Element.prototype.parseString = function (string) { + var stream = new ReadStream(string); + stream.upTo('<'); + stream.skip(); + this.parseStream(stream); +}; + +XML_Element.prototype.parseStream = function (stream) { + var key, value, ch, child; + + // tag: + this.tag = stream.word(); + stream.skipSpace(); + + // attributes: + ch = stream.peek(); + while (ch !== '>' && ch !== '/') { + key = stream.word(); + stream.skipSpace(); + if (stream.next() !== '=') { + throw new Error('Expected "=" after attribute name'); + } + stream.skipSpace(); + ch = stream.next(); + if (ch !== '"' && ch !== "'") { + throw new Error('Expected single- or double-quoted attribute value'); + } + value = stream.upTo(ch); + stream.skip(1); + stream.skipSpace(); + this.attributes[key] = this.unescape(value); + ch = stream.peek(); + } + + // empty tag: + if (ch === '/') { + stream.skip(); + if (stream.next() !== '>') { + throw new Error('Expected ">" after "/" in empty tag'); + } + return; + } + if (stream.next() !== '>') { + throw new Error('Expected ">" after tag name and attributes'); + } + + // contents and children + while (!stream.atEnd()) { + ch = stream.next(); + if (ch === '<') { + if (stream.peek() === '/') { // closing tag + stream.skip(); + if (stream.word() !== this.tag) { + throw new Error('Expected to close ' + this.tag); + } + stream.upTo('>'); + stream.skip(); + this.contents = this.unescape(this.contents); + return; + } + child = new XML_Element(null, null, this); + child.parseStream(stream); + } else { + this.contents += ch; + } + } +}; diff --git a/elements/pl-snap/Snap/src/ypr.js b/elements/pl-snap/Snap/src/ypr.js new file mode 100644 index 00000000..d3156137 --- /dev/null +++ b/elements/pl-snap/Snap/src/ypr.js @@ -0,0 +1,1444 @@ +/* + +Copyright 2012 Nathan Dinsmore + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Last changed 2017-07-04 by Jens Moenig (disabled text area overlay, introduced Sprite::isTemporary) + +*/ + +var sb = (function (sb) { + 'use strict'; + + function extend(o, p) { + var key; + for (key in p) if (p.hasOwnProperty(key)) { + o[key] = p[key]; + } + } + sb.$extend = extend; + + extend((sb.Ref = function (id) { + this.id = id; + }).prototype, { + isRef: true + }); + + extend((sb.Dictionary = function (keys, values) { + this.keys = keys; + this.values = values; + }).prototype, { + get: function (key) { + return this.values[this.keys.indexOf(key)]; + }, + set: function (key, value) { + var i = this.keys.indexOf(key); + if (i === -1) { + this.keys.push(key); + this.values.push(value); + } else { + this.values[i] = value; + } + } + }); + + sb.Color = function (rgb, a) { + this.r = (rgb / 0x100000 | 0) % 0x400 / (0x400 - 1); + this.g = (rgb / 0x400 | 0) % 0x400 / (0x400 - 1); + this.b = (rgb % 0x400) / (0x400 - 1); + this.a = a / (0x100 - 1); + }; + sb.Point = function (x, y) { + this.x = x; + this.y = y; + }; + sb.Rectangle = function (x, y, x2, y2) { + this.origin = new sb.Point(x, y); + this.corner = new sb.Point(x2, y2); + }; + + sb.indexedColors = [ + [1, 1, 1, 1], + [0, 0, 0, 1], + [1, 1, 1, 1], + [.5, .5, .5, 1], + [1, 0, 0, 1], + [0, 1, 0, 1], + [0, 0, 1, 1], + [0, 1, 1, 1], + [1, 1, 0, 1], + [1, 0, 1, 1], + [.125, .125, .125, 1], + [.25, .25, .25, 1], + [.375, .375, .375, 1], + [.625, .625, .625, 1], + [.75, .75, .75, 1], + [.875, .875, .875, 1] + ]; + (function () { + var i, r, g, b, grayVal; + for (i = 1; i <= 31; ++i) { + if (i % 4 != 0) { + grayVal = i / 32; + sb.indexedColors[i + 15] = [grayVal, grayVal, grayVal, 1]; + } + } + for (r = 0; r < 6; ++r) { + for (g = 0; g < 6; ++g) { + for (b = 0; b < 6; ++b) { + i = 40 + 36 * r + 6 * b + g; + sb.indexedColors[i] = [r / 5, g / 5, b / 5, 1]; + } + } + } + })(); + + sb.colorDepthLengths = { + 1: 1, + 2: 2, + 4: 4, + 8: 8, + 15: 5, + 16: 5, + 12: 4, + 9: 3 + }; + extend((sb.ColorStream = function (bitmap, depth) { + var i = 0, + l = bitmap.length, + b = this.bits = [], + n; + this.length = sb.colorDepthLengths[this.depth = depth]; + this.position = 0; + while (i < l) { + n = bitmap[i++]; + b.push(n / 0x80 & 1); + b.push(n / 0x40 & 1); + b.push(n / 0x20 & 1); + b.push(n / 0x10 & 1); + b.push(n / 0x8 & 1); + b.push(n / 0x4 & 1); + b.push(n / 0x2 & 1); + b.push(n & 1); + } + }).prototype, { + read: function () { + var i = this.length, + b = this.bits, + n = 0; + while (i--) { + n = n * 2 + b[this.position++]; + } + return n; + } + }); + + extend((sb.ColorStreamIndexed = function (bitmap, depth) { + sb.ColorStream.call(this, bitmap, depth); + }).prototype = Object.create(sb.ColorStream.prototype), { + next: function (b) { + var c = sb.indexedColors[this.read()]; + if (!c) return c; + b[0] = c[0]; + b[1] = c[1]; + b[2] = c[2]; + b[3] = c[3]; + } + }); + + extend((sb.ColorStreamRGB = function (bitmap, depth) { + sb.ColorStream.call(this, bitmap, depth); + this.max = Math.pow(2, this.length) - 1; + }).prototype = Object.create(sb.ColorStream.prototype), { + next: function (b) { + var c; + switch (this.depth) { + case 16: + ++this.position; + c = [this.read() / this.max, this.read() / this.max, this.read() / this.max, 1]; + if (c[0] + c[1] + c[2] === 0) { + return b[0] = b[1] = b[2] = b[3] = 0; + } + b[0] = c[0]; + b[1] = c[1]; + b[2] = c[2]; + b[3] = c[3]; + return; + case 12: + this.position += 3; + break; + } + b[0] = this.read() / this.max; + b[1] = this.read() / this.max; + b[2] = this.read() / this.max; + b[3] = 1; + } + }); + + extend((sb.ColorStream32 = function (bitmap, depth) { + this.bytes = bitmap; + if (depth === 32) { + this.next = this.nextAlpha; + } + this.position = 0; + }).prototype, { + next: function (b) { + b[0] = this.read() / 255; + b[1] = this.read() / 255; + b[2] = this.read() / 255; + b[3] = 1; + }, + nextAlpha: function (b) { + var a = this.read() / 255; + b[0] = this.read() / 255; + b[1] = this.read() / 255; + b[2] = this.read() / 255 + b[3] = a; + }, + read: function () { + return this.bytes[this.position++]; + } + }); + + sb.colorStreams = { + 1: sb.ColorStreamIndexed, + 2: sb.ColorStreamIndexed, + 4: sb.ColorStreamIndexed, + 8: sb.ColorStreamIndexed, + 15: sb.ColorStreamRGB, + 16: sb.ColorStreamRGB, + 32: sb.ColorStream32, + 24: sb.ColorStream32, + 12: sb.ColorStreamRGB, + 9: sb.ColorStreamRGB + }; + + sb.getColorStream = function (bitmap, depth) { + return new sb.colorStreams[depth](bitmap, depth); + }; + + extend((sb.Form = function (w, h, d, o, b) { + this.width = w; + this.height = h; + this.depth = d; + this.offset = o; + this.bits = b; + }).prototype, { + init: function (bm) { + if (this.bits.isBitmap) { + this.bitmap = this.bits; + } else { + this.decompress(bm); + } + this.image = document.createElement('canvas'); + this.image.width = this.width; + this.image.height = this.height; + }, + decompress: function (bm) { + var b = this.bits, + p = 0, + q = 0, + r = !!bm, + length = (i = b[p++], i <= 223 ? i : i < 255 ? (i - 224) * 256 + b[p++] : (b[p++] << 24) + (b[p++] << 16) + (b[p++] << 8) + b[p++]), + bm, i, n, d, e, f, g; + // stream = new sb.Reader().on(this.bits), + this.bitmap = bm || (bm = []); + while (p < b.length) { + i = b[p++]; + if (i > 223) { + i = i < 255 ? (i - 224) * 256 + b[p++] : (b[p++] << 24) + (b[p++] << 16) + (b[p++] << 8) + b[p++]; + } + n = i >> 2; + switch (i & 3) { + case 1: + d = b[p++]; + n *= 4; + while (n--) { + bm[q++] = d; + } + break; + case 2: + // d = stream.readBytes(4); + d = b[p++]; + e = b[p++]; + f = b[p++]; + g = b[p++]; + while (n--) { + if (r) { + bm[q++] = e; + bm[q++] = f; + bm[q++] = g; + bm[q++] = d; + } else { + bm[q++] = d; + bm[q++] = e; + bm[q++] = f; + bm[q++] = g; + } + } + break; + case 3: + while (n--) { + if (r) { + d = b[p++]; + bm[q++] = b[p++]; + bm[q++] = b[p++]; + bm[q++] = b[p++]; + bm[q++] = d; + } else { + bm[q++] = b[p++]; + bm[q++] = b[p++]; + bm[q++] = b[p++]; + bm[q++] = b[p++]; + } + } + // bm.push.apply(bm, stream.readBytes(n * 4)); + break; + } + } + }, + load: function () { + var w = this.width, + h = this.height, + x, y, i, imageData, data, context, colors, color, b; + if (this.depth === 32) { + this.image = document.createElement('canvas'); + this.image.width = this.width; + this.image.height = this.height; + data = (imageData = (context = this.image.getContext('2d')).createImageData(this.width, this.height)).data; + this.decompress(data); + context.putImageData(imageData, 0, 0); + return; + } + color = [0, 0, 0, 0]; + if (this.depth === 16) { + w = this.width += 1; + } + this.init(); + colors = sb.getColorStream(this.bitmap, this.depth); + data = (imageData = (context = this.image.getContext('2d')).createImageData(this.width, this.height)).data; + for (x = 0; x < w; ++x) { + for (y = 0; y < h; ++y) { + colors.next(color); + if (!color) continue; + i = (x * h + y) * 4; + data[i] = color[0] * 255; + data[i + 1] = color[1] * 255; + data[i + 2] = color[2] * 255; + data[i + 3] = color[3] * 255; + } + } + context.putImageData(imageData, 0, 0); + } + }); + + extend((sb.ColorForm = function (w, h, d, o, b, c) { + this.width = w; + this.height = h; + this.depth = d; + this.offset = o; + this.bits = b; + this.colors = c; + }).prototype = Object.create(sb.Form.prototype), { + load: function () { + var w = this.width, + h = this.height, + colors = this.colors, + bits, x, y, i, imageData, data, context, color; + this.init(); + data = (imageData = (context = this.image.getContext('2d')).createImageData(this.width, this.height)).data; + bits = this.bitmap; + for (x = 0; x < w; ++x) { + for (y = 0; y < h; ++y) { + color = colors[bits[x * h + y]]; + if (!color) continue; + i = (x * h + y) * 4; + data[i] = color.r * 255; + data[i + 1] = color.g * 255; + data[i + 2] = color.b * 255; + data[i + 3] = color.a * 255; + } + } + context.putImageData(imageData, 0, 0); + } + }); + + sb.fields = {}; + sb.classIDs = {}; + sb.classNames = {}; + sb.addFields = function (id, name, base, fields) { + sb.classIDs[name] = id; + sb.classNames[id] = name; + fields = fields.length ? fields.split(',') : []; + if (base) { + base = sb.fields[sb.classIDs[base]]; + if (!base) throw new Error('Initialization error'); + fields = base.concat(fields); + } + sb.fields[id] = fields; + }; + + sb.addFields(100, 'Morph', '', 'bounds,owner,submorphs,color,flags,properties'); + sb.addFields(101, 'BorderedMorph', 'Morph', 'borderWidth,borderColor'); + sb.addFields(102, 'RectangleMorph', 'BorderedMorph', ''); + sb.addFields(103, 'EllipseMorph', 'BorderedMorph', ''); + sb.addFields(104, 'AlignmentMorph', 'RectangleMorph', 'orientation,centering,hResizing,vResizing,inset'); + sb.addFields(105, 'StringMorph', 'Morph', 'fontSpec,emphasis,contents'); + + sb.addFields(-1, 'Slider', 'BorderedMorph', 'slider,value,setValueSelector,sliderShadow,sliderColor,descending,model'); + sb.addFields(-2, 'AbstractSound', '', ''); + sb.addFields(-3, 'ScriptableScratchMorph', 'Morph', 'objName,vars,blocksBin,customBlocks,isTemporary,media,costume'); + sb.addFields(-4, 'ArgMorph', 'BorderedMorph', 'labelMorph'); + sb.addFields(-5, 'PasteUpMorph', 'BorderedMorph', ''); + sb.addFields(-6, 'ScratchMedia', '', 'mediaName'); + sb.addFields(-7, 'ScrollFrameMorph', 'BorderedMorph', ''); + + sb.addFields(106, 'UpdatingStringMorph', 'StringMorph', 'format,target,getSelector,putSelector,parameter,floatPrecision,growable,stepTime'); + sb.addFields(107, 'SimpleSliderMorph', 'Slider', 'target,arguments,minVal,maxVal,truncate,sliderThickness'); + sb.addFields(108, 'SimpleButtonMorph', 'RectangleMorph', 'target,actionSelector,arguments,actWhen'); + sb.addFields(109, 'SampledSound', 'AbstractSound', 'envelopes,scaledVol,initialCount,samples,originalSamplingRate,samplesSize,scaledIncrement,scaledInitialIndex'); + sb.addFields(110, 'ImageMorph', 'Morph', 'form,transparency'); + sb.addFields(111, 'SketchMorph', 'Morph', 'originalForm,rotationCenter,rotationDegrees,rotationStyle,scalePoint,offsetWhenRotated'); + sb.addFields(123, 'SensorBoardMorph', 'Morph', 'portNum'); + sb.addFields(124, 'ScratchSpriteMorph', 'ScriptableScratchMorph', 'visibility,scalePoint,rotationDegrees,rotationStyle,volume,tempoBPM,draggable,sceneStates,lists,virtualScale,ownerSprite,subsprites,rotateWithOwner,refPos,prototype,deletedAttributes'); + sb.addFields(125, 'ScratchStageMorph', 'ScriptableScratchMorph', 'zoom,hPan,vPan,obsoleteSavedState,sprites,volume,tempoBPM,sceneStates,lists'); + sb.addFields(140, 'ChoiceArgMorph', 'ArgMorph', 'isBoolean,options,choice,getOptionsSelector'); + sb.addFields(141, 'ColorArgMorph', 'ArgMorph', ''); + sb.addFields(142, 'ExpressionArgMorph', 'ArgMorph', 'isNumber'); + sb.addFields(145, 'SpriteArgMorph', 'ArgMorph', 'morph'); + sb.addFields(147, 'BlockMorph', 'Morph', 'isSpecialForm,oldColor'); + sb.addFields(148, 'CommandBlockMorph', 'BlockMorph', 'commandSpec,argMorphs,titleMorph,receiver,selector,isReporter,isTimed,wantsName,wantsPossession'); + sb.addFields(149, 'CBlockMorph', 'CommandBlockMorph', 'nestedBlock,nextBlock'); + sb.addFields(151, 'HatBlockMorph', 'CommandBlockMorph', 'scriptNameMorph,indicatorMorph,scriptOwner,parameters,isClickable'); + sb.addFields(153, 'ScratchScriptsMorph', 'PasteUpMorph', ''); + sb.addFields(154, 'ScratchSliderMorph', 'AlignmentMorph', 'slider,sliderMin,sliderMax,variable'); + sb.addFields(155, 'WatcherMorph', 'AlignmentMorph', 'titleMorph,readout,readoutFrame,scratchSlider,watcher,isSpriteSpecific,unused,sliderMin,sliderMax,isLarge'); + sb.addFields(157, 'SetterBlockMorph', 'CommandBlockMorph', 'variable'); + sb.addFields(158, 'EventHatMorph', 'HatBlockMorph', ''); + sb.addFields(170, 'ReporterBlockMorph', 'CommandBlockMorph', 'isBoolean'); + sb.addFields(160, 'VariableBlockMorph', 'ReporterBlockMorph', ''); + sb.addFields(162, 'ImageMedia', 'ScratchMedia', 'form,rotationCenter,textBox,jpegBytes,compositeForm'); + sb.addFields(163, 'MovieMedia', 'ScratchMedia', 'fileName,fade,fadeColor,zoom,hPan,vPan,msecsPerFrame,currentFrame,moviePlaying'); + sb.addFields(164, 'SoundMedia', 'ScratchMedia', 'originalSound,volume,balance,compressedSampleRate,compressedBitsPerSample,compressedData'); + sb.addFields(165, 'KeyEventHatMorph', 'HatBlockMorph', ''); + sb.addFields(166, 'BooleanArgMorph', 'ArgMorph', ''); + sb.addFields(167, 'EventTitleMorph', 'ArgMorph', ''); + sb.addFields(168, 'MouseClickEventHatMorph', 'HatBlockMorph', ''); + sb.addFields(169, 'ExpressionArgMorphWithMenu', 'ExpressionArgMorph', 'menuMorph,getMenuSelector,specialValue'); + sb.addFields(171, 'MultilineStringMorph', 'BorderedMorph', 'fontSpec,textColor,selectionColor,lines'); + sb.addFields(172, 'ToggleButton', 'SimpleButtonMorph', 'onForm,offForm,overForm,disabledForm,isMomentary,toggleMode,isOn,isDisabled'); + sb.addFields(173, 'WatcherReadoutFrameMorph', 'BorderedMorph', ''); + sb.addFields(174, 'WatcherSliderMorph', 'SimpleSliderMorph', ''); + sb.addFields(175, 'ScratchListMorph', 'BorderedMorph', 'listName,strings,target,complex'); + sb.addFields(176, 'ScrollingStringMorph', 'BorderedMorph', 'fontSpec,showScrollbar,firstVisibleLine,textColor,selectionColor,lines'); + + sb.addFields(180, 'ScrollFrameMorph2', 'ScrollFrameMorph', ''); + sb.addFields(181, 'ListMultilineStringMorph', 'MultilineStringMorph', ''); + sb.addFields(182, 'ScratchScrollBar', 'Morph', ''); + + sb.addFields(200, 'CustomCommandBlockMorph', 'CommandBlockMorph', 'userSpec'); + sb.addFields(201, 'CustomBlockDefinition', '', 'userSpec,blockVars,isAtomic,isReporter,isBoolean,body,answer,type,category,declarations,defaults,isGlobal'); + sb.addFields(203, 'ReporterScriptBlockMorph', 'ReporterBlockMorph', ''); + sb.addFields(202, 'CommandScriptBlockMorph', 'ReporterScriptBlockMorph', ''); + sb.addFields(205, 'VariableFrame', '', 'vars'); + sb.addFields(206, 'CustomReporterBlockMorph', 'ReporterBlockMorph', 'userSpec'); + + sb.addFields(207, 'CReporterSlotMorph', 'ReporterScriptBlockMorph', ''); + + sb.addFields(300, 'StringFieldMorph', 'BorderedMorph', ''); + sb.addFields(301, 'MultiArgReporterBlockMorph', 'ReporterBlockMorph', ''); + + (function (C, p) { + + p.on = function (bytes) { + this.bytes = bytes; + if (!bytes.subarray) bytes.subarray = bytes.slice; + this.position = 0; + return this; + }; + p.readYPR = function (bytes) { + var version, infoSize, info, stage; + console.time('readSB'); + this.on(bytes); + + // skip header + this.matchBytes([66, 108, 111, 120, 69, 120, 112, 86]); + version = +(String.fromCharCode(this.next()) + String.fromCharCode(this.next())); + if (version < 1) { + throw new Error('Invalid version'); + } + + // read info + infoSize = this.uint32(); + info = this.read(); + + this.position = infoSize + 14; // header + uint32 + stage = this.read(); + + this.onload({ + reader: this, + info: info, + stage: stage + }); + console.timeEnd('readSB'); + }; + p.readInfo = function (bytes) { + var version, infoSize, info; + this.on(bytes); + + this.matchBytes([66, 108, 111, 120, 69, 120, 112, 86]); + version = +(String.fromCharCode(this.next()) + String.fromCharCode(this.next())); + if (version < 1) { + throw new Error('Invalid version'); + } + + // read info + infoSize = this.uint32(); + info = this.read(); + + this.onload({ + reader: this, + info: info + }); + }; + p.read = function () { + var i, objectCount; + this.objects = []; + this.readHeader(); + objectCount = this.uint32(); + + i = objectCount; + while (i--) { + this.objects.push(this.readObject()); + } + i = objectCount; + while (i--) { + this.fixReferences(this.objects[i]); + } + return this.objects[0][1]; + }; + p.fixReferences = function (object) { + var classID = object[0], + value = object[1], + i = 0, + fields, source; + if (classID < 99) { + this.fixFixedFormat(classID, value); + } else { + this.fixArray(object[3]); + fields = sb.fields[classID]; + if (!fields) + throw new Error('Invalid class ID ' + classID); + source = value.fields; + delete value.fields; + value.className = sb.classNames[classID]; + i = fields.length; + while (i--) { + value[fields[i]] = source[i]; + } + } + }; + p.fixArray = function (a) { + var i = a.length, + o; + while (i--) { + if ((o = a[i]) && o.isRef) { + if (o.id > this.objects.length) { + throw new Error('Invalid object reference'); + } + a[i] = this.objects[o.id - 1][1]; + } + } + }; + p.targetObjectFor = function (o) { + if (o && o.isRef) { + if (o.id > this.objects.length) + throw new Error('Invalid object reference'); + return this.objects[o.id - 1][1]; + } + return o; + }; + p.fixFixedFormat = function (classID, object) { + switch (classID) { + case 20: // Array + case 21: // OrderedCollection + case 22: // Set + case 23: // IdentitySet + this.fixArray(object); + return object; + case 24: // Dictionary + case 25: // IdentityDictionary + this.fixArray(object.keys); + this.fixArray(object.values); + break; + case 32: // Point + object.x = this.targetObjectFor(object.x); + object.y = this.targetObjectFor(object.y); + break; + case 33: // Rectangle + object.origin.x = this.targetObjectFor(object.origin.x); + object.origin.y = this.targetObjectFor(object.origin.y); + object.corner.x = this.targetObjectFor(object.corner.x); + object.corner.y = this.targetObjectFor(object.corner.y); + break; + case 34: // Form + object.offset = this.targetObjectFor(object.offset); + object.bits = this.targetObjectFor(object.bits); + object.load(); + break; + case 35: // ColorForm + object.offset = this.targetObjectFor(object.offset); + object.bits = this.targetObjectFor(object.bits); + object.colors = this.targetObjectFor(object.colors); + object.load(); + break; + } + return object; + }; + p.readObject = function () { + var classID = this.next(), + version, fieldCount, fields; + if (classID > 99) { + version = this.next(); + fieldCount = this.next(); + fields = []; + while (fieldCount--) { + fields.push(this.readField()); + } + return [classID, { fields: fields }, version, fields]; + } + return [classID, this.readFixedFormat(classID)]; + }; + p.readField = function () { + var classID = this.next(); + if (classID === 99) { + return new sb.Ref(this.uint24()); + } + return this.readFixedFormat(classID); + }; + p.readFixedFormat = function (classID) { + var a, n; + switch (classID) { + case 1: // UndefinedObject + return null; + case 2: // True + return true; + case 3: // False + return false; + case 4: // SmallInteger + return this.int32(); + case 5: // SmallInteger16 + return this.int16(); + case 6: // LargePositiveInteger + case 7: // LargeNegativeInteger + n = this.uint16(); + a = 0; + while (n--) { + a *= 0x100; + a += this.next(); + } + return a; + case 8: // Float + return this.float64(); + case 9: // String + case 10: // Symbol + case 14: // UTF8 + a = [].slice.call(this.readBytes(n = this.uint32())); + while (n--) { + a[n] = String.fromCharCode(a[n]); + } + return a.join(''); + case 11: // ByteArray + return this.readBytes(this.uint32()); + case 12: // SoundBuffer + a = []; + n = this.uint32(); + while (n--) { + a.push(this.int16()); + } + return a; + case 13: // Bitmap + a = []; + a.isBitmap = true; + n = this.uint32(); + while (n--) { + a.push(this.uint32()); + } + return a; + case 20: // Array + case 21: // OrderedCollection + case 22: // Set + case 23: // IdentitySet + a = []; + n = this.uint32(); + while (n--) { + a.push(this.readField()); + } + return a; + case 24: // Dictionary + case 25: // IdentityDictionary + a = new sb.Dictionary([], []); + n = this.uint32(); + while (n--) { + a.keys.push(this.readField()); + a.values.push(this.readField()); + } + return a; + case 30: // Color + return new sb.Color(this.uint32(), 255); + case 31: // TranslucentColor + return new sb.Color(this.uint32(), this.uint8()); + case 32: // Point + return new sb.Point(this.readField(), this.readField()); + case 33: // Rectangle + return new sb.Rectangle(this.readField(), this.readField(), this.readField(), this.readField()); + case 34: // Form + return new sb.Form(this.readField(), this.readField(), this.readField(), this.readField(), this.readField()); + case 35: // ColorForm + return new sb.ColorForm(this.readField(), this.readField(), this.readField(), this.readField(), this.readField(), this.readField()); + } + throw new Error('Invalid fixed-format class ID'); + }; + p.readHeader = function () { + this.matchBytes([79, 98, 106, 83, 1, 83, 116, 99, 104, 1]); + }; + p.readBytes = function (length) { + return this.bytes.subarray(this.position, this.position += length); + }; + p.matchBytes = function (bytes) { + var i = bytes.length, + r = this.readBytes(i); + while (i--) { + if (r[i] !== bytes[i]) { + throw new Error('Invalid format'); + } + } + }; + p.skip = function (length) { + this.position += length; + }; + p.next = p.uint8 = function () { + return this.bytes[this.position++]; + }; + p.hasNext = function () { + return this.position < this.bytes.length; + }; + p.uint16 = function () { + return this.next() * 0x100 + this.next(); + }; + p.uint24 = function () { + return this.next() * 0x10000 + this.next() * 0x100 + this.next(); + }; + p.uint32 = function () { + return this.next() * 0x1000000 + this.next() * 0x10000 + this.next() * 0x100 + this.next(); + }; + p.int8 = function () { + var v = this.bytes[++this.position]; + return v >= 0x80 ? v - 0x100 : v; + }; + p.int16 = function () { + var d = this.next(), + v = d * 0x100 + this.next(); + return d >= 0x80 ? v - 0x10000 : v; + }; + p.int24 = function () { + var d = this.next(), + v = d * 0x10000 + this.next() * 0x100 + this.next(); + return d >= 0x80 ? v - 0x1000000 : v; + }; + p.int32 = function () { + var d = this.next(), + v = d * 0x1000000 + this.next() * 0x10000 + this.next() * 0x100 + this.next(); + return d >= 0x80 ? v - 0x100000000 : v; + }; + p.string = function () { + var length = this.uint16(), + bytes = this.readBytes(length), + i = length; + while (i--) { + bytes[i] = String.fromCharCode(bytes[i]); + } + return bytes.join(''); + }; + p.float64 = function () { + return this.ieee(8, 11, 52, 1023); + }; + p.ieee = function (n, ebits, mbits) { + var bias = (1 << (ebits - 1)) - 1, + string = '', + i = n, + b, sign, exponent, mantissa, result; + while (i--) { + b = this.next().toString(2); + string = string + Array(9 - b.length).join('0') + b; + } + sign = string.charAt(0) === '0' ? 1 : -1; + exponent = parseInt(string.substr(1, ebits), 2); + mantissa = parseInt(string.substr(ebits + 1), 2); + if (exponent === 0) { + return mantissa === 0 ? sign * 0 : sign * Math.pow(2, 1 - bias) * mantissa / Math.pow(2, mbits); + } + if (exponent === (1 << ebits) - 1) { + return mantissa === 0 ? sign / 0 : NaN; + } + return sign * Math.pow(2, exponent - bias) * (1 + mantissa / Math.pow(2, mbits)); + }; + + })(sb.Reader = function () {}, sb.Reader.prototype); + + (function (C, p) { + + var rotationStyles = { + normal: 1, + leftRight: 2, + none: 0 + }, customBlockInputs = { + object: '%obj', + objectList: '%mult%obj', + number: '%n', + numberList: '%mult%n', + text: '%txt', + textList: '%mult%txt', + list: '%l', + listList: '%mult%l', + any: '%s', + anyList: '%mult%s', + 'boolean': '%b', + booleanList: '%mult%b', + command: '%cmdRing', + commandList: '%mult%cmdRing', + reporter: '%repRing', + reporterList: '%mult%repRing', + predicate: '%predRing', + predicateList: '%mult%predRing', + loop: '%cs', + loopList: '%mult%cs', + unevaluated: '%anyUE', + unevaluatedList: '%mult%anyUE', + unevaluatedBoolean: '%boolUE', + unevaluatedBooleanList: '%mult%boolUE', + template: '%upvar' + }, blockSelectors = { + // Motion': '', + 'forward:': 'forward', + 'turnLeft:': 'turnLeft', + 'turnRight:': 'turn', + 'heading:': 'setHeading', + 'pointTowards:': 'doFaceTowards', + 'gotoX:y:': 'gotoXY', + 'gotoSpriteOrMouse:': 'doGotoObject', + 'glideSecs:toX:y:elapsed:from:': 'doGlide', + 'changeXposBy:': 'changeXPosition', + 'xpos:': 'setXPosition', + 'changeYposBy:': 'changeYPosition', + 'ypos:': 'setYPosition', + 'bounceOffEdge': 'bounceOffEdge', + 'xpos': 'xPosition', + 'ypos': 'yPosition', + 'heading': 'direction', + + // Looks + 'lookLike:': 'doSwitchToCostume', + 'showBackground:': 'doSwitchToCostume', + 'nextCostume': 'doWearNextCostume', + 'nextBackground': 'doWearNextCostume', + 'costumeIndex': 'getCostumeIdx', + 'say:duration:elapsed:from:': 'doSayFor', + 'say:': 'bubble', + 'think:duration:elapsed:from:': 'doThinkFor', + 'think:': 'doThink', + 'changeGraphicEffect:by:': 'changeEffect', + 'setGraphicEffect:to:': 'setEffect', + 'filterReset': 'clearEffects', + 'setSizeTo:': 'setScale', + 'changeSizeBy:': 'changeScale', + 'scale': 'getScale', + 'show': 'show', + 'hide': 'hide', + 'comeToFront': 'comeToFront', + 'goBackByLayers:': 'goBack', + + // Sound + 'playSound:': 'playSound', + 'doPlaySoundAndWait': 'doPlaySoundUntilDone', + 'stopAllSounds': 'doStopAllSounds', + // 'drum:duration:elapsed:from:': '', + 'rest:elapsed:from:': 'doRest', + 'noteOn:duration:elapsed:from:': 'doPlayNote', + // 'midiInstrument:': '', + // 'changeVolumeBy:': '', + // 'setVolumeTo:': '', + // 'volume': '', + 'changeTempoBy:': 'doChangeTempo', + 'setTempoTo:': 'doSetTempo', + 'tempo': 'getTempo', + + // Pen + 'clearPenTrails': 'clear', + 'putPenDown': 'down', + 'putPenUp': 'up', + 'penColor:': 'setColor', + 'changePenHueBy:': 'changeHue', + 'setPenHueTo:': 'setHue', + '_changePenHueBy:': 'changeHue', + '_setPenHueTo:': 'setHue', + 'changePenShadeBy:': 'changeBrightness', + 'setPenShadeTo:': 'setBrightness', + 'changePenSizeBy:': 'changeSize', + 'penSize:': 'setSize', + 'stampCostume': 'doStamp', + + // Control + // 'whenStartClicked': '', + // 'whenKeyPressed:': '', + // 'whenSpriteClicked': '', + 'wait:elapsed:from:': 'doWait', + 'doForever': 'doForever', + 'doRepeat': 'doRepeat', + 'broadcast:': 'doBroadcast', + 'doBroadcastAndWait': 'doBroadcastAndWait', + // 'whenMessageReceived:': '', + // TODO 'doForeverIf': '', + 'doIf': 'doIf', + 'doIfElse': 'doIfElse', + 'doWaitUntil': 'doWaitUntil', + 'doUntil': 'doUntil', + 'doReturn': 'doStop', + 'stopAll': 'doStopAll', + 'doRun': 'doRun', + 'doRunBlockWithArgs': 'doRun', + 'doRunBlockWithArgList': 'doRun', + 'doFork': 'fork', + 'doForkBlockWithArgs': 'fork', + 'doForkBlockWithArgList': 'fork', + 'doReport': 'evaluate', + 'doCallBlockWithArgs': 'evaluate', + 'doCallBlockWithArgList': 'evaluate', + 'doAnswer': 'doReport', + 'doStopBlock': 'doStopBlock', + // 'doPauseThread': '', + // 'doPauseThreadReporter': '', + + // Sensing + 'touching:': 'reportTouchingObject', + 'touchingColor:': 'reportTouchingColor', + 'color:sees:': 'reportColorIsTouchingColor', + 'doAsk': 'doAsk', + 'answer': 'reportLastAnswer', + 'mouseX': 'reportMouseX', + 'mouseY': 'reportMouseY', + 'mousePressed': 'reportMouseDown', + 'keyPressed:': 'reportKeyPressed', + 'distanceTo:': 'reportDistanceTo', + 'timerReset': 'doResetTimer', + 'timer': 'reportTimer', + 'getAttribute:of:': 'reportAttributeOf', + // 'attribute:of:': '', + // 'soundLevel': '', + // 'isLoud': '', + // 'sensor:': '', + // 'sensorPressed:': '', + // 'getObject:': '', + // 'get:': '', + + // Operators + '+': 'reportSum', + '-': 'reportDifference', + '*': 'reportProduct', + '/': 'reportQuotient', + 'randomFrom:to:': 'reportRandom', + '<': 'reportLessThan', + '=': 'reportEquals', + '>': 'reportGreaterThan', + '&': 'reportAnd', + '|': 'reportOr', + 'not': 'reportNot', + 'getTrue': 'reportTrue', + 'getFalse': 'reportFalse', + 'concatenate:with:': 'reportJoinWords', + 'letter:of:': 'reportLetter', + 'stringLength:': 'reportStringSize', + 'asciiCodeOf:': 'reportUnicode', + 'asciiLetter:': 'reportUnicodeAsLetter', + '\\\\': 'reportModulus', + 'rounded': 'reportRound', + 'computeFunction:of:': 'reportMonadic', + 'isObject:type:': 'reportIsA', + // 'procedure': 'reifyScript', + // 'procedureWithArgs': 'reifyScript', + // 'function': 'reifyReporter', + // 'functionWithArgs': 'reifyReporter', + // 'spawn': '', + + // Variables + 'setVar:to:': 'doSetVar', + 'changeVar:by:': 'doChangeVar', + // 'deleteObject:': '', + 'showVariable:': 'doShowVar', + 'hideVariable:': 'doHideVar', + 'doDeclareVariables': 'doDeclareVariables', + 'newList:': 'reportNewList', + 'append:toList:': 'doAddToList', + 'deleteLine:ofList:': 'doDeleteFromList', + 'insert:at:ofList:': 'doInsertInList', + 'setLine:ofList:to:': 'doReplaceInList', + 'getLine:ofList:': 'reportListItem', + 'lineCountOfList:': 'reportListLength', + 'list:contains:': 'reportListContainsItem', + // 'contentsOfList:': '', + // 'copyOfList:': '' + + // Kludge + _warp: 'doWarp' + }; + + function escapeXML(string) { + // over-cautious due to some morphic bugs + return string.replace(/&/g, '&')/*.replace(/[\n\r]|\r\n/g, ' ')*/.replace(/'); + this.children.forEach(function (child) { + if (!child.toXML) { + console.error('Invalid', child); + } + child.toXML(string); + }); + string.push(''); + } else { + string.push('/>'); + } + }; + Element.prototype.toDOM = function () { + var el = document.createElement(this.tagName), + attributes = this.attributes, key, + children = this.children, i = 0, child; + for (key in attributes) if (attributes.hasOwnProperty(key)) { + el.setAttribute(key, attributes[key]); + } + while (child = children[i++]) { + el.appendChild(child.toDOM()); + } + return el; + }; + + function n(tagName, attributes, children) { + var el = new Element(tagName), key; + el.attributes = attributes || {}; + el.children = children || []; + return el; + } + function t(value) { + return new Text(value); + } + + p.write = function (projectName, project) { + var a, xml, out, objectID = 0, customBlocks = {}; + function id(n) { + return n.attributes.id ? n('ref', { id: n.attributes.id }) : n.attributes.id = ++objectID, n; + } + function preCustomBlocks(scope, blocks) { + var sc = customBlocks[scope] = {}; + if (!blocks) return; + blocks.forEach(function (ypr) { + sc[ypr.userSpec] = ypr; + ypr.userSpec = ypr.userSpec.replace(/^\s+|\s+$/g, '').replace(/\s{2,}/g, ' ').replace(/'/g, ''); + ypr.__blockSpec__ = ypr.userSpec.replace(/%(\S+)/g, function (_, name) { + var type = customBlockInputs[ypr.declarations.get(name)]; + if (type === undefined) { + if (ypr.declarations.get(name) === undefined) { + type = '%s'; + } else { + console.warn('Missing input type ' + ypr.declarations.get(name)); + } + } + return type; + }); + ypr.__types__ = (ypr.userSpec.match(/%\S+/g) || []).map(function (arg) { + return ypr.declarations.get(arg.substr(1)) || 'any'; + }); + }); + } + function nsCustomBlocks(blocks, globals) { + if (!blocks) return []; + return (globals ? blocks : blocks.filter(function (b) { return !b.isGlobal })).map(function (ypr) { + var args = (ypr.userSpec.match(/%\S+/g) || []).map(function (arg) { + var name = arg.substr(1), + type = customBlockInputs[ypr.declarations.get(name)]; + if (type === undefined) { + type = '%s'; + } + return n('input', { + type: type + }, [t(ypr.defaults.get(name))]); + }), + spec = ypr.userSpec.replace(/%(\S+)/g, '%\'$1\''); + ypr.body = ypr.body || []; + if (ypr.answer && ypr.answer.pop) { + ypr.body.push(['byob', '', 'doAnswer', ypr.answer[0]]); + } + if (ypr.blockVars.length) { + ypr.body.unshift(['byob', '', 'doDeclareVariables'].concat(ypr.blockVars.map(function (n) { + return [0, 0, 0, n]; + }))); + } + if (ypr.isAtomic) { + ypr.body = [['byob', '', '_warp', ypr.body]]; + } + return n('block-definition', { + s: spec, + // type: ypr.isBoolean ? 'predicate' : ypr.isReporter ? 'reporter' : 'command', + type: ypr.type === 'boolean' ? 'predicate' : ypr.answer !== null ? 'reporter' : 'command', + category: + ypr.category === 'none' ? 'other' : + ypr.category === 'list' ? 'lists' : ypr.category + }, [ + n('inputs', {}, args), + n('script', {}, nsScript(ypr.body)) + ]); + }); + } + function nsScript(script) { + return script.map(function (block) { + return nBlock(block); + }); + } + function nBlock(block) { + var node, a; + node = n('block'); + switch (block[2]) { + case 'EventHatMorph': + if (block[3] === 'Scratch-StartClicked') { + node.attributes.s = 'receiveGo'; + } else { + node.attributes.s = 'receiveMessage'; + node.children.push(n('l', {}, [t(block[3])])); + } + return node; + case 'MouseClickEventHatMorph': + node.attributes.s = 'receiveClick'; + return node; + case 'KeyEventHatMorph': + node.attributes.s = 'receiveKey'; + node.children.push(n('l', {}, [t(block[3])])); + return node; + case 'doRunBlockWithArgs': + case 'doCallBlockWithArgs': + case 'doForkBlockWithArgs': + a = block.length - 5; + while (a--) { + if (block[5 + a].pop) { + block[5 + a] = ['block', '', [block[5 + a]]]; + } + } + a = { + className: 'ScratchListMorph', + complex: block.slice(5) + }; + block = block.slice(0, 4); + block.push(a); + break; + case 'doRunBlockWithArgList': + case 'doCallBlockWithArgList': + case 'doForkBlockWithArgList': + a = block[5]; + block = block.slice(0, 4); + block.push(a); + break; + case 'doDeclareVariables': + block = ['byob', '', 'doDeclareVariables', { + className: 'ScratchListMorph', + complex: block.slice(3).map(function (block) { + return block[3]; + }) + }]; + break; + case 'getLine:ofList:': + case 'append:toList:': + case 'deleteLine:ofList:': + case 'setLine:ofList:to:': + case 'getLine:ofList:': + case 'insert:at:ofList:': + case 'lineCountOfList:': + case 'list:contains:': + a = block[2] === 'insert:at:ofList:' ? 5 : + block[2] === 'lineCountOfList:' || block[2] === 'list:contains:' ? 3 : 4; + if (typeof block[a] === 'string') { + block[a] = block[a] === '' ? null : ['byob', '', 'readVariable', block[a]]; + } + break; + case 'readBlockVariable': + case 'readVariable': + case 'listNamed:': + node.attributes['var'] = block[3]; + return node; + case 'function': + case 'functionWithArgs': + node.attributes.s = 'reifyReporter'; + block.pop(); + node.children.push(n('autolambda', {}, [nBlock(block[8])])); + if (block[2] === 'functionWithArgs') { + node.children.push(n('list', {}, block.slice(9).map(function (arg) { + return n('l', {}, [t(arg[3])]); + }))); + } + return node; + case 'procedure': + case 'procedureWithArgs': + node.attributes.s = 'reifyScript'; + node.children.push(n('script', {}, nsScript(block.pop()))); + node.children.push(n('list', {}, block.slice(8).map(function (arg) { + return n('l', {}, [t(arg[3])]); + }))); + return node; + case 'autoBlock': + case 'autoPredicate': + node.attributes.s = block[2] === 'autoPredicate' ? 'reifyPredicate' : 'reifyReporter'; + node.children.push(n('autolambda', {}, block[3] ? [nBlock(block[3][0])] : [])); + return node; + case 'concatenate:with:': + block = block.slice(0, 3).concat({ + className: 'ScratchListMorph', + complex: block.slice(3) + }); + a = 2; + while (a--) { + if (block[3].complex[a].pop) { + block[3].complex[a] = ['block', '', [block[3].complex[a]]]; + } + } + break; + case 'loopLambda': + return n('script', {}, block[8] ? nsScript(block[8]) : []); + case 'autoLambda': + // node.attributes.s = block[2] === 'loopLambda' ? 'reifyScript' : 'reifyReporter'; + node.attributes.s = 'reifyScript'; + node.children.push(n('script', {}, block[8] ? nsScript(block[8]) : [])); + return node; + case 'changeVariable': + case 'changeBlockVariable': + block = [0, 0, block[4], block[3], block[block[2] === 'changeBlockVariable' ? 6 : 5]]; + break; + case 'distanceTo:': + case 'gotoSpriteOrMouse:': + case 'pointTowards:': + case 'touching:': + if (block[3] === 'mouse') { + block[3] = 'mouse-pointer'; + } else { + block[3] = block[3].objName; + } + break; + case 'doForeverIf': + block = [0, 0, 'doForever', [[0, 0, 'doIf', block[3], block[4]]]] + break; + case '\\\\': + case '+': + case '-': + case '*': + case '/': + if (block[3] === ' ') { + block[3] = ''; + } + if (block[4] === ' ') { + block[4] = ''; + } + break; + case 'setPenHueTo:': + case 'changePenHueBy:': + block[3] = ['byob', 0, '/', block[3], '2']; + break; + } + if (block[2] === 'doCustomBlock') { + a = customBlocks[block[1] === 'Stage' ? '__global__' : block[1]][block[3]]; + node = n('custom-block', { + s: a.__blockSpec__ + }); + if (block[1] !== 'Stage' && !a.isGlobal) { + node.attributes.scope = block[1]; + } + a.__types__.forEach(function (type, i) { + if (type === 'template') { + block[4 + i] = block[4 + i][3]; + } + }); + block.shift(); + } else { + if ((node.attributes.s = blockSelectors[block[2]]) === undefined) { + console.warn('Missing selector mapping for "' + block[2] + '"', block); + } + } + block.slice(3).forEach(function (arg) { + if (arg && arg.pop) { + if (typeof arg[0] === 'string') { + node.children.push(nBlock(arg)); + } else { + node.children.push(n('script', {}, nsScript(arg))); + } + } else { + a = nValue(arg); + delete a.attributes.id; + node.children.push(a); + } + }); + return node; + } + function nsVariables(vars, lists) { + return vars.keys.map(function (key, i) { + return n('variable', { name: key }, [nValue(vars.values[i], true)]); + }).concat(lists.keys.map(function (key, i) { + return n('variable', { name: key }, [nValue(lists.values[i], true)]); + })); + } + function nValue(value, listHasItems) { + return typeof value === 'string' || typeof value === 'number' ? n('l', {}, [t(value)]) : + value == null || typeof value === 'boolean' ? n('l') : + value.className === 'ScratchListMorph' ? id(n('list', {}, value.complex.map(function (object, i) { + var item = object == null ? n('l', {}, [t((item = value.strings[i]) === 'nil' ? '' : item)]) : + typeof object === 'string' ? nValue(object) : + object && object[0] === 'block' ? nsScript(object[2])[0] : n('l'); + return listHasItems ? n('item', {}, [item]) : item; + }))) : + // (function () { throw 'Unimplemented' })(); + value.constructor === sb.Color ? n('color', {}, [t([value.r * 255, value.g * 255, value.b * 255, value.a * 255])]) : + value.constructor === sb.Dictionary ? id(n('list')) : + (function () { console.warn('No serializer for', value); return n('__undefined__') })(); + } + function nsCostumes(media) { + return [id(n('list', {}, media.filter(function (m) { return m.className === 'ImageMedia' }).map(function (c) { + return n('item', {}, [ + n('costume', { + name: c.mediaName, + 'center-x': c.rotationCenter.x, + 'center-y': c.rotationCenter.y, + image: c.form.image.toDataURL() + }) + ]); + })))]; + } + function nsSounds(media) { + if (media.filter(function (m) { return m.className === 'SoundMedia' }).length > 0) { + console.warn('Sounds are unimplemented'); + } + return [id(n('list'))]; + } + function nsScripts(scripts) { + return scripts.map(function (script) { + if (script[1][0] && script[1][0][2] === 'scratchComment') { + return n('comment', { + x: script[0].x, + y: script[0].y, + w: script[1][0][5], + collapsed: !script[1][0][4] + }, [t(script[1][0][3])]); + } + return n('script', { + x: script[0].x, + y: script[0].y + }, nsScript(script[1])); + }); + } + function nsSprites(sprites, vars, lists) { + return sprites.map(function (sprite, i) { + return id(n('sprite', { + name: sprite.objName, + x: (sprite.bounds.origin.x + sprite.bounds.corner.x) / 2 - 240, + y: 180 - (sprite.bounds.origin.y + sprite.bounds.corner.y) / 2, + hidden: sprite.flags === 1, + heading: sprite.rotationDegrees + 90, + scale: sprite.scalePoint.x, + rotation: rotationStyles[sprite.rotationStyle], + draggable: sprite.draggable, + costume: costumeIndex(sprite), + color: (sprite.color.r * 255 | 0) + ',' + (sprite.color.g * 255 | 0) + ',' + (sprite.color.b * 255 | 0), + pen: 'tip', + idx: i + }, [ + n('variables', {}, nsVariables(sprite.vars, sprite.lists)), + n('costumes', {}, nsCostumes(sprite.media)), + n('sounds', {}, nsSounds(sprite.media)), + n('blocks', {}, nsCustomBlocks(sprite.customBlocks, false)), + n('scripts', {}, nsScripts(sprite.blocksBin)) + ])); + }).concat(vars.keys.concat(lists.keys).map(function (name) { + return n('watcher', { + 'var': name, + style: 'normal', + x: 10, + y: 10, + color: '243,118,29', + hidden: true + }); + })); + } + + console.log(project); + preCustomBlocks('__global__', project.stage.customBlocks); + project.stage.sprites.forEach(function (sprite) { + preCustomBlocks(sprite.objName, sprite.customBlocks); + }); + xml = n('project', { + name: projectName, + app: 'Snap! 4.0, http://snap.berkeley.edu; serialized by yprxml, http://dl.dropbox.com/u/10715865/Web/snap/app/yprxml.html', + version: '1' + }, [ + n('notes', {}, [t(project.info.get('comment') || '')]), + n('thumbnail', {}, [t((a = project.info.get('thumbnail')) ? a.image.toDataURL() : '')]), + id(n('stage', { + name: 'Stage', + tempo: project.stage.tempoBPM, + costume: costumeIndex(project.stage), + threadsafe: 'false', + scheduled: true + }, [ + n('pentrails', {}, [t((a = project.info.get('penTrails')) ? a.image.toDataURL() : '')]), + n('costumes', {}, nsCostumes(project.stage.media)), + n('sounds', {}, nsSounds(project.stage.media)), + n('blocks', {}, []), + n('variables', {}, []), + n('scripts', {}, nsScripts(project.stage.blocksBin)), + n('sprites', {}, nsSprites(project.stage.sprites, project.stage.vars, project.stage.lists)) + ])), + n('variables', {}, nsVariables(project.stage.vars, project.stage.lists)), + n('blocks', {}, nsCustomBlocks(project.stage.customBlocks, true)) + ]); + xml.toXML(out = []); + // var d = document.createElement('textarea'); + // d.style.position = 'absolute'; + // document.body.appendChild(d).value = out.join(''); + return out.join(''); + }; + + })(sb.XMLWriter = function () {}, sb.XMLWriter.prototype); + + return sb; + +})({}); diff --git a/elements/pl-snap/Snap/sw.js b/elements/pl-snap/Snap/sw.js new file mode 100644 index 00000000..cdd183f2 --- /dev/null +++ b/elements/pl-snap/Snap/sw.js @@ -0,0 +1,800 @@ +var snapVersion = '9.2.10', + cacheName = `snap-pwa-${snapVersion}`, + filesToCache = [ + 'snap.html', + + // program + 'src/morphic.js', + 'src/symbols.js', + 'src/widgets.js', + 'src/blocks.js', + 'src/threads.js', + 'src/objects.js', + 'src/scenes.js', + 'src/gui.js', + 'src/paint.js', + 'src/lists.js', + 'src/byob.js', + 'src/tables.js', + 'src/sketch.js', + 'src/video.js', + 'src/maps.js', + 'src/extensions.js', + 'src/xml.js', + 'src/store.js', + 'src/locale.js', + 'src/cloud.js', + 'src/api.js', + 'src/sha512.js', + 'src/FileSaver.min.js', + + // translations + 'locale/lang-ar.js', + 'locale/lang-bg.js', + 'locale/lang-bn.js', + 'locale/lang-ca.js', + 'locale/lang-ca_VA.js', + 'locale/lang-cs.js', + 'locale/lang-de.js', + 'locale/lang-dk.js', + 'locale/lang-el.js', + 'locale/lang-eo.js', + 'locale/lang-es.js', + 'locale/lang-et.js', + 'locale/lang-eu.js', + 'locale/lang-fi.js', + 'locale/lang-fr.js', + 'locale/lang-gl.js', + 'locale/lang-he.js', + 'locale/lang-hi.js', + 'locale/lang-hr.js', + 'locale/lang-hu.js', + 'locale/lang-ia.js', + 'locale/lang-id.js', + 'locale/lang-it.js', + 'locale/lang-ja_HIRA.js', + 'locale/lang-ja.js', + 'locale/lang-kn.js', + 'locale/lang-ko.js', + 'locale/lang-ml.js', + 'locale/lang-nl.js', + 'locale/lang-no.js', + 'locale/lang-pl.js', + 'locale/lang-pt_BR.js', + 'locale/lang-pt.js', + 'locale/lang-ro.js', + 'locale/lang-ru.js', + 'locale/lang-si.js', + 'locale/lang-sk.js', + 'locale/lang-sv.js', + 'locale/lang-ta.js', + 'locale/lang-te.js', + 'locale/lang-ti.js', + 'locale/lang-tr.js', + 'locale/lang-ua.js', + 'locale/lang-zh_CN.js', + 'locale/lang-zh_TW.js', + + //libraries + 'libraries/LIBRARIES', + + 'libraries/animation_module.xml', + 'libraries/apl.xml', + 'libraries/audioComp_module.xml', + 'libraries/bar-charts.xml', + 'libraries/biginteger.js', + 'libraries/bignumbers.xml', + 'libraries/bignums.js', + 'libraries/bitwise.xml', + 'libraries/bbtSnapExtension.js', + 'libraries/colors.xml', + 'libraries/crayons.xml', + 'libraries/Eisenbergification.xml', + 'libraries/frequency_distribution_module.xml', + 'libraries/httpBlocks.xml', + 'libraries/HummingbirdBlocks.xml', + 'libraries/iteration-composition.xml', + 'libraries/leap-library.xml', + 'libraries/list_comprehension_module.xml', + 'libraries/list-utilities.xml', + 'libraries/localstorage_module.xml', + 'libraries/tiles_module.xml', + 'libraries/arcs_module.xml', + 'libraries/make-variables.xml', + 'libraries/maps_module.xml', + 'libraries/menu_module.xml', + 'libraries/mqttExtension.js', + 'libraries/mqtt.js', + 'libraries/mqtt.xml', + 'libraries/parallel_module.xml', + 'libraries/pixel_module.xml', + 'libraries/plot_bars_module.xml', + 'libraries/replace_letters_module.xml', + 'libraries/schemeNumber.js', + 'libraries/SciSnapExtensions.js', + 'libraries/SciSnap!2Blocks.xml', + + 'libraries/TuneScope.xml', + + // TuneScope dependencies + 'libraries/TuneScope/TuneScope.js', + 'libraries/TuneScope/TS_init.js', + 'libraries/TuneScope/webmidi.iife.js', + 'libraries/TuneScope/WebAudioFontPlayer.js', + + // TuneScope instruments + 'libraries/TuneScope/12849_21_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/12848_21_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/12847_21_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/12846_0_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/12842_0_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/12835_21_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/12840_6_JCLive_sf2_file.js', + 'libraries/TuneScope/12869_6_JCLive_sf2_file.js', + 'libraries/TuneScope/0580_GeneralUserGS_sf2_file.js', + 'libraries/TuneScope/0560_GeneralUserGS_sf2_file.js', + 'libraries/TuneScope/0110_GeneralUserGS_sf2_file.js', + 'libraries/TuneScope/0680_JCLive_sf2_file.js', + 'libraries/TuneScope/0121_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/1070_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/0460_GeneralUserGS_sf2_file.js', + 'libraries/TuneScope/0600_GeneralUserGS_sf2_file.js', + 'libraries/TuneScope/0730_JCLive_sf2_file.js', + 'libraries/TuneScope/0710_Chaos_sf2_file.js', + 'libraries/TuneScope/0420_JCLive_sf2_file.js', + 'libraries/TuneScope/0400_JCLive_sf2_file.js', + 'libraries/TuneScope/0700_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/1040_Aspirin_sf2_file.js', + 'libraries/TuneScope/0770_SBLive_sf2.js', + 'libraries/TuneScope/0100_SBLive_sf2.js', + 'libraries/TuneScope/0650_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/1050_FluidR3_GM_sf2_file.js', + 'libraries/TuneScope/0180_Chaos_sf2_file.js', + 'libraries/TuneScope/0020_JCLive_sf2_file.js', + 'libraries/TuneScope/0260_JCLive_sf2_file.js', + 'libraries/TuneScope/0241_JCLive_sf2_file.js', + 'libraries/TuneScope/0350_JCLive_sf2_file.js', + 'libraries/TuneScope/0291_LesPaul_sf2_file.js', + 'libraries/TuneScope/0320_GeneralUserGS_sf2_file.js', + 'libraries/TuneScope/0230_Aspirin_sf2_file.js', + + 'libraries/serial_module.xml', + 'libraries/signada.js', + 'libraries/signada.xml', + 'libraries/speech_module.xml', + 'libraries/stream-tools.xml', + 'libraries/strings.xml', + 'libraries/textCostumes_module.xml', + 'libraries/try-catch.xml', + 'libraries/word-sentence.xml', + 'libraries/words_module.xml', + + //costumes + 'Costumes/COSTUMES', + + 'Costumes/abby-a.svg', + 'Costumes/abby-b.svg', + 'Costumes/abby-c.svg', + 'Costumes/abby-d.svg', + 'Costumes/airplane2.png', + 'Costumes/aleassa01.png', + 'Costumes/aleassa02.png', + 'Costumes/aleassa03.png', + 'Costumes/aleassa04.png', + 'Costumes/aleassa05.png', + 'Costumes/aleassa06.png', + 'Costumes/alonzo.png', + 'Costumes/Alonzo3D.png', + 'Costumes/alonzo.svg', + 'Costumes/amon.gif', + 'Costumes/anina_pop_down.png', + 'Costumes/anina_pop_front.png', + 'Costumes/anina_pop_L_arm.png', + 'Costumes/anina_pop_left.png', + 'Costumes/anina_pop_R_arm.png', + 'Costumes/anina_pop_right.png', + 'Costumes/anina_pop_stand.png', + 'Costumes/anina_R_cross.png', + 'Costumes/anina_stance.png', + 'Costumes/anina_top_freeze.png', + 'Costumes/anina_top_L_step.png', + 'Costumes/anina_top_R_step.png', + 'Costumes/anina_top_stand.png', + 'Costumes/anna01.png', + 'Costumes/anna02.png', + 'Costumes/anna03.png', + 'Costumes/anna04.png', + 'Costumes/anna05.png', + 'Costumes/anna06.png', + 'Costumes/anna07b.png', + 'Costumes/anna07c.png', + 'Costumes/anna07.png', + 'Costumes/anna08.png', + 'Costumes/anna09.png', + 'Costumes/anna10.png', + 'Costumes/anna11.png', + 'Costumes/anna12.png', + 'Costumes/anna-a.png', + 'Costumes/anna-b.png', + 'Costumes/apple.svg', + 'Costumes/arrow1-a.svg', + 'Costumes/arrow1-b.svg', + 'Costumes/arrow1-c.svg', + 'Costumes/arrow1-d.svg', + 'Costumes/avery-a.svg', + 'Costumes/avery-b.svg', + 'Costumes/avery_walking-a.svg', + 'Costumes/avery_walking-b.svg', + 'Costumes/avery_walking-c.svg', + 'Costumes/avery_walking-d.svg', + 'Costumes/AZ_pop_down.png', + 'Costumes/AZ_pop_front.png', + 'Costumes/AZ_pop_L_arm.png', + 'Costumes/AZ_pop_left.png', + 'Costumes/AZ_pop_R_arm.png', + 'Costumes/AZ_pop_right.png', + 'Costumes/AZ_pop_stand.png', + 'Costumes/AZ_stance.png', + 'Costumes/AZ_top_freeze.png', + 'Costumes/AZ_top_L_step.png', + 'Costumes/AZ_top_R_cross.png', + 'Costumes/AZ_top_R_step.png', + 'Costumes/AZ_top_stand.png', + 'Costumes/ball-a.svg', + 'Costumes/ball-b.svg', + 'Costumes/ball-c.svg', + 'Costumes/ball-d.svg', + 'Costumes/ballerina-a.svg', + 'Costumes/ballerina-b.svg', + 'Costumes/ballerina-c.svg', + 'Costumes/ballerina-d.svg', + 'Costumes/ball-e.svg', + 'Costumes/balloon1-a.svg', + 'Costumes/balloon1-b.svg', + 'Costumes/balloon1-c.svg', + 'Costumes/ball-soccer.svg', + 'Costumes/bananas.svg', + 'Costumes/baseball.svg', + 'Costumes/basketball.svg', + 'Costumes/bass.svg', + 'Costumes/bat1-a_.svg', + 'Costumes/bat1-b_.svg', + 'Costumes/bat2-a_.svg', + 'Costumes/bat2-b_.svg', + 'Costumes/beachball.svg', + 'Costumes/bear2-a.svg', + 'Costumes/bear2-b.svg', + 'Costumes/beetle.svg', + 'Costumes/bell1.svg', + 'Costumes/bells-a.svg', + 'Costumes/bells-b.svg', + 'Costumes/bowl-a.svg', + 'Costumes/bowtie-a.svg', + 'Costumes/bowtie-b.svg', + 'Costumes/boy1-standing.gif', + 'Costumes/boy1-walking.gif', + 'Costumes/boy2.gif', + 'Costumes/boy3.gif', + 'Costumes/building-a.svg', + 'Costumes/building-b.svg', + 'Costumes/building-c.svg', + 'Costumes/building-d.svg', + 'Costumes/building-e.svg', + 'Costumes/building-f.svg', + 'Costumes/building-g.svg', + 'Costumes/building-h.svg', + 'Costumes/building-i.svg', + 'Costumes/building-j.svg', + 'Costumes/bus.png', + 'Costumes/butterfly1-a.svg', + 'Costumes/butterfly1-b_.svg', + 'Costumes/butterfly2_.svg', + 'Costumes/butterfly3_.svg', + 'Costumes/button1.svg', + 'Costumes/button2-a.svg', + 'Costumes/button2-b.svg', + 'Costumes/button3-a.svg', + 'Costumes/button3-b.svg', + 'Costumes/button4-a.svg', + 'Costumes/button4-b.svg', + 'Costumes/button5-a.svg', + 'Costumes/button5-b.svg', + 'Costumes/cake-a.svg', + 'Costumes/cake-b.svg', + 'Costumes/calvrett_jumping.png', + 'Costumes/calvrett_thinking.png', + 'Costumes/candle1-a.svg', + 'Costumes/candle1-b.svg', + 'Costumes/candles1.svg', + 'Costumes/candles2.svg', + 'Costumes/car-bug.png', + 'Costumes/cassy-a.png', + 'Costumes/cassy-b.png', + 'Costumes/cassy-c.png', + 'Costumes/cassy_dance-a.png', + 'Costumes/cassy_dance-b.png', + 'Costumes/cassy_dance-c.png', + 'Costumes/cassy_dance-d.png', + 'Costumes/cassy-d.png', + 'Costumes/cat2.gif', + 'Costumes/cat2.svg', + 'Costumes/cat3.png', + 'Costumes/cat4.png', + 'Costumes/cat5.gif', + 'Costumes/catherine-a.png', + 'Costumes/catherine-b.png', + 'Costumes/catherine-c.png', + 'Costumes/catherine-d.png', + 'Costumes/champ99-a.png', + 'Costumes/champ99-b.png', + 'Costumes/champ99-c.png', + 'Costumes/champ99-d.png', + 'Costumes/champ99-e.png', + 'Costumes/champ99-f.png', + 'Costumes/champ99-g.png', + 'Costumes/cheesy-puffs.png', + 'Costumes/cloud-a.svg', + 'Costumes/cloud-b.svg', + 'Costumes/cloud-c.svg', + 'Costumes/cloud-d.svg', + 'Costumes/cloud.svg', + 'Costumes/cm_pop_L_arm.png', + 'Costumes/cm_pop_R_arm.png', + 'Costumes/cm_top_L_cross.png', + 'Costumes/cm_top_L_leg.png', + 'Costumes/cm_top_R_cross.png', + 'Costumes/cm_top_ready.png', + 'Costumes/cm_top_R_leg.png', + 'Costumes/cm_top_stand.png', + 'Costumes/convertible1.png', + 'Costumes/convertible2.png', + 'Costumes/convertible3.svg', + 'Costumes/cowbell.svg', + 'Costumes/crab-a.svg', + 'Costumes/crab-b.svg', + 'Costumes/creature1-a.svg', + 'Costumes/creature1-b.svg', + 'Costumes/creature1-c.svg', + 'Costumes/cymbal-a.svg', + 'Costumes/cymbal-b.svg', + 'Costumes/dan-a.png', + 'Costumes/dan-b.png', + 'Costumes/dani-a.svg', + 'Costumes/dani-b.svg', + 'Costumes/dani-c.svg', + 'Costumes/dee-a.svg', + 'Costumes/dee-b.svg', + 'Costumes/dee-c.svg', + 'Costumes/dee-d.svg', + 'Costumes/dee-e.svg', + 'Costumes/derec01.png', + 'Costumes/derec02.png', + 'Costumes/derec03.png', + 'Costumes/derec04.png', + 'Costumes/derec05.png', + 'Costumes/derec06.png', + 'Costumes/devin-a.svg', + 'Costumes/devin-b.svg', + 'Costumes/devin-c.svg', + 'Costumes/devin-d.svg', + 'Costumes/dinosaur1-a.svg', + 'Costumes/dinosaur1-b.svg', + 'Costumes/dinosaur1-c.svg', + 'Costumes/dinosaur1-d.svg', + 'Costumes/dinosaur1-e.svg', + 'Costumes/dinosaur1-f.svg', + 'Costumes/dinosaur1-g.svg', + 'Costumes/dinosaur2-a.svg', + 'Costumes/dinosaur2-b.svg', + 'Costumes/dinosaur3.svg', + 'Costumes/diver1.svg', + 'Costumes/diver2.svg', + 'Costumes/dm_freeze.png', + 'Costumes/dm_pop_down.png', + 'Costumes/dm_pop_front.png', + 'Costumes/dm_pop_L_arm.png', + 'Costumes/dm_pop_left.png', + 'Costumes/dm_pop_R_arm.png', + 'Costumes/dm_pop_right.png', + 'Costumes/dm_pop_stand.png', + 'Costumes/dm_stance.svg', + 'Costumes/dm_top_L_leg.png', + 'Costumes/dm_top_R_leg.png', + 'Costumes/dm_top_stand.png', + 'Costumes/dog1-a.svg', + 'Costumes/dog1-b.svg', + 'Costumes/dog2-a.svg', + 'Costumes/dog2-b.svg', + 'Costumes/dog2-c.svg', + 'Costumes/dog_puppy_back.png', + 'Costumes/dog_puppy_right.png', + 'Costumes/dog_puppy_side.png', + 'Costumes/dog_puppy_sit.png', + 'Costumes/donut.svg', + 'Costumes/dove1-a.svg', + 'Costumes/dove1-b.svg', + 'Costumes/dove2-a.svg', + 'Costumes/dove2-b.svg', + 'Costumes/dragon1-a.svg', + 'Costumes/dragon1-b.png', + 'Costumes/dragon1-b.svg', + 'Costumes/dragon2.gif', + 'Costumes/drum1-a.svg', + 'Costumes/drum1-b.svg', + 'Costumes/drum2-a.svg', + 'Costumes/drum2-b.svg', + 'Costumes/drum_bass-a.svg', + 'Costumes/drum_bass-b.svg', + 'Costumes/drums_conga-a.svg', + 'Costumes/drums_conga-b.svg', + 'Costumes/drum_snare-a.svg', + 'Costumes/drum_snare-b.svg', + 'Costumes/duck.svg', + 'Costumes/earth.svg', + 'Costumes/elephant-a_.svg', + 'Costumes/elephant-b_.svg', + 'Costumes/fire_hydrant.png', + 'Costumes/fish1.svg', + 'Costumes/fish2.svg', + 'Costumes/fish3.svg', + 'Costumes/flower_shape.svg', + 'Costumes/football_running.png', + 'Costumes/football_standing.png', + 'Costumes/fortunecookie.png', + 'Costumes/fox.svg', + 'Costumes/frog.svg', + 'Costumes/fruit_platter.png', + 'Costumes/fruitsalad.svg', + 'Costumes/ghost1_.svg', + 'Costumes/ghost2-a.svg', + 'Costumes/ghost2-b.svg', + 'Costumes/ghoul-a.svg', + 'Costumes/ghoul-b.svg', + 'Costumes/gift-a.svg', + 'Costumes/gift-b.svg', + 'Costumes/girl1-standing.gif', + 'Costumes/girl1-walking.gif', + 'Costumes/girl2-shouting.gif', + 'Costumes/girl2-standing.gif', + 'Costumes/girl3-basketball.gif', + 'Costumes/girl3-running.gif', + 'Costumes/girl3-standing.gif', + 'Costumes/glasses.svg', + 'Costumes/glass_water-a.svg', + 'Costumes/glass_water-b.svg', + 'Costumes/green_flag.svg', + 'Costumes/guitar_bass.svg', + 'Costumes/guitar_electric.svg', + 'Costumes/guitar.svg', + 'Costumes/hannah-a.png', + 'Costumes/hannah-b.png', + 'Costumes/hannah-c.png', + 'Costumes/hat_beanie.svg', + 'Costumes/hat_party2-a.svg', + 'Costumes/Hat.svg', + 'Costumes/hat_winter.svg', + 'Costumes/hat_wizard.svg', + 'Costumes/headband.svg', + 'Costumes/heart_code.svg', + 'Costumes/heart_face.svg', + 'Costumes/heart_love_it.svg', + 'Costumes/heart_purple.svg', + 'Costumes/heart_red.svg', + 'Costumes/heart_smile.svg', + 'Costumes/heart_sweet.svg', + 'Costumes/helicopter.png', + 'Costumes/hippo1-a.svg', + 'Costumes/hippo1-b.svg', + 'Costumes/holly1.svg', + 'Costumes/holly2.svg', + 'Costumes/home_button.svg', + 'Costumes/horse1-a.svg', + 'Costumes/horse1-b.svg', + 'Costumes/jahrd01.png', + 'Costumes/jahrd02.png', + 'Costumes/jahrd03.png', + 'Costumes/jahrd04.png', + 'Costumes/jahrd05.png', + 'Costumes/jahrd06.png', + 'Costumes/jaime-a.png', + 'Costumes/jaime-b.png', + 'Costumes/jaime_walking-a.png', + 'Costumes/jaime_walking-b.png', + 'Costumes/jaime_walking-c.png', + 'Costumes/jaime_walking-d.png', + 'Costumes/jaime_walking-e.png', + 'Costumes/jamet01.png', + 'Costumes/jamet02.png', + 'Costumes/jamet03.png', + 'Costumes/jamet04.png', + 'Costumes/jamet05.png', + 'Costumes/jamet06.png', + 'Costumes/jamet06-wall.png', + 'Costumes/jay.gif', + 'Costumes/jeans-a.svg', + 'Costumes/jeans-b.svg', + 'Costumes/jodi.gif', + 'Costumes/jo_pop_down.png', + 'Costumes/jo_pop_front.png', + 'Costumes/jo_pop_L_arm.png', + 'Costumes/jo_pop_left.png', + 'Costumes/jo_pop_R_arm.png', + 'Costumes/jo_pop_right.png', + 'Costumes/jo_pop_stand.png', + 'Costumes/jo_stance.png', + 'Costumes/jo_top_L_cross.png', + 'Costumes/jo_top_L_leg.png', + 'Costumes/jo_top_R_cross.png', + 'Costumes/jo_top_R_leg.png', + 'Costumes/jo_top_stand.png', + 'Costumes/keyboard-a.svg', + 'Costumes/keyboard-b.svg', + 'Costumes/keyboard-c.svg', + 'Costumes/keyboard-d.svg', + 'Costumes/key.svg', + 'Costumes/khalid-a.png', + 'Costumes/Khalid-b.png', + 'Costumes/khalid-c.png', + 'Costumes/khalid-d.png', + 'Costumes/knight.svg', + 'Costumes/ladybug2-a.svg', + 'Costumes/ladybug2-b.svg', + 'Costumes/ladybug2.svg', + 'Costumes/lamp.png', + 'Costumes/laptop.svg', + 'Costumes/lb_pop_down.png', + 'Costumes/lb_pop_front.png', + 'Costumes/lb_pop_L_arm.png', + 'Costumes/lb_pop_left.png', + 'Costumes/lb_pop_R_arm.png', + 'Costumes/lb_pop_right.png', + 'Costumes/lb_pop_stand.png', + 'Costumes/lb_stance.png', + 'Costumes/lb_top_L_cross.png', + 'Costumes/lb_top_L_leg.png', + 'Costumes/lb_top_R_cross.png', + 'Costumes/lb_top_R_leg.png', + 'Costumes/lb_top_stand.png', + 'Costumes/lightning.svg', + 'Costumes/lirin01.png', + 'Costumes/lirin02.png', + 'Costumes/lirin03.png', + 'Costumes/lirin04.png', + 'Costumes/lirin05.png', + 'Costumes/lirin06.png', + 'Costumes/lion-a.svg', + 'Costumes/lion-b.svg', + 'Costumes/lioness.svg', + 'Costumes/lorenz01.png', + 'Costumes/lorenz02.png', + 'Costumes/lorenz03.png', + 'Costumes/lorenz04.png', + 'Costumes/lorenz05.png', + 'Costumes/lorenz06.png', + 'Costumes/lorenz07b.png', + 'Costumes/lorenz07.png', + 'Costumes/magiccarpet.png', + 'Costumes/magicwand.svg', + 'Costumes/marble-building.png', + 'Costumes/marissa-crouching.gif', + 'Costumes/marissa.gif', + 'Costumes/marissa-sitting.gif', + 'Costumes/maya.png', + 'Costumes/microphonestand.svg', + 'Costumes/microphone.svg', + 'Costumes/monkey1-a.svg', + 'Costumes/monkey1-b.svg', + 'Costumes/monkey2-a.svg', + 'Costumes/monkey2-b.svg', + 'Costumes/monkey2-c.svg', + 'Costumes/mori.png', + 'Costumes/mouse1-a.svg', + 'Costumes/mouse1-b.svg', + 'Costumes/muffin-a.svg', + 'Costumes/muffin-b.svg', + 'Costumes/octopus-a.svg', + 'Costumes/octopus-b.svg', + 'Costumes/orange2-a.svg', + 'Costumes/orange2-b.svg', + 'Costumes/orange2-c.svg', + 'Costumes/orange.svg', + 'Costumes/paddle.svg', + 'Costumes/palmtree.gif', + 'Costumes/parrot2-a.svg', + 'Costumes/parrot2-b.svg', + 'Costumes/parrot-a.svg', + 'Costumes/parrot-b.svg', + 'Costumes/partyhat1.svg', + 'Costumes/paul.gif', + 'Costumes/pencil-a.svg', + 'Costumes/pencil-b.svg', + 'Costumes/penguin1.svg', + 'Costumes/penguin1_talk-a.svg', + 'Costumes/penguin1_talk-b.svg', + 'Costumes/penguin2.svg', + 'Costumes/penguin2_talk-a.svg', + 'Costumes/penguin2_talk-b.svg', + 'Costumes/penguin3-a.svg', + 'Costumes/penguin3-b.svg', + 'Costumes/penguin3-c.svg', + 'Costumes/piano.svg', + 'Costumes/planet2.svg', + 'Costumes/princess.svg', + 'Costumes/prince.svg', + 'Costumes/rainbow.svg', + 'Costumes/referee.gif', + 'Costumes/reindeer.svg', + 'Costumes/robot1.svg', + 'Costumes/rocks.svg', + 'Costumes/rory.png', + 'Costumes/ruby-a.png', + 'Costumes/ruby-b.png', + 'Costumes/sail-boat.png', + 'Costumes/sam.gif', + 'Costumes/sarron01.png', + 'Costumes/sarron02.png', + 'Costumes/sarron03.png', + 'Costumes/sarron04.png', + 'Costumes/sarron05.png', + 'Costumes/sarron06.png', + 'Costumes/saxophone-a.svg', + 'Costumes/saxophone-b.svg', + 'Costumes/scarf1.svg', + 'Costumes/scarf2.svg', + 'Costumes/shark-a_.svg', + 'Costumes/shark-b_.svg', + 'Costumes/shark-c_.svg', + 'Costumes/shirt2-a2.svg', + 'Costumes/shirt2-a.svg', + 'Costumes/shirt-a.svg', + 'Costumes/shirt_blouse.svg', + 'Costumes/shirt-b.svg', + 'Costumes/shirt_collar-a.svg', + 'Costumes/shirt_collar-b.svg', + 'Costumes/shirt_collar-c.svg', + 'Costumes/shoes1.svg', + 'Costumes/shoes2.svg', + 'Costumes/Singer1.svg', + 'Costumes/skates.svg', + 'Costumes/sl_pop_L_arm.png', + 'Costumes/sl_pop_R_arm.png', + 'Costumes/sl_top_L_cross.png', + 'Costumes/sl_top_L_leg.png', + 'Costumes/sl_top_R_cross.png', + 'Costumes/sl_top_ready.png', + 'Costumes/sl_top_R_leg.png', + 'Costumes/sl_top_stand.png', + 'Costumes/snowflake.svg', + 'Costumes/snowman.svg', + 'Costumes/spaceship-a.svg', + 'Costumes/spaceship-b.svg', + 'Costumes/speaker.svg', + 'Costumes/squirrel1.png', + 'Costumes/star1.svg', + 'Costumes/star2.svg', + 'Costumes/star3-a.svg', + 'Costumes/star3-b.svg', + 'Costumes/starfish-a.svg', + 'Costumes/starfish-b_.svg', + 'Costumes/stop.svg', + 'Costumes/street-cleaner-mit.png', + 'Costumes/sunglasses1.svg', + 'Costumes/sunglasses2.svg', + 'Costumes/sun.svg', + 'Costumes/tabla-a.svg', + 'Costumes/tabla-b.svg', + 'Costumes/taco-a.svg', + 'Costumes/taco-b.svg', + 'Costumes/tennisball.png', + 'Costumes/trampoline.png', + 'Costumes/tree1.svg', + 'Costumes/tree2.svg', + 'Costumes/tree-lights-a.svg', + 'Costumes/tree-lights-b.svg', + 'Costumes/trees-a.svg', + 'Costumes/trees-b.svg', + 'Costumes/trombone-a.svg', + 'Costumes/trombone-b.svg', + 'Costumes/trumpet-a2.svg', + 'Costumes/trumpet-a.svg', + 'Costumes/turtle01_colour.png', + 'Costumes/turtle02_colour_resized.png', + 'Costumes/turtle03.png', + 'Costumes/turtle04.png', + 'Costumes/turtle05.png', + 'Costumes/turtle06.png', + 'Costumes/ukulele.svg', + 'Costumes/umbrella.png', + 'Costumes/unicorn1.png', + 'Costumes/unicorn.svg', + 'Costumes/vest-a.svg', + 'Costumes/vest-b.svg', + 'Costumes/wanda.svg', + 'Costumes/watermelon-a.svg', + 'Costumes/watermelon-b.svg', + 'Costumes/watermelon-c.svg', + 'Costumes/witch.svg', + 'Costumes/wizard1.svg', + 'Costumes/wizard2.svg', + 'Costumes/wizard.svg', + + // Backgrounds + 'Backgrounds/BACKGROUNDS', + + 'Backgrounds/atom_playground.jpg', + 'Backgrounds/bedroom1.gif', + 'Backgrounds/bedroom2.gif', + 'Backgrounds/berkeley_mural.jpg', + 'Backgrounds/brick-wall-and-stairs.jpg', + 'Backgrounds/brick-wall1.jpg', + 'Backgrounds/brick-wall2.jpg', + 'Backgrounds/desert.gif', + 'Backgrounds/night_city_with_street.gif', + 'Backgrounds/party_room.jpg', + 'Backgrounds/pathway.jpg', + 'Backgrounds/xy-grid.gif', + + // Sounds + 'Sounds/SOUNDS', + + 'Sounds/Cat.mp3', + 'Sounds/Chord.wav', + 'Sounds/Dog1.wav', + 'Sounds/Dog2.wav', + 'Sounds/FingerSnap.wav', + 'Sounds/Kitten.wav', + 'Sounds/Laugh-female.wav', + 'Sounds/Laugh-male1.wav', + 'Sounds/Laugh-male2.wav', + 'Sounds/Laugh-male3.mp3', + 'Sounds/Meow.wav', + 'Sounds/Pop.wav', + + // Examples + 'Examples/EXAMPLES', + + 'Examples/animal-game.xml', + 'Examples/Codification.xml', + 'Examples/copter.xml', + 'Examples/count-change.xml', + 'Examples/icecream-visual.xml', + 'Examples/JSfunctions.xml', + 'Examples/live-tree.xml', + 'Examples/swimmer.xml', + 'Examples/tree.xml', + 'Examples/vee.xml' + ]; + +console.log('service worker executed') +/* Start the service worker and cache all of the app's content */ +self.addEventListener('install', function(e) { + e.waitUntil( + caches.open(cacheName).then(function(cache) { + return cache.addAll(filesToCache); + }) + ); +}); + +self.addEventListener('activate', (evt) => { + evt.waitUntil( + caches.keys().then((keyList) => { + return Promise.all(keyList.map((key) => { + if (key !== cacheName) { + return caches.delete(key); + } + })); + }) + ); + self.clients.claim(); +}); + +/* Serve cached content when offline */ +self.addEventListener('fetch', function(event) { + event.respondWith( + fetch(event.request).catch(function(e) { + return caches.open(cacheName).then(function(cache) { + return cache.match(event.request, + {'ignoreSearch': true}).then(response => response); + }); + })); +}); diff --git a/elements/pl-snap/Snap/version 9.2.10 b/elements/pl-snap/Snap/version 9.2.10 new file mode 100644 index 00000000..e69de29b diff --git a/elements/pl-snap/info.json b/elements/pl-snap/info.json new file mode 100644 index 00000000..f21661b6 --- /dev/null +++ b/elements/pl-snap/info.json @@ -0,0 +1,32 @@ +{ + "controller": "pl-snap.py", + "dependencies" : { + "elementScripts" : [ + "pl-snap.js", + "Snap/src/morphic.js", + "Snap/src/symbols.js", + "Snap/src/widgets.js", + "Snap/src/blocks.js", + "Snap/src/threads.js", + "Snap/src/objects.js", + "Snap/src/scenes.js", + "Snap/src/gui.js", + "Snap/src/paint.js", + "Snap/src/lists.js", + "Snap/src/byob.js", + "Snap/src/tables.js", + "Snap/src/sketch.js", + "Snap/src/video.js", + "Snap/src/maps.js", + "Snap/src/extensions.js", + "Snap/src/xml.js", + "Snap/src/store.js", + "Snap/src/locale.js", + "Snap/src/cloud.js", + "Snap/src/api.js", + "Snap/src/sha512.js", + "Snap/src/FileSaver.min.js" + ] + } +} + \ No newline at end of file diff --git a/elements/pl-snap/pl-snap.css b/elements/pl-snap/pl-snap.css new file mode 100644 index 00000000..e69de29b diff --git a/elements/pl-snap/pl-snap.js b/elements/pl-snap/pl-snap.js new file mode 100644 index 00000000..30b9532c --- /dev/null +++ b/elements/pl-snap/pl-snap.js @@ -0,0 +1,91 @@ +window.setupSnapElement = (studentSubmission) => { + var world; + + var ide = new IDE_Morph({}), + world = new WorldMorph(document.getElementById('world'), false); + ide.openIn(world); + loop = () => { + requestAnimationFrame(loop); + world.doOneCycle(); + }; + + if (studentSubmission != "") { + ide.loadProjectXML(atob(studentSubmission)); + } + + world.children[0].toggleStageSize(true, .1); + requestAnimationFrame(loop); + + updateCanvasSize = () => { + canvas = document.getElementById('world'); + parent = document.getElementById('pl-snap'); + canvas.world = world; + canvas.style.width = parent.offsetWidth + 'px'; + world.worldCanvas.width = parent.offsetWidth; + world.worldCanvas.height = parseInt(canvas.style.height.slice(0, -2)); + world.setWidth(parent.offsetWidth); + world.setHeight(world.worldCanvas.height); + world.children.forEach(child => { + if (child.reactToWorldResize) { + child.reactToWorldResize(world.bounds.copy()); + } + }); + world.changed(); + }; + + updateCanvasSize(); + + + window.addEventListener('resize', updateCanvasSize); + canvas = document.getElementById('world'); + + canvas.addEventListener('wheel', function(e) { + world.hand.processMouseScroll(e); + e.preventDefault(); + }, { passive: false }); + + let buttons_primary = document.querySelectorAll('.btn-primary'); + let buttons_info = document.querySelectorAll('.btn-info'); + + let button_grade, button_save; + //find button where text is "Save & Grade", "Save", or "Save Only" + for (let i = 0; i < buttons_primary.length; i++) { + if (buttons_primary[i].innerText === "Save & Grade") { + button_grade = buttons_primary[i]; + } + } + + for (let i = 0; i < buttons_info.length; i++) { + if (buttons_info[i].innerText === "Save") { + button_save = buttons_info[i]; + } else if (buttons_info[i].innerText === "Save only") { + button_save = buttons_info[i]; + } + } + + let isSaved = false; + + button_save.addEventListener('click', (e) => { + const canvas = document.getElementById('world'); + const ide = canvas.world.children[0]; + const submission = ide.getProjectXML(); + $("#pl-snap").find('input').val(submission); + isSaved = true; + }); + + button_grade.addEventListener('click', (e) => { + const canvas = document.getElementById('world') + const ide = canvas.world.children[0]; + const submission = ide.getProjectXML(); + $("#pl-snap").find('input').val(submission); + isSaved = true; + }); + + window.onbeforeunload = function(e) { + if (!isSaved) { + var dialogText = 'Document\'s changes have not been saved.'; + e.returnValue = dialogText; + return dialogText; + } + }; +} diff --git a/elements/pl-snap/pl-snap.mustache b/elements/pl-snap/pl-snap.mustache new file mode 100644 index 00000000..1ec7634a --- /dev/null +++ b/elements/pl-snap/pl-snap.mustache @@ -0,0 +1,12 @@ +
+
+ +
+ +
+ + \ No newline at end of file diff --git a/elements/pl-snap/pl-snap.py b/elements/pl-snap/pl-snap.py new file mode 100644 index 00000000..006d5b2b --- /dev/null +++ b/elements/pl-snap/pl-snap.py @@ -0,0 +1,66 @@ +import chevron +import lxml +import json +import base64 +import prairielearn as pl +import os + +DIRECTORY_DEFAULT = "clientFilesQuestion" +SOURCE_FILE_NAME_DEFAULT = None + +def render(element_html, data): + element = lxml.html.fragment_fromstring(element_html) + + source_file_name = pl.get_string_attrib( + element, "source-file-name", SOURCE_FILE_NAME_DEFAULT + ) + directory = pl.get_string_attrib(element, "directory", DIRECTORY_DEFAULT) + default_file = None + + if source_file_name is not None: + if directory == "serverFilesCourse": + directory = data["options"]["server_files_course_path"] + elif directory == "clientFilesCourse": + directory = data["options"]["client_files_course_path"] + else: + directory = os.path.join(data["options"]["question_path"], directory) + file_path = os.path.join(directory, source_file_name) + xml_file = open(file_path, "r", encoding="utf-8") + default_file = xml_file.read() + xml_file.close() + + submitted_files = data["submitted_answers"].get("_files", []) + + if default_file: + default_file = base64.b64encode(default_file.encode()).decode() + + student_submission = None + for file in submitted_files: + if file["name"] == "submission.xml": + student_submission = file["contents"] + break + html_params = { + "student_submission": student_submission if student_submission else default_file +} + with open("pl-snap.mustache", "r") as f: + return chevron.render(f, html_params).strip() + +def parse(element_htm, data): + + submission = data["submitted_answers"]["submission.xml"] + if (not submission): + data["format_errors"]["files"] = "submission.xml is required" + return + + if data["submitted_answers"].get("_files", None) is None: + data["submitted_answers"]["_files"] = [] + + for file in data["submitted_answers"]["_files"]: + if file["name"] == "submission.xml": + data["submitted_answers"]["_files"].remove(file) + break + + data["submitted_answers"]["_files"].append({ + "name" : "submission.xml", + "contents" : base64.b64encode(data["submitted_answers"]["submission.xml"].encode()).decode() + }) \ No newline at end of file diff --git a/elements/pl-snap/screenshot0.png b/elements/pl-snap/screenshot0.png new file mode 100644 index 00000000..c9bd4971 Binary files /dev/null and b/elements/pl-snap/screenshot0.png differ diff --git a/elements/pl-snap/screenshot1.png b/elements/pl-snap/screenshot1.png new file mode 100644 index 00000000..6cbf8e66 Binary files /dev/null and b/elements/pl-snap/screenshot1.png differ diff --git a/pl_ag_jobs/job_1/data/data.json b/pl_ag_jobs/job_1/data/data.json new file mode 100644 index 00000000..d2a13e44 --- /dev/null +++ b/pl_ag_jobs/job_1/data/data.json @@ -0,0 +1 @@ +{"params":{},"correct_answers":{},"submitted_answers":{"_files":[{"name":"submission.xml","contents":"PHByb2plY3QgbmFtZT0iQUcgU1RBUiBDTEFTUyBTVVJWRVkiIGFwcD0iU25hcCEgOS4wLCBodHRwczovL3NuYXAuYmVya2VsZXkuZWR1IiB2ZXJzaW9uPSIyIj48bm90ZXM+PC9ub3Rlcz48dGh1bWJuYWlsPmRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBS0FBQUFCNENBWUFBQUIxb3ZsdkFBQUFBWE5TUjBJQXJzNGM2UUFBQXUxSlJFRlVlRjd0MXp0S2cwRUFSdEVKQ3I1TFFWdDcwUlVvVmxidXhWclFyZGxiMjdzQ3NiS09rQTM4WGE0WlRwcVUzOHlkUXlDcjlYcTlIajRLUkFWV0FFYmx6VzRLQUFoQ1dnREFOTDl4QUJsSUN3Q1k1amNPSUFOcEFRRFQvTVlCWkNBdEFHQ2EzemlBREtRRkFFenpHd2VRZ2JRQWdHbCs0d0F5a0JZQU1NMXZIRUFHMGdJQXB2bU5BOGhBV2dEQU5MOXhBQmxJQ3dDWTVqY09JQU5wQVFEVC9NWUJaQ0F0QUdDYTN6aUFES1FGQUV6ekd3ZVFnYlFBZ0dsKzR3QXlrQllBTU0xdkhFQUcwZ0lBcHZtTkE4aEFXZ0RBTkw5eEFCbElDd0NZNWpjT0lBTnBBUURUL01ZQlpDQXRBR0NhM3ppQURLUUZBRXp6R3dlUWdiUUFnR2wrNHdBeWtCWUFNTTF2SEVBRzBnSUFwdm1OQThoQVdnREFOTDl4QUJsSUN3Q1k1amNPSUFOcEFRRFQvTVlCWkNBdEFHQ2EzemlBREtRRkFFenpHd2VRZ2JRQWdHbCs0d0F5a0JZQU1NMXZIRUFHMGdJQXB2bU5BOGhBV2dEQU5MOXhBQmxJQ3dDWTVqY09JQU5wQVFEVC9NWUJaQ0F0QUdDYTN6aUFES1FGQUV6ekd3ZVFnYlFBZ0dsKzR3QXlrQllBTU0xdkhFQUcwZ0lBcHZtTkE4aEFXZ0RBTkw5eEFCbElDd0NZNWpjT0lBTnBBUURUL01ZQlpDQXRBR0NhM3ppQURLUUZBRXp6R3dlUWdiUUFnR2wrNHdBeWtCWUFNTTF2SEVBRzBnSUFwdm1OQThoQVdnREFOTDl4QUJsSUN3Q1k1amNPSUFOcEFRRFQvTVlCWkNBdEFHQ2EzemlBREtRRkZnRitmMytQazVPVGNYaDRtQjdVK0p3RkZnRyt2YjJOcjYrdmNYdDdPKzd1N3NiVjFkVTRQVDBkKy92N1kyOXZiODRxYnJXMUFvc0FYMTVleHZ2Nyt3YmI3Ky92T0RzN0c5ZlgxK1BtNW1ZOFBUMk55OHZMclIzVzBId0ZGZ0UrUHorUGo0K1BjWFIwTkg1K2ZzYjUrZmtHM2VQajQzaDRlQmdYRnhmelZYR2pyUlZZQlBqNitqbytQejgzdjNqMzkvZWI3K1BqNDNGd2NEQldxOVhXRG1wb3pnS0xBUDBKbWZQaC84dXRGZ0grbDRNNng1d0ZBSnp6WFhmbVZnRHV6RlBOZVZBQTUzelhuYmtWZ0R2elZITWVGTUE1MzNWbmJnWGd6anpWbkFmOUExRlNBcmV6YXVMakFBQUFBRWxGVGtTdVFtQ0M8L3RodW1ibmFpbD48c2NlbmVzIHNlbGVjdD0iMSI+PHNjZW5lIG5hbWU9IkFHIFNUQVIgQ0xBU1MgU1VSVkVZIiBwYWxldHRlPSJzaW5nbGUiIGNhdGVnb3JpZXM9ImZhbHNlIiBidXR0b25zPSJmYWxzZSI+PG5vdGVzPjwvbm90ZXM+PHBhbGV0dGU+PGNhdGVnb3J5IG5hbWU9IlN0YXJ0ZXIgQ29kZSIgY29sb3I9IjAsMTE2LDE0MywxIi8+PC9wYWxldHRlPjxoaWRkZW4+PC9oaWRkZW4+PGhlYWRlcnM+PC9oZWFkZXJzPjxjb2RlPjwvY29kZT48YmxvY2tzPjxibG9jay1kZWZpbml0aW9uIHM9IlNldHVwIEZyYWN0YWwiIHR5cGU9ImNvbW1hbmQiIGNhdGVnb3J5PSJwZW4iPjxoZWFkZXI+PC9oZWFkZXI+PGNvZGU+PC9jb2RlPjx0cmFuc2xhdGlvbnM+PC90cmFuc2xhdGlvbnM+PGlucHV0cz48L2lucHV0cz48c2NyaXB0PjxibG9jayBzPSJjbGVhciI+PC9ibG9jaz48YmxvY2sgcz0idXAiPjwvYmxvY2s+PGJsb2NrIHM9ImdvdG9YWSI+PGw+LTIwMDwvbD48bD4tMTUwPC9sPjwvYmxvY2s+PGJsb2NrIHM9InNldEhlYWRpbmciPjxsPjkwPC9sPjwvYmxvY2s+PGJsb2NrIHM9ImRvd24iPjwvYmxvY2s+PC9zY3JpcHQ+PC9ibG9jay1kZWZpbml0aW9uPjxibG9jay1kZWZpbml0aW9uIHM9IkZhY3RvcmlhbCBSRUNVUlNJVkUgJSZhcG9zO251bWJlciZhcG9zOyIgdHlwZT0icmVwb3J0ZXIiIGNhdGVnb3J5PSJTdGFydGVyIENvZGUiPjxoZWFkZXI+PC9oZWFkZXI+PGNvZGU+PC9jb2RlPjx0cmFuc2xhdGlvbnM+PC90cmFuc2xhdGlvbnM+PGlucHV0cz48aW5wdXQgdHlwZT0iJW4iPjwvaW5wdXQ+PC9pbnB1dHM+PHNjcmlwdD48YmxvY2sgcz0iZG9SZXBvcnQiPjxsPjwvbD48L2Jsb2NrPjwvc2NyaXB0PjwvYmxvY2stZGVmaW5pdGlvbj48YmxvY2stZGVmaW5pdGlvbiBzPSJGYWN0b3JpYWwgSVRFUkFUSVZFICUmYXBvcztudW1iZXImYXBvczsiIHR5cGU9InJlcG9ydGVyIiBjYXRlZ29yeT0iU3RhcnRlciBDb2RlIj48aGVhZGVyPjwvaGVhZGVyPjxjb2RlPjwvY29kZT48dHJhbnNsYXRpb25zPjwvdHJhbnNsYXRpb25zPjxpbnB1dHM+PGlucHV0IHR5cGU9IiVuIj48L2lucHV0PjwvaW5wdXRzPjxzY3JpcHQ+PGJsb2NrIHM9ImRvUmVwb3J0Ij48bD48L2w+PC9ibG9jaz48L3NjcmlwdD48L2Jsb2NrLWRlZmluaXRpb24+PC9ibG9ja3M+PHN0YWdlIG5hbWU9IlN0YWdlIiB3aWR0aD0iNDgwIiBoZWlnaHQ9IjM2MCIgY29zdHVtZT0iMCIgY29sb3I9IjI1NSwyNTUsMjU1LDEiIHRlbXBvPSI2MCIgdGhyZWFkc2FmZT0iZmFsc2UiIHBlbmxvZz0iZmFsc2UiIHZvbHVtZT0iMTAwIiBwYW49IjAiIGxpbmVzPSJyb3VuZCIgdGVybmFyeT0iZmFsc2UiIGh5cGVyb3BzPSJ0cnVlIiBjb2RpZnk9ImZhbHNlIiBpbmhlcml0YW5jZT0idHJ1ZSIgc3VibGlzdElEcz0iZmFsc2UiIGlkPSIyMyI+PHBlbnRyYWlscz5kYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWVBQUFBRm9DQVlBQUFDUE55Z2dBQUFBQVhOU1IwSUFyczRjNlFBQURvVkpSRUZVZUY3dDFjRUpBQUFJeEREZGYybTNzSis0d0VFUXV1TUlFQ0JBZ0FDQmQ0RjlYelJJZ0FBQkFnUUlqQUI3QWdJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNBaXdIeUJBZ0FBQkFvR0FBQWZvSmdrUUlFQ0FnQUQ3QVFJRUNCQWdFQWdJY0lCdWtnQUJBZ1FJQ0xBZklFQ0FBQUVDZ1lBQUIrZ21DUkFnUUlDQUFQc0JBZ1FJRUNBUUNBaHdnRzZTQUFFQ0JBZ0lzQjhnUUlBQUFRS0JnQUFINkNZSkVDQkFnSUFBK3dFQ0JBZ1FJQkFJQ0hDQWJwSUFBUUlFQ0Fpd0h5QkFnQUFCQW9HQUFBZm9KZ2tRSUVDQWdBRDdBUUlFQ0JBZ0VBZ0ljSUJ1a2dBQkFnUUlDTEFmSUVDQUFBRUNnWUFBQitnbUNSQWdRSUNBQVBzQkFnUUlFQ0FRQ0Fod2dHNlNBQUVDQkFnSXNCOGdRSUFBQVFLQmdBQUg2Q1lKRUNCQWdJQUErd0VDQkFnUUlCQUlDSENBYnBJQUFRSUVDQWl3SHlCQWdBQUJBb0dBQUFmb0pna1FJRUNBZ0FEN0FRSUVDQkFnRUFnSWNJQnVrZ0FCQWdRSUNMQWZJRUNBQUFFQ2dZQUFCK2dtQ1JBZ1FJQ0FBUHNCQWdRSUVDQVFDQWh3Z0c2U0FBRUNCQWdJc0I4Z1FJQUFBUUtCZ0FBSDZDWUpFQ0JBZ0lBQSt3RUNCQWdRSUJBSUNIQ0FicElBQVFJRUNCeXhjUUZwb1JNQnp3QUFBQUJKUlU1RXJrSmdnZz09PC9wZW50cmFpbHM+PGNvc3R1bWVzPjxsaXN0IHN0cnVjdD0iYXRvbWljIiBpZD0iMjQiPjwvbGlzdD48L2Nvc3R1bWVzPjxzb3VuZHM+PGxpc3Qgc3RydWN0PSJhdG9taWMiIGlkPSIyNSI+PC9saXN0Pjwvc291bmRzPjx2YXJpYWJsZXM+PC92YXJpYWJsZXM+PGJsb2Nrcz48L2Jsb2Nrcz48c2NyaXB0cz48L3NjcmlwdHM+PHNwcml0ZXMgc2VsZWN0PSIxIj48c3ByaXRlIG5hbWU9IlNwcml0ZSIgaWR4PSIxIiB4PSItMTk5Ljk5OTk5OTk5OTk5OTEiIHk9Ii0xNTAiIGhlYWRpbmc9IjkwIiBzY2FsZT0iMC41IiB2b2x1bWU9IjEwMCIgcGFuPSIwIiByb3RhdGlvbj0iMSIgZHJhZ2dhYmxlPSJ0cnVlIiBjb3N0dW1lPSIwIiBjb2xvcj0iODAsODAsODAsMSIgcGVuPSJ0aXAiIGlkPSIzMCI+PGNvc3R1bWVzPjxsaXN0IHN0cnVjdD0iYXRvbWljIiBpZD0iMzEiPjwvbGlzdD48L2Nvc3R1bWVzPjxzb3VuZHM+PGxpc3Qgc3RydWN0PSJhdG9taWMiIGlkPSIzMiI+PC9saXN0Pjwvc291bmRzPjxibG9ja3M+PC9ibG9ja3M+PHZhcmlhYmxlcz48L3ZhcmlhYmxlcz48c2NyaXB0cz48c2NyaXB0IHg9IjEwLjU5OTk5OTk5OTk5OTk5NCIgeT0iMzI0LjMzMzMzMzMzMzMzMzM3Ij48Y3VzdG9tLWJsb2NrIHM9IkZhY3RvcmlhbCBJVEVSQVRJVkUgJW4iPjxsPjwvbD48Y29tbWVudCB3PSIyMTAiIGNvbGxhcHNlZD0iZmFsc2UiPk1VU1QgdXNlIGl0ZXJhdGlvbiAoY2Fubm90IHVzZSByZWN1cnNpb24gb3IgSE9Gcyk8L2NvbW1lbnQ+PC9jdXN0b20tYmxvY2s+PC9zY3JpcHQ+PHNjcmlwdCB4PSIxMS45MzMzMzMzMzMzMzMzMzciIHk9IjIzNy44NjY2NjY2NjY2NjY5Ij48Y3VzdG9tLWJsb2NrIHM9IkZhY3RvcmlhbCBSRUNVUlNJVkUgJW4iPjxsPjwvbD48Y29tbWVudCB3PSIyMTAiIGNvbGxhcHNlZD0iZmFsc2UiPk1VU1QgdXNlIHJlY3Vyc2lvbjwvY29tbWVudD48L2N1c3RvbS1ibG9jaz48L3NjcmlwdD48c2NyaXB0IHg9IjExLjE5OTk5OTk5OTk5OTk4OSIgeT0iMTAzLjYiPjxibG9jayBzPSJyZWNlaXZlR28iPjwvYmxvY2s+PGN1c3RvbS1ibG9jayBzPSJTZXR1cCBGcmFjdGFsIj48L2N1c3RvbS1ibG9jaz48L3NjcmlwdD48Y29tbWVudCB4PSIxMiIgeT0iMTAiIHc9IjIxMy44MzMzMzMzMzMzMzMzNCIgY29sbGFwc2VkPSJmYWxzZSI+Q29tcGxldGUgdGhlIGZvbGxvd2luZyAzIGJsb2NrczomI3hEOzEuIEZyYWN0YWwgbj0gXyBsZW5ndGg9IF8mI3hEOzIuIEZhY3RvcmlhbCBSRUNVUlNJVkUgXyYjeEQ7My4gRmFjdG9yaWFsIElURVJBVElWRSBfPC9jb21tZW50Pjwvc2NyaXB0cz48L3Nwcml0ZT48L3Nwcml0ZXM+PC9zdGFnZT48dmFyaWFibGVzPjwvdmFyaWFibGVzPjwvc2NlbmU+PC9zY2VuZXM+PC9wcm9qZWN0Pg=="}],"submission.xml":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAu1JREFUeF7t1ztKg0EARtEJCr5LQVt70RUoVlbuxVrQrdlb27sCsbKOkA38Xa4ZTpqU38ydQyCr9Xq9Hj4KRAVWAEblzW4KAAhCWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFFgF+f3+Pk5OTcXh4mB7U+JwFFgG+vb2Nr6+vcXt7O+7u7sbV1dU4PT0d+/v7Y29vb84qbrW1AosAX15exvv7+wbb7+/vODs7G9fX1+Pm5mY8PT2Ny8vLrR3W0HwFFgE+Pz+Pj4+PcXR0NH5+fsb5+fkG3ePj43h4eBgXFxfzVXGjrRVYBPj6+jo+Pz83v3j39/eb7+Pj43FwcDBWq9XWDmpozgKLAP0JmfPh/8utFgH+l4M6x5wFAJzzXXfmVgDuzFPNeVAA53zXnbkVgDvzVHMeFMA533VnbgXgzjzVnAf9A1FSArezauLjAAAAAElFTkSuQmCC
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==Complete the following 3 blocks: 1. Fractal n= _ length= _ 2. Factorial RECURSIVE _ 3. Factorial ITERATIVE _
"},"format_errors":{},"partial_scores":{},"score":0,"feedback":{},"variant_seed":3882657474,"options":{},"raw_submitted_answers":{"submission.xml":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAu1JREFUeF7t1ztKg0EARtEJCr5LQVt70RUoVlbuxVrQrdlb27sCsbKOkA38Xa4ZTpqU38ydQyCr9Xq9Hj4KRAVWAEblzW4KAAhCWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFFgF+f3+Pk5OTcXh4mB7U+JwFFgG+vb2Nr6+vcXt7O+7u7sbV1dU4PT0d+/v7Y29vb84qbrW1AosAX15exvv7+wbb7+/vODs7G9fX1+Pm5mY8PT2Ny8vLrR3W0HwFFgE+Pz+Pj4+PcXR0NH5+fsb5+fkG3ePj43h4eBgXFxfzVXGjrRVYBPj6+jo+Pz83v3j39/eb7+Pj43FwcDBWq9XWDmpozgKLAP0JmfPh/8utFgH+l4M6x5wFAJzzXXfmVgDuzFPNeVAA53zXnbkVgDvzVHMeFMA533VnbgXgzjzVnAf9A1FSArezauLjAAAAAElFTkSuQmCC
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==Complete the following 3 blocks: 1. Fractal n= _ length= _ 2. Factorial RECURSIVE _ 3. Factorial ITERATIVE _
"},"gradable":true} diff --git a/pl_ag_jobs/job_1/results/results.json b/pl_ag_jobs/job_1/results/results.json new file mode 100644 index 00000000..88763283 --- /dev/null +++ b/pl_ag_jobs/job_1/results/results.json @@ -0,0 +1 @@ +{"gradable":true,"score":0,"tests":[{"name":"Test: factorial RECURSIVE","points":0,"max_points":10,"output":"Test failed."},{"name":"Test: factorial ITERATIVE","points":0,"max_points":10,"output":"Test failed."}]} \ No newline at end of file diff --git a/pl_ag_jobs/job_1/student/submission.xml b/pl_ag_jobs/job_1/student/submission.xml new file mode 100644 index 00000000..c0b952b6 --- /dev/null +++ b/pl_ag_jobs/job_1/student/submission.xml @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAu1JREFUeF7t1ztKg0EARtEJCr5LQVt70RUoVlbuxVrQrdlb27sCsbKOkA38Xa4ZTpqU38ydQyCr9Xq9Hj4KRAVWAEblzW4KAAhCWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFAEzzGweQgbQAgGl+4wAykBYAMM1vHEAG0gIApvmNA8hAWgDANL9xABlICwCY5jcOIANpAQDT/MYBZCAtAGCa3ziADKQFFgF+f3+Pk5OTcXh4mB7U+JwFFgG+vb2Nr6+vcXt7O+7u7sbV1dU4PT0d+/v7Y29vb84qbrW1AosAX15exvv7+wbb7+/vODs7G9fX1+Pm5mY8PT2Ny8vLrR3W0HwFFgE+Pz+Pj4+PcXR0NH5+fsb5+fkG3ePj43h4eBgXFxfzVXGjrRVYBPj6+jo+Pz83v3j39/eb7+Pj43FwcDBWq9XWDmpozgKLAP0JmfPh/8utFgH+l4M6x5wFAJzzXXfmVgDuzFPNeVAA53zXnbkVgDvzVHMeFMA533VnbgXgzjzVnAf9A1FSArezauLjAAAAAElFTkSuQmCC
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==Complete the following 3 blocks: 1. Fractal n= _ length= _ 2. Factorial RECURSIVE _ 3. Factorial ITERATIVE _
\ No newline at end of file diff --git a/pl_ag_jobs/job_1/tests/autograder.xml b/pl_ag_jobs/job_1/tests/autograder.xml new file mode 100644 index 00000000..6c287e3c --- /dev/null +++ b/pl_ag_jobs/job_1/tests/autograder.xml @@ -0,0 +1 @@ +Throw an error. Makes a red halo appear around the script that runs it, with the input text shown in a speech balloon next to the script, just like any Snap! error. This is useful to put in the second script of SAFELY TRY after some other instructions to undo the partial work of the first script.
pt:lança o erro _
Catch errors. Runs the first script. If it succeeds, nothing else happens. But if it has an error (something that would otherwise result in a red halo around the block), then the second script is run, with the text of the error message that would have been shown in the variable ERROR.
pt:tenta executar _ e, em caso de erro _ , executa _ ca:prova de forma segura _ i si _ _
Like the built-in REPEAT UNTIL block, except that the ending condition is not tested until the script has been run the first time. So the script is run at least once.
pt:repete _ até que _ $loop-0.7 ca:repeteix _ fins _
Call f(f(f(...(f(x))))) until condition is true, where the three input slots are condition, f, and x from left to right. The # variable can be used inside f or condition to indicate how many times f has been called.
pt:o resultado da invocação em cascata até que _ de _ com argumento inicial _ _ ca:en cascada fins _ _ _ _
Call f(f(f(...(f(x))))) n times where the three input slots are n, f, and x from left to right. The # variable can be used inside f to represent how many times f has been called.
pt:o resultado de _ invocações em cascata de _ com argumento inicial _ _ ca:en cascada _ vegades _ _ _
Run the script repeatedly, as long as the given condition is true. Runs the script at least once before testing the condition.
pt:repete _ enquanto _ $loop-0.7 ca:repeteix _ mentre _
Runs the script repeatedly, as long as the condition is true. Tests the condition before the first time the script is run. Like the built in REPEAT UNTIL except that in this block the condition must be true, not false.
pt:enquanto _ , repete _ $loop-0.7
Runs the script the specified number of times, like the built-in REPEAT block, but this one provides the # variable that can be used inside the script. Try REPEAT (200) MOVE (#) STEPS RIGHT 92 with the pen down.
pt:repete _ vezes _ _ $loop-0.7 ca:repeteix _ _ _
The primitive FOR block uses an implicit step of ±1 depending on which of the starting and ending values is larger. This version allows you to provide an explicit step value. If the sign of the step input is incompatible with the ordering of the starting and ending values, the script will not be run at all.
pt:para _ de _ com passo _ a _ _ $loop-0.7 ca:per _ = _ incrementant _ fins _ _ 1110
Provides LOOP as a function of one input that runs the body of the LET with A set to the function input, so the body can run itself recursively. See COPY block in Variables for an example of use.
pt:tendo _ o valor inicial _ , executa _ definido como _ ca:fes que _ sigui _ al _ _ new value
This block carries out the given script for each item of the given list, like the primitive FOR EACH. What'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.
ca:_ per cada _ de _ _
Takes as input a function of N inputs and N lists. 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.)
ca:multi-mapeja _ sobre _
The identity function reports its input.
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. Viewing the inputs as the rows of a matrix, ZIP reports its transpose.
Catch errors in a reporter. Evaluates its first input. If that expression successfully reports a value, this block reports that value. If the expression causes a Snap! error, then the final input slot is evaluated with the text of what would have been the error message in variable ERROR. SAFELY TRY then reports the value of that final expression. Sometimes you'll want to throw an error in the final expression. You can put an ERROR block inside a CALL block to do that.
ca:prova de forma segura reportant _ i si _ reportant _ err
de:wenn _ dann _ sonst _ ca:si _ llavors _ si no _ es:si _ entonces _ sino _ fr:si _ alors _ sinon _
100
truetrue
errortests110210
The label of a block is its signature with "_" substituted for any input slot. For example, "find block with label _" is the label of this block.
Count the number of calls of a block in an Abstract Syntax Tree. The input slots of a block passed in as argument should be blank.
0-1true
5210
error
##10block
error
1n112errorfalse
21
1
15010error
error1503
trueerror
false
23
1010
true
error
error1503
5560error
truetrue
00000000100100error
error
trueerror
trueTest passed!
Return a string in the Gradescope JSON format: {"tests": [ <test 1>, <test 2>, ... ]} See the "format" reporter under Autograder Utils.
5test resulttest resulttest passed?feedbackscore earnedtest passed?1feedback2score earnedscore
00
false05false05false0551truefalse214.50000000000009Metadata such as "secret number" should have been initialized by the JS autograder script, so they can be treated as ready to use (even though their current value might show "0"). You won't need this for autograding labs. Make new variables and blocks FOR THIS SPRITE ONLY. Export this Sprite—not the project!15010
\ No newline at end of file diff --git a/questions/Snap-AG-Factorials/README.md b/questions/Snap-AG-Factorials/README.md new file mode 100644 index 00000000..ab7a49cc --- /dev/null +++ b/questions/Snap-AG-Factorials/README.md @@ -0,0 +1,107 @@ +Link to Google Slides: https://docs.google.com/presentation/d/1BwPL89MBC4caneVTdlYTDNYEt6iKgTiVnVo13djyIS8/edit?usp=sharing + + + + +1. Required Downloads: + + * If you do not already have Docker installed, you will need to install it, which you can find on the Docker website. Please note, you may experience issues with a newer Docker Desktop. In this case, you will need to downgrade to Docker Desktop version <= 4.27.2. Here are instructions to downgrade: https://stackoverflow.com/a/77224786 + + * You will first need to download the the files containing the autograder, the Snap! windows embedded in PL, and the question setup. All of this can be found in the repo at the following link:https://github.com/JamesRakanathaLitanto/pl-snap.git + + * Once you have cloned the repo above, you will need to enter the folder "/pl-snap" and create a new folder titled, "pl_ag_jobs". + +2. Initial Setup + + * Now you will need to configure the image and container. First, open a terminal and go to the path \pl-snap\elements\pl-snap\"Docker setup". If you have windows, you will need to open a Windows subsystem for Linxus, such as wsl. + + * Next, input the following lines: + `>>>> docker run -d -p : --name registry registry:2` + + ** Example: `>>>> docker run -d -p 5000:5000 --name registry registry:2`. Note, you will use that same port, in the lines below. + + ** If this line failed, then you are probably already using registry:2. You can either delete your current registry:2 image or rewrite the line to be registry:3, etc. + + ``` + >>>> docker pull jryl/grader-snap + + >>>> docker image tag jryl/grader-snap localhost:/snap-test-new + + >>>> docker push localhost:/snap-test-new + + >>>> docker build -t snap-test-new . + ``` + + * If you have an Apple Silicon instead of running `docker build -t snap-test-new .` at the end above, run the following instead: `docker build --platform linux/amd64 -t snap-test-new .` + + * Now you will need to exit out of the nested path and go the original folder "/pl-snap" and run the following line: + ``` + >>>> docker run -it --rm -p 3000:3000 -v $PWD:/course -v "$PWD/pl_ag_jobs:/jobs" -e HOST_JOBS_DIR="$PWD/pl_ag_jobs" -v /var/run/docker.sock:/var/run/docker.sock --add-host=host.docker.internal:172.17.0.1 prairielearn/prairielearn:latest + ``` + + ** When running the docker image you may get an error like "pg_ctl: could not start server". The PrarieLearn documentation recommends the following: "To fix this, open Docker Desktop settings, click on "General", check the option to use the virtualization framework, and check "Use Rosetta for x86/amd64 emulation on Apple Silicon". Then, click "Apply & Restart" + + * You have successfully configured the setup. To open the local PL instance, open a terminal and go to: localhost:3000/pl + + * Once you have, click the "Load from disk" button and go to the "cs raka: testing for STAR" course instance. Then, click the "Questions" button to view the Snap! questions. + +3. Authoring Questions + + * If you would like to author a question, you will be working inside of the following path: "\pl-snap\questions" + + * First, create a folder in the current path. Then, enter the folder. This folder will contain four items: + 1. clientFilesQuestion + 2. tests + 3. info.json + 4. question.html + + * You will need to create two folders inside of "\pl-snap\questions", titled "clientFilesQuestion" and "tests". Once you have done so, you will need to enter both of these folders and create files inside of them. + + ** Next, enter the "clientFilesQuestion" folder. Here, you will place the starter XML file that will be displayed to the student in Snap!. The starter file should be a file that was downloaded/exported from Snap! + + ** Now, enter the "tests" folder. Here, you will place the autograder XML file that will run all tests. The autograder file should be a file that was downloaded/exported from Snap! + + * Now, you will need to go back to the following path: "\pl-snap\questions" and enter information for both the "info.json" and "question.html" files + + ** The info.json should have the following structure, but you will need to change the uuid and title: + ``` + { + "uuid": "8b4891d6-64d1-4e89-b72d-ad2133f25b2f", + "title": "Snap! AG test", + "topic": "Algebra", + "tags": ["mwest", "fa17", "tpl101", "v3"], + "type": "v3", + "singleVariant": true, + "gradingMethod": "External", + "externalGradingOptions": { + "enabled": true, + "image": "localhost:5000/snap-test-new", + "entrypoint": "/usr/src/cache/run_autograder", + "timeout": 120, + "enableNetworking": true + } + } + ``` + + ** The question.html should have the following structure, but you will need to change both [starter-file] to the actual name of the respective file: + ``` + +

Complete the Factorial Functions

+

The objective of this assessment is to complete the two functions 1. Factorial RECURSIVE and 2. Factorial ITERATIVE. You will need to write a factorial function for both blocks recursively and iteratively. You have an unlimited number of attemps.

+ +
+ + + + + ``` + + * Please note that the 'pl-snap' element can take in a specific starter file, but it is NOT required. If no starter file is needed, can be called. + + * When creating a starter file in Snap!, you will need to export the file by going to the cog icon on the right, top hand side of the screen, and then clicking "Export Project". Once you have exported the project, this file will need to be the file you place in the /pl-snap/questions/clientFilesQuestion subfolder. + +4. Examples + + * In the repo under under quesions sub-directory, there is a sample question with an autograder and starter code that tests two functions: factorial ITERATIVE and factorial RECURSIVE + + * These functions will be tested for correctness and to ensure iteration and recursion was used for the respective functions. \ No newline at end of file diff --git a/questions/Snap-AG-Factorials/clientFilesQuestion/midterm-fractal-starter-code.xml b/questions/Snap-AG-Factorials/clientFilesQuestion/midterm-fractal-starter-code.xml new file mode 100644 index 00000000..f801ddc6 --- /dev/null +++ b/questions/Snap-AG-Factorials/clientFilesQuestion/midterm-fractal-starter-code.xml @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAqBJREFUeF7t1aGNqlEYRdE7CiShAhIMCaWgkBgcoUJ6QVIGjpc3DVzDny1moW++Azsr4efz+XyGjwJRgR8Ao/JmfwsACEJaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbnwJ8PB5jv9+Pw+GglgJfLzAF+Hq9xv1+H+/3e5zP57FarcblchmbzebrX8bBv1dgCvD5fI7b7fZb5nQ6je12O67X61iv13+vll/89QJTgP//go/H49jtdl8fd1CBKUCJFFiyAIBL1nV7WgDAaSIPliwA4JJ13Z4WAHCayIMlCwC4ZF23pwUAnCbyYMkCAC5Z1+1pgX8/zvOo+ZO2rgAAAABJRU5ErkJggg==
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==Complete the following 3 blocks: 1. Fractal n= _ length= _ 2. Factorial RECURSIVE _ 3. Factorial ITERATIVE _
\ No newline at end of file diff --git a/questions/Snap-AG-Factorials/info.json b/questions/Snap-AG-Factorials/info.json new file mode 100644 index 00000000..09b1ee85 --- /dev/null +++ b/questions/Snap-AG-Factorials/info.json @@ -0,0 +1,16 @@ + { + "uuid": "128046a8-5182-49cb-ab73-ad8df504c7cb", + "title": "Snap! Fractal", + "topic": "Fractal", + "tags": ["snap"], + "type": "v3", + "singleVariant": true, + "gradingMethod": "External", + "externalGradingOptions": { + "enabled": true, + "image": "localhost:5000/snap-test-new", + "entrypoint": "/usr/src/cache/run_autograder", + "timeout": 600, + "enableNetworking": true + } +} \ No newline at end of file diff --git a/questions/Snap-AG-Factorials/question.html b/questions/Snap-AG-Factorials/question.html new file mode 100644 index 00000000..6362a99d --- /dev/null +++ b/questions/Snap-AG-Factorials/question.html @@ -0,0 +1,10 @@ + +

Complete the Factorial Functions

+

The objective of this assessment is to complete the two functions 1. Factorial RECURSIVE and 2. Factorial ITERATIVE. You will need to write a factorial function for both blocks recursively and iteratively. You have an unlimited number of attemps.

+ +
+ + + + + diff --git a/questions/Snap-AG-Factorials/screenshot0.png b/questions/Snap-AG-Factorials/screenshot0.png new file mode 100644 index 00000000..c9bd4971 Binary files /dev/null and b/questions/Snap-AG-Factorials/screenshot0.png differ diff --git a/questions/Snap-AG-Factorials/screenshot1.png b/questions/Snap-AG-Factorials/screenshot1.png new file mode 100644 index 00000000..6cbf8e66 Binary files /dev/null and b/questions/Snap-AG-Factorials/screenshot1.png differ diff --git a/questions/Snap-AG-Factorials/tests/autograder.xml b/questions/Snap-AG-Factorials/tests/autograder.xml new file mode 100644 index 00000000..6c287e3c --- /dev/null +++ b/questions/Snap-AG-Factorials/tests/autograder.xml @@ -0,0 +1 @@ +Throw an error. Makes a red halo appear around the script that runs it, with the input text shown in a speech balloon next to the script, just like any Snap! error. This is useful to put in the second script of SAFELY TRY after some other instructions to undo the partial work of the first script.
pt:lança o erro _
Catch errors. Runs the first script. If it succeeds, nothing else happens. But if it has an error (something that would otherwise result in a red halo around the block), then the second script is run, with the text of the error message that would have been shown in the variable ERROR.
pt:tenta executar _ e, em caso de erro _ , executa _ ca:prova de forma segura _ i si _ _
Like the built-in REPEAT UNTIL block, except that the ending condition is not tested until the script has been run the first time. So the script is run at least once.
pt:repete _ até que _ $loop-0.7 ca:repeteix _ fins _
Call f(f(f(...(f(x))))) until condition is true, where the three input slots are condition, f, and x from left to right. The # variable can be used inside f or condition to indicate how many times f has been called.
pt:o resultado da invocação em cascata até que _ de _ com argumento inicial _ _ ca:en cascada fins _ _ _ _
Call f(f(f(...(f(x))))) n times where the three input slots are n, f, and x from left to right. The # variable can be used inside f to represent how many times f has been called.
pt:o resultado de _ invocações em cascata de _ com argumento inicial _ _ ca:en cascada _ vegades _ _ _
Run the script repeatedly, as long as the given condition is true. Runs the script at least once before testing the condition.
pt:repete _ enquanto _ $loop-0.7 ca:repeteix _ mentre _
Runs the script repeatedly, as long as the condition is true. Tests the condition before the first time the script is run. Like the built in REPEAT UNTIL except that in this block the condition must be true, not false.
pt:enquanto _ , repete _ $loop-0.7
Runs the script the specified number of times, like the built-in REPEAT block, but this one provides the # variable that can be used inside the script. Try REPEAT (200) MOVE (#) STEPS RIGHT 92 with the pen down.
pt:repete _ vezes _ _ $loop-0.7 ca:repeteix _ _ _
The primitive FOR block uses an implicit step of ±1 depending on which of the starting and ending values is larger. This version allows you to provide an explicit step value. If the sign of the step input is incompatible with the ordering of the starting and ending values, the script will not be run at all.
pt:para _ de _ com passo _ a _ _ $loop-0.7 ca:per _ = _ incrementant _ fins _ _ 1110
Provides LOOP as a function of one input that runs the body of the LET with A set to the function input, so the body can run itself recursively. See COPY block in Variables for an example of use.
pt:tendo _ o valor inicial _ , executa _ definido como _ ca:fes que _ sigui _ al _ _ new value
This block carries out the given script for each item of the given list, like the primitive FOR EACH. What'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.
ca:_ per cada _ de _ _
Takes as input a function of N inputs and N lists. 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.)
ca:multi-mapeja _ sobre _
The identity function reports its input.
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. Viewing the inputs as the rows of a matrix, ZIP reports its transpose.
Catch errors in a reporter. Evaluates its first input. If that expression successfully reports a value, this block reports that value. If the expression causes a Snap! error, then the final input slot is evaluated with the text of what would have been the error message in variable ERROR. SAFELY TRY then reports the value of that final expression. Sometimes you'll want to throw an error in the final expression. You can put an ERROR block inside a CALL block to do that.
ca:prova de forma segura reportant _ i si _ reportant _ err
de:wenn _ dann _ sonst _ ca:si _ llavors _ si no _ es:si _ entonces _ sino _ fr:si _ alors _ sinon _
100
truetrue
errortests110210
The label of a block is its signature with "_" substituted for any input slot. For example, "find block with label _" is the label of this block.
Count the number of calls of a block in an Abstract Syntax Tree. The input slots of a block passed in as argument should be blank.
0-1true
5210
error
##10block
error
1n112errorfalse
21
1
15010error
error1503
trueerror
false
23
1010
true
error
error1503
5560error
truetrue
00000000100100error
error
trueerror
trueTest passed!
Return a string in the Gradescope JSON format: {"tests": [ <test 1>, <test 2>, ... ]} See the "format" reporter under Autograder Utils.
5test resulttest resulttest passed?feedbackscore earnedtest passed?1feedback2score earnedscore
00
false05false05false0551truefalse214.50000000000009Metadata such as "secret number" should have been initialized by the JS autograder script, so they can be treated as ready to use (even though their current value might show "0"). You won't need this for autograding labs. Make new variables and blocks FOR THIS SPRITE ONLY. Export this Sprite—not the project!15010
\ No newline at end of file